ruboto-core 0.0.3 → 0.1.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 +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: []
|