opal 0.3.22 → 0.3.25

Sign up to get free protection for your applications and to get access to all the features.
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