ruboto-core 0.0.3 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -1
- data/Gemfile.lock +1 -1
- data/README.md +42 -3
- data/Rakefile +5 -0
- data/assets/Rakefile +72 -7
- data/assets/assets/scripts/ruboto.rb +124 -71
- data/assets/res/drawable-hdpi/icon.png +0 -0
- data/assets/res/drawable-ldpi/icon.png +0 -0
- data/assets/res/drawable-mdpi/icon.png +0 -0
- data/assets/samples/sample_activity.rb +3 -3
- data/assets/samples/sample_activity_test.rb +21 -0
- data/assets/samples/sample_broadcast_receiver.rb +1 -1
- data/assets/samples/sample_broadcast_receiver_test.rb +1 -0
- data/assets/samples/sample_service.rb +2 -1
- data/assets/samples/sample_service_test.rb +1 -0
- data/assets/src/InheritingActivity.java +6 -4
- data/assets/src/RubotoActivity.java +17 -5
- data/assets/src/org/ruboto/Script.java +30 -17
- data/assets/src/org/ruboto/test/ActivityTest.java +58 -0
- data/assets/src/org/ruboto/test/InstrumentationTestRunner.java +102 -0
- data/assets/test/assets/scripts/test_helper.rb +9 -0
- data/bin/ruboto +3 -920
- data/lib/java_class_gen/android_api.xml +1 -1
- data/lib/ruboto.rb +15 -0
- data/lib/ruboto/api.rb +21 -0
- data/lib/ruboto/commands/base.rb +373 -0
- data/lib/ruboto/core_ext/array.rb +6 -0
- data/lib/ruboto/core_ext/object.rb +10 -0
- data/lib/ruboto/util/asset_copier.rb +20 -0
- data/lib/ruboto/util/build.rb +183 -0
- data/lib/ruboto/util/code_formatting.rb +22 -0
- data/lib/ruboto/util/log_action.rb +20 -0
- data/lib/ruboto/util/main_fix.rb +13 -0
- data/lib/ruboto/util/objectspace.rb +8 -0
- data/lib/ruboto/util/scan_in_api.rb +40 -0
- data/lib/ruboto/util/update.rb +102 -0
- data/lib/ruboto/util/verify.rb +59 -0
- data/lib/ruboto/util/xml_element.rb +197 -0
- data/test/app_test.rb +44 -0
- data/test/test_helper.rb +4 -0
- metadata +41 -14
@@ -0,0 +1,197 @@
|
|
1
|
+
require 'ruboto/util/code_formatting'
|
2
|
+
require 'ruboto/util/verify'
|
3
|
+
require 'ruboto/api'
|
4
|
+
|
5
|
+
module Ruboto
|
6
|
+
module Util
|
7
|
+
###########################################################################
|
8
|
+
#
|
9
|
+
# XMLElement:
|
10
|
+
# Extends Hash to simulate a REXML::Element (but much faster) and provides
|
11
|
+
# information in the necessary format to generate Java code.
|
12
|
+
#
|
13
|
+
class XMLElement < Hash
|
14
|
+
include Ruboto::Util::CodeFormatting
|
15
|
+
include Ruboto::Util::Verify
|
16
|
+
|
17
|
+
def root
|
18
|
+
Ruboto::API.api
|
19
|
+
end
|
20
|
+
|
21
|
+
def name
|
22
|
+
self["name"]
|
23
|
+
end
|
24
|
+
|
25
|
+
def attribute(name)
|
26
|
+
self["values"][name]
|
27
|
+
end
|
28
|
+
|
29
|
+
def add_element(name, attributes)
|
30
|
+
new_element = XMLElement.new
|
31
|
+
new_element["name"] = name
|
32
|
+
new_element["values"] = attributes
|
33
|
+
|
34
|
+
self[name] = [] unless self[name]
|
35
|
+
self[name] << new_element
|
36
|
+
|
37
|
+
new_element
|
38
|
+
end
|
39
|
+
|
40
|
+
def get_elements(name)
|
41
|
+
self[name] or []
|
42
|
+
end
|
43
|
+
|
44
|
+
def find_class_or_interface(klass, a_type)
|
45
|
+
abort "ERROR: Can't parse package from #{klass}" unless klass.match(/([a-z.]+)\.([A-Z][A-Za-z.]+)/)
|
46
|
+
|
47
|
+
package = self["package"].find{|i| i.attribute("name") == $1}
|
48
|
+
abort "ERROR: Can't find package #{$1}" unless package
|
49
|
+
if a_type == "either"
|
50
|
+
package["class"].find{|i| i.attribute("name") == $2} or package["interface"].find{|i| i.attribute("name") == $2}
|
51
|
+
else
|
52
|
+
package[a_type].find{|i| i.attribute("name") == $2}
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def find_class(package_and_class)
|
57
|
+
find_class_or_interface(package_and_class, "class")
|
58
|
+
end
|
59
|
+
|
60
|
+
def find_interface(package_and_interface)
|
61
|
+
find_class_or_interface(package_and_interface, "interface")
|
62
|
+
end
|
63
|
+
|
64
|
+
def all_methods(method_base="all", method_include="", method_exclude="", implements="")
|
65
|
+
# get all the methogs
|
66
|
+
all_methods = get_elements("method")
|
67
|
+
|
68
|
+
# establish the base set of methods
|
69
|
+
working_methods = case method_base
|
70
|
+
when "all" then
|
71
|
+
all_methods
|
72
|
+
when "none" then
|
73
|
+
[]
|
74
|
+
when "abstract" then
|
75
|
+
all_methods.select{|i| i.attribute("abstract") == "true"}
|
76
|
+
when "on" then
|
77
|
+
all_methods.select{|i| i.attribute("name").match(/^on[A-Z]/)}
|
78
|
+
end
|
79
|
+
|
80
|
+
# make sure to include requested methods
|
81
|
+
include_methods = method_include.split(",") if method_include.is_a?(String)
|
82
|
+
all_methods.each{|i| working_methods << i if include_methods.include?(i.attribute("name"))}
|
83
|
+
|
84
|
+
# make sure to exclude rejected methods
|
85
|
+
exclude_methods = method_exclude.split(",") if method_exclude.is_a?(String)
|
86
|
+
working_methods = working_methods.select{|i| not exclude_methods.include?(i.attribute("name"))}
|
87
|
+
|
88
|
+
# remove methods marked final
|
89
|
+
working_methods = working_methods.select{|i| (not i.attribute("final")) or i.attribute("final") == "false"}
|
90
|
+
|
91
|
+
# get additional methods from parent
|
92
|
+
if name =="class" and attribute("extends")
|
93
|
+
parent = root.find_class(attribute("extends"))
|
94
|
+
parent_methods = parent.all_methods(method_base, method_include, method_exclude)
|
95
|
+
working_signatures = working_methods.map(&:method_signature)
|
96
|
+
working_methods += parent_methods.select{|i| not working_signatures.include?(i.method_signature)}
|
97
|
+
end
|
98
|
+
|
99
|
+
# get additional methods from interfaces
|
100
|
+
if name =="class" and implements != ""
|
101
|
+
implements.split(",").each do |i|
|
102
|
+
interface = root.find_interface(i)
|
103
|
+
abort("Unkown interface: #{i}") unless interface
|
104
|
+
working_signatures = working_methods.map(&:method_signature)
|
105
|
+
working_methods += interface.all_methods.select{|j| not working_signatures.include?(j.method_signature)}
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
working_methods
|
110
|
+
end
|
111
|
+
|
112
|
+
def parameters
|
113
|
+
get_elements("parameter").map {|p| [p.attribute("name"), p.attribute("type").gsub("<", "<").gsub(">", ">")]}
|
114
|
+
end
|
115
|
+
|
116
|
+
def method_signature
|
117
|
+
"#{attribute("name")}(#{parameters.map{|i| i[1]}.join(',')})"
|
118
|
+
end
|
119
|
+
|
120
|
+
def constant_string
|
121
|
+
"CB_" + attribute("name").gsub(/[A-Z]/) {|i| "_#{i}"}.upcase.gsub(/^ON_/, "")
|
122
|
+
end
|
123
|
+
|
124
|
+
def super_string
|
125
|
+
if attribute("api_added") and
|
126
|
+
attribute("api_added").to_i > verify_min_sdk.to_i and
|
127
|
+
attribute("api_added").to_i <= verify_target_sdk.to_i
|
128
|
+
nil
|
129
|
+
elsif attribute("abstract") == "true"
|
130
|
+
nil
|
131
|
+
elsif name == "method"
|
132
|
+
"super.#{attribute("name")}(#{parameters.map{|i| i[0]}.join(", ")});"
|
133
|
+
elsif name == "constructor"
|
134
|
+
"super(#{parameters.map{|i| i[0]}.join(", ")});"
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def default_return
|
139
|
+
return nil unless attribute("return")
|
140
|
+
case attribute("return")
|
141
|
+
when "boolean" then "return false;"
|
142
|
+
when "int" then "return 0;"
|
143
|
+
when "void" then nil
|
144
|
+
else "return null;"
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def super_return
|
149
|
+
rv = super_string
|
150
|
+
return rv unless attribute("return")
|
151
|
+
rv ? "return #{rv}" : default_return
|
152
|
+
end
|
153
|
+
|
154
|
+
def ruby_call
|
155
|
+
rv = []
|
156
|
+
|
157
|
+
params = parameters
|
158
|
+
args = ""
|
159
|
+
if params.size > 3
|
160
|
+
args = ", args"
|
161
|
+
rv << "IRubyObject[] args = {" + params.map{|i| "JavaUtil.convertJavaToRuby(getRuby(), #{i[0]})"}.join(", ") + "};"
|
162
|
+
elsif params.size > 0
|
163
|
+
args = ", " + params.map{|i| "JavaUtil.convertJavaToRuby(getRuby(), #{i[0]})"}.join(", ")
|
164
|
+
end
|
165
|
+
|
166
|
+
return_cast = ""
|
167
|
+
if attribute("return") and (attribute("return").include?(".") or attribute("return") == "int[]")
|
168
|
+
return_cast = "return (#{attribute("return")})"
|
169
|
+
elsif attribute("return") and attribute("return") == "int"
|
170
|
+
return_cast = "return (Integer)"
|
171
|
+
elsif attribute("return") and attribute("return") != "void"
|
172
|
+
return_cast = "return (#{attribute("return").capitalize})"
|
173
|
+
end
|
174
|
+
return_cast = return_cast.gsub("<", "<").gsub(">", ">")
|
175
|
+
|
176
|
+
convert_return = ""
|
177
|
+
if attribute("return") and attribute("return") != "void"
|
178
|
+
convert_return = ".toJava(#{attribute("return")}.class)"
|
179
|
+
end
|
180
|
+
|
181
|
+
rv << "#{return_cast}RuntimeHelpers.invoke(getRuby().getCurrentContext(), callbackProcs[#{constant_string}], \"call\" #{args})#{convert_return};"
|
182
|
+
rv
|
183
|
+
end
|
184
|
+
|
185
|
+
def method_definition
|
186
|
+
method_call((attribute("return") ? attribute("return") : "void"), attribute("name"), parameters,
|
187
|
+
if_else("callbackProcs[#{constant_string}] != null",
|
188
|
+
[super_string] + try_catch(ruby_call, ["re.printStackTrace();", default_return]),
|
189
|
+
[super_return])).indent.join("\n")
|
190
|
+
end
|
191
|
+
|
192
|
+
def constructor_definition(class_name)
|
193
|
+
method_call("", class_name, parameters, [super_string]).indent.join("\n")
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
data/test/app_test.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.expand_path("test_helper", File.dirname(__FILE__))
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
class AppTest < Test::Unit::TestCase
|
5
|
+
PACKAGE ='org.ruboto.sample_app'
|
6
|
+
APP_NAME = 'RubotoSampleApp'
|
7
|
+
TMP_DIR = File.join PROJECT_DIR, 'tmp'
|
8
|
+
APP_DIR = File.join PROJECT_DIR, 'tmp', APP_NAME
|
9
|
+
|
10
|
+
def setup
|
11
|
+
Dir.mkdir TMP_DIR unless File.exists? TMP_DIR
|
12
|
+
FileUtils.rm_rf APP_DIR if File.exists? APP_DIR
|
13
|
+
system "jruby -rubygems -I #{PROJECT_DIR}/lib #{PROJECT_DIR}/bin/ruboto gen app --package #{PACKAGE} --path #{APP_DIR} --name #{APP_NAME} --target android-8 --min_sdk android-8 --activity #{APP_NAME}Activity"
|
14
|
+
raise "gen app failed with return code #$?" unless $? == 0
|
15
|
+
end
|
16
|
+
|
17
|
+
def teardown
|
18
|
+
# FileUtils.rm_rf APP_DIR if File.exists? APP_DIR
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_that_tests_work_on_new_project
|
22
|
+
run_app_tests
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_that_yaml_loads
|
26
|
+
filename = "#{APP_DIR}/assets/scripts/ruboto_sample_app_activity.rb"
|
27
|
+
s = File.read(filename)
|
28
|
+
s.gsub!(/(require 'ruboto.rb')/, "\\1\nrequire 'yaml'")
|
29
|
+
File.open(filename, 'w'){|f| f << s}
|
30
|
+
run_app_tests
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def run_app_tests
|
36
|
+
Dir.chdir "#{APP_DIR}/test" do
|
37
|
+
system "adb uninstall #{PACKAGE}"
|
38
|
+
system 'ant run-tests'
|
39
|
+
raise "tests failed with return code #$?" unless $? == 0
|
40
|
+
system "adb uninstall #{PACKAGE}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
CHANGED
@@ -1,23 +1,24 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruboto-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 0.0.3
|
10
|
+
version: 0.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Daniel Jackoway
|
14
14
|
- Charles Nutter
|
15
15
|
- Scott Moyer
|
16
|
+
- Uwe Kubosch
|
16
17
|
autorequire:
|
17
18
|
bindir: bin
|
18
19
|
cert_chain: []
|
19
20
|
|
20
|
-
date:
|
21
|
+
date: 2011-03-24 00:00:00 -07:00
|
21
22
|
default_executable: ruboto
|
22
23
|
dependencies:
|
23
24
|
- !ruby/object:Gem::Dependency
|
@@ -42,7 +43,7 @@ dependencies:
|
|
42
43
|
requirement: &id002 !ruby/object:Gem::Requirement
|
43
44
|
none: false
|
44
45
|
requirements:
|
45
|
-
- -
|
46
|
+
- - ">"
|
46
47
|
- !ruby/object:Gem::Version
|
47
48
|
hash: 3
|
48
49
|
segments:
|
@@ -62,27 +63,53 @@ extra_rdoc_files: []
|
|
62
63
|
|
63
64
|
files:
|
64
65
|
- COPYING
|
66
|
+
- Rakefile
|
65
67
|
- Gemfile
|
66
68
|
- Gemfile.lock
|
67
|
-
- Rakefile
|
68
69
|
- README.md
|
69
|
-
- assets/assets/scripts/
|
70
|
-
- assets/
|
71
|
-
- assets/samples/
|
70
|
+
- assets/test/assets/scripts/test_helper.rb
|
71
|
+
- assets/samples/sample_activity_test.rb
|
72
|
+
- assets/samples/sample_service_test.rb
|
73
|
+
- assets/samples/sample_broadcast_receiver_test.rb
|
72
74
|
- assets/samples/sample_broadcast_receiver.rb
|
73
75
|
- assets/samples/sample_service.rb
|
74
|
-
- assets/
|
76
|
+
- assets/samples/sample_activity.rb
|
77
|
+
- assets/Rakefile
|
78
|
+
- assets/res/drawable-ldpi/icon.png
|
79
|
+
- assets/res/drawable-hdpi/icon.png
|
80
|
+
- assets/res/drawable-mdpi/icon.png
|
81
|
+
- assets/assets/scripts/ruboto.rb
|
82
|
+
- assets/src/RubotoBroadcastReceiver.java
|
75
83
|
- assets/src/InheritingBroadcastReceiver.java
|
84
|
+
- assets/src/RubotoService.java
|
76
85
|
- assets/src/InheritingClass.java
|
86
|
+
- assets/src/RubotoActivity.java
|
77
87
|
- assets/src/InheritingService.java
|
78
|
-
- assets/src/org/ruboto/
|
88
|
+
- assets/src/org/ruboto/test/InstrumentationTestRunner.java
|
89
|
+
- assets/src/org/ruboto/test/ActivityTest.java
|
79
90
|
- assets/src/org/ruboto/Script.java
|
80
|
-
- assets/src/
|
81
|
-
- assets/src/
|
82
|
-
- assets/src/RubotoService.java
|
91
|
+
- assets/src/org/ruboto/RubotoDialog.java
|
92
|
+
- assets/src/InheritingActivity.java
|
83
93
|
- bin/ruboto
|
94
|
+
- lib/ruboto.rb
|
84
95
|
- lib/java_class_gen/android_api.xml
|
85
96
|
- lib/java_class_gen/InheritingClass.java.erb
|
97
|
+
- lib/ruboto/api.rb
|
98
|
+
- lib/ruboto/core_ext/array.rb
|
99
|
+
- lib/ruboto/core_ext/object.rb
|
100
|
+
- lib/ruboto/util/xml_element.rb
|
101
|
+
- lib/ruboto/util/main_fix.rb
|
102
|
+
- lib/ruboto/util/scan_in_api.rb
|
103
|
+
- lib/ruboto/util/build.rb
|
104
|
+
- lib/ruboto/util/update.rb
|
105
|
+
- lib/ruboto/util/log_action.rb
|
106
|
+
- lib/ruboto/util/code_formatting.rb
|
107
|
+
- lib/ruboto/util/objectspace.rb
|
108
|
+
- lib/ruboto/util/verify.rb
|
109
|
+
- lib/ruboto/util/asset_copier.rb
|
110
|
+
- lib/ruboto/commands/base.rb
|
111
|
+
- test/app_test.rb
|
112
|
+
- test/test_helper.rb
|
86
113
|
has_rdoc: true
|
87
114
|
homepage: http://ruboto.org/
|
88
115
|
licenses: []
|