opal 0.3.15 → 0.3.16
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 +1 -1
- data/Gemfile +8 -2
- data/README.md +1 -1
- data/Rakefile +51 -57
- data/bin/opal +50 -2
- data/{runtime/corelib → core}/alpha.rb +6 -1
- data/{runtime/corelib → core}/array.rb +38 -42
- data/{runtime/corelib → core}/basic_object.rb +6 -17
- data/core/boolean.rb +40 -0
- data/core/class.rb +69 -0
- data/{runtime/corelib → core}/comparable.rb +0 -0
- data/core/debug.js +59 -0
- data/core/debug.rb +35 -0
- data/core/dir.rb +90 -0
- data/core/enumerable.rb +331 -0
- data/core/enumerator.rb +126 -0
- data/core/error.rb +40 -0
- data/{runtime/corelib → core}/file.rb +6 -3
- data/core/gemlib.rb +30 -0
- data/{runtime/corelib → core}/hash.rb +37 -35
- data/{runtime/corelib → core}/io.rb +0 -0
- data/{runtime/corelib → core}/kernel.rb +26 -21
- data/{runtime/corelib → core}/load_order +2 -5
- data/{runtime/corelib → core}/match_data.rb +2 -4
- data/core/module.rb +204 -0
- data/{runtime/corelib → core}/nil_class.rb +1 -7
- data/{runtime/corelib → core}/numeric.rb +9 -13
- data/core/object.rb +17 -0
- data/{runtime/corelib → core}/proc.rb +2 -13
- data/{runtime/corelib → core}/range.rb +19 -7
- data/{runtime/corelib → core}/rational.rb +0 -0
- data/{runtime/corelib → core}/regexp.rb +2 -6
- data/core/runtime.js +672 -0
- data/{runtime/corelib → core}/string.rb +25 -9
- data/{runtime/corelib → core}/struct.rb +0 -0
- data/core/time.rb +111 -0
- data/{runtime/corelib → core}/top_self.rb +0 -0
- data/{runtime/spec → core_spec}/README.md +0 -0
- data/{runtime/spec → core_spec}/core/array/allocate_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/append_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/assoc_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/at_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/clear_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/collect_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/compact_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/concat_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/constructor_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/count_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/delete_at_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/delete_if_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/delete_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/each_index_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/each_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/element_reference_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/element_set_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/empty_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/eql_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/equal_value_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/fetch_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/first_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/fixtures/classes.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/flatten_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/include_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/insert_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/last_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/length_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/map_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/plus_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/pop_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/push_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/rassoc_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/reject_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/replace_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/reverse_each_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/reverse_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/shared/collect.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/shared/eql.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/shared/length.rb +0 -0
- data/{runtime/spec → core_spec}/core/array/shared/replace.rb +0 -0
- data/{runtime/spec → core_spec}/core/class/new_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/enumerable/all_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/enumerable/any_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/enumerable/collect_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/enumerable/count_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/enumerable/detect_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/enumerable/find_spec.rb +0 -0
- data/core_spec/core/enumerable/first_spec.rb +3 -0
- data/{runtime/spec → core_spec}/core/enumerable/fixtures/classes.rb +0 -0
- data/{runtime/spec → core_spec}/core/enumerable/shared/collect.rb +0 -0
- data/{runtime/spec → core_spec}/core/enumerable/shared/entries.rb +0 -0
- data/{runtime/spec → core_spec}/core/enumerable/shared/find.rb +0 -0
- data/core_spec/core/enumerable/shared/take.rb +31 -0
- data/{runtime/spec → core_spec}/core/enumerable/to_a_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/false/and_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/false/inspect_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/false/or_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/false/to_s_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/false/xor_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/hash/allocate_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/hash/assoc_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/hash/clear_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/hash/clone_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/hash/default_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/hash/delete_if_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/hash/element_reference_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/hash/element_set_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/hash/new_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/matchdata/to_a_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/nil/and_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/nil/inspect_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/nil/nil_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/nil/or_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/nil/to_a_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/nil/to_f_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/nil/to_i_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/nil/to_s_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/nil/xor_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/numeric/equal_value_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/object/is_a_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/object/shared/kind_of.rb +0 -0
- data/{runtime/spec → core_spec}/core/regexp/match_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/regexp/shared/match.rb +0 -0
- data/{runtime/spec → core_spec}/core/symbol/to_proc_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/true/and_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/true/inspect_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/true/or_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/true/to_s_spec.rb +0 -0
- data/{runtime/spec → core_spec}/core/true/xor_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/alias_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/and_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/array_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/block_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/break_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/case_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/defined_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/ensure_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/fixtures/block.rb +0 -0
- data/{runtime/spec → core_spec}/language/fixtures/break.rb +0 -0
- data/{runtime/spec → core_spec}/language/fixtures/defined.rb +0 -0
- data/{runtime/spec → core_spec}/language/fixtures/ensure.rb +0 -0
- data/{runtime/spec → core_spec}/language/fixtures/next.rb +0 -0
- data/{runtime/spec → core_spec}/language/fixtures/send.rb +0 -0
- data/{runtime/spec → core_spec}/language/fixtures/super.rb +0 -0
- data/{runtime/spec → core_spec}/language/hash_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/if_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/loop_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/next_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/or_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/predefined_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/regexp/interpolation_spec.rb +8 -0
- data/{runtime/spec → core_spec}/language/regexp_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/send_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/string_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/super_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/symbol_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/undef_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/unless_spec.rb +0 -0
- data/{runtime/spec → core_spec}/language/until_spec.rb +0 -0
- data/core_spec/language/variables_spec.rb +112 -0
- data/{runtime/spec → core_spec}/language/versions/hash_1.9.rb +0 -0
- data/{runtime/spec → core_spec}/language/while_spec.rb +0 -0
- data/{runtime/spec → core_spec}/opal/opal/defined_spec.rb +0 -0
- data/{runtime/spec → core_spec}/opal/opal/function_spec.rb +0 -0
- data/{runtime/spec → core_spec}/opal/opal/native_spec.rb +0 -0
- data/{runtime/spec → core_spec}/opal/opal/null_spec.rb +0 -0
- data/{runtime/spec → core_spec}/opal/opal/number_spec.rb +0 -0
- data/{runtime/spec → core_spec}/opal/opal/object_spec.rb +0 -0
- data/{runtime/spec → core_spec}/opal/opal/string_spec.rb +0 -0
- data/{runtime/spec → core_spec}/opal/opal/typeof_spec.rb +0 -0
- data/{runtime/spec → core_spec}/opal/opal/undefined_spec.rb +0 -0
- data/{runtime/spec → core_spec}/opal/true/case_compare_spec.rb +0 -0
- data/{runtime/spec → core_spec}/opal/true/class_spec.rb +0 -0
- data/{docs/spec_runner.html → core_spec/release_runner.html} +4 -3
- data/core_spec/runner.html +16 -0
- data/core_spec/spec_helper.rb +23 -0
- data/lib/opal.rb +85 -2
- data/lib/opal/builder.rb +129 -46
- data/lib/opal/context.rb +47 -26
- data/lib/opal/dependency_builder.rb +113 -14
- data/lib/opal/environment.rb +40 -45
- data/lib/opal/parser/grammar.rb +2296 -2254
- data/lib/opal/parser/grammar.y +27 -8
- data/lib/opal/parser/lexer.rb +12 -3
- data/lib/opal/parser/parser.rb +117 -30
- data/lib/opal/parser/scope.rb +2 -2
- data/lib/opal/version.rb +1 -1
- data/opal.gemspec +3 -8
- data/spec/grammar/masgn_spec.rb +37 -0
- metadata +177 -227
- data/index.html +0 -434
- data/lib/opal/command.rb +0 -73
- data/runtime/README.md +0 -25
- data/runtime/corelib/boolean.rb +0 -44
- data/runtime/corelib/class.rb +0 -43
- data/runtime/corelib/complex.rb +0 -2
- data/runtime/corelib/dir.rb +0 -29
- data/runtime/corelib/enumerable.rb +0 -316
- data/runtime/corelib/enumerator.rb +0 -80
- data/runtime/corelib/error.rb +0 -25
- data/runtime/corelib/module.rb +0 -171
- data/runtime/corelib/native.rb +0 -50
- data/runtime/corelib/object.rb +0 -21
- data/runtime/corelib/time.rb +0 -196
- data/runtime/gemlib/alpha.rb +0 -5
- data/runtime/gemlib/kernel.rb +0 -17
- data/runtime/gemlib/load_order +0 -2
- data/runtime/kernel/class.js +0 -256
- data/runtime/kernel/debug.js +0 -42
- data/runtime/kernel/init.js +0 -114
- data/runtime/kernel/load_order +0 -5
- data/runtime/kernel/loader.js +0 -151
- data/runtime/kernel/runtime.js +0 -414
- data/runtime/spec/language/variables_spec.rb +0 -28
- data/runtime/spec/library/stringscanner/scan_spec.rb +0 -36
- data/runtime/spec/opal/forwardable/def_instance_delegator_spec.rb +0 -49
- data/runtime/spec/spec_helper.rb +0 -25
- data/runtime/stdlib/base64.rb +0 -91
- data/runtime/stdlib/date.rb +0 -4
- data/runtime/stdlib/dev.rb +0 -171
- data/runtime/stdlib/forwardable.rb +0 -33
- data/runtime/stdlib/optparse.rb +0 -0
- data/runtime/stdlib/pp.rb +0 -6
- data/runtime/stdlib/racc/parser.rb +0 -159
- data/runtime/stdlib/rbconfig.rb +0 -0
- data/runtime/stdlib/si.rb +0 -17
- data/runtime/stdlib/strscan.rb +0 -53
- data/runtime/stdlib/uri.rb +0 -111
- data/runtime/stdlib/uri/common.rb +0 -1014
- data/runtime/stdlib/uri/ftp.rb +0 -261
- data/runtime/stdlib/uri/generic.rb +0 -1599
- data/runtime/stdlib/uri/http.rb +0 -106
- data/runtime/stdlib/uri/https.rb +0 -22
- data/runtime/stdlib/uri/ldap.rb +0 -260
- data/runtime/stdlib/uri/ldaps.rb +0 -20
- data/runtime/stdlib/uri/mailto.rb +0 -280
- data/spec/builder/output_path_spec.rb +0 -50
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -6,4 +6,12 @@ describe "Regexps with interpolation" do
|
|
6
6
|
str = "foo|bar"
|
7
7
|
/#{str}/.should == /foo|bar/
|
8
8
|
end
|
9
|
+
|
10
|
+
it "allows interpolation to interact with other Regexp constructs" do
|
11
|
+
str = "foo)|(bar"
|
12
|
+
/(#{str})/.should == /(foo)|(bar)/
|
13
|
+
|
14
|
+
str = "a"
|
15
|
+
/[#{str}-z]/.should == /[a-z]/
|
16
|
+
end
|
9
17
|
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
describe "Basic assignment" do
|
4
|
+
it "allows the rhs to be assigned to the lhs" do
|
5
|
+
a = nil
|
6
|
+
a.should == nil
|
7
|
+
end
|
8
|
+
|
9
|
+
it "assigns nil to lhs when rhs is an empty expression" do
|
10
|
+
a = ()
|
11
|
+
a.should be_nil
|
12
|
+
end
|
13
|
+
|
14
|
+
it "assigns [] to lhs when rhs is an empty splat expression" do
|
15
|
+
a = *()
|
16
|
+
a.should == []
|
17
|
+
end
|
18
|
+
|
19
|
+
it "allows the assignment of the rhs to the lhs using the rhs splat operator" do
|
20
|
+
a = *nil; a.should == []
|
21
|
+
a = *1; a.should == [1]
|
22
|
+
a = *[]; a.should == []
|
23
|
+
a = *[1]; a.should == [1]
|
24
|
+
a = *[nil]; a.should == [nil]
|
25
|
+
a = *[[]]; a.should == [[]]
|
26
|
+
a = *[1,2]; a.should == [1,2]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "Assigning multiple values" do
|
31
|
+
it "allows parallel assignment" do
|
32
|
+
a, b = 1, 2
|
33
|
+
a.should == 1
|
34
|
+
b.should == 2
|
35
|
+
|
36
|
+
a, = 1,2
|
37
|
+
a.should == 1
|
38
|
+
end
|
39
|
+
|
40
|
+
it "allows safe parallel swapping" do
|
41
|
+
a, b = 1, 2
|
42
|
+
a, b = b, a
|
43
|
+
a.should == 2
|
44
|
+
b.should == 1
|
45
|
+
end
|
46
|
+
|
47
|
+
it "bundles remaining values to an array when using the splat operator" do
|
48
|
+
a, *b = 1, 2, 3
|
49
|
+
a.should == 1
|
50
|
+
b.should == [2, 3]
|
51
|
+
|
52
|
+
*a = 1, 2, 3
|
53
|
+
a.should == [1, 2, 3]
|
54
|
+
|
55
|
+
*a = 4
|
56
|
+
a.should == [4]
|
57
|
+
|
58
|
+
*a = nil
|
59
|
+
a.should == [nil]
|
60
|
+
|
61
|
+
a, = *[1]
|
62
|
+
a.should == 1
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "Single assignment" do
|
67
|
+
it "Assignment does not modify the lhs, it reassigns its reference" do
|
68
|
+
a = 'Foobar'
|
69
|
+
b = a
|
70
|
+
b = 'Bazquux'
|
71
|
+
a.should == 'Foobar'
|
72
|
+
b.should == 'Bazquux'
|
73
|
+
end
|
74
|
+
|
75
|
+
it "Assignment does not copy the object being assigned, just creates a new reference to it" do
|
76
|
+
a = []
|
77
|
+
b = a
|
78
|
+
b << 1
|
79
|
+
a.should == [1]
|
80
|
+
end
|
81
|
+
|
82
|
+
it "If rhs has multiple arguments, lhs becomes an Array of them" do
|
83
|
+
a = [1, 2, 3]
|
84
|
+
a.should == [1, 2, 3]
|
85
|
+
|
86
|
+
a = 1, (), 3
|
87
|
+
a.should == [1, nil, 3]
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "Multiple assignment without grouping or splatting" do
|
92
|
+
it "An equal number of arguments on lhs and rhs assigns positionally" do
|
93
|
+
a, b, c, d = 1, 2, 3, 4
|
94
|
+
a.should == 1
|
95
|
+
b.should == 2
|
96
|
+
c.should == 3
|
97
|
+
d.should == 4
|
98
|
+
end
|
99
|
+
|
100
|
+
it "If rhs has too few arguments, the missing ones on lhs are assigned nil" do
|
101
|
+
a, b, c = 1, 2
|
102
|
+
a.should == 1
|
103
|
+
b.should == 2
|
104
|
+
c.should == nil
|
105
|
+
end
|
106
|
+
|
107
|
+
it "If rhs has too many arguments, the extra ones are silently not assigned anywhere" do
|
108
|
+
a, b = 1, 2, 3
|
109
|
+
a.should == 1
|
110
|
+
b.should == 2
|
111
|
+
end
|
112
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -6,11 +6,12 @@
|
|
6
6
|
<title>Opal Spec Runner</title>
|
7
7
|
</head>
|
8
8
|
<body>
|
9
|
-
<script src="../opal.
|
9
|
+
<script src="../opal.js"></script>
|
10
10
|
<script src="../opal-spec.js"></script>
|
11
|
-
<script src="../
|
11
|
+
<script src="../core_spec.js"></script>
|
12
12
|
<script>
|
13
|
-
opal.main('/
|
13
|
+
opal.main('/core_spec/spec_helper.rb');
|
14
14
|
</script>
|
15
15
|
</body>
|
16
16
|
</html>
|
17
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
5
|
+
|
6
|
+
<title>Opal Spec Runner</title>
|
7
|
+
</head>
|
8
|
+
<body>
|
9
|
+
<script src="../opal.debug.js"></script>
|
10
|
+
<script src="../opal-spec.debug.js"></script>
|
11
|
+
<script src="../core_spec.debug.js"></script>
|
12
|
+
<script>
|
13
|
+
opal.main('/core_spec/spec_helper.rb');
|
14
|
+
</script>
|
15
|
+
</body>
|
16
|
+
</html>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# make sure these tests are indeed running inside opal, not any other
|
2
|
+
# ruby engine.
|
3
|
+
unless RUBY_ENGINE =~ /opal/
|
4
|
+
abort <<-EOS
|
5
|
+
Opal Tests
|
6
|
+
==========
|
7
|
+
|
8
|
+
These tests MUST be run inside opal, not `#{RUBY_ENGINE}' engine
|
9
|
+
|
10
|
+
To run Array#first tests, for example:
|
11
|
+
|
12
|
+
opal core_spec/core/array/first_spec.rb
|
13
|
+
|
14
|
+
EOS
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'opal/spec/autorun'
|
18
|
+
|
19
|
+
# Spec runner - if in browser, and spec_helper.rb is the main file then
|
20
|
+
# just run the spec files immediately.
|
21
|
+
if $0 == __FILE__
|
22
|
+
Dir['core_spec/**/*.rb'].each { |spec| require spec }
|
23
|
+
end
|
data/lib/opal.rb
CHANGED
@@ -5,15 +5,98 @@ require 'opal/context'
|
|
5
5
|
require 'opal/version'
|
6
6
|
|
7
7
|
module Opal
|
8
|
+
# Base Opal directory - used by build tools
|
9
|
+
# @return [String]
|
8
10
|
def self.opal_dir
|
9
11
|
File.expand_path '../..', __FILE__
|
10
12
|
end
|
11
13
|
|
14
|
+
# Returns a string of javascript code for the opal runtime in normal
|
15
|
+
# mode.
|
16
|
+
# @return [String]
|
12
17
|
def self.runtime_code
|
13
|
-
|
18
|
+
path = File.join opal_dir, 'opal.js'
|
19
|
+
return File.read path if File.exists? path
|
20
|
+
|
21
|
+
build_runtime false
|
14
22
|
end
|
15
23
|
|
24
|
+
# Debug mode code for opal runtime
|
25
|
+
# @return [String]
|
16
26
|
def self.runtime_debug_code
|
17
|
-
|
27
|
+
path = File.join opal_dir, 'opal.debug.js'
|
28
|
+
return File.read path if File.exists? path
|
29
|
+
|
30
|
+
build_runtime true
|
31
|
+
end
|
32
|
+
|
33
|
+
# Builds the runtime in normal mode by default.
|
34
|
+
#
|
35
|
+
# @param [Boolean] debug whether to build in debug mode (or not)
|
36
|
+
# @return [String] string of javascript code
|
37
|
+
def self.build_runtime(debug = false)
|
38
|
+
code = []
|
39
|
+
code << HEADER
|
40
|
+
code << '(function(undefined) {'
|
41
|
+
code << kernel_source(debug)
|
42
|
+
code << method_names
|
43
|
+
code << corelib_source(debug)
|
44
|
+
code << '}).call(this);'
|
45
|
+
|
46
|
+
code.join "\n"
|
47
|
+
end
|
48
|
+
|
49
|
+
# Returns the source ruby code for the corelib as a string. Corelib is
|
50
|
+
# always parsed as one large file.
|
51
|
+
# @return [String]
|
52
|
+
def self.corelib_source(debug = false)
|
53
|
+
order = File.read(File.join(opal_dir, 'core/load_order')).strip.split
|
54
|
+
parser = Opal::Parser.new :debug => debug
|
55
|
+
|
56
|
+
if debug
|
57
|
+
order << 'debug'
|
58
|
+
order.map do |c|
|
59
|
+
parsed = parser.parse File.read(File.join(opal_dir, "core/#{c}.rb")), c
|
60
|
+
"opal.FILE = '/core/#{c}.rb';\n#{parsed}"
|
61
|
+
end.join("\n")
|
62
|
+
|
63
|
+
else
|
64
|
+
source = order.map { |c| File.read File.join(opal_dir, "core/#{c}.rb") }.join("\n")
|
65
|
+
parser.parse source, '(corelib)'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Returns javascript source for the kernel/runtime of opal.
|
70
|
+
# @return [String]
|
71
|
+
def self.kernel_source(debug = false)
|
72
|
+
order = %w[runtime]
|
73
|
+
order << 'debug' if debug
|
74
|
+
order.map { |c| File.read File.join(opal_dir, "core/#{c}.js") }.join("\n")
|
18
75
|
end
|
76
|
+
|
77
|
+
# Get all special method names from the parser and generate js code that
|
78
|
+
# is passed into runtime. This saves having special names duplicated in
|
79
|
+
# runtime AND parser.
|
80
|
+
# @return [String]
|
81
|
+
def self.method_names
|
82
|
+
methods = Opal::Parser::METHOD_NAMES.map { |f, t| "'#{f}': '$#{t}$'" }
|
83
|
+
%Q{
|
84
|
+
var method_names = {#{ methods.join ', ' }};
|
85
|
+
var reverse_method_names = {};
|
86
|
+
for (var id in method_names) {
|
87
|
+
reverse_method_names[method_names[id]] = id;
|
88
|
+
}
|
89
|
+
}
|
90
|
+
end
|
91
|
+
|
92
|
+
# Header used in generated runtime code
|
93
|
+
HEADER = <<-HEADER
|
94
|
+
/*!
|
95
|
+
* opal v#{VERSION}
|
96
|
+
* http://opalrb.org
|
97
|
+
*
|
98
|
+
* Copyright 2012, Adam Beynon
|
99
|
+
* Released under the MIT license
|
100
|
+
*/
|
101
|
+
HEADER
|
19
102
|
end
|
data/lib/opal/builder.rb
CHANGED
@@ -1,74 +1,157 @@
|
|
1
|
+
#### Opal Builder
|
2
|
+
#
|
3
|
+
# Builder class is used to build one or more ruby files into a combined
|
4
|
+
# output script. The simplest form would be building a single ruby file
|
5
|
+
# back into the current working dir:
|
6
|
+
#
|
7
|
+
# Opal::Builder.new(:files => 'foo.rb')
|
8
|
+
#
|
9
|
+
# Which would create two files, `foo.js` and `foo.debug.js` to be used
|
10
|
+
# in release and debug environments respectively.
|
11
|
+
#
|
12
|
+
# In real world scenarios, Builder will be used to build entire
|
13
|
+
# directories. This is achieved just as easily:
|
14
|
+
#
|
15
|
+
# Opal::Builder.new(:files => 'my_libs')
|
16
|
+
#
|
17
|
+
# Where `my_libs` is a directory. This will create a `my_libs.js` and
|
18
|
+
# `my_libs.debug.js` file in the current directory.
|
19
|
+
#
|
20
|
+
# As a special case, when building the `lib` directory, the basename of
|
21
|
+
# the current working directory (assumed to be the app/gem name) will be
|
22
|
+
# used to construct the output name:
|
23
|
+
#
|
24
|
+
# # in dir ~/dev/vienna
|
25
|
+
# Opal::Builder.new(:files => 'lib')
|
26
|
+
#
|
27
|
+
# This creates the specially named `vienna.js` and `vienna.debug.js`.
|
28
|
+
#
|
29
|
+
# As a second special case, building a `spec` or `test` directory will
|
30
|
+
# append `test` to the basename of the current directory to name the
|
31
|
+
# output files.
|
32
|
+
#
|
33
|
+
# A custom output destination can be specified using the `:out` option
|
34
|
+
# which should point to the output file for the release build mode. The
|
35
|
+
# debug output will prefix the extname with `.debug`:
|
36
|
+
#
|
37
|
+
# Opal::Builder.new(:files => 'lib', :out => 'vienna-0.1.0.js')
|
38
|
+
#
|
39
|
+
# This will give you `vienna-0.1.0.js` and `vienna-0.1.0.debug.js`.
|
40
|
+
#
|
41
|
+
# If no input files are specified, then `Builder` will automatically
|
42
|
+
# build the `lib/` directory.
|
43
|
+
#
|
44
|
+
# Opal::Builder.new.build
|
45
|
+
#
|
46
|
+
|
47
|
+
# FileUtils are useful for making sure output directory exists.
|
1
48
|
require 'fileutils'
|
2
49
|
|
3
50
|
module Opal
|
51
|
+
# `Builder.new` takes an optional hash of options to control which
|
52
|
+
# files to build and to where. The `options` hash takes these options:
|
53
|
+
#
|
54
|
+
# * `:files`: specifies an array (or single string) of files/directories
|
55
|
+
# to recursively build. _Defaults to `['lib']`_.
|
56
|
+
#
|
57
|
+
# * `:out`: the file to write the result to. When building a debug build
|
58
|
+
# as well, 'debug' will be injected before the extname. Defaults to the
|
59
|
+
# first file name.
|
4
60
|
class Builder
|
5
|
-
def initialize(
|
6
|
-
@sources = Array(
|
61
|
+
def initialize(options = {})
|
62
|
+
@sources = Array(options[:files])
|
7
63
|
@options = options
|
8
|
-
|
9
|
-
@options[:out] = '.' if @options[:out] == '' or !@options[:out]
|
10
64
|
end
|
11
65
|
|
12
66
|
def build
|
13
|
-
|
14
|
-
|
67
|
+
release_out = nil
|
68
|
+
debug_out = nil
|
15
69
|
|
16
|
-
|
70
|
+
raise "No files given" if @sources.empty?
|
17
71
|
|
18
|
-
if @options[:
|
19
|
-
|
20
|
-
|
72
|
+
if out = @options[:out]
|
73
|
+
release_out = out
|
74
|
+
debug_out = out.chomp(File.extname(out)) + '.debug.js'
|
75
|
+
else
|
76
|
+
if @sources == ['lib']
|
77
|
+
out = File.basename(Dir.getwd)
|
78
|
+
elsif @sources.include? 'spec'
|
79
|
+
out = File.basename(Dir.getwd) + '.test'
|
80
|
+
elsif @sources.size == 1
|
81
|
+
out = File.basename(@sources[0], '.*')
|
82
|
+
else
|
83
|
+
out = File.basename(@sources[0], '.*')
|
21
84
|
end
|
85
|
+
|
86
|
+
release_out = out + '.js'
|
87
|
+
debug_out = out + '.debug.js'
|
22
88
|
end
|
23
|
-
end
|
24
89
|
|
25
|
-
|
26
|
-
path = base == '.' ? source : File.join(base, source)
|
90
|
+
puts "[#{File.basename(Dir.getwd)}] sources: [#{@sources.join ', '}] (#{release_out}, #{debug_out})"
|
27
91
|
|
28
|
-
|
29
|
-
Dir.entries(path).each do |e|
|
30
|
-
next if e == '.' or e == '..'
|
31
|
-
build_source path, e
|
32
|
-
end
|
92
|
+
FileUtils.mkdir_p File.dirname(release_out)
|
33
93
|
|
34
|
-
|
35
|
-
|
36
|
-
|
94
|
+
files = files_for @sources
|
95
|
+
|
96
|
+
build_to release_out, files, false
|
97
|
+
build_to debug_out, files, true
|
37
98
|
end
|
38
99
|
|
39
|
-
|
40
|
-
|
41
|
-
|
100
|
+
# Returns an array of all ruby source files to build from the given
|
101
|
+
# sources array. The passed sources can be files or directories, where
|
102
|
+
# directories will be globbed for all ruby sources.
|
103
|
+
# @param [Array<String>] sources array of files/dirs to build
|
104
|
+
# @return [Array<String>]
|
105
|
+
def files_for(sources)
|
106
|
+
files = []
|
42
107
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
108
|
+
sources.each do |s|
|
109
|
+
if File.directory? s
|
110
|
+
files.push *Dir[File.join s, '**/*.rb']
|
111
|
+
elsif File.extname(s) == '.rb'
|
112
|
+
files << s
|
113
|
+
end
|
47
114
|
end
|
48
115
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
116
|
+
files
|
117
|
+
end
|
118
|
+
|
119
|
+
def build_to(out, files, debug)
|
120
|
+
@parser = Parser.new(:debug => debug)
|
121
|
+
|
122
|
+
File.open(out, 'w+') do |o|
|
123
|
+
# In debug mode, make sure opal runtime is also debug mode
|
124
|
+
if debug
|
125
|
+
o.puts "if (!opal.debug) {"
|
126
|
+
o.puts " throw new Error('This file requires opal.debug.js');"
|
127
|
+
o.puts "}"
|
128
|
+
end
|
53
129
|
|
54
|
-
|
55
|
-
File.open(out, 'w+') { |o| o.write code }
|
130
|
+
files.each { |path| o.write build_file(path) }
|
56
131
|
end
|
57
132
|
end
|
58
133
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
134
|
+
# Build an individual file at the given path, and return a wapped result
|
135
|
+
# used to register the factory with the opal runtime. The parser used
|
136
|
+
# will be the one set in `#build_to`.
|
137
|
+
#
|
138
|
+
# @example
|
139
|
+
#
|
140
|
+
# builder.build_file 'lib/foo.rb'
|
141
|
+
# # => "opal.lib('foo', function() { ... });
|
142
|
+
#
|
143
|
+
# builder.build_file 'spec/foo_spec.rb'
|
144
|
+
# # => "opal.file('/spec/foo_spec.rb', function() { ... });
|
145
|
+
#
|
146
|
+
# @param [String] path relative path to the file to be built
|
147
|
+
# @return [String] factory wrapped compiled code
|
148
|
+
def build_file(path)
|
149
|
+
code = @parser.parse File.read(path), path
|
150
|
+
|
151
|
+
if /^lib/ =~ path
|
152
|
+
"opal.lib('#{path[4..-4]}', function() {\n#{code}\n});\n"
|
63
153
|
else
|
64
|
-
|
65
|
-
File.join @options[:out], fname
|
66
|
-
else
|
67
|
-
parts = base.split '/'
|
68
|
-
parts[0] = @options[:out]
|
69
|
-
parts << fname
|
70
|
-
File.join *parts
|
71
|
-
end
|
154
|
+
"opal.file('/#{path}', function() {\n#{code}\n});\n"
|
72
155
|
end
|
73
156
|
end
|
74
157
|
end
|