opal 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -10
- data/LICENSE +75 -0
- data/README.md +55 -3
- data/Rakefile +62 -139
- data/bin/opal +7 -10
- data/gems/core/README.md +5 -0
- data/gems/core/Rakefile +7 -0
- data/gems/core/core.gemspec +13 -0
- data/gems/core/lib/core.rb +33 -0
- data/gems/core/lib/core/array.rb +1470 -0
- data/gems/core/lib/core/basic_object.rb +15 -0
- data/gems/core/lib/core/class.rb +31 -0
- data/gems/core/lib/core/dir.rb +26 -0
- data/gems/core/lib/core/error.rb +43 -0
- data/gems/core/lib/core/false_class.rb +21 -0
- data/gems/core/lib/core/file.rb +54 -0
- data/gems/core/lib/core/hash.rb +725 -0
- data/gems/core/lib/core/kernel.rb +240 -0
- data/gems/core/lib/core/module.rb +98 -0
- data/gems/core/lib/core/nil_class.rb +41 -0
- data/gems/core/lib/core/numeric.rb +370 -0
- data/gems/core/lib/core/proc.rb +11 -0
- data/gems/core/lib/core/range.rb +17 -0
- data/gems/core/lib/core/regexp.rb +18 -0
- data/gems/core/lib/core/string.rb +328 -0
- data/gems/core/lib/core/symbol.rb +15 -0
- data/gems/core/lib/core/top_self.rb +8 -0
- data/gems/core/lib/core/true_class.rb +20 -0
- data/gems/core/lib/core/vm.rb +16 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/append_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/assoc_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/at_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/clear_spec.rb +1 -1
- data/{opals/opal/opal → gems/core}/spec/core/array/collect_bang_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/collect_spec.rb +0 -0
- data/gems/core/spec/core/array/compact_spec.rb +41 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/concat_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/constructor_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/each_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/element_reference_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/first_spec.rb +1 -1
- data/{opals/opal/opal → gems/core}/spec/core/array/include_spec.rb +0 -0
- data/gems/core/spec/core/array/join_spec.rb +6 -0
- data/gems/core/spec/core/array/last_spec.rb +51 -0
- data/gems/core/spec/core/array/length_spec.rb +6 -0
- data/{opals/opal/opal → gems/core}/spec/core/array/map_spec.rb +2 -0
- data/gems/core/spec/core/array/reverse_spec.rb +6 -0
- data/{opals/opal/opal → gems/core}/spec/core/builtin_constants/builtin_constants_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/false/and_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/false/inspect_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/false/or_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/false/to_s_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/false/xor_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/file/join_spec.rb +1 -1
- data/gems/core/spec/core/hash/assoc_spec.rb +32 -0
- data/{opals/opal/opal → gems/core}/spec/core/kernel/instance_eval_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/kernel/loop_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/kernel/raise_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/module/attr_accessor_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/number/lt_spec.rb +0 -0
- data/gems/core/spec/core/string/sub_spec.rb +24 -0
- data/{opals/opal/opal → gems/core}/spec/core/true/and_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/true/inspect_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/true/or_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/true/to_s_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/core/true/xor_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/language/and_spec.rb +2 -3
- data/{opals/opal/opal → gems/core}/spec/language/array_spec.rb +21 -5
- data/gems/core/spec/language/block_spec.rb +38 -0
- data/{opals/opal/opal → gems/core}/spec/language/break_spec.rb +0 -0
- data/gems/core/spec/language/case_spec.rb +103 -0
- data/{opals/opal/opal → gems/core}/spec/language/def_spec.rb +11 -1
- data/{opals/opal/opal → gems/core}/spec/language/eigenclass_spec.rb +0 -0
- data/gems/core/spec/language/file_spec.rb +13 -0
- data/gems/core/spec/language/fixtures/block.rb +21 -0
- data/gems/core/spec/language/fixtures/super.rb +293 -0
- data/{opals/opal/opal → gems/core}/spec/language/hash_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/language/if_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/language/loop_spec.rb +0 -0
- data/gems/core/spec/language/metaclass_spec.rb +21 -0
- data/{opals/opal/opal → gems/core}/spec/language/method_spec.rb +60 -0
- data/{opals/opal/opal → gems/core}/spec/language/next_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/language/or_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/language/redo_spec.rb +0 -0
- data/gems/core/spec/language/regexp_spec.rb +26 -0
- data/{opals/opal/opal → gems/core}/spec/language/rescue_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/language/return_spec.rb +0 -0
- data/{opals/opal/opal → gems/core}/spec/language/string_spec.rb +0 -0
- data/gems/core/spec/language/super_spec.rb +32 -0
- data/{opals/opal/opal → gems/core}/spec/language/until_spec.rb +47 -47
- data/gems/core/spec/language/variables_spec.rb +155 -0
- data/{opals/opal/opal → gems/core}/spec/language/while_spec.rb +47 -47
- data/{opals/opal/opal → gems/core}/spec/spec_helper.rb +1 -1
- data/gems/core_fs/README.md +19 -0
- data/gems/dev/Rakefile +5 -0
- data/gems/dev/lib/dev.js +99 -0
- data/gems/dev/lib/dev/generator.js +1264 -0
- data/gems/dev/lib/dev/parser.js +979 -0
- data/gems/dev/lib/dev/ruby_parser.js +1088 -0
- data/gems/dev/lib/dev/ruby_parser.y +1267 -0
- data/gems/dev/lib/dev/string_scanner.js +38 -0
- data/gems/dev/tools/racc2js/README.md +39 -0
- data/gems/dev/tools/racc2js/math_parser.js +222 -0
- data/gems/dev/tools/racc2js/math_parser.rb +133 -0
- data/gems/dev/tools/racc2js/math_parser.y +28 -0
- data/gems/dev/tools/racc2js/parser.js +218 -0
- data/gems/dev/tools/racc2js/racc2js.rb +153 -0
- data/gems/json/README.md +4 -0
- data/gems/json/json.gemspec +14 -0
- data/gems/json/lib/json.rb +64 -0
- data/gems/json/lib/json/ext.rb +51 -0
- data/{opals/opal/browser/lib/browser/json_parse.js → gems/json/lib/json/json2.js} +197 -37
- data/gems/ospec/README.md +0 -0
- data/gems/ospec/lib/ospec.rb +6 -0
- data/gems/ospec/lib/ospec/autorun.rb +3 -0
- data/gems/ospec/lib/ospec/dsl.rb +15 -0
- data/gems/ospec/lib/ospec/example.rb +11 -0
- data/gems/ospec/lib/ospec/example/before_and_after_hooks.rb +56 -0
- data/gems/ospec/lib/ospec/example/errors.rb +17 -0
- data/gems/ospec/lib/ospec/example/example_group.rb +12 -0
- data/gems/ospec/lib/ospec/example/example_group_factory.rb +21 -0
- data/gems/ospec/lib/ospec/example/example_group_hierarchy.rb +20 -0
- data/{opals/opal/spec/lib/spec → gems/ospec/lib/ospec}/example/example_group_methods.rb +26 -68
- data/gems/ospec/lib/ospec/example/example_group_proxy.rb +14 -0
- data/gems/ospec/lib/ospec/example/example_methods.rb +46 -0
- data/gems/ospec/lib/ospec/example/example_proxy.rb +18 -0
- data/gems/ospec/lib/ospec/expectations.rb +19 -0
- data/gems/ospec/lib/ospec/expectations/errors.rb +8 -0
- data/gems/ospec/lib/ospec/expectations/fail_with.rb +8 -0
- data/gems/ospec/lib/ospec/expectations/handler.rb +27 -0
- data/gems/ospec/lib/ospec/matchers.rb +24 -0
- data/{opals/opal/Rakefile → gems/ospec/lib/ospec/matchers/be.rb} +0 -0
- data/gems/ospec/lib/ospec/matchers/generated_descriptions.rb +20 -0
- data/gems/ospec/lib/ospec/matchers/operator_matcher.rb +52 -0
- data/gems/ospec/lib/ospec/runner.rb +40 -0
- data/gems/ospec/lib/ospec/runner/example_group_runner.rb +44 -0
- data/{opals/opal/spec/lib/spec → gems/ospec/lib/ospec}/runner/formatter/html_formatter.rb +31 -40
- data/gems/ospec/lib/ospec/runner/formatter/terminal_formatter.rb +48 -0
- data/gems/ospec/lib/ospec/runner/options.rb +36 -0
- data/{opals/opal/spec/lib/spec → gems/ospec/lib/ospec}/runner/reporter.rb +23 -55
- data/gems/ospec/ospec.gemspec +0 -0
- data/gems/rquery/README.md +9 -0
- data/gems/rquery/lib/rquery.rb +10 -0
- data/gems/rquery/lib/rquery/ajax.rb +4 -0
- data/gems/rquery/lib/rquery/css.rb +96 -0
- data/gems/rquery/lib/rquery/document.rb +25 -0
- data/gems/rquery/lib/rquery/element.rb +292 -0
- data/gems/rquery/lib/rquery/event.rb +108 -0
- data/gems/rquery/lib/rquery/jquery.js +8177 -0
- data/gems/rquery/lib/rquery/request.rb +138 -0
- data/gems/rquery/lib/rquery/response.rb +49 -0
- data/gems/rquery/rquery.gemspec +16 -0
- data/lib/opal.js +1597 -0
- data/lib/opal.rb +6 -69
- data/lib/opal/builder.rb +115 -0
- data/lib/opal/bundle.rb +131 -0
- data/lib/opal/command.rb +11 -0
- data/lib/opal/context.rb +69 -0
- data/lib/opal/context/console.rb +12 -0
- data/lib/opal/context/file_system.rb +19 -0
- data/lib/opal/context/loader.rb +117 -0
- data/lib/opal/gem.rb +153 -0
- data/lib/opal/ruby/nodes.rb +1302 -0
- data/lib/opal/ruby/parser.rb +780 -0
- data/lib/opal/ruby/ruby_parser.rb +5170 -0
- data/lib/opal/ruby/ruby_parser.y +1298 -0
- data/opal.gemspec +11 -256
- metadata +179 -240
- data/.gitmodules +0 -6
- data/Opalfile +0 -384
- data/VERSION +0 -1
- data/demos/apps/browser_demo/index.html +0 -11
- data/demos/apps/browser_demo/lib/browser_demo.rb +0 -31
- data/demos/apps/simple_opal/Opalfile +0 -13
- data/demos/apps/simple_opal/index.html +0 -11
- data/demos/apps/simple_opal/lib/app_controller.rb +0 -62
- data/demos/apps/simple_opal/lib/main_window.rb +0 -146
- data/demos/browser/request/index.html +0 -52
- data/demos/browser/request/request.rb +0 -48
- data/gen/browser/__PROJECT_NAME__/Rakefile +0 -12
- data/gen/browser/__PROJECT_NAME__/index.html +0 -11
- data/gen/browser/__PROJECT_NAME__/javascripts/opal.debug.js +0 -4687
- data/gen/browser/__PROJECT_NAME__/javascripts/opal.min.js +0 -175
- data/gen/browser/__PROJECT_NAME__/lib/__PROJECT_NAME__.rb +0 -1
- data/lib/opal/builders/base.rb +0 -50
- data/lib/opal/builders/css.rb +0 -46
- data/lib/opal/builders/javascript.rb +0 -44
- data/lib/opal/builders/opal.rb +0 -79
- data/lib/opal/builders/ruby.rb +0 -50
- data/lib/opal/builders/ruby/generate.rb +0 -1851
- data/lib/opal/builders/ruby/nodes.rb +0 -210
- data/lib/opal/builders/ruby/ruby.rb +0 -916
- data/lib/opal/builders/ruby/ruby_parser.rb +0 -6008
- data/lib/opal/builders/ruby/ruby_parser.rb.y +0 -1451
- data/lib/opal/models/build_item.rb +0 -104
- data/lib/opal/models/hash_struct.rb +0 -40
- data/lib/opal/models/project.rb +0 -252
- data/lib/opal/models/struct_accessors.rb +0 -58
- data/lib/opal/models/target.rb +0 -176
- data/lib/opal/opal/build.rb +0 -169
- data/lib/opal/opal/env/console.rb +0 -66
- data/lib/opal/opal/env/fs.rb +0 -98
- data/lib/opal/opal/env/object.rb +0 -48
- data/lib/opal/opal/environment.rb +0 -139
- data/lib/opal/opal/gen.rb +0 -62
- data/lib/opal/opal/opal.rb +0 -75
- data/lib/opal/opal/repl.rb +0 -38
- data/lib/opal/opalfile/dsl.rb +0 -62
- data/lib/opal/opalfile/opalfile.rb +0 -133
- data/lib/opal/opalfile/task.rb +0 -96
- data/lib/opal/opalfile/task_manager.rb +0 -63
- data/lib/opal/opalfile/task_scope.rb +0 -52
- data/lib/opal/rack/app_server.rb +0 -119
- data/lib/opal/rake/opal_task.rb +0 -34
- data/opals/opal/README.md +0 -37
- data/opals/opal/browser/Opalfile +0 -11
- data/opals/opal/browser/README.md +0 -146
- data/opals/opal/browser/SIZZLE_LICESNSE.txt +0 -148
- data/opals/opal/browser/lib/browser.rb +0 -118
- data/opals/opal/browser/lib/browser/builder.rb +0 -41
- data/opals/opal/browser/lib/browser/canvas_context.rb +0 -115
- data/opals/opal/browser/lib/browser/dimensions.rb +0 -50
- data/opals/opal/browser/lib/browser/document.rb +0 -146
- data/opals/opal/browser/lib/browser/element.rb +0 -487
- data/opals/opal/browser/lib/browser/element/attributes.rb +0 -88
- data/opals/opal/browser/lib/browser/element/css.rb +0 -290
- data/opals/opal/browser/lib/browser/element/form.rb +0 -146
- data/opals/opal/browser/lib/browser/event/dom_events.rb +0 -81
- data/opals/opal/browser/lib/browser/event/event.rb +0 -177
- data/opals/opal/browser/lib/browser/event/trigger_events.rb +0 -53
- data/opals/opal/browser/lib/browser/geometry.rb +0 -97
- data/opals/opal/browser/lib/browser/json.rb +0 -32
- data/opals/opal/browser/lib/browser/request/request.rb +0 -201
- data/opals/opal/browser/lib/browser/sizzle.js +0 -1068
- data/opals/opal/browser/lib/browser/string.rb +0 -42
- data/opals/opal/browser/lib/browser/touch.rb +0 -37
- data/opals/opal/browser/lib/browser/vml_context.js +0 -33
- data/opals/opal/browser/lib/browser/window.rb +0 -36
- data/opals/opal/browser/spec/browser/browser_detection_spec.rb +0 -7
- data/opals/opal/browser/spec/document/aref_spec.rb +0 -110
- data/opals/opal/browser/spec/document/ready_spec.rb +0 -16
- data/opals/opal/browser/spec/element/body_spec.rb +0 -11
- data/opals/opal/browser/spec/element/clear_spec.rb +0 -26
- data/opals/opal/browser/spec/element/empty_spec.rb +0 -29
- data/opals/opal/browser/spec/element/has_class_spec.rb +0 -40
- data/opals/opal/browser/spec/element/hidden_spec.rb +0 -23
- data/opals/opal/browser/spec/element/hide_spec.rb +0 -31
- data/opals/opal/browser/spec/element/remove_spec.rb +0 -25
- data/opals/opal/browser/spec/element/show_spec.rb +0 -31
- data/opals/opal/browser/spec/element/style_spec.rb +0 -69
- data/opals/opal/browser/spec/element/toggle_spec.rb +0 -31
- data/opals/opal/browser/spec/element/visible_spec.rb +0 -23
- data/opals/opal/browser/spec/spec_helper.rb +0 -1
- data/opals/opal/opal/Opalfile +0 -14
- data/opals/opal/opal/spec/core/array/compact_spec.rb +0 -15
- data/opals/opal/opal/spec/fixtures/super.rb +0 -70
- data/opals/opal/opal/spec/language/____temp_remove_this.rb +0 -12
- data/opals/opal/opal/spec/language/block_spec.rb +0 -18
- data/opals/opal/opal/spec/language/case_spec.rb +0 -103
- data/opals/opal/opal/spec/language/metaclass_spec.rb +0 -21
- data/opals/opal/opal/spec/language/super_spec.rb +0 -26
- data/opals/opal/runtime/Opalfile +0 -78
- data/opals/opal/runtime/README.md +0 -12
- data/opals/opal/runtime/docs/debugging.md +0 -51
- data/opals/opal/runtime/lib/array.rb +0 -1516
- data/opals/opal/runtime/lib/basic_object.rb +0 -49
- data/opals/opal/runtime/lib/class.rb +0 -54
- data/opals/opal/runtime/lib/dir.rb +0 -36
- data/opals/opal/runtime/lib/error.rb +0 -49
- data/opals/opal/runtime/lib/false_class.rb +0 -52
- data/opals/opal/runtime/lib/file.rb +0 -79
- data/opals/opal/runtime/lib/hash.rb +0 -791
- data/opals/opal/runtime/lib/io.rb +0 -39
- data/opals/opal/runtime/lib/kernel.rb +0 -288
- data/opals/opal/runtime/lib/match_data.rb +0 -36
- data/opals/opal/runtime/lib/module.rb +0 -109
- data/opals/opal/runtime/lib/nil_class.rb +0 -69
- data/opals/opal/runtime/lib/number.rb +0 -398
- data/opals/opal/runtime/lib/proc.rb +0 -77
- data/opals/opal/runtime/lib/range.rb +0 -63
- data/opals/opal/runtime/lib/regexp.rb +0 -111
- data/opals/opal/runtime/lib/ruby.rb +0 -30
- data/opals/opal/runtime/lib/string.rb +0 -328
- data/opals/opal/runtime/lib/symbol.rb +0 -40
- data/opals/opal/runtime/lib/top_self.rb +0 -33
- data/opals/opal/runtime/lib/true_class.rb +0 -45
- data/opals/opal/runtime/runtime/browser.js +0 -287
- data/opals/opal/runtime/runtime/debug.js +0 -180
- data/opals/opal/runtime/runtime/opal.js +0 -1008
- data/opals/opal/runtime/runtime/post_opal.js +0 -1
- data/opals/opal/runtime/runtime/pre_opal.js +0 -2
- data/opals/opal/runtime/runtime/server_side.js +0 -50
- data/opals/opal/spec/LICENSE.txt +0 -26
- data/opals/opal/spec/Opalfile +0 -5
- data/opals/opal/spec/bin/spec.rb +0 -43
- data/opals/opal/spec/lib/spec.rb +0 -33
- data/opals/opal/spec/lib/spec/dsl.rb +0 -41
- data/opals/opal/spec/lib/spec/example.rb +0 -35
- data/opals/opal/spec/lib/spec/example/before_and_after_hooks.rb +0 -81
- data/opals/opal/spec/lib/spec/example/errors.rb +0 -42
- data/opals/opal/spec/lib/spec/example/example_group.rb +0 -37
- data/opals/opal/spec/lib/spec/example/example_group_factory.rb +0 -43
- data/opals/opal/spec/lib/spec/example/example_group_hierarchy.rb +0 -45
- data/opals/opal/spec/lib/spec/example/example_group_proxy.rb +0 -41
- data/opals/opal/spec/lib/spec/example/example_methods.rb +0 -73
- data/opals/opal/spec/lib/spec/example/example_proxy.rb +0 -48
- data/opals/opal/spec/lib/spec/expectations.rb +0 -46
- data/opals/opal/spec/lib/spec/expectations/errors.rb +0 -35
- data/opals/opal/spec/lib/spec/expectations/fail_with.rb +0 -37
- data/opals/opal/spec/lib/spec/expectations/handler.rb +0 -48
- data/opals/opal/spec/lib/spec/matchers.rb +0 -50
- data/opals/opal/spec/lib/spec/matchers/be.rb +0 -26
- data/opals/opal/spec/lib/spec/matchers/generated_descriptions.rb +0 -47
- data/opals/opal/spec/lib/spec/matchers/operator_matcher.rb +0 -66
- data/opals/opal/spec/lib/spec/runner.rb +0 -48
- data/opals/opal/spec/lib/spec/runner/example_group_runner.rb +0 -71
- data/opals/opal/spec/lib/spec/runner/formatter/terminal_formatter.rb +0 -82
- data/opals/opal/spec/lib/spec/runner/options.rb +0 -63
- data/opals/opal/spec/resources/index.html +0 -25
- data/opals/opal/spec/resources/spec.css +0 -132
- data/spec/cherry_kit/iseq_spec.rb +0 -38
- data/spec/spec_helper.rb +0 -16
- data/spec/vienna_spec.rb +0 -7
- data/yard/index.html +0 -43
- data/yard/style.css +0 -765
data/lib/opal.rb
CHANGED
@@ -1,75 +1,12 @@
|
|
1
|
-
#
|
2
|
-
# vienna.rb
|
3
|
-
# vienna
|
4
|
-
#
|
5
|
-
# Created by Adam Beynon.
|
6
|
-
# Copyright 2010 Adam Beynon.
|
7
|
-
#
|
8
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
9
|
-
# of this software and associated documentation files (the "Software"), to deal
|
10
|
-
# in the Software without restriction, including without limitation the rights
|
11
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12
|
-
# copies of the Software, and to permit persons to whom the Software is
|
13
|
-
# furnished to do so, subject to the following conditions:
|
14
|
-
#
|
15
|
-
# The above copyright notice and this permission notice shall be included in
|
16
|
-
# all copies or substantial portions of the Software.
|
17
|
-
#
|
18
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24
|
-
# THE SOFTWARE.
|
25
|
-
#
|
26
|
-
|
27
|
-
require 'fileutils'
|
28
|
-
require 'base64'
|
29
1
|
require 'rubygems'
|
30
2
|
|
31
|
-
module
|
32
|
-
|
33
|
-
# :stopdoc:
|
34
|
-
VERSION = '0.2.0'
|
35
|
-
LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
|
36
|
-
PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
|
37
|
-
# :startdoc:
|
38
|
-
|
39
|
-
# Returns the version string for the library.
|
40
|
-
#
|
41
|
-
def self.version
|
42
|
-
VERSION
|
43
|
-
end
|
44
|
-
|
45
|
-
# Returns the library path for the module. If any arguments are given,
|
46
|
-
# they will be joined to the end of the libray path using
|
47
|
-
# <tt>File.join</tt>.
|
48
|
-
#
|
49
|
-
def self.libpath( *args )
|
50
|
-
args.empty? ? LIBPATH : ::File.join(LIBPATH, args.flatten)
|
51
|
-
end
|
3
|
+
module Opal
|
52
4
|
|
53
|
-
|
54
|
-
# they will be joined to the end of the path using
|
55
|
-
# <tt>File.join</tt>.
|
56
|
-
#
|
57
|
-
def self.path( *args )
|
58
|
-
args.empty? ? PATH : ::File.join(PATH, args.flatten)
|
59
|
-
end
|
5
|
+
end
|
60
6
|
|
61
|
-
|
62
|
-
# directory below this file that has the same name as the filename passed
|
63
|
-
# in. Optionally, a specific _directory_ name can be passed in such that
|
64
|
-
# the _filename_ does not have to be equivalent to the directory.
|
65
|
-
#
|
66
|
-
def self.require_all_libs_relative_to( fname, dir = nil )
|
67
|
-
dir ||= ::File.basename(fname, '.*')
|
68
|
-
search_me = ::File.expand_path(
|
69
|
-
::File.join(::File.dirname(fname), dir, '**', '*.rb'))
|
7
|
+
require 'opal/ruby/parser'
|
70
8
|
|
71
|
-
|
72
|
-
|
73
|
-
|
9
|
+
require 'opal/gem'
|
10
|
+
require 'opal/bundle'
|
11
|
+
require 'opal/builder'
|
74
12
|
|
75
|
-
Vienna.require_all_libs_relative_to(__FILE__)
|
data/lib/opal/builder.rb
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Opal
|
4
|
+
# Builder is used for compiling simple ruby files into javascript files
|
5
|
+
# through the command line or a rake task. It is used for non bundle based
|
6
|
+
# building systems, and is meant for building small scale pages rather than
|
7
|
+
# applications.
|
8
|
+
class Builder
|
9
|
+
# Takes a hash of build options.
|
10
|
+
#
|
11
|
+
# :project_dir - The base directory to work in. If not given then cwd is used.
|
12
|
+
#
|
13
|
+
# :files - May be a single source, a directory, or an array of ruby/js src
|
14
|
+
#
|
15
|
+
# :out - The output file. All sources are built into a single output file.
|
16
|
+
# If this is not given, it will default to project_dir/javascripts/name.js
|
17
|
+
# where name is the basename of the given project_dir or cwd.
|
18
|
+
#
|
19
|
+
# :main - only useful when more than one input is given to determine which
|
20
|
+
# file is automatically loaded on running in the browser.
|
21
|
+
#
|
22
|
+
# :watch - watch all sources and automatically recompile if one changes
|
23
|
+
#
|
24
|
+
# Also, if no output is given, then one file will be used for all sources,
|
25
|
+
# and the files name will be taken as the basename of the root_dir/cwd.
|
26
|
+
#
|
27
|
+
# @param {Hash} options Build options to use
|
28
|
+
def initialize(options = {})
|
29
|
+
@project_dir = options[:project_dir] || Dir.getwd
|
30
|
+
@project_name = File.basename @project_dir
|
31
|
+
|
32
|
+
out = options[:out] || File.join('javascripts', "#@project_name.js")
|
33
|
+
@out = File.join @project_dir, out
|
34
|
+
FileUtils.mkdir_p File.dirname(@out)
|
35
|
+
|
36
|
+
files = options[:files] || []
|
37
|
+
@files = []
|
38
|
+
|
39
|
+
if Array === files
|
40
|
+
files.each do |file|
|
41
|
+
@files << file
|
42
|
+
end
|
43
|
+
else
|
44
|
+
Dir.glob(File.join(@project_dir, files)) do |file|
|
45
|
+
@files << file
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
@watch = options[:watch]
|
50
|
+
|
51
|
+
raise "Opal::Builder - No input files!" if @files.empty?
|
52
|
+
end
|
53
|
+
|
54
|
+
# Actually build the simple builder. This is simply used as a looper to
|
55
|
+
# rebuild if a source file changes. The trigger for a rebuild is when a
|
56
|
+
# source file changes. So on each loop, we check if any source file has
|
57
|
+
# a newer mtime than the destination file.
|
58
|
+
def build
|
59
|
+
rebuild
|
60
|
+
if @watch
|
61
|
+
puts "Watching for changes.."
|
62
|
+
loop do
|
63
|
+
out_mtime = File.stat(@out).mtime
|
64
|
+
@files.each do |file|
|
65
|
+
if File.stat(file).mtime > out_mtime
|
66
|
+
puts "#{Time.now} rebuilding - changes detected in #{file}"
|
67
|
+
rebuild
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
begin
|
72
|
+
sleep 1
|
73
|
+
rescue Interrupt
|
74
|
+
exit 0
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Does the actual rebuild of a project
|
81
|
+
def rebuild
|
82
|
+
File.open(@out, 'w') do |out|
|
83
|
+
@files.each do |file|
|
84
|
+
out.write wrap_source file
|
85
|
+
end
|
86
|
+
main = File.basename(@files.first).sub(/\.rb/, '')
|
87
|
+
out.write "opal.require('#{main}');\n"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# Returns the result of the compiled file ready for opal to load
|
92
|
+
#
|
93
|
+
# @return {String}
|
94
|
+
def wrap_source(path)
|
95
|
+
ext_name = File.extname path
|
96
|
+
|
97
|
+
content = case ext_name
|
98
|
+
when '.js'
|
99
|
+
source = File.read path
|
100
|
+
"function(VM, self, __FILE__) { #{source} }"
|
101
|
+
|
102
|
+
when '.rb'
|
103
|
+
source = Opal::RubyParser.new(File.read(path)).parse!.generate_top
|
104
|
+
path = path.sub(/\.rb/, '.js')
|
105
|
+
"function(VM, self, __FILE__) { #{source} }"
|
106
|
+
|
107
|
+
else
|
108
|
+
raise "Bad file type for wrapping. Must be ruby or javascript"
|
109
|
+
end
|
110
|
+
|
111
|
+
"opal.register('#{File.basename path}', #{content});\n"
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
data/lib/opal/bundle.rb
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
module Opal
|
2
|
+
|
3
|
+
# The Bundle class is used to bundle a package, and optionally all of its
|
4
|
+
# dependencies and the base opal boot file into a js file ready for browser
|
5
|
+
# deployment. It takes a package, and a set of options, and simply returns a
|
6
|
+
# combined string of the built packages.
|
7
|
+
#
|
8
|
+
# This does not yet support building resources from the packages. Just the
|
9
|
+
# basic package building works.
|
10
|
+
#
|
11
|
+
# The following options are supported:
|
12
|
+
#
|
13
|
+
# - `:dependencies` - An array of additional dependencies to add that may not
|
14
|
+
# be listed in the .gemspec. This is used, for example, to include opalspec
|
15
|
+
# into test builds so that opalspec does not need to be a dependency in all
|
16
|
+
# build environments.
|
17
|
+
# - `:main` - The file to run in the browser. An example may be
|
18
|
+
# 'vienna/autorun'. Note this is not a bin file, and should be a simple lib
|
19
|
+
# file that will be in the load path.
|
20
|
+
# - `:bin` - Alternatively, a bin file listed within a gem that should be
|
21
|
+
# included, and then run within the browser. An example would be
|
22
|
+
# 'vienna/vienna', where the first part is the gem containing the bin file,
|
23
|
+
# which is named the second part.
|
24
|
+
# - `:standalone` - Exclude dependencies listed in the gemspec. This is false
|
25
|
+
# by default so all listed dependencies will be recursively added to the
|
26
|
+
# resulting file. If set to true, the gemspec dependencies will not be
|
27
|
+
# included. This does not affect the `:dependencies` option, which are
|
28
|
+
# included seperately to these dependencies.
|
29
|
+
# - `:to` - Usually this process will just return a string, but by passing a
|
30
|
+
# `:to` option, the result will be written to the file specified by the given
|
31
|
+
# name. This only works for simple bundling where no resources are needed.
|
32
|
+
class Bundle
|
33
|
+
|
34
|
+
# Ensure we keep a unique set of packages - we dont want duplications
|
35
|
+
attr_reader :handled_packages
|
36
|
+
|
37
|
+
# Queue of packages waiting to be built
|
38
|
+
attr_reader :package_queue
|
39
|
+
|
40
|
+
# The {Gem} instance to build with a set of optional options.
|
41
|
+
#
|
42
|
+
# @param [Gem] package The package to build
|
43
|
+
# @param {Hash} opts Build options
|
44
|
+
def initialize(package, opts = {})
|
45
|
+
@package = package
|
46
|
+
@options = opts
|
47
|
+
|
48
|
+
@handled_packages = []
|
49
|
+
@package_queue = []
|
50
|
+
end
|
51
|
+
|
52
|
+
# Actually build the bundle. Returns the result, for now, as a string.
|
53
|
+
#
|
54
|
+
# @return {String} bundled packages
|
55
|
+
def build
|
56
|
+
result = []
|
57
|
+
pkg = nil
|
58
|
+
|
59
|
+
@package_queue << @package
|
60
|
+
@handled_packages << @package.name
|
61
|
+
|
62
|
+
unless @options[:standalone]
|
63
|
+
add_dependency('core', @package)
|
64
|
+
end
|
65
|
+
|
66
|
+
while pkg = @package_queue.pop
|
67
|
+
puts pkg
|
68
|
+
# if this is our initial package and we are standalone, make sure we
|
69
|
+
# pass that option into build package
|
70
|
+
if pkg == @package && @options[:standalone]
|
71
|
+
puts "standalone #{pkg}"
|
72
|
+
result << build_package(pkg, true)
|
73
|
+
else
|
74
|
+
result << build_package(pkg)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
unless @options[:standalone]
|
79
|
+
result.unshift opal_boot_content
|
80
|
+
end
|
81
|
+
|
82
|
+
if @options[:to]
|
83
|
+
File.open(@options[:to], 'w+') { |out| out.write result.join("\n") }
|
84
|
+
end
|
85
|
+
|
86
|
+
result.join "\n"
|
87
|
+
end
|
88
|
+
|
89
|
+
# Boot content for opal. This bootloader takes all the gems in the browser
|
90
|
+
# context and manages them. Opal self-loads in the bootloader.
|
91
|
+
#
|
92
|
+
# @return [String]
|
93
|
+
def opal_boot_content
|
94
|
+
path = File.expand_path File.join(__FILE__, '..', '..', '..', 'lib', 'opal.js')
|
95
|
+
File.read path
|
96
|
+
end
|
97
|
+
|
98
|
+
# Builds a single package. This will build the package, discover its
|
99
|
+
# dependencies, and then add them to the queue of packages to build. This
|
100
|
+
# method will then return the built package as a string.
|
101
|
+
#
|
102
|
+
# @param {Package} package The package to build
|
103
|
+
# @param {Boolean} standalone Whether to exclude gem dependencies.
|
104
|
+
# @return {String} Built package
|
105
|
+
def build_package(package, standalone = false)
|
106
|
+
# Work through each dependency and work out if we need it
|
107
|
+
unless standalone
|
108
|
+
package.dependencies.each do |dep|
|
109
|
+
add_dependency dep, package
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
package.to_bundle
|
114
|
+
end
|
115
|
+
|
116
|
+
def add_dependency(dep, package)
|
117
|
+
|
118
|
+
unless @handled_packages.include? dep
|
119
|
+
@handled_packages << dep
|
120
|
+
|
121
|
+
loc = package.find_dependency(dep)
|
122
|
+
raise "Cannot find dependency '#{dep}' for #{package}" unless loc
|
123
|
+
|
124
|
+
pkg = Gem.new loc
|
125
|
+
@package_queue << pkg
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
data/lib/opal/command.rb
ADDED
data/lib/opal/context.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
# This file should only be required as needed. This file relies on v8,
|
2
|
+
# therubyracer. As this is not an essential feature of opal, this file
|
3
|
+
# will be loaded as needed, and when it is, an error is just thrown if
|
4
|
+
# the required gems are not installed.
|
5
|
+
begin
|
6
|
+
require 'v8'
|
7
|
+
rescue LoadError => e
|
8
|
+
abort "therubyracer is required for running javascript. Install it with `gem install therubyracer`"
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'opal/context/loader'
|
12
|
+
require 'opal/context/console'
|
13
|
+
require 'opal/context/file_system'
|
14
|
+
|
15
|
+
module Opal
|
16
|
+
class Context < V8::Context
|
17
|
+
|
18
|
+
def initialize(opts = {})
|
19
|
+
super opts
|
20
|
+
setup_context
|
21
|
+
end
|
22
|
+
|
23
|
+
# Setup the context. This basically loads opal.js into our context, and
|
24
|
+
# replace the loader etc with our custom loader for a Ruby environment. The
|
25
|
+
# default "browser" loader cannot access files from disk.
|
26
|
+
def setup_context
|
27
|
+
self['console'] = Console.new
|
28
|
+
load opal_js_path
|
29
|
+
|
30
|
+
opal = self['opal']
|
31
|
+
opal['loader'] = Loader.new opal, self
|
32
|
+
# opal['fs'] = FileSystem.new opal, self
|
33
|
+
|
34
|
+
eval "opal.require('core');", "(opal)"
|
35
|
+
end
|
36
|
+
|
37
|
+
# Returns the path to our main opal.js file. This makes it easier as
|
38
|
+
# we will likely require this file more than once (once per context).
|
39
|
+
def opal_js_path
|
40
|
+
File.expand_path File.join(File.dirname(__FILE__), '..', '..', 'lib', 'opal.js')
|
41
|
+
end
|
42
|
+
|
43
|
+
# Start normal js repl
|
44
|
+
def start_repl
|
45
|
+
require 'readline'
|
46
|
+
|
47
|
+
loop do
|
48
|
+
line = Readline.readline '>> ', true
|
49
|
+
puts "=> #{eval_ruby line, '(opal)'}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def eval_ruby(content, line = "")
|
54
|
+
begin
|
55
|
+
code = Opal::RubyParser.new(content).parse!.generate_top
|
56
|
+
code = "var VM = opal.vm, self = VM.top, __FILE__ = '(opal)';" + code
|
57
|
+
# puts code
|
58
|
+
self['$opal_irb_result'] = eval code, line
|
59
|
+
# self['$code'].to_s + "ww"
|
60
|
+
eval "$opal_irb_result.$m.inspect($opal_irb_result);"
|
61
|
+
rescue => e
|
62
|
+
puts e
|
63
|
+
puts("\t" + e.backtrace.join("\n\t"))
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
@@ -0,0 +1,117 @@
|
|
1
|
+
|
2
|
+
module Opal
|
3
|
+
# Custom loader class, which an instance is set on the vienna.loader property
|
4
|
+
# to allow for disk based loading and access to modules/packages/gems.
|
5
|
+
#
|
6
|
+
# For now, this simply adds hard-coded paths to the load path. In future,
|
7
|
+
# dynamic package lookup will take place, but for now we just manually loop
|
8
|
+
# through gems/packages in this gems' dir, and the cwd dir (in ./vendor/) and
|
9
|
+
# add each of their lib/ dirs). Unil we add a custom package manager, this
|
10
|
+
# will make it the easiest way of managing packages for vienna.
|
11
|
+
class Loader
|
12
|
+
|
13
|
+
# Load paths. This is an array of all load paths
|
14
|
+
attr_reader :paths
|
15
|
+
|
16
|
+
# The vienna instance for the object
|
17
|
+
attr_reader :vienna
|
18
|
+
|
19
|
+
# @param vienna The js vienna object itself so we can talk to it
|
20
|
+
# @param {Vienna::Context} context The v8 context
|
21
|
+
def initialize(vienna, context)
|
22
|
+
@vienna = vienna
|
23
|
+
@ctx = context
|
24
|
+
@paths = []
|
25
|
+
hardcode_gems
|
26
|
+
end
|
27
|
+
|
28
|
+
# Register all gems - this is currently hardcoded while we don't have a
|
29
|
+
# proper package manager. This needs to be replaced to be more dynamic in
|
30
|
+
# lookup.
|
31
|
+
def hardcode_gems
|
32
|
+
core = File.expand_path(File.join(__FILE__, '..', '..', '..', '..', 'gems'))
|
33
|
+
|
34
|
+
Dir.open(core).each do |entry|
|
35
|
+
try_dir = File.join core, entry
|
36
|
+
if File.directory?(try_dir) && !['.', '..'].include?(entry)
|
37
|
+
add_hardcoded_gem try_dir
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Add an individual hardcoded gem by its path. We need to check it has a
|
43
|
+
# .gemspec in its dir, then add its lib directory to our path.
|
44
|
+
def add_hardcoded_gem(path)
|
45
|
+
# make sure gem dir has a gemspec
|
46
|
+
gemspec = File.join path, File.basename(path) + '.gemspec'
|
47
|
+
return unless File.exists? gemspec
|
48
|
+
# make sure gem dir has a lib dir
|
49
|
+
libpath = File.join path, 'lib'
|
50
|
+
return unless File.exists? libpath
|
51
|
+
# all is ok, so add to loadpath
|
52
|
+
@paths << libpath
|
53
|
+
end
|
54
|
+
|
55
|
+
# Valid extensions. This should be more dynamic for custom extensions
|
56
|
+
def valid_extensions
|
57
|
+
%w[.rb .js]
|
58
|
+
end
|
59
|
+
|
60
|
+
# Exposed as replacement method.
|
61
|
+
def resolve_module(id, parent)
|
62
|
+
resolved = find_module id, @paths
|
63
|
+
raise "Cannot find module '#{id}'" unless resolved
|
64
|
+
resolved
|
65
|
+
end
|
66
|
+
|
67
|
+
# Resolve the id requested with the given valid paths
|
68
|
+
def find_module(id, paths)
|
69
|
+
extensions = valid_extensions
|
70
|
+
|
71
|
+
@paths.each do |path|
|
72
|
+
|
73
|
+
extensions.each do |ext|
|
74
|
+
candidate = File.join(path, id + ext)
|
75
|
+
|
76
|
+
# if file exists, return it!
|
77
|
+
return candidate if File.exists? candidate
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# if we cannot find it, just return nil
|
82
|
+
nil
|
83
|
+
end
|
84
|
+
|
85
|
+
# Returns the contents of the module. This, in ruby, reads from the disk,
|
86
|
+
# but the browser uses either XHR or a cached module reference. The
|
87
|
+
# method name is kept generic to reflect this.
|
88
|
+
#
|
89
|
+
# @param {String} filename The filename to load. This is a full filename,
|
90
|
+
# not just a module id.
|
91
|
+
def module_contents(filename)
|
92
|
+
File.read filename
|
93
|
+
end
|
94
|
+
|
95
|
+
# Special version of module contents that will compile the given ruby code
|
96
|
+
# at the file into javascript first, before returning it. This is exposed
|
97
|
+
# to vienna so that it makes it easier to compile and run ruby from the
|
98
|
+
# v8 context. The default implementation of this throws an error to say
|
99
|
+
# that in browser ruby code cannot be run.
|
100
|
+
def ruby_module_contents(filename)
|
101
|
+
parser = Opal::RubyParser.new File.read(filename)
|
102
|
+
result = parser.parse!.generate_top
|
103
|
+
result
|
104
|
+
end
|
105
|
+
|
106
|
+
# Wraps the content with the given filename. Basically, here we eval
|
107
|
+
# the code inside a function which takes our exports, module,
|
108
|
+
# require etc, and returns the function ready for calling. If an
|
109
|
+
# error occures (likely a parse error) it is just thrown as normal
|
110
|
+
def wrap(content, filename)
|
111
|
+
code = "(function(VM, self, __FILE__) { #{content} });"
|
112
|
+
# puts code
|
113
|
+
@ctx.eval code, filename
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|