opal 0.3.33 → 0.3.34

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 (49) hide show
  1. data/.travis.yml +1 -1
  2. data/Gemfile +6 -1
  3. data/README.md +7 -7
  4. data/Rakefile +29 -31
  5. data/bin/opal +1 -1
  6. data/{core/parser/browser.js → lib/assets/javascripts/opal-parser.js.erb} +9 -1
  7. data/lib/assets/javascripts/opal.js.erb +321 -0
  8. data/{core → lib/assets/javascripts/opal}/alpha.rb +0 -0
  9. data/{core → lib/assets/javascripts/opal}/array.rb +14 -1
  10. data/{core → lib/assets/javascripts/opal}/basic_object.rb +0 -0
  11. data/{core → lib/assets/javascripts/opal}/boolean.rb +0 -0
  12. data/{core → lib/assets/javascripts/opal}/class.rb +3 -3
  13. data/{core → lib/assets/javascripts/opal}/comparable.rb +0 -0
  14. data/lib/assets/javascripts/opal/core.js +18 -0
  15. data/lib/assets/javascripts/opal/date.rb +156 -0
  16. data/{core → lib/assets/javascripts/opal}/enumerable.rb +0 -0
  17. data/{core → lib/assets/javascripts/opal}/error.rb +0 -0
  18. data/{core → lib/assets/javascripts/opal}/hash.rb +0 -0
  19. data/{core → lib/assets/javascripts/opal}/json.rb +1 -1
  20. data/{core → lib/assets/javascripts/opal}/kernel.rb +2 -2
  21. data/{core → lib/assets/javascripts/opal}/nil_class.rb +0 -0
  22. data/{core → lib/assets/javascripts/opal}/numeric.rb +0 -0
  23. data/{core → lib/assets/javascripts/opal}/proc.rb +0 -0
  24. data/{core/parser → lib/assets/javascripts/opal}/racc.rb +0 -0
  25. data/{core → lib/assets/javascripts/opal}/range.rb +0 -0
  26. data/{core → lib/assets/javascripts/opal}/regexp.rb +0 -0
  27. data/{core → lib/assets/javascripts/opal}/string.rb +0 -0
  28. data/{core/parser → lib/assets/javascripts/opal}/strscan.rb +0 -0
  29. data/{core → lib/assets/javascripts/opal}/time.rb +0 -0
  30. data/lib/opal.rb +25 -58
  31. data/lib/opal/lexer.rb +1 -1
  32. data/lib/opal/parser.rb +1 -1
  33. data/lib/opal/processor.rb +26 -0
  34. data/lib/opal/version.rb +1 -1
  35. data/opal.gemspec +1 -1
  36. data/spec/core/array/shuffle_spec.rb +11 -0
  37. data/spec/index.html +4 -6
  38. data/spec/spec_helper.rb +3 -1
  39. metadata +29 -35
  40. data/core/date.rb +0 -34
  41. data/core/erb.rb +0 -20
  42. data/core/load_order +0 -20
  43. data/core/runtime.js +0 -305
  44. data/core/test_runner/runner.js +0 -37
  45. data/lib/opal/builder.rb +0 -88
  46. data/lib/opal/erb.rb +0 -14
  47. data/lib/opal/rake_task.rb +0 -80
  48. data/spec/parser/erb_spec.rb +0 -32
  49. data/spec/test_case.html +0 -13
File without changes
@@ -463,7 +463,7 @@ class Array < `Array`
463
463
  end
464
464
 
465
465
  def hash
466
- `#{self}._id || (#{self}._id = unique_id++)`
466
+ `#{self}._id || (#{self}._id = Opal.uid())`
467
467
  end
468
468
 
469
469
  def include?(member)
@@ -933,4 +933,17 @@ class Array < `Array`
933
933
  return #{self}.sort();
934
934
  }
935
935
  end
936
+
937
+ def shuffle()
938
+ %x{
939
+ for (var i = #{self}.length - 1; i > 0; i--) {
940
+ var j = Math.floor(Math.random() * (i + 1));
941
+ var tmp = #{self}[i];
942
+ #{self}[i] = #{self}[j];
943
+ #{self}[j] = tmp;
944
+ }
945
+
946
+ return #{self};
947
+ }
948
+ end
936
949
  end
