opal 0.6.3 → 0.7.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -1
- data/.spectator +2 -0
- data/.spectator-mspec +3 -0
- data/.travis.yml +8 -11
- data/CHANGELOG.md +33 -0
- data/CONTRIBUTING.md +8 -43
- data/Gemfile +15 -4
- data/Guardfile +77 -0
- data/README.md +15 -9
- data/Rakefile +36 -12
- data/benchmarks/operators.rb +11 -0
- data/bin/opal +10 -13
- data/bin/opal-build +4 -4
- data/bin/opal-mspec +10 -0
- data/bin/opal-repl +4 -3
- data/examples/sinatra/Gemfile +1 -1
- data/examples/sinatra/config.ru +3 -3
- data/lib/mspec/opal/main.rb.erb +2 -2
- data/lib/mspec/opal/rake_task.rb +31 -24
- data/lib/mspec/opal/runner.rb +18 -1
- data/lib/mspec/opal/sprockets.js +17 -0
- data/lib/opal.rb +1 -34
- data/lib/opal/builder.rb +92 -58
- data/lib/opal/builder_processors.rb +165 -0
- data/lib/opal/cli.rb +85 -144
- data/lib/opal/cli_options.rb +136 -90
- data/lib/opal/cli_runners.rb +10 -0
- data/lib/opal/cli_runners/nodejs.rb +56 -0
- data/lib/opal/cli_runners/phantom.js +35 -0
- data/lib/opal/cli_runners/phantomjs.rb +28 -0
- data/lib/opal/cli_runners/server.rb +54 -0
- data/lib/opal/compiler.rb +35 -16
- data/lib/opal/erb.rb +29 -15
- data/lib/opal/hike_path_finder.rb +18 -0
- data/lib/opal/nodes.rb +1 -0
- data/lib/opal/nodes/call.rb +107 -26
- data/lib/opal/nodes/call_special.rb +31 -6
- data/lib/opal/nodes/class.rb +2 -2
- data/lib/opal/nodes/constants.rb +5 -20
- data/lib/opal/nodes/def.rb +4 -4
- data/lib/opal/nodes/defined.rb +3 -3
- data/lib/opal/nodes/definitions.rb +1 -1
- data/lib/opal/nodes/for.rb +35 -0
- data/lib/opal/nodes/helpers.rb +2 -2
- data/lib/opal/nodes/iter.rb +3 -3
- data/lib/opal/nodes/literal.rb +10 -2
- data/lib/opal/nodes/masgn.rb +2 -2
- data/lib/opal/nodes/module.rb +2 -2
- data/lib/opal/nodes/scope.rb +1 -0
- data/lib/opal/nodes/singleton_class.rb +2 -2
- data/lib/opal/nodes/super.rb +2 -2
- data/lib/opal/nodes/top.rb +30 -3
- data/lib/opal/parser.rb +15 -1
- data/lib/opal/parser/grammar.rb +2571 -2452
- data/lib/opal/parser/grammar.y +37 -5
- data/lib/opal/parser/keywords.rb +2 -0
- data/lib/opal/parser/lexer.rb +21 -11
- data/lib/opal/path_reader.rb +28 -0
- data/lib/opal/paths.rb +38 -0
- data/lib/opal/source_map.rb +32 -15
- data/lib/opal/sprockets/environment.rb +9 -2
- data/lib/opal/sprockets/erb.rb +1 -2
- data/lib/opal/sprockets/path_reader.rb +34 -0
- data/lib/opal/sprockets/processor.rb +40 -39
- data/lib/opal/sprockets/server.rb +47 -33
- data/lib/opal/version.rb +1 -1
- data/opal.gemspec +10 -5
- data/opal/README.md +6 -0
- data/opal/corelib/array.rb +36 -4
- data/opal/corelib/array/inheritance.rb +6 -6
- data/opal/corelib/basic_object.rb +9 -9
- data/opal/corelib/boolean.rb +1 -1
- data/opal/corelib/class.rb +12 -12
- data/opal/corelib/dir.rb +20 -0
- data/opal/corelib/enumerable.rb +42 -42
- data/opal/corelib/enumerator.rb +1 -1
- data/opal/corelib/error.rb +2 -2
- data/opal/corelib/file.rb +56 -0
- data/opal/corelib/hash.rb +5 -5
- data/opal/corelib/helpers.rb +3 -3
- data/opal/corelib/io.rb +13 -10
- data/opal/corelib/kernel.rb +44 -68
- data/opal/corelib/method.rb +1 -1
- data/opal/corelib/module.rb +89 -114
- data/opal/corelib/nil_class.rb +1 -1
- data/opal/corelib/numeric.rb +27 -23
- data/opal/corelib/proc.rb +5 -5
- data/opal/corelib/range.rb +8 -4
- data/opal/corelib/regexp.rb +5 -5
- data/opal/corelib/runtime.js +589 -272
- data/opal/corelib/string.rb +52 -37
- data/opal/corelib/string/inheritance.rb +5 -5
- data/opal/corelib/time.rb +102 -52
- data/opal/corelib/variables.rb +3 -3
- data/opal/opal.rb +2 -0
- data/package.json +9 -0
- data/spec/filters/bugs/array.rb +0 -6
- data/spec/filters/bugs/language.rb +4 -0
- data/spec/filters/bugs/numeric.rb +7 -6
- data/spec/filters/bugs/opal.rb +2 -0
- data/spec/filters/bugs/regexp.rb +4 -0
- data/spec/filters/bugs/string.rb +0 -7
- data/spec/filters/bugs/stringscanner.rb +4 -1
- data/spec/filters/unsupported/private_methods.rb +2 -0
- data/spec/lib/builder_processors_spec.rb +27 -0
- data/spec/lib/builder_spec.rb +66 -0
- data/spec/{cli → lib}/cli_spec.rb +60 -5
- data/spec/{cli → lib}/compiler_spec.rb +66 -5
- data/spec/{cli → lib}/dependency_resolver_spec.rb +1 -1
- data/spec/lib/fixtures/no_requires.rb +1 -0
- data/spec/{cli → lib}/fixtures/opal_file.rb +0 -0
- data/spec/lib/fixtures/require_tree_test.rb +3 -0
- data/spec/lib/fixtures/required_tree_test/required_file1.rb +1 -0
- data/spec/lib/fixtures/required_tree_test/required_file2.rb +1 -0
- data/spec/lib/fixtures/requires.rb +7 -0
- data/spec/{cli → lib}/fixtures/sprockets_file.js.rb +0 -0
- data/spec/lib/fixtures/sprockets_require_tree_test.rb +3 -0
- data/spec/lib/hike_path_finder_spec.rb +23 -0
- data/spec/{cli → lib}/lexer_spec.rb +1 -1
- data/spec/{cli → lib}/parser/alias_spec.rb +1 -1
- data/spec/{cli → lib}/parser/and_spec.rb +1 -1
- data/spec/{cli → lib}/parser/attrasgn_spec.rb +1 -1
- data/spec/{cli → lib}/parser/begin_spec.rb +1 -1
- data/spec/{cli → lib}/parser/block_spec.rb +1 -1
- data/spec/{cli → lib}/parser/break_spec.rb +1 -1
- data/spec/{cli → lib}/parser/call_spec.rb +1 -1
- data/spec/{cli → lib}/parser/class_spec.rb +1 -1
- data/spec/{cli → lib}/parser/comments_spec.rb +1 -1
- data/spec/{cli → lib}/parser/def_spec.rb +1 -1
- data/spec/{cli → lib}/parser/if_spec.rb +1 -1
- data/spec/{cli → lib}/parser/iter_spec.rb +1 -1
- data/spec/{cli → lib}/parser/lambda_spec.rb +1 -1
- data/spec/{cli → lib}/parser/literal_spec.rb +1 -1
- data/spec/{cli → lib}/parser/masgn_spec.rb +1 -1
- data/spec/{cli → lib}/parser/module_spec.rb +1 -1
- data/spec/{cli → lib}/parser/not_spec.rb +1 -1
- data/spec/{cli → lib}/parser/op_asgn1_spec.rb +1 -1
- data/spec/{cli → lib}/parser/op_asgn2_spec.rb +1 -1
- data/spec/{cli → lib}/parser/or_spec.rb +1 -1
- data/spec/{cli → lib}/parser/return_spec.rb +1 -1
- data/spec/{cli → lib}/parser/sclass_spec.rb +1 -1
- data/spec/{cli → lib}/parser/string_spec.rb +8 -1
- data/spec/{cli → lib}/parser/super_spec.rb +1 -1
- data/spec/lib/parser/unary_spec.rb +48 -0
- data/spec/{cli → lib}/parser/undef_spec.rb +1 -1
- data/spec/{cli → lib}/parser/unless_spec.rb +1 -1
- data/spec/{cli → lib}/parser/variables_spec.rb +1 -1
- data/spec/{cli → lib}/parser/while_spec.rb +1 -1
- data/spec/{cli → lib}/parser/yield_spec.rb +1 -1
- data/spec/lib/path_reader_spec.rb +24 -0
- data/spec/lib/shared/path_finder_shared.rb +19 -0
- data/spec/lib/shared/path_reader_shared.rb +31 -0
- data/spec/lib/spec_helper.rb +9 -0
- data/spec/lib/sprockets/environment_spec.rb +30 -0
- data/spec/{cli → lib}/sprockets/erb_spec.rb +1 -1
- data/spec/lib/sprockets/path_reader_spec.rb +25 -0
- data/spec/{cli → lib}/sprockets/processor_spec.rb +9 -2
- data/spec/lib/sprockets/server_spec.rb +20 -0
- data/spec/opal/compiler/irb_spec.rb +11 -11
- data/spec/opal/core/fixtures/require_tree_files/file 1.rb +1 -0
- data/spec/opal/core/fixtures/require_tree_files/file 2.rb +1 -0
- data/spec/opal/core/fixtures/require_tree_files/file 3.rb +1 -0
- data/spec/opal/core/fixtures/require_tree_files/file 4.rb +1 -0
- data/spec/opal/core/fixtures/require_tree_files/file 5.rb +1 -0
- data/spec/opal/core/kernel/require_tree_spec.rb +7 -0
- data/spec/opal/core/kernel/respond_to_spec.rb +2 -2
- data/spec/opal/core/runtime/method_missing_spec.rb +19 -0
- data/spec/opal/core/source_map_spec.rb +2 -2
- data/spec/opal/core/string_spec.rb +11 -0
- data/spec/opal/stdlib/erb/erb_spec.rb +0 -1
- data/spec/opal/stdlib/thread/mutex_spec.rb +40 -0
- data/spec/opal/stdlib/thread/thread_queue_spec.rb +32 -0
- data/spec/opal/stdlib/thread/thread_spec.rb +60 -0
- data/spec/rubyspecs +54 -11
- data/spec/spec_helper.rb +18 -3
- data/spec/support/mspec_rspec_adapter.rb +33 -0
- data/spec/{cli/spec_helper.rb → support/parser_helpers.rb} +10 -10
- data/stdlib/README.md +3 -0
- data/stdlib/benchmark.rb +10 -0
- data/stdlib/date.rb +2 -2
- data/stdlib/dir.rb +1 -5
- data/stdlib/file.rb +1 -7
- data/stdlib/json.rb +10 -1
- data/stdlib/native.rb +5 -5
- data/stdlib/nodejs.rb +5 -0
- data/stdlib/nodejs/dir.rb +13 -0
- data/stdlib/nodejs/file.rb +98 -0
- data/stdlib/nodejs/fileutils.rb +26 -0
- data/stdlib/nodejs/io.rb +2 -0
- data/stdlib/nodejs/irb.rb +45 -0
- data/stdlib/nodejs/process.rb +16 -0
- data/stdlib/nodejs/require.rb +32 -0
- data/stdlib/nodejs/rubygems.rb +68 -0
- data/stdlib/nodejs/runtime.rb +25 -0
- data/stdlib/nodejs/yaml.rb +11 -0
- data/stdlib/opal-parser.rb +1 -2
- data/stdlib/opal-source-maps.rb +2 -0
- data/stdlib/phantomjs.rb +8 -0
- data/stdlib/process.rb +10 -0
- data/stdlib/promise.rb +12 -4
- data/stdlib/set.rb +27 -0
- data/stdlib/source_map.rb +5 -63
- data/stdlib/source_map/map.rb +220 -0
- data/stdlib/source_map/mapping.rb +26 -0
- data/stdlib/source_map/offset.rb +88 -0
- data/stdlib/source_map/version.rb +3 -0
- data/stdlib/source_map/vlq.rb +77 -101
- data/stdlib/sourcemap.rb +1 -0
- data/stdlib/strscan.rb +7 -1
- data/stdlib/template.rb +1 -1
- data/stdlib/thread.rb +147 -7
- metadata +238 -104
- data/lib/mspec/opal/mspec_fixes.rb +0 -87
- data/spec/cli/sprockets/environment_spec.rb +0 -14
- data/spec/filters/bugs/symbol.rb +0 -5
- data/spec/opal/core/kernel/warn_spec.rb +0 -83
- data/spec/opal/core/language/numbers_spec.rb +0 -60
- data/stdlib/opal-source-maps.js.erb +0 -2
- data/stdlib/source_map/generator.rb +0 -251
- data/stdlib/source_map/parser.rb +0 -102
data/bin/opal-build
CHANGED
@@ -19,9 +19,9 @@ module Opal
|
|
19
19
|
end
|
20
20
|
|
21
21
|
opts.on('-g', '--gem GEM_NAME', String,
|
22
|
-
'Adds the specified GEM_NAME to Opal\'s load path.',
|
23
|
-
'E.g.: opal-build --
|
24
|
-
'Will build
|
22
|
+
'Adds the specified GEM_NAME lib dir to Opal\'s load path.',
|
23
|
+
'E.g.: opal-build --gem erubis -- erubis`',
|
24
|
+
'Will build erubis.rb from the regular "erubis" gem') do |g|
|
25
25
|
options[:gems] ||= []
|
26
26
|
options[:gems] << g
|
27
27
|
end
|
@@ -54,7 +54,7 @@ option_parser = Opal::BuilderOptions.new
|
|
54
54
|
option_parser.parse!
|
55
55
|
|
56
56
|
if ARGV.empty?
|
57
|
-
puts
|
57
|
+
puts option_parser
|
58
58
|
else
|
59
59
|
require 'opal'
|
60
60
|
options = option_parser.options
|
data/bin/opal-mspec
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
specs = ARGV.map do |s|
|
4
|
+
s.end_with?('.rb') ? s : "#{s}/**/*_spec.rb"
|
5
|
+
end
|
6
|
+
pattern = %Q{MSPEC_PATTERN="{#{specs.join(',')}}"} if specs.any?
|
7
|
+
command = [pattern, 'rake mspec'].compact.join(' ')
|
8
|
+
exec command
|
9
|
+
|
10
|
+
# bundle exec mspec run -t opal -pspec/corelib/spec_helper spec/corelib/core/true/*
|
data/bin/opal-repl
CHANGED
@@ -19,7 +19,7 @@ module Opal
|
|
19
19
|
|
20
20
|
@v8 = V8::Context.new
|
21
21
|
@v8['console'] = self
|
22
|
-
@v8.eval
|
22
|
+
@v8.eval Opal::Builder.new.build('opal').to_s
|
23
23
|
|
24
24
|
if filename
|
25
25
|
if File.exist? filename
|
@@ -56,8 +56,9 @@ module Opal
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def eval_ruby(str)
|
59
|
-
code =
|
60
|
-
@v8.eval
|
59
|
+
code = Opal::Builder.new.build_str(str, '(irb)', :irb => true, :const_missing => true)
|
60
|
+
code.processed[0...-1].each{ |c| @v8.eval(c.to_s) }
|
61
|
+
@v8.eval "var $_result = #{code.processed.last.to_s} ($_result == null ? 'nil' : $_result.$inspect());"
|
61
62
|
rescue => e
|
62
63
|
puts "#{e.message}\n\t#{e.backtrace.join("\n\t")}"
|
63
64
|
end
|
data/examples/sinatra/Gemfile
CHANGED
data/examples/sinatra/config.ru
CHANGED
@@ -6,7 +6,7 @@ opal = Opal::Server.new {|s|
|
|
6
6
|
s.main = 'application'
|
7
7
|
}
|
8
8
|
|
9
|
-
map
|
9
|
+
map opal.source_maps.prefix do
|
10
10
|
run opal.source_maps
|
11
11
|
end
|
12
12
|
|
@@ -15,14 +15,14 @@ map '/assets' do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
get '/' do
|
18
|
-
<<-
|
18
|
+
<<-HTML
|
19
19
|
<!doctype html>
|
20
20
|
<html>
|
21
21
|
<head>
|
22
22
|
<script src="/assets/application.js"></script>
|
23
23
|
</head>
|
24
24
|
</html>
|
25
|
-
|
25
|
+
HTML
|
26
26
|
end
|
27
27
|
|
28
28
|
run Sinatra::Application
|
data/lib/mspec/opal/main.rb.erb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
# This file just greps for all spec files in spec/ and requires them
|
4
4
|
<% ENV['OPAL_SPEC'].split(',').each do |s| %>
|
5
|
-
|
5
|
+
require <%= s.inspect %>
|
6
6
|
<% end %>
|
7
7
|
|
8
8
|
# All specs have been run, so we notify mspec that we are done
|
data/lib/mspec/opal/rake_task.rb
CHANGED
@@ -11,10 +11,14 @@ class Opal::Nodes::CallNode
|
|
11
11
|
compiler.requires << target
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
push fragment("nil")
|
15
15
|
end
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
+
add_special :not_supported_on do
|
19
|
+
unless meth == :not_supported_on and arglist[1][1] == :opal
|
20
|
+
compile_default!
|
21
|
+
end
|
18
22
|
end
|
19
23
|
end
|
20
24
|
|
@@ -24,7 +28,6 @@ require 'webrick'
|
|
24
28
|
|
25
29
|
module MSpec
|
26
30
|
module Opal
|
27
|
-
DEFAULT_PATTERN = 'spec/{corelib,opal,stdlib}/**/*_spec.rb'
|
28
31
|
DEFAULT_BASEDIR = 'spec'
|
29
32
|
|
30
33
|
require 'rake'
|
@@ -119,18 +122,21 @@ module MSpec
|
|
119
122
|
|
120
123
|
def initialize(basedir = nil, pattern = nil)
|
121
124
|
::Opal::Processor.arity_check_enabled = true
|
122
|
-
::Opal::Processor.dynamic_require_severity = :
|
123
|
-
|
125
|
+
::Opal::Processor.dynamic_require_severity = :error
|
126
|
+
|
124
127
|
@pattern = pattern
|
125
128
|
@basedir = basedir = File.expand_path(basedir || DEFAULT_BASEDIR)
|
126
|
-
|
127
|
-
|
129
|
+
|
130
|
+
::Opal.append_path basedir
|
131
|
+
::Opal.use_gem 'mspec'
|
128
132
|
|
129
133
|
stubs.each do |asset|
|
130
134
|
::Opal::Processor.stub_file asset
|
131
135
|
end
|
132
136
|
|
133
137
|
ENV['OPAL_SPEC'] ||= files_to_run(pattern).join(',')
|
138
|
+
|
139
|
+
super()
|
134
140
|
end
|
135
141
|
|
136
142
|
def stubs
|
@@ -159,25 +165,23 @@ module MSpec
|
|
159
165
|
@files ||= []
|
160
166
|
end
|
161
167
|
|
162
|
-
def add_files specs
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
def paths_from_glob pattern
|
168
|
-
Dir.glob(File.expand_path(pattern)).map do |s|
|
169
|
-
s.sub(/^#{basedir}\//, '').sub(/\.rb$/, '')
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
def rubyspec_paths
|
174
|
-
rubyspec_white_list.map do |path|
|
168
|
+
def add_files specs, tag = ''
|
169
|
+
tag = "[#{tag}] "
|
170
|
+
puts "#{tag}Adding #{specs.size} spec files..."
|
171
|
+
specs = specs.flatten.map do |path|
|
175
172
|
dirname = File.join([basedir, path])
|
176
173
|
if File.directory? dirname
|
177
174
|
rubyspec_paths_in_dir(dirname, path)
|
178
175
|
else
|
179
176
|
path
|
180
177
|
end
|
178
|
+
end.flatten
|
179
|
+
files.concat specs
|
180
|
+
end
|
181
|
+
|
182
|
+
def paths_from_glob pattern
|
183
|
+
Dir.glob(File.expand_path(pattern)).map do |s|
|
184
|
+
s.sub(/^#{basedir}\//, '').sub(/\.rb$/, '')
|
181
185
|
end
|
182
186
|
end
|
183
187
|
|
@@ -197,18 +201,20 @@ module MSpec
|
|
197
201
|
|
198
202
|
def files_to_run(pattern=nil)
|
199
203
|
# add any filters in spec/filters of specs we dont want to run
|
200
|
-
add_files paths_from_glob("#{basedir}/filters/**/*.rb")
|
204
|
+
add_files paths_from_glob("#{basedir}/filters/**/*.rb"), :filters
|
201
205
|
|
202
206
|
if pattern
|
203
207
|
# add custom opal specs from spec/
|
204
|
-
add_files paths_from_glob(pattern) &
|
208
|
+
add_files paths_from_glob(pattern) & rubyspec_white_list, :rubyspec_custom_pattern
|
209
|
+
add_files paths_from_glob(pattern).grep(/(?!spec\/(corelib|stdlib)\/)/), :other_custom_pattern
|
205
210
|
|
206
211
|
else
|
207
212
|
# add opal specific specs
|
208
|
-
add_files paths_from_glob("#{basedir}/
|
213
|
+
add_files paths_from_glob("#{basedir}/opal/**/*_spec.rb"), 'opal/*'
|
214
|
+
add_files paths_from_glob("#{basedir}/lib/{lexer_spec.rb,parser/**/*_spec.rb}"), 'lib/{lexer,parser}'
|
209
215
|
|
210
216
|
# add any rubyspecs we want to run (defined in spec/rubyspecs)
|
211
|
-
add_files
|
217
|
+
add_files rubyspec_white_list, :rubyspec_white_list
|
212
218
|
end
|
213
219
|
end
|
214
220
|
|
@@ -246,6 +252,7 @@ module MSpec
|
|
246
252
|
<!DOCTYPE html>
|
247
253
|
<html>
|
248
254
|
<head>
|
255
|
+
<meta charset="UTF-8" />
|
249
256
|
<title>Opal Specs</title>
|
250
257
|
</head>
|
251
258
|
<body>
|
data/lib/mspec/opal/runner.rb
CHANGED
@@ -133,6 +133,22 @@ class PhantomFormatter < BrowserFormatter
|
|
133
133
|
def log(str)
|
134
134
|
`console.log(str)`
|
135
135
|
end
|
136
|
+
|
137
|
+
def after(state)
|
138
|
+
super
|
139
|
+
unless exception?
|
140
|
+
print '.'
|
141
|
+
else
|
142
|
+
print failure? ? 'F' : 'E'
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
class PhantomDebugFormatter < PhantomFormatter
|
148
|
+
def after(state = nil)
|
149
|
+
(@exception && state) ? red(state.description) : green(state.description)
|
150
|
+
super
|
151
|
+
end
|
136
152
|
end
|
137
153
|
|
138
154
|
module MSpec
|
@@ -178,7 +194,8 @@ module OutputSilencer
|
|
178
194
|
original_stdout = $stdout
|
179
195
|
new_stdout = IO.new
|
180
196
|
new_stdout.extend IO::Writable
|
181
|
-
|
197
|
+
new_stdout.write_proc = ->s{}
|
198
|
+
|
182
199
|
begin
|
183
200
|
$stdout = new_stdout
|
184
201
|
yield
|
data/lib/mspec/opal/sprockets.js
CHANGED
@@ -14,6 +14,23 @@ page.onInitialized = function() {
|
|
14
14
|
});
|
15
15
|
};
|
16
16
|
|
17
|
+
var system = require('system');
|
18
|
+
page.onCallback = function(data) {
|
19
|
+
switch (data[0]) {
|
20
|
+
case 'exit':
|
21
|
+
var status = data[1] || 0;
|
22
|
+
phantom.exit(status);
|
23
|
+
case 'stdout':
|
24
|
+
system.stdout.write(data[1] || '');
|
25
|
+
break;
|
26
|
+
case 'stderr':
|
27
|
+
system.stderr.write(data[1] || '');
|
28
|
+
break;
|
29
|
+
default:
|
30
|
+
console.error('Unknown callback data: ', data);
|
31
|
+
}
|
32
|
+
};
|
33
|
+
|
17
34
|
page.open(args[0], function(status) {
|
18
35
|
if (status !== 'success') {
|
19
36
|
console.error("Cannot load: " + args[0]);
|
data/lib/opal.rb
CHANGED
@@ -2,43 +2,10 @@ require 'opal/compiler'
|
|
2
2
|
require 'opal/builder'
|
3
3
|
require 'opal/erb'
|
4
4
|
require 'opal/sprockets'
|
5
|
+
require 'opal/paths'
|
5
6
|
require 'opal/version'
|
6
7
|
|
7
8
|
# Opal is a ruby to javascript compiler, with a runtime for running
|
8
9
|
# in any javascript environment.
|
9
10
|
module Opal
|
10
|
-
def self.gem_dir
|
11
|
-
File.expand_path('..', __FILE__.untaint)
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.core_dir
|
15
|
-
File.expand_path('../../opal', __FILE__.untaint)
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.std_dir
|
19
|
-
File.expand_path('../../stdlib', __FILE__.untaint)
|
20
|
-
end
|
21
|
-
|
22
|
-
# Add a file path to opals load path. Any gem containing ruby code that Opal
|
23
|
-
# has access to should add a load path through this method. Load paths added
|
24
|
-
# here should only be paths which contain code targeted at being compiled by
|
25
|
-
# Opal.
|
26
|
-
def self.append_path(path)
|
27
|
-
paths << path
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.use_gem(gem_name, include_dependecies = true)
|
31
|
-
spec = Gem::Specification.find_by_name(gem_name)
|
32
|
-
|
33
|
-
spec.runtime_dependencies.each do |dependency|
|
34
|
-
use_gem dependency.name
|
35
|
-
end if include_dependecies
|
36
|
-
|
37
|
-
Opal.append_path File.join(spec.gem_dir, 'lib')
|
38
|
-
end
|
39
|
-
|
40
|
-
# Private, don't add to these directly (use .append_path instead).
|
41
|
-
def self.paths
|
42
|
-
@paths ||= [core_dir.untaint, std_dir.untaint, gem_dir.untaint]
|
43
|
-
end
|
44
11
|
end
|
data/lib/opal/builder.rb
CHANGED
@@ -1,101 +1,135 @@
|
|
1
|
-
require 'opal/
|
2
|
-
require '
|
3
|
-
require '
|
1
|
+
require 'opal/path_reader'
|
2
|
+
require 'opal/builder_processors'
|
3
|
+
require 'set'
|
4
4
|
|
5
5
|
module Opal
|
6
6
|
class Builder
|
7
|
+
include BuilderProcessors
|
7
8
|
|
8
|
-
|
9
|
+
def initialize(options = nil)
|
10
|
+
(options || {}).each_pair do |k,v|
|
11
|
+
public_send("#{k}=", v)
|
12
|
+
end
|
13
|
+
|
14
|
+
@compiler_options ||= {}
|
15
|
+
@default_processor ||= RubyProcessor
|
16
|
+
@processors ||= DEFAULT_PROCESSORS
|
17
|
+
@stubs ||= []
|
18
|
+
@preload ||= []
|
19
|
+
@prerequired ||= []
|
20
|
+
@path_reader ||= PathReader.new
|
9
21
|
|
10
|
-
|
11
|
-
Builder.new.build name
|
22
|
+
@processed = []
|
12
23
|
end
|
13
24
|
|
14
|
-
def
|
15
|
-
|
16
|
-
@options = options
|
17
|
-
@handled = {}
|
25
|
+
def self.build(*args, &block)
|
26
|
+
new.build(*args, &block)
|
18
27
|
end
|
19
28
|
|
20
|
-
def
|
21
|
-
|
29
|
+
def build(path, options = {})
|
30
|
+
source = read(path)
|
31
|
+
build_str(source, path, options)
|
22
32
|
end
|
23
33
|
|
24
|
-
def
|
25
|
-
|
34
|
+
def build_str source, filename, options = {}
|
35
|
+
path = path_reader.expand(filename).to_s unless stub?(filename)
|
36
|
+
asset = processor_for(source, filename, path, options)
|
37
|
+
requires = preload + asset.requires + tree_requires(asset, path)
|
38
|
+
requires.map { |r| process_require(r, options) }
|
39
|
+
processed << asset
|
40
|
+
self
|
41
|
+
end
|
26
42
|
|
27
|
-
|
43
|
+
def build_require(path, options = {})
|
44
|
+
process_require(path, options)
|
45
|
+
end
|
28
46
|
|
29
|
-
|
47
|
+
def to_s
|
48
|
+
processed.map(&:to_s).join("\n")
|
30
49
|
end
|
31
50
|
|
32
|
-
def
|
33
|
-
|
34
|
-
@segments << compile_ruby(str, options)
|
35
|
-
@segments.join
|
51
|
+
def source_map
|
52
|
+
processed.map(&:source_map).reduce(:+).as_json.to_json
|
36
53
|
end
|
37
54
|
|
38
|
-
|
39
|
-
location = find_asset path
|
55
|
+
attr_reader :processed
|
40
56
|
|
41
|
-
|
42
|
-
|
43
|
-
build_asset location
|
44
|
-
end
|
45
|
-
end
|
57
|
+
attr_accessor :processors, :default_processor, :path_reader,
|
58
|
+
:compiler_options, :stubs, :prerequired, :preload
|
46
59
|
|
47
|
-
def find_asset(path)
|
48
|
-
return path if Pathname(path).absolute?
|
49
60
|
|
50
|
-
path.untaint if path =~ /\A(\w[-.\w]*\/?)+\Z/
|
51
|
-
file_types = %w[.rb .js .js.erb]
|
52
61
|
|
53
|
-
@paths.each do |root|
|
54
|
-
file_types.each do |type|
|
55
|
-
test = File.join root, "#{path}#{type}"
|
56
62
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
63
|
+
private
|
64
|
+
|
65
|
+
def tree_requires(asset, path)
|
66
|
+
if path.nil? or path.empty?
|
67
|
+
dirname = Dir.pwd
|
68
|
+
else
|
69
|
+
dirname = File.dirname(File.expand_path(path))
|
61
70
|
end
|
62
71
|
|
63
|
-
|
64
|
-
end
|
72
|
+
paths = path_reader.paths.map{|p| File.expand_path(p)}
|
65
73
|
|
66
|
-
|
67
|
-
|
74
|
+
asset.required_trees.flat_map do |tree|
|
75
|
+
expanded = File.expand_path(tree, dirname)
|
76
|
+
base = paths.find { |p| expanded.start_with?(p) }
|
77
|
+
next [] if base.nil?
|
68
78
|
|
69
|
-
|
70
|
-
|
79
|
+
globs = extensions.map { |ext| File.join base, tree, "*.#{ext}" }
|
80
|
+
|
81
|
+
Dir[*globs].map do |file|
|
82
|
+
Pathname(file).relative_path_from(Pathname(base)).to_s.gsub(/(\.js)?(\.(?:#{extensions.join '|'}))$/, '')
|
83
|
+
end
|
71
84
|
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def processor_for(source, filename, path, options)
|
88
|
+
processor = processors.find { |p| p.match? path }
|
89
|
+
processor ||= default_processor
|
90
|
+
return processor.new(source, filename, compiler_options.merge(options))
|
91
|
+
end
|
72
92
|
|
73
|
-
|
93
|
+
def read(path)
|
94
|
+
path_reader.read(path) or
|
95
|
+
raise ArgumentError, "can't find file: #{path.inspect} in #{path_reader.paths.inspect}"
|
74
96
|
end
|
75
97
|
|
76
|
-
def
|
77
|
-
|
98
|
+
def process_require(filename, options)
|
99
|
+
return if prerequired.include?(filename)
|
100
|
+
return if already_processed.include?(filename)
|
101
|
+
already_processed << filename
|
78
102
|
|
79
|
-
|
80
|
-
result = compiler.compile str, options
|
103
|
+
source = stub?(filename) ? '' : read(filename)
|
81
104
|
|
82
|
-
|
83
|
-
|
105
|
+
if source.nil?
|
106
|
+
message = "can't find file: #{filename.inspect}"
|
107
|
+
case @compiler_options[:dynamic_require_severity]
|
108
|
+
when :error then raise LoadError, message
|
109
|
+
when :warning then warn "can't find file: #{filename.inspect}"
|
110
|
+
end
|
84
111
|
end
|
85
112
|
|
86
|
-
|
113
|
+
path = path_reader.expand(filename).to_s unless stub?(filename)
|
114
|
+
asset = processor_for(source, filename, path, options.merge(requirable: true))
|
115
|
+
process_requires(asset.requires+tree_requires(asset, path), options)
|
116
|
+
processed << asset
|
117
|
+
end
|
118
|
+
|
119
|
+
def process_requires(requires, options)
|
120
|
+
requires.map { |r| process_require(r, options) }
|
87
121
|
end
|
88
122
|
|
89
|
-
def
|
90
|
-
|
123
|
+
def already_processed
|
124
|
+
@already_processed ||= Set.new
|
91
125
|
end
|
92
126
|
|
93
|
-
def
|
94
|
-
|
127
|
+
def stub? filename
|
128
|
+
stubs.include?(filename)
|
95
129
|
end
|
96
130
|
|
97
|
-
def
|
98
|
-
|
131
|
+
def extensions
|
132
|
+
@extensions ||= DEFAULT_PROCESSORS.flat_map(&:extensions).compact
|
99
133
|
end
|
100
134
|
end
|
101
135
|
end
|