opal 0.3.22 → 0.3.25

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 (104) hide show
  1. data/.travis.yml +1 -1
  2. data/Gemfile +1 -9
  3. data/README.md +46 -5
  4. data/Rakefile +4 -94
  5. data/core/array.rb +13 -46
  6. data/core/basic_object.rb +2 -12
  7. data/core/boolean.rb +1 -1
  8. data/core/browser.js +27 -1
  9. data/core/class.rb +1 -7
  10. data/core/enumerable.rb +3 -15
  11. data/core/error.rb +2 -4
  12. data/core/hash.rb +9 -18
  13. data/core/json.rb +5 -0
  14. data/core/kernel.rb +2 -21
  15. data/core/load_order +5 -7
  16. data/core/nil_class.rb +4 -0
  17. data/core/numeric.rb +0 -6
  18. data/core/object.rb +1 -5
  19. data/core/proc.rb +0 -4
  20. data/core/range.rb +10 -17
  21. data/core/regexp.rb +2 -6
  22. data/core/runtime.js +2 -26
  23. data/core/string.rb +28 -26
  24. data/core/struct.rb +0 -4
  25. data/core/{erb.rb → templates.rb} +6 -4
  26. data/core/time.rb +7 -19
  27. data/core/top_self.rb +2 -2
  28. data/lib/opal.rb +13 -2
  29. data/lib/opal/builder.rb +3 -3
  30. data/lib/opal/erb_parser.rb +3 -2
  31. data/lib/opal/parser.rb +10 -2
  32. data/lib/opal/rake_task.rb +10 -2
  33. data/lib/opal/scope.rb +6 -1
  34. data/lib/opal/version.rb +1 -1
  35. data/opal.gemspec +1 -3
  36. data/spec/core/array/constructor_spec.rb +0 -8
  37. data/spec/core/enumerable/drop_while_spec.rb +0 -4
  38. data/spec/core/enumerable/find_index_spec.rb +0 -4
  39. data/spec/core/enumerable/select_spec.rb +13 -0
  40. data/spec/core/kernel/respond_to_spec.rb +4 -0
  41. data/spec/core/string/empty_spec.rb +0 -1
  42. data/spec/core/string/include_spec.rb +0 -6
  43. data/spec/core/string/swapcase_spec.rb +0 -5
  44. data/spec/core/string/to_s_spec.rb +0 -7
  45. data/spec/core/string/to_str_spec.rb +0 -7
  46. data/spec/lib/erb_parser/simple.erb +1 -0
  47. data/spec/{grammar → lib/grammar}/alias_spec.rb +0 -0
  48. data/spec/{grammar → lib/grammar}/and_spec.rb +0 -0
  49. data/spec/{grammar → lib/grammar}/array_spec.rb +0 -0
  50. data/spec/{grammar → lib/grammar}/attrasgn_spec.rb +0 -0
  51. data/spec/{grammar → lib/grammar}/begin_spec.rb +0 -0
  52. data/spec/{grammar → lib/grammar}/block_spec.rb +0 -0
  53. data/spec/{grammar → lib/grammar}/break_spec.rb +0 -0
  54. data/spec/{grammar → lib/grammar}/call_spec.rb +0 -0
  55. data/spec/{grammar → lib/grammar}/class_spec.rb +0 -0
  56. data/spec/{grammar → lib/grammar}/const_spec.rb +0 -0
  57. data/spec/{grammar → lib/grammar}/cvar_spec.rb +0 -0
  58. data/spec/{grammar → lib/grammar}/def_spec.rb +0 -0
  59. data/spec/{grammar → lib/grammar}/false_spec.rb +0 -0
  60. data/spec/{grammar → lib/grammar}/file_spec.rb +0 -0
  61. data/spec/{grammar → lib/grammar}/gvar_spec.rb +0 -0
  62. data/spec/{grammar → lib/grammar}/hash_spec.rb +0 -0
  63. data/spec/{grammar → lib/grammar}/iasgn_spec.rb +0 -0
  64. data/spec/{grammar → lib/grammar}/if_spec.rb +0 -0
  65. data/spec/{grammar → lib/grammar}/iter_spec.rb +0 -0
  66. data/spec/{grammar → lib/grammar}/ivar_spec.rb +0 -0
  67. data/spec/{grammar → lib/grammar}/lambda_spec.rb +0 -0
  68. data/spec/{grammar → lib/grammar}/lasgn_spec.rb +0 -0
  69. data/spec/{grammar → lib/grammar}/line_spec.rb +0 -0
  70. data/spec/{grammar → lib/grammar}/lvar_spec.rb +0 -0
  71. data/spec/{grammar → lib/grammar}/masgn_spec.rb +0 -0
  72. data/spec/{grammar → lib/grammar}/module_spec.rb +0 -0
  73. data/spec/{grammar → lib/grammar}/nil_spec.rb +0 -0
  74. data/spec/{grammar → lib/grammar}/not_spec.rb +0 -0
  75. data/spec/{grammar → lib/grammar}/op_asgn1_spec.rb +0 -0
  76. data/spec/{grammar → lib/grammar}/op_asgn2_spec.rb +0 -0
  77. data/spec/{grammar → lib/grammar}/or_spec.rb +0 -0
  78. data/spec/{grammar → lib/grammar}/return_spec.rb +0 -0
  79. data/spec/{grammar → lib/grammar}/sclass_spec.rb +0 -0
  80. data/spec/{grammar → lib/grammar}/self_spec.rb +0 -0
  81. data/spec/{grammar → lib/grammar}/str_spec.rb +0 -0
  82. data/spec/{grammar → lib/grammar}/super_spec.rb +0 -0
  83. data/spec/{grammar → lib/grammar}/true_spec.rb +0 -0
  84. data/spec/{grammar → lib/grammar}/undef_spec.rb +0 -0
  85. data/spec/{grammar → lib/grammar}/unless_spec.rb +0 -0
  86. data/spec/{grammar → lib/grammar}/while_spec.rb +0 -0
  87. data/spec/{grammar → lib/grammar}/xstr_spec.rb +0 -0
  88. data/spec/{grammar → lib/grammar}/yield_spec.rb +0 -0
  89. data/spec/{parser → lib/parser}/simple_spec.rb +1 -1
  90. data/spec/opal/erb/erb_spec.rb +10 -2
  91. data/spec/opal/string/demodulize_spec.rb +10 -0
  92. data/spec/opal/string/underscore_spec.rb +17 -0
  93. data/spec/spec_helper.rb +1 -1
  94. data/vendor/opal_spec_runner.js +43 -0
  95. metadata +99 -114
  96. data/.rspec +0 -2
  97. data/docs/index.md +0 -616
  98. data/docs/post.html +0 -3
  99. data/docs/pre.html +0 -35
  100. data/docs/try.html +0 -52
  101. data/spec/core/string/fixtures/classes.rb +0 -3
  102. data/spec/opal/array/subclassing_spec.rb +0 -32
  103. data/spec/opal/exception/subclassing_spec.rb +0 -17
  104. data/spec/opal/string/subclassing_spec.rb +0 -26