File without changes
@@ -2,7 +2,7 @@ class Class
2
2
  def self.new(sup = Object, &block)
3
3
  %x{
4
4
  function AnonClass(){};
5
- var klass = boot_class(sup, AnonClass)
5
+ var klass = Opal.boot(sup, AnonClass)
6
6
  klass._name = nil;
7
7
 
8
8
  sup.$inherited(klass);
@@ -21,7 +21,7 @@ class Class
21
21
  def allocate
22
22
  %x{
23
23
  var obj = new #{self};
24
- obj._id = unique_id++;
24
+ obj._id = Opal.uid();
25
25
  return obj;
26
26
  }
27
27
  end
@@ -215,7 +215,7 @@ class Class
215
215
  %x{
216
216
  var args = __slice.call(arguments);
217
217
  var obj = new #{self};
218
- obj._id = unique_id++;
218
+ obj._id = Opal.uid();
219
219
 
220
220
  obj.$initialize.apply(obj, args);
221
221
  return obj;
File without changes
@@ -0,0 +1,18 @@
1
+ //= require opal/class
2
+ //= require opal/basic_object
3
+ //= require opal/kernel
4
+ //= require opal/nil_class
5
+ //= require opal/boolean
6
+ //= require opal/error
7
+ //= require opal/regexp
8
+ //= require opal/comparable
9
+ //= require opal/enumerable
10
+ //= require opal/array
11
+ //= require opal/hash
12
+ //= require opal/string
13
+ //= require opal/numeric
14
+ //= require opal/proc
15
+ //= require opal/range
16
+ //= require opal/time
17
+ //= require opal/date
18
+ //= require opal/json
@@ -0,0 +1,156 @@
1
+ native_date = `Date`
2
+
3
+ days_of_week = %w[Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday]
4
+ short_days = %w[Sun Mon Tue Wed Thu Fri Sat]
5
+ short_months = %w[Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec]
6
+ long_months = %w[January Febuary March April May June July August September October November December]
7
+
8
+ class Date
9
+ def self.wrap(native)
10
+ instance = allocate
11
+ `#{instance}._date = #{native}`
12
+ instance
13
+ end
14
+
15
+ def self.parse(string)
16
+ wrap `native_date.parse(string)`
17
+ end
18
+
19
+ def self.today
20
+ %x{
21
+ var date = #{new};
22
+ date._date = new native_date();
23
+ return date;
24
+ }
25
+ end
26
+
27
+ def initialize(year, month, day)
28
+ `#{self}._date = new native_date(year, month - 1, day)`
29
+ end
30
+
31
+ def -(date)
32
+ `Math.round((#{self}._date - #{date}._date) / (1000 * 60 * 60 * 24))`
33
+ end
34
+
35
+ def <(other)
36
+ %x{
37
+ var a = #{self}._date, b = #{other}._date;
38
+ a.setHours(0, 0, 0, 0);
39
+ b.setHours(0, 0, 0, 0);
40
+ return a < b;
41
+ }
42
+ end
43
+
44
+ def <=(other)
45
+ %x{
46
+ var a = #{self}._date, b = #{other}._date;
47
+ a.setHours(0, 0, 0, 0);
48
+ b.setHours(0, 0, 0, 0);
49
+ return a <= b;
50
+ }
51
+ end
52
+
53
+ def >(other)
54
+ %x{
55
+ var a = #{self}._date, b = #{other}._date;
56
+ a.setHours(0, 0, 0, 0);
57
+ b.setHours(0, 0, 0, 0);
58
+ return a > b;
59
+ }
60
+ end
61
+
62
+ def >=(other)
63
+ %x{
64
+ var a = #{self}._date, b = #{other}._date;
65
+ a.setHours(0, 0, 0, 0);
66
+ b.setHours(0, 0, 0, 0);
67
+ return a >= b;
68
+ }
69
+ end
70
+
71
+ def ==(other)
72
+ %x{
73
+ var a = #{self}._date, b = #{other}._date;
74
+ a.setHours(0, 0, 0, 0);
75
+ b.setHours(0, 0, 0, 0);
76
+ return (a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate());
77
+ }
78
+ end
79
+
80
+ def clone
81
+ Date.wrap(`new native_date(#{self}._date.getTime())`)
82
+ end
83
+
84
+ def day
85
+ `#{self}._date.getDate()`
86
+ end
87
+
88
+ def month
89
+ `#{self}._date.getMonth() + 1`
90
+ end
91
+
92
+ def next
93
+ res = self.clone
94
+ `res._date.setDate(#{self}._date.getDate() + 1)`
95
+ res
96
+ end
97
+
98
+ def next_month
99
+ res = self.clone
100
+ `res._date.add({months: 1})`
101
+ res
102
+ end
103
+
104
+ def prev
105
+ res = self.clone
106
+ `res._date.setDate(#{self}._date.getDate() - 1)`
107
+ res
108
+ end
109
+
110
+ def prev_month
111
+ res = self.clone
112
+ `res._date.add({months: -1})`
113
+ res
114
+ end
115
+
116
+ def strftime(format = '')
117
+ %x{
118
+ var d = #{self}._date;
119
+
120
+ return format.replace(/%(-?.)/g, function(full, m) {
121
+ switch (m) {
122
+ case 'a': return short_days[d.getDay()];
123
+ case 'A': return days_of_week[d.getDay()];
124
+ case 'b': return short_months[d.getMonth()];
125
+ case 'B': return long_months[d.getMonth()];
126
+ case '-d': return d.getDate();
127
+ case 'Y': return d.getFullYear();
128
+ default: return m ;
129
+ }
130
+ });
131
+ }
132
+ end
133
+
134
+ def to_s
135
+ %x{
136
+ var date = #{self}._date;
137
+ return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();
138
+ }
139
+ end
140
+
141
+ def to_json
142
+ to_s.to_json
143
+ end
144
+
145
+ def as_json
146
+ to_s
147
+ end
148
+
149
+ def wday
150
+ `#{self}._date.getDay()`
151
+ end
152
+
153
+ def year
154
+ `#{self}._date.getFullYear()`
155
+ end
156
+ end
File without changes
File without changes
File without changes
@@ -1,4 +1,4 @@
1
- `var json_parse = JSON.parse;`
1
+ `var json_parse = JSON.parse, __hasOwn = Object.prototype.hasOwnProperty`
2
2
 
3
3
  module JSON
4
4
  def self.parse(source)
@@ -302,7 +302,7 @@ module Kernel
302
302
  end
303
303
 
304
304
  def object_id
305
- `#{self}._id || (#{self}._id = unique_id++)`
305
+ `#{self}._id || (#{self}._id = Opal.uid())`
306
306
  end
307
307
 
308
308
  def printf(*args)
@@ -394,7 +394,7 @@ module Kernel
394
394
  class_id = "#<Class:#<" + orig_class._name + ":" + orig_class._id + ">>";
395
395
 
396
396
  function Singleton() {};
397
- var meta = boot_class(orig_class, Singleton);
397
+ var meta = Opal.boot(orig_class, Singleton);
398
398
  meta._name = class_id;
399
399
 
400
400
  meta.prototype = #{self};
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
data/lib/opal.rb CHANGED
@@ -1,6 +1,4 @@
1
1
  require 'opal/parser'
2
- require 'opal/erb'
3
- require 'opal/builder'
4
2
  require 'opal/version'
5
3
 
6
4
  # Opal is a ruby to javascript compiler, with a runtime for running
@@ -26,73 +24,42 @@ module Opal
26
24
  #
27
25
  # @return [String] returns opal runtime/corelib as a string
28
26
  def self.runtime
29
- core_dir = Opal.core_dir
30
- load_order = File.join core_dir, 'load_order'
31
- corelib = File.read(load_order).strip.split.map do |c|
32
- file = File.join(core_dir, "#{c}.rb")
33
- source = File.read file
34
- Opal.parse source, file
35
- end
36
-
37
- runtime = File.read(File.join core_dir, 'runtime.js')
38
- corelib = corelib.join("\n")
39
-
40
- [
41
- "// Opal v#{Opal::VERSION}",
42
- "// http://opalrb.org",
43
- "// Copyright 2013, Adam Beynon",
44
- "// Released under the MIT License",
45
- "(function(undefined) {",
46
- runtime,
47
- "Opal.version = #{ Opal::VERSION.inspect };",
48
- corelib,
49
- "}).call(this);"
50
- ].join("\n")
27
+ process('opal').rstrip
51
28
  end
52
-
53
29
  # Returns parser prebuilt for js-environments.
54
30
  #
55
31
  # @return [String]
56
32
  def self.parser_code
57
- [
58
- Builder.new(:files => %w(racc.rb strscan.rb), :dir => File.join(self.core_dir, 'parser')).build,
59
- self.build_gem('opal'),
60
- File.read(File.join self.core_dir, 'parser', 'browser.js')
61
- ].join("\n")
33
+ process('opal-parser')
62
34
  end
63
35
 
64
- # Build gem with given name to a string.
65
- #
66
- # Opal.build_gem 'opal-spec'
67
- # # => "... javascript code ..."
68
- #
69
- # If the given gem name cannot be found, then an error will be
70
- # raised
71
- #
72
- # @param [String] name the name of the gem
73
- # @return [String] returns built gem
74
- def self.build_gem(name)
75
- spec = Gem::Specification.find_by_name name
76
- Builder.new(:files => spec.require_paths, :dir => spec.full_gem_path).build
36
+ def self.core_dir
37
+ File.join File.dirname(__FILE__), 'assets', 'javascripts'
77
38
  end
78
39
 
79
- # Build the given files. Files should be a string of either a full
80
- # filename, a directory name or even a glob of files to build.
81
- #
82
- # Opal.build_files 'spec'
83
- # # => all spec files in spec dir
84
- #
85
- # @param [String] files files to build
86
- # @return [String]
87
- def self.build_files(files, dir=nil)
88
- Builder.new(:files => files, :dir => dir).build
40
+ def self.append_path(path)
41
+ paths << path
89
42
  end
90
43
 
91
- def self.opal_dir
92
- File.expand_path '../..', __FILE__
44
+ def self.lib_dir
45
+ File.join File.dirname(__FILE__)
93
46
  end
94
47
 
95
- def self.core_dir
96
- File.join opal_dir, 'core'
48
+ # Private, don't access these directly
49
+ def self.paths
50
+ @paths ||= []
51
+ end
52
+
53
+ # Build ruby/opal file at fname
54
+ def self.process(fname)
55
+ require 'opal/processor'
56
+
57
+ env = Sprockets::Environment.new
58
+ paths.each { |p| env.append_path p }
59
+
60
+ env[fname].to_s
97
61
  end
98
- end
62
+ end
63
+
64
+ # Add corelib to assets path
65
+ Opal.append_path Opal.core_dir
data/lib/opal/lexer.rb CHANGED
@@ -1377,7 +1377,7 @@ module Opal
1377
1377
  @lex_state = :expr_end
1378
1378
  end
1379
1379
 
1380
- return [matched =~ /[A-Z]/ ? :CONSTANT : :IDENTIFIER, matched]
1380
+ return [matched =~ /^[A-Z]/ ? :CONSTANT : :IDENTIFIER, matched]
1381
1381
 
1382
1382
  end
1383
1383
  return [false, false] if scanner.eos?
data/lib/opal/parser.rb CHANGED
@@ -189,7 +189,7 @@ module Opal
189
189
  code = INDENT + @scope.to_vars + "\n" + code
190
190
  end
191
191
 
192
- "(function() {\n#{ code }\n})();"
192
+ "(function() {\n#{ code }\n})();\n"
193
193
  end
194
194
 
195
195
  # Every time the parser enters a new scope, this is called with
@@ -0,0 +1,26 @@
1
+ require 'opal'
2
+ require 'sprockets'
3
+
4
+ module Opal
5
+ class Processor < Tilt::Template
6
+ self.default_mime_type = 'application/javascript'
7
+
8
+ def self.engine_initialized?
9
+ true
10
+ end
11
+
12
+ def initialize_engine
13
+ require_template_library 'opal'
14
+ end
15
+
16
+ def prepare
17
+ end
18
+
19
+ def evaluate(scope, locals, &block)
20
+ Opal.parse data
21
+ end
22
+ end
23
+ end
24
+
25
+ Tilt.register 'rb', Opal::Processor
26
+ Sprockets.register_engine '.rb', Opal::Processor