ruboto 0.13.0.rc.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ccf9964eb67eb09ea2597a828b52d06dff60115b
4
+ data.tar.gz: 12313a6e4b4a2e1e4256a3c86e4155b4b48d6e83
5
+ SHA512:
6
+ metadata.gz: 9155934ff5d0af26fdd163ab4627dce2303ea1359626a9ea2e2ac6fadf1ee8da067f756ee0ea49e99fca6978edec8529cbc4d6346109048973db344b28752525
7
+ data.tar.gz: 5caee4391fcd9b3d094531fe8c807aaa8db72a08ba0313f9cf46f5b3413c6ffd02e73d043d600a23b2205e67fe1fa3da976875a367c1431a7ab2cded85799535
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruboto (0.13.0.dev)
4
+ ruboto (0.13.0)
5
+ jruby-jars
5
6
  main (>= 4.7.2)
6
7
  rake
7
8
 
@@ -11,12 +12,13 @@ GEM
11
12
  arrayfields (4.9.0)
12
13
  chronic (0.9.1)
13
14
  fattr (2.2.1)
15
+ jruby-jars (1.7.4)
14
16
  main (5.2.0)
15
17
  arrayfields (>= 4.7.4)
16
18
  chronic (>= 0.6.2)
17
19
  fattr (>= 2.2.0)
18
20
  map (>= 5.1.0)
19
- map (6.3.0)
21
+ map (6.5.1)
20
22
  rake (10.0.4)
21
23
 
22
24
  PLATFORMS
data/README.md CHANGED
@@ -1,31 +1,57 @@
1
- Ruboto
2
- =============
1
+ Ruboto - JRuby On Android
2
+ =========================
3
3
 
4
- Ruby on Android.
4
+ Ruboto (JRuby on Android) is a platform for developing full stand-alone apps for
5
+ Android using the Ruby language and libraries. It includes support libraries
6
+ and generators for creating projects, classes, tests, and more. The complete
7
+ APIs of Android, Java, and Ruby are available to you using the Ruby language.
5
8
 
6
9
  Installation
