opal 0.4.2 → 0.4.3

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