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.
Files changed (41) hide show
  1. data/Gemfile +1 -1
  2. data/Gemfile.lock +1 -1
  3. data/README.md +42 -3
  4. data/Rakefile +5 -0
  5. data/assets/Rakefile +72 -7
  6. data/assets/assets/scripts/ruboto.rb +124 -71
  7. data/assets/res/drawable-hdpi/icon.png +0 -0
  8. data/assets/res/drawable-ldpi/icon.png +0 -0
  9. data/assets/res/drawable-mdpi/icon.png +0 -0
  10. data/assets/samples/sample_activity.rb +3 -3
  11. data/assets/samples/sample_activity_test.rb +21 -0
  12. data/assets/samples/sample_broadcast_receiver.rb +1 -1
  13. data/assets/samples/sample_broadcast_receiver_test.rb +1 -0
  14. data/assets/samples/sample_service.rb +2 -1
  15. data/assets/samples/sample_service_test.rb +1 -0
  16. data/assets/src/InheritingActivity.java +6 -4
  17. data/assets/src/RubotoActivity.java +17 -5
  18. data/assets/src/org/ruboto/Script.java +30 -17
  19. data/assets/src/org/ruboto/test/ActivityTest.java +58 -0
  20. data/assets/src/org/ruboto/test/InstrumentationTestRunner.java +102 -0
  21. data/assets/test/assets/scripts/test_helper.rb +9 -0
  22. data/bin/ruboto +3 -920
  23. data/lib/java_class_gen/android_api.xml +1 -1
  24. data/lib/ruboto.rb +15 -0
  25. data/lib/ruboto/api.rb +21 -0
  26. data/lib/ruboto/commands/base.rb +373 -0
  27. data/lib/ruboto/core_ext/array.rb +6 -0
  28. data/lib/ruboto/core_ext/object.rb +10 -0
  29. data/lib/ruboto/util/asset_copier.rb +20 -0
  30. data/lib/ruboto/util/build.rb +183 -0
  31. data/lib/ruboto/util/code_formatting.rb +22 -0
  32. data/lib/ruboto/util/log_action.rb +20 -0
  33. data/lib/ruboto/util/main_fix.rb +13 -0
  34. data/lib/ruboto/util/objectspace.rb +8 -0
  35. data/lib/ruboto/util/scan_in_api.rb +40 -0
  36. data/lib/ruboto/util/update.rb +102 -0
  37. data/lib/ruboto/util/verify.rb +59 -0
  38. data/lib/ruboto/util/xml_element.rb +197 -0
  39. data/test/app_test.rb +44 -0
  40. data/test/test_helper.rb +4 -0
  41. 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("&lt;", "<").gsub("&gt;", ">")]}
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("&lt;", "<").gsub("&gt;", ">")
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
@@ -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
@@ -0,0 +1,4 @@
1
+ require "test/unit"
2
+
3
+ PROJECT_DIR = File.expand_path('..', File.dirname(__FILE__))
4
+ $LOAD_PATH << PROJECT_DIR
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: 25
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
+ - 1
8
9
  - 0
9
- - 3
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: 2010-12-19 00:00:00 -05:00
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/ruboto.rb
70
- - assets/Rakefile
71
- - assets/samples/sample_activity.rb
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/src/InheritingActivity.java
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/RubotoDialog.java
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/RubotoActivity.java
81
- - assets/src/RubotoBroadcastReceiver.java
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: []