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.
Files changed (66) hide show
  1. data/.gitignore +3 -1
  2. data/Gemfile +3 -2
  3. data/README.md +304 -48
  4. data/Rakefile +1 -2
  5. data/core/alpha.rb +2 -1
  6. data/core/array.rb +92 -96
  7. data/core/basic_object.rb +1 -10
  8. data/core/boolean.rb +6 -18
  9. data/core/class.rb +9 -10
  10. data/core/comparable.rb +1 -1
  11. data/core/enumerable.rb +11 -11
  12. data/core/enumerator.rb +2 -10
  13. data/core/error.rb +16 -31
  14. data/core/hash.rb +32 -36
  15. data/core/json.rb +50 -0
  16. data/core/kernel.rb +48 -57
  17. data/core/load_order +3 -5
  18. data/core/module.rb +37 -35
  19. data/core/nil_class.rb +4 -0
  20. data/core/numeric.rb +10 -30
  21. data/core/proc.rb +1 -1
  22. data/core/range.rb +3 -4
  23. data/core/regexp.rb +21 -6
  24. data/core/runtime.js +278 -370
  25. data/core/string.rb +21 -37
  26. data/core/struct.rb +11 -3
  27. data/core/time.rb +44 -37
  28. data/lib/opal.rb +3 -3
  29. data/lib/opal/builder.rb +48 -27
  30. data/lib/opal/builder_task.rb +3 -20
  31. data/lib/opal/grammar.rb +18 -13
  32. data/lib/opal/grammar.y +7 -4
  33. data/lib/opal/parser.rb +290 -199
  34. data/lib/opal/scope.rb +187 -176
  35. data/lib/opal/version.rb +1 -1
  36. data/test/core/kernel/define_singleton_method_spec.rb +21 -0
  37. data/test/core/time/at_spec.rb +7 -0
  38. data/test/core/time/day_spec.rb +5 -0
  39. data/test/core/time/friday_spec.rb +9 -0
  40. data/test/core/time/hour_spec.rb +5 -0
  41. data/test/core/time/min_spec.rb +5 -0
  42. data/test/core/time/monday_spec.rb +9 -0
  43. data/test/core/time/month_spec.rb +5 -0
  44. data/test/core/time/now_spec.rb +5 -0
  45. data/test/core/time/saturday_spec.rb +9 -0
  46. data/test/index.html +2 -1
  47. data/test/language/singleton_class_spec.rb +0 -16
  48. data/test/opal/array/to_json_spec.rb +7 -0
  49. data/test/opal/boolean/singleton_class_spec.rb +9 -0
  50. data/test/opal/boolean/to_json_spec.rb +9 -0
  51. data/test/opal/hash/to_json_spec.rb +9 -0
  52. data/test/opal/json/parse_spec.rb +31 -0
  53. data/test/opal/kernel/to_json_spec.rb +5 -0
  54. data/test/opal/nil/to_json_spec.rb +5 -0
  55. data/test/opal/numeric/to_json_spec.rb +6 -0
  56. data/test/opal/runtime/call_spec.rb +16 -0
  57. data/test/opal/runtime/defined_spec.rb +11 -0
  58. data/test/opal/runtime/super_spec.rb +16 -0
  59. data/test/opal/string/to_json_spec.rb +6 -0
  60. data/test/spec_helper.rb +1 -3
  61. metadata +48 -15
  62. data/core/dir.rb +0 -89
  63. data/core/file.rb +0 -85
  64. data/core/match_data.rb +0 -35
  65. data/core/rational.rb +0 -16
  66. 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"
@@ -5,4 +5,5 @@ $/ = "\n"
5
5
 
6
6
  RUBY_ENGINE = 'opal'
7
7
  RUBY_PLATFORM = 'opal'
8
- RUBY_VERSION = '1.9.2'
8
+ RUBY_VERSION = '1.9.2'
9
+ OPAL_VERSION = `__opal.version`
@@ -1,6 +1,6 @@
1
1
  class Array < `Array`
2
2
  %x{
3
- def._isArray = true;
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[hash]) {
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 ((hash === hash2) && !seen[hash]) {
37
- seen[hash] = true;
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(0).concat(other.slice(0))`
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
- throw RubyException.$new('bad arg for Array#[]');
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 = undefined)
281
+ def count(object)
284
282
  %x{
285
- if (object === undefined) {
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])) === $breaker) {
367
- return $breaker.$v;
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
- %x{
385
- for (var i = 0, length = this.length; i < length; i++) {
386
- if (block.call(__context, this[i]) === __breaker) {
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
- %x{
399
- for (var i = 0, length = this.length; i < length; i++) {
400
- if (block.call(__context, i) === __breaker) {
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
- %x{
413
- for (var i = 0, length = this.length; i < length; i++) {
414
- if (block.call(__context, this[i], i) === __breaker) {
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
- `this.length === 0`
410
+ `!this.length`
425
411
  end
426
412
 
427
- def fetch(index, defaults = undefined, &block)
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 !== undefined) {
425
+ if (defaults != null) {
440
426
  return defaults;
441
427
  }
442
428
 
443
- if (block !== null) {
444
- return block.call($context, nil, original);
429
+ if (block !== nil) {
430
+ return block.call(__context, original);
445
431
  }
446
432
 
447
- throw RubyIndexError.$new('Array#fetch');
433
+ #{ raise "Array#fetch" };
448
434
  }
449
435
  end
450
436
 
451
- def first(count = undefined)
437
+ def first(count)
452
438
  %x{
453
- if (count !== undefined) {
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 = undefined)
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 === undefined) {
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 = undefined)
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 = undefined, &block)
515
+ def index(object, &block)
530
516
  return enum_for :index unless block_given? && object == undefined
531
517
 
532
518
  %x{
533
- if (block !== null) {
519
+ if (block !== nil) {
534
520
  for (var i = 0, length = this.length, value; i < length; i++) {
535
- if ((value = block.call($context, null, this[i])) === $breaker) {
536
- return $breaker.$v;
521
+ if ((value = block.call(__context, this[i])) === __breaker) {
522
+ return __breaker.$v;
537
523
  }
538
524
 
539
- if (value !== false && value !== null) {
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 null
538
+ return nil;
553
539
  }
554
540
  end
555
541
 
556
- def inject(initial = undefined, &block)
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 === undefined) {
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($context, null, result, this[i])) === $breaker) {
573
- return $breaker.$v;
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
- throw RubyIndexError.$new(index + ' is out of bounds');
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($context, null, this[i])) === $breaker) {
635
- return $breaker.$v;
618
+ if ((value = block.call(__context, this[i])) === __breaker) {
619
+ return __breaker.$v;
636
620
  }
637
621
 
638
- if (value === false || value === null) {
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 = undefined)
634
+ def last(count)
651
635
  %x{
652
636
  var length = this.length;
653
637
 
654
- if (count === undefined) {
638
+ if (count == null) {
655
639
  return length === 0 ? nil : this[length - 1];
656
640
  }
657
641
  else if (count < 0) {
658
- throw RubyArgError.$new('negative count given');
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 = undefined)
661
+ def pop(count)
678
662
  %x{
679
663
  var length = this.length;
680
664
 
681
- if (count === undefined) {
665
+ if (count == null) {
682
666
  return length === 0 ? nil : this.pop();
683
667
  }
684
668
 
685
669
  if (count < 0) {
686
- throw RubyArgError.$new('negative count given');
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 = undefined, &block)
790
- return enum_for :rindex unless block_given? && object == undefined
773
+ def rindex(object, &block)
774
+ return enum_for :rindex unless block_given?
791
775
 
792
776
  %x{
793
- if (block !== null) {
777
+ if (block !== nil) {
794
778
  for (var i = this.length - 1, value; i >= 0; i--) {
795
- if ((value = block.call($context, null, this[i])) === $breaker) {
796
- return $breaker.$v;
779
+ if ((value = block.call(__context, this[i])) === __breaker) {
780
+ return __breaker.$v;
797
781
  }
798
782
 
799
- if (value !== false && value !== null) {
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 null;
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($context, null, item)) === $breaker) {
826
- return $breaker.$v;
809
+ if ((value = block.call(__context, item)) === __breaker) {
810
+ return __breaker.$v;
827
811
  }
828
812
 
829
- if (value !== false && value !== null) {
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($context, null, item)) === $breaker) {
847
- return $breaker.$v;
830
+ if ((value = block.call(__context, item)) === __breaker) {
831
+ return __breaker.$v;
848
832
  }
849
833
 
850
- if (value === false || value === null) {
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 ? null : this;
842
+ return this.length === original ? nil : this;
859
843
  }
860
844
  end
861
845
 
862
- def shift(count = undefined)
863
- `count === undefined ? this.shift() : this.splice(0, 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 = undefined)
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 null;
861
+ return nil;
878
862
  }
879
863
 
880
- if (length !== undefined) {
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($context, null, item)) === $breaker) {
902
- return $breaker.$v;
885
+ if ((value = block.call(__context, item)) === __breaker) {
886
+ return __breaker.$v;
903
887
  }
904
888
 
905
- if (value === false || value === null) {
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 === undefined) {
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