opal 0.3.43 → 0.3.44

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 (98) hide show
  1. data/CHANGELOG.md +19 -0
  2. data/README.md +1 -0
  3. data/Rakefile +29 -19
  4. data/examples/native/Gemfile +3 -0
  5. data/examples/native/README.md +17 -0
  6. data/examples/native/app/app.rb +38 -0
  7. data/examples/native/config.ru +8 -0
  8. data/examples/native/index.html.erb +12 -0
  9. data/lib/opal/lexer.rb +5 -1
  10. data/lib/opal/parser.rb +36 -10
  11. data/lib/opal/processor.rb +10 -9
  12. data/lib/opal/server.rb +17 -7
  13. data/lib/opal/target_scope.rb +2 -2
  14. data/lib/opal/version.rb +1 -1
  15. data/opal/opal-browser/script_loader.rb +8 -13
  16. data/opal/opal.rb +23 -5
  17. data/opal/opal/array.rb +128 -14
  18. data/opal/opal/boolean.rb +1 -1
  19. data/opal/opal/class.rb +92 -18
  20. data/opal/opal/enumerable.rb +90 -0
  21. data/opal/opal/error.rb +1 -1
  22. data/opal/opal/hash.rb +2 -2
  23. data/opal/opal/kernel.rb +3 -3
  24. data/opal/opal/numeric.rb +1 -1
  25. data/opal/opal/proc.rb +1 -1
  26. data/opal/opal/regexp.rb +31 -31
  27. data/opal/opal/runtime.js +181 -69
  28. data/opal/opal/string.rb +561 -40
  29. data/opal/opal/time.rb +1 -1
  30. data/opal/rbconfig.rb +17 -3
  31. data/opal/strscan.rb +41 -5
  32. data/spec/opal/class/new_spec.rb +27 -0
  33. data/spec/opal/native_spec.rb +127 -0
  34. data/spec/ospec/runner.rb +0 -2
  35. data/spec/parser/strscan/get_byte_spec.rb +29 -0
  36. data/spec/parser/strscan/skip_spec.rb +40 -0
  37. data/spec/rubyspec/core/array/each_spec.rb +1 -1
  38. data/spec/rubyspec/core/array/intersection_spec.rb +5 -0
  39. data/spec/rubyspec/core/array/max_spec.rb +32 -0
  40. data/spec/rubyspec/core/array/min_spec.rb +32 -0
  41. data/spec/rubyspec/core/array/minus_spec.rb +7 -5
  42. data/spec/rubyspec/core/array/multiply_spec.rb +1 -1
  43. data/spec/rubyspec/core/array/plus_spec.rb +1 -1
  44. data/spec/rubyspec/core/array/pop_spec.rb +1 -1
  45. data/spec/rubyspec/core/array/push_spec.rb +1 -1
  46. data/spec/rubyspec/core/array/rassoc_spec.rb +1 -1
  47. data/spec/rubyspec/core/array/reject_spec.rb +2 -2
  48. data/spec/rubyspec/core/array/reverse_each_spec.rb +2 -2
  49. data/spec/rubyspec/core/array/rindex_spec.rb +2 -2
  50. data/spec/rubyspec/core/array/select_spec.rb +1 -1
  51. data/spec/rubyspec/core/array/shift_spec.rb +1 -1
  52. data/spec/rubyspec/core/array/slice_spec.rb +1 -1
  53. data/spec/rubyspec/core/array/sort_spec.rb +15 -15
  54. data/spec/rubyspec/core/array/to_a_spec.rb +1 -1
  55. data/spec/rubyspec/core/array/to_ary_spec.rb +1 -1
  56. data/spec/rubyspec/core/array/uniq_spec.rb +1 -1
  57. data/spec/rubyspec/core/array/unshift_spec.rb +1 -1
  58. data/spec/rubyspec/core/array/zip_spec.rb +1 -1
  59. data/spec/rubyspec/core/enumerable/select_spec.rb +4 -1
  60. data/spec/rubyspec/core/module/const_defined_spec.rb +86 -0
  61. data/spec/rubyspec/core/module/const_get_spec.rb +55 -3
  62. data/spec/rubyspec/core/module/const_set_spec.rb +2 -2
  63. data/spec/rubyspec/core/module/constants_spec.rb +49 -0
  64. data/spec/rubyspec/core/regexp/match_spec.rb +66 -1
  65. data/spec/rubyspec/core/string/center_spec.rb +71 -0
  66. data/spec/rubyspec/core/string/chomp_spec.rb +6 -1
  67. data/spec/rubyspec/core/string/clone_spec.rb +8 -0
  68. data/spec/rubyspec/core/string/dup_spec.rb +8 -0
  69. data/spec/rubyspec/core/string/end_with_spec.rb +5 -1
  70. data/spec/rubyspec/core/string/gsub_spec.rb +15 -1
  71. data/spec/rubyspec/core/string/lines_spec.rb +9 -0
  72. data/spec/rubyspec/core/string/ljust_spec.rb +17 -0
  73. data/spec/rubyspec/core/string/match_spec.rb +25 -3
  74. data/spec/rubyspec/core/string/rindex_spec.rb +50 -0
  75. data/spec/rubyspec/core/string/rjust_spec.rb +17 -0
  76. data/spec/rubyspec/core/string/scan_spec.rb +66 -0
  77. data/spec/rubyspec/core/string/sub_spec.rb +17 -1
  78. data/spec/rubyspec/core/string/tr_s_spec.rb +31 -0
  79. data/spec/rubyspec/core/string/tr_spec.rb +31 -0
  80. data/spec/rubyspec/fixtures/constants.rb +6 -0
  81. data/spec/rubyspec/language/class_spec.rb +4 -8
  82. data/spec/rubyspec/language/numbers_spec.rb +10 -4
  83. data/spec/rubyspec/language/predefined_spec.rb +69 -2
  84. data/spec/rubyspec/library/rbconfig/config_spec.rb +47 -0
  85. data/spec/rubyspec/spec_helper.rb +6 -0
  86. metadata +46 -25
  87. data/opal/opal-eventable.rb +0 -26
  88. data/opal/opal/native.rb +0 -115
  89. data/spec/opal/eventable_spec.rb +0 -75
  90. data/spec/opal/native/element_reference_spec.rb +0 -40
  91. data/spec/opal/native/equal_spec.rb +0 -17
  92. data/spec/opal/native/fixtures/classes.rb +0 -27
  93. data/spec/opal/native/global_spec.rb +0 -12
  94. data/spec/opal/native/initialize_spec.rb +0 -8
  95. data/spec/opal/native/method_missing_spec.rb +0 -53
  96. data/spec/opal/native/to_native_spec.rb +0 -8
  97. data/spec/rubyspec/core/string/demodulize_spec.rb +0 -10
  98. data/spec/rubyspec/core/string/underscore_spec.rb +0 -17
