opal 0.3.33 → 0.3.34

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