data/core/boolean.rb CHANGED
@@ -22,7 +22,7 @@ class Boolean < `Boolean`
22
22
  alias singleton_class class
23
23
 
24
24
  def to_json
25
- `#{self}.valueOf() ? 'true' : 'false'`
25
+ `(#{self} == true) ? 'true' : 'false'`
26
26
  end
27
27
 
28
28
  def to_s
data/core/browser.js CHANGED
@@ -9,7 +9,14 @@
9
9
  for (var i = 0, script; i < all.length; i++) {
10
10
  script = all[i];
11
11
  if (script.type === 'text/ruby') {
12
- runRuby(script.innerHTML);
12
+ if (script.src) {
13
+ request(script.src, function(result) {
14
+ runRuby(result);
15
+ });
16
+ }
17
+ else {
18
+ runRuby(script.innerHTML);
19
+ }
13
20
  }
14
21
  else if (script.type === 'text/erb') {
15
22
  runERB(script.innerHTML);
@@ -22,6 +29,25 @@
22
29
  eval('(' + js + ')()');
23
30
  }
24
31
 
32
+ function request(url, callback) {
33
+ var xhr = new (window.ActiveXObject || XMLHttpRequest)('Microsoft.XMLHTTP');
34
+ xhr.open('GET', url, true);
35
+ if ('overrideMimeType' in xhr) {
36
+ xhr.overrideMimeType('text/plain');
37
+ }
38
+ xhr.onreadystatechange = function() {
39
+ if (xhr.readyState === 4) {
40
+ if (xhr.status === 0 || xhr.status === 200) {
41
+ callback(xhr.responseText);
42
+ }
43
+ else {
44
+ throw new Error('Could not load ruby at: ' + url);
45
+ }
46
+ }
47
+ };
48
+ xhr.send(null);
49
+ }
50
+
25
51
  if (window.addEventListener) {
26
52
  window.addEventListener('DOMContentLoaded', findRubyScripts, false);
27
53
  }
data/core/class.rb CHANGED
@@ -39,13 +39,7 @@ class Class
39
39
 
40
40
  def superclass
41
41
  %x{
42
- var sup = #{self}._super;
43
-
44
- if (!sup) {
45
- return nil;
46
- }
47
-
48
- return sup;
42
+ return #{self}._super || nil;
49
43
  }
50
44
  end
51
45
  end
data/core/enumerable.rb CHANGED
@@ -76,8 +76,6 @@ module Enumerable
76
76
  end
77
77
 
78
78
  def collect(&block)
79
- return enum_for :collect unless block_given?
80
-
81
79
  %x{
82
80
  var result = [];
83
81
 
@@ -129,8 +127,6 @@ module Enumerable
129
127
  end
130
128
 
131
129
  def detect(ifnone, &block)
132
- return enum_for :detect, ifnone unless block_given?
133
-
134
130
  %x{
135
131
  var result = nil;
136
132
 
@@ -183,8 +179,6 @@ module Enumerable
183
179
  end
184
180
 
185
181
  def drop_while(&block)
186
- return enum_for :drop_while unless block_given?
187
-
188
182
  %x{
189
183
  var result = [];
190
184
 
@@ -211,8 +205,6 @@ module Enumerable
211
205
  end
212
206
 
213
207
  def each_with_index(&block)
214
- return enum_for :each_with_index unless block_given?
215
-
216
208
  %x{
217
209
  var index = 0;
218
210
 
@@ -233,8 +225,6 @@ module Enumerable
233
225
  end
234
226
 
235
227
  def each_with_object(object, &block)
236
- return enum_for :each_with_object unless block_given?
237
-
238
228
  %x{
239
229
  #{self}.$each._p = function(obj) {
240
230
  var value;
@@ -267,8 +257,6 @@ module Enumerable
267
257
  alias find detect
268
258
 
269
259
  def find_all(&block)
270
- return enum_for :find_all unless block_given?
271
-
272
260
  %x{
273
261
  var result = [];
274
262
 
@@ -303,9 +291,7 @@ module Enumerable
303
291
  index += 1;
304
292
  };
305
293
  }
306
- else if (block === nil) {
307
- return #{ enum_for 'find_index' };
308
- } else {
294
+ else {
309
295
  proc = function(obj) {
310
296
  var value;
311
297
 
@@ -390,6 +376,8 @@ module Enumerable
390
376
  }
391
377
  end
392
378
 
379
+ alias select find_all
380
+
393
381
  alias take first
394
382
 
395
383
  alias to_a entries
data/core/error.rb CHANGED
@@ -3,9 +3,7 @@ class Exception < `Error`
3
3
 
4
4
  def self.new(message = '')
5
5
  %x{
6
- var err = #{allocate};
7
- err.message = message;
8
- return err;
6
+ return new Error(message);
9
7
  }
10
8
  end
11
9
 
@@ -20,7 +18,7 @@ class Exception < `Error`
20
18
  return backtrace;
21
19
  }
22
20
 
23
- return ["No backtrace available"];
21
+ return [];
24
22
  }
25
23
  end
26
24
 
data/core/hash.rb CHANGED
@@ -176,8 +176,6 @@ class Hash
176
176
  end
177
177
 
178
178
  def delete_if(&block)
179
- return enum_for :delete_if unless block_given?
180
-
181
179
  %x{
182
180
  var map = #{self}.map;
183
181
 
@@ -201,8 +199,6 @@ class Hash
201
199
  alias dup clone
202
200
 
203
201
  def each(&block)
204
- return enum_for :each unless block_given?
205
-
206
202
  %x{
207
203
  var map = #{self}.map;
208
204
 
@@ -219,8 +215,6 @@ class Hash
219
215
  end
220
216
 
221
217
  def each_key(&block)
222
- return enum_for :each_key unless block_given?
223
-
224
218
  %x{
225
219
  var map = #{self}.map;
226
220
 
@@ -239,8 +233,6 @@ class Hash
239
233
  alias each_pair each
240
234
 
241
235
  def each_value(&block)
242
- return enum_for :each_value unless block_given?
243
-
244
236
  %x{
245
237
  var map = #{self}.map;
246
238
 
@@ -411,8 +403,6 @@ class Hash
411
403
  end
412
404
 
413
405
  def keep_if(&block)
414
- return enum_for :keep_if unless block_given?
415
-
416
406
  %x{
417
407
  var map = #{self}.map, value;
418
408
 
@@ -544,8 +534,6 @@ class Hash
544
534
  end
545
535
 
546
536
  def reject(&block)
547
- return enum_for :reject unless block_given?
548
-
549
537
  %x{
550
538
  var map = #{self}.map, result = __hash(), map2 = result.map;
551
539
 
@@ -581,8 +569,6 @@ class Hash
581
569
  end
582
570
 
583
571
  def select(&block)
584
- return enum_for :select unless block_given?
585
-
586
572
  %x{
587
573
  var map = #{self}.map, result = __hash(), map2 = result.map;
588
574
 
@@ -604,8 +590,6 @@ class Hash
604
590
  end
605
591
 
606
592
  def select!(&block)
607
- return enum_for :select! unless block_given?
608
-
609
593
  %x{
610
594
  var map = #{self}.map, result = nil;
611
595
 
@@ -677,11 +661,18 @@ class Hash
677
661
 
678
662
  def to_native
679
663
  %x{
680
- var result = {}, map = #{self}.map, bucket;
664
+ var result = {}, map = #{self}.map, bucket, value;
681
665
 
682
666
  for (var assoc in map) {
683
667
  bucket = map[assoc];
684
- result[bucket[0]] = #{ `bucket[1]`.to_json };
668
+ value = bucket[1];
669
+
670
+ if (value.$to_native) {
671
+ result[assoc] = #{ `value`.to_native };
672
+ }
673
+ else {
674
+ result[assoc] = value;
675
+ }
685
676
  }
686
677
 
687
678
  return result;
data/core/json.rb CHANGED
@@ -5,6 +5,11 @@ module JSON
5
5
  `return to_opal(json_parse(source));`
6
6
  end
7
7
 
8
+ # Raw js object => opal object
9
+ def self.from_object(js_object)
10
+ `return to_opal(js_object)`
11
+ end
12
+
8
13
  %x{
9
14
  function to_opal(value) {
10
15
  switch (typeof value) {
data/core/kernel.rb CHANGED
@@ -12,8 +12,6 @@ module Kernel
12
12
  end
13
13
 
14
14
  def Array(object)
15
- return [] unless object
16
-
17
15
  %x{
18
16
  if (object.$to_ary) {
19
17
  return #{object.to_ary};
@@ -22,14 +20,7 @@ module Kernel
22
20
  return #{object.to_a};
23
21
  }
24
22
 
25
- var length = object.length || 0,
26
- result = [];
27
-
28
- while (length--) {
29
- result[length] = object[length];
30
- }
31
-
32
- return result;
23
+ return [object];
33
24
  }
34
25
  end
35
26
 
@@ -130,8 +121,6 @@ module Kernel
130
121
  end
131
122
 
132
123
  def loop(&block)
133
- return enum_for :loop unless block_given?
134
-
135
124
  `while (true) {`
136
125
  yield
137
126
  `}`
@@ -160,7 +149,7 @@ module Kernel
160
149
  def puts(*strs)
161
150
  %x{
162
151
  for (var i = 0; i < strs.length; i++) {
163
- console.log(#{ `strs[i]`.to_s });
152
+ __opal.puts(#{ `strs[i]`.to_s });
164
153
  }
165
154
  }
166
155
  nil
@@ -217,8 +206,6 @@ module Kernel
217
206
  end
218
207
 
219
208
  def tap(&block)
220
- `if (block === nil) no_block_given();`
221
-
222
209
  yield self
223
210
  self
224
211
  end
@@ -234,10 +221,4 @@ module Kernel
234
221
  def to_s
235
222
  `return "#<" + #{self}._klass._name + ":" + #{self}._id + ">";`
236
223
  end
237
-
238
- def enum_for (method = :each, *args)
239
- Enumerator.new(self, method, *args)
240
- end
241
-
242
- alias to_enum enum_for
243
224
  end
data/core/load_order CHANGED
@@ -5,20 +5,18 @@ basic_object
5
5
  kernel
6
6
  object
7
7
  top_self
8
- boolean
9
8
  nil_class
10
- enumerable
11
- enumerator
9
+ boolean
10
+ error
11
+ regexp
12
12
  comparable
13
+ enumerable
13
14
  array
14
15
  hash
15
16
  string
16
17
  numeric
17
18
  proc
18
19
  range
19
- error
20
- regexp
21
20
  time
22
- struct
23
21
  json
24
- erb
22
+ templates
data/core/nil_class.rb CHANGED
@@ -41,6 +41,10 @@ class NilClass
41
41
  'null'
42
42
  end
43
43
 
44
+ def to_native
45
+ `null`
46
+ end
47
+
44
48
  def to_s
45
49
  ''
46
50
  end
data/core/numeric.rb CHANGED
@@ -104,8 +104,6 @@ class Numeric < `Number`
104
104
  end
105
105
 
106
106
  def downto(finish, &block)
107
- return enum_for :downto, finish unless block_given?
108
-
109
107
  %x{
110
108
  for (var i = #{self}; i >= finish; i--) {
111
109
  if (block.call(__context, i) === __breaker) {
@@ -162,8 +160,6 @@ class Numeric < `Number`
162
160
  alias succ next
163
161
 
164
162
  def times(&block)
165
- return enum_for :times unless block_given?
166
-
167
163
  %x{
168
164
  for (var i = 0; i <= #{self}; i++) {
169
165
  if (block.call(__context, i) === __breaker) {
@@ -192,8 +188,6 @@ class Numeric < `Number`
192
188
  end
193
189
 
194
190
  def upto(finish, &block)
195
- return enum_for :upto, finish unless block_given?
196
-
197
191
  %x{
198
192
  for (var i = 0; i <= finish; i++) {
199
193
  if (block.call(__context, i) === __breaker) {
data/core/object.rb CHANGED
@@ -1,15 +1,11 @@
1
1
  class Object
2
- include Kernel
2
+ # Kernel included inside runtime.js
3
3
 
4
4
  # FIXME
5
5
  def methods
6
6
  []
7
7
  end
8
8
 
9
- alias private_methods methods
10
- alias protected_methods methods
11
- alias public_methods methods
12
-
13
9
  # FIXME
14
10
  def singleton_methods
15
11
  []
data/core/proc.rb CHANGED
@@ -10,10 +10,6 @@ class Proc < `Function`
10
10
  block
11
11
  end
12
12
 
13
- def to_proc
14
- self
15
- end
16
-
17
13
  def call(*args)
18
14
  `#{self}.apply(#{self}._s, #{args})`
19
15
  end
data/core/range.rb CHANGED
@@ -14,6 +14,9 @@ class Range
14
14
  };
15
15
  }
16
16
 
17
+ attr_reader :begin
18
+ attr_reader :end
19
+
17
20
  def initialize(min, max, exclude = false)
18
21
  @begin = min
19
22
  @end = max
@@ -21,9 +24,13 @@ class Range
21
24
  end
22
25
 
23
26
  def ==(other)
24
- return false unless Range === other
27
+ %x{
28
+ if (!other._isRange) {
29
+ return false;
30
+ }
25
31
 
26
- exclude_end? == other.exclude_end? && `#{self}.begin` == other.begin && `#{self}.end` == other.end
32
+ return #{self}.exclude === other.exclude && #{self}.begin == other.begin && #{self}.end == other.end;
33
+ }
27
34
  end
28
35
 
29
36
  # FIXME: currently hardcoded to assume range holds numerics
@@ -31,17 +38,11 @@ class Range
31
38
  `return obj >= #{self}.begin && (#{self}.exclude ? obj < #{self}.end : obj <= #{self}.end)`
32
39
  end
33
40
 
34
- def begin
35
- `#{self}.begin`
36
- end
37
-
38
41
  def cover?(value)
39
42
  `#{self}.begin` <= value && value <= (exclude_end? ? `#{self}.end` - 1 : `#{self}.end`)
40
43
  end
41
44
 
42
45
  def each
43
- return enum_for :each unless block_given?
44
-
45
46
  current = min
46
47
 
47
48
  while current != max
@@ -55,10 +56,6 @@ class Range
55
56
  self
56
57
  end
57
58
 
58
- def end
59
- `#{self}.end`
60
- end
61
-
62
59
  def eql?(other)
63
60
  return false unless Range === other
64
61
 
@@ -81,8 +78,6 @@ class Range
81
78
  alias member? include?
82
79
 
83
80
  def step(n = 1)
84
- return enum_for :step, n unless block_given?
85
-
86
81
  raise NotImplementedError
87
82
  end
88
83
 
@@ -90,7 +85,5 @@ class Range
90
85
  `#{self}.begin + (#{self}.exclude ? '...' : '..') + #{self}.end`
91
86
  end
92
87
 
93
- def inspect
94
- `#{self}.begin + (#{self}.exclude ? '...' : '..') + #{self}.end`
95
- end
88
+ alias inspect to_s
96
89
  end