opal 0.0.1 → 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 (306) hide show
  1. data/.gitignore +10 -1
  2. data/.gitmodules +0 -0
  3. data/Opalfile +371 -0
  4. data/README.md +45 -0
  5. data/Rakefile +237 -34
  6. data/VERSION +1 -1
  7. data/bin/opal +13 -0
  8. data/demos/apps/browser_demo/index.html +11 -0
  9. data/demos/apps/browser_demo/lib/browser_demo.rb +31 -0
  10. data/demos/apps/simple_opal/Opalfile +13 -0
  11. data/demos/apps/simple_opal/index.html +11 -0
  12. data/demos/apps/simple_opal/lib/app_controller.rb +62 -0
  13. data/demos/apps/simple_opal/lib/main_window.rb +146 -0
  14. data/demos/browser/request/index.html +52 -0
  15. data/demos/browser/request/request.rb +48 -0
  16. data/gen/browser/__PROJECT_NAME__/index.html +10 -0
  17. data/gen/browser/__PROJECT_NAME__/lib/__PROJECT_NAME__.rb +1 -0
  18. data/lib/opal.rb +48 -3
  19. data/lib/opal/builders/base.rb +50 -0
  20. data/lib/opal/builders/css.rb +46 -0
  21. data/lib/opal/builders/javascript.rb +44 -0
  22. data/lib/opal/builders/opal.rb +79 -0
  23. data/lib/opal/builders/ruby.rb +50 -0
  24. data/lib/opal/builders/ruby/generate.rb +1851 -0
  25. data/lib/opal/builders/ruby/nodes.rb +210 -0
  26. data/lib/opal/builders/ruby/ruby.rb +916 -0
  27. data/lib/opal/builders/ruby/ruby_parser.rb +6008 -0
  28. data/lib/opal/builders/ruby/ruby_parser.rb.y +1451 -0
  29. data/lib/opal/models/build_item.rb +104 -0
  30. data/lib/opal/models/hash_struct.rb +40 -0
  31. data/lib/opal/models/project.rb +215 -0
  32. data/lib/opal/models/struct_accessors.rb +58 -0
  33. data/lib/opal/models/target.rb +176 -0
  34. data/lib/opal/opal/env/console.rb +66 -0
  35. data/lib/opal/opal/env/fs.rb +98 -0
  36. data/lib/opal/opal/env/object.rb +48 -0
  37. data/lib/opal/opal/environment.rb +139 -0
  38. data/lib/opal/opal/gen.rb +62 -0
  39. data/lib/opal/opal/opal.rb +68 -0
  40. data/lib/opal/opal/repl.rb +38 -0
  41. data/lib/opal/opalfile/dsl.rb +62 -0
  42. data/lib/opal/opalfile/opalfile.rb +133 -0
  43. data/lib/opal/opalfile/task.rb +96 -0
  44. data/lib/opal/opalfile/task_manager.rb +63 -0
  45. data/lib/opal/opalfile/task_scope.rb +52 -0
  46. data/lib/opal/rack/app_server.rb +119 -0
  47. data/opals/aristo/README.md +16 -0
  48. data/opals/browser/Opalfile +11 -0
  49. data/opals/browser/README.md +146 -0
  50. data/opals/browser/SIZZLE_LICESNSE.txt +148 -0
  51. data/opals/browser/lib/browser.rb +118 -0
  52. data/opals/browser/lib/browser/builder.rb +41 -0
  53. data/opals/browser/lib/browser/canvas_context.rb +115 -0
  54. data/opals/browser/lib/browser/dimensions.rb +50 -0
  55. data/opals/browser/lib/browser/document.rb +146 -0
  56. data/opals/browser/lib/browser/element.rb +487 -0
  57. data/opals/browser/lib/browser/element/attributes.rb +88 -0
  58. data/opals/browser/lib/browser/element/css.rb +290 -0
  59. data/opals/browser/lib/browser/element/form.rb +146 -0
  60. data/opals/browser/lib/browser/event/dom_events.rb +81 -0
  61. data/opals/browser/lib/browser/event/event.rb +177 -0
  62. data/opals/browser/lib/browser/event/trigger_events.rb +53 -0
  63. data/opals/browser/lib/browser/geometry.rb +97 -0
  64. data/opals/browser/lib/browser/json.rb +32 -0
  65. data/opals/browser/lib/browser/json_parse.js +321 -0
  66. data/opals/browser/lib/browser/request/request.rb +201 -0
  67. data/opals/browser/lib/browser/sizzle.js +1068 -0
  68. data/opals/browser/lib/browser/string.rb +42 -0
  69. data/opals/browser/lib/browser/touch.rb +37 -0
  70. data/{runtime/yaml.js → opals/browser/lib/browser/vml_context.js} +8 -8
  71. data/opals/browser/lib/browser/window.rb +36 -0
  72. data/opals/browser/spec/browser/browser_detection_spec.rb +7 -0
  73. data/opals/browser/spec/document/aref_spec.rb +110 -0
  74. data/opals/browser/spec/document/ready_spec.rb +16 -0
  75. data/opals/browser/spec/element/body_spec.rb +11 -0
  76. data/opals/browser/spec/element/clear_spec.rb +26 -0
  77. data/opals/browser/spec/element/empty_spec.rb +29 -0
  78. data/opals/browser/spec/element/has_class_spec.rb +40 -0
  79. data/opals/browser/spec/element/hidden_spec.rb +23 -0
  80. data/opals/browser/spec/element/hide_spec.rb +31 -0
  81. data/opals/browser/spec/element/remove_spec.rb +25 -0
  82. data/opals/browser/spec/element/show_spec.rb +31 -0
  83. data/opals/browser/spec/element/style_spec.rb +69 -0
  84. data/opals/browser/spec/element/toggle_spec.rb +31 -0
  85. data/opals/browser/spec/element/visible_spec.rb +23 -0
  86. data/opals/browser/spec/spec_helper.rb +1 -0
  87. data/opals/cherry_kit/Opalfile +6 -0
  88. data/opals/cherry_kit/bin/cherry_kit.rb +11 -0
  89. data/opals/cherry_kit/lib/cherry_kit.rb +29 -0
  90. data/opals/foundation/Opalfile +11 -0
  91. data/opals/foundation/bin/foundation.rb +12 -0
  92. data/opals/foundation/lib/foundation.rb +32 -0
  93. data/opals/foundation/lib/foundation/__table_view_desktop/outline_view.rb +57 -0
  94. data/opals/foundation/lib/foundation/__table_view_desktop/table_column.rb +59 -0
  95. data/opals/foundation/lib/foundation/__table_view_desktop/table_header_view.rb +34 -0
  96. data/opals/foundation/lib/foundation/__table_view_desktop/table_view.rb +304 -0
  97. data/opals/foundation/lib/foundation/controllers/array_controller.rb +54 -0
  98. data/opals/foundation/lib/foundation/controllers/controller.rb +74 -0
  99. data/opals/foundation/lib/foundation/controllers/controller_selection_proxy.rb +67 -0
  100. data/opals/foundation/lib/foundation/controllers/object_controller.rb +145 -0
  101. data/opals/foundation/lib/foundation/controllers/view.rb +40 -0
  102. data/opals/foundation/lib/foundation/core/application.rb +476 -0
  103. data/opals/foundation/lib/foundation/core/attributes.rb +146 -0
  104. data/opals/foundation/lib/foundation/core/bindings.rb +125 -0
  105. data/opals/foundation/lib/foundation/core/builder.rb +101 -0
  106. data/opals/foundation/lib/foundation/core/event.rb +112 -0
  107. data/opals/foundation/lib/foundation/core/index_path.rb +49 -0
  108. data/opals/foundation/lib/foundation/core/index_set.rb +97 -0
  109. data/opals/foundation/lib/foundation/core/notification.rb +113 -0
  110. data/opals/foundation/lib/foundation/core/observable.rb +275 -0
  111. data/opals/foundation/lib/foundation/core/observable_array.rb +30 -0
  112. data/opals/foundation/lib/foundation/core/responder.rb +85 -0
  113. data/opals/foundation/lib/foundation/core/run_loop.rb +89 -0
  114. data/opals/foundation/lib/foundation/core/touch.rb +95 -0
  115. data/opals/foundation/lib/foundation/gestures/gesture_recognizer.rb +35 -0
  116. data/opals/foundation/lib/foundation/rendering/render_context.rb +100 -0
  117. data/opals/foundation/lib/foundation/rendering/renderer.rb +137 -0
  118. data/opals/foundation/lib/foundation/rendering/root_theme.rb +77 -0
  119. data/opals/foundation/lib/foundation/rendering/root_theme/button.rb +62 -0
  120. data/opals/foundation/lib/foundation/rendering/root_theme/control.rb +72 -0
  121. data/opals/foundation/lib/foundation/rendering/root_theme/label.rb +54 -0
  122. data/opals/foundation/lib/foundation/rendering/root_theme/scroller.rb +58 -0
  123. data/opals/foundation/lib/foundation/rendering/root_theme/slider.rb +72 -0
  124. data/opals/foundation/lib/foundation/rendering/root_theme/table_view.rb +97 -0
  125. data/opals/foundation/lib/foundation/rendering/root_theme/text_field.rb +55 -0
  126. data/opals/foundation/lib/foundation/rendering/root_theme/view.rb +81 -0
  127. data/opals/foundation/lib/foundation/rendering/theme.rb +38 -0
  128. data/opals/foundation/lib/foundation/table_view/cell.rb +39 -0
  129. data/opals/foundation/lib/foundation/table_view/table.rb +171 -0
  130. data/opals/foundation/lib/foundation/views/button.rb +63 -0
  131. data/opals/foundation/lib/foundation/views/checkbox.rb +28 -0
  132. data/opals/foundation/lib/foundation/views/clip.rb +47 -0
  133. data/opals/foundation/lib/foundation/views/control.rb +199 -0
  134. data/opals/foundation/lib/foundation/views/label.rb +54 -0
  135. data/opals/foundation/lib/foundation/views/scroll.rb +294 -0
  136. data/opals/foundation/lib/foundation/views/scroll_view_desktop.rb +152 -0
  137. data/opals/foundation/lib/foundation/views/scroller.rb +54 -0
  138. data/opals/foundation/lib/foundation/views/slider.rb +93 -0
  139. data/opals/foundation/lib/foundation/views/text_field.rb +83 -0
  140. data/opals/foundation/lib/foundation/views/view.rb +426 -0
  141. data/opals/foundation/lib/foundation/windows/window.rb +191 -0
  142. data/opals/foundation/resources/button/button.css +23 -0
  143. data/{runtime/init.js → opals/foundation/resources/foundation.css} +27 -33
  144. data/opals/foundation/resources/scroll/scroll.css +22 -0
  145. data/opals/foundation/resources/scroll_view/scroll_view.css +3 -0
  146. data/opals/foundation/resources/scroll_view/scroller.css +3 -0
  147. data/opals/foundation/resources/slider/regular/slider.css +3 -0
  148. data/opals/foundation/resources/slider/slider.css +27 -0
  149. data/opals/foundation/resources/table_view/outline_view.css +3 -0
  150. data/opals/foundation/resources/table_view/table_view.css +15 -0
  151. data/opals/foundation/resources/text_field/text_field.css +71 -0
  152. data/opals/foundation/spec/spec_helper.rb +1 -0
  153. data/opals/foundation/spec/system/attributes/get_attribute_spec.rb +69 -0
  154. data/opals/foundation/spec/system/attributes/get_path_spec.rb +44 -0
  155. data/opals/foundation/spec/system/attributes/set_path_spec.rb +24 -0
  156. data/opals/foundation/spec/system/attributes/set_spec.rb +58 -0
  157. data/opals/foundation/spec/system/bindings/bindings.rb +85 -0
  158. data/opals/foundation/spec/system/key_value_binding/bind_spec.rb +43 -0
  159. data/opals/foundation/spec/system/observable/dependant_keys_spec.rb +74 -0
  160. data/opals/foundation/spec/system/observable/observe_spec.rb +292 -0
  161. data/opals/foundation/spec/system/observable/remove_observer_spec.rb +60 -0
  162. data/opals/opal/Opalfile +14 -0
  163. data/opals/opal/spec/core/array/append_spec.rb +30 -0
  164. data/opals/opal/spec/core/array/assoc_spec.rb +29 -0
  165. data/opals/opal/spec/core/array/at_spec.rb +37 -0
  166. data/opals/opal/spec/core/array/clear_spec.rb +22 -0
  167. data/opals/opal/spec/core/array/collect_bang_spec.rb +27 -0
  168. data/opals/opal/spec/core/array/collect_spec.rb +27 -0
  169. data/opals/opal/spec/core/array/compact_spec.rb +15 -0
  170. data/opals/opal/spec/core/array/concat_spec.rb +15 -0
  171. data/opals/opal/spec/core/array/constructor_spec.rb +14 -0
  172. data/opals/opal/spec/core/array/each_spec.rb +9 -0
  173. data/opals/opal/spec/core/array/element_reference_spec.rb +4 -0
  174. data/opals/opal/spec/core/array/first_spec.rb +35 -0
  175. data/opals/opal/spec/core/array/include_spec.rb +9 -0
  176. data/opals/opal/spec/core/array/map_spec.rb +31 -0
  177. data/opals/opal/spec/core/builtin_constants/builtin_constants_spec.rb +7 -0
  178. data/opals/opal/spec/core/false/and_spec.rb +10 -0
  179. data/opals/opal/spec/core/false/inspect_spec.rb +6 -0
  180. data/opals/opal/spec/core/false/or_spec.rb +10 -0
  181. data/opals/opal/spec/core/false/to_s_spec.rb +6 -0
  182. data/opals/opal/spec/core/false/xor_spec.rb +10 -0
  183. data/opals/opal/spec/core/file/join_spec.rb +19 -0
  184. data/opals/opal/spec/core/kernel/instance_eval_spec.rb +0 -0
  185. data/opals/opal/spec/core/kernel/loop_spec.rb +24 -0
  186. data/opals/opal/spec/core/kernel/raise_spec.rb +0 -0
  187. data/opals/opal/spec/core/module/attr_accessor_spec.rb +28 -0
  188. data/opals/opal/spec/core/number/lt_spec.rb +12 -0
  189. data/opals/opal/spec/core/true/and_spec.rb +10 -0
  190. data/opals/opal/spec/core/true/inspect_spec.rb +6 -0
  191. data/opals/opal/spec/core/true/or_spec.rb +10 -0
  192. data/opals/opal/spec/core/true/to_s_spec.rb +6 -0
  193. data/opals/opal/spec/core/true/xor_spec.rb +10 -0
  194. data/opals/opal/spec/fixtures/super.rb +70 -0
  195. data/opals/opal/spec/language/____temp_remove_this.rb +12 -0
  196. data/opals/opal/spec/language/and_spec.rb +62 -0
  197. data/opals/opal/spec/language/array_spec.rb +52 -0
  198. data/opals/opal/spec/language/block_spec.rb +18 -0
  199. data/opals/opal/spec/language/break_spec.rb +36 -0
  200. data/opals/opal/spec/language/case_spec.rb +103 -0
  201. data/opals/opal/spec/language/def_spec.rb +11 -0
  202. data/opals/opal/spec/language/eigenclass_spec.rb +60 -0
  203. data/opals/opal/spec/language/hash_spec.rb +29 -0
  204. data/opals/opal/spec/language/if_spec.rb +54 -0
  205. data/opals/opal/spec/language/loop_spec.rb +11 -0
  206. data/opals/opal/spec/language/metaclass_spec.rb +21 -0
  207. data/opals/opal/spec/language/method_spec.rb +64 -0
  208. data/opals/opal/spec/language/next_spec.rb +25 -0
  209. data/opals/opal/spec/language/or_spec.rb +34 -0
  210. data/opals/opal/spec/language/redo_spec.rb +24 -0
  211. data/opals/opal/spec/language/rescue_spec.rb +20 -0
  212. data/opals/opal/spec/language/return_spec.rb +47 -0
  213. data/opals/opal/spec/language/string_spec.rb +25 -0
  214. data/opals/opal/spec/language/super_spec.rb +26 -0
  215. data/opals/opal/spec/language/until_spec.rb +157 -0
  216. data/opals/opal/spec/language/while_spec.rb +163 -0
  217. data/opals/opal/spec/spec_helper.rb +5 -0
  218. data/opals/runtime/Opalfile +68 -0
  219. data/opals/runtime/README.md +12 -0
  220. data/opals/runtime/docs/debugging.md +51 -0
  221. data/opals/runtime/lib/array.rb +1516 -0
  222. data/opals/runtime/lib/basic_object.rb +49 -0
  223. data/opals/runtime/lib/class.rb +54 -0
  224. data/opals/runtime/lib/dir.rb +36 -0
  225. data/opals/runtime/lib/error.rb +49 -0
  226. data/opals/runtime/lib/false_class.rb +52 -0
  227. data/opals/runtime/lib/file.rb +79 -0
  228. data/opals/runtime/lib/hash.rb +791 -0
  229. data/opals/runtime/lib/io.rb +39 -0
  230. data/opals/runtime/lib/kernel.rb +288 -0
  231. data/opals/runtime/lib/match_data.rb +36 -0
  232. data/opals/runtime/lib/module.rb +109 -0
  233. data/opals/runtime/lib/nil_class.rb +69 -0
  234. data/opals/runtime/lib/number.rb +398 -0
  235. data/opals/runtime/lib/proc.rb +77 -0
  236. data/opals/runtime/lib/range.rb +63 -0
  237. data/opals/runtime/lib/regexp.rb +111 -0
  238. data/opals/runtime/lib/ruby.rb +30 -0
  239. data/opals/runtime/lib/string.rb +328 -0
  240. data/opals/runtime/lib/symbol.rb +40 -0
  241. data/opals/runtime/lib/top_self.rb +33 -0
  242. data/opals/runtime/lib/true_class.rb +45 -0
  243. data/opals/runtime/runtime/browser.js +287 -0
  244. data/opals/runtime/runtime/debug.js +182 -0
  245. data/opals/runtime/runtime/opal.js +1010 -0
  246. data/opals/runtime/runtime/post_opal.js +1 -0
  247. data/opals/runtime/runtime/pre_opal.js +2 -0
  248. data/opals/runtime/runtime/server_side.js +50 -0
  249. data/opals/spec/LICENSE.txt +26 -0
  250. data/opals/spec/Opalfile +5 -0
  251. data/opals/spec/bin/spec.rb +43 -0
  252. data/opals/spec/lib/spec.rb +33 -0
  253. data/opals/spec/lib/spec/dsl.rb +41 -0
  254. data/opals/spec/lib/spec/example.rb +35 -0
  255. data/opals/spec/lib/spec/example/before_and_after_hooks.rb +81 -0
  256. data/opals/spec/lib/spec/example/errors.rb +42 -0
  257. data/opals/spec/lib/spec/example/example_group.rb +37 -0
  258. data/opals/spec/lib/spec/example/example_group_factory.rb +43 -0
  259. data/opals/spec/lib/spec/example/example_group_hierarchy.rb +45 -0
  260. data/opals/spec/lib/spec/example/example_group_methods.rb +142 -0
  261. data/opals/spec/lib/spec/example/example_group_proxy.rb +41 -0
  262. data/opals/spec/lib/spec/example/example_methods.rb +73 -0
  263. data/opals/spec/lib/spec/example/example_proxy.rb +48 -0
  264. data/opals/spec/lib/spec/expectations.rb +46 -0
  265. data/opals/spec/lib/spec/expectations/errors.rb +35 -0
  266. data/opals/spec/lib/spec/expectations/fail_with.rb +37 -0
  267. data/opals/spec/lib/spec/expectations/handler.rb +48 -0
  268. data/opals/spec/lib/spec/matchers.rb +50 -0
  269. data/opals/spec/lib/spec/matchers/be.rb +26 -0
  270. data/opals/spec/lib/spec/matchers/generated_descriptions.rb +47 -0
  271. data/opals/spec/lib/spec/matchers/operator_matcher.rb +66 -0
  272. data/opals/spec/lib/spec/runner.rb +48 -0
  273. data/opals/spec/lib/spec/runner/example_group_runner.rb +71 -0
  274. data/opals/spec/lib/spec/runner/formatter/html_formatter.rb +100 -0
  275. data/opals/spec/lib/spec/runner/formatter/terminal_formatter.rb +82 -0
  276. data/opals/spec/lib/spec/runner/options.rb +63 -0
  277. data/opals/spec/lib/spec/runner/reporter.rb +123 -0
  278. data/opals/spec/resources/index.html +25 -0
  279. data/opals/spec/resources/spec.css +132 -0
  280. data/spec/cherry_kit/iseq_spec.rb +38 -0
  281. data/spec/spec_helper.rb +16 -0
  282. data/spec/vienna_spec.rb +7 -0
  283. data/yard/index.html +43 -0
  284. data/yard/style.css +765 -0
  285. metadata +312 -49
  286. data/docs/jarv.rdoc +0 -27
  287. data/runtime/array.js +0 -153
  288. data/runtime/class.js +0 -469
  289. data/runtime/compar.js +0 -73
  290. data/runtime/dir.js +0 -115
  291. data/runtime/enum.js +0 -74
  292. data/runtime/file.js +0 -165
  293. data/runtime/gem.js +0 -241
  294. data/runtime/hash.js +0 -181
  295. data/runtime/load.js +0 -251
  296. data/runtime/module.js +0 -98
  297. data/runtime/number.js +0 -148
  298. data/runtime/object.js +0 -522
  299. data/runtime/opal.js +0 -200
  300. data/runtime/parse.js +0 -2218
  301. data/runtime/range.js +0 -56
  302. data/runtime/re.js +0 -91
  303. data/runtime/string.js +0 -199
  304. data/runtime/variable.js +0 -184
  305. data/runtime/vm.js +0 -1150
  306. data/tasks/build.rb +0 -16
