opal 0.4.2 → 0.4.3

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 (93) hide show
  1. data/.travis.yml +5 -0
  2. data/README.md +42 -2
  3. data/Rakefile +7 -6
  4. data/bin/opal +2 -2
  5. data/{opal → corelib}/opal.rb +21 -21
  6. data/{opal → corelib}/opal/array.rb +37 -24
  7. data/{opal → corelib}/opal/basic_object.rb +0 -0
  8. data/{opal → corelib}/opal/boolean.rb +0 -0
  9. data/{opal → corelib}/opal/class.rb +45 -22
  10. data/{opal → corelib}/opal/comparable.rb +0 -0
  11. data/{opal → corelib}/opal/enumerable.rb +0 -0
  12. data/{opal → corelib}/opal/enumerator.rb +0 -0
  13. data/{opal → corelib}/opal/error.rb +16 -12
  14. data/{opal → corelib}/opal/hash.rb +2 -2
  15. data/{opal → corelib}/opal/kernel.rb +16 -14
  16. data/{opal → corelib}/opal/native.rb +0 -0
  17. data/{opal → corelib}/opal/nil_class.rb +1 -1
  18. data/{opal → corelib}/opal/numeric.rb +0 -0
  19. data/{opal → corelib}/opal/proc.rb +0 -0
  20. data/{opal → corelib}/opal/range.rb +2 -2
  21. data/{opal → corelib}/opal/regexp.rb +0 -0
  22. data/{opal → corelib}/opal/runtime.js +92 -126
  23. data/{opal → corelib}/opal/string.rb +14 -13
  24. data/{opal → corelib}/opal/time.rb +0 -0
  25. data/lib/opal.rb +9 -8
  26. data/lib/opal/builder.rb +81 -0
  27. data/lib/opal/erb.rb +17 -0
  28. data/lib/opal/grammar.rb +33 -30
  29. data/lib/opal/grammar.y +18 -15
  30. data/lib/opal/grammar_helpers.rb +5 -5
  31. data/lib/opal/lexer.rb +3 -2
  32. data/lib/opal/parser.rb +58 -41
  33. data/lib/opal/require_parser.rb +77 -0
  34. data/lib/opal/version.rb +1 -1
  35. data/opal.gemspec +1 -1
  36. data/{config.ru → spec/config.ru} +0 -0
  37. data/spec/opal/array/to_json_spec.rb +3 -1
  38. data/spec/opal/boolean/to_json_spec.rb +3 -1
  39. data/spec/opal/erb/erb_spec.rb +25 -0
  40. data/spec/opal/erb/quoted.opalerb +1 -0
  41. data/spec/opal/erb/simple.opalerb +1 -0
  42. data/spec/opal/json/parse_spec.rb +3 -1
  43. data/spec/opal/kernel/to_json_spec.rb +3 -1
  44. data/spec/opal/nil/to_json_spec.rb +3 -1
  45. data/spec/opal/string/to_json_spec.rb +3 -1
  46. data/spec/parser/int_spec.rb +13 -0
  47. data/spec/parser/regexp_spec.rb +16 -0
  48. data/spec/parser/str_spec.rb +11 -0
  49. data/spec/rubyspec/core/array/plus_spec.rb +7 -2
  50. data/spec/rubyspec/core/hash/to_json_spec.rb +3 -1
  51. data/spec/rubyspec/core/numeric/to_json_spec.rb +3 -1
  52. data/spec/rubyspec/language/defined_spec.rb +9 -0
  53. data/spec/rubyspec/library/stringscanner/pos_spec.rb +20 -0
  54. data/{opal → stdlib}/date.rb +0 -0
  55. data/stdlib/erb.rb +26 -0
  56. data/{opal → stdlib}/fileutils.rb +0 -0
  57. data/{opal → stdlib}/iconv.rb +0 -0
  58. data/{opal/opal → stdlib}/json.rb +0 -0
  59. data/{opal → stdlib}/observer.rb +0 -0
  60. data/{opal → stdlib}/opal-browser/local_storage.rb +0 -0
  61. data/{opal → stdlib}/opal-browser/script_loader.rb +1 -1
  62. data/{opal → stdlib}/opal-parser.js.erb +1 -1
  63. data/{opal → stdlib}/opal-source-maps.js.erb +0 -0
  64. data/{opal → stdlib}/pp.rb +0 -0
  65. data/{opal → stdlib}/racc.rb +0 -0
  66. data/{opal → stdlib}/rbconfig.rb +0 -0
  67. data/{opal → stdlib}/source_map.rb +1 -1
  68. data/{opal → stdlib}/source_map/generator.rb +0 -0
  69. data/{opal → stdlib}/source_map/parser.rb +0 -0
  70. data/{opal → stdlib}/source_map/vlq.rb +0 -0
  71. data/{opal → stdlib}/strscan.rb +15 -0
  72. data/{opal → stdlib}/yaml.rb +0 -0
  73. metadata +87 -77
  74. checksums.yaml +0 -7
  75. data/CHANGELOG.md +0 -176
  76. data/examples/native/Gemfile +0 -3
  77. data/examples/native/README.md +0 -17
  78. data/examples/native/app/app.rb +0 -57
  79. data/examples/native/config.ru +0 -8
  80. data/examples/native/index.html.erb +0 -12
  81. data/examples/rack/Gemfile +0 -3
  82. data/examples/rack/README.md +0 -22
  83. data/examples/rack/app/app.rb +0 -5
  84. data/examples/rack/config.ru +0 -20
  85. data/examples/rack/index.html +0 -12
  86. data/examples/server/Gemfile +0 -3
  87. data/examples/server/README.md +0 -22
  88. data/examples/server/app/app.rb +0 -18
  89. data/examples/server/config.ru +0 -10
  90. data/examples/server/index.html.erb +0 -10
  91. data/opal/opal-template.rb +0 -33
  92. data/spec/opal/class/_inherited_spec.rb +0 -32
  93. data/spec/opal/class/new_spec.rb +0 -27
