ruboto 0.9.0.rc.1 → 0.9.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 CHANGED
@@ -2,4 +2,3 @@ source :rubygems
2
2
 
3
3
  gem 'rake'
4
4
  gem 'main'
5
- # gem 'jruby-jars'
data/Rakefile CHANGED
@@ -79,6 +79,7 @@ end
79
79
  desc 'Generate release docs for a given milestone'
80
80
  task :release_docs do
81
81
  raise "\n This task requires Ruby 1.9 or newer to parse JSON as YAML.\n\n" if RUBY_VERSION == '1.8.7'
82
+ puts 'GitHub login:'
82
83
  begin
83
84
  require 'rubygems'
84
85
  require 'highline/import'
@@ -86,7 +87,7 @@ task :release_docs do
86
87
  pass = ask('password: ') { |q| q.echo = '*' }
87
88
  rescue
88
89
  print 'user name: ' ; user = STDIN.gets.chomp
89
- print 'password : ' ; pass = STDIN.gets.chomp
90
+ print ' password: ' ; pass = STDIN.gets.chomp
90
91
  end
91
92
  require 'uri'
92
93
  require 'net/http'
@@ -118,6 +119,7 @@ task :release_docs do
118
119
  res = https.start { |http| http.request(req) }
119
120
  issues = YAML.load(res.body).sort_by { |i| i['number'] }
120
121
  milestone_name = issues[0] ? issues[0]['milestone']['title'] : "No issues for milestone #{milestone}"
122
+ milestone_description = issues[0] ? issues[0]['milestone']['description'] : "No issues for milestone #{milestone}"
121
123
  categories = {'Features' => 'feature', 'Bugfixes' => 'bug', 'Internal' => 'internal', 'Support' => 'support', 'Documentation' => 'documentation', 'Pull requests' => nil, 'Other' => nil}
122
124
  grouped_issues = issues.group_by do |i|
123
125
  labels = i['labels'].map { |l| l['name']}
@@ -132,7 +134,17 @@ task :release_docs do
132
134
  cat ||= 'Other'
133
135
  cat
134
136
  end
135
- puts "\nNew in version #{milestone_name}:\n\n"
137
+ puts
138
+ puts "Subject: [ANN] Ruboto #{milestone_name} released!"
139
+ puts
140
+ puts "The Ruboto team is proud to announce the release of Ruboto #{milestone_name}."
141
+ puts
142
+ puts Ruboto::DESCRIPTION
143
+ puts
144
+ puts "New in version #{milestone_name}:\n"
145
+ puts
146
+ puts milestone_description
147
+ puts
136
148
  (categories.keys & grouped_issues.keys).each do |cat|
137
149
  puts "#{cat}:\n\n"
138
150
  grouped_issues[cat].each { |i| puts %Q{* Issue ##{i['number']} #{i['title']}} }
@@ -140,10 +152,39 @@ task :release_docs do
140
152
  end
141
153
  puts "You can find a complete list of issues here:\n\n"
142
154
  puts "* https://github.com/ruboto/ruboto/issues?state=closed&milestone=#{milestone}\n\n"
155
+ puts
156
+ puts <<EOF
157
+ Installation:
158
+
159
+ To use Ruboto, you need to install a Java JDK, the Android SDK, Apache ANT, and a Ruby implementation. Then do (possibly as root)
160
+
161
+ gem install ruboto
162
+
163
+
164
+ To create a project do
165
+
166
+ ruboto gen app --package <your.package.name>
167
+
168
+
169
+ You can find an introductory tutorial at https://github.com/ruboto/ruboto/wiki/Getting-started-with-Ruboto
170
+
171
+ If you have any problems or questions, come see us at http://ruboto.org/
172
+
173
+ Enjoy!
174
+
175
+
176
+ --
177
+ The Ruboto Team
178
+ http://ruboto.org/
179
+
180
+ EOF
181
+
143
182
  end
144
183
 
145
184
  desc 'Fetch download stats form rubygems.org'
146
185
  task :stats do
186
+ require 'time'
187
+ require 'date'
147
188
  require 'rubygems'
148
189
  require 'uri'
149
190
  require 'net/http'
@@ -164,13 +205,14 @@ task :stats do
164
205
  req = Net::HTTP::Get.new(versions_uri.request_uri)
165
206
  res = https.start { |http| http.request(req) }
166
207
  versions = YAML.load(res.body).sort_by { |v| Gem::Version.new(v['number']) }
167
- puts "\n#{gem}:\n#{versions.map { |v| "#{'%10s' % v['number']} #{v['downloads_count']}" }.join("\n")}"
208
+ puts "\n#{gem}:\n#{versions.map { |v| "#{Time.parse(v['built_at']).strftime('%Y-%m-%d')} #{'%10s' % v['number']} #{v['downloads_count']}" }.join("\n")}"
168
209
 
169
210
  versions.each do |v|
170
- downloads_uri = URI("#{base_uri}/versions/#{gem}-#{v['number']}/downloads/search.yaml?from=2010-08-01&to=#{Date.today}")
211
+ downloads_uri = URI("#{base_uri}/versions/#{gem}-#{v['number']}/downloads/search.yaml?from=#{Time.parse(v['built_at']).strftime('%Y-%m-%d')}&to=#{Date.today}")
171
212
  req = Net::HTTP::Get.new(downloads_uri.request_uri)
172
213
  res = https.start { |http| http.request(req) }
173
214
  counts = YAML.load(res.body)
215
+ counts.delete_if{|date_str,count| count == 0}
174
216
  counts.each do |date_str, count|
175
217
  date = Date.parse(date_str)
176
218
  counts_per_month[date.year][date.month] += count
@@ -218,10 +260,10 @@ end
218
260
 
219
261
  desc "Push the gem to RubyGems"
220
262
  task :release => [:clean, :gem] do
221
- output = `git status --porcelain`
222
- raise "Workspace not clean!\n#{output}" unless output.empty?
223
- sh "git tag #{Ruboto::VERSION}"
224
- sh "git push --tags"
263
+ #output = `git status --porcelain`
264
+ #raise "Workspace not clean!\n#{output}" unless output.empty?
265
+ #sh "git tag #{Ruboto::VERSION}"
266
+ #sh "git push --tags"
225
267
  sh "gem push #{GEM_FILE}"
226
268
 
227
269
  examples_glob = "#{EXAMPLE_FILE.slice(/^.*?_\d+\.\d+\.\d+/)}*"
@@ -253,8 +295,8 @@ namespace :platform do
253
295
  sh "ruby -rubygems -I#{File.expand_path('lib', File.dirname(__FILE__))} bin/ruboto gen app --package org.ruboto.core --name RubotoCore --with-jruby --path #{PLATFORM_PROJECT} --min-sdk #{Ruboto::SdkVersions::MINIMUM_SUPPORTED_SDK} --target #{Ruboto::SdkVersions::DEFAULT_TARGET_SDK}"
254
296
  Dir.chdir(PLATFORM_PROJECT) do
255
297
  manifest = REXML::Document.new(File.read(MANIFEST_FILE))
256
- manifest.root.attributes['android:versionCode'] = '408'
257
- manifest.root.attributes['android:versionName'] = '0.4.8'
298
+ manifest.root.attributes['android:versionCode'] = '409'
299
+ manifest.root.attributes['android:versionName'] = '0.4.9'
258
300
  manifest.root.attributes['android:installLocation'] = 'auto' # or 'preferExternal' ?
259
301
  File.open(MANIFEST_FILE, 'w') { |f| manifest.document.write(f, 4) }
260
302
  File.open('Gemfile.apk', 'w'){|f| f << "source :rubygems\n\ngem 'activerecord-jdbc-adapter'\n"}
@@ -40,7 +40,7 @@ THE_CONSTANTS
40
40
 
41
41
  @Override
42
42
  public void onCreate(Bundle bundle) {
43
- System.out.println("RubotoActivity onCreate(): " + getClass().getName());
43
+ System.out.println("THE_RUBOTO_CLASS onCreate(): " + getClass().getName());
44
44
  if (ScriptLoader.isCalledFromJRuby()) {
45
45
  super.onCreate(bundle);
46
46
  return;
@@ -55,14 +55,14 @@ THE_CONSTANTS
55
55
  setTheme(configBundle.getInt("Theme"));
56
56
  }
57
57
  if (configBundle.containsKey("ClassName")) {
58
- if (this.getClass().getName() == RubotoActivity.class.getName()) {
58
+ if (this.getClass().getName() == THE_RUBOTO_CLASS.class.getName()) {
59
59
  scriptInfo.setRubyClassName(configBundle.getString("ClassName"));
60
60
  } else {
61
61
  throw new IllegalArgumentException("Only local Intents may set class name.");
62
62
  }
63
63
  }
64
64
  if (configBundle.containsKey("Script")) {
65
- if (this.getClass().getName() == RubotoActivity.class.getName()) {
65
+ if (this.getClass().getName() == THE_RUBOTO_CLASS.class.getName()) {
66
66
  scriptInfo.setScriptName(configBundle.getString("Script"));
67
67
  } else {
68
68
  throw new IllegalArgumentException("Only local Intents may set script name.");
@@ -217,7 +217,11 @@ public class JRubyAdapter {
217
217
  throw new RuntimeException(iae);
218
218
  } catch (java.lang.reflect.InvocationTargetException ite) {
219
219
  if (isDebugBuild) {
220
- throw ((RuntimeException) ite.getCause());
220
+ if (ite.getCause() instanceof RuntimeException) {
221
+ throw ((RuntimeException) ite.getCause());
222
+ } else {
223
+ throw ((Error) ite.getCause());
224
+ }
221
225
  } else {
222
226
  return null;
223
227
  }
@@ -251,7 +255,7 @@ public class JRubyAdapter {
251
255
  System.setProperty("jruby.backtrace.style", "normal"); // normal raw full mri
252
256
 
253
257
  // Uncomment these to debug/profile Ruby source loading
254
- // System.setProperty("jruby.debug.loadService", "true");
258
+ System.setProperty("jruby.debug.loadService", "true");
255
259
  // System.setProperty("jruby.debug.loadService.timing", "true");
256
260
 
257
261
  // Used to enable JRuby to generate proxy classes
@@ -324,7 +328,16 @@ public class JRubyAdapter {
324
328
  setOutputStream(output);
325
329
  }
326
330
 
327
- String jrubyHome = "file:" + apkName + "!";
331
+ String jrubyHome = "file:" + apkName + "!/jruby.home";
332
+
333
+ // FIXME(uwe): Remove when we stop supporting RubotoCore 0.4.7
334
+ Log.i("RUBOTO_CORE_VERSION_NAME: " + RUBOTO_CORE_VERSION_NAME);
335
+ if (RUBOTO_CORE_VERSION_NAME != null &&
336
+ (RUBOTO_CORE_VERSION_NAME.equals("0.4.7") || RUBOTO_CORE_VERSION_NAME.equals("0.4.8"))) {
337
+ jrubyHome = "file:" + apkName + "!";
338
+ }
339
+ // EMXIF
340
+
328
341
  Log.i("Setting JRUBY_HOME: " + jrubyHome);
329
342
  System.setProperty("jruby.home", jrubyHome);
330
343
 
@@ -9,6 +9,7 @@ import java.io.InputStream;
9
9
  import java.io.OutputStream;
10
10
  import java.lang.reflect.InvocationTargetException;
11
11
  import java.lang.reflect.Method;
12
+ import java.net.URL;
12
13
 
13
14
  import android.content.Context;
14
15
  import android.content.res.AssetManager;
@@ -108,41 +109,30 @@ public class Script {
108
109
  }
109
110
 
110
111
  boolean exists() {
112
+ return getAbsolutePath() != null;
113
+ }
114
+
115
+ String getAbsolutePath() {
111
116
  for (String dir : scriptsDir) {
112
- System.out.println("Checking file: " + dir + "/" + name);
113
- if (new File(dir + "/" + name).exists()) {
114
- return true;
117
+ String path = dir + "/" + name;
118
+ Log.d("Checking path: " + path);
119
+ if (new File(path).exists()) {
120
+ return "file:" + path;
115
121
  }
116
122
  }
117
- try {
118
- java.io.InputStream is = getClass().getClassLoader().getResourceAsStream(name);
119
- System.out.println("Classpath resource: " + is);
120
- if (is != null) {
121
- is.close();
122
- return true;
123
- } else {
124
- return false;
125
- }
126
- } catch (IOException ioex) {
127
- System.out.println("Classpath resource exception: " + ioex);
128
- return false;
123
+ URL url = getClass().getClassLoader().getResource(name);
124
+ Log.d("Classpath resource: " + url);
125
+ if (url != null) {
126
+ return url.toString();
129
127
  }
128
+ return null;
130
129
  }
131
130
 
132
131
  public String getContents() throws IOException {
133
132
  InputStream is = null;
134
133
  BufferedReader buffer = null;
135
134
  try {
136
- for (String dir : scriptsDir) {
137
- System.out.println("Checking file: " + dir + "/" + name);
138
- if (new File(dir + "/" + name).exists()) {
139
- is = new java.io.FileInputStream(dir + "/" + name);
140
- }
141
- }
142
- if (is == null) {
143
- is = getClass().getClassLoader().getResourceAsStream(name);
144
- }
145
- buffer = new BufferedReader(new java.io.InputStreamReader(is), 8192);
135
+ buffer = new BufferedReader(new java.io.InputStreamReader(new URL(getAbsolutePath()).openStream()), 8192);
146
136
  StringBuilder source = new StringBuilder();
147
137
  while (true) {
148
138
  String line = buffer.readLine();
@@ -11,7 +11,7 @@ public class ScriptLoader {
11
11
  */
12
12
  public static boolean isCalledFromJRuby() {
13
13
  StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
14
- int maxLookBack = Math.min(10, stackTraceElements.length);
14
+ int maxLookBack = Math.min(9, stackTraceElements.length);
15
15
  for(int i = 0; i < maxLookBack ; i++){
16
16
  if (stackTraceElements[i].getClassName().startsWith("org.jruby.javasupport.JavaMethod")) {
17
17
  return true;
@@ -26,7 +26,7 @@ public class ScriptLoader {
26
26
  System.out.println("Looking for Ruby class: " + component.getScriptInfo().getRubyClassName());
27
27
  Object rubyClass = JRubyAdapter.get(component.getScriptInfo().getRubyClassName());
28
28
  System.out.println("Found: " + rubyClass);
29
- Script rubyScript = new Script(component.getScriptInfo().getScriptName());
29
+ final Script rubyScript = new Script(component.getScriptInfo().getScriptName());
30
30
  Object rubyInstance;
31
31
  if (rubyScript.exists()) {
32
32
  rubyInstance = component;
@@ -61,7 +61,7 @@ public class ScriptLoader {
61
61
  System.out.println("Set class: " + JRubyAdapter.get(component.getScriptInfo().getRubyClassName()));
62
62
  Thread t = new Thread(new Runnable(){
63
63
  public void run() {
64
- JRubyAdapter.setScriptFilename(component.getScriptInfo().getScriptName());
64
+ JRubyAdapter.setScriptFilename(rubyScript.getAbsolutePath());
65
65
  JRubyAdapter.runScriptlet(script);
66
66
  }
67
67
  });
@@ -81,7 +81,7 @@ public class ScriptLoader {
81
81
  }
82
82
  JRubyAdapter.runScriptlet("$activity.instance_variable_set '@ruboto_java_class', '" + component.getScriptInfo().getRubyClassName() + "'");
83
83
  JRubyAdapter.runScriptlet("puts %Q{$activity: #$activity}");
84
- JRubyAdapter.setScriptFilename(component.getScriptInfo().getScriptName());
84
+ JRubyAdapter.setScriptFilename(rubyScript.getAbsolutePath());
85
85
  JRubyAdapter.runScriptlet(script);
86
86
  }
87
87
  }
@@ -25,16 +25,6 @@ RubotoPreferenceActivity.class_eval do
25
25
  end
26
26
  rv
27
27
  end
28
-
29
- def setup_preference_screen &block
30
- @preference_screen_block = block
31
- end
32
-
33
- def on_create(bundle)
34
- @parent = nil
35
- setPreferenceScreen(instance_eval &@preference_screen_block) if @preference_screen_block
36
- instance_eval { @finish_create_block.call } if @finish_create_block
37
- end
38
28
  end
39
29
 
40
30
  Preference.class_eval do
@@ -58,16 +58,23 @@ module Ruboto
58
58
  description "Generate the JRuby jars jar"
59
59
  cast :boolean
60
60
  }
61
+ option('force') {
62
+ description 'Force creation of project even if the path exists'
63
+ cast :boolean
64
+ }
61
65
 
62
66
  def run
63
67
  package = params['package'].value
64
68
  name = params['name'].value || package.split('.').last.split('_').map{|s| s.capitalize}.join
69
+ name[0..0] = name[0..0].upcase
65
70
  activity = params['activity'].value || "#{name}Activity"
66
71
  path = params['path'].value || package.split('.').last
67
72
  target = params['target'].value
68
73
  min_sdk = params['min-sdk'].value || target
74
+ with_jruby = params['with-jruby'].value
75
+ force = params['force'].value
69
76
 
70
- abort "Path (#{path}) must be to a directory that does not yet exist. It will be created." if File.exists?(path)
77
+ abort "Path (#{path}) must be to a directory that does not yet exist. It will be created." if !force && File.exists?(path)
71
78
  abort "Target must match android-<number>: got #{target}" unless target =~ /^android-(\d+)$/
72
79
  abort "Minimum Android api level is #{MINIMUM_SUPPORTED_SDK}: got #{target}" unless $1.to_i >= MINIMUM_SUPPORTED_SDK_LEVEL
73
80
 
@@ -96,9 +103,9 @@ module Ruboto
96
103
  update_ruboto true
97
104
  update_icons true
98
105
  update_classes nil, true
99
- update_jruby true if params['with-jruby'].value
106
+ update_jruby true if with_jruby
100
107
  update_dx_jar true unless params['with-jruby'].value
101
- update_core_classes "exclude"
108
+ update_core_classes 'include'
102
109
 
103
110
  log_action("Generating the default Activity and script") do
104
111
  generate_inheriting_file "Activity", activity, package
@@ -144,6 +151,7 @@ module Ruboto
144
151
 
145
152
  def run
146
153
  name = params['name'].value
154
+ name[0..0] = name[0..0].upcase
147
155
  script_name = params['script_name'].value || "#{underscore(name)}.rb"
148
156
  klass = params['class'].value
149
157
 
@@ -346,12 +354,14 @@ module Ruboto
346
354
  when "app" then
347
355
  force = params['force'].value
348
356
  old_version = read_ruboto_version
349
- if Gem::Version.new(old_version) < Gem::Version.new(Ruboto::UPDATE_VERSION_LIMIT)
357
+ if old_version && Gem::Version.new(old_version) < Gem::Version.new(Ruboto::UPDATE_VERSION_LIMIT)
350
358
  puts "Detected old Ruboto version: #{old_version}"
351
359
  puts "Will use Ruboto #{Ruboto::UPDATE_VERSION_LIMIT} to update it first."
352
360
  `gem query -i -n ruboto -v #{Ruboto::UPDATE_VERSION_LIMIT}`
353
361
  system "gem install ruboto -v #{Ruboto::UPDATE_VERSION_LIMIT}" unless $? == 0
362
+ raise "Install of Ruboto #{Ruboto::UPDATE_VERSION_LIMIT} failed!" unless $? == 0
354
363
  system "ruboto _#{Ruboto::UPDATE_VERSION_LIMIT}_ update app"
364
+ raise "Ruboto update app to #{Ruboto::UPDATE_VERSION_LIMIT} failed!" unless $? == 0
355
365
  end
356
366
  update_android
357
367
  update_test force
@@ -362,7 +372,7 @@ module Ruboto
362
372
  update_jruby force
363
373
  update_manifest nil, nil, force
364
374
  update_icons force
365
- update_core_classes "exclude"
375
+ update_core_classes 'include'
366
376
  update_bundle
367
377
  when "jruby" then
368
378
  update_jruby(params['force'].value, true) || abort
@@ -37,7 +37,7 @@ module Ruboto
37
37
  unless force == "include"
38
38
  abort "#{klass} not available in minSdkVersion, added in #{element.attribute('api_added')}; use '--force include' to create it" if
39
39
  element.attribute('api_added') and element.attribute('api_added').to_i > verify_min_sdk.to_i
40
- abort "#{klass} deprecated for targetSdkVersion, deprecatrd in #{element.attribute('deprecated')}; use '--force include' to create it" if
40
+ abort "#{klass} deprecated for targetSdkVersion, deprecated in #{element.attribute('deprecated')}; use '--force include' to create it" if
41
41
  element.attribute('deprecated') and element.attribute('deprecated').to_i <= verify_target_sdk.to_i
42
42
  end
43
43
 
@@ -55,9 +55,9 @@ module Ruboto
55
55
  target_api = verify_target_sdk.to_i
56
56
 
57
57
  # Remove methods changed outside of the scope of the sdk versions
58
- methods = methods.select{|i| not i.attribute('api_added') or i.attribute('api_added').to_i <= target_api}
59
- methods = methods.select{|i| not i.attribute('deprecated') or i.attribute('deprecated').to_i > min_api}
60
- methods = methods.select{|i| not i.attribute('api_removed') or i.attribute('api_removed').to_i > min_api}
58
+ methods = methods.select{|i| !i.attribute('api_added') || (i.attribute('api_added').to_i <= target_api)}
59
+ methods = methods.select{|i| !i.attribute('deprecated') || (i.attribute('deprecated').to_i > min_api)}
60
+ methods = methods.select{|i| !i.attribute('api_removed') || (i.attribute('api_removed').to_i > min_api)}
61
61
 
62
62
  # Inform and remove methods that do not exist in one of the sdk versions
63
63
  methods = methods.select do |i|
@@ -31,21 +31,24 @@ module Ruboto
31
31
 
32
32
  def update_test(force = nil)
33
33
  root = Dir.getwd
34
- if !File.exists?("#{root}/test")
34
+ if !File.exists?("#{root}/test") || !File.exists?("#{root}/test/AndroidManifest.xml") || !File.exists?("#{root}/test/ant.properties")
35
35
  name = verify_strings.root.elements['string'].text.gsub(' ', '')
36
36
  puts "\nGenerating Android test project #{name} in #{root}..."
37
37
  system %Q{android create test-project -m "#{root.gsub('"', '\"')}" -n "#{name}Test" -p "#{root.gsub('"', '\"')}/test"}
38
38
  FileUtils.rm_rf File.join(root, 'test', 'src', verify_package.split('.'))
39
39
  puts "Done"
40
- else
41
- test_ant_properties_file = 'test/ant.properties'
42
- test_ant_properties = File.read(test_ant_properties_file)
43
- if test_ant_properties.gsub!(/^tested.project.dir=.*$/, 'tested.project.dir=../')
44
- File.open(test_ant_properties_file, 'w') { |f| f << test_ant_properties }
45
- end
46
40
  end
47
41
 
48
42
  Dir.chdir File.join(root, 'test') do
43
+ instrumentation_property = "test.runner=org.ruboto.test.InstrumentationTestRunner\n"
44
+ prop_file = 'ant.properties'
45
+ prop_lines = (prop_lines_org = File.read(prop_file)).dup
46
+ prop_lines.gsub!(/^tested.project.dir=.*$/, 'tested.project.dir=../')
47
+ prop_lines << instrumentation_property unless prop_lines.include? instrumentation_property
48
+ if prop_lines != prop_lines_org
49
+ File.open(prop_file, 'w') { |f| f << prop_lines }
50
+ end
51
+
49
52
  test_manifest = REXML::Document.new(File.read('AndroidManifest.xml')).root
50
53
  test_manifest.elements['application'].attributes['android:icon'] ||= '@drawable/ic_launcher'
51
54
  test_manifest.elements['instrumentation'].attributes['android:name'] = 'org.ruboto.test.InstrumentationTestRunner'
@@ -65,11 +68,6 @@ module Ruboto
65
68
  # end
66
69
 
67
70
  File.open("AndroidManifest.xml", 'w') { |f| test_manifest.document.write(f, 4) }
68
- instrumentation_property = "test.runner=org.ruboto.test.InstrumentationTestRunner\n"
69
-
70
- prop_file = 'ant.properties'
71
- prop_lines = File.readlines(prop_file)
72
- File.open(prop_file, 'a') { |f| f << instrumentation_property } unless prop_lines.include?(instrumentation_property)
73
71
 
74
72
  run_tests_override = <<-EOF
75
73
  <!-- BEGIN added by Ruboto -->
@@ -389,7 +387,7 @@ module Ruboto
389
387
  if jruby_core_version >= '1.7.0'
390
388
  excluded_core_packages = [
391
389
  'META-INF', 'cext',
392
- # 'com/headius', included since we are trying to use DexClient
390
+ 'com/headius', # included since we are trying to use DexClient
393
391
  'com/headius/invokebinder',
394
392
  'com/kenai/constantine', 'com/kenai/jffi', 'com/martiansoftware', 'ext', 'java',
395
393
  'jline', 'jni',
@@ -415,18 +413,20 @@ module Ruboto
415
413
 
416
414
  # FIXME(uwe): IR is the future. We should try using it.
417
415
  # 'org/jruby/ir',
418
- # 'org/jruby/ir/dataflow',
416
+ 'org/jruby/ir/dataflow',
419
417
  # 'org/jruby/ir/instructions',
420
418
  # 'org/jruby/ir/interpreter',
421
419
  # 'org/jruby/ir/operands',
422
420
  # 'org/jruby/ir/passes',
423
- # 'org/jruby/ir/representations',
424
- # 'org/jruby/ir/targets',
425
- # 'org/jruby/ir/transformations',
426
- # 'org/jruby/ir/util',
421
+ 'org/jruby/ir/representations',
422
+ 'org/jruby/ir/targets',
423
+ 'org/jruby/ir/transformations',
424
+ 'org/jruby/ir/util',
427
425
 
428
426
  'org/jruby/javasupport/bsf',
429
- 'org/jruby/runtime/invokedynamic',
427
+ # 'org/jruby/runtime/invokedynamic', # Should be excluded
428
+
429
+ # 'org/jruby/management', # should be excluded
430
430
  ]
431
431
 
432
432
  # TODO(uwe): Remove when we stop supporting jruby-jars < 1.7.0
@@ -491,13 +491,12 @@ module Ruboto
491
491
  FileUtils.mkdir_p 'tmp'
492
492
  Dir.chdir 'tmp' do
493
493
  FileUtils.mkdir_p 'old'
494
- FileUtils.mkdir_p 'new'
494
+ FileUtils.mkdir_p 'new/jruby.home'
495
495
  Dir.chdir 'old' do
496
496
  `jar -xf ../../#{jruby_stdlib}`
497
497
  end
498
- FileUtils.move 'old/META-INF/jruby.home/lib', 'new'
499
-
500
- FileUtils.rm_rf 'new/lib/ruby/gems'
498
+ FileUtils.move 'old/META-INF/jruby.home/lib', 'new/jruby.home/lib'
499
+ FileUtils.rm_rf 'new/jruby.home/lib/ruby/gems'
501
500
 
502
501
  if excluded_stdlibs.any?
503
502
 
@@ -513,7 +512,7 @@ module Ruboto
513
512
 
514
513
  lib_dirs.each do |ld|
515
514
  excluded_stdlibs.each do |d|
516
- dir = "new/lib/ruby/#{ld}/#{d}"
515
+ dir = "new/jruby.home/lib/ruby/#{ld}/#{d}"
517
516
  FileUtils.rm_rf dir if File.exists? dir
518
517
  file = "#{dir}.rb"
519
518
  FileUtils.rm_rf file if File.exists? file
@@ -524,9 +523,11 @@ module Ruboto
524
523
 
525
524
  Dir.chdir "new" do
526
525
  # Uncomment this part to split the stdlib into one jar per directory
527
- # Dir['*'].select{|f| File.directory? f}.each do |d|
528
- # `jar -cf ../jruby-stdlib-#{d}-#{JRubyJars::VERSION}.jar #{d}`
529
- # FileUtils.rm_rf d
526
+ # Dir['jruby.home/lib/ruby/*/*'].select { |f| File.directory? f }.each do |d|
527
+ # file = "#{d}.rb"
528
+ # `jar -cf ../../jruby-stdlib-#{d.gsub('/', '-')}-#{JRubyJars::VERSION}.jar #{d} #{file if File.exists?(file)}`
529
+ # FileUtils.rm_rf d
530
+ # FileUtils.rm_rf file if File.exists?(file)
530
531
  # end
531
532
 
532
533
  `jar -cf ../../#{jruby_stdlib} .`
@@ -1,4 +1,10 @@
1
1
  module Ruboto
2
- VERSION = '0.9.0.rc.1'
2
+ DESCRIPTION = <<EOF
3
+ Ruboto (JRuby on Android) is a platform for developing full stand-alone apps for
4
+ Android using the Ruby language and libraries. It includes support libraries
5
+ and generators for creating projects, classes, tests, and more. The complete
6
+ APIs of Android, Java, and Ruby is available to you using the Ruby language.
7
+ EOF
8
+ VERSION = '0.9.0'
3
9
  UPDATE_VERSION_LIMIT = '0.5.2'
4
10
  end
@@ -11,8 +11,8 @@ setup do |activity|
11
11
  end
12
12
 
13
13
  # ANDROID: 10, PLATFORM: 0.4.7, JRuby: 1.7.0.dev '28334966' expected, but got '28335067'
14
+ # ANDROID: 15, PLATFORM: STANDALONE, JRuby: 1.7.0 '[28, 33, 51, 68]' expected, but got '[28, 33, 47, 64]'
14
15
  # ANDROID: 16, PLATFORM: 0.4.8.dev, JRuby: 1.7.0.preview2 '[29, 34, 47, 64]' expected, but got '[28, 33, 47, 64]'
15
-
16
16
  test('stack depth') do |activity|
17
17
  os_offset = {
18
18
  13 => [1]*4,
@@ -24,12 +24,13 @@ test('stack depth') do |activity|
24
24
  '0.4.7' => [0, 0, 0, 0],
25
25
  '0.4.8.dev' => [0, 0, -4, -4],
26
26
  '0.4.8' => [0, 0, -4, -4],
27
+ '0.4.9' => [0, 0, -4, -4],
27
28
  }[org.ruboto.JRubyAdapter.platform_version_name] || [0, 0, 0, 0]
28
29
  else # STANDALONE
29
30
  jruby_offset = {
30
31
  '1.7.0.dev' => [1, 1, 1, 1],
31
- '1.7.0.preview2' => [0, 0, -4, -4],
32
- '1.7.0.RC1' => [0, 0, -4, -4],
32
+ '1.7.0' => [0, 0, -4, -4],
33
+ '1.7.1.dev' => [0, 0, -4, -4],
33
34
  }[org.jruby.runtime.Constants::VERSION] || [0, 0, 0, 0]
34
35
  end
35
36
  version_message ="ANDROID: #{android.os.Build::VERSION::SDK_INT}, PLATFORM: #{org.ruboto.JRubyAdapter.uses_platform_apk ? org.ruboto.JRubyAdapter.platform_version_name : 'STANDALONE'}, JRuby: #{org.jruby.runtime.Constants::VERSION}"
@@ -4,10 +4,11 @@ module AppTestMethods
4
4
  include RubotoTest
5
5
 
6
6
  def test_activity_tests
7
+ assert_code 'Base64Loads', "require 'base64'"
7
8
  assert_code 'YamlLoads', "with_large_stack{require 'yaml'}"
8
9
  assert_code 'ReadSourceFile', 'File.read(__FILE__)'
9
10
  assert_code 'DirListsFilesInApk', 'Dir["#{File.dirname(__FILE__)}/*"].each{|f| raise "File #{f.inspect} not found" unless File.exists?(f)}'
10
- assert_code 'RepeatRubotoImport', 'ruboto_import :TextView ; ruboto_import :TextView'
11
+ assert_code 'RepeatRubotoImportWidget', 'ruboto_import_widget :TextView ; ruboto_import_widget :TextView'
11
12
  run_activity_tests('activity')
12
13
  end
13
14
 
@@ -26,12 +27,12 @@ module AppTestMethods
26
27
  private
27
28
 
28
29
  def assert_code(activity_name, code)
29
- snake_name = activity_name.scan(/[A-Z]+[a-z]+/).map { |s| s.downcase }.join('_')
30
+ snake_name = activity_name.scan(/[A-Z]+[a-z0-9]+/).map { |s| s.downcase }.join('_')
30
31
  filename = "src/#{snake_name}_activity.rb"
31
32
  Dir.chdir APP_DIR do
32
33
  system "#{RUBOTO_CMD} gen class Activity --name #{activity_name}Activity"
33
34
  s = File.read(filename)
34
- s.gsub!(/(require 'ruboto')/, "\\1\n#{code}")
35
+ raise "Code injection failed!" unless s.gsub!(/(require 'ruboto\/widget')/, "\\1\n#{code}")
35
36
  File.open(filename, 'w') { |f| f << s }
36
37
  end
37
38
  end
@@ -10,6 +10,7 @@ setup do |activity|
10
10
  assert @text_view
11
11
  end
12
12
 
13
+ # ANDROID: 15, PLATFORM: STANDALONE, JRuby: 1.7.0 '[44, 72, 62, 79]' expected, but got '[44, 71, 62, 79]'
13
14
  test('stack depth') do |activity|
14
15
  os_offset = {13 => 1, 15 => 1, 16 => 1}[android.os.Build::VERSION::SDK_INT].to_i
15
16
  if org.ruboto.JRubyAdapter.uses_platform_apk?
@@ -17,12 +18,14 @@ test('stack depth') do |activity|
17
18
  '0.4.7' => [0, 0, 0, 0],
18
19
  '0.4.8.dev' => [0, -1, 0, 0],
19
20
  '0.4.8' => [0, -1, 0, 0],
21
+ '0.4.9' => [0, -1, 0, 0],
20
22
  }[org.ruboto.JRubyAdapter.platform_version_name] || [0, 0, 0, 0]
21
23
  else # STANDALONE
22
24
  jruby_offset = {
23
25
  '1.7.0.preview1' => [0, -1, -1, -1],
24
26
  '1.7.0.preview2' => [0, -1, 0, 0],
25
- '1.7.0.RC1' => [0, -1, 0, 0],
27
+ '1.7.0' => [0, -1, 0, 0],
28
+ '1.7.1.dev' => [0, -1, 0, 0],
26
29
  }[org.jruby.runtime.Constants::VERSION] || [0, 0, 0, 0]
27
30
  end
28
31
  version_message ="ANDROID: #{android.os.Build::VERSION::SDK_INT}, PLATFORM: #{org.ruboto.JRubyAdapter.uses_platform_apk ? org.ruboto.JRubyAdapter.platform_version_name : 'STANDALONE'}, JRuby: #{org.jruby.runtime.Constants::VERSION}"
@@ -14,7 +14,7 @@ end
14
14
  # ANDROID: 15, PLATFORM: 0.4.8.dev, JRuby: 1.7.0.preview2 '[44, 68, 77, 93]' expected, but got '[44, 67, 76, 92]'
15
15
  # ANDROID: 10, PLATFORM: STANDALONE, JRuby: 1.7.0.preview2 '[43, 67, 76, 92]' expected, but got '[43, 66, 75, 91]'
16
16
  # ANDROID: 15, PLATFORM: STANDALONE, JRuby: 1.7.0.preview2 '[44, 68, 77, 93]' expected, but got '[44, 67, 76, 92]'
17
-
17
+ # ANDROID: 15, PLATFORM: STANDALONE, JRuby: 1.7.0 '[44, 68, 77, 93]' expected, but got '[44, 67, 76, 92]'
18
18
  test('stack depth') do |activity|
19
19
  os_offset = {13 => 1, 15 => 1, 16 => 1}[android.os.Build::VERSION::SDK_INT].to_i
20
20
  if org.ruboto.JRubyAdapter.uses_platform_apk?
@@ -22,13 +22,15 @@ test('stack depth') do |activity|
22
22
  '0.4.7' => [0, 0, 0, 0],
23
23
  '0.4.8.dev' => [0, -1, -1, -1],
24
24
  '0.4.8' => [0, -1, -1, -1],
25
+ '0.4.9' => [0, -1, -1, -1],
25
26
  }[org.ruboto.JRubyAdapter.platform_version_name] || [0, 0, 0, 0]
26
27
  else # STANDALONE
27
28
  jruby_offset = {
28
29
  '1.7.0.dev' => [1, 0, 0, 0],
29
30
  '1.7.0.preview1' => [0, -1, -1, -1],
30
31
  '1.7.0.preview2' => [0, -1, -1, -1],
31
- '1.7.0.RC1' => [0, -1, -1, -1],
32
+ '1.7.0' => [0, -1, -1, -1],
33
+ '1.7.1.dev' => [0, -1, -1, -1],
32
34
  }[org.jruby.runtime.Constants::VERSION] || [0, 0, 0, 0]
33
35
  end
34
36
  version_message ="ANDROID: #{android.os.Build::VERSION::SDK_INT}, PLATFORM: #{org.ruboto.JRubyAdapter.uses_platform_apk ? org.ruboto.JRubyAdapter.platform_version_name : 'STANDALONE'}, JRuby: #{org.jruby.runtime.Constants::VERSION}"
@@ -17,6 +17,7 @@ if RubotoTest::RUBOTO_PLATFORM == 'STANDALONE'
17
17
  # APK was larger than 4.4MB: 4.7MB. JRuby: 1.7.0.preview2, ANDROID_TARGET: 10.
18
18
  # APK was larger than 3.2MB: 3.5MB. JRuby: 1.6.7, ANDROID_TARGET: 15.
19
19
  # APK was larger than 4.6MB: 4.9MB. JRuby: 1.7.0.preview2, ANDROID_TARGET: 15.
20
+ # APK was larger than 3.2MB: 4.7MB. JRuby: 1.7.0, ANDROID_TARGET: 15.
20
21
 
21
22
  def test_minimal_apk_is_less_than_3_mb
22
23
  apk_size = BigDecimal(File.size("#{APP_DIR}/bin/RubotoTestApp-debug.apk").to_s) / (1024 * 1024)
@@ -24,10 +25,9 @@ if RubotoTest::RUBOTO_PLATFORM == 'STANDALONE'
24
25
  '1.6.7' => 3.5,
25
26
  '1.6.7.2' => 3.5,
26
27
  '1.6.8' => 3.5,
27
- '1.7.0.preview1' => 4.6,
28
- '1.7.0.preview2' => ANDROID_TARGET < 15 ? 4.7 : 4.9,
29
- '1.7.0.rc1' => ANDROID_TARGET < 15 ? 4.7 : 4.9,
30
- }[JRUBY_JARS_VERSION.to_s] || 3.2
28
+ '1.7.0' => ANDROID_TARGET < 15 ? 4.7 : 4.9,
29
+ '1.7.1.dev' => ANDROID_TARGET < 15 ? 4.7 : 4.9,
30
+ }[JRUBY_JARS_VERSION.to_s] || 4.9
31
31
  lower_limit = upper_limit * 0.9
32
32
  version_message ="JRuby: #{JRUBY_JARS_VERSION}, ANDROID_TARGET: #{ANDROID_TARGET}"
33
33
  assert apk_size <= upper_limit, "APK was larger than #{'%.1f' % upper_limit}MB: #{'%.1f' % apk_size.ceil(1)}MB. #{version_message}"
@@ -48,6 +48,7 @@ class RubotoGenTest < Test::Unit::TestCase
48
48
  # APK was smaller than 278.1KB: 67.2KB. PLATFORM: CURRENT, ANDROID_TARGET: 15.
49
49
  # APK was larger than 5800.0KB: 5879.2KB. PLATFORM: STANDALONE, ANDROID_TARGET: 15, JRuby: 1.6.7.
50
50
  # APK was larger than 7308.0KB: 7558.3KB. PLATFORM: STANDALONE, ANDROID_TARGET: 15, JRuby: 1.7.0.preview2.
51
+ # APK was larger than 4200.0KB: 7380.0KB. PLATFORM: STANDALONE, ANDROID_TARGET: 15, JRuby: 1.7.0.
51
52
 
52
53
  def test_new_apk_size_is_within_limits
53
54
  apk_size = BigDecimal(File.size("#{APP_DIR}/bin/RubotoTestApp-debug.apk").to_s) / 1024
@@ -56,10 +57,9 @@ class RubotoGenTest < Test::Unit::TestCase
56
57
  if RUBOTO_PLATFORM == 'STANDALONE'
57
58
  upper_limit = {
58
59
  '1.6.7' => ANDROID_TARGET < 15 ? 5800.0 : 5900.0,
59
- '1.7.0.preview1' => ANDROID_TARGET < 15 ? 7400.0 : 7308.0,
60
- '1.7.0.preview2' => ANDROID_TARGET < 15 ? 7400.0 : 7600.0,
61
- '1.7.0.rc1' => ANDROID_TARGET < 15 ? 7400.0 : 7600.0,
62
- }[JRUBY_JARS_VERSION.to_s] || 4200.0
60
+ '1.7.0' => ANDROID_TARGET < 15 ? 7400.0 : 7600.0,
61
+ '1.7.1.dev' => ANDROID_TARGET < 15 ? 7400.0 : 7600.0,
62
+ }[JRUBY_JARS_VERSION.to_s] || 7600.0
63
63
  version << ", JRuby: #{JRUBY_JARS_VERSION.to_s}"
64
64
  else
65
65
  upper_limit = {
@@ -242,13 +242,23 @@ EOF
242
242
  run_app_tests
243
243
  end
244
244
 
245
+ def test_activity_with_first_letter_lower_case_in_name
246
+ Dir.chdir APP_DIR do
247
+ system "#{RUBOTO_CMD} gen class Activity --name appActivity"
248
+ assert_equal 0, $?.exitstatus
249
+ assert File.exists?('src/org/ruboto/test_app/AppActivity.java')
250
+ assert File.exists?('src/app_activity.rb')
251
+ assert File.exists?('test/src/app_activity_test.rb')
252
+ end
253
+ end
254
+
245
255
  if RUBOTO_PLATFORM == 'FROM_GEM'
246
256
  def test_gen_jruby
247
257
  Dir.chdir APP_DIR do
248
258
  system "#{RUBOTO_CMD} gen jruby"
249
259
  assert_equal 0, $?.exitstatus
250
- assert File.exists?("libs/jruby-core-#{JRUBY_JARS_VERSION}.jar")
251
- assert File.exists?("libs/jruby-stdlib-#{JRUBY_JARS_VERSION}.jar")
260
+ assert_equal ["libs/jruby-core-#{JRUBY_JARS_VERSION.to_s.downcase}.jar"], Dir["libs/jruby-core-*.jar"].map(&:downcase)
261
+ assert_equal ["libs/jruby-stdlib-#{JRUBY_JARS_VERSION.to_s.downcase}.jar"], Dir["libs/jruby-stdlib-*.jar"].map(&:downcase)
252
262
  end
253
263
  end
254
264
  end
@@ -1,7 +1,9 @@
1
1
  require File.expand_path("test_helper", File.dirname(__FILE__))
2
2
 
3
3
  # FIXME(uwe): Remove check when we stop supporting JRuby older than 1.7.0.rc1
4
- if RubotoTest::JRUBY_JARS_VERSION >= Gem::Version.new('1.7.0.rc1')
4
+ # FIXME(uwe): Remove check when we stop supporting Android < 4.0.3
5
+ if RubotoTest::JRUBY_JARS_VERSION >= Gem::Version.new('1.7.0.rc1') &&
6
+ (RubotoTest::ANDROID_OS >= 15 || RubotoTest::RUBOTO_PLATFORM != 'STANDALONE')
5
7
 
6
8
  require 'bigdecimal'
7
9
  require 'test/app_test_methods'
@@ -117,7 +117,7 @@ module RubotoTest
117
117
  install_jruby_jars_gem
118
118
 
119
119
  if RUBOTO_PLATFORM == 'CURRENT'
120
- JRUBY_JARS_VERSION = Gem::Version.new('1.7.0.dev')
120
+ JRUBY_JARS_VERSION = Gem::Version.new('1.7.1.dev')
121
121
  else
122
122
  # FIXME(uwe): Simplify when we stop supporting rubygems < 1.8.0
123
123
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.8.0')
@@ -179,6 +179,7 @@ class Test::Unit::TestCase
179
179
  FileUtils.rm_rf APP_DIR if File.exists? APP_DIR
180
180
  template_dir = "#{APP_DIR}_template_#{$$}"
181
181
  template_dir << "_example_#{example}" if example
182
+ template_dir << "_bundle_#{[*bundle].join('_')}" if bundle
182
183
  template_dir << '_updated' if update
183
184
  template_dir << '_standalone' if standalone
184
185
  template_dir << "_without_#{excluded_stdlibs.map { |ed| ed.gsub(/[.\/]/, '_') }.join('_')}" if excluded_stdlibs
@@ -13,6 +13,22 @@ module UpdateTestMethods
13
13
  cleanup_app
14
14
  end
15
15
 
16
+ # FIXME(uwe): We have no solution for legacy apps <= 0.9.0.rc1 and new RubotoCore >= 0.4.9.
17
+ unless Gem::Version.new(@old_ruboto_version) <= Gem::Version.new('0.9.0.rc.1')
18
+ def test_an_unchanged_app_succeeds_loading_stdlib
19
+ # FIXME(uwe): Remove when we stop supporting legacy Ruboto 0.9.0.rc.1 apps and older
20
+ if Gem::Version.new(@old_ruboto_version) <= Gem::Version.new('0.9.0.rc.1')
21
+ Dir.chdir "#{APP_DIR}/test" do
22
+ test_props = File.read('ant.properties')
23
+ test_props.gsub! /^tested.project.dir=.*$/, 'tested.project.dir=../'
24
+ File.open('ant.properties', 'w') { |f| f << test_props }
25
+ end
26
+ end
27
+ assert_code "require 'base64'"
28
+ run_app_tests
29
+ end
30
+ end
31
+
16
32
  def test_broadcast_receiver
17
33
  Dir.chdir APP_DIR do
18
34
  puts "Adding a broadcast receiver"
@@ -63,4 +79,15 @@ module UpdateTestMethods
63
79
  end
64
80
  end
65
81
 
82
+ private
83
+
84
+ def assert_code(code)
85
+ filename = "src/ruboto_test_app_activity.rb"
86
+ Dir.chdir APP_DIR do
87
+ s = File.read(filename)
88
+ raise "Code injection failed!" unless s.gsub!(/(require 'ruboto\/widget')/, "\\1\n#{code}")
89
+ File.open(filename, 'w') { |f| f << s }
90
+ end
91
+ end
92
+
66
93
  end
metadata CHANGED
@@ -1,15 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruboto
3
3
  version: !ruby/object:Gem::Version
4
- hash: -3487987620
5
- prerelease: 6
4
+ hash: 59
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
9
  - 0
10
- - rc
11
- - 1
12
- version: 0.9.0.rc.1
10
+ version: 0.9.0
13
11
  platform: ruby
14
12
  authors:
15
13
  - Daniel Jackoway
@@ -20,7 +18,7 @@ autorequire:
20
18
  bindir: bin
21
19
  cert_chain: []
22
20
 
23
- date: 2012-09-29 00:00:00 Z
21
+ date: 2012-11-07 00:00:00 Z
24
22
  dependencies:
25
23
  - !ruby/object:Gem::Dependency
26
24
  name: main
@@ -45,9 +43,12 @@ dependencies:
45
43
  version: 4.7.2
46
44
  type: :runtime
47
45
  version_requirements: *id001
48
- description: |-
49
- Ruboto - JRuby on Android
50
- A generator and framework for developing full stand-alone apps for Android using the Ruby language and libraries.
46
+ description: |
47
+ Ruboto (JRuby on Android) is a platform for developing full stand-alone apps for
48
+ Android using the Ruby language and libraries. It includes support libraries
49
+ and generators for creating projects, classes, tests, and more. The complete
50
+ APIs of Android, Java, and Ruby is available to you using the Ruby language.
51
+
51
52
  email: ruboto@googlegroups.com
52
53
  executables:
53
54
  - ruboto
@@ -204,14 +205,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
204
205
  required_rubygems_version: !ruby/object:Gem::Requirement
205
206
  none: false
206
207
  requirements:
207
- - - ">"
208
+ - - ">="
208
209
  - !ruby/object:Gem::Version
209
- hash: 25
210
+ hash: 3
210
211
  segments:
211
- - 1
212
- - 3
213
- - 1
214
- version: 1.3.1
212
+ - 0
213
+ version: "0"
215
214
  requirements: []
216
215
 
217
216
  rubyforge_project: ruboto/ruboto