@@ -0,0 +1,26 @@
1
+ #
2
+ # describe "The super keyword" do
3
+ #
4
+ # it "calls the method on the calling class" do
5
+ # Super::S1::A.new.foo([]).should == ["A#foo", "A#bar"]
6
+ # Super::S1::A.new.bar([]).should == ["A#bar"]
7
+ # Super::S1::B.new.foo([]).should == ["B#foo","A#foo","B#bar","A#bar"]
8
+ # Super::S1::B.new.bar([]).should == ["B#bar", "A#bar"]
9
+ # end
10
+ #
11
+ # it "searches the full inheritence chain" do
12
+ # Super::S2::B.new.foo([]).should == ["B#foo", "A#baz"]
13
+ # Super::S2::B.new.baz([]).should == ["A#baz"]
14
+ # Super::S2::C.new.foo([]).should == ["B#foo","C#baz","A#baz"]
15
+ # Super::S2::C.new.baz([]).should == ["C#baz","A#baz"]
16
+ # end
17
+ #
18
+ # it "searches class methods" do
19
+ # Super::S3::A.new.foo([]).should == ["A#foo"]
20
+ # Super::S3::A.foo([]).should == ["A::foo"]
21
+ # Super::S3::A.bar([]).should == ["A::bar","A::foo"]
22
+ # Super::S3::B.new.foo([]).should == ["A#foo"]
23
+ # Super::S3::B.foo([]).should == ["B::foo","A::foo"]
24
+ # Super::S3::B.bar([]).should == ["B::bar","A::bar","B::foo","A::foo"]
25
+ # end
26
+ # end
@@ -0,0 +1,157 @@
1
+
2
+ describe "The until expression" do
3
+ it "runs while the expression is false" do
4
+ i = 0
5
+ until i > 9
6
+ i = i + 1
7
+ end
8
+
9
+ i.should == 10
10
+ end
11
+
12
+ it "optionally takes a 'do' after the expression" do
13
+ i = 0
14
+ until i > 9 do
15
+ i = i + 1
16
+ end
17
+
18
+ i.should == 10
19
+ end
20
+
21
+ it "allows body begin on the same line if do is used" do
22
+ i = 0
23
+ until i > 9 do i = i + 1
24
+ end
25
+
26
+ i.should == 10
27
+ end
28
+
29
+ it "executes code in containing variable scope" do
30
+ i = 0
31
+ until i == 1
32
+ a = 123
33
+ i = 1
34
+ end
35
+
36
+ a.should == 123
37
+ end
38
+
39
+ it "executes code in containing variable scope with 'do'" do
40
+ i = 0
41
+ until i == 1 do
42
+ a = 123
43
+ i = 1
44
+ end
45
+
46
+ a.should == 123
47
+ end
48
+
49
+ it "returns nil if ended when condition became true" do
50
+ i = 0
51
+ until i > 9
52
+ i = i + 1
53
+ end.should == nil
54
+ end
55
+
56
+ it "evaluates the body if expression is empty" do
57
+ a = []
58
+ until ()
59
+ a << :body_evaluated
60
+ break
61
+ end
62
+ a.should == [:body_evaluated]
63
+ end
64
+
65
+ it "stops running body if interrupted by break" do
66
+ i = 0
67
+ until i > 9
68
+ i = i + 1
69
+ break if i > 5
70
+ end
71
+ i.should == 6
72
+ end
73
+
74
+ it "returns value passed to break if interrupted by break" do
75
+ until false
76
+ break 123
77
+ end.should == 123
78
+ end
79
+
80
+ it "returns nil if interrupted by break with no arguments" do
81
+ until false
82
+ break
83
+ end.should == nil
84
+ end
85
+
86
+ it "skips to end of body with next" do
87
+ a = []
88
+ i = 0
89
+ until (i = i + 1) >= 5
90
+ next if i == 3
91
+ a << i
92
+ end
93
+
94
+ a.should == [1, 2, 4]
95
+ end
96
+
97
+ it "restarts the current iteration without reevaluating condition with redo" do
98
+ a = []
99
+ i = 0
100
+ j = 0
101
+ until (i = i + 1) >= 3
102
+ a << i
103
+ j = j + 1
104
+ redo if j < 3
105
+ end
106
+ a.should == [1, 1, 1, 2]
107
+ end
108
+ end
109
+
110
+ describe "The until modifier" do
111
+ it "runs preceding statement while the condition is false" do
112
+ i = 0
113
+ i = i + 1 until i > 9
114
+ i.should == 10
115
+ end
116
+
117
+ it "evaluates condition before statement execution" do
118
+ a = []
119
+ i = 0
120
+ a << i until (i = i + 1) >= 3
121
+ a.should == [1, 2]
122
+ end
123
+
124
+ it "does not run preceding statement if the condition is true" do
125
+ i = 0
126
+ i = i + 1 until true
127
+ i.should == 0
128
+ end
129
+
130
+ it "returns nil if ended when condition became true" do
131
+ i = 0
132
+ (i = i + 1 until i > 9).should == nil
133
+ end
134
+
135
+ it "returns value passed to break if interrupted by break" do
136
+ (break 123 until false).should == 123
137
+ end
138
+
139
+ it "returns nil if interrupted by break with no arguments" do
140
+ (break until false).should == nil
141
+ end
142
+
143
+ it "skips to end of body with next" do
144
+ i = 0
145
+ j = 0
146
+ (i = i + 1) == 3 ? next : j = j + i until i > 10
147
+ j.should == 63
148
+ end
149
+
150
+ it "restarts the current iteration without reevaluating condition with redo" do
151
+ i = 0
152
+ j = 0
153
+ (i = i + 1) == 4 ? redo : j = j + i until (i = i + 1) > 10
154
+ j.should == 34
155
+ end
156
+ end
157
+
@@ -0,0 +1,163 @@
1
+
2
+ describe "The while expression" do
3
+ it "runs while the expression is true" do
4
+ i = 0
5
+ while i < 3
6
+ i = i + 1
7
+ end
8
+
9
+ i.should == 3
10
+ end
11
+
12
+ it "optionally takes a 'do' after the expression" do
13
+ i = 0
14
+ while i < 3 do
15
+ i = i + 1
16
+ end
17
+
18
+ i.should == 3
19
+ end
20
+
21
+ it "allows body begin on the same line if do is used" do
22
+ i = 0
23
+ while i < 3 do i = i + 1
24
+ end
25
+
26
+ i.should == 3
27
+ end
28
+
29
+ it "executes code in containing variable scope" do
30
+ i = 0
31
+ while i != 1
32
+ a = 123
33
+ i = 1
34
+ end
35
+
36
+ a.should == 123
37
+ end
38
+
39
+ it "executes code in containing variable scope with 'do'" do
40
+ i = 0
41
+ while i != 1 do
42
+ a = 123
43
+ i = 1
44
+ end
45
+
46
+ a.should == 123
47
+ end
48
+
49
+ it "returns nil if ended when condition became false" do
50
+ i = 0
51
+ while i < 3
52
+ i = i + 1
53
+ end.should == nil
54
+ end
55
+
56
+ it "does not evaluate the body if expression is empty" do
57
+ a = []
58
+ while ()
59
+ a << :body_evaluated
60
+ end
61
+ a.should == []
62
+ end
63
+
64
+ it "stops running body if interrupted by break" do
65
+ i = 0
66
+ while i < 10
67
+ i = i + 1
68
+ break if i > 5
69
+ end
70
+
71
+ i.should == 6
72
+ end
73
+
74
+ it "returns value passed to break if interrupted by break" do
75
+ while true
76
+ break 123
77
+ end.should == 123
78
+ end
79
+
80
+ it "returns nil if interrupted by break with no arguments" do
81
+ while true
82
+ break
83
+ end.should == nil
84
+ end
85
+
86
+ it "skips to end of body with next" do
87
+ a = []
88
+ i = 0
89
+ while (i = i + 1) < 5
90
+ next if i == 3
91
+ a << i
92
+ end
93
+
94
+ a.should == [1, 2, 4]
95
+ end
96
+
97
+ it "restarts the current iteration without reevaluating condition with redo" do
98
+ a = []
99
+ i = 0
100
+ j = 0
101
+ while (i = i + 1) < 3
102
+ a << i
103
+ j = j + 1
104
+ redo if j < 3
105
+ end
106
+
107
+ a.should == [1, 1, 1, 2]
108
+ end
109
+ end
110
+
111
+ describe "The while modifier" do
112
+ it "runs preceding statement while the condition is true" do
113
+ i = 0
114
+ i = i + 1 while i < 3
115
+ i.should == 3
116
+ end
117
+
118
+ it "evaluates condition before statement execution" do
119
+ a = []
120
+ i = 0
121
+ a << i while (i = i + 1) < 3
122
+ a.should == [1, 2]
123
+ end
124
+
125
+ it "does not run preceding statement if the condition is false" do
126
+ i = 0
127
+ i = i + 1 while false
128
+ i.should == 0
129
+ end
130
+
131
+ it "does not run preceding statement if the condition is empty" do
132
+ i = 0
133
+ i = i + 1 while ()
134
+ i.should == 0
135
+ end
136
+
137
+ it "returns nil if ended when condition became false" do
138
+ i = 0
139
+ (i = i + 1 while i < 10).should == nil
140
+ end
141
+
142
+ it "returns value passed to break if interrupetd by break" do
143
+ (break 123 while true).should == 123
144
+ end
145
+
146
+ it "returns nil if interrupted by break with no arguments" do
147
+ (break while true).should == nil
148
+ end
149
+
150
+ it "skips to end of body with next" do
151
+ i = 0
152
+ j = 0
153
+ (( i = i + 1) == 3 ? next : j = j + i) while i <= 10
154
+ j.should == 63
155
+ end
156
+
157
+ it "restarts the current iteration without reevaluating condition with redo" do
158
+ i = 0
159
+ j = 0
160
+ (i = i + 1) == 4 ? redo : j = j + i while (i = i + 1) <= 10
161
+ j.should == 34
162
+ end
163
+ end
@@ -0,0 +1,5 @@
1
+ # Usually do this to require our libs, but as we are in opal, these are already
2
+ # included.
3
+ # require File.join(File.dirname(__FILE__), '..', 'lib', 'opal.rb')
4
+
5
+ # puts "in spec helper"
@@ -0,0 +1,68 @@
1
+ # For spec..
2
+ mode :spec do
3
+ # opal must require the spec opal itself. Also, we are the main target, so we
4
+ # can set the bin file aswell (to use the spec's bin ruby file)
5
+ config :runtime,
6
+ :required => [:spec],
7
+ :bin_file => :spec
8
+
9
+ # Configure :spec to include its bin file, so opal can use it
10
+ config :spec,
11
+ :include_bin => true
12
+ end
13
+
14
+ namespace :build do
15
+
16
+ # opal needs a completely custom opal (gem) builder as its not actually an
17
+ # opal..ish...kinda
18
+ task :opal do
19
+
20
+ # puts "building opal for opal"
21
+
22
+ FileUtils.mkdir_p File.dirname(@dst_path)
23
+
24
+ # Get all ruby sources, then sort them (kernel.rb then module.rb then any)
25
+ rb_sources = @build_item.source_items.select do |item|
26
+ item.resource == :ruby
27
+ end
28
+
29
+ # make sure these two are at the start
30
+ ['lib/kernel.rb', 'lib/module.rb'].reverse.each do |order|
31
+ rb_sources.unshift rb_sources.select { |item|
32
+ item.filename == order
33
+ }.first
34
+ end
35
+ # make sure we remove the duplicates left over
36
+ rb_sources.uniq!
37
+
38
+ File.open(@dst_path, 'w') do |out|
39
+ js_sources = %w(pre_opal opal browser debug post_opal)
40
+ js_str = []
41
+
42
+ js_sources.each do |src|
43
+ # puts @target.target_root, 'runtime',
44
+ js_str << File.read(File.join(@target.target_root, 'runtime', "#{src}.js"))
45
+ end
46
+
47
+ out.puts js_str.join
48
+
49
+ # out.puts "var opal = {};"
50
+ # out.puts "(function(global, exports) {"
51
+ # js_sources.each do |js|
52
+ # puts js.filename
53
+ # out.puts File.read(js.stage!.staging_path)
54
+ # end
55
+ # out.puts "})(this.window || global, opal);"
56
+
57
+
58
+
59
+
60
+ rb_sources.each do |rb|
61
+ out.puts "// ##################### #{rb.filename} #####################"
62
+ out.puts "opal.load_raw_file('opal/#{rb.filename}', "
63
+ out.puts File.read(rb.stage!.staging_path)
64
+ out.puts ");"
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,12 @@
1
+ # Opal
2
+
3
+ Opal comprises of the actual ruby runtime, as well as all the core libraries that are default in ruby. This includes the usual {Array}, {String}, {Proc}, {Hash} classes etc.
4
+
5
+ ## Spec
6
+
7
+ Opal also has some (of the many!) specs from RSpec in it's `spec/` directory. Opal attempts to be as sytactially compatible with ruby as possible, so uses the very same specs as vanilla ruby does so completeness can be determined. The specs are accessible from this documentation at [spec/index.html](spec/index.html). This is not the result of the specs, as instead the specs are run in the browser on demand. What you will see is the ruby specs being run within the browser itself, and the results output directly. This also helps determine any errors that happen to be browser specific.
8
+
9
+ ## Debugging
10
+
11
+ Opal, when built in debug mode, contains some useful tools for debugging applications including stack traces and method missing errors.
12
+ See {file:docs/debugging.md debugging documentation} for more.
@@ -0,0 +1,51 @@
1
+ Debugging
2
+ =========
3
+
4
+ As described in other places, the code generated by opal and the vienna build tools is not very easy to read, which can become a problem when debugging errors in code. A lot of the properties and methods added to javascript objects are very unfriendly and are often coded. For example, searching a constant uses the `.cs()` method found on every ruby object, and a long chained command might contain many of these method calls before an error occurs, making it difficult to see what is going on.
5
+
6
+ Stack traces
7
+ ------------
8
+ The ruby stack trace is a great (and often only) place to catch errors. The ruby stack trace lists all the method calls that lead to an error. Opal provides a stack trace, which is available within the browser. Opal additionally adds some extra information on the stack trace. Every method call lists the file and line number that the method implementation is on (in order), but in addition to ruby, opal lists the receiver of the method call (using `inspect`) as well as all the arguments passed to a method. This clearly helps to identify problem code. Inspecting the arguments passed to methods quickly helps to identify where a problem occurred (for example, seeing a `nil` passed into a method is often a good indication that something has gone wrong).
9
+
10
+ ### Example stack trace
11
+
12
+ Create a new project and enter the code into the document. This is an obvious error, but works well to show the problem.
13
+
14
+ def something(a, b)
15
+ raise a
16
+ end
17
+
18
+ def something_a(a, b, c)
19
+ something "adam", [a, b, c]
20
+ end
21
+
22
+ something_a 100, 200, 400
23
+
24
+ Here we know eventually `something` will be called which will raise an error. So on running the given file, the console shows us the following error:
25
+
26
+ !!!plain
27
+ RuntimeError: adam
28
+ from request/request.rb:29:in main.something("adam", [100, 200, 400])
29
+ from request/request.rb:33:in main.something_a(100, 200, 400)
30
+
31
+ The output is clean and simple. The error print out is on the top string. The stack is listed to the left with the filename and line number of each method in the stack. Now, instead of the usual ruby method of just listing the method call, opal lists the receiver (using `inspect`), the method call as expected but also every argument passed to the method (again using `inspect`). It is very easy now to follow what is being passed to what, and where possible errors come from. And, as expected, execution stops on the error.
32
+
33
+ ### Dealing with null and undefined
34
+
35
+ Occasionally, when writing code that talks to javascript objects, it is possible that null and undefined might slip into the ruby side of things. Trying to send messages to either of these will result in an error. To assist in point out these errors, opal marks a method which takes one of these natives as a warning in the stack trace (supported by Firefox, Safari, IE8, Opera, Chrome) as an indication that this might be the root of the problem. It is not always the cause of the problem, as some methods might accept these objects, but it is a useful indication for most circumstances. Also, any object that slips in which is not a ruby object (like a JSON object for instance) will also get marked with this warning. Try the following code to see an example:
36
+
37
+ def some_method(a, b, c)
38
+ puts a
39
+ puts b
40
+ puts c
41
+ end
42
+
43
+ some_method 10, 20, `null`
44
+
45
+ Which should produce the following stack trace:
46
+
47
+ !!!plain
48
+ RuntimeError
49
+ from browser_test.rb:1: in main.some_method(10, 20, <null>)
50
+
51
+ The second output line should be marked in yellow, or however your browser console identifies warnings. Try a different browser if you do not notice a difference.