data/.travis.yml CHANGED
@@ -3,6 +3,11 @@ language: ruby
3
3
  rvm:
4
4
  - 1.8.7
5
5
  - 1.9.3
6
+ - 2.0.0
6
7
 
7
8
  notifications:
8
9
  irc: "irc.freenode.org#opal"
10
+
11
+ matrix:
12
+ allow_failures:
13
+ - rvm: 2.0.0
data/README.md CHANGED
@@ -13,6 +13,41 @@ is a Freenode IRC channel at [#opal](http://webchat.freenode.net/?channels=opal)
13
13
 
14
14
  See the website, [http://opalrb.org](http://opalrb.org).
15
15
 
16
+ ### Compiling ruby code
17
+
18
+ `Opal.parse` is a simple interface to just compile a string of ruby into a
19
+ string of javascript code.
20
+
21
+ ```ruby
22
+ Opal.parse("puts 'wow'") # => "(function() { ... })()"
23
+ ```
24
+
25
+ Running this by itself is not enough, you need the opal runtime/corelib.
26
+
27
+ ### Building the corelib
28
+
29
+ `Opal::Builder` can be used to build the runtime/corelib into a string.
30
+
31
+ ```ruby
32
+ Opal::Builder.build('opal') #=> "(function() { ... })()"
33
+ ```
34
+
35
+ ### Running compiled code
36
+
37
+ You can write the above two strings to file, and run as:
38
+
39
+ ```html
40
+ <!DOCTYPE html>
41
+ <html>
42
+ <head>
43
+ <script src="opal.js"></script>
44
+ <script src="app.js"></script>
45
+ </head>
46
+ </html>
47
+ ```
48
+
49
+ Just open a browser to this page and view the console.
50
+
16
51
  ## Running tests
17
52
 
18
53
  First, install dependencies:
@@ -34,10 +69,15 @@ The `lib` directory holds the opal parser/compiler used to compile ruby
34
69
  into javascript. It is also built ready for the browser into `opal-parser.js`
35
70
  to allow compilation in any javascript environment.
36
71
 
37
- ### opal
72
+ ### corelib
38
73
 
39
74
  This directory holds the opal runtime and corelib implemented in ruby and
40
- javascript. These are built using `rake`, as above.
75
+ javascript.
76
+
77
+ ### stdlib
78
+
79
+ Holds the stdlib that opal currently supports. This includes Observable,
80
+ StringScanner, Date, etc.
41
81
 
42
82
  ### spec
43
83
 
data/Rakefile CHANGED
@@ -29,6 +29,8 @@ class RunSpec
29
29
 
30
30
  exit 1 unless success
31
31
 
32
+ rescue => e
33
+ puts e.message
32
34
  ensure
33
35
  Process.kill(:SIGINT, server)
34
36
  Process.wait
@@ -118,6 +120,8 @@ end
118
120
  desc "Build opal.js and opal-parser.js to build/"
119
121
  task :dist do
120
122
  Opal::Processor.arity_check_enabled = false
123
+ Opal::Processor.source_map_enabled = false
124
+ Opal::Processor.method_missing_enabled = false
121
125
 
122
126
  env = Opal::Environment.new
123
127
 
@@ -127,8 +131,9 @@ task :dist do
127
131
  puts "* building #{lib}..."
128
132
 
129
133
  src = env[lib].to_s
130
- min = uglify src
131
- gzp = gzip min
134
+ #min = uglify src
135
+ #gzp = gzip min
136
+ min = gzp = nil
132
137
 
133
138
  File.open("build/#{lib}.js", 'w+') { |f| f << src }
134
139
  File.open("build/#{lib}.min.js", 'w+') { |f| f << min } if min
@@ -142,10 +147,6 @@ task :dist do
142
147
  end
143
148
  end
144
149
 
145
- desc "Check file sizes for opal.js runtime"
146
- task :sizes => :dist do
147
- end
148
-
149
150
  desc "Rebuild grammar.rb for opal parser"
150
151
  task :racc do
151
152
  %x(racc -l lib/opal/grammar.y -o lib/opal/grammar.rb)
data/bin/opal CHANGED
@@ -49,7 +49,7 @@ parser = OptionParser.new do |opts|
49
49
  opts.separator 'Compilation Options:'
50
50
 
51
51
  opts.on('-M', '--no-method-missing', 'Disable method missing') do |value|
52
- options[:method_missing_enabled] = false
52
+ options[:method_missing] = false
53
53
  end
54
54
 
55
55
  opts.on('-O', '--no-optimized-operators', 'Disable optimized operators') do |value|
@@ -61,7 +61,7 @@ parser = OptionParser.new do |opts|
61
61
  end
62
62
 
63
63
  opts.on('-C', '--no-const-missing', 'Disable const missing') do |value|
64
- options[:const_missing_enabled] = false
64
+ options[:const_missing] = false
65
65
  end
66
66
 
67
67
  dynamic_require_levels = %w[error warning ignore]
@@ -1,23 +1,22 @@
1
- #= require 'opal/runtime'
2
- #= require 'opal/class'
3
- #= require 'opal/basic_object'
4
- #= require 'opal/kernel'
5
- #= require 'opal/nil_class'
6
- #= require 'opal/boolean'
7
- #= require 'opal/error'
8
- #= require 'opal/regexp'
9
- #= require 'opal/comparable'
10
- #= require 'opal/enumerable'
11
- #= require 'opal/enumerator'
12
- #= require 'opal/array'
13
- #= require 'opal/hash'
14
- #= require 'opal/string'
15
- #= require 'opal/numeric'
16
- #= require 'opal/proc'
17
- #= require 'opal/range'
18
- #= require 'opal/time'
19
- #= require 'opal/json'
20
- #= require 'opal/native'
1
+ require 'opal/runtime'
2
+ require 'opal/class'
3
+ require 'opal/basic_object'
4
+ require 'opal/kernel'
5
+ require 'opal/nil_class'
6
+ require 'opal/boolean'
7
+ require 'opal/error'
8
+ require 'opal/regexp'
9
+ require 'opal/comparable'
10
+ require 'opal/enumerable'
11
+ require 'opal/enumerator'
12
+ require 'opal/array'
13
+ require 'opal/hash'
14
+ require 'opal/string'
15
+ require 'opal/numeric'
16
+ require 'opal/proc'
17
+ require 'opal/range'
18
+ require 'opal/time'
19
+ require 'opal/native'
21
20
 
22
21
  # regexp matches
23
22
  $& = $~ = $` = $' = nil
@@ -45,7 +44,8 @@ STDOUT = $stdout = Object.new
45
44
  RUBY_PLATFORM = 'opal'
46
45
  RUBY_ENGINE = 'opal'
47
46
  RUBY_VERSION = '1.9.3'
48
- RUBY_RELEASE_DATE = '2013-05-02'
47
+ RUBY_ENGINE_VERSION = '0.4.3'
48
+ RUBY_RELEASE_DATE = '2013-07-24'
49
49
 
50
50
  def self.to_s
51
51
  'main'
@@ -14,15 +14,15 @@ class Array
14
14
 
15
15
  def self.new(size = undefined, obj = nil, &block)
16
16
  %x{
17
-
17
+
18
18
  if (arguments.length > 2)
19
19
  #{raise ArgumentError.new("wrong number of arguments. Array#new")};
20
-
21
- if (arguments.length == 0)
20
+
21
+ if (arguments.length == 0)
22
22
  return [];
23
23
 
24
- var size,
25
- obj = arguments[1],
24
+ var size,
25
+ obj = arguments[1],
26
26
  arr = [];
27
27
 
28
28
  if (!obj) {
@@ -45,20 +45,20 @@ class Array
45
45
  } else {
46
46
  #{raise TypeError.new("can't convert to Integer. Array#new")};
47
47
  }
48
- } else {
48
+ } else {
49
49
  #{raise TypeError.new("can't convert to Integer. Array#new")};
50
50
  }
51
51
  }
52
-
52
+
53
53
  if (size < 0) {
54
54
  #{raise ArgumentError.new("negative array size")};
55
55
  }
56
-
56
+
57
57
  if (obj == undefined) {
58
58
  obj = nil;
59
59
  }
60
-
61
-
60
+
61
+
62
62
  if (block === nil)
63
63
  for (var i = 0; i < size; i++) {
64
64
  arr.push(obj);
@@ -71,8 +71,8 @@ class Array
71
71
  }
72
72
  arr[i] = block(i);
73
73
  }
74
- }
75
-
74
+ }
75
+
76
76
  return arr;
77
77
  }
78
78
  end
@@ -135,7 +135,20 @@ class Array
135
135
  end
136
136
 
137
137
  def +(other)
138
- `#{self}.concat(other)`
138
+ %x{
139
+ var arr = other;
140
+
141
+ if (!other._isArray){
142
+ if (#{other.respond_to?(:to_ary)}) {
143
+ arr = other['$to_ary']();
144
+ }
145
+ else {
146
+ #{raise TypeError.new("can't convert to Array. Array#+") };
147
+ }
148
+ }
149
+
150
+ return #{self}.concat(arr);
151
+ }
139
152
  end
140
153
 
141
154
  def -(other)
@@ -144,32 +157,32 @@ class Array
144
157
  b = #{other},
145
158
  tmp = [],
146
159
  result = [];
147
-
148
- if (typeof(b) == "object" && !(b instanceof Array)) {
160
+
161
+ if (typeof(b) == "object" && !(b._isArray)) {
149
162
  if (b['$to_ary'] && typeof(b['$to_ary']) == "function") {
150
163
  b = b['$to_ary']();
151
164
  } else {
152
165
  #{raise TypeError.new("can't convert to Array. Array#-") };
153
166
  }
154
167
  }else if ((typeof(b) != "object")) {
155
- #{raise TypeError.new("can't convert to Array. Array#-") };
156
- }
168
+ #{raise TypeError.new("can't convert to Array. Array#-") };
169
+ }
157
170
 
158
171
  if (a.length == 0)
159
172
  return [];
160
173
  if (b.length == 0)
161
- return a;
162
-
163
- for(var i = 0, length = b.length; i < length; i++) {
174
+ return a;
175
+
176
+ for(var i = 0, length = b.length; i < length; i++) {
164
177
  tmp[b[i]] = true;
165
178
  }
166
179
  for(var i = 0, length = a.length; i < length; i++) {
167
- if (!tmp[a[i]]) {
180
+ if (!tmp[a[i]]) {
168
181
  result.push(a[i]);
169
- }
182
+ }
170
183
  }
171
-
172
- return result;
184
+
185
+ return result;
173
186
  }
174
187
  end
175
188
 
File without changes
File without changes
@@ -23,22 +23,41 @@ class Class
23
23
  `__opal.bridge(name, constructor)`
24
24
  end
25
25
 
26
+ def ===(object)
27
+ %x{
28
+ if (object == null) {
29
+ return false;
30
+ }
31
+
32
+ var search = object._klass;
33
+
34
+ while (search) {
35
+ if (search === #{self}) {
36
+ return true;
37
+ }
38
+
39
+ search = search._super;
40
+ }
41
+
42
+ return false;
43
+ }
44
+ end
26
45
 
27
46
  def allocate
28
47
  %x{
29
- var obj = new #{self};
48
+ var obj = new #{self}._alloc;
30
49
  obj._id = Opal.uid();
31
50
  return obj;
32
51
  }
33
52
  end
34
53
 
35
54
  def alias_method(newname, oldname)
36
- `#{self}.prototype['$' + newname] = #{self}.prototype['$' + oldname]`
55
+ `#{self}._proto['$' + newname] = #{self}._proto['$' + oldname]`
37
56
  self
38
57
  end
39
58
 
40
59
  def alias_native(mid, jsid)
41
- `#{self}.prototype['$' + mid] = #{self}.prototype[jsid]`
60
+ `#{self}._proto['$' + mid] = #{self}._proto[jsid]`
42
61
  end
43
62
 
44
63
  def ancestors
@@ -77,8 +96,8 @@ class Class
77
96
 
78
97
  module._included_in.push(klass);
79
98
 
80
- var donator = module.prototype,
81
- prototype = klass.prototype,
99
+ var donator = module._proto,
100
+ prototype = klass._proto,
82
101
  methods = module._methods;
83
102
 
84
103
  for (var i = 0, length = methods.length; i < length; i++) {
@@ -86,9 +105,9 @@ class Class
86
105
  prototype[method] = donator[method];
87
106
  }
88
107
 
89
- if (prototype._smethods) {
90
- prototype._smethods.push.apply(prototype._smethods, methods);
91
- }
108
+ // if (prototype._smethods) {
109
+ // prototype._smethods.push.apply(prototype._smethods, methods);
110
+ //}
92
111
 
93
112
  if (klass._included_in) {
94
113
  __opal.donate(klass, methods.slice(), true);
@@ -105,14 +124,14 @@ class Class
105
124
 
106
125
  def attr_reader(*names)
107
126
  %x{
108
- var proto = #{self}.prototype, cls = #{self};
127
+ var proto = #{self}._proto, cls = #{self};
109
128
  for (var i = 0, length = names.length; i < length; i++) {
110
129
  (function(name) {
111
130
  proto[name] = nil;
112
131
  var func = function() { return this[name] };
113
132
 
114
133
  if (cls._isSingleton) {
115
- __opal.defs(proto, '$' + name, func);
134
+ proto.constructor.prototype['$' + name] = func;
116
135
  }
117
136
  else {
118
137
  proto['$' + name] = func;
@@ -126,14 +145,14 @@ class Class
126
145
 
127
146
  def attr_writer(*names)
128
147
  %x{
129
- var proto = #{self}.prototype, cls = #{self};
148
+ var proto = #{self}._proto, cls = #{self};
130
149
  for (var i = 0, length = names.length; i < length; i++) {
131
150
  (function(name) {
132
151
  proto[name] = nil;
133
152
  var func = function(value) { return this[name] = value; };
134
153
 
135
154
  if (cls._isSingleton) {
136
- __opal.defs(proto, '$' + name + '=', func);
155
+ proto.constructor.prototype['$' + name + '='] = func;
137
156
  }
138
157
  else {
139
158
  proto['$' + name + '='] = func;
@@ -258,10 +277,10 @@ class Class
258
277
 
259
278
  var jsid = '$' + name;
260
279
  block._jsid = jsid;
261
- block._sup = #{self}.prototype[jsid];
280
+ block._sup = #{self}._proto[jsid];
262
281
  block._s = null;
263
282
 
264
- #{self}.prototype[jsid] = block;
283
+ #{self}._proto[jsid] = block;
265
284
  __opal.donate(#{self}, [jsid]);
266
285
 
267
286
  return null;
@@ -289,9 +308,9 @@ class Class
289
308
 
290
309
  def instance_methods(include_super = false)
291
310
  %x{
292
- var methods = [], proto = #{self}.prototype;
311
+ var methods = [], proto = #{self}._proto;
293
312
 
294
- for (var prop in #{self}.prototype) {
313
+ for (var prop in #{self}._proto) {
295
314
  if (!include_super && !proto.hasOwnProperty(prop)) {
296
315
  continue;
297
316
  }
@@ -331,7 +350,7 @@ class Class
331
350
 
332
351
  def method_defined?(method)
333
352
  %x{
334
- if (typeof(#{self}.prototype['$' + method]) === 'function') {
353
+ if (typeof(#{self}._proto['$' + method]) === 'function') {
335
354
  return true;
336
355
  }
337
356
 
@@ -342,9 +361,9 @@ class Class
342
361
  def module_function(*methods)
343
362
  %x{
344
363
  for (var i = 0, length = methods.length; i < length; i++) {
345
- var meth = methods[i], func = #{self}.prototype['$' + meth];
364
+ var meth = methods[i], func = #{self}._proto['$' + meth];
346
365
 
347
- #{self}['$' + meth] = func;
366
+ #{self}.constructor.prototype['$' + meth] = func;
348
367
  }
349
368
 
350
369
  return #{self};
@@ -357,8 +376,8 @@ class Class
357
376
 
358
377
  def new(*args, &block)
359
378
  %x{
360
- if (#{self}.prototype.$initialize) {
361
- var obj = new #{self};
379
+ if (#{self}._proto.$initialize) {
380
+ var obj = new #{self}._alloc;
362
381
  obj._id = Opal.uid();
363
382
 
364
383
  obj.$initialize._p = block;
@@ -385,8 +404,12 @@ class Class
385
404
  `#{self}._super || nil`
386
405
  end
387
406
 
407
+ def to_s
408
+ `#{self}._name`
409
+ end
410
+
388
411
  def undef_method(symbol)
389
- `#{self}.prototype['$' + symbol] = undefined`
412
+ `#{self}._proto['$' + symbol] = undefined`
390
413
  self
391
414
  end
392
415
  end