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