lib/droiuby/scripts/project.rb in droiuby-0.3.5 vs lib/droiuby/scripts/project.rb in droiuby-0.3.6

- old
+ new

@@ -45,10 +45,152 @@ lines.reject { |line| line.strip.empty? }.collect { |line| line.split(' ').first } rescue Errno::ENOENT => e [] end end + + def project_generator(name, app_name = :prompt, output_dir = 'projects', opt={}) + @name = name + if app_name.nil? + @app_name = app_name + elsif app_name == :prompt + say("Please enter the display name for your app (Used for app launcher and Title):") + @app_name = ask("Display Name: ") + end + + @description = name + @launcher_icon = '' + @base_url = '' + if opt[:type] == :droiuby || opt[:type] == :standalone + @main_xml = File.join("app","views","index.xml") + elsif opt[:type] == :hybrid + @main_xml = File.join("app","activities","index.rb") + else + say :red, "Invalid project type specified #{opt[:type]}" + exit(1); + end + + if output_dir.blank? + output_dir = Dir.pwd + end + + dest_folder = File.join(output_dir,"#{name}") + template File.join('ruby','Gemfile.erb'), File.join(dest_folder,"Gemfile") + template File.join('ruby','config.droiuby.erb'), File.join(dest_folder,"config.droiuby") + template File.join('ruby','gitignore.erb'), File.join(dest_folder,".gitignore") + + if opt[:type] == :droiuby + template File.join('ruby','index.xml.erb'), File.join(dest_folder,"app","views","index.xml") + end + + template File.join('ruby','application.css.erb'), File.join(dest_folder,"app","views","styles","application.css") + if opt[:type] == :droiuby + template File.join('ruby','index.rb.erb'), File.join(dest_folder,"app","activities","index.rb") + elsif opt[:type] == :hybrid + template File.join('ruby','index-hybrid.rb.erb'), File.join(dest_folder,"app","activities","index.rb") + end + template File.join('ruby','index_spec.rb.erb'), File.join(dest_folder,"spec","activities","index_spec.rb") + template File.join('ruby','spec_helper.rb.erb'), File.join(dest_folder,"spec","spec_helper.rb") + + empty_directory File.join(dest_folder,"lib") + + Dir.chdir dest_folder + if opt[:type] == :hybrid + template_generator(nil, :prompt, nil, nil, {xoptions: {hybrid: true}}.merge(opt)) + elsif opt[:type] == :standalone + template_generator(nil, :prompt, nil, nil, opt) + end + + say "running bundle install" + `bundle install` + end + + def template_generator(name, package_name, title = nil, output_dir = 'projects', opt = {}) + + repository = opt[:repository] + branch = opt[:branch] + + if output_dir.blank? + output_dir = Dir.pwd + end + + if package_name == :prompt + say("Please enter the Java Package Name to be used for your app (e.g. com.awesome.sample ):") + package_name = ask("Package Name: ") + end + + dest_folder = nil + unless name.nil? + dest_folder = File.join(output_dir,"#{name}") + Dir.chdir dest_folder + else + dest_folder = Dir.pwd + end + + if title.nil? + + doc = Nokogiri.XML(File.read('config.droiuby')) + + doc.css('app_descriptor name').each do |element| + title = element.content + end + + end + + template_repository = ENV['droiuby_template'] || repository || 'https://github.com/jedld/droiuby-template.git' + + say "using repository #{template_repository} ..." + + template_namespace = URI.parse(template_repository).path.sub('.git','') + + template_directory = File.expand_path(File.join("~/.droiuby/android_project_templates", "#{template_namespace}.#{branch.nil? ? 'master' : branch}")) + + say "checking out to #{template_directory}" + + unless File.exists?(template_directory) + say "no cached copy yet. obtaining template project from repository" + + branch = unless branch.nil? + "-b #{branch}" + else + "" + end + + `git clone #{branch} --depth 1 #{template_repository} #{template_directory}` + else + say "checking for template updates..." + Dir.chdir template_directory + `git pull` + end + + #prepare + directory template_directory, File.join(dest_folder,'project') + remove_dir "#{File.join(dest_folder,'project')}/.git" + + Dir.chdir File.join(dest_folder,'project') + + say "creating android project in #{dest_folder}" + require "#{File.join(dest_folder,'project','init.rb')}" + + dest_folder = if dest_folder.end_with? '/' + dest_folder + else + "#{dest_folder}/" + end + + archive_name = File.basename(dest_folder.sub!(%r[/$],'')) if archive_name.nil? + + init = Init.new + init.options = opt[:xoptions] || {} + init.init(package_name, "#{archive_name}.zip", title) + Dir.chdir dest_folder + bundle + package(name, '', "true") + say "Your android project is located at #{dest_folder}/project." + end + + } desc "proximity [device_ip] [true|false]", "enable/disable proximity refresh" def proximity(device_ip, proximity = 'false') @@ -138,140 +280,23 @@ Net::HTTP.get_print(uri) end desc "standalone NAME [PACKAGE_NAME]", "create an android project for this app with the specified java package name" + method_option :xoptions, :type => :hash, :default => {} def standalone(name, package_name, title = nil, output_dir = 'projects', repository = nil, branch = nil) - - if output_dir.blank? - output_dir = Dir.pwd - end - - if package_name == :prompt - say("Please enter the Java Package Name to be used for your app (e.g. com.awesome.sample ):") - package_name = ask("Package Name: ") - end - - dest_folder = nil - unless name.nil? - dest_folder = File.join(output_dir,"#{name}") - Dir.chdir dest_folder - else - dest_folder = Dir.pwd - end - - if title.nil? - - doc = Nokogiri.XML(File.read('config.droiuby')) - - doc.css('app_descriptor name').each do |element| - title = element.content - end - - end - - template_repository = ENV['droiuby_template'] || repository || 'https://github.com/jedld/droiuby-template.git' - template_directory = File.expand_path("~/.droiuby/android_project_templates.#{branch.nil? ? 'master' : branch}") - - unless File.exists?(template_directory) - say "no cached copy yet. obtaining template project from repository" - - branch = unless branch.nil? - "-b #{branch}" - else - "" - end - - `git clone #{branch} --depth 1 #{template_repository} #{template_directory}` - else - say "checking for template updates..." - Dir.chdir template_directory - `git pull` - end - - #prepare - directory template_directory, File.join(dest_folder,'project') - remove_dir "#{File.join(dest_folder,'project')}/.git" - - Dir.chdir File.join(dest_folder,'project') - - say "creating android porject in #{dest_folder}" - require "#{File.join(dest_folder,'project','init.rb')}" - - dest_folder = if dest_folder.end_with? '/' - dest_folder - else - "#{dest_folder}/" - end - - archive_name = File.basename(dest_folder.sub!(%r[/$],'')) if archive_name.nil? - - init = Init.new - init.init(package_name, "#{archive_name}.zip", title) - Dir.chdir dest_folder - bundle - package(name, '', "true") - say "Your android project is located at #{dest_folder}/project." + options[:repository] = respository + options[:branch] = branch + template_generator(name, package_name, title , output_dir , options) end desc "create PROJECT_NAME [APP_NAME] [WORKSPACE_DIR]","create a new droiuby project with NAME" def create(name, app_name = :prompt, output_dir = 'projects', type = 'droiuby') - @name = name - if app_name.nil? - @app_name = app_name - elsif app_name == :prompt - say("Please enter the display name for your app (Used for app launcher and Title):") - @app_name = ask("Display Name: ") - end - - @description = name - @launcher_icon = '' - @base_url = '' - if type == 'droiuby' - @main_xml = File.join("app","views","index.xml") - elsif type == 'hybrid' - @main_xml = File.join("app","activities","index.rb") - else - say_error "Invalid project type specified" - exit(1); - end - - if output_dir.blank? - output_dir = Dir.pwd - end - - dest_folder = File.join(output_dir,"#{name}") - template File.join('ruby','Gemfile.erb'), File.join(dest_folder,"Gemfile") - template File.join('ruby','config.droiuby.erb'), File.join(dest_folder,"config.droiuby") - template File.join('ruby','gitignore.erb'), File.join(dest_folder,".gitignore") - - if type == 'droiuby' - template File.join('ruby','index.xml.erb'), File.join(dest_folder,"app","views","index.xml") - end - - template File.join('ruby','application.css.erb'), File.join(dest_folder,"app","views","styles","application.css") - if type == 'droiuby' - template File.join('ruby','index.rb.erb'), File.join(dest_folder,"app","activities","index.rb") - elsif type == 'hybrid' - template File.join('ruby','index-hybrid.rb.erb'), File.join(dest_folder,"app","activities","index.rb") - end - template File.join('ruby','index_spec.rb.erb'), File.join(dest_folder,"spec","activities","index_spec.rb") - template File.join('ruby','spec_helper.rb.erb'), File.join(dest_folder,"spec","spec_helper.rb") - - empty_directory File.join(dest_folder,"lib") - - Dir.chdir dest_folder - if type == 'hybrid' - standalone(nil, :prompt, nil, nil, nil, 'hybrid-mode') - end - - say "running bundle install" - `bundle install` - - + opt = {type: type.to_sym} + project_generator(name, app_name, output_dir, opt) end desc "package NAME [WORKSPACE_DIR] [true|false]","package a project" def package(name, source_dir = 'projects', force = "false") @@ -286,11 +311,18 @@ project_directory = File.join(src_folder,'project') say "exsits? #{project_directory}" if File.exists? project_directory say "Android Project exists. Updating build inside assets ..." - copy_file archive, File.join(project_directory,'assets',File.basename(archive)), force: true + + target_directory = if File.exists?(File.join(project_directory,'build.gradle')) + File.join(project_directory,'app','src','main','assets',File.basename(archive)) + else + File.join(project_directory,'assets',File.basename(archive)) + end + + copy_file archive, target_directory, force: true end end require 'webrick' include WEBrick @@ -421,29 +453,44 @@ say "exsits? #{project_directory}" if !ignore_project && File.exists?(project_directory) say "Android Project exists. Building debug project instead ..." Dir.chdir(project_directory) - doc = Nokogiri.XML(File.read('AndroidManifest.xml')) - package_name = nil - doc.css('manifest').each do |element| - package_name = element['package'] - end + is_gradle = false + #figure out type of project + doc = if File.exists?('build.gradle') + is_gradle = true + Nokogiri.XML(File.read(File.join('app','src','main','AndroidManifest.xml'))) + else + Nokogiri.XML(File.read('AndroidManifest.xml')) + end - say "running ant debug install" - if !get_connected_devices.empty? - puts `ant debug install` - say "Starting activity #{package_name}" - `adb shell am start -S --activity-clear-top --activity-brought-to-front -n #{package_name}/.StartupActivity` - else - say "No device connected. will just build the project" - if ant_args.nil? - puts `ant debug` + package_name = nil + doc.css('manifest').each do |element| + package_name = element['package'] + end + + say "running build..." + if !get_connected_devices.empty? + + if is_gradle + puts `gradle installDebug` + else + puts `ant debug install` + end + + say "Starting activity #{package_name}" + `adb shell am start -S --activity-clear-top --activity-brought-to-front -n #{package_name}/.StartupActivity` else - puts `ant #{ant_args}` + say "No device connected. will just build the project" + if ant_args.nil? + puts `ant debug` + else + puts `ant #{ant_args}` + end end - end + else upload name, device_ip, source_dir end end