ruboto 0.12.0 → 0.13.0.rc.0

Sign up to get free protection for your applications and to get access to all the features.
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