7
- -------
10
+ ------------
11
+
12
+ To use Ruboto you need a Ruby implementation installed:
13
+
14
+ * http://ruby-lang.org/
15
+ * http://jruby.org/
16
+ * http://rubini.us/
17
+
18
+ Ruby installation tools:
19
+
20
+ * [rvm](https://rvm.io)
21
+ * [pik](https://github.com/vertiginous/pik)
22
+
23
+ Then run (possibly as root/administrator):
8
24
 
9
25
  $ gem install ruboto
10
26
 
11
- Getting Started
27
+ Tools
12
28
  ---------------
13
29
 
14
- Before you use Ruboto, you should do the following things:
30
+ Before you can use Ruboto, you need the following tools installed:
31
+
32
+ * A Java Development Kit (JDK)
33
+ * [The Android SDK](http://developer.android.com/sdk/index.html)
34
+ * [Apache ANT](http://ant.apache.org/)
35
+ * [jruby-jars](https://rubygems.org/gems/jruby-jars)
36
+
37
+ * Add the sdk to the "ANDROID_HOME" environment variable as an absolute path
38
+ (Java does not expand tildes `~`)
39
+ * Add the sdk's `tools`, `build-tools`, and `platform-tools/` directory to your
40
+ "PATH" environment variable.
15
41
 
16
- * Install the JDK if it's not on your system already
17
- * Install [jruby](http://jruby.org/) if you don't already have it. JRuby has a [very easy install process](http://jruby.org/#2), or you can use [rvm](https://rvm.io/rvm/install/)
18
- * Install [the Android SDK](http://developer.android.com/sdk/index.html)
19
- * Add the sdk to `$ANDROID_HOME` as an absolute path (Java does not expand tildes `~`)
20
- * Add the sdk's `tools/` and `platform-tools/` directory to your `$PATH`
21
- * Generate an [Emulator](http://developer.android.com/guide/developing/tools/emulator.html) image unless you want to develop using your phone.
42
+ Ruboto offers a setup command to help you with the component installation and
43
+ configuration:
22
44
 
23
- General Information
24
- ------------------
45
+ $ ruboto setup
25
46
 
26
- The Rakefile assumes that you are in the root directory of your app, as do all commands of the `ruboto` command line utility, other than `ruboto gen app`.
47
+ * Generate an [Emulator](http://developer.android.com/guide/developing/tools/emulator.html)
48
+ image unless you want to develop using your phone.
49
+
50
+ Ruboto offers a command to help you create and run the emulator for a given
51
+ version (api-level) of Android.
52
+
53
+ $ ruboto emulator -t android-17
27
54
 
28
- The Rakefile requires you to run it through JRuby's rake.
29
55
 
30
56
  Command-line Tools
31
57
  -------
@@ -34,7 +60,7 @@ Command-line Tools
34
60
  * [Class generator](#class_generator) to generate additional Activities, BroadcastReceivers, Services, etc.
35
61
  * [Callback generator](#class_generator) to generate specific subclasses to open up access (callbacks) for various portions of the Android API.
36
62
  * [Packaging task](#packaging_task) to generate an apk file
37
- * [Deployment task](#deployment_task) to deploy a generated package to an emulator or connected device
63
+ * [Release task](#release_task) to deploy a generated package to an emulator or connected device
38
64
  * [Develop without having to compile to try every change](#update_scripts)
39
65
 
40
66
 
@@ -58,46 +84,62 @@ Ex:
58
84
 
59
85
  You can subclass any part of the Android API to pass control over to a script when the specified methods are called. You can also create classes that implement a single Android interface to pass control over to ruboto.
60
86
 
61
- Starting with Ruboto 0.6.0 there are easy ways to do this within your scripts. The new way of generating interfaces and subclasses is described in the wiki [Generating classes for callbacks](https://github.com/ruboto/ruboto/wiki/Generating-classes-for-callbacks)._
87
+ Starting with Ruboto 0.6.0 there are easy ways to do this within your scripts.
88
+ The new way of generating interfaces and subclasses is described in the wiki
89
+ [Generating classes for callbacks](https://github.com/ruboto/ruboto/wiki/Generating-classes-for-callbacks).
62
90
 
63
91
  <a name="packaging_task"></a>
64
92
  ### Packaging task
65
93
 
66
94
  This will generate an apk file.
67
95
 
68
- $ rake
96
+ $ rake debug
69
97
 
70
98
  To generate an apk and install it to a connected device (or emulator) all in one go, run
71
99
 
72
100
  $ rake install
73
101
 
74
- <a name="deployment_task"></a>
75
- ### Deployment task
102
+ To start the installed app, run
103
+
104
+ $ rake start
105
+
106
+ You can chain these commands:
76
107
 
77
- When you're ready to post your app to the Market, you need to do a few things.
108
+ $ rake install start
78
109
 
79
- First, you'll need to generate a key to sign the app with using `keytool` if you do not already have one. If you're ok with accepting some sane defaults, you can use
80
- $ ruboto gen key --alias alias_for_your_key
81
- with an optional flag `--keystore /path/to/keystore.keystore`, which defaults to `~/.android/production.keystore`. It will ask for a password for the keystore and one for the key itself. Make sure that you remember those two passwords, as well as the alias for the key.
110
+ <a name="release_task"></a>
111
+ ### Release task
82
112
 
83
- Also make sure to keep your key backed up (if you lose it, you won't be able to release updates to your app that can install right over the old versions), but secure.
113
+ When you're ready to post your app to the Market, run the `release` task.
114
+
115
+ $ rake release
116
+
117
+ This will generate a keystore for you if it is not already present.
118
+ It will ask for a password for the keystore and one for the key itself. Make
119
+ sure that you remember those two passwords, as well as the alias for the key.
120
+
121
+ Also make sure to keep your key backed up (if you lose it, you won't be able to
122
+ release updates to your app that can install right over the old versions), but
123
+ secure.
84
124
 
85
- Once you have your key, use the `rake publish` task to generate a market-ready `.apk` file. You will need the `RUBOTO_KEYSTORE` and `RUBOTO_KEY_ALIAS` environment variables set to the path to the keystore and the alias for the key, respectively. So either run
86
- $ RUBOTO_KEYSTORE=~/.android/production.keystore RUBOTO_KEY_ALIAS=foo rake publish
87
- or set those environment variables in your `~/.bashrc` or similar file and just run
88
- $ rake publish
89
125
  Now get that `.apk` to the market!
90
126
 
91
127
  <a name="update_scripts"></a>
92
128
  ### Updating Your Scripts on a Device
93
129
 
94
- With traditional Android development, you have to recompile your app and reinstall it on your test device/emulator every time you make a change. That's slow and annoying.
130
+ With traditional Android development, you have to recompile your app and
131
+ reinstall it on your test device/emulator every time you make a change. That's
132
+ slow and annoying.
95
133
 
96
- Luckily, with Ruboto, most of your changes are in the scripts, not in the compiles Java files. So if your changes are Ruby-only, you can just run
134
+ Luckily, with Ruboto, most of your changes are in the scripts, not in the
135
+ compiled Java files. So if your changes are Ruby-only, you can just run
97
136
 
98
137
  $ rake update_scripts
99
138
 
100
139
  to have it copy the current version of your scripts to your device.
140
+ To update the scripts and restart the app in one go, run
141
+
142
+ $ rake update_scripts:restart
101
143
 
102
144
  Sorry if this takes away your excuse to have sword fights:
103
145
 
@@ -105,9 +147,15 @@ Sorry if this takes away your excuse to have sword fights:
105
147
 
106
148
  Caveats:
107
149
 
108
- This only works if your changes are all Ruby. If you have Java changes (which would generally just mean generating new classes) or changes to the xml, you will need to recompile your script.
150
+ This only works if your changes are all Ruby. If you have Java changes (which
151
+ would generally just mean generating new classes) or changes to the xml, you
152
+ will need to recompile your app. The `update_scripts` task will revert to
153
+ build the complete apk and install it if it detects non-Ruby source changes.
109
154
 
110
- Also, you need root access to your device for this to work, as it needs to write to directories that are read-only otherwise. The easiest solution is to test on an emulator, but you can also root your phone.
155
+ On an actual device, you need to give the WRITE_EXTERNAL_STORAGE permission to
156
+ your app, and scripts will be updated using the SDCARD on the device/emulator.
157
+
158
+ Alternatively, you can also root your phone.
111
159
 
112
160
  ### Updating Ruboto's Files
113
161
 
@@ -121,58 +169,70 @@ You can update various portions of your generated Ruboto app through the ruboto
121
169
 
122
170
  $ ruboto update jruby
123
171
 
124
- * The ruboto.rb script:
172
+ * The Ruboto library files and generated Java source:
125
173
 
126
174
  1) From the root directory of your app:
127
175
 
128
- $ ruboto update ruboto
129
-
130
- * The core classes (e.g., RubotoActivity):
131
-
132
- 1) These classes are generated on your machine based on the SDKs (min and target) specified when you 'gen app' (stored in the AndroidManifest.xml)
133
-
134
- 2) You many want to regenerate them if a new version of the SDK is released, if you change your targets, or if you want more control over the callbacks you receive.
176
+ $ ruboto update app
135
177
 
136
- 3) From the root directory of your app:
137
-
138
- $ ruboto gen core Activity --method_base all-on-or-none --method_include specific-methods-to-include --method_include specific-methods-to-exclude
139
-
140
- 4) The generator will load up the SDK information and find the specified methods. The generator will abort around methods that were added or deprecated based on the SDK levels. You can either use method_exclude to remove methods individually or add '--force exclude' to remove the all. You can also us '--force include' to create them anyway (added methods are created without calling super to avoid crashing on legacy hardware).
141
178
 
142
179
  Scripts
143
180
  -------
144
181
 
145
- The main thing Ruboto offers you is the ability to write Ruby scripts to define the behavior of Activities, BroadcastReceievers, and Services. (Eventually it'll be every class. It's setup such that adding in more classes should be trivial.)
182
+ The main thing Ruboto offers you is the ability to write Ruby scripts to define
183
+ the behavior of Activities, BroadcastReceievers, and Services. (Eventually it'll
184
+ be every class. It's setup such that adding in more classes should be trivial.)
146
185
 
147
186
  Here's how it works:
148
187
 
149
- First of all, your scripts are found in `src/` and the script name is the same as the name of your class, only under_scored instead of CamelCased. Android classes have all of these methods that get called in certain situations. `Activity.onDestroy()` gets called when the activity gets killed, for example. Save weird cases (like the "launching" methods that need to setup JRuby), to script the method onFooBar, you call the Ruby method on_foo_bar on the Android object. That was really abstract, so here's an example.
188
+ First of all, your scripts are found in the `src/` directory, and the script
189
+ name is the same as the name of your class, only under_scored instead of
190
+ CamelCased. Android classes have all of these methods that get called in certain
191
+ situations. `Activity.onDestroy()` gets called when the activity gets killed,
192
+ for example. Save weird cases (like the "launching" methods that need to setup
193
+ JRuby), to script the method onFooBar, you call the Ruby method onFooBar on the
194
+ Android object. That was really abstract, so here's an example.
150
195
 
151
- You generate an app with the option `--activity FooActivity`, which means that ruboto will generate a FooActivity for you. So you open `src/foo_activity.rb` in your favorite text editor. If you want an activity that does nothing but Log when it gets launched and when it gets destroyed (in the onCreate and onPause methods). You want your script to look like this:
152
-
153
- require 'ruboto/activity' #scripts will not work without doing this
196
+ You generate an app with the option `--activity FooActivity`, which means that
197
+ Ruboto will generate a FooActivity for you. So you open `src/foo_activity.rb` in
198
+ your favorite text editor. If you want an activity that does nothing but Log
199
+ when it gets launched and when it gets destroyed (in the onCreate and onPause
200
+ methods). You want your script to look like this:
154
201
 
155
202
  class FooActivity
156
- include Ruboto::Activity
157
203
  def onCreate(bundle)
158
- Log.v 'MYAPPNAME', 'onCreate got called!'
204
+ super
205
+ android.util.Log.v 'MYAPPNAME', 'onCreate got called!'
159
206
  end
160
207
 
161
208
  def onPause
162
- Log.v 'MYAPPNAME', 'onPause got called!'
209
+ super
210
+ android.util.Log.v 'MYAPPNAME', 'onPause got called!'
163
211
  end
164
212
  end
165
213
 
166
- The arguments passed to the methods are the same as the arguments that the java methods take. Consult the Android documentation.
214
+ The arguments passed to the methods are the same as the arguments that the java
215
+ methods take. Consult the Android documentation.
216
+
217
+ Activities also have some special methods defined to make things easier. The
218
+ easiest way to get an idea of what they are is looking over the
219
+ [demo scripts](http://github.com/ruboto/ruboto-irb/tree/master/assets/demo-scripts/)
220
+ and the
221
+ [tests](http://github.com/ruboto/ruboto/tree/master/test/activity/).
222
+ You can also read the
223
+ [ruboto source](http://github.com/ruboto/ruboto/blob/master/assets/src/ruboto)
224
+ where everything is defined.
167
225
 
168
- Activities also have some special methods defined to make things easier. The easiest way to get an idea of what they are is looking over the [demo scripts](http://github.com/ruboto/ruboto-irb/tree/master/assets/demo-scripts/). You can also read the [ruboto.rb file](http://github.com/ruboto/ruboto-irb/blob/master/src/ruboto.rb) where everything is defined.
226
+ We also have many fine examples on the
227
+ [WIKI](https://github.com/ruboto/ruboto/wiki).
169
228
 
170
229
  Testing
171
230
  -------
172
231
 
173
- For each generated class, a ruby test script is created in the test/src directory.
174
- For example if you generate a RubotoSampleAppActivity a file test/src/ruboto_sample_app_activity_test.rb
175
- file is created containing a sample test script:
232
+ For each generated class, a Ruby test script is created in the test/src
233
+ directory. For example if you generate a RubotoSampleAppActivity a file
234
+ "test/src/ruboto_sample_app_activity_test.rb" file is created containing a
235
+ sample test script:
176
236
 
177
237
  activity Java::org.ruboto.sample_app.RubotoSampleAppActivity
178
238
 
@@ -198,55 +258,92 @@ file is created containing a sample test script:
198
258
 
199
259
  You run the tests for your app using ant or rake
200
260
 
201
- $ jruby -S rake test
261
+ $ rake test
202
262
 
203
263
  $ cd test ; ant run-tests
204
264
 
205
265
  Contributing
206
266
  ------------
207
267
 
208
- Want to contribute? Great! Meet us in #ruboto on irc.freenode.net, fork the project and start coding!
268
+ Want to contribute? Great! Meet us in #ruboto on irc.freenode.net, fork the
269
+ project and start coding!
209
270
 
210
- "But I don't understand it well enough to contribute by forking the project!" That's fine. Equally helpful:
271
+ "But I don't understand it well enough to contribute by forking the project!"
272
+ That's fine. Equally helpful:
211
273
 
212
274
  * Use Ruboto and tell us how it could be better.
213
- * As you gain wisdom, contribute it to [the wiki](http://github.com/ruboto/ruboto/wiki/)
275
+ * Browse http://ruboto.org/ and the documentation, and let us know how to make
276
+ it better.
277
+ * As you gain wisdom, contribute it to
278
+ [the wiki](http://github.com/ruboto/ruboto/wiki/)
214
279
  * When you gain enough wisdom, reconsider whether you could fork the project.
215
280
 
216
- If contributing code to the project, please run the existing tests and add tests for your changes. You run the tests using rake
281
+ If contributing code to the project, please run the existing tests and add tests
282
+ for your changes. You run the tests using rake
217
283
 
218
- $ jruby -S rake test
284
+ $ rake test
285
+
286
+ We have set up a matrix test that tests multiple configuations on the emulator:
287
+
288
+ $ ./matrix_tests.sh
289
+
290
+ All branches and pull requests on GitHub are also testd on
291
+ https://travis-ci.org/ruboto/ruboto
219
292
 
220
293
  Getting Help
221
294
  ------------
222
295
 
223
- * You'll need to be pretty familiar with the Android API. The [Developer Guide](http://developer.android.com/guide/index.html) and [Reference](http://developer.android.com/reference/packages.html) are very useful.
224
- * There is further documentation at the [wiki](http://github.com/ruboto/ruboto/wiki)
225
- * If you have bugs or feature requests, [open an issue on GitHub](http://github.com/ruboto/ruboto/issues)
226
- * You can ask questions in #ruboto on irc.freenode.net and on the [mailing list](http://groups.google.com/groups/ruboto)
227
- * There are some sample scripts (just Activities) [here](http://github.com/ruboto/ruboto-irb/tree/master/assets/demo-scripts/)
296
+ * You'll need to be pretty familiar with the Android API. The
297
+ [Developer Guide](http://developer.android.com/guide/index.html) and
298
+ [Reference](http://developer.android.com/reference/packages.html) are very
299
+ useful.
300
+ * There is further documentation at the
301
+ [wiki](http://github.com/ruboto/ruboto/wiki).
302
+ * If you have bugs or feature requests, please
303
+ [open an issue on GitHub](http://github.com/ruboto/ruboto/issues).
304
+ * You can ask questions in #ruboto on irc.freenode.net and on the
305
+ [mailing list](http://groups.google.com/groups/ruboto).
306
+ * There are some sample scripts (just Activities)
307
+ [here](http://github.com/ruboto/ruboto-irb/tree/master/assets/demo-scripts/).
228
308
 
229
309
  Tips & Tricks
230
310
  -------------
231
311
 
232
312
  ### Emulators
233
313
 
234
- You can start an emulator corresponding to the api level of your project with `rake emulator`. The emulator will be created for you and will be called after the android version of you rproject, like "Android_4.0.3".
314
+ You can start an emulator corresponding to the api level of your project with
315
+
316
+ $ ruboto emulator
235
317
 
236
- If you're doing a lot of Android development, you'll probably find yourself typing `emulator -avd name_of_emulator` a lot to open emulators. It can be convenient to alias these to shorter commands.
318
+ The emulator will be created for you and will be named after the android version
319
+ of your project, like "Android_4.0.3".
320
+
321
+ If you want to start an emulator for a specific API level use the "-t" option:
322
+
323
+ $ ruboto emulator -t 17
324
+
325
+ If you're doing a lot of Android development, you'll probably find yourself
326
+ starting emulators a lot. It can be convenient to alias these to shorter
327
+ commands.
237
328
 
238
329
  For example, in your `~/.bashrc`, `~/.zshrc`, or similar file, you might put
239
- alias ics="emulator -avd Android_4.0.3"
240
- alias jellyb="emulator -avd Android_4.1.2"
241
- If you have an "Android_4.0.3" emulator that runs Android 4..0.1 and a "Android_4.1.2" one that runs Android 4.1.2.
330
+
331
+ alias ics="ruboto emulator -t 15"
332
+ alias jellyb="ruboto emulator -t 16"
333
+ alias jb17="ruboto emulator -t 17"
242
334
 
243
335
 
244
336
  Alternatives
245
337
  ------------
246
338
 
247
- If Ruboto's performance is a problem for you, check out [Mirah](http://mirah.org/) and [Garrett](http://github.com/technomancy/Garrett).
339
+ If Ruboto's performance is a problem for you, check out
340
+ [Mirah](http://mirah.org/) and [Garrett](http://github.com/technomancy/Garrett).
248
341
 
249
- Mirah is a language with Ruby-like syntax that compiles to java files. This means that it adds no big runtime dependencies and has essentially the same performance as writing Java code because it essentially generates the same Java code that you would write. This makes it extremely well-suited for mobile devices where performance is a much bigger consideration.
342
+ Mirah is a language with Ruby-like syntax that compiles to java files. This
343
+ means that it adds no big runtime dependencies and has essentially the same
344
+ performance as writing Java code because it essentially generates the same Java
345
+ code that you would write. This makes it extremely well-suited for mobile
346
+ devices where performance is a much bigger consideration.
250
347
 
251
348
  Garrett is a "playground for Mirah exploration on Android."
252
349
 
@@ -256,7 +353,12 @@ Domo Arigato
256
353
 
257
354
  Thanks go to:
258
355
 
259
- * Charles Nutter, a member of the JRuby core team, for mentoring this RSoC project and starting the Ruboto project in the first place with an [irb](http://github.com/ruboto/ruboto-irb)
356
+ * Charles Nutter, a member of the JRuby core team, for mentoring this RSoC
357
+ project and starting the Ruboto project in the first place with an
358
+ [irb](http://github.com/ruboto/ruboto-irb)
260
359
  * All of Ruby Summer of Code's [sponsors](http://rubysoc.org/sponsors)
261
- * [Engine Yard](http://engineyard.com/) in particular for sponsoring RSoC and heavily sponsoring JRuby, which is obviously critical to the project.
262
- * All [contributors](http://github.com/ruboto/ruboto/contributors) and [contributors to the ruboto-irb project](http://github.com/ruboto/ruboto-irb/contributors), as much of this code was taken from ruboto-irb.
360
+ * [Engine Yard](http://engineyard.com/) in particular for sponsoring RSoC and
361
+ heavily sponsoring JRuby, which is obviously critical to the project.
362
+ * All [contributors](http://github.com/ruboto/ruboto/contributors) and
363
+ [contributors to the ruboto-irb project](http://github.com/ruboto/ruboto-irb/contributors),
364
+ as much of this code was taken from ruboto-irb.
@@ -0,0 +1,33 @@
1
+ Subject: [ANN] Ruboto 0.13.0 release candidate
2
+
3
+ Hi all!
4
+
5
+ The Ruboto 0.13.0 release candidate is now available.
6
+
7
+ In this release we add support for Android API level 17 and the Android
8
+ SDK r22. There are improvements on the "ruboto setup" command, and
9
+ general preparations for the 1.0 release.
10
+
11
+ As always we need your help and feedback to ensure the quality of the release. Please install the release candidate using
12
+
13
+ [sudo] gem install ruboto --pre
14
+
15
+ and test your apps after updating with
16
+
17
+ ruboto update app
18
+
19
+ If you have an app released for public consumption, please let us know. Our developer program seeks to help developers getting started using Ruboto, and ensure good quality across Ruboto releases. Currently we are supporting the apps listed here:
20
+
21
+ https://github.com/ruboto/ruboto/wiki/Promoted-apps
22
+
23
+ If you are just starting with Ruboto, but still want to contribute, please select and complete one of the tutorials and mark it with the version of Ruboto you used.
24
+
25
+ https://github.com/ruboto/ruboto/wiki/Tutorials-and-examples
26
+
27
+ If you find a bug or have a suggestion, please file an issue in the issue tracker:
28
+
29
+ https://github.com/ruboto/ruboto/issues
30
+
31
+ --
32
+ The Ruboto Team
33
+ http://ruboto.org/