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.
- data/.gitignore +10 -1
- data/.gitmodules +0 -0
- data/Opalfile +371 -0
- data/README.md +45 -0
- data/Rakefile +237 -34
- data/VERSION +1 -1
- data/bin/opal +13 -0
- data/demos/apps/browser_demo/index.html +11 -0
- data/demos/apps/browser_demo/lib/browser_demo.rb +31 -0
- data/demos/apps/simple_opal/Opalfile +13 -0
- data/demos/apps/simple_opal/index.html +11 -0
- data/demos/apps/simple_opal/lib/app_controller.rb +62 -0
- data/demos/apps/simple_opal/lib/main_window.rb +146 -0
- data/demos/browser/request/index.html +52 -0
- data/demos/browser/request/request.rb +48 -0
- data/gen/browser/__PROJECT_NAME__/index.html +10 -0
- data/gen/browser/__PROJECT_NAME__/lib/__PROJECT_NAME__.rb +1 -0
- data/lib/opal.rb +48 -3
- data/lib/opal/builders/base.rb +50 -0
- data/lib/opal/builders/css.rb +46 -0
- data/lib/opal/builders/javascript.rb +44 -0
- data/lib/opal/builders/opal.rb +79 -0
- data/lib/opal/builders/ruby.rb +50 -0
- data/lib/opal/builders/ruby/generate.rb +1851 -0
- data/lib/opal/builders/ruby/nodes.rb +210 -0
- data/lib/opal/builders/ruby/ruby.rb +916 -0
- data/lib/opal/builders/ruby/ruby_parser.rb +6008 -0
- data/lib/opal/builders/ruby/ruby_parser.rb.y +1451 -0
- data/lib/opal/models/build_item.rb +104 -0
- data/lib/opal/models/hash_struct.rb +40 -0
- data/lib/opal/models/project.rb +215 -0
- data/lib/opal/models/struct_accessors.rb +58 -0
- data/lib/opal/models/target.rb +176 -0
- data/lib/opal/opal/env/console.rb +66 -0
- data/lib/opal/opal/env/fs.rb +98 -0
- data/lib/opal/opal/env/object.rb +48 -0
- data/lib/opal/opal/environment.rb +139 -0
- data/lib/opal/opal/gen.rb +62 -0
- data/lib/opal/opal/opal.rb +68 -0
- data/lib/opal/opal/repl.rb +38 -0
- data/lib/opal/opalfile/dsl.rb +62 -0
- data/lib/opal/opalfile/opalfile.rb +133 -0
- data/lib/opal/opalfile/task.rb +96 -0
- data/lib/opal/opalfile/task_manager.rb +63 -0
- data/lib/opal/opalfile/task_scope.rb +52 -0
- data/lib/opal/rack/app_server.rb +119 -0
- data/opals/aristo/README.md +16 -0
- data/opals/browser/Opalfile +11 -0
- data/opals/browser/README.md +146 -0
- data/opals/browser/SIZZLE_LICESNSE.txt +148 -0
- data/opals/browser/lib/browser.rb +118 -0
- data/opals/browser/lib/browser/builder.rb +41 -0
- data/opals/browser/lib/browser/canvas_context.rb +115 -0
- data/opals/browser/lib/browser/dimensions.rb +50 -0
- data/opals/browser/lib/browser/document.rb +146 -0
- data/opals/browser/lib/browser/element.rb +487 -0
- data/opals/browser/lib/browser/element/attributes.rb +88 -0
- data/opals/browser/lib/browser/element/css.rb +290 -0
- data/opals/browser/lib/browser/element/form.rb +146 -0
- data/opals/browser/lib/browser/event/dom_events.rb +81 -0
- data/opals/browser/lib/browser/event/event.rb +177 -0
- data/opals/browser/lib/browser/event/trigger_events.rb +53 -0
- data/opals/browser/lib/browser/geometry.rb +97 -0
- data/opals/browser/lib/browser/json.rb +32 -0
- data/opals/browser/lib/browser/json_parse.js +321 -0
- data/opals/browser/lib/browser/request/request.rb +201 -0
- data/opals/browser/lib/browser/sizzle.js +1068 -0
- data/opals/browser/lib/browser/string.rb +42 -0
- data/opals/browser/lib/browser/touch.rb +37 -0
- data/{runtime/yaml.js → opals/browser/lib/browser/vml_context.js} +8 -8
- data/opals/browser/lib/browser/window.rb +36 -0
- data/opals/browser/spec/browser/browser_detection_spec.rb +7 -0
- data/opals/browser/spec/document/aref_spec.rb +110 -0
- data/opals/browser/spec/document/ready_spec.rb +16 -0
- data/opals/browser/spec/element/body_spec.rb +11 -0
- data/opals/browser/spec/element/clear_spec.rb +26 -0
- data/opals/browser/spec/element/empty_spec.rb +29 -0
- data/opals/browser/spec/element/has_class_spec.rb +40 -0
- data/opals/browser/spec/element/hidden_spec.rb +23 -0
- data/opals/browser/spec/element/hide_spec.rb +31 -0
- data/opals/browser/spec/element/remove_spec.rb +25 -0
- data/opals/browser/spec/element/show_spec.rb +31 -0
- data/opals/browser/spec/element/style_spec.rb +69 -0
- data/opals/browser/spec/element/toggle_spec.rb +31 -0
- data/opals/browser/spec/element/visible_spec.rb +23 -0
- data/opals/browser/spec/spec_helper.rb +1 -0
- data/opals/cherry_kit/Opalfile +6 -0
- data/opals/cherry_kit/bin/cherry_kit.rb +11 -0
- data/opals/cherry_kit/lib/cherry_kit.rb +29 -0
- data/opals/foundation/Opalfile +11 -0
- data/opals/foundation/bin/foundation.rb +12 -0
- data/opals/foundation/lib/foundation.rb +32 -0
- data/opals/foundation/lib/foundation/__table_view_desktop/outline_view.rb +57 -0
- data/opals/foundation/lib/foundation/__table_view_desktop/table_column.rb +59 -0
- data/opals/foundation/lib/foundation/__table_view_desktop/table_header_view.rb +34 -0
- data/opals/foundation/lib/foundation/__table_view_desktop/table_view.rb +304 -0
- data/opals/foundation/lib/foundation/controllers/array_controller.rb +54 -0
- data/opals/foundation/lib/foundation/controllers/controller.rb +74 -0
- data/opals/foundation/lib/foundation/controllers/controller_selection_proxy.rb +67 -0
- data/opals/foundation/lib/foundation/controllers/object_controller.rb +145 -0
- data/opals/foundation/lib/foundation/controllers/view.rb +40 -0
- data/opals/foundation/lib/foundation/core/application.rb +476 -0
- data/opals/foundation/lib/foundation/core/attributes.rb +146 -0
- data/opals/foundation/lib/foundation/core/bindings.rb +125 -0
- data/opals/foundation/lib/foundation/core/builder.rb +101 -0
- data/opals/foundation/lib/foundation/core/event.rb +112 -0
- data/opals/foundation/lib/foundation/core/index_path.rb +49 -0
- data/opals/foundation/lib/foundation/core/index_set.rb +97 -0
- data/opals/foundation/lib/foundation/core/notification.rb +113 -0
- data/opals/foundation/lib/foundation/core/observable.rb +275 -0
- data/opals/foundation/lib/foundation/core/observable_array.rb +30 -0
- data/opals/foundation/lib/foundation/core/responder.rb +85 -0
- data/opals/foundation/lib/foundation/core/run_loop.rb +89 -0
- data/opals/foundation/lib/foundation/core/touch.rb +95 -0
- data/opals/foundation/lib/foundation/gestures/gesture_recognizer.rb +35 -0
- data/opals/foundation/lib/foundation/rendering/render_context.rb +100 -0
- data/opals/foundation/lib/foundation/rendering/renderer.rb +137 -0
- data/opals/foundation/lib/foundation/rendering/root_theme.rb +77 -0
- data/opals/foundation/lib/foundation/rendering/root_theme/button.rb +62 -0
- data/opals/foundation/lib/foundation/rendering/root_theme/control.rb +72 -0
- data/opals/foundation/lib/foundation/rendering/root_theme/label.rb +54 -0
- data/opals/foundation/lib/foundation/rendering/root_theme/scroller.rb +58 -0
- data/opals/foundation/lib/foundation/rendering/root_theme/slider.rb +72 -0
- data/opals/foundation/lib/foundation/rendering/root_theme/table_view.rb +97 -0
- data/opals/foundation/lib/foundation/rendering/root_theme/text_field.rb +55 -0
- data/opals/foundation/lib/foundation/rendering/root_theme/view.rb +81 -0
- data/opals/foundation/lib/foundation/rendering/theme.rb +38 -0
- data/opals/foundation/lib/foundation/table_view/cell.rb +39 -0
- data/opals/foundation/lib/foundation/table_view/table.rb +171 -0
- data/opals/foundation/lib/foundation/views/button.rb +63 -0
- data/opals/foundation/lib/foundation/views/checkbox.rb +28 -0
- data/opals/foundation/lib/foundation/views/clip.rb +47 -0
- data/opals/foundation/lib/foundation/views/control.rb +199 -0
- data/opals/foundation/lib/foundation/views/label.rb +54 -0
- data/opals/foundation/lib/foundation/views/scroll.rb +294 -0
- data/opals/foundation/lib/foundation/views/scroll_view_desktop.rb +152 -0
- data/opals/foundation/lib/foundation/views/scroller.rb +54 -0
- data/opals/foundation/lib/foundation/views/slider.rb +93 -0
- data/opals/foundation/lib/foundation/views/text_field.rb +83 -0
- data/opals/foundation/lib/foundation/views/view.rb +426 -0
- data/opals/foundation/lib/foundation/windows/window.rb +191 -0
- data/opals/foundation/resources/button/button.css +23 -0
- data/{runtime/init.js → opals/foundation/resources/foundation.css} +27 -33
- data/opals/foundation/resources/scroll/scroll.css +22 -0
- data/opals/foundation/resources/scroll_view/scroll_view.css +3 -0
- data/opals/foundation/resources/scroll_view/scroller.css +3 -0
- data/opals/foundation/resources/slider/regular/slider.css +3 -0
- data/opals/foundation/resources/slider/slider.css +27 -0
- data/opals/foundation/resources/table_view/outline_view.css +3 -0
- data/opals/foundation/resources/table_view/table_view.css +15 -0
- data/opals/foundation/resources/text_field/text_field.css +71 -0
- data/opals/foundation/spec/spec_helper.rb +1 -0
- data/opals/foundation/spec/system/attributes/get_attribute_spec.rb +69 -0
- data/opals/foundation/spec/system/attributes/get_path_spec.rb +44 -0
- data/opals/foundation/spec/system/attributes/set_path_spec.rb +24 -0
- data/opals/foundation/spec/system/attributes/set_spec.rb +58 -0
- data/opals/foundation/spec/system/bindings/bindings.rb +85 -0
- data/opals/foundation/spec/system/key_value_binding/bind_spec.rb +43 -0
- data/opals/foundation/spec/system/observable/dependant_keys_spec.rb +74 -0
- data/opals/foundation/spec/system/observable/observe_spec.rb +292 -0
- data/opals/foundation/spec/system/observable/remove_observer_spec.rb +60 -0
- data/opals/opal/Opalfile +14 -0
- data/opals/opal/spec/core/array/append_spec.rb +30 -0
- data/opals/opal/spec/core/array/assoc_spec.rb +29 -0
- data/opals/opal/spec/core/array/at_spec.rb +37 -0
- data/opals/opal/spec/core/array/clear_spec.rb +22 -0
- data/opals/opal/spec/core/array/collect_bang_spec.rb +27 -0
- data/opals/opal/spec/core/array/collect_spec.rb +27 -0
- data/opals/opal/spec/core/array/compact_spec.rb +15 -0
- data/opals/opal/spec/core/array/concat_spec.rb +15 -0
- data/opals/opal/spec/core/array/constructor_spec.rb +14 -0
- data/opals/opal/spec/core/array/each_spec.rb +9 -0
- data/opals/opal/spec/core/array/element_reference_spec.rb +4 -0
- data/opals/opal/spec/core/array/first_spec.rb +35 -0
- data/opals/opal/spec/core/array/include_spec.rb +9 -0
- data/opals/opal/spec/core/array/map_spec.rb +31 -0
- data/opals/opal/spec/core/builtin_constants/builtin_constants_spec.rb +7 -0
- data/opals/opal/spec/core/false/and_spec.rb +10 -0
- data/opals/opal/spec/core/false/inspect_spec.rb +6 -0
- data/opals/opal/spec/core/false/or_spec.rb +10 -0
- data/opals/opal/spec/core/false/to_s_spec.rb +6 -0
- data/opals/opal/spec/core/false/xor_spec.rb +10 -0
- data/opals/opal/spec/core/file/join_spec.rb +19 -0
- data/opals/opal/spec/core/kernel/instance_eval_spec.rb +0 -0
- data/opals/opal/spec/core/kernel/loop_spec.rb +24 -0
- data/opals/opal/spec/core/kernel/raise_spec.rb +0 -0
- data/opals/opal/spec/core/module/attr_accessor_spec.rb +28 -0
- data/opals/opal/spec/core/number/lt_spec.rb +12 -0
- data/opals/opal/spec/core/true/and_spec.rb +10 -0
- data/opals/opal/spec/core/true/inspect_spec.rb +6 -0
- data/opals/opal/spec/core/true/or_spec.rb +10 -0
- data/opals/opal/spec/core/true/to_s_spec.rb +6 -0
- data/opals/opal/spec/core/true/xor_spec.rb +10 -0
- data/opals/opal/spec/fixtures/super.rb +70 -0
- data/opals/opal/spec/language/____temp_remove_this.rb +12 -0
- data/opals/opal/spec/language/and_spec.rb +62 -0
- data/opals/opal/spec/language/array_spec.rb +52 -0
- data/opals/opal/spec/language/block_spec.rb +18 -0
- data/opals/opal/spec/language/break_spec.rb +36 -0
- data/opals/opal/spec/language/case_spec.rb +103 -0
- data/opals/opal/spec/language/def_spec.rb +11 -0
- data/opals/opal/spec/language/eigenclass_spec.rb +60 -0
- data/opals/opal/spec/language/hash_spec.rb +29 -0
- data/opals/opal/spec/language/if_spec.rb +54 -0
- data/opals/opal/spec/language/loop_spec.rb +11 -0
- data/opals/opal/spec/language/metaclass_spec.rb +21 -0
- data/opals/opal/spec/language/method_spec.rb +64 -0
- data/opals/opal/spec/language/next_spec.rb +25 -0
- data/opals/opal/spec/language/or_spec.rb +34 -0
- data/opals/opal/spec/language/redo_spec.rb +24 -0
- data/opals/opal/spec/language/rescue_spec.rb +20 -0
- data/opals/opal/spec/language/return_spec.rb +47 -0
- data/opals/opal/spec/language/string_spec.rb +25 -0
- data/opals/opal/spec/language/super_spec.rb +26 -0
- data/opals/opal/spec/language/until_spec.rb +157 -0
- data/opals/opal/spec/language/while_spec.rb +163 -0
- data/opals/opal/spec/spec_helper.rb +5 -0
- data/opals/runtime/Opalfile +68 -0
- data/opals/runtime/README.md +12 -0
- data/opals/runtime/docs/debugging.md +51 -0
- data/opals/runtime/lib/array.rb +1516 -0
- data/opals/runtime/lib/basic_object.rb +49 -0
- data/opals/runtime/lib/class.rb +54 -0
- data/opals/runtime/lib/dir.rb +36 -0
- data/opals/runtime/lib/error.rb +49 -0
- data/opals/runtime/lib/false_class.rb +52 -0
- data/opals/runtime/lib/file.rb +79 -0
- data/opals/runtime/lib/hash.rb +791 -0
- data/opals/runtime/lib/io.rb +39 -0
- data/opals/runtime/lib/kernel.rb +288 -0
- data/opals/runtime/lib/match_data.rb +36 -0
- data/opals/runtime/lib/module.rb +109 -0
- data/opals/runtime/lib/nil_class.rb +69 -0
- data/opals/runtime/lib/number.rb +398 -0
- data/opals/runtime/lib/proc.rb +77 -0
- data/opals/runtime/lib/range.rb +63 -0
- data/opals/runtime/lib/regexp.rb +111 -0
- data/opals/runtime/lib/ruby.rb +30 -0
- data/opals/runtime/lib/string.rb +328 -0
- data/opals/runtime/lib/symbol.rb +40 -0
- data/opals/runtime/lib/top_self.rb +33 -0
- data/opals/runtime/lib/true_class.rb +45 -0
- data/opals/runtime/runtime/browser.js +287 -0
- data/opals/runtime/runtime/debug.js +182 -0
- data/opals/runtime/runtime/opal.js +1010 -0
- data/opals/runtime/runtime/post_opal.js +1 -0
- data/opals/runtime/runtime/pre_opal.js +2 -0
- data/opals/runtime/runtime/server_side.js +50 -0
- data/opals/spec/LICENSE.txt +26 -0
- data/opals/spec/Opalfile +5 -0
- data/opals/spec/bin/spec.rb +43 -0
- data/opals/spec/lib/spec.rb +33 -0
- data/opals/spec/lib/spec/dsl.rb +41 -0
- data/opals/spec/lib/spec/example.rb +35 -0
- data/opals/spec/lib/spec/example/before_and_after_hooks.rb +81 -0
- data/opals/spec/lib/spec/example/errors.rb +42 -0
- data/opals/spec/lib/spec/example/example_group.rb +37 -0
- data/opals/spec/lib/spec/example/example_group_factory.rb +43 -0
- data/opals/spec/lib/spec/example/example_group_hierarchy.rb +45 -0
- data/opals/spec/lib/spec/example/example_group_methods.rb +142 -0
- data/opals/spec/lib/spec/example/example_group_proxy.rb +41 -0
- data/opals/spec/lib/spec/example/example_methods.rb +73 -0
- data/opals/spec/lib/spec/example/example_proxy.rb +48 -0
- data/opals/spec/lib/spec/expectations.rb +46 -0
- data/opals/spec/lib/spec/expectations/errors.rb +35 -0
- data/opals/spec/lib/spec/expectations/fail_with.rb +37 -0
- data/opals/spec/lib/spec/expectations/handler.rb +48 -0
- data/opals/spec/lib/spec/matchers.rb +50 -0
- data/opals/spec/lib/spec/matchers/be.rb +26 -0
- data/opals/spec/lib/spec/matchers/generated_descriptions.rb +47 -0
- data/opals/spec/lib/spec/matchers/operator_matcher.rb +66 -0
- data/opals/spec/lib/spec/runner.rb +48 -0
- data/opals/spec/lib/spec/runner/example_group_runner.rb +71 -0
- data/opals/spec/lib/spec/runner/formatter/html_formatter.rb +100 -0
- data/opals/spec/lib/spec/runner/formatter/terminal_formatter.rb +82 -0
- data/opals/spec/lib/spec/runner/options.rb +63 -0
- data/opals/spec/lib/spec/runner/reporter.rb +123 -0
- data/opals/spec/resources/index.html +25 -0
- data/opals/spec/resources/spec.css +132 -0
- data/spec/cherry_kit/iseq_spec.rb +38 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/vienna_spec.rb +7 -0
- data/yard/index.html +43 -0
- data/yard/style.css +765 -0
- metadata +312 -49
- data/docs/jarv.rdoc +0 -27
- data/runtime/array.js +0 -153
- data/runtime/class.js +0 -469
- data/runtime/compar.js +0 -73
- data/runtime/dir.js +0 -115
- data/runtime/enum.js +0 -74
- data/runtime/file.js +0 -165
- data/runtime/gem.js +0 -241
- data/runtime/hash.js +0 -181
- data/runtime/load.js +0 -251
- data/runtime/module.js +0 -98
- data/runtime/number.js +0 -148
- data/runtime/object.js +0 -522
- data/runtime/opal.js +0 -200
- data/runtime/parse.js +0 -2218
- data/runtime/range.js +0 -56
- data/runtime/re.js +0 -91
- data/runtime/string.js +0 -199
- data/runtime/variable.js +0 -184
- data/runtime/vm.js +0 -1150
- 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,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.
|