opal 0.3.19 → 0.3.20
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 +3 -1
- data/Gemfile +3 -2
- data/README.md +304 -48
- data/Rakefile +1 -2
- data/core/alpha.rb +2 -1
- data/core/array.rb +92 -96
- data/core/basic_object.rb +1 -10
- data/core/boolean.rb +6 -18
- data/core/class.rb +9 -10
- data/core/comparable.rb +1 -1
- data/core/enumerable.rb +11 -11
- data/core/enumerator.rb +2 -10
- data/core/error.rb +16 -31
- data/core/hash.rb +32 -36
- data/core/json.rb +50 -0
- data/core/kernel.rb +48 -57
- data/core/load_order +3 -5
- data/core/module.rb +37 -35
- data/core/nil_class.rb +4 -0
- data/core/numeric.rb +10 -30
- data/core/proc.rb +1 -1
- data/core/range.rb +3 -4
- data/core/regexp.rb +21 -6
- data/core/runtime.js +278 -370
- data/core/string.rb +21 -37
- data/core/struct.rb +11 -3
- data/core/time.rb +44 -37
- data/lib/opal.rb +3 -3
- data/lib/opal/builder.rb +48 -27
- data/lib/opal/builder_task.rb +3 -20
- data/lib/opal/grammar.rb +18 -13
- data/lib/opal/grammar.y +7 -4
- data/lib/opal/parser.rb +290 -199
- data/lib/opal/scope.rb +187 -176
- data/lib/opal/version.rb +1 -1
- data/test/core/kernel/define_singleton_method_spec.rb +21 -0
- data/test/core/time/at_spec.rb +7 -0
- data/test/core/time/day_spec.rb +5 -0
- data/test/core/time/friday_spec.rb +9 -0
- data/test/core/time/hour_spec.rb +5 -0
- data/test/core/time/min_spec.rb +5 -0
- data/test/core/time/monday_spec.rb +9 -0
- data/test/core/time/month_spec.rb +5 -0
- data/test/core/time/now_spec.rb +5 -0
- data/test/core/time/saturday_spec.rb +9 -0
- data/test/index.html +2 -1
- data/test/language/singleton_class_spec.rb +0 -16
- data/test/opal/array/to_json_spec.rb +7 -0
- data/test/opal/boolean/singleton_class_spec.rb +9 -0
- data/test/opal/boolean/to_json_spec.rb +9 -0
- data/test/opal/hash/to_json_spec.rb +9 -0
- data/test/opal/json/parse_spec.rb +31 -0
- data/test/opal/kernel/to_json_spec.rb +5 -0
- data/test/opal/nil/to_json_spec.rb +5 -0
- data/test/opal/numeric/to_json_spec.rb +6 -0
- data/test/opal/runtime/call_spec.rb +16 -0
- data/test/opal/runtime/defined_spec.rb +11 -0
- data/test/opal/runtime/super_spec.rb +16 -0
- data/test/opal/string/to_json_spec.rb +6 -0
- data/test/spec_helper.rb +1 -3
- metadata +48 -15
- data/core/dir.rb +0 -89
- data/core/file.rb +0 -85
- data/core/match_data.rb +0 -35
- data/core/rational.rb +0 -16
- data/test/core/file/expand_path_spec.rb +0 -20
data/Rakefile
CHANGED
@@ -8,9 +8,8 @@ require 'opal/version'
|
|
8
8
|
Opal::BuilderTask.new do |t|
|
9
9
|
t.name = 'opal'
|
10
10
|
t.files = []
|
11
|
-
t.dependencies = %w[opal-spec]
|
11
|
+
t.dependencies = %w[opal-spec opal-dom]
|
12
12
|
t.specs_dir = 'test'
|
13
|
-
t.specs_main = 'test/spec_helper'
|
14
13
|
end
|
15
14
|
|
16
15
|
desc "Build opal.js runtime into ./build"
|
data/core/alpha.rb
CHANGED
data/core/array.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
class Array < `Array`
|
2
2
|
%x{
|
3
|
-
|
3
|
+
Array_prototype._isArray = true;
|
4
4
|
}
|
5
5
|
|
6
6
|
include Enumerable
|
@@ -25,16 +25,14 @@ class Array < `Array`
|
|
25
25
|
seen = {};
|
26
26
|
|
27
27
|
for (var i = 0, length = this.length; i < length; i++) {
|
28
|
-
var item = this[i]
|
29
|
-
hash = item;
|
28
|
+
var item = this[i];
|
30
29
|
|
31
|
-
if (!seen[
|
30
|
+
if (!seen[item]) {
|
32
31
|
for (var j = 0, length2 = other.length; j < length2; j++) {
|
33
|
-
var item2 = other[j]
|
34
|
-
hash2 = item2;
|
32
|
+
var item2 = other[j];
|
35
33
|
|
36
|
-
if ((
|
37
|
-
seen[
|
34
|
+
if ((item === item2) && !seen[item]) {
|
35
|
+
seen[item] = true;
|
38
36
|
|
39
37
|
result.push(item);
|
40
38
|
}
|
@@ -63,7 +61,7 @@ class Array < `Array`
|
|
63
61
|
end
|
64
62
|
|
65
63
|
def +(other)
|
66
|
-
`this.slice(
|
64
|
+
`this.slice().concat(other.slice())`
|
67
65
|
end
|
68
66
|
|
69
67
|
def <<(object)
|
@@ -131,7 +129,7 @@ class Array < `Array`
|
|
131
129
|
return this.slice(index, length);
|
132
130
|
}
|
133
131
|
else {
|
134
|
-
|
132
|
+
#{ raise "bad arg for Array#[]" };
|
135
133
|
}
|
136
134
|
}
|
137
135
|
|
@@ -280,9 +278,9 @@ class Array < `Array`
|
|
280
278
|
self
|
281
279
|
end
|
282
280
|
|
283
|
-
def count(object
|
281
|
+
def count(object)
|
284
282
|
%x{
|
285
|
-
if (object
|
283
|
+
if (object == null) {
|
286
284
|
return this.length;
|
287
285
|
}
|
288
286
|
|
@@ -363,8 +361,8 @@ class Array < `Array`
|
|
363
361
|
|
364
362
|
%x{
|
365
363
|
for (var i = 0, length = this.length, value; i < length; i++) {
|
366
|
-
if ((value = block.call(__context, this[i])) ===
|
367
|
-
return
|
364
|
+
if ((value = block.call(__context, this[i])) === __breaker) {
|
365
|
+
return __breaker.$v;
|
368
366
|
}
|
369
367
|
|
370
368
|
if (value === false || value === nil) {
|
@@ -381,13 +379,9 @@ class Array < `Array`
|
|
381
379
|
def each(&block)
|
382
380
|
return enum_for :each unless block_given?
|
383
381
|
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
return __breaker.$v;
|
388
|
-
}
|
389
|
-
}
|
390
|
-
}
|
382
|
+
`for (var i = 0, length = this.length; i < length; i++) {`
|
383
|
+
yield `this[i]`
|
384
|
+
`}`
|
391
385
|
|
392
386
|
self
|
393
387
|
end
|
@@ -395,13 +389,9 @@ class Array < `Array`
|
|
395
389
|
def each_index(&block)
|
396
390
|
return enum_for :each_index unless block_given?
|
397
391
|
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
return __breaker.$v;
|
402
|
-
}
|
403
|
-
}
|
404
|
-
}
|
392
|
+
`for (var i = 0, length = this.length; i < length; i++) {`
|
393
|
+
yield `i`
|
394
|
+
`}`
|
405
395
|
|
406
396
|
self
|
407
397
|
end
|
@@ -409,22 +399,18 @@ class Array < `Array`
|
|
409
399
|
def each_with_index(&block)
|
410
400
|
return enum_for :each_with_index unless block_given?
|
411
401
|
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
return __breaker.$v;
|
416
|
-
}
|
417
|
-
}
|
418
|
-
}
|
402
|
+
`for (var i = 0, length = this.length; i < length; i++) {`
|
403
|
+
yield `this[i]`, `i`
|
404
|
+
`}`
|
419
405
|
|
420
406
|
self
|
421
407
|
end
|
422
408
|
|
423
409
|
def empty?
|
424
|
-
|
410
|
+
`!this.length`
|
425
411
|
end
|
426
412
|
|
427
|
-
def fetch(index, defaults
|
413
|
+
def fetch(index, defaults, &block)
|
428
414
|
%x{
|
429
415
|
var original = index;
|
430
416
|
|
@@ -436,21 +422,21 @@ class Array < `Array`
|
|
436
422
|
return this[index];
|
437
423
|
}
|
438
424
|
|
439
|
-
if (defaults
|
425
|
+
if (defaults != null) {
|
440
426
|
return defaults;
|
441
427
|
}
|
442
428
|
|
443
|
-
if (block !==
|
444
|
-
return block.call(
|
429
|
+
if (block !== nil) {
|
430
|
+
return block.call(__context, original);
|
445
431
|
}
|
446
432
|
|
447
|
-
|
433
|
+
#{ raise "Array#fetch" };
|
448
434
|
}
|
449
435
|
end
|
450
436
|
|
451
|
-
def first(count
|
437
|
+
def first(count)
|
452
438
|
%x{
|
453
|
-
if (count
|
439
|
+
if (count != null) {
|
454
440
|
return this.slice(0, count);
|
455
441
|
}
|
456
442
|
|
@@ -458,7 +444,7 @@ class Array < `Array`
|
|
458
444
|
}
|
459
445
|
end
|
460
446
|
|
461
|
-
def flatten(level
|
447
|
+
def flatten(level)
|
462
448
|
%x{
|
463
449
|
var result = [];
|
464
450
|
|
@@ -466,7 +452,7 @@ class Array < `Array`
|
|
466
452
|
item = this[i];
|
467
453
|
|
468
454
|
if (item._isArray) {
|
469
|
-
if (level
|
455
|
+
if (level == null) {
|
470
456
|
result = result.concat(#{`item`.flatten});
|
471
457
|
}
|
472
458
|
else if (level === 0) {
|
@@ -485,7 +471,7 @@ class Array < `Array`
|
|
485
471
|
}
|
486
472
|
end
|
487
473
|
|
488
|
-
def flatten!(level
|
474
|
+
def flatten!(level)
|
489
475
|
%x{
|
490
476
|
var size = this.length;
|
491
477
|
#{replace flatten level};
|
@@ -501,7 +487,7 @@ class Array < `Array`
|
|
501
487
|
for (var i = 0, length = this.length, item; i < length; i++) {
|
502
488
|
item = this[i];
|
503
489
|
|
504
|
-
if (#{pattern === `item`}) {
|
490
|
+
if (#{ pattern === `item` }) {
|
505
491
|
result.push(item);
|
506
492
|
}
|
507
493
|
}
|
@@ -526,17 +512,17 @@ class Array < `Array`
|
|
526
512
|
}
|
527
513
|
end
|
528
514
|
|
529
|
-
def index(object
|
515
|
+
def index(object, &block)
|
530
516
|
return enum_for :index unless block_given? && object == undefined
|
531
517
|
|
532
518
|
%x{
|
533
|
-
if (block !==
|
519
|
+
if (block !== nil) {
|
534
520
|
for (var i = 0, length = this.length, value; i < length; i++) {
|
535
|
-
if ((value = block.call(
|
536
|
-
return
|
521
|
+
if ((value = block.call(__context, this[i])) === __breaker) {
|
522
|
+
return __breaker.$v;
|
537
523
|
}
|
538
524
|
|
539
|
-
if (value !== false && value !==
|
525
|
+
if (value !== false && value !== nil) {
|
540
526
|
return i;
|
541
527
|
}
|
542
528
|
}
|
@@ -549,28 +535,26 @@ class Array < `Array`
|
|
549
535
|
}
|
550
536
|
}
|
551
537
|
|
552
|
-
return
|
538
|
+
return nil;
|
553
539
|
}
|
554
540
|
end
|
555
541
|
|
556
|
-
def inject(initial
|
542
|
+
def inject(initial, &block)
|
557
543
|
return enum_for :inject unless block_given?
|
558
544
|
|
559
545
|
%x{
|
560
546
|
var result, i;
|
561
547
|
|
562
|
-
if (initial
|
563
|
-
result = this[0];
|
564
|
-
i = 1;
|
548
|
+
if (initial == null) {
|
549
|
+
result = this[0], i = 1;
|
565
550
|
}
|
566
551
|
else {
|
567
|
-
result = initial;
|
568
|
-
i = 0;
|
552
|
+
result = initial, i = 0;
|
569
553
|
}
|
570
554
|
|
571
555
|
for (var length = this.length, value; i < length; i++) {
|
572
|
-
if ((value = block.call(
|
573
|
-
return
|
556
|
+
if ((value = block.call(__context, result, this[i])) === __breaker) {
|
557
|
+
return __breaker.$v;
|
574
558
|
}
|
575
559
|
|
576
560
|
result = value;
|
@@ -587,7 +571,7 @@ class Array < `Array`
|
|
587
571
|
index += this.length + 1;
|
588
572
|
|
589
573
|
if (index < 0) {
|
590
|
-
|
574
|
+
#{ raise "#{index} is out of bounds" };
|
591
575
|
}
|
592
576
|
}
|
593
577
|
if (index > this.length) {
|
@@ -631,11 +615,11 @@ class Array < `Array`
|
|
631
615
|
return enum_for :keep_if unless block_given?
|
632
616
|
%x{
|
633
617
|
for (var i = 0, length = this.length, value; i < length; i++) {
|
634
|
-
if ((value = block.call(
|
635
|
-
return
|
618
|
+
if ((value = block.call(__context, this[i])) === __breaker) {
|
619
|
+
return __breaker.$v;
|
636
620
|
}
|
637
621
|
|
638
|
-
if (value === false || value ===
|
622
|
+
if (value === false || value === nil) {
|
639
623
|
this.splice(i, 1);
|
640
624
|
|
641
625
|
length--;
|
@@ -647,15 +631,15 @@ class Array < `Array`
|
|
647
631
|
self
|
648
632
|
end
|
649
633
|
|
650
|
-
def last(count
|
634
|
+
def last(count)
|
651
635
|
%x{
|
652
636
|
var length = this.length;
|
653
637
|
|
654
|
-
if (count
|
638
|
+
if (count == null) {
|
655
639
|
return length === 0 ? nil : this[length - 1];
|
656
640
|
}
|
657
641
|
else if (count < 0) {
|
658
|
-
|
642
|
+
#{ raise "negative count given" };
|
659
643
|
}
|
660
644
|
|
661
645
|
if (count > length) {
|
@@ -674,16 +658,16 @@ class Array < `Array`
|
|
674
658
|
|
675
659
|
alias map! collect!
|
676
660
|
|
677
|
-
def pop(count
|
661
|
+
def pop(count)
|
678
662
|
%x{
|
679
663
|
var length = this.length;
|
680
664
|
|
681
|
-
if (count
|
665
|
+
if (count == null) {
|
682
666
|
return length === 0 ? nil : this.pop();
|
683
667
|
}
|
684
668
|
|
685
669
|
if (count < 0) {
|
686
|
-
|
670
|
+
#{ raise "negative count given" };
|
687
671
|
}
|
688
672
|
|
689
673
|
return count > length ? this.splice(0) : this.splice(length - count, length);
|
@@ -786,17 +770,17 @@ class Array < `Array`
|
|
786
770
|
self
|
787
771
|
end
|
788
772
|
|
789
|
-
def rindex(object
|
790
|
-
return enum_for :rindex unless block_given?
|
773
|
+
def rindex(object, &block)
|
774
|
+
return enum_for :rindex unless block_given?
|
791
775
|
|
792
776
|
%x{
|
793
|
-
if (block !==
|
777
|
+
if (block !== nil) {
|
794
778
|
for (var i = this.length - 1, value; i >= 0; i--) {
|
795
|
-
if ((value = block.call(
|
796
|
-
return
|
779
|
+
if ((value = block.call(__context, this[i])) === __breaker) {
|
780
|
+
return __breaker.$v;
|
797
781
|
}
|
798
782
|
|
799
|
-
if (value !== false && value !==
|
783
|
+
if (value !== false && value !== nil) {
|
800
784
|
return i;
|
801
785
|
}
|
802
786
|
}
|
@@ -809,7 +793,7 @@ class Array < `Array`
|
|
809
793
|
}
|
810
794
|
}
|
811
795
|
|
812
|
-
return
|
796
|
+
return nil;
|
813
797
|
}
|
814
798
|
end
|
815
799
|
|
@@ -822,11 +806,11 @@ class Array < `Array`
|
|
822
806
|
for (var i = 0, length = this.length, item, value; i < length; i++) {
|
823
807
|
item = this[i];
|
824
808
|
|
825
|
-
if ((value = block.call(
|
826
|
-
return
|
809
|
+
if ((value = block.call(__context, item)) === __breaker) {
|
810
|
+
return __breaker.$v;
|
827
811
|
}
|
828
812
|
|
829
|
-
if (value !== false && value !==
|
813
|
+
if (value !== false && value !== nil) {
|
830
814
|
result.push(item);
|
831
815
|
}
|
832
816
|
}
|
@@ -843,11 +827,11 @@ class Array < `Array`
|
|
843
827
|
for (var i = 0, length = original, item, value; i < length; i++) {
|
844
828
|
item = this[i];
|
845
829
|
|
846
|
-
if ((value = block.call(
|
847
|
-
return
|
830
|
+
if ((value = block.call(__context, item)) === __breaker) {
|
831
|
+
return __breaker.$v;
|
848
832
|
}
|
849
833
|
|
850
|
-
if (value === false || value ===
|
834
|
+
if (value === false || value === nil) {
|
851
835
|
this.splice(i, 1);
|
852
836
|
|
853
837
|
length--;
|
@@ -855,29 +839,29 @@ class Array < `Array`
|
|
855
839
|
}
|
856
840
|
}
|
857
841
|
|
858
|
-
return this.length === original ?
|
842
|
+
return this.length === original ? nil : this;
|
859
843
|
}
|
860
844
|
end
|
861
845
|
|
862
|
-
def shift(count
|
863
|
-
`count
|
846
|
+
def shift(count)
|
847
|
+
`count == null ? this.shift() : this.splice(0, count)`
|
864
848
|
end
|
865
849
|
|
866
850
|
alias size length
|
867
851
|
|
868
852
|
alias slice :[]
|
869
853
|
|
870
|
-
def slice!(index, length
|
854
|
+
def slice!(index, length)
|
871
855
|
%x{
|
872
856
|
if (index < 0) {
|
873
857
|
index += this.length;
|
874
858
|
}
|
875
859
|
|
876
860
|
if (index < 0 || index >= this.length) {
|
877
|
-
return
|
861
|
+
return nil;
|
878
862
|
}
|
879
863
|
|
880
|
-
if (length
|
864
|
+
if (length != null) {
|
881
865
|
return this.splice(index, index + length);
|
882
866
|
}
|
883
867
|
|
@@ -898,11 +882,11 @@ class Array < `Array`
|
|
898
882
|
for (var i = 0, length = this.length, item, value; i < length; i++) {
|
899
883
|
item = this[i];
|
900
884
|
|
901
|
-
if ((value = block.call(
|
902
|
-
return
|
885
|
+
if ((value = block.call(__context, item)) === __breaker) {
|
886
|
+
return __breaker.$v;
|
903
887
|
}
|
904
888
|
|
905
|
-
if (value === false || value ===
|
889
|
+
if (value === false || value === nil) {
|
906
890
|
return result;
|
907
891
|
}
|
908
892
|
|
@@ -919,6 +903,18 @@ class Array < `Array`
|
|
919
903
|
|
920
904
|
alias to_ary to_a
|
921
905
|
|
906
|
+
def to_json
|
907
|
+
%x{
|
908
|
+
var result = [];
|
909
|
+
|
910
|
+
for (var i = 0, length = this.length; i < length; i++) {
|
911
|
+
result.push(#{ `this[i]`.to_json });
|
912
|
+
}
|
913
|
+
|
914
|
+
return '[' + result.join(', ') + ']';
|
915
|
+
}
|
916
|
+
end
|
917
|
+
|
922
918
|
alias to_s inspect
|
923
919
|
|
924
920
|
def uniq
|
@@ -948,7 +944,7 @@ class Array < `Array`
|
|
948
944
|
|
949
945
|
for (var i = 0, length = original, item, hash; i < length; i++) {
|
950
946
|
item = this[i];
|
951
|
-
hash = item.$hash()
|
947
|
+
hash = item.$hash();
|
952
948
|
|
953
949
|
if (!seen[hash]) {
|
954
950
|
seen[hash] = true;
|
@@ -985,7 +981,7 @@ class Array < `Array`
|
|
985
981
|
for (var j = 0, jj = others.length; j < jj; j++) {
|
986
982
|
o = others[j][i];
|
987
983
|
|
988
|
-
if (o
|
984
|
+
if (o == null) {
|
989
985
|
o = nil;
|
990
986
|
}
|
991
987
|
|
@@ -1006,4 +1002,4 @@ class Array < `Array`
|
|
1006
1002
|
return result;
|
1007
1003
|
}
|
1008
1004
|
end
|
1009
|
-
end
|
1005
|
+
end
|