ruboto 0.11.0 → 0.12.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 +1 -1
- data/README.md +7 -5
- data/Rakefile +3 -4
- data/assets/rakelib/ruboto.rake +138 -87
- data/assets/samples/sample_broadcast_receiver.rb +1 -1
- data/assets/src/InheritingActivity.java +0 -6
- data/assets/src/RubotoActivity.java +4 -1
- data/assets/src/RubotoBroadcastReceiver.java +2 -11
- data/assets/src/RubotoService.java +6 -52
- data/assets/src/org/ruboto/EntryPointActivity.java +276 -36
- data/assets/src/org/ruboto/JRubyAdapter.java +5 -152
- data/assets/src/org/ruboto/Script.java +1 -1
- data/assets/src/org/ruboto/ScriptLoader.java +26 -44
- data/assets/src/org/ruboto/test/InstrumentationTestRunner.java +4 -21
- data/bin/ruboto +0 -6
- data/lib/ruboto/commands/base.rb +58 -48
- data/lib/ruboto/sdk_locations.rb +23 -0
- data/lib/ruboto/sdk_versions.rb +1 -19
- data/lib/ruboto/util/build.rb +32 -32
- data/lib/ruboto/util/setup.rb +240 -0
- data/lib/ruboto/util/update.rb +12 -25
- data/lib/ruboto/util/verify.rb +7 -4
- data/lib/ruboto/util/xml_element.rb +62 -76
- data/lib/ruboto/version.rb +1 -1
- data/test/activity/image_button_activity_test.rb +2 -2
- data/test/activity/image_button_and_button_activity_test.rb +2 -2
- data/test/activity/json_activity.rb +1 -1
- data/test/activity/navigation_activity.rb +12 -12
- data/test/activity/navigation_activity_test.rb +7 -7
- data/test/activity/option_menu_activity.rb +0 -1
- data/test/activity/option_menu_activity_test.rb +2 -2
- data/test/activity/stack_activity_test.rb +10 -20
- data/test/app_test_methods.rb +0 -4
- data/test/broadcast_receiver_test.rb +16 -6
- data/test/minimal_app_test.rb +4 -12
- data/test/rake_test.rb +37 -23
- data/test/ruboto_gen_test.rb +12 -15
- data/test/sqldroid_test.rb +3 -6
- data/test/test_helper.rb +2 -0
- data/test/update_test_methods.rb +9 -9
- metadata +7 -11
@@ -23,92 +23,6 @@ public class JRubyAdapter {
|
|
23
23
|
private static String localVariableBehavior = "TRANSIENT";
|
24
24
|
private static String RUBOTO_CORE_VERSION_NAME;
|
25
25
|
|
26
|
-
/**
|
27
|
-
* @deprecated As of Ruboto 0.7.1, replaced by {@link #runRubyMethod(Object receiver, String methodName, Object... args)}
|
28
|
-
*/
|
29
|
-
@Deprecated public static void callMethod(Object receiver, String methodName, Object[] args) {
|
30
|
-
runRubyMethod(receiver, methodName, args);
|
31
|
-
}
|
32
|
-
|
33
|
-
/**
|
34
|
-
* @deprecated As of Ruboto 0.7.1, replaced by {@link #runRubyMethod(Object receiver, String methodName, Object... args)}
|
35
|
-
*/
|
36
|
-
@Deprecated public static void callMethod(Object object, String methodName, Object arg) {
|
37
|
-
runRubyMethod(object, methodName, arg);
|
38
|
-
}
|
39
|
-
|
40
|
-
/**
|
41
|
-
* @deprecated As of Ruboto 0.7.1, replaced by {@link #runRubyMethod(Object receiver, String methodName, Object... args)}
|
42
|
-
*/
|
43
|
-
@Deprecated public static void callMethod(Object object, String methodName) {
|
44
|
-
runRubyMethod(object, methodName, new Object[] {});
|
45
|
-
}
|
46
|
-
|
47
|
-
/**
|
48
|
-
* @deprecated As of Ruboto 0.7.1, replaced by {@link #runRubyMethod(Class<T> returnType, Object receiver, String methodName, Object... args)}
|
49
|
-
*/
|
50
|
-
@SuppressWarnings("unchecked")
|
51
|
-
@Deprecated public static <T> T callMethod(Object receiver, String methodName, Object[] args, Class<T> returnType) {
|
52
|
-
return (T) runRubyMethod(returnType, receiver, methodName, args);
|
53
|
-
}
|
54
|
-
|
55
|
-
/**
|
56
|
-
* @deprecated As of Ruboto 0.7.1, replaced by {@link #runRubyMethod(Class<T> returnType, Object receiver, String methodName, Object... args)}
|
57
|
-
*/
|
58
|
-
@SuppressWarnings("unchecked")
|
59
|
-
@Deprecated public static <T> T callMethod(Object receiver, String methodName, Object arg, Class<T> returnType) {
|
60
|
-
return (T) runRubyMethod(returnType, receiver, methodName, arg);
|
61
|
-
}
|
62
|
-
|
63
|
-
/**
|
64
|
-
* @deprecated As of Ruboto 0.7.1, replaced by {@link #runRubyMethod(Class<T> returnType, Object receiver, String methodName, Object... args)}
|
65
|
-
*/
|
66
|
-
@SuppressWarnings("unchecked")
|
67
|
-
@Deprecated public static <T> T callMethod(Object receiver, String methodName, Class<T> returnType) {
|
68
|
-
return (T) runRubyMethod(returnType, receiver, methodName);
|
69
|
-
}
|
70
|
-
|
71
|
-
/**
|
72
|
-
* @deprecated As of Ruboto 0.7.0, replaced by {@link #put(String name, Object object)}
|
73
|
-
*/
|
74
|
-
@Deprecated public static void defineGlobalConstant(String name, Object object) {
|
75
|
-
put(name, object);
|
76
|
-
}
|
77
|
-
|
78
|
-
/**
|
79
|
-
* @deprecated As of Ruboto 0.7.0, replaced by {@link #put(String name, Object object)}
|
80
|
-
*/
|
81
|
-
@Deprecated public static void defineGlobalVariable(String name, Object object) {
|
82
|
-
put(name, object);
|
83
|
-
}
|
84
|
-
|
85
|
-
/**
|
86
|
-
* @deprecated As of Ruboto 0.7.0, replaced by {@link #runScriptlet(String code)}
|
87
|
-
*/
|
88
|
-
@Deprecated public static Object exec(String code) {
|
89
|
-
try {
|
90
|
-
Method runScriptletMethod = ruby.getClass().getMethod("runScriptlet", String.class);
|
91
|
-
return runScriptletMethod.invoke(ruby, code);
|
92
|
-
} catch (NoSuchMethodException nsme) {
|
93
|
-
throw new RuntimeException(nsme);
|
94
|
-
} catch (IllegalAccessException iae) {
|
95
|
-
throw new RuntimeException(iae);
|
96
|
-
} catch (java.lang.reflect.InvocationTargetException ite) {
|
97
|
-
if (isDebugBuild) {
|
98
|
-
throw ((RuntimeException) ite.getCause());
|
99
|
-
} else {
|
100
|
-
return null;
|
101
|
-
}
|
102
|
-
}
|
103
|
-
}
|
104
|
-
|
105
|
-
/**
|
106
|
-
* @deprecated As of Ruboto 0.7.0, replaced by {@link #runScriptlet(String code)}
|
107
|
-
*/
|
108
|
-
@Deprecated public static String execute(String code) {
|
109
|
-
return (String) runRubyMethod(String.class, exec(code), "inspect");
|
110
|
-
}
|
111
|
-
|
112
26
|
public static Object get(String name) {
|
113
27
|
try {
|
114
28
|
Method getMethod = ruby.getClass().getMethod("get", String.class);
|
@@ -132,21 +46,8 @@ public class JRubyAdapter {
|
|
132
46
|
|
133
47
|
public static Object runRubyMethod(Object receiver, String methodName, Object... args) {
|
134
48
|
try {
|
135
|
-
|
136
|
-
|
137
|
-
if (args.length == 0) {
|
138
|
-
Method m = ruby.getClass().getMethod("callMethod", Object.class, String.class, Class.class);
|
139
|
-
// System.out.println("Calling callMethod(" + receiver + ", " + methodName + ", " + Object.class + ")");
|
140
|
-
return m.invoke(ruby, receiver, methodName, Object.class);
|
141
|
-
} else {
|
142
|
-
Method m = ruby.getClass().getMethod("callMethod", Object.class, String.class, Object[].class, Class.class);
|
143
|
-
// System.out.println("Calling callMethod(" + receiver + ", " + methodName + ", " + args + ", " + Object.class + ")");
|
144
|
-
return m.invoke(ruby, receiver, methodName, args, Object.class);
|
145
|
-
}
|
146
|
-
} else {
|
147
|
-
Method m = ruby.getClass().getMethod("runRubyMethod", Class.class, Object.class, String.class, Object[].class);
|
148
|
-
return m.invoke(ruby, Object.class, receiver, methodName, args);
|
149
|
-
}
|
49
|
+
Method m = ruby.getClass().getMethod("runRubyMethod", Class.class, Object.class, String.class, Object[].class);
|
50
|
+
return m.invoke(ruby, Object.class, receiver, methodName, args);
|
150
51
|
} catch (NoSuchMethodException nsme) {
|
151
52
|
throw new RuntimeException(nsme);
|
152
53
|
} catch (IllegalAccessException iae) {
|
@@ -163,19 +64,8 @@ public class JRubyAdapter {
|
|
163
64
|
@SuppressWarnings("unchecked")
|
164
65
|
public static <T> T runRubyMethod(Class<T> returnType, Object receiver, String methodName, Object... args) {
|
165
66
|
try {
|
166
|
-
|
167
|
-
|
168
|
-
if (args.length == 0) {
|
169
|
-
Method m = ruby.getClass().getMethod("callMethod", Object.class, String.class, Class.class);
|
170
|
-
return (T) m.invoke(ruby, receiver, methodName, returnType);
|
171
|
-
} else {
|
172
|
-
Method m = ruby.getClass().getMethod("callMethod", Object.class, String.class, Object[].class, Class.class);
|
173
|
-
return (T) m.invoke(ruby, receiver, methodName, args, returnType);
|
174
|
-
}
|
175
|
-
} else {
|
176
|
-
Method m = ruby.getClass().getMethod("runRubyMethod", Class.class, Object.class, String.class, Object[].class);
|
177
|
-
return (T) m.invoke(ruby, returnType, receiver, methodName, args);
|
178
|
-
}
|
67
|
+
Method m = ruby.getClass().getMethod("runRubyMethod", Class.class, Object.class, String.class, Object[].class);
|
68
|
+
return (T) m.invoke(ruby, returnType, receiver, methodName, args);
|
179
69
|
} catch (NoSuchMethodException nsme) {
|
180
70
|
throw new RuntimeException(nsme);
|
181
71
|
} catch (IllegalAccessException iae) {
|
@@ -262,11 +152,6 @@ public class JRubyAdapter {
|
|
262
152
|
System.setProperty("jruby.ji.proxyClassFactory", "org.ruboto.DalvikProxyClassFactory");
|
263
153
|
System.setProperty("jruby.class.cache.path", appContext.getDir("dex", 0).getAbsolutePath());
|
264
154
|
|
265
|
-
// Workaround for bug in Android 2.2
|
266
|
-
// http://code.google.com/p/android/issues/detail?id=9431
|
267
|
-
// System.setProperty("java.net.preferIPv4Stack", "true");
|
268
|
-
// System.setProperty("java.net.preferIPv6Addresses", "false");
|
269
|
-
|
270
155
|
ClassLoader classLoader;
|
271
156
|
Class<?> scriptingContainerClass;
|
272
157
|
String apkName = null;
|
@@ -459,16 +344,6 @@ public class JRubyAdapter {
|
|
459
344
|
ruby = null;
|
460
345
|
}
|
461
346
|
|
462
|
-
// FIXME(uwe): Remove when we stop supporting JRuby < 1.7.0
|
463
|
-
@Deprecated public static boolean isJRubyPreOneSeven() {
|
464
|
-
return ((String)get("JRUBY_VERSION")).equals("1.7.0.dev") || ((String)get("JRUBY_VERSION")).startsWith("1.6.");
|
465
|
-
}
|
466
|
-
|
467
|
-
// FIXME(uwe): Remove when we stop supporting JRuby < 1.7.0
|
468
|
-
@Deprecated public static boolean isJRubyOneSeven() {
|
469
|
-
return !isJRubyPreOneSeven() && ((String)get("JRUBY_VERSION")).startsWith("1.7.");
|
470
|
-
}
|
471
|
-
|
472
347
|
// FIXME(uwe): Remove when we stop supporting Ruby 1.8
|
473
348
|
@Deprecated public static boolean isRubyOneEight() {
|
474
349
|
return ((String)get("RUBY_VERSION")).startsWith("1.8.");
|
@@ -496,29 +371,7 @@ public class JRubyAdapter {
|
|
496
371
|
private static String scriptsDirName(Context context) {
|
497
372
|
File storageDir = null;
|
498
373
|
if (isDebugBuild()) {
|
499
|
-
|
500
|
-
// FIXME(uwe): Simplify this as soon as we drop support for android-7
|
501
|
-
if (android.os.Build.VERSION.SDK_INT >= 8) {
|
502
|
-
try {
|
503
|
-
Method method = context.getClass().getMethod("getExternalFilesDir", String.class);
|
504
|
-
storageDir = (File) method.invoke(context, (Object) null);
|
505
|
-
} catch (SecurityException e) {
|
506
|
-
printStackTrace(e);
|
507
|
-
} catch (NoSuchMethodException e) {
|
508
|
-
printStackTrace(e);
|
509
|
-
} catch (IllegalArgumentException e) {
|
510
|
-
printStackTrace(e);
|
511
|
-
} catch (IllegalAccessException e) {
|
512
|
-
printStackTrace(e);
|
513
|
-
} catch (InvocationTargetException e) {
|
514
|
-
printStackTrace(e);
|
515
|
-
}
|
516
|
-
} else {
|
517
|
-
storageDir = new File(Environment.getExternalStorageDirectory(), "Android/data/" + context.getPackageName() + "/files");
|
518
|
-
Log.e("Calculated path to sdcard the old way: " + storageDir);
|
519
|
-
}
|
520
|
-
// FIXME end
|
521
|
-
|
374
|
+
storageDir = context.getExternalFilesDir(null);
|
522
375
|
if (storageDir == null || (!storageDir.exists() && !storageDir.mkdirs())) {
|
523
376
|
Log.e("Development mode active, but sdcard is not available. Make sure you have added\n<uses-permission android:name='android.permission.WRITE_EXTERNAL_STORAGE' />\nto your AndroidManifest.xml file.");
|
524
377
|
storageDir = context.getFilesDir();
|
@@ -21,15 +21,16 @@ public class ScriptLoader {
|
|
21
21
|
return false;
|
22
22
|
}
|
23
23
|
|
24
|
-
public static void loadScript(final RubotoComponent component
|
24
|
+
public static void loadScript(final RubotoComponent component) {
|
25
25
|
try {
|
26
26
|
if (component.getScriptInfo().getScriptName() != null) {
|
27
|
-
|
27
|
+
Log.d("Looking for Ruby class: " + component.getScriptInfo().getRubyClassName());
|
28
28
|
Object rubyClass = JRubyAdapter.get(component.getScriptInfo().getRubyClassName());
|
29
|
-
|
29
|
+
Log.d("Found: " + rubyClass);
|
30
30
|
final Script rubyScript = new Script(component.getScriptInfo().getScriptName());
|
31
31
|
Object rubyInstance;
|
32
32
|
if (rubyScript.exists()) {
|
33
|
+
Log.d("Found script.");
|
33
34
|
rubyInstance = component;
|
34
35
|
final String script = rubyScript.getContents();
|
35
36
|
boolean scriptContainsClass = script.matches("(?s).*class "
|
@@ -38,43 +39,38 @@ public class ScriptLoader {
|
|
38
39
|
.equals(component.getClass().getSimpleName());
|
39
40
|
if (scriptContainsClass) {
|
40
41
|
if (hasBackingJavaClass) {
|
42
|
+
Log.d("hasBackingJavaClass");
|
41
43
|
if (rubyClass != null && !rubyClass.toString().startsWith("Java::")) {
|
42
|
-
|
44
|
+
Log.d("Found Ruby class instead of Java class. Reloading.");
|
43
45
|
rubyClass = null;
|
44
46
|
}
|
45
47
|
} else {
|
46
|
-
|
48
|
+
Log.d("Script defines methods on meta class");
|
47
49
|
|
48
|
-
// FIXME(uwe): Simplify when we stop support for
|
49
|
-
if (JRubyAdapter.
|
50
|
+
// FIXME(uwe): Simplify when we stop support for Ruby 1.8 mode.
|
51
|
+
if (JRubyAdapter.isRubyOneEight()) {
|
50
52
|
JRubyAdapter.put("$java_instance", component);
|
51
53
|
rubyClass = JRubyAdapter.runScriptlet("class << $java_instance; self; end");
|
52
|
-
} else if (JRubyAdapter.
|
54
|
+
} else if (JRubyAdapter.isRubyOneNine()) {
|
53
55
|
JRubyAdapter.runScriptlet("Java::" + component.getClass().getName() + ".__persistent__ = true");
|
54
56
|
rubyClass = JRubyAdapter.runRubyMethod(component, "singleton_class");
|
55
57
|
} else {
|
56
|
-
throw new RuntimeException("Unknown
|
58
|
+
throw new RuntimeException("Unknown Ruby version: " + JRubyAdapter.get("RUBY_VERSION"));
|
57
59
|
}
|
58
60
|
// EMXIF
|
59
61
|
|
60
62
|
}
|
61
63
|
}
|
62
64
|
if (rubyClass == null || !hasBackingJavaClass) {
|
63
|
-
|
65
|
+
Log.d("Loading script: " + component.getScriptInfo().getScriptName());
|
64
66
|
if (scriptContainsClass) {
|
65
|
-
|
67
|
+
Log.d("Script contains class definition");
|
66
68
|
if (rubyClass == null && hasBackingJavaClass) {
|
67
|
-
|
68
|
-
|
69
|
-
// FIXME(uwe): Simplify when we stop support for JRuby < 1.7.0
|
70
|
-
if (!JRubyAdapter.isJRubyPreOneSeven()) {
|
71
|
-
JRubyAdapter.runScriptlet("Java::" + component.getClass().getName() + ".__persistent__ = true");
|
72
|
-
}
|
73
|
-
// EMXIF
|
74
|
-
|
69
|
+
Log.d("Script has separate Java class");
|
70
|
+
JRubyAdapter.runScriptlet("Java::" + component.getClass().getName() + ".__persistent__ = true");
|
75
71
|
rubyClass = JRubyAdapter.runScriptlet("Java::" + component.getClass().getName());
|
76
72
|
}
|
77
|
-
|
73
|
+
Log.d("Set class: " + rubyClass);
|
78
74
|
JRubyAdapter.put(component.getScriptInfo().getRubyClassName(), rubyClass);
|
79
75
|
// FIXME(uwe): Collect these threads in a ThreadGroup ?
|
80
76
|
Thread t = new Thread(null, new Runnable(){
|
@@ -82,7 +78,7 @@ public class ScriptLoader {
|
|
82
78
|
long loadStart = System.currentTimeMillis();
|
83
79
|
JRubyAdapter.setScriptFilename(rubyScript.getAbsolutePath());
|
84
80
|
JRubyAdapter.runScriptlet(script);
|
85
|
-
|
81
|
+
Log.d("Script load took " + (System.currentTimeMillis() - loadStart) + "ms");
|
86
82
|
}
|
87
83
|
}, "ScriptLoader for " + rubyClass, 128 * 1024);
|
88
84
|
try {
|
@@ -101,18 +97,14 @@ public class ScriptLoader {
|
|
101
97
|
}
|
102
98
|
} else if (rubyClass != null) {
|
103
99
|
// We have a predefined Ruby class without corresponding Ruby source file.
|
104
|
-
|
100
|
+
Log.d("Create separate Ruby instance for class: " + rubyClass);
|
105
101
|
rubyInstance = JRubyAdapter.runRubyMethod(rubyClass, "new");
|
106
102
|
JRubyAdapter.runRubyMethod(rubyInstance, "instance_variable_set", "@ruboto_java_instance", component);
|
107
103
|
} else {
|
108
104
|
// Neither script file nor predefined class
|
105
|
+
Log.e("Missing script and class. Either script or predefined class must be present.");
|
109
106
|
throw new RuntimeException("Either script or predefined class must be present.");
|
110
107
|
}
|
111
|
-
if (rubyClass != null) {
|
112
|
-
if (component instanceof android.content.Context) {
|
113
|
-
callOnCreate(rubyInstance, args, component.getScriptInfo().getRubyClassName());
|
114
|
-
}
|
115
|
-
}
|
116
108
|
component.getScriptInfo().setRubyInstance(rubyInstance);
|
117
109
|
}
|
118
110
|
} catch(IOException e){
|
@@ -123,27 +115,17 @@ public class ScriptLoader {
|
|
123
115
|
}
|
124
116
|
}
|
125
117
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
if (JRubyAdapter.isJRubyPreOneSeven()) {
|
130
|
-
if (args.length > 0) {
|
131
|
-
JRubyAdapter.put("$bundle", args[0]);
|
132
|
-
}
|
133
|
-
JRubyAdapter.put("$ruby_instance", rubyInstance);
|
134
|
-
JRubyAdapter.runScriptlet("$ruby_instance.on_create(" + (args.length > 0 ? "$bundle" : "") + ")");
|
135
|
-
} else if (JRubyAdapter.isJRubyOneSeven()) {
|
118
|
+
public static final void callOnCreate(final RubotoComponent component, Object... args) {
|
119
|
+
if (component instanceof android.content.Context) {
|
120
|
+
Log.d("Call onCreate on: " + component.getScriptInfo().getRubyInstance());
|
136
121
|
// FIXME(uwe): Simplify when we stop support for snake case aliasing interface callback methods.
|
137
|
-
if ((Boolean)JRubyAdapter.runScriptlet(
|
138
|
-
JRubyAdapter.runRubyMethod(
|
139
|
-
} else if ((Boolean)JRubyAdapter.runScriptlet(
|
140
|
-
JRubyAdapter.runRubyMethod(
|
122
|
+
if ((Boolean)JRubyAdapter.runScriptlet(component.getScriptInfo().getRubyClassName() + ".instance_methods(false).any?{|m| m.to_sym == :onCreate}")) {
|
123
|
+
JRubyAdapter.runRubyMethod(component.getScriptInfo().getRubyInstance(), "onCreate", args);
|
124
|
+
} else if ((Boolean)JRubyAdapter.runScriptlet(component.getScriptInfo().getRubyClassName() + ".instance_methods(false).any?{|m| m.to_sym == :on_create}")) {
|
125
|
+
JRubyAdapter.runRubyMethod(component.getScriptInfo().getRubyInstance(), "on_create", args);
|
141
126
|
}
|
142
127
|
// EMXIF
|
143
|
-
} else {
|
144
|
-
throw new RuntimeException("Unknown JRuby version: " + JRubyAdapter.get("JRUBY_VERSION"));
|
145
128
|
}
|
146
|
-
// EMXIF
|
147
129
|
}
|
148
130
|
|
149
131
|
}
|
@@ -47,9 +47,7 @@ public class InstrumentationTestRunner extends android.test.InstrumentationTestR
|
|
47
47
|
Thread t = new Thread(null, new Runnable() {
|
48
48
|
public void run() {
|
49
49
|
JRubyLoadedOk.set(JRubyAdapter.setUpJRuby(getTargetContext()));
|
50
|
-
|
51
|
-
JRubyAdapter.runScriptlet("Java::OrgRubotoTest::InstrumentationTestRunner.__persistent__ = true");
|
52
|
-
}
|
50
|
+
JRubyAdapter.runScriptlet("Java::OrgRubotoTest::InstrumentationTestRunner.__persistent__ = true");
|
53
51
|
}
|
54
52
|
}, "Setup JRuby from instrumentation test runner", 64 * 1024);
|
55
53
|
try {
|
@@ -132,14 +130,7 @@ public class InstrumentationTestRunner extends android.test.InstrumentationTestR
|
|
132
130
|
}
|
133
131
|
|
134
132
|
public void test(String name, Map options, Object block) {
|
135
|
-
// FIXME(uwe): Remove when we stop supporting Android 2.2
|
136
|
-
if (android.os.Build.VERSION.SDK_INT <= 8) {
|
137
|
-
name ="runTest";
|
138
|
-
}
|
139
|
-
// FIXME end
|
140
|
-
|
141
133
|
boolean runOnUiThread = options == null || options.get("ui") == "true";
|
142
|
-
|
143
134
|
Test test = new ActivityTest(activityClass, JRubyAdapter.getScriptFilename(), setup, teardown, name, runOnUiThread, block);
|
144
135
|
suite.addTest(test);
|
145
136
|
Log.d(getClass().getName(), "Made test instance: " + test);
|
@@ -174,18 +165,10 @@ public class InstrumentationTestRunner extends android.test.InstrumentationTestR
|
|
174
165
|
buffer.close();
|
175
166
|
JRubyAdapter.setScriptFilename(f);
|
176
167
|
|
177
|
-
|
178
|
-
|
179
|
-
JRubyAdapter.put("$test", this);
|
180
|
-
JRubyAdapter.put("$script_code", source.toString());
|
181
|
-
JRubyAdapter.put("$filename", f);
|
182
|
-
JRubyAdapter.runScriptlet("$test.instance_eval($script_code, $filename)");
|
168
|
+
if (f.equals("test_helper.rb")) {
|
169
|
+
JRubyAdapter.runScriptlet(source.toString());
|
183
170
|
} else {
|
184
|
-
|
185
|
-
JRubyAdapter.runScriptlet(source.toString());
|
186
|
-
} else {
|
187
|
-
JRubyAdapter.runRubyMethod(this, "instance_eval", source.toString(), f);
|
188
|
-
}
|
171
|
+
JRubyAdapter.runRubyMethod(this, "instance_eval", source.toString(), f);
|
189
172
|
}
|
190
173
|
Log.d(getClass().getName(), "Test script " + f + " loaded");
|
191
174
|
}
|
data/bin/ruboto
CHANGED
data/lib/ruboto/commands/base.rb
CHANGED
@@ -8,7 +8,6 @@ require 'ruboto/util/log_action'
|
|
8
8
|
require 'ruboto/util/xml_element'
|
9
9
|
require 'ruboto/util/code_formatting'
|
10
10
|
require 'ruboto/util/build'
|
11
|
-
require 'ruboto/util/update'
|
12
11
|
require 'ruboto/util/verify'
|
13
12
|
require 'ruboto/util/scan_in_api'
|
14
13
|
require 'ruboto/core_ext/array'
|
@@ -20,35 +19,37 @@ module Ruboto
|
|
20
19
|
include Ruboto::SdkVersions
|
21
20
|
|
22
21
|
def self.main
|
23
|
-
Main
|
22
|
+
Main do
|
24
23
|
mode 'gen' do
|
24
|
+
require 'ruboto/util/update'
|
25
|
+
|
25
26
|
mode 'app' do
|
26
27
|
include Ruboto::Util::LogAction
|
27
28
|
include Ruboto::Util::Build
|
28
29
|
include Ruboto::Util::Update
|
29
30
|
include Ruboto::Util::Verify
|
30
31
|
|
31
|
-
option('package'){
|
32
|
+
option('package') {
|
32
33
|
required
|
33
34
|
argument :required
|
34
35
|
description 'Name of package. Must be unique for every app. A common pattern is yourtld.yourdomain.appname (Ex. org.ruboto.irb)'
|
35
36
|
}
|
36
|
-
option('name'){
|
37
|
+
option('name') {
|
37
38
|
argument :required
|
38
39
|
description 'Name of your app. Defaults to the last part of the package name capitalized.'
|
39
40
|
}
|
40
|
-
option('activity'){
|
41
|
+
option('activity') {
|
41
42
|
argument :required
|
42
43
|
description 'Name of your primary Activity. Defaults to the name of the application with Activity appended.'
|
43
44
|
}
|
44
|
-
option('path'){
|
45
|
+
option('path') {
|
45
46
|
argument :required
|
46
47
|
description 'Path to where you want your app. Defaults to the last part of the package name.'
|
47
48
|
}
|
48
49
|
option('target') {
|
49
50
|
argument :required
|
50
51
|
defaults DEFAULT_TARGET_SDK
|
51
|
-
description "Android version to target. Must begin with 'android-' (e.g., 'android-
|
52
|
+
description "Android version to target. Must begin with 'android-' (e.g., 'android-10' for gingerbread)"
|
52
53
|
}
|
53
54
|
option('min-sdk') {
|
54
55
|
argument :required
|
@@ -65,7 +66,7 @@ module Ruboto
|
|
65
66
|
|
66
67
|
def run
|
67
68
|
package = params['package'].value
|
68
|
-
name = params['name'].value || package.split('.').last.split('_').map{|s| s.capitalize}.join
|
69
|
+
name = params['name'].value || package.split('.').last.split('_').map { |s| s.capitalize }.join
|
69
70
|
name[0..0] = name[0..0].upcase
|
70
71
|
activity = params['activity'].value || "#{name}Activity"
|
71
72
|
path = params['path'].value || package.split('.').last
|
@@ -91,8 +92,8 @@ module Ruboto
|
|
91
92
|
puts "Removed file #{"src/#{package.gsub '.', '/'}/#{activity}"}.java"
|
92
93
|
FileUtils.rm_f 'res/layout/main.xml'
|
93
94
|
puts 'Removed file res/layout/main.xml'
|
94
|
-
verify_strings.root.elements['string'].text = name.gsub(/([A-Z]+)([A-Z][a-z])/,'\1 \2').gsub(/([a-z\d])([A-Z])/,'\1 \2')
|
95
|
-
File.open('res/values/strings.xml', 'w') {|f| verify_strings.document.write(f, 4)}
|
95
|
+
verify_strings.root.elements['string'].text = name.gsub(/([A-Z]+)([A-Z][a-z])/, '\1 \2').gsub(/([a-z\d])([A-Z])/, '\1 \2')
|
96
|
+
File.open('res/values/strings.xml', 'w') { |f| verify_strings.document.write(f, 4) }
|
96
97
|
end
|
97
98
|
puts 'Done'
|
98
99
|
|
@@ -131,19 +132,19 @@ module Ruboto
|
|
131
132
|
include Ruboto::Util::Build
|
132
133
|
include Ruboto::Util::Verify
|
133
134
|
|
134
|
-
argument('class'){
|
135
|
+
argument('class') {
|
135
136
|
required
|
136
|
-
alternatives = Dir[File.join(Ruboto::ASSETS, 'src/Inheriting*.java')].map{|f| File.basename(f)[10..-6]} - %w(Class)
|
137
|
-
description "the Android Class that you want: #{alternatives[0..-2].map{|c| "#{c}, "}}or #{alternatives[-1]}"
|
138
|
-
validate {|v| alternatives.include? v}
|
137
|
+
alternatives = Dir[File.join(Ruboto::ASSETS, 'src/Inheriting*.java')].map { |f| File.basename(f)[10..-6] } - %w(Class)
|
138
|
+
description "the Android Class that you want: #{alternatives[0..-2].map { |c| "#{c}, " }}or #{alternatives[-1]}"
|
139
|
+
validate { |v| alternatives.include? v }
|
139
140
|
}
|
140
141
|
|
141
|
-
option('script_name'){
|
142
|
+
option('script_name') {
|
142
143
|
argument :required
|
143
144
|
description 'name of the ruby script that this class will execute. Should end in .rb. Optional.'
|
144
145
|
}
|
145
146
|
|
146
|
-
option('name'){
|
147
|
+
option('name') {
|
147
148
|
required
|
148
149
|
argument :required
|
149
150
|
description 'name of the class (and file). Should be CamelCase'
|
@@ -174,83 +175,83 @@ module Ruboto
|
|
174
175
|
mode 'subclass' do
|
175
176
|
include Ruboto::Util::Build
|
176
177
|
|
177
|
-
argument('class'){
|
178
|
+
argument('class') {
|
178
179
|
required
|
179
180
|
description 'the Android Class that you want to subclass (e.g., package.Class).'
|
180
181
|
}
|
181
182
|
|
182
|
-
option('name'){
|
183
|
+
option('name') {
|
183
184
|
required
|
184
185
|
argument :required
|
185
186
|
description 'name of the class (and file). Should be CamelCase'
|
186
187
|
}
|
187
188
|
|
188
|
-
option('package'){
|
189
|
+
option('package') {
|
189
190
|
argument :required
|
190
191
|
description 'package for the new class (if not specified, uses project package)'
|
191
192
|
}
|
192
193
|
|
193
|
-
option('method_base'){
|
194
|
+
option('method_base') {
|
194
195
|
required
|
195
|
-
validate {|i| %w(all on none abstract).include?(i)}
|
196
|
+
validate { |i| %w(all on none abstract).include?(i) }
|
196
197
|
argument :required
|
197
198
|
description 'the base set of methods to generate (adjusted with method_include and method_exclude): all, none, abstract, on (e.g., onClick)'
|
198
199
|
}
|
199
200
|
|
200
|
-
option('method_include'){
|
201
|
+
option('method_include') {
|
201
202
|
argument :required
|
202
203
|
defaults ''
|
203
204
|
description 'additional methods to add to the base list'
|
204
205
|
}
|
205
206
|
|
206
|
-
option('method_exclude'){
|
207
|
+
option('method_exclude') {
|
207
208
|
argument :required
|
208
209
|
defaults ''
|
209
210
|
description 'methods to remove from the base list'
|
210
211
|
}
|
211
212
|
|
212
|
-
option('implements'){
|
213
|
+
option('implements') {
|
213
214
|
required
|
214
215
|
argument :required
|
215
216
|
defaults ''
|
216
217
|
description 'comma separated list interfaces to implement'
|
217
218
|
}
|
218
219
|
|
219
|
-
option('force'){
|
220
|
+
option('force') {
|
220
221
|
argument :required
|
221
|
-
validate {|i| %w(include exclude).include?(i)}
|
222
|
+
validate { |i| %w(include exclude).include?(i) }
|
222
223
|
description "force handling of added and deprecated methods (values: 'include' or 'exclude') unless individually included or excluded"
|
223
224
|
}
|
224
225
|
|
225
226
|
def run
|
226
227
|
generate_inheriting_file 'Class', params['name'].value
|
227
228
|
generate_subclass_or_interface(
|
228
|
-
|
229
|
+
%w(class name package method_base method_include method_exclude implements force).inject({}) { |h, i| h[i.to_sym] = params[i].value; h })
|
229
230
|
end
|
230
231
|
end
|
231
232
|
|
232
233
|
mode 'interface' do
|
233
234
|
include Ruboto::Util::Build
|
234
235
|
|
235
|
-
argument('interface'){
|
236
|
+
argument('interface') {
|
236
237
|
required
|
237
238
|
description 'the Android Interface that you want to implement (e.g., package.Interface).'
|
238
239
|
}
|
239
240
|
|
240
|
-
option('name'){
|
241
|
+
option('name') {
|
241
242
|
required
|
242
243
|
argument :required
|
243
244
|
description 'name of the class (and file) that will implement the interface. Should be CamelCase'
|
244
245
|
}
|
245
246
|
|
246
|
-
option('package'){
|
247
|
+
option('package') {
|
247
248
|
argument :required
|
248
249
|
description 'package for the new class (if not specified, uses project package)'
|
249
250
|
}
|
250
251
|
|
251
|
-
option('force'){
|
252
|
+
option('force') {
|
252
253
|
argument :required
|
253
|
-
validate {|i| %w(include exclude).include?(i)}
|
254
|
+
validate { |i| %w(include exclude).include?(i) }
|
254
255
|
description "force added and deprecated interfaces (values: 'include' or 'exclude')"
|
255
256
|
}
|
256
257
|
|
@@ -258,63 +259,63 @@ module Ruboto
|
|
258
259
|
# FIXME(uwe): DEPRECATED! Remove before Ruboto version 1.0.0.
|
259
260
|
puts "\nThe use of \"ruboto gen interface\" has been deprecated. Please use\n\n ruboto gen subclass\n\ninstead.\n\n"
|
260
261
|
generate_inheriting_file 'Class', params['name'].value
|
261
|
-
generate_subclass_or_interface %w(interface name package force).inject({}) {|h, i| h[i.to_sym] = params[i].value; h}
|
262
|
+
generate_subclass_or_interface %w(interface name package force).inject({}) { |h, i| h[i.to_sym] = params[i].value; h }
|
262
263
|
end
|
263
264
|
end
|
264
265
|
|
265
266
|
mode 'core' do
|
266
267
|
include Ruboto::Util::Build
|
267
268
|
|
268
|
-
argument('class'){
|
269
|
+
argument('class') {
|
269
270
|
required
|
270
|
-
validate {|i| %w(Activity Service BroadcastReceiver View PreferenceActivity TabActivity OnClickListener OnItemClickListener OnItemSelectedListener all).include?(i)}
|
271
|
+
validate { |i| %w(Activity Service BroadcastReceiver View PreferenceActivity TabActivity OnClickListener OnItemClickListener OnItemSelectedListener all).include?(i) }
|
271
272
|
description "Activity, Service, BroadcastReceiver, View, OnClickListener, OnItemClickListener, OnItemSelectedListener, or all (default = all); Other activities not included in 'all': PreferenceActivity, TabActivity"
|
272
273
|
}
|
273
274
|
|
274
|
-
option('method_base'){
|
275
|
+
option('method_base') {
|
275
276
|
required
|
276
277
|
argument :required
|
277
|
-
validate {|i| %w(all on none).include?(i)}
|
278
|
+
validate { |i| %w(all on none).include?(i) }
|
278
279
|
defaults 'on'
|
279
280
|
description 'the base set of methods to generate (adjusted with method_include and method_exclude): all, none, on (e.g., onClick)'
|
280
281
|
}
|
281
282
|
|
282
|
-
option('method_include'){
|
283
|
+
option('method_include') {
|
283
284
|
required
|
284
285
|
argument :required
|
285
286
|
defaults ''
|
286
287
|
description 'additional methods to add to the base list'
|
287
288
|
}
|
288
289
|
|
289
|
-
option('method_exclude'){
|
290
|
+
option('method_exclude') {
|
290
291
|
required
|
291
292
|
argument :required
|
292
293
|
defaults ''
|
293
294
|
description 'methods to remove from the base list'
|
294
295
|
}
|
295
296
|
|
296
|
-
option('implements'){
|
297
|
+
option('implements') {
|
297
298
|
required
|
298
299
|
argument :required
|
299
300
|
defaults ''
|
300
301
|
description "for classes only, interfaces to implement (cannot be used with 'gen core all')"
|
301
302
|
}
|
302
303
|
|
303
|
-
option('force'){
|
304
|
+
option('force') {
|
304
305
|
argument :required
|
305
|
-
validate {|i| %w(include exclude).include?(i)}
|
306
|
+
validate { |i| %w(include exclude).include?(i) }
|
306
307
|
description "force handling of added and deprecated methods (values: 'include' or 'exclude') unless individually included or excluded"
|
307
308
|
}
|
308
309
|
|
309
310
|
def run
|
310
|
-
abort("specify 'implements' only for Activity, Service, BroadcastReceiver, PreferenceActivity, or TabActivity") unless
|
311
|
-
|
312
|
-
generate_core_classes [:class, :method_base, :method_include, :method_exclude, :implements, :force].inject({}) {|h, i| h[i] = params[i.to_s].value; h}
|
311
|
+
abort("specify 'implements' only for Activity, Service, BroadcastReceiver, PreferenceActivity, or TabActivity") unless %w(Activity Service BroadcastReceiver PreferenceActivity TabActivity).include?(params['class'].value) or params['implements'].value == ''
|
312
|
+
generate_core_classes [:class, :method_base, :method_include, :method_exclude, :implements, :force].inject({}) { |h, i| h[i] = params[i.to_s].value; h }
|
313
313
|
end
|
314
314
|
end
|
315
315
|
end
|
316
316
|
|
317
317
|
mode 'update' do
|
318
|
+
require 'ruboto/util/update'
|
318
319
|
include Ruboto::Util::LogAction
|
319
320
|
include Ruboto::Util::Update
|
320
321
|
include Ruboto::Util::Verify
|
@@ -322,7 +323,7 @@ module Ruboto
|
|
322
323
|
argument('what') {
|
323
324
|
required
|
324
325
|
# FIXME(uwe): Deprecated "ruboto update ruboto" in Ruboto 0.8.1. Remove september 2013.
|
325
|
-
validate {|i| %w(jruby app ruboto).include?(i)}
|
326
|
+
validate { |i| %w(jruby app ruboto).include?(i) }
|
326
327
|
description "What do you want to update: 'app', 'jruby', or 'ruboto'"
|
327
328
|
}
|
328
329
|
|
@@ -357,7 +358,7 @@ module Ruboto
|
|
357
358
|
update_bundle
|
358
359
|
when 'jruby' then
|
359
360
|
update_jruby(params['force'].value, true) || abort
|
360
|
-
|
361
|
+
# FIXME(uwe): Deprecated in Ruboto 0.8.1. Remove september 2013.
|
361
362
|
when 'ruboto' then
|
362
363
|
puts "\nThe 'ruboto update ruboto' command has been deprecated. Use\n\n ruboto update app\n\ninstead.\n\n"
|
363
364
|
update_ruboto(params['force'].value) || abort
|
@@ -365,6 +366,15 @@ module Ruboto
|
|
365
366
|
end
|
366
367
|
end
|
367
368
|
|
369
|
+
mode 'setup' do
|
370
|
+
require 'ruboto/util/setup'
|
371
|
+
include Ruboto::Util::Setup
|
372
|
+
|
373
|
+
def run
|
374
|
+
setup_ruboto
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
368
378
|
option 'version' do
|
369
379
|
description 'display ruboto version'
|
370
380
|
end
|
@@ -391,7 +401,7 @@ module Ruboto
|
|
391
401
|
}
|
392
402
|
end
|
393
403
|
end
|
394
|
-
|
404
|
+
end
|
395
405
|
end
|
396
406
|
end
|
397
407
|
end
|