ruboto 0.12.0 → 0.13.0.rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Gemfile.lock CHANGED
@@ -1,8 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruboto (0.12.0)
4
+ ruboto (0.13.0.dev)
5
5
  main (>= 4.7.2)
6
+ rake
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
@@ -15,7 +16,7 @@ GEM
15
16
  chronic (>= 0.6.2)
16
17
  fattr (>= 2.2.0)
17
18
  map (>= 5.1.0)
18
- map (6.5.1)
19
+ map (6.3.0)
19
20
  rake (10.0.4)
20
21
 
21
22
  PLATFORMS
@@ -23,5 +24,4 @@ PLATFORMS
23
24
  ruby
24
25
 
25
26
  DEPENDENCIES
26
- rake
27
27
  ruboto!
data/Rakefile CHANGED
@@ -4,7 +4,6 @@ require 'rexml/document'
4
4
  require 'ruboto/version'
5
5
  require 'ruboto/description'
6
6
  require 'ruboto/sdk_versions'
7
- require 'ruboto/sdk_locations'
8
7
  require 'uri'
9
8
  require 'net/https'
10
9
 
@@ -16,7 +15,6 @@ PLATFORM_CURRENT_RELEASE_APK = File.expand_path('tmp/RubotoCore-release.apk', Fi
16
15
  MANIFEST_FILE = 'AndroidManifest.xml'
17
16
  GEM_FILE = "ruboto-#{Ruboto::VERSION}.gem"
18
17
  GEM_SPEC_FILE = 'ruboto.gemspec'
19
- EXAMPLE_FILE = File.expand_path("examples/RubotoTestApp_#{Ruboto::VERSION}_tools_r#{Ruboto::SdkLocations::ANDROID_TOOLS_REVISION}.tgz", File.dirname(__FILE__))
20
18
 
21
19
  CLEAN.include('ruboto-*.gem', 'tmp')
22
20
 
@@ -65,9 +63,11 @@ end
65
63
  task :reinstall => [:uninstall, :clean, :install]
66
64
 
67
65
  desc 'Generate an example app'
68
- task :example => EXAMPLE_FILE
69
-
70
- file EXAMPLE_FILE => :install do
66
+ task :example => :install do
67
+ require 'ruboto/sdk_locations'
68
+ EXAMPLE_FILE = File.expand_path("examples/RubotoTestApp_#{Ruboto::VERSION}_tools_r#{Ruboto::SdkLocations::ANDROID_TOOLS_REVISION}.tgz", File.dirname(__FILE__))
69
+ examples_glob = "#{EXAMPLE_FILE.slice(/^.*?_\d+\.\d+\.\d+/)}*"
70
+ sh "git rm #{examples_glob}" unless Dir[examples_glob].empty?
71
71
  puts "Creating example app #{EXAMPLE_FILE}"
72
72
  app_name = 'RubotoTestApp'
73
73
  Dir.chdir File.dirname(EXAMPLE_FILE) do
@@ -78,6 +78,12 @@ file EXAMPLE_FILE => :install do
78
78
  end
79
79
  end
80
80
 
81
+ class String
82
+ def wrap(indent = 0)
83
+ scan(/\S.{0,72}\S(?=\s|$)|\S+/).join("\n" + ' ' * indent)
84
+ end
85
+ end
86
+
81
87
  desc 'Generate release docs for a given milestone'
82
88
  task :release_docs do
83
89
  raise "\n This task requires Ruby 1.9 or newer to parse JSON as YAML.\n\n" if RUBY_VERSION == '1.8.7'
@@ -122,6 +128,7 @@ task :release_docs do
122
128
  issues = YAML.load(res.body).sort_by { |i| i['number'] }
123
129
  milestone_name = issues[0] ? issues[0]['milestone']['title'] : "No issues for milestone #{milestone}"
124
130
  milestone_description = issues[0] ? issues[0]['milestone']['description'] : "No issues for milestone #{milestone}"
131
+ milestone_description = milestone_description.split("\r\n").map(&:wrap).join("\r\n")
125
132
  categories = {'Features' => 'feature', 'Bugfixes' => 'bug', 'Internal' => 'internal', 'Support' => 'support', 'Documentation' => 'documentation', 'Pull requests' => nil, 'Other' => nil}
126
133
  grouped_issues = issues.group_by do |i|
127
134
  labels = i['labels'].map { |l| l['name'] }
@@ -180,7 +187,7 @@ EOF
180
187
  puts
181
188
  puts "The Ruboto team is pleased to announce the release of Ruboto #{milestone_name}."
182
189
  puts
183
- puts Ruboto::DESCRIPTION
190
+ puts Ruboto::DESCRIPTION.gsub("\n", ' ').wrap
184
191
  puts
185
192
  puts "New in version #{milestone_name}:\n"
186
193
  puts
@@ -188,7 +195,7 @@ EOF
188
195
  puts
189
196
  (categories.keys & grouped_issues.keys).each do |cat|
190
197
  puts "#{cat}:\n\n"
191
- grouped_issues[cat].each { |i| puts %Q{* Issue ##{i['number']} #{i['title']}} }
198
+ grouped_issues[cat].each { |i| puts %Q{* Issue ##{i['number']} #{i['title']}}.wrap(2) }
192
199
  puts
193
200
  end
194
201
  puts "You can find a complete list of issues here:\n\n"
@@ -197,7 +204,8 @@ EOF
197
204
  puts <<EOF
198
205
  Installation:
199
206
 
200
- To use Ruboto, you need to install a Ruby implementation. Then do (possibly as root)
207
+ To use Ruboto, you need to install a Ruby implementation. Then do
208
+ (possibly as root/administrator)
201
209
 
202
210
  gem install ruboto
203
211
  ruboto setup
@@ -218,7 +226,8 @@ To run your project
218
226
  cd <project directory>
219
227
  rake install start
220
228
 
221
- You can find an introductory tutorial at https://github.com/ruboto/ruboto/wiki
229
+ You can find an introductory tutorial at
230
+ https://github.com/ruboto/ruboto/wiki
222
231
 
223
232
  If you have any problems or questions, come see us at http://ruboto.org/
224
233
 
@@ -312,14 +321,11 @@ end
312
321
 
313
322
  desc 'Push the gem to RubyGems'
314
323
  task :release => [:clean, :gem] do
315
- #output = `git status --porcelain`
316
- #raise "Workspace not clean!\n#{output}" unless output.empty?
324
+ output = `git status --porcelain`
325
+ raise "Workspace not clean!\n#{output}" unless output.empty?
317
326
  sh "git tag #{Ruboto::VERSION}"
318
327
  sh 'git push --tags'
319
328
  sh "gem push #{GEM_FILE}"
320
-
321
- examples_glob = "#{EXAMPLE_FILE.slice(/^.*?_\d+\.\d+\.\d+/)}*"
322
- sh "git rm #{examples_glob}" unless Dir[examples_glob].empty?
323
329
  Rake::Task[:example].invoke
324
330
  sh "git add #{EXAMPLE_FILE}"
325
331
  sh "git commit -m '* Added example app for Ruboto #{Ruboto::VERSION} tools r#{Ruboto::SdkLocations::ANDROID_TOOLS_REVISION}' \"#{examples_glob}\""
@@ -15,42 +15,50 @@ if `#{ANT_CMD} -version` !~ /version (\d+)\.(\d+)\.(\d+)/ || $1.to_i < 1 || ($1.
15
15
  exit 1
16
16
  end
17
17
 
18
+ #
19
+ # OS independent "which"
20
+ # From: http://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby
21
+ #
22
+ def which(cmd)
23
+ exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
24
+ ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
25
+ exts.each do |ext|
26
+ exe = File.join(path, "#{cmd}#{ext}")
27
+ return exe if File.executable? exe
28
+ end
29
+ end
30
+ nil
31
+ end
32
+
18
33
  adb_version_str = `adb version`
19
34
  (puts 'Android SDK platform tools not in PATH (adb command not found).'; exit 1) unless $? == 0
20
35
  (puts "Unrecognized adb version: #$1"; exit 1) unless adb_version_str =~ /Android Debug Bridge version (\d+\.\d+\.\d+)/
21
36
  (puts "adb version 1.0.31 or later required. Version found: #$1"; exit 1) unless Gem::Version.new($1) >= Gem::Version.new('1.0.31')
22
- unless ENV['ANDROID_HOME']
23
- unless ON_WINDOWS
24
- begin
25
- adb_path = `which adb`
26
- ENV['ANDROID_HOME'] = File.dirname(File.dirname(adb_path)) if $? == 0
27
- rescue Errno::ENOENT
28
- puts "Unable to detect adb location: #$!"
29
- end
30
- end
37
+ if ENV['ANDROID_HOME'].nil? && (adb_path = which('adb'))
38
+ ENV['ANDROID_HOME'] = File.dirname(File.dirname(adb_path))
31
39
  end
32
40
  (puts 'You need to set the ANDROID_HOME environment variable.'; exit 1) unless ENV['ANDROID_HOME']
33
41
 
34
- # FIXME(uwe): On windows the file is called dx.bat
35
- dx_filename = File.join(ENV['ANDROID_HOME'], 'platform-tools', ON_WINDOWS ? 'dx.bat' : 'dx')
36
- unless File.exists? dx_filename
37
- puts 'You need to install the Android SDK Platform-tools!'
42
+ # FIXME(uwe): Simplify when we stop supporting Android SDK < 22: Don't look in pltform-tools for dx
43
+ dx_filename = Dir[File.join(ENV['ANDROID_HOME'], '{build-tools/*,platform-tools}', ON_WINDOWS ? 'dx.bat' : 'dx')][-1]
44
+ # EMXIF
45
+
46
+ unless dx_filename
47
+ puts 'You need to install the Android SDK Build-tools!'
38
48
  exit 1
39
49
  end
40
50
  new_dx_content = File.read(dx_filename).dup
41
51
 
42
- # FIXME(uwe): Set Xmx on windows bat script:
43
- # set defaultXmx=-Xmx1024M
44
-
45
- xmx_pattern = /^defaultMx="-Xmx(\d+)(M|m|G|g|T|t)"/
46
- MINIMUM_DX_HEAP_SIZE = 2048
52
+ xmx_pattern = ON_WINDOWS ? /^set defaultXmx=-Xmx(\d+)(M|m|G|g|T|t)/ : /^defaultMx="-Xmx(\d+)(M|m|G|g|T|t)"/
53
+ MINIMUM_DX_HEAP_SIZE = 1536
47
54
  if new_dx_content =~ xmx_pattern &&
48
55
  ($1.to_i * 1024 ** {'M' => 2, 'G' => 3, 'T' => 4}[$2.upcase]) < MINIMUM_DX_HEAP_SIZE*1024**2
49
56
  puts "Increasing max heap space from #$1#$2 to #{MINIMUM_DX_HEAP_SIZE}M in #{dx_filename}"
50
- new_dx_content.sub!(xmx_pattern, %Q{defaultMx="-Xmx#{MINIMUM_DX_HEAP_SIZE}M"})
57
+ new_xmx_value = ON_WINDOWS ? %Q{set defaultXmx=-Xmx#{MINIMUM_DX_HEAP_SIZE}M} : %Q{defaultMx="-Xmx#{MINIMUM_DX_HEAP_SIZE}M"}
58
+ new_dx_content.sub!(xmx_pattern, new_xmx_value)
51
59
 
52
60
  # FIXME(uwe): For travis debugging Remove when travis is stable.
53
- new_dx_content.sub!(/^exec/, "free\necho Virtual:\nps -e -ovsize=,args= | sort -b -k1,1n | tail -n10\necho RSS:\nps -e -orss=,args= | sort -b -k1,1n | tail -n10\necho $javaOpts\necho $@\nexec") if RbConfig::CONFIG['host_os'] =~ /linux/
61
+ new_dx_content.sub!(/^exec/, "free\ncat /proc/meminfo\necho Virtual:\nps -e -ovsize=,args= | sort -b -k1,1n | tail -n10\necho RSS:\nps -e -orss=,args= | sort -b -k1,1n | tail -n10\necho $javaOpts\necho $@\njava -XX:+PrintFlagsFinal -version | grep InitialHeapSize\nexec") if RbConfig::CONFIG['host_os'] =~ /linux/
54
62
  # EMXIF
55
63
 
56
64
  File.open(dx_filename, 'w') { |f| f << new_dx_content } rescue puts "\n!!! Unable to increase dx heap size !!!\n\n"
@@ -504,31 +512,10 @@ def package_installed?(test = false)
504
512
  package_name = "#{package}#{'.tests' if test}"
505
513
  loop do
506
514
  path_line = `adb shell pm path #{package_name}`.chomp
507
-
508
- # FIXME(uwe): Debug travis CI. Remove when Travis CI is OK.
509
- puts '*' * 80
510
- puts 'Output from pm path'
511
- puts '*' * 80
512
- puts $?.inspect
513
- puts '*' * 80
514
- puts path_line
515
- puts '*' * 80
516
- # EMXIF
517
-
518
515
  return nil if $? == 0 && path_line.empty?
519
516
  break if $? == 0 && path_line =~ /^package:(.*)$/
520
-
521
- # FIXME(uwe): Debug travis CI. Remove when Travis CI is OK.
522
- puts '*' * 80
523
- puts 'Unexpected output from pm path'
524
- puts '*' * 80
525
- puts path_line
526
- puts '*' * 80
527
- # EMXIF
528
-
529
517
  sleep 0.5
530
518
  end
531
-
532
519
  path = $1
533
520
  o = `adb shell ls -l #{path}`.chomp
534
521
  raise "Unexpected ls output: #{o}" if o !~ APK_FILE_REGEXP
@@ -567,7 +554,11 @@ def build_apk(t, release)
567
554
  if release
568
555
  sh "#{ANT_CMD} release"
569
556
  else
557
+
558
+ # FIXME(uwe): For travis debugging Remove when travis is stable.
570
559
  sh 'free' if RbConfig::CONFIG['host_os'] =~ /linux/
560
+ # EMXIF
561
+
571
562
  sh "#{ANT_CMD} debug"
572
563
  end
573
564
  true
@@ -674,15 +665,14 @@ end
674
665
 
675
666
  def start_emulator(sdk_level)
676
667
  STDOUT.sync = true
677
- # FIXME(uwe): Use RBConfig instead
678
- if `uname -m`.chomp == 'x86_64'
668
+ if RbConfig::CONFIG['host_cpu'] == 'x86_64'
679
669
  emulator_cmd = 'emulator64-arm'
680
670
  else
681
671
  emulator_cmd = 'emulator-arm'
682
672
  end
683
673
 
684
674
  emulator_opts = '-partition-size 256'
685
- if ENV['DISPLAY'].nil?
675
+ if !ON_WINDOWS && ENV['DISPLAY'].nil?
686
676
  emulator_opts << ' -no-window -no-audio'
687
677
  end
688
678
 
@@ -690,10 +680,12 @@ def start_emulator(sdk_level)
690
680
  new_snapshot = false
691
681
 
692
682
  if `adb devices` =~ /emulator-5554/
693
- t = Net::Telnet.new('Host' => 'localhost', 'Port' => 5554, 'Prompt' => /^OK/)
683
+ t = Net::Telnet.new('Host' => 'localhost', 'Port' => 5554, 'Prompt' => /^OK\n/)
684
+ t.waitfor(/^OK\n/)
694
685
  output = ''
695
686
  t.cmd('avd name') { |c| output << c }
696
- if output =~ /OK\n(.*)\nOK/
687
+ t.close
688
+ if output =~ /(.*)\nOK\n/
697
689
  running_avd_name = $1
698
690
  if running_avd_name == avd_name
699
691
  puts "Emulator #{avd_name} is already running."
@@ -702,8 +694,10 @@ def start_emulator(sdk_level)
702
694
  puts "Emulator #{running_avd_name} is running."
703
695
  end
704
696
  else
705
- puts 'No emulator is running.'
697
+ raise "Unexpected response from emulator: #{output.inspect}"
706
698
  end
699
+ else
700
+ puts 'No emulator is running.'
707
701
  end
708
702
 
709
703
  loop do
@@ -739,17 +733,22 @@ def start_emulator(sdk_level)
739
733
 
740
734
  unless File.exists? "#{ENV['HOME']}/.android/avd/#{avd_name}.avd"
741
735
  puts "Creating AVD #{avd_name}"
736
+ puts `echo n | android create avd -a -n #{avd_name} -t android-#{sdk_level} #{abi_opt} -c 64M -s HVGA`
737
+ if $? != 0
738
+ puts 'Failed to create AVD.'
739
+ exit 3
740
+ end
741
+ avd_config_file_name = "#{ENV['HOME']}/.android/avd/#{avd_name}.avd/config.ini"
742
+ old_avd_config = File.read(avd_config_file_name)
742
743
  heap_size = (File.read('AndroidManifest.xml') =~ /largeHeap/) ? 256 : 48
743
- # FIXME(uwe): Use Ruby instead.
744
- # FIXME(uwe): Only change the heap size to be larger.
745
- # `sed -i.bak -e "s/vm.heapSize=[0-9]*/vm.heapSize=#{heap_size}/" #{ENV['ANDROID_HOME']}/platforms/*/*/*/hardware.ini`
746
- `echo n | android create avd -a -n #{avd_name} -t android-#{sdk_level} #{abi_opt} -c 64M -s HVGA`
747
- `sed -i.bak -e "s/vm.heapSize=[0-9]*/vm.heapSize=#{heap_size}/" #{ENV['HOME']}/.android/avd/#{avd_name}.avd/config.ini`
744
+ new_avd_config = old_avd_config.gsub(/vm.heapSize=([0-9]*)/){|m| p m ; m.to_i < heap_size ? "vm.heapSize=#{heap_size}" : m}
745
+ File.write(avd_config_file_name, new_avd_config) if new_avd_config != old_avd_config
748
746
  new_snapshot = true
749
747
  end
750
748
 
751
749
  puts 'Start emulator'
752
- system "emulator -avd #{avd_name} #{emulator_opts} &"
750
+ system "emulator -avd #{avd_name} #{emulator_opts} #{'&' unless ON_WINDOWS}"
751
+ return if ON_WINDOWS
753
752
 
754
753
  3.times do |i|
755
754
  sleep 1
@@ -767,7 +766,7 @@ def start_emulator(sdk_level)
767
766
  `killall -0 #{emulator_cmd} 2> /dev/null`
768
767
  if $? != 0
769
768
  puts 'Unable to start the emulator. Retrying without loading snapshot.'
770
- system "emulator -no-snapshot-load -avd #{avd_name} #{emulator_opts} &"
769
+ system "emulator -no-snapshot-load -avd #{avd_name} #{emulator_opts} #{'&' unless ON_WINDOWS}"
771
770
  10.times do |i|
772
771
  `killall -0 #{emulator_cmd} 2> /dev/null`
773
772
  if $? == 0
@@ -82,7 +82,7 @@ module Ruboto
82
82
  root = File.expand_path(path)
83
83
  puts "\nGenerating Android app #{name} in #{root}..."
84
84
  system "android create project -n #{name} -t #{target} -p #{path} -k #{package} -a #{activity}"
85
- exit $? unless $? == 0
85
+ exit $?.to_i unless $? == 0
86
86
  unless File.exists? path
87
87
  puts 'Android project was not created'
88
88
  exit_failure!
@@ -362,6 +362,8 @@ module Ruboto
362
362
  when 'ruboto' then
363
363
  puts "\nThe 'ruboto update ruboto' command has been deprecated. Use\n\n ruboto update app\n\ninstead.\n\n"
364
364
  update_ruboto(params['force'].value) || abort
365
+ else
366
+ raise "Unknown update target: #{params['what'].value.inspect}"
365
367
  end
366
368
  end
367
369
  end
@@ -370,8 +372,19 @@ module Ruboto
370
372
  require 'ruboto/util/setup'
371
373
  include Ruboto::Util::Setup
372
374
 
375
+ option('target', 't') {
376
+ description 'sets the target Android API level to set up for (example: -t android-16)'
377
+ argument :required
378
+ default Ruboto::SdkVersions::DEFAULT_TARGET_SDK
379
+ arity -1
380
+ }
381
+
382
+ option('yes', 'y') {
383
+ description 'answer "yes" to all interactive questions. Will automatically install needed components.'
384
+ }
385
+
373
386
  def run
374
- setup_ruboto
387
+ setup_ruboto(params['yes'].value, params['target'].values)
375
388
  end
376
389
  end
377
390
 
@@ -1,12 +1,14 @@
1
1
  require 'pathname'
2
+ require 'ruboto/util/setup'
2
3
 
3
4
  module Ruboto
4
5
  module SdkLocations
6
+ extend Ruboto::Util::Setup
5
7
  if ENV['ANDROID_HOME']
6
8
  ANDROID_HOME = ENV['ANDROID_HOME']
7
9
  else
8
- adb_location = `#{RUBY_PLATFORM =~ /mingw|mswin/ ? 'where' : 'which'} adb`.chomp
9
- if adb_location.empty?
10
+ adb_location = which('adb')
11
+ unless adb_location
10
12
  raise 'Unable to locate the "adb" command. Either set the ANDROID_HOME environment variable or add the location of the "adb" command to your path.'
11
13
  end
12
14
  ANDROID_HOME = File.dirname(File.dirname(Pathname.new(adb_location).realpath))
@@ -1,32 +1,41 @@
1
+ require 'pty'
1
2
  require 'ruboto/sdk_versions'
2
3
 
3
4
  module Ruboto
4
5
  module Util
5
6
  module Setup
6
- include Ruboto::SdkVersions
7
- # Todo: Find a way to look this up
8
- ANDROID_SDK_VERSION = '21.1'
7
+ REPOSITORY_BASE = 'https://dl-ssl.google.com/android/repository'
8
+ REPOSITORY_URL = "#{REPOSITORY_BASE}/repository-8.xml"
9
9
 
10
10
  #########################################
11
11
  #
12
12
  # Core Set up Method
13
13
  #
14
14
 
15
- def setup_ruboto
16
- check = check_all
15
+ def setup_ruboto(accept_all, api_levels = [SdkVersions::DEFAULT_TARGET_SDK])
16
+ @platform_sdk_loc = {}
17
+ api_levels = [read_project_api_level, *api_levels].compact.uniq
18
+ install_all(accept_all, api_levels) unless check_all(api_levels)
19
+ config_path(accept_all)
20
+ end
17
21
 
18
- if not check and RbConfig::CONFIG['host_os'] == /^windows(.*)/
19
- puts "\nWe can't directly install Android on Windows."
20
- puts 'If you would like to contribute to the setup for Windows,'
21
- puts 'please file an issue at https://github.com/ruboto/ruboto/issues'
22
- puts
23
- return
22
+ #
23
+ # OS independent "which"
24
+ # From: http://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby
25
+ #
26
+ def which(cmd)
27
+ exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
28
+ ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
29
+ exts.each do |ext|
30
+ exe = File.join(path, "#{cmd}#{ext}")
31
+ return exe if File.executable? exe
32
+ end
24
33
  end
25
-
26
- install_all if not check
27
- config_path
34
+ nil
28
35
  end
29
36
 
37
+ private
38
+
30
39
  #########################################
31
40
  #
32
41
  # Utility Methods
@@ -54,13 +63,12 @@ module Ruboto
54
63
  end
55
64
  end
56
65
 
57
- def api_level
66
+ def read_project_api_level
58
67
  begin
59
68
  return $1 if File.read('project.properties') =~ /target=(.*)/
60
69
  rescue
61
70
  # ignored
62
71
  end
63
- DEFAULT_TARGET_SDK
64
72
  end
65
73
 
66
74
  def path_setup_file
@@ -78,19 +86,17 @@ module Ruboto
78
86
  end
79
87
  end
80
88
 
81
- #
82
- # OS independent "which"
83
- # From: http://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby
84
- #
85
- def which(cmd)
86
- exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
87
- ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
88
- exts.each { |ext|
89
- exe = File.join(path, "#{cmd}#{ext}")
90
- return exe if File.executable? exe
91
- }
92
- end
93
- nil
89
+ def get_tools_version(type="tool")
90
+ require 'rexml/document'
91
+ require 'open-uri'
92
+
93
+ doc = REXML::Document.new(open(REPOSITORY_URL))
94
+ version = doc.root.elements["sdk:#{type}/sdk:revision/sdk:major"].text
95
+ minor = doc.root.elements["sdk:#{type}/sdk:revision/sdk:minor"]
96
+ micro = doc.root.elements["sdk:#{type}/sdk:revision/sdk:micro"]
97
+ version += ".#{minor.text}" if minor
98
+ version += ".#{micro.text}" if micro
99
+ version
94
100
  end
95
101
 
96
102
  #########################################
@@ -98,55 +104,69 @@ module Ruboto
98
104
  # Check Methods
99
105
  #
100
106
 
101
- def check_all
107
+ def check_all(api_levels)
108
+ @existing_paths = []
102
109
  @missing_paths = []
103
110
 
104
- @java_loc = check_for('java', 'Java')
111
+ @java_loc = check_for('java', 'Java runtime')
105
112
  @javac_loc = check_for('javac', 'Java Compiler')
106
113
  @ant_loc = check_for('ant', 'Apache ANT')
107
- @android_loc = check_for('android', 'Android Package Installer',
108
- File.join(File.expand_path('~'), android_package_directory, 'tools', 'android'))
109
- @emulator_loc = check_for('emulator', 'Android Emulator')
114
+ check_for_android_sdk
115
+ check_for_emulator
116
+ check_for_platform_tools
117
+ check_for_build_tools
118
+ api_levels.each { |api_level| check_for_android_platform(api_level) }
119
+
120
+ puts
121
+ ok = @java_loc && @javac_loc && @ant_loc && @android_loc && @emulator_loc && @adb_loc && @dx_loc && @platform_sdk_loc.all? { |_, path| !path.nil? }
122
+ puts " #{ok ? '*** Ruboto setup is OK! ***' : '!!! Ruboto setup is NOT OK !!!'}\n\n"
123
+ ok
124
+ end
125
+
126
+ def check_for_emulator
127
+ @emulator_loc = check_for('emulator', 'Android Emulator',
128
+ File.join(File.expand_path('~'), android_package_directory, 'tools', 'emulator'))
129
+ end
130
+
131
+ def check_for_platform_tools
110
132
  @adb_loc = check_for('adb', 'Android SDK Command adb',
111
133
  File.join(File.expand_path('~'), android_package_directory, 'platform-tools', 'adb'))
112
- @dx_loc = check_for('dx', 'Android SDK Command dx')
113
- check_for_android_platform
134
+ end
114
135
 
115
- puts
116
- if @java_loc && @javac_loc && @adb_loc && @dx_loc && @emulator_loc && @platform_sdk_loc
117
- puts " *** Ruboto setup is OK! ***\n\n"
118
- true
119
- else
120
- puts " !!! Ruboto setup is NOT OK !!!\n\n"
121
- false
122
- end
136
+ def check_for_build_tools
137
+ @dx_loc = check_for('dx', 'Android SDK Command dx',
138
+ Dir[File.join(File.expand_path('~'), android_package_directory, 'build-tools', '*', 'dx')][-1])
139
+ end
140
+
141
+ def check_for_android_sdk
142
+ @android_loc = check_for('android', 'Android Package Installer',
143
+ File.join(File.expand_path('~'), android_package_directory, 'tools', 'android'))
123
144
  end
124
145
 
125
146
  def check_for(cmd, pretty_name=nil, alt_dir=nil)
126
147
  rv = which(cmd)
127
148
  rv = nil if rv.nil? or rv.empty?
128
149
 
129
- if rv.nil? and alt_dir and File.exists?(alt_dir)
150
+ if rv
151
+ @existing_paths << File.dirname(rv)
152
+ elsif alt_dir and File.exists?(alt_dir)
130
153
  rv = alt_dir
131
154
  ENV['PATH'] = "#{File.dirname(rv)}:#{ENV['PATH']}"
132
155
  @missing_paths << "#{File.dirname(rv)}"
133
156
  end
134
157
 
135
- puts "#{pretty_name || cmd}: " + (rv ? "Found at #{rv}" : 'Not found')
158
+ puts "#{'%-25s' % (pretty_name || cmd)}: #{(rv ? 'Found' : 'Not found')}"
136
159
  rv
137
160
  end
138
161
 
139
- def check_for_android_platform
162
+ def check_for_android_platform(api_level)
140
163
  begin
141
- @platform_sdk_loc = File.expand_path "#{@dx_loc}/../../platforms/#{api_level}"
142
- if File.exists? @platform_sdk_loc
143
- puts "Android platform SDK: Found at #{@platform_sdk_loc}"
144
- else
145
- puts 'Android platform SDK: Not found'
146
- @platform_sdk_loc = nil
147
- end
164
+ @platform_sdk_loc[api_level] = File.expand_path "#{@android_loc}/../../platforms/#{api_level}"
165
+ found = File.exists? @platform_sdk_loc[api_level]
166
+ @platform_sdk_loc[api_level] = nil unless found
167
+ puts "#{'%-25s' % "Platform SDK #{api_level}"}: #{(found ? 'Found' : 'Not found')}"
148
168
  rescue
149
- @platform_sdk_loc = nil
169
+ @platform_sdk_loc[api_level] = nil
150
170
  end
151
171
  end
152
172
 
@@ -155,14 +175,19 @@ module Ruboto
155
175
  # Install Methods
156
176
  #
157
177
 
158
- def install_all
159
- install_java
160
- install_android
161
- install_adb
162
- install_platform
178
+ def install_all(accept_all, api_levels)
179
+ install_java(accept_all) unless @java_loc && @javac_loc
180
+ install_ant(accept_all) unless @ant_loc
181
+ install_android_sdk(accept_all) unless @android_loc
182
+ install_android_tools(accept_all) unless @dx_loc && @adb_loc && @emulator_loc # build-tools, platform-tools and tools
183
+ if @android_loc
184
+ api_levels.each do |api_level|
185
+ install_platform(accept_all, api_level) unless @platform_sdk_loc[api_level]
186
+ end
187
+ end
163
188
  end
164
189
 
165
- def install_java
190
+ def install_java(accept_all)
166
191
  case RbConfig::CONFIG['host_os']
167
192
  when /^darwin(.*)/
168
193
  when /^linux(.*)/
@@ -175,23 +200,105 @@ module Ruboto
175
200
  # exit /b 1
176
201
  #)
177
202
 
178
- java_installer_file_name = 'jdk-7-windows-x64.exe'
179
- require 'net/http'
180
- require 'net/https'
181
- resp = nil
182
- @cookies = ['gpw_e24=http%3A%2F%2Fwww.oracle.com']
183
- puts 'Downloading...'
184
- Net::HTTP.start('download.oracle.com') do |http|
185
- resp, _ = http.get("/otn-pub/java/jdk/7/#{java_installer_file_name}", cookie_header)
186
- resp.body
203
+ puts 'Java JDK was not found.'
204
+ unless accept_all
205
+ print 'Would you like to download and install it? (Y/n): '
206
+ a = STDIN.gets.chomp.upcase
207
+ end
208
+ if accept_all || a == 'Y' || a.empty?
209
+ java_installer_file_name = 'jdk-7-windows-x64.exe'
210
+ require 'net/http'
211
+ require 'net/https'
212
+ resp = nil
213
+ @cookies = %w(gpw_e24=http%3A%2F%2Fwww.oracle.com)
214
+ puts 'Downloading...'
215
+ Net::HTTP.start('download.oracle.com') do |http|
216
+ resp, _ = http.get("/otn-pub/java/jdk/7/#{java_installer_file_name}", cookie_header)
217
+ resp.body
218
+ end
219
+ resp = process_response(resp)
220
+ open(java_installer_file_name, 'wb') { |file| file.write(resp.body) }
221
+ puts "Installing #{java_installer_file_name}..."
222
+ system java_installer_file_name
223
+ raise "Unexpected exit code while installing Java: #{$?}" unless $? == 0
224
+ FileUtils.rm_f java_installer_file_name
225
+ else
226
+ puts
227
+ puts 'You can download and install the Java JDK manually from'
228
+ puts 'http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html'
229
+ puts
230
+ end
231
+ unless check_for('javac')
232
+ ENV['JAVA_HOME'] = 'c:\\Program Files\\Java\\jdk1.7.0'
233
+ if Dir.exists?(ENV['JAVA_HOME'])
234
+ @javac_loc = "#{ENV['JAVA_HOME'].gsub('\\', '/')}/bin/javac"
235
+ puts "Setting the JAVA_HOME environment variable to #{ENV['JAVA_HOME']}"
236
+ system %Q{setx JAVA_HOME "#{ENV['JAVA_HOME']}"}
237
+ @missing_paths << "#{File.dirname(@javac_loc)}"
238
+ end
239
+ end
240
+ else
241
+ raise "Unknown host os: #{RbConfig::CONFIG['host_os']}"
242
+ end
243
+ end
244
+
245
+ def install_ant(accept_all)
246
+ case RbConfig::CONFIG['host_os']
247
+ when /^darwin(.*)/
248
+ when /^linux(.*)/
249
+ when /^mswin32|windows(.*)/
250
+ # FIXME(uwe): Detect and warn if we are not "elevated" with adminstrator rights.
251
+ #set IS_ELEVATED=0
252
+ #whoami /groups | findstr /b /c:"Mandatory Label\High Mandatory Level" | findstr /c:"Enabled group" > nul: && set IS_ELEVATED=1
253
+ #if %IS_ELEVATED%==0 (
254
+ # echo You must run the command prompt as administrator to install.
255
+ # exit /b 1
256
+ #)
257
+
258
+ puts 'Apache ANT was not found.'
259
+ unless accept_all
260
+ print 'Would you like to download and install it? (Y/n): '
261
+ a = STDIN.gets.chomp.upcase
262
+ end
263
+ if accept_all || a == 'Y' || a.empty?
264
+ Dir.chdir Dir.home do
265
+ ant_package_file_name = 'apache-ant-1.9.0-bin.tar.gz'
266
+ require 'net/http'
267
+ require 'net/https'
268
+ puts 'Downloading...'
269
+ Net::HTTP.start('apache.vianett.no') do |http|
270
+ resp, _ = http.get("/ant/binaries/#{ant_package_file_name}")
271
+ open(ant_package_file_name, 'wb') { |file| file.write(resp.body) }
272
+ end
273
+ puts "Installing #{ant_package_file_name}..."
274
+ require 'rubygems/package'
275
+ require 'zlib'
276
+ Gem::Package::TarReader.new(Zlib::GzipReader.open(ant_package_file_name)).each do |entry|
277
+ puts entry.full_name
278
+ if entry.directory?
279
+ FileUtils.mkdir_p entry.full_name
280
+ elsif entry.file?
281
+ FileUtils.mkdir_p File.dirname(entry.full_name)
282
+ File.open(entry.full_name, 'wb') { |f| f << entry.read }
283
+ end
284
+ end
285
+ FileUtils.rm_f ant_package_file_name
286
+ end
287
+ else
288
+ puts
289
+ puts 'You can download and install Apache ANT manually from'
290
+ puts 'http://ant.apache.org/bindownload.cgi'
291
+ puts
292
+ end
293
+ unless check_for('ant')
294
+ ENV['ANT_HOME'] = File.expand_path(File.join('~', 'apache-ant-1.9.0')).gsub('/', '\\')
295
+ if Dir.exists?(ENV['ANT_HOME'])
296
+ @ant_loc = "#{ENV['ANT_HOME'].gsub('\\', '/')}/bin/ant"
297
+ puts "Setting the ANT_HOME environment variable to #{ENV['ANT_HOME']}"
298
+ system %Q{setx ANT_HOME "#{ENV['ANT_HOME']}"}
299
+ @missing_paths << "#{File.dirname(@ant_loc)}"
300
+ end
187
301
  end
188
- resp = process_response(resp)
189
- open(java_installer_file_name, 'wb') { |file| file.write(resp.body) }
190
- puts "Installing #{java_installer_file_name}..."
191
- system java_installer_file_name
192
- raise "Unexpected exit code while installing Java: #{$?}" unless $? == 0
193
- FileUtils.rm_f java_installer_file_name
194
- return
195
302
  else
196
303
  raise "Unknown host os: #{RbConfig::CONFIG['host_os']}"
197
304
  end
@@ -201,7 +308,6 @@ module Ruboto
201
308
  return {} if @cookies.empty?
202
309
  {'Cookie' => @cookies.join(';')}
203
310
  end
204
- private :cookie_header
205
311
 
206
312
  def store_cookie(response)
207
313
  return unless response['set-cookie']
@@ -217,7 +323,6 @@ module Ruboto
217
323
  end
218
324
  @cookies.uniq!
219
325
  end
220
- private :store_cookie
221
326
 
222
327
  def process_response(response)
223
328
  store_cookie(response)
@@ -243,23 +348,24 @@ module Ruboto
243
348
  end
244
349
  response
245
350
  end
246
- private :process_response
247
351
 
248
- def install_android
352
+ def install_android_sdk(accept_all)
249
353
  unless @android_loc
250
354
  puts 'Android package installer not found.'
251
- print 'Would you like to download and install it? (Y/n): '
252
- a = STDIN.gets.chomp.upcase
253
- if a == 'Y' || a.empty?
355
+ unless accept_all
356
+ print 'Would you like to download and install it? (Y/n): '
357
+ a = STDIN.gets.chomp.upcase
358
+ end
359
+ if accept_all || a == 'Y' || a.empty?
254
360
  Dir.chdir File.expand_path('~/') do
255
361
  case RbConfig::CONFIG['host_os']
256
362
  when /^darwin(.*)/
257
- asdk_file_name = "android-sdk_r#{ANDROID_SDK_VERSION}-#{android_package_os_id}.zip"
363
+ asdk_file_name = "android-sdk_r#{get_tools_version}-#{android_package_os_id}.zip"
258
364
  system "wget http://dl.google.com/android/#{asdk_file_name}"
259
- system "unzip #{asdk_file_name}"
365
+ system "unzip #{'-o ' if accept_all}#{asdk_file_name}"
260
366
  system "rm #{asdk_file_name}"
261
367
  when /^linux(.*)/
262
- asdk_file_name = "android-sdk_r#{ANDROID_SDK_VERSION}-#{android_package_os_id}.tgz"
368
+ asdk_file_name = "android-sdk_r#{get_tools_version}-#{android_package_os_id}.tgz"
263
369
  system "wget http://dl.google.com/android/#{asdk_file_name}"
264
370
  system "tar -xzf #{asdk_file_name}"
265
371
  system "rm #{asdk_file_name}"
@@ -272,7 +378,7 @@ module Ruboto
272
378
  # exit /b 1
273
379
  #)
274
380
 
275
- asdk_file_name = "installer_r#{ANDROID_SDK_VERSION}-#{android_package_os_id}.exe"
381
+ asdk_file_name = "installer_r#{get_tools_version}-#{android_package_os_id}.exe"
276
382
  require 'net/http'
277
383
  Net::HTTP.start('dl.google.com') do |http|
278
384
  puts 'Downloading...'
@@ -288,36 +394,72 @@ module Ruboto
288
394
  raise "Unknown host os: #{RbConfig::CONFIG['host_os']}"
289
395
  end
290
396
  end
291
- @android_loc = File.join(File.expand_path('~'), android_package_directory, 'tools', 'android')
292
- ENV['PATH'] = "#{File.dirname(@android_loc)}:#{ENV['PATH']}"
397
+ end
398
+ check_for_android_sdk
399
+ unless @android_loc
400
+ ENV['ANDROID_HOME'] = @android_loc.gsub(File::SEPARATOR, File::ALT_SEPARATOR || File::SEPARATOR)
401
+ puts "Setting the ANDROID_HOME environment variable to #{ENV['ANDROID_HOME']}"
402
+ system %Q{setx ANDROID_HOME "#{ENV['ANDROID_HOME']}"}
293
403
  @missing_paths << "#{File.dirname(@android_loc)}"
294
404
  end
295
405
  end
296
406
  end
297
407
 
298
- def install_adb
299
- if @android_loc and not @adb_loc
300
- puts 'Android command adb not found.'
301
- print 'Would you like to download and install it? (Y/n): '
302
- a = STDIN.gets.chomp.upcase
303
- if a == 'Y' || a.empty?
304
- system 'android update sdk --no-ui --filter tool,platform-tool'
305
- @adb_loc = File.join(File.expand_path('~'), android_package_directory, 'platform-tools', 'adb')
306
- ENV['PATH'] = "#{File.dirname(@adb_loc)}:#{ENV['PATH']}"
307
- @missing_paths << "#{File.dirname(@adb_loc)}"
408
+ def install_android_tools(accept_all)
409
+ if @android_loc and (@dx_loc.nil? || @adb_loc.nil? || @emulator_loc.nil?)
410
+ puts 'Android tools not found.'
411
+ unless accept_all
412
+ print 'Would you like to download and install it? (Y/n): '
413
+ a = STDIN.gets.chomp.upcase
414
+ end
415
+ if accept_all || a == 'Y' || a.empty?
416
+ update_cmd = "android --silent update sdk --no-ui --filter build-tools-#{get_tools_version('build-tool')},platform-tool,tool --force"
417
+ update_sdk(update_cmd, accept_all)
418
+ check_for_build_tools
419
+ check_for_platform_tools
420
+ check_for_emulator
308
421
  end
309
422
  end
310
423
  end
311
424
 
312
- def install_platform
313
- if @android_loc and not @platform_sdk_loc
314
- puts "Android platform SDK for #{api_level} not found."
425
+ def install_platform(accept_all, api_level)
426
+ puts "Android platform SDK for #{api_level} not found."
427
+ unless accept_all
315
428
  print 'Would you like to download and install it? (Y/n): '
316
429
  a = STDIN.gets.chomp.upcase
317
- if a == 'Y' || a.empty?
318
- system "android update sdk --no-ui --filter #{api_level},sysimg-#{api_level.slice(/\d+$/)} --all"
319
- @platform_sdk_loc = File.expand_path "#{@dx_loc}/../../platforms/#{api_level}"
430
+ end
431
+ if accept_all || a == 'Y' || a.empty?
432
+ update_cmd = "android --silent update sdk --no-ui --filter #{api_level},sysimg-#{api_level.slice(/\d+$/)} --all"
433
+ update_sdk(update_cmd, accept_all)
434
+ check_for_android_platform(api_level)
435
+ end
436
+ end
437
+
438
+ def update_sdk(update_cmd, accept_all)
439
+ if accept_all
440
+ begin
441
+ PTY.spawn(update_cmd) do |stdin, stdout, pid|
442
+ begin
443
+ output = ''
444
+ question_pattern = /.*Do you accept the license '[a-z-]+-[0-9a-f]{8}' \[y\/n\]: /m
445
+ STDOUT.sync = true
446
+ stdin.each_char do |text|
447
+ print text
448
+ output << text
449
+ if output =~ question_pattern
450
+ stdout.puts 'y'
451
+ output.sub! question_pattern, ''
452
+ end
453
+ end
454
+ rescue Errno::EIO
455
+ # This probably just means that the process has finished giving output.
456
+ end
457
+ end
458
+ rescue PTY::ChildExited
459
+ puts 'The child process exited!'
320
460
  end
461
+ else
462
+ system update_cmd
321
463
  end
322
464
  end
323
465
 
@@ -326,32 +468,53 @@ module Ruboto
326
468
  # Path Config Method
327
469
  #
328
470
 
329
- def config_path
471
+ def config_path(accept_all)
330
472
  unless @missing_paths.empty?
331
473
  if RbConfig::CONFIG['host_os'] =~ /^mswin32|windows(.*)/
332
474
  puts "\nYou are missing some paths. Execute these lines to add them:\n\n"
333
475
  @missing_paths.each do |path|
334
476
  puts %Q{ set PATH="#{path.gsub '/', '\\'};%PATH%"}
335
477
  end
336
- system %Q{setx PATH "%PATH%;#{@missing_paths.map{|path| path.gsub '/', '\\'}.join(';')}"}
478
+ system %Q{setx PATH "%PATH%;#{@missing_paths.map { |path| path.gsub '/', '\\' }.join(';')}"}
337
479
  else
338
480
  puts "\nYou are missing some paths. Execute these lines to add them:\n\n"
339
481
  @missing_paths.each do |path|
340
482
  puts %Q{ export PATH="#{path}:$PATH"}
341
483
  end
342
- print "\nWould you like to append these lines to your configuration script? (Y/n): "
343
- a = STDIN.gets.chomp.upcase
344
- if a == 'Y' || a.empty?
345
- print "What script do you use to configure your PATH? (#{path_setup_file}): "
346
- a = STDIN.gets.chomp.downcase
347
-
348
- File.open(File.expand_path("~/#{a.empty? ? path_setup_file : a}"), 'a') do |f|
349
- f.puts "\n# BEGIN Ruboto PATH setup"
350
- @missing_paths.each { |path| f.puts %Q{export PATH="#{path}:$PATH"} }
351
- f.puts '# END Ruboto PATH setup'
352
- f.puts
484
+ puts
485
+ unless accept_all
486
+ print "\nWould you like to append these lines to your configuration script? (Y/n): "
487
+ a = STDIN.gets.chomp.upcase
488
+ end
489
+ if accept_all || a == 'Y' || a.empty?
490
+ unless accept_all
491
+ print "What script do you use to configure your PATH? (#{path_setup_file}): "
492
+ a = STDIN.gets.chomp.downcase
493
+ end
494
+ rubotorc = '~/.rubotorc'
495
+ File.open(File.expand_path(rubotorc), 'w') do |f|
496
+ (@existing_paths + @missing_paths - %w(/usr/bin)).uniq.sort.each do |path|
497
+ f << %Q{PATH="#{path}:$PATH"\n}
498
+ end
353
499
  end
354
- puts 'Path updated. Please close your command window and reopen.'
500
+ config_file_name = File.expand_path("~/#{a.nil? || a.empty? ? path_setup_file : a}")
501
+ old_config = File.read(config_file_name)
502
+ new_config = old_config.dup
503
+
504
+ # FIXME(uwe): Remove for Ruboto > 0.13.0
505
+ new_config.gsub! /\n*# BEGIN Ruboto PATH setup\n.*?\n# END Ruboto PATH setup\n*/m, ''
506
+ # EMXIF
507
+
508
+ new_config.gsub! /\n*# BEGIN Ruboto setup\n.*?\n# END Ruboto setup\n*/m, ''
509
+ new_config << "\n\n# BEGIN Ruboto setup\n"
510
+ new_config << "source #{rubotorc}\n"
511
+ new_config << "# END Ruboto setup\n\n"
512
+ File.open(config_file_name, 'wb') { |f| f << new_config }
513
+ puts "Updated #{config_file_name} to load the #{rubotorc} config file."
514
+ puts 'Please close your command window and reopen, or run'
515
+ puts
516
+ puts " source #{rubotorc}"
517
+ puts
355
518
  end
356
519
  end
357
520
  end
@@ -1,4 +1,4 @@
1
1
  module Ruboto
2
- VERSION = '0.12.0'
2
+ VERSION = '0.13.0.rc.0'
3
3
  UPDATE_VERSION_LIMIT = '0.7.0'
4
4
  end
metadata CHANGED
@@ -1,7 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruboto
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 0.13.0.rc.0
5
+ prerelease: 7
5
6
  platform: ruby
6
7
  authors:
7
8
  - Daniel Jackoway
@@ -11,41 +12,50 @@ authors:
11
12
  autorequire:
12
13
  bindir: bin
13
14
  cert_chain: []
14
- date: 2013-05-27 00:00:00.000000000 Z
15
+ date: 2013-05-25 00:00:00.000000000 Z
15
16
  dependencies:
16
17
  - !ruby/object:Gem::Dependency
17
18
  name: main
18
19
  requirement: !ruby/object:Gem::Requirement
20
+ none: false
19
21
  requirements:
20
- - - '>='
22
+ - - ! '>='
21
23
  - !ruby/object:Gem::Version
22
24
  version: 4.7.2
23
25
  type: :runtime
24
26
  prerelease: false
25
27
  version_requirements: !ruby/object:Gem::Requirement
28
+ none: false
26
29
  requirements:
27
- - - '>='
30
+ - - ! '>='
28
31
  - !ruby/object:Gem::Version
29
32
  version: 4.7.2
30
33
  - !ruby/object:Gem::Dependency
31
34
  name: rake
32
35
  requirement: !ruby/object:Gem::Requirement
36
+ none: false
33
37
  requirements:
34
- - - '>='
38
+ - - ! '>='
35
39
  - !ruby/object:Gem::Version
36
40
  version: '0'
37
- type: :development
41
+ type: :runtime
38
42
  prerelease: false
39
43
  version_requirements: !ruby/object:Gem::Requirement
44
+ none: false
40
45
  requirements:
41
- - - '>='
46
+ - - ! '>='
42
47
  - !ruby/object:Gem::Version
43
48
  version: '0'
44
- description: |
45
- Ruboto (JRuby on Android) is a platform for developing full stand-alone apps for
49
+ description: ! 'Ruboto (JRuby on Android) is a platform for developing full stand-alone
50
+ apps for
51
+
46
52
  Android using the Ruby language and libraries. It includes support libraries
53
+
47
54
  and generators for creating projects, classes, tests, and more. The complete
55
+
48
56
  APIs of Android, Java, and Ruby are available to you using the Ruby language.
57
+
58
+ '
49
59
  email: ruboto@googlegroups.com
50
60
  executables:
51
61
  - ruboto
@@ -55,19 +65,15 @@ files:
55
65
  - Gemfile
56
66
  - Gemfile.lock
57
67
  - LICENSE
58
- - README.md
59
68
  - Rakefile
60
- - assets/.DS_Store
61
- - assets/.gitignore
62
- - assets/Rakefile
69
+ - README.md
63
70
  - assets/libs/dx.jar
71
+ - assets/Rakefile
64
72
  - assets/rakelib/ruboto.rake
65
- - assets/res/.DS_Store
73
+ - assets/res/drawable/get_ruboto_core.png
66
74
  - assets/res/drawable-hdpi/ic_launcher.png
67
75
  - assets/res/drawable-ldpi/ic_launcher.png
68
76
  - assets/res/drawable-mdpi/ic_launcher.png
69
- - assets/res/drawable/.DS_Store
70
- - assets/res/drawable/get_ruboto_core.png
71
77
  - assets/res/layout/get_ruboto_core.xml
72
78
  - assets/samples/sample_activity.rb
73
79
  - assets/samples/sample_activity_test.rb
@@ -81,9 +87,6 @@ files:
81
87
  - assets/src/InheritingBroadcastReceiver.java
82
88
  - assets/src/InheritingClass.java
83
89
  - assets/src/InheritingService.java
84
- - assets/src/RubotoActivity.java
85
- - assets/src/RubotoBroadcastReceiver.java
86
- - assets/src/RubotoService.java
87
90
  - assets/src/org/ruboto/EntryPointActivity.java
88
91
  - assets/src/org/ruboto/JRubyAdapter.java
89
92
  - assets/src/org/ruboto/Log.java
@@ -103,12 +106,18 @@ files:
103
106
  - assets/src/ruboto/util/stack.rb
104
107
  - assets/src/ruboto/util/toast.rb
105
108
  - assets/src/ruboto/widget.rb
109
+ - assets/src/RubotoActivity.java
110
+ - assets/src/RubotoBroadcastReceiver.java
111
+ - assets/src/RubotoService.java
106
112
  - assets/test/src/test_helper.rb
113
+ - assets/.DS_Store
114
+ - assets/.gitignore
115
+ - assets/res/.DS_Store
116
+ - assets/res/drawable/.DS_Store
107
117
  - bin/ruboto
108
118
  - lib/DalvikProxyClassFactory.java
109
119
  - lib/DexClient.java
110
120
  - lib/java_class_gen/android_api.xml
111
- - lib/ruboto.rb
112
121
  - lib/ruboto/api.rb
113
122
  - lib/ruboto/commands/base.rb
114
123
  - lib/ruboto/core_ext/array.rb
@@ -129,6 +138,7 @@ files:
129
138
  - lib/ruboto/util/verify.rb
130
139
  - lib/ruboto/util/xml_element.rb
131
140
  - lib/ruboto/version.rb
141
+ - lib/ruboto.rb
132
142
  - test/activity/call_super_activity.rb
133
143
  - test/activity/call_super_activity_test.rb
134
144
  - test/activity/dir_and_file_activity.rb
@@ -177,25 +187,26 @@ files:
177
187
  homepage: http://ruboto.org/
178
188
  licenses:
179
189
  - MIT
180
- metadata: {}
181
190
  post_install_message:
182
191
  rdoc_options: []
183
192
  require_paths:
184
193
  - lib
185
194
  required_ruby_version: !ruby/object:Gem::Requirement
195
+ none: false
186
196
  requirements:
187
- - - '>='
197
+ - - ! '>='
188
198
  - !ruby/object:Gem::Version
189
199
  version: '0'
190
200
  required_rubygems_version: !ruby/object:Gem::Requirement
201
+ none: false
191
202
  requirements:
192
- - - '>='
203
+ - - ! '>'
193
204
  - !ruby/object:Gem::Version
194
- version: '0'
205
+ version: 1.3.1
195
206
  requirements: []
196
207
  rubyforge_project: ruboto/ruboto
197
- rubygems_version: 2.0.3
208
+ rubygems_version: 1.8.25
198
209
  signing_key:
199
- specification_version: 4
210
+ specification_version: 3
200
211
  summary: A platform for developing apps using JRuby on Android.
201
212
  test_files: []
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: e168f6e2a533fb4ab7c97406bed3abc55d9b2f8a
4
- data.tar.gz: 617d03520fe138e398425e6e959524f98def6900
5
- SHA512:
6
- metadata.gz: c61a80b14c92eb6fa98ef657928b8ba720cbde9dbd5a2c5b1d00926b0ea2be3d1809a62fb105f9f38ea261a6cfc9100bb5b8f7540e0410e7854f652ffe985fc5
7
- data.tar.gz: 221be24b4f6ede0f49c4d6c9f05dfddd022b3a82d966998f94fb66800e0aec36ae2b0403959bede0b51d972df4b5bd9f36fded23e41a23f0296574185f482756