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.
- data/.travis.yml +1 -1
- data/Gemfile +6 -1
- data/README.md +7 -7
- data/Rakefile +29 -31
- data/bin/opal +1 -1
- data/{core/parser/browser.js → lib/assets/javascripts/opal-parser.js.erb} +9 -1
- data/lib/assets/javascripts/opal.js.erb +321 -0
- data/{core → lib/assets/javascripts/opal}/alpha.rb +0 -0
- data/{core → lib/assets/javascripts/opal}/array.rb +14 -1
- data/{core → lib/assets/javascripts/opal}/basic_object.rb +0 -0
- data/{core → lib/assets/javascripts/opal}/boolean.rb +0 -0
- data/{core → lib/assets/javascripts/opal}/class.rb +3 -3
- data/{core → lib/assets/javascripts/opal}/comparable.rb +0 -0
- data/lib/assets/javascripts/opal/core.js +18 -0
- data/lib/assets/javascripts/opal/date.rb +156 -0
- data/{core → lib/assets/javascripts/opal}/enumerable.rb +0 -0
- data/{core → lib/assets/javascripts/opal}/error.rb +0 -0
- data/{core → lib/assets/javascripts/opal}/hash.rb +0 -0
- data/{core → lib/assets/javascripts/opal}/json.rb +1 -1
- data/{core → lib/assets/javascripts/opal}/kernel.rb +2 -2
- data/{core → lib/assets/javascripts/opal}/nil_class.rb +0 -0
- data/{core → lib/assets/javascripts/opal}/numeric.rb +0 -0
- data/{core → lib/assets/javascripts/opal}/proc.rb +0 -0
- data/{core/parser → lib/assets/javascripts/opal}/racc.rb +0 -0
- data/{core → lib/assets/javascripts/opal}/range.rb +0 -0
- data/{core → lib/assets/javascripts/opal}/regexp.rb +0 -0
- data/{core → lib/assets/javascripts/opal}/string.rb +0 -0
- data/{core/parser → lib/assets/javascripts/opal}/strscan.rb +0 -0
- data/{core → lib/assets/javascripts/opal}/time.rb +0 -0
- data/lib/opal.rb +25 -58
- data/lib/opal/lexer.rb +1 -1
- data/lib/opal/parser.rb +1 -1
- data/lib/opal/processor.rb +26 -0
- data/lib/opal/version.rb +1 -1
- data/opal.gemspec +1 -1
- data/spec/core/array/shuffle_spec.rb +11 -0
- data/spec/index.html +4 -6
- data/spec/spec_helper.rb +3 -1
- metadata +29 -35
- data/core/date.rb +0 -34
- data/core/erb.rb +0 -20
- data/core/load_order +0 -20
- data/core/runtime.js +0 -305
- data/core/test_runner/runner.js +0 -37
- data/lib/opal/builder.rb +0 -88
- data/lib/opal/erb.rb +0 -14
- data/lib/opal/rake_task.rb +0 -80
- data/spec/parser/erb_spec.rb +0 -32
- 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 =
|
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
|
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 =
|
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 =
|
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 =
|
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
|
@@ -302,7 +302,7 @@ module Kernel
|
|
302
302
|
end
|
303
303
|
|
304
304
|
def object_id
|
305
|
-
`#{self}._id || (#{self}._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 =
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
80
|
-
|
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.
|
92
|
-
File.
|
44
|
+
def self.lib_dir
|
45
|
+
File.join File.dirname(__FILE__)
|
93
46
|
end
|
94
47
|
|
95
|
-
|
96
|
-
|
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 =~
|
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
@@ -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
|