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.
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: []