@@ -1,26 +0,0 @@
1
- # A simple event registering/triggering module to mix into classes.
2
- # Events are stored in the `@events` ivar.
3
- module Eventable
4
-
5
- # Register a handler for the given event name.
6
- #
7
- # obj.on(:foo) { puts "foo was called" }
8
- #
9
- # @param [String, Symbol] name event name
10
- def on(name, &handler)
11
- @events ||= Hash.new { |hash, key| hash[key] = [] }
12
- @events[name] << handler
13
- end
14
-
15
- # Trigger the given event name and passes all args to each handler
16
- # for this event.
17
- #
18
- # obj.trigger(:foo)
19
- # obj.trigger(:foo, 1, 2, 3)
20
- #
21
- # @param [String, Symbol] name event name to trigger
22
- def trigger(name, *args)
23
- @events ||= Hash.new { |hash, key| hash[key] = [] }
24
- @events[name].each { |handler| handler.call(*args) }
25
- end
26
- end
data/opal/opal/native.rb DELETED
@@ -1,115 +0,0 @@
1
- class Native < BasicObject
2
- def self.global
3
- @global ||= Native.new(`Opal.global`)
4
- end
5
-
6
- def self.[](key)
7
- global[key]
8
- end
9
-
10
- def initialize(native)
11
- %x{
12
- if (#{native} == null) {
13
- #{ Kernel.raise "null or undefined passed to Native" };
14
- }
15
- }
16
-
17
- @native = native
18
- end
19
-
20
- def each(&block)
21
- %x{
22
- var n = #{@native}, value;
23
-
24
- for (var key in n) {
25
- value = n[key];
26
-
27
- if (value == null) {
28
- value = nil;
29
- }
30
- else if (typeof(value) === 'object') {
31
- if (!value._klass) {
32
- value = #{Native.new `value`};
33
- }
34
- }
35
-
36
- block(key, value);
37
- }
38
- }
39
- end
40
-
41
- def key? name
42
- `#{@native}[name] != null`
43
- end
44
-
45
- def method_missing(symbol, *args, &block)
46
- native = @native
47
-
48
- %x{
49
- var prop = #{native}[#{symbol}];
50
-
51
- if (typeof(prop) === 'function') {
52
- prop = prop.apply(#{native}, #{args});
53
-
54
- if (typeof(prop) === 'object' || typeof(prop) === 'function') {
55
- if (!prop._klass) {
56
- return #{ Native.new `prop` };
57
- }
58
- }
59
-
60
- return prop;
61
- }
62
- else if (symbol.charAt(symbol.length - 1) === '=') {
63
- prop = symbol.slice(0, symbol.length - 1);
64
- return #{native}[prop] = args[0];
65
- }
66
- else if (prop != null) {
67
- if (typeof(prop) === 'object') {
68
- if (!prop._klass) {
69
- return #{Native.new `prop`};
70
- }
71
- }
72
- return prop;
73
- }
74
- }
75
-
76
- nil
77
- end
78
-
79
- def [](key)
80
- %x{
81
- var value = #{@native}[key];
82
-
83
- if (value == null) return #{nil};
84
-
85
- return value;
86
- }
87
- end
88
-
89
- def ==(other)
90
- `#{@native} === #{other}.native`
91
- end
92
-
93
- def to_a
94
- %x{
95
- var n = #{@native}, result;
96
-
97
- if (n.length) {
98
- result = [];
99
-
100
- for (var i = 0, len = n.length; i < len; i++) {
101
- result.push(#{ Native.new `n[i]` });
102
- }
103
- }
104
- else {
105
- result = [n];
106
- }
107
-
108
- return result;
109
- }
110
- end
111
-
112
- def to_native
113
- @native
114
- end
115
- end
@@ -1,75 +0,0 @@
1
- require "opal-eventable"
2
-
3
- class EventableSpec
4
- include Eventable
5
-
6
- attr_reader :events
7
- end
8
-
9
- describe Eventable do
10
- describe "#on" do
11
- before do
12
- @obj = EventableSpec.new
13
- end
14
-
15
- it "should register event handlers for given name" do
16
- handler = Proc.new {}
17
- @obj.on(:foo, &handler)
18
- @obj.events[:foo].should == [handler]
19
- end
20
- end
21
-
22
- describe "#trigger" do
23
- before do
24
- @obj = EventableSpec.new
25
- end
26
-
27
- it "should call handler" do
28
- called = false
29
-
30
- @obj.on(:foo) { called = true }
31
- called.should == false
32
-
33
- @obj.trigger(:foo)
34
- called.should == true
35
- end
36
-
37
- it "should pass all arguments to handler" do
38
- args = nil
39
- @obj.on(:foo) { |*a| args = a }
40
-
41
- @obj.trigger(:foo)
42
- args.should == []
43
-
44
- @obj.trigger(:foo, 1)
45
- args.should == [1]
46
-
47
- @obj.trigger(:foo, 1, 2, 3)
48
- args.should == [1, 2, 3]
49
- end
50
-
51
- it "should allow multiple different events to be registered" do
52
- result = []
53
- @obj.on(:foo) { result << :foo }
54
- @obj.on(:bar) { result << :bar }
55
-
56
- @obj.trigger(:foo)
57
- result.should == [:foo]
58
-
59
- @obj.trigger(:bar)
60
- result.should == [:foo, :bar]
61
- end
62
-
63
- it "should allow multiple handlers for an event" do
64
- count = 0
65
-
66
- @obj.on(:foo) { count += 1 }
67
- @obj.on(:foo) { count += 1 }
68
- @obj.on(:foo) { count += 1 }
69
- @obj.on(:foo) { count += 1 }
70
- @obj.trigger(:foo)
71
-
72
- count.should == 4
73
- end
74
- end
75
- end
@@ -1,40 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "Native#[]" do
4
- before do
5
- %x{
6
- var obj = {
7
- foo: 'FOO',
8
-
9
- str: 'LOL',
10
- num: 42,
11
- on: true,
12
- off: false
13
- };
14
- }
15
-
16
- @native = Native.new(`obj`)
17
- end
18
-
19
- it "returns a value from the native object" do
20
- @native['foo'].should == "FOO"
21
- end
22
-
23
- it "returns nil for a key not existing on native object" do
24
- @native['bar'].should be_nil
25
- end
26
-
27
- it "returns direct values for strings, numerics and booleans" do
28
- @native['str'].should == 'LOL'
29
- @native['num'].should == 42
30
- @native['on'].should == true
31
- @native['off'].should == false
32
- end
33
- end
34
-
35
- describe "Native.[]" do
36
- it "accesses properties on Native.global" do
37
- Native.global.some_random_property_we_should_remove = 42
38
- Native['some_random_property_we_should_remove'].should == 42
39
- end
40
- end
@@ -1,17 +0,0 @@
1
- require File.expand_path('../../../spec_helper', __FILE__)
2
- require File.expand_path('../fixtures/classes', __FILE__)
3
-
4
- describe "Native#==" do
5
- it "returns true if the wrapped objects are `===` to each other" do
6
- %x{
7
- var obj1 = {}, obj2 = {};
8
- }
9
-
10
- a = Native.new(`obj1`)
11
- b = Native.new(`obj1`)
12
- c = Native.new(`obj2`)
13
-
14
- (a == b).should be_true
15
- (a == c).should be_false
16
- end
17
- end
@@ -1,27 +0,0 @@
1
- module NativeSpecs
2
- %x{
3
- var obj = {
4
- property: 42,
5
-
6
- simple: function() {
7
- return 'foo';
8
- },
9
-
10
- context_check: function() {
11
- return this === obj;
12
- },
13
-
14
- check_args: function(a, b, c) {
15
- return [a, b, c];
16
- },
17
-
18
- array: [1, 2, 3, 4],
19
-
20
- child_object: {
21
- grand_child: 100
22
- }
23
- };
24
- }
25
-
26
- OBJ = Native.new(`obj`)
27
- end
@@ -1,12 +0,0 @@
1
- require File.expand_path('../../../spec_helper', __FILE__)
2
- require File.expand_path('../fixtures/classes', __FILE__)
3
-
4
- describe "Native#global" do
5
- it "is an instance of Native" do
6
- (Native === Native.global).should be_true
7
- end
8
-
9
- it "wraps Opal.global" do
10
- (Native.global == Native.new(`Opal.global`)).should be_true
11
- end
12
- end
@@ -1,8 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe "Native#initialize" do
4
- it "raises an error when passed null or undefined" do
5
- lambda { Native.new(`null`) }.should raise_error(Exception)
6
- lambda { Native.new(`undefined`) }.should raise_error(Exception)
7
- end
8
- end
@@ -1,53 +0,0 @@
1
- require File.expand_path('../../../spec_helper', __FILE__)
2
- require File.expand_path('../fixtures/classes', __FILE__)
3
-
4
- describe "Native#method_missing" do
5
- before do
6
- @obj = NativeSpecs::OBJ
7
- end
8
-
9
- describe "accessing a null/undefined property" do
10
- it "returns nil" do
11
- @obj.doesnt_exist.should == nil
12
- end
13
- end
14
-
15
- describe "with a mid ending with '='" do
16
- it "sets the value on the property" do
17
- @obj.set_property = 100
18
- @obj.set_property.should == 100
19
-
20
- @obj.set_property = [1, 2, 3]
21
- @obj.set_property.should == [1, 2, 3]
22
- end
23
- end
24
-
25
- describe "accessing a property" do
26
- it "returns values from the native object" do
27
- @obj.property.should == 42
28
- end
29
-
30
- it "returns an array without wrapping" do
31
- @obj.array.should == [1, 2, 3, 4]
32
- end
33
-
34
- it "returns the property in a new Native object if a js object" do
35
- res = @obj.child_object
36
- (Native === res).should be_true
37
- end
38
- end
39
-
40
- describe "accessing a function property" do
41
- it "forwards methods to wrapped object as native function calls" do
42
- @obj.simple.should == "foo"
43
- end
44
-
45
- it "calls functions with native object as context" do
46
- @obj.context_check.should be_true
47
- end
48
-
49
- it "passes each argument to native function" do
50
- @obj.check_args(1, 2, 3).should == [1, 2, 3]
51
- end
52
- end
53
- end
@@ -1,8 +0,0 @@
1
- require File.expand_path('../../../spec_helper', __FILE__)
2
- require File.expand_path('../fixtures/classes', __FILE__)
3
-
4
- describe "Native#to_native" do
5
- it "returns the wrapped object" do
6
- Native.new(:foo).to_native.should == :foo
7
- end
8
- end
@@ -1,10 +0,0 @@
1
- describe "String#demodulize" do
2
- it "removes any preceding module name from the string" do
3
- "Foo::Bar".demodulize.should == "Bar"
4
- "Foo::Bar::Baz".demodulize.should == "Baz"
5
- end
6
-
7
- it "has no affect on strings with no module seperator" do
8
- "SomeClassName".demodulize.should == "SomeClassName"
9
- end
10
- end
@@ -1,17 +0,0 @@
1
- describe "String#underscore" do
2
- it "replaces '-' in dasherized strings with underscores" do
3
- "well-hello-there".underscore.should == "well_hello_there"
4
- end
5
-
6
- it "converts single all-upcase strings into lowercase" do
7
- "OMG".underscore.should == "omg"
8
- end
9
-
10
- it "splits word bounderies and seperates using underscore" do
11
- "AdamBeynon".underscore.should == "adam_beynon"
12
- end
13
-
14
- it "does not split when 2 or more capitalized letters together" do
15
- "HTMLParser".underscore.should == "html_parser"
16
- end
17
- end