opal 0.3.26 → 0.3.27
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -6
- data/.travis.yml +1 -4
- data/Gemfile +1 -1
- data/README.md +3 -8
- data/Rakefile +26 -3
- data/core/array.rb +33 -91
- data/core/boolean.rb +1 -4
- data/core/class.rb +25 -71
- data/core/error.rb +5 -3
- data/core/hash.rb +3 -2
- data/core/kernel.rb +40 -1
- data/core/load_order +1 -1
- data/core/nil_class.rb +1 -3
- data/core/runtime.js +4 -44
- data/core/template.rb +20 -0
- data/core/{opal-spec → test_runner}/runner.js +0 -6
- data/lib/opal.rb +1 -12
- data/lib/opal/builder.rb +3 -10
- data/lib/opal/lexer.rb +1095 -1110
- data/lib/opal/parser.rb +229 -26
- data/lib/opal/rake_task.rb +3 -3
- data/lib/opal/version.rb +1 -1
- data/opal.gemspec +2 -2
- data/spec/core/array/assoc_spec.rb +2 -3
- data/spec/core/array/comparison_spec.rb +16 -0
- data/spec/core/array/constructor_spec.rb +0 -9
- data/spec/core/array/drop_spec.rb +21 -0
- data/spec/core/array/dup_spec.rb +15 -0
- data/spec/core/array/{eql_spec.rb → equal_value_spec.rb} +0 -0
- data/spec/core/array/index_spec.rb +26 -0
- data/spec/core/array/inspect_spec.rb +13 -0
- data/spec/core/array/intersection_spec.rb +22 -0
- data/spec/core/array/join_spec.rb +9 -0
- data/spec/core/array/keep_if_spec.rb +7 -0
- data/spec/core/array/minus_spec.rb +19 -9
- data/spec/core/array/multiply_spec.rb +13 -0
- data/spec/core/array/new_spec.rb +40 -0
- data/spec/core/array/rindex_spec.rb +21 -0
- data/spec/core/array/select_spec.rb +13 -0
- data/spec/core/array/shift_spec.rb +51 -0
- data/spec/core/array/slice_spec.rb +37 -0
- data/spec/core/array/take_spec.rb +21 -0
- data/spec/core/array/take_while_spec.rb +13 -0
- data/spec/core/array/to_a_spec.rb +7 -0
- data/spec/core/array/unshift_spec.rb +29 -0
- data/spec/core/hash/constructor_spec.rb +13 -0
- data/spec/core/hash/default_proc_spec.rb +20 -0
- data/spec/core/hash/default_spec.rb +8 -0
- data/spec/core/hash/delete_spec.rb +11 -0
- data/spec/core/hash/dup_spec.rb +10 -0
- data/spec/core/hash/reject_spec.rb +18 -0
- data/spec/core/hash/to_a_spec.rb +13 -0
- data/spec/core/kernel/Array_spec.rb +10 -0
- data/spec/core/kernel/class_spec.rb +6 -0
- data/spec/core/kernel/equal_spec.rb +12 -0
- data/spec/core/kernel/extend_spec.rb +21 -0
- data/spec/core/kernel/instance_eval_spec.rb +28 -0
- data/spec/core/kernel/instance_variable_get_spec.rb +14 -0
- data/spec/core/kernel/instance_variable_set_spec.rb +10 -0
- data/spec/core/kernel/match_spec.rb +5 -0
- data/spec/core/module/alias_method_spec.rb +10 -0
- data/spec/core/module/ancestors_spec.rb +11 -0
- data/spec/core/module/append_features_spec.rb +14 -0
- data/spec/core/proc/call_spec.rb +21 -0
- data/spec/core/proc/proc_tricks_spec.rb +1 -1
- data/spec/language/alias_spec.rb +1 -1
- data/spec/opal/class/instance_methods_spec.rb +13 -0
- data/spec/opal/kernel/attribute_spec.rb +57 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/test_case.html +13 -0
- metadata +88 -12
- data/core/erb.rb +0 -32
- data/lib/opal/erb_parser.rb +0 -20
- data/spec/opal/erb/erb_spec.rb +0 -23
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -14,16 +14,11 @@ See the website, [http://opal.github.com](http://opal.github.com).
|
|
14
14
|
|
15
15
|
## Running tests
|
16
16
|
|
17
|
-
Build the runtime, tests and dependencies
|
17
|
+
Build the runtime, tests and dependencies, and then run the tests all in one
|
18
|
+
go:
|
18
19
|
|
19
20
|
```
|
20
|
-
rake
|
21
|
-
```
|
22
|
-
|
23
|
-
Run tests using phantom.js runner:
|
24
|
-
|
25
|
-
```
|
26
|
-
rake test
|
21
|
+
$ rake
|
27
22
|
```
|
28
23
|
|
29
24
|
Alternatively, after building, you can open `spec/index.html` in any
|
data/Rakefile
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
require 'bundler/setup'
|
2
|
-
|
3
|
-
require 'opal/version'
|
4
2
|
require 'opal/rake_task'
|
5
3
|
|
6
4
|
Opal::RakeTask.new do |t|
|
@@ -9,7 +7,8 @@ Opal::RakeTask.new do |t|
|
|
9
7
|
t.parser = true # we want to also build opal-parser.js (used in specs)
|
10
8
|
end
|
11
9
|
|
12
|
-
|
10
|
+
# build runtime, dependencies and specs, then run the tests
|
11
|
+
task :default => %w[opal opal:test]
|
13
12
|
|
14
13
|
desc "Check file sizes for opal.js runtime"
|
15
14
|
task :sizes do
|
@@ -42,4 +41,28 @@ def gzip(str)
|
|
42
41
|
i.close_write
|
43
42
|
return i.read
|
44
43
|
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# For testing just specific sections of opal
|
47
|
+
desc "Build each test case"
|
48
|
+
task :test_cases do
|
49
|
+
FileUtils.mkdir_p 'build/test_cases'
|
50
|
+
|
51
|
+
sources = Dir['spec/core/*', 'spec/language', 'spec/lib', 'spec/opal']
|
52
|
+
|
53
|
+
sources.each do |c|
|
54
|
+
dest = "build/test_cases/#{File.basename c}"
|
55
|
+
FileUtils.mkdir_p dest
|
56
|
+
File.open("#{dest}/specs.js", "w+") do |out|
|
57
|
+
out.puts Opal.build_files(c)
|
58
|
+
end
|
59
|
+
|
60
|
+
File.open("#{dest}/index.html", "w+") do |out|
|
61
|
+
out.puts File.read("spec/test_case.html")
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
File.open("build/test_cases/runner.js", "w+") do |out|
|
66
|
+
out.puts Opal.parse(File.read("spec/spec_helper.rb"))
|
67
|
+
end
|
45
68
|
end
|
data/core/array.rb
CHANGED
@@ -11,7 +11,7 @@ class Array < `Array`
|
|
11
11
|
}
|
12
12
|
end
|
13
13
|
|
14
|
-
def self.new(size, obj = nil)
|
14
|
+
def self.new(size, obj = nil, &block)
|
15
15
|
%x{
|
16
16
|
var arr = [];
|
17
17
|
|
@@ -21,8 +21,15 @@ class Array < `Array`
|
|
21
21
|
}
|
22
22
|
}
|
23
23
|
else {
|
24
|
-
|
25
|
-
|
24
|
+
if (block === nil) {
|
25
|
+
for (var i = 0; i < size; i++) {
|
26
|
+
arr[i] = obj;
|
27
|
+
}
|
28
|
+
}
|
29
|
+
else {
|
30
|
+
for (var i = 0; i < size; i++) {
|
31
|
+
arr[i] = block.call(__context, i);
|
32
|
+
}
|
26
33
|
}
|
27
34
|
}
|
28
35
|
|
@@ -63,7 +70,7 @@ class Array < `Array`
|
|
63
70
|
|
64
71
|
var result = [];
|
65
72
|
|
66
|
-
for (var i = 0
|
73
|
+
for (var i = 0; i < other; i++) {
|
67
74
|
result = result.concat(#{self});
|
68
75
|
}
|
69
76
|
|
@@ -121,7 +128,6 @@ class Array < `Array`
|
|
121
128
|
}
|
122
129
|
end
|
123
130
|
|
124
|
-
# TODO: does not yet work with ranges
|
125
131
|
def [](index, length = undefined)
|
126
132
|
%x{
|
127
133
|
var size = #{self}.length;
|
@@ -169,7 +175,6 @@ class Array < `Array`
|
|
169
175
|
}
|
170
176
|
end
|
171
177
|
|
172
|
-
# TODO: need to expand functionality
|
173
178
|
def []=(index, value)
|
174
179
|
%x{
|
175
180
|
var size = #{self}.length;
|
@@ -209,7 +214,7 @@ class Array < `Array`
|
|
209
214
|
end
|
210
215
|
|
211
216
|
def clear
|
212
|
-
`#{self}.splice(0)
|
217
|
+
`#{self}.splice(0, #{self}.length)`
|
213
218
|
|
214
219
|
self
|
215
220
|
end
|
@@ -365,22 +370,6 @@ class Array < `Array`
|
|
365
370
|
`#{self}.slice(number)`
|
366
371
|
end
|
367
372
|
|
368
|
-
def drop_while(&block)
|
369
|
-
%x{
|
370
|
-
for (var i = 0, length = #{self}.length, value; i < length; i++) {
|
371
|
-
if ((value = block(__context, #{self}[i])) === __breaker) {
|
372
|
-
return __breaker.$v;
|
373
|
-
}
|
374
|
-
|
375
|
-
if (value === false || value === nil) {
|
376
|
-
return #{self}.slice(i);
|
377
|
-
}
|
378
|
-
}
|
379
|
-
|
380
|
-
return [];
|
381
|
-
}
|
382
|
-
end
|
383
|
-
|
384
373
|
alias dup clone
|
385
374
|
|
386
375
|
def each(&block)
|
@@ -399,14 +388,6 @@ class Array < `Array`
|
|
399
388
|
self
|
400
389
|
end
|
401
390
|
|
402
|
-
def each_with_index(&block)
|
403
|
-
`for (var i = 0, length = #{self}.length; i < length; i++) {`
|
404
|
-
yield `#{self}[i]`, `i`
|
405
|
-
`}`
|
406
|
-
|
407
|
-
self
|
408
|
-
end
|
409
|
-
|
410
391
|
def empty?
|
411
392
|
`!#{self}.length`
|
412
393
|
end
|
@@ -481,22 +462,6 @@ class Array < `Array`
|
|
481
462
|
}
|
482
463
|
end
|
483
464
|
|
484
|
-
def grep(pattern)
|
485
|
-
%x{
|
486
|
-
var result = [];
|
487
|
-
|
488
|
-
for (var i = 0, length = #{self}.length, item; i < length; i++) {
|
489
|
-
item = #{self}[i];
|
490
|
-
|
491
|
-
if (#{ pattern === `item` }) {
|
492
|
-
result.push(item);
|
493
|
-
}
|
494
|
-
}
|
495
|
-
|
496
|
-
return result;
|
497
|
-
}
|
498
|
-
end
|
499
|
-
|
500
465
|
def hash
|
501
466
|
`#{self}._id || (#{self}._id = unique_id++)`
|
502
467
|
end
|
@@ -513,11 +478,18 @@ class Array < `Array`
|
|
513
478
|
}
|
514
479
|
end
|
515
480
|
|
516
|
-
def index(object, &block)
|
481
|
+
def index(object=undefined, &block)
|
517
482
|
%x{
|
518
|
-
if (
|
483
|
+
if (object != null) {
|
484
|
+
for (var i = 0, length = #{self}.length; i < length; i++) {
|
485
|
+
if (#{`#{self}[i]` == object}) {
|
486
|
+
return i;
|
487
|
+
}
|
488
|
+
}
|
489
|
+
}
|
490
|
+
else if (block !== nil) {
|
519
491
|
for (var i = 0, length = #{self}.length, value; i < length; i++) {
|
520
|
-
if ((value = block.call(__context,
|
492
|
+
if ((value = block.call(__context, #{self}[i])) === __breaker) {
|
521
493
|
return __breaker.$v;
|
522
494
|
}
|
523
495
|
|
@@ -526,41 +498,11 @@ class Array < `Array`
|
|
526
498
|
}
|
527
499
|
}
|
528
500
|
}
|
529
|
-
else {
|
530
|
-
for (var i = 0, length = #{self}.length; i < length; i++) {
|
531
|
-
if (#{`#{self}[i]` == object}) {
|
532
|
-
return i;
|
533
|
-
}
|
534
|
-
}
|
535
|
-
}
|
536
501
|
|
537
502
|
return nil;
|
538
503
|
}
|
539
504
|
end
|
540
505
|
|
541
|
-
def inject(initial, &block)
|
542
|
-
%x{
|
543
|
-
var result, i;
|
544
|
-
|
545
|
-
if (initial == null) {
|
546
|
-
result = #{self}[0], i = 1;
|
547
|
-
}
|
548
|
-
else {
|
549
|
-
result = initial, i = 0;
|
550
|
-
}
|
551
|
-
|
552
|
-
for (var length = #{self}.length, value; i < length; i++) {
|
553
|
-
if ((value = block(__context, result, #{self}[i])) === __breaker) {
|
554
|
-
return __breaker.$v;
|
555
|
-
}
|
556
|
-
|
557
|
-
result = value;
|
558
|
-
}
|
559
|
-
|
560
|
-
return result;
|
561
|
-
}
|
562
|
-
end
|
563
|
-
|
564
506
|
def insert(index, *objects)
|
565
507
|
%x{
|
566
508
|
if (objects.length > 0) {
|
@@ -619,7 +561,7 @@ class Array < `Array`
|
|
619
561
|
def keep_if(&block)
|
620
562
|
%x{
|
621
563
|
for (var i = 0, length = #{self}.length, value; i < length; i++) {
|
622
|
-
if ((value = block(__context, #{self}[i])) === __breaker) {
|
564
|
+
if ((value = block.call(__context, #{self}[i])) === __breaker) {
|
623
565
|
return __breaker.$v;
|
624
566
|
}
|
625
567
|
|
@@ -674,7 +616,7 @@ class Array < `Array`
|
|
674
616
|
#{ raise "negative count given" };
|
675
617
|
}
|
676
618
|
|
677
|
-
return count > length ? #{self}.splice(0) : #{self}.splice(length - count, length);
|
619
|
+
return count > length ? #{self}.splice(0, #{self}.length) : #{self}.splice(length - count, length);
|
678
620
|
}
|
679
621
|
end
|
680
622
|
|
@@ -744,7 +686,7 @@ class Array < `Array`
|
|
744
686
|
|
745
687
|
def replace(other)
|
746
688
|
%x{
|
747
|
-
#{self}.splice(0);
|
689
|
+
#{self}.splice(0, #{self}.length);
|
748
690
|
#{self}.push.apply(#{self}, other);
|
749
691
|
return #{self};
|
750
692
|
}
|
@@ -770,7 +712,7 @@ class Array < `Array`
|
|
770
712
|
%x{
|
771
713
|
if (block !== nil) {
|
772
714
|
for (var i = #{self}.length - 1, value; i >= 0; i--) {
|
773
|
-
if ((value = block(__context, #{self}[i])) === __breaker) {
|
715
|
+
if ((value = block.call(__context, #{self}[i])) === __breaker) {
|
774
716
|
return __breaker.$v;
|
775
717
|
}
|
776
718
|
|
@@ -798,7 +740,7 @@ class Array < `Array`
|
|
798
740
|
for (var i = 0, length = #{self}.length, item, value; i < length; i++) {
|
799
741
|
item = #{self}[i];
|
800
742
|
|
801
|
-
if ((value = block(__context, item)) === __breaker) {
|
743
|
+
if ((value = block.call(__context, item)) === __breaker) {
|
802
744
|
return __breaker.$v;
|
803
745
|
}
|
804
746
|
|
@@ -854,12 +796,12 @@ class Array < `Array`
|
|
854
796
|
index += #{self}.length;
|
855
797
|
}
|
856
798
|
|
857
|
-
if (
|
858
|
-
return
|
799
|
+
if (length != null) {
|
800
|
+
return #{self}.splice(index, length);
|
859
801
|
}
|
860
802
|
|
861
|
-
if (
|
862
|
-
return
|
803
|
+
if (index < 0 || index >= #{self}.length) {
|
804
|
+
return nil;
|
863
805
|
}
|
864
806
|
|
865
807
|
return #{self}.splice(index, 1)[0];
|
@@ -877,7 +819,7 @@ class Array < `Array`
|
|
877
819
|
for (var i = 0, length = #{self}.length, item, value; i < length; i++) {
|
878
820
|
item = #{self}[i];
|
879
821
|
|
880
|
-
if ((value = block(__context, item)) === __breaker) {
|
822
|
+
if ((value = block.call(__context, item)) === __breaker) {
|
881
823
|
return __breaker.$v;
|
882
824
|
}
|
883
825
|
|
@@ -958,7 +900,7 @@ class Array < `Array`
|
|
958
900
|
|
959
901
|
def unshift(*objects)
|
960
902
|
%x{
|
961
|
-
for (var i =
|
903
|
+
for (var i = objects.length - 1; i >= 0; i--) {
|
962
904
|
#{self}.unshift(objects[i]);
|
963
905
|
}
|
964
906
|
|
data/core/boolean.rb
CHANGED
data/core/class.rb
CHANGED
@@ -81,63 +81,12 @@ class Class
|
|
81
81
|
self
|
82
82
|
end
|
83
83
|
|
84
|
-
#
|
85
|
-
|
86
|
-
function define_attr(klass, name, getter, setter) {
|
87
|
-
if (getter) {
|
88
|
-
klass.prototype['$' + name] = function() {
|
89
|
-
var res = this[name];
|
90
|
-
return res == null ? nil : res;
|
91
|
-
};
|
92
|
-
|
93
|
-
klass._donate([name]);
|
94
|
-
}
|
95
|
-
|
96
|
-
if (setter) {
|
97
|
-
klass.prototype['$' + name + '='] = function(val) {
|
98
|
-
return this[name] = val;
|
99
|
-
};
|
100
|
-
|
101
|
-
klass._donate([name]);
|
102
|
-
}
|
103
|
-
}
|
104
|
-
}
|
105
|
-
|
106
|
-
def attr_accessor(*attrs)
|
107
|
-
%x{
|
108
|
-
for (var i = 0, length = attrs.length; i < length; i++) {
|
109
|
-
define_attr(#{self}, attrs[i], true, true);
|
110
|
-
}
|
111
|
-
|
112
|
-
return nil;
|
113
|
-
}
|
114
|
-
end
|
115
|
-
|
116
|
-
def attr_reader(*attrs)
|
117
|
-
%x{
|
118
|
-
for (var i = 0, length = attrs.length; i < length; i++) {
|
119
|
-
define_attr(#{self}, attrs[i], true, false);
|
120
|
-
}
|
121
|
-
|
122
|
-
return nil;
|
123
|
-
}
|
124
|
-
end
|
125
|
-
|
126
|
-
def attr_writer(*attrs)
|
127
|
-
%x{
|
128
|
-
for (var i = 0, length = attrs.length; i < length; i++) {
|
129
|
-
define_attr(#{self}, attrs[i], false, true);
|
130
|
-
}
|
84
|
+
# handled by parser
|
85
|
+
def attr_accessor(*); end
|
131
86
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
def attr(name, setter = false)
|
137
|
-
`define_attr(#{self}, name, true, setter)`
|
138
|
-
|
139
|
-
self
|
140
|
-
end
|
87
|
+
alias attr_reader attr_accessor
|
88
|
+
alias attr_writer attr_accessor
|
89
|
+
alias attr attr_accessor
|
141
90
|
|
142
91
|
def define_method(name, &block)
|
143
92
|
%x{
|
@@ -175,9 +124,22 @@ class Class
|
|
175
124
|
}
|
176
125
|
end
|
177
126
|
|
178
|
-
|
179
|
-
|
180
|
-
|
127
|
+
def instance_methods(include_super = false)
|
128
|
+
%x{
|
129
|
+
var methods = [], proto = #{self}.prototype;
|
130
|
+
|
131
|
+
for (var prop in #{self}.prototype) {
|
132
|
+
if (!include_super && !proto.hasOwnProperty(prop)) {
|
133
|
+
continue;
|
134
|
+
}
|
135
|
+
|
136
|
+
if (prop.charAt(0) === '$') {
|
137
|
+
methods.push(prop.substr(1));
|
138
|
+
}
|
139
|
+
}
|
140
|
+
|
141
|
+
return methods;
|
142
|
+
}
|
181
143
|
end
|
182
144
|
|
183
145
|
def included(mod)
|
@@ -213,20 +175,12 @@ class Class
|
|
213
175
|
}
|
214
176
|
end
|
215
177
|
|
216
|
-
def
|
217
|
-
%x{
|
218
|
-
if (#{self}._singleton) {
|
219
|
-
return #{self}._singleton;
|
220
|
-
}
|
221
|
-
|
222
|
-
var meta = new __opal.Class;
|
223
|
-
#{self}._singleton = meta;
|
224
|
-
meta.prototype = #{self};
|
225
|
-
|
226
|
-
return meta;
|
227
|
-
}
|
178
|
+
def public(*)
|
228
179
|
end
|
229
180
|
|
181
|
+
alias private public
|
182
|
+
alias protected public
|
183
|
+
|
230
184
|
def superclass
|
231
185
|
%x{
|
232
186
|
return #{self}._super || nil;
|