opal 0.3.44 → 0.4.0
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 +0 -1
- data/CHANGELOG.md +52 -0
- data/README.md +3 -3
- data/Rakefile +32 -8
- data/bin/opal +69 -16
- data/config.ru +1 -1
- data/examples/native/app/app.rb +28 -9
- data/examples/rack/app/app.rb +1 -1
- data/lib/opal.rb +0 -1
- data/lib/opal/cli.rb +106 -0
- data/lib/opal/lexer.rb +4 -2
- data/lib/opal/parser.rb +603 -360
- data/lib/opal/processor.rb +20 -8
- data/lib/opal/server.rb +47 -0
- data/lib/opal/source_map.rb +63 -0
- data/lib/opal/sprockets_parser.rb +77 -0
- data/lib/opal/sprockets_source_map_header.rb +21 -0
- data/lib/opal/target_scope.rb +14 -7
- data/lib/opal/version.rb +1 -1
- data/opal.gemspec +2 -0
- data/opal/opal-browser/script_loader.rb +7 -7
- data/opal/opal-parser.js.erb +2 -2
- data/opal/opal-source-maps.js.erb +2 -0
- data/opal/opal.rb +3 -4
- data/opal/opal/array.rb +31 -28
- data/opal/opal/boolean.rb +4 -0
- data/opal/opal/class.rb +14 -5
- data/opal/opal/enumerable.rb +68 -8
- data/opal/opal/error.rb +1 -1
- data/opal/opal/hash.rb +15 -18
- data/opal/opal/kernel.rb +24 -10
- data/opal/opal/native.rb +31 -0
- data/opal/opal/nil_class.rb +7 -2
- data/opal/opal/numeric.rb +10 -1
- data/opal/opal/proc.rb +4 -0
- data/opal/opal/range.rb +1 -1
- data/opal/opal/regexp.rb +13 -3
- data/opal/opal/runtime.js +134 -51
- data/opal/opal/string.rb +45 -22
- data/opal/opal/time.rb +25 -7
- data/opal/source_map.rb +63 -0
- data/opal/source_map/generator.rb +251 -0
- data/opal/source_map/parser.rb +102 -0
- data/opal/source_map/vlq.rb +122 -0
- data/opal/strscan.rb +30 -12
- data/spec/opal/class/_inherited_spec.rb +1 -1
- data/spec/{rubyspec/core → opal}/class/bridge_class_spec.rb +5 -3
- data/spec/{rubyspec/core → opal}/class/extend_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/class/instance_methods_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/class/last_value_spec.rb +0 -1
- data/spec/{rubyspec/core → opal}/json/parse_spec.rb +0 -0
- data/spec/{rubyspec/core/kernel/block_given.rb → opal/kernel/block_given_spec.rb} +0 -0
- data/spec/{rubyspec/core → opal}/kernel/class_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/extend_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/format_spec.rb +0 -0
- data/spec/opal/kernel/freeze_spec.rb +15 -0
- data/spec/{rubyspec/core → opal}/kernel/match_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/method_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/methods_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/nil_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/p_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/printf_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/proc_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/rand_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/respond_to_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/sprintf_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/to_json_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/module/alias_method_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/module/ancestors_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/module/append_features_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/module/constants_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/module/module_function_spec.rb +0 -1
- data/spec/opal/native_spec.rb +85 -3
- data/spec/opal/numeric/equal_spec.rb +9 -0
- data/spec/opal/parser/irb_spec.rb +43 -0
- data/spec/{rubyspec/core → opal}/proc/proc_tricks_spec.rb +0 -0
- data/spec/opal/runtime/block_send_spec.rb +28 -0
- data/spec/{rubyspec/core/runtime → opal/runtime2}/call_spec.rb +0 -0
- data/spec/{rubyspec/core/runtime → opal/runtime2}/class_hierarchy_spec.rb +0 -0
- data/spec/{rubyspec/core/runtime → opal/runtime2}/def_spec.rb +0 -0
- data/spec/{rubyspec/core/runtime → opal/runtime2}/defined_spec.rb +0 -0
- data/spec/{rubyspec/core/runtime → opal/runtime2}/super_spec.rb +0 -0
- data/spec/opal/source_map_spec.rb +19 -0
- data/spec/opal/string/freeze_spec.rb +15 -0
- data/spec/{rubyspec/core → opal}/string/to_json_spec.rb +0 -0
- data/spec/ospec/runner.rb +3 -0
- data/spec/parser/str_spec.rb +4 -0
- data/spec/rubyspec/core/enumerable/fixtures/classes.rb +2 -2
- data/spec/rubyspec/core/enumerable/none_spec.rb +68 -0
- data/spec/rubyspec/core/enumerable/sort_by_spec.rb +31 -0
- data/spec/rubyspec/core/hash/size_spec.rb +1 -1
- data/spec/rubyspec/core/hash/to_native_spec.rb +3 -3
- data/spec/rubyspec/core/string/fixtures/classes.rb +49 -0
- data/spec/rubyspec/core/string/index_spec.rb +405 -0
- data/spec/rubyspec/filters/bugs/language/class.rb +0 -2
- data/spec/rubyspec/filters/bugs/language/module.rb +3 -0
- data/spec/rubyspec/language/array_spec.rb +1 -1
- data/spec/rubyspec/language/block_spec.rb +1 -1
- data/spec/rubyspec/language/module_spec.rb +5 -5
- data/spec/rubyspec/language/predefined_spec.rb +1 -2
- data/spec/rubyspec/library/stringscanner/element_reference_spec.rb +29 -0
- data/spec/rubyspec/spec_helper.rb +31 -0
- metadata +130 -76
- data/lib/opal/erb.rb +0 -41
- data/opal/erb.rb +0 -19
- data/spec/opal/erb/erb_spec.rb +0 -31
- data/spec/simple_erb_template.opalerb +0 -1
- data/spec/templates/foo/bar.opalerb +0 -1
- data/spec/templates/prefixed.opalerb +0 -1
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,55 @@
|
|
|
1
|
+
## 0.4.0 2013-06-15
|
|
2
|
+
|
|
3
|
+
* Added fragments to parser. All parser methods now generate one or
|
|
4
|
+
more Fragments which store the original sexp. This allows us to
|
|
5
|
+
enumerate over them after parsing to map generated lines back to
|
|
6
|
+
original line numbers.
|
|
7
|
+
|
|
8
|
+
* Reverted `null` for `nil`. Too buggy at this time.
|
|
9
|
+
|
|
10
|
+
* Add Opal::SprocketsParser as Parser subclass for handling parsing
|
|
11
|
+
for sprockets environment. This subclass handles require statements
|
|
12
|
+
and stores them for sprockets to use.
|
|
13
|
+
|
|
14
|
+
* Add :irb option to parser to keep top level lvars stored inside
|
|
15
|
+
opal runtime so that an irb session can be persisted and maintain
|
|
16
|
+
access to local variables.
|
|
17
|
+
|
|
18
|
+
* Add Opal::Environment#use_gem() helper to add a gem to opals load
|
|
19
|
+
path.
|
|
20
|
+
|
|
21
|
+
* Stop pre-setting ivars to `nil`. This is no longer needed as `nil`
|
|
22
|
+
is now `null` or `undefined`.
|
|
23
|
+
|
|
24
|
+
* Use `null` as `nil` in opal. This allows us to send methods to
|
|
25
|
+
`null` and `undefined`, and both act as `nil`. This makes opal a
|
|
26
|
+
much better javascript citizen. **REVERTED**
|
|
27
|
+
|
|
28
|
+
* Add Enumerable#none? with specs.
|
|
29
|
+
|
|
30
|
+
* Add Opal.block_send() runtime helper for sending methods to an
|
|
31
|
+
object which uses a block.
|
|
32
|
+
|
|
33
|
+
* Remove \_klass variable for denoting ruby classes, and use
|
|
34
|
+
constructor instead. constructor is a javascript property used for
|
|
35
|
+
the same purpose, and this makes opal fit in as a better js citizen.
|
|
36
|
+
|
|
37
|
+
* Add Class.bridge\_class method to bridge a native constructor into an
|
|
38
|
+
opal class which will set it up with all methods from Object, as
|
|
39
|
+
well as giving it a scope and name.
|
|
40
|
+
|
|
41
|
+
* Added native #[]= and #to_h methods, for setting properties and
|
|
42
|
+
converting to a hash respectivaly.
|
|
43
|
+
|
|
44
|
+
* Fix bug where '::' was parsed as :colon2 instead of :colon3 when in
|
|
45
|
+
an args scope. Fixes #213
|
|
46
|
+
|
|
47
|
+
* Remove lots of properties added to opal classes. This makes normal
|
|
48
|
+
js constructors a lot closer to opal classes, making is easier to
|
|
49
|
+
treat js classes as opal classes.
|
|
50
|
+
|
|
51
|
+
* Merge Hash.from_native into Hash.new
|
|
52
|
+
|
|
1
53
|
## 0.3.44 2013-05-31
|
|
2
54
|
|
|
3
55
|
* Cleanup runtime, and remove various flags and functions from opal
|
data/README.md
CHANGED
|
@@ -41,9 +41,9 @@ javascript. These are built using `rake`, as above.
|
|
|
41
41
|
|
|
42
42
|
### spec
|
|
43
43
|
|
|
44
|
-
* **
|
|
45
|
-
* **
|
|
46
|
-
* **
|
|
44
|
+
* **rubyspec** contains rubyspecs that apply to opal (core + language)
|
|
45
|
+
* **opal** opal additions/special behaviour in the runtime/corelib
|
|
46
|
+
* **parser** specs for opal lib (parser, lexer, grammar etc)
|
|
47
47
|
|
|
48
48
|
## License
|
|
49
49
|
|
data/Rakefile
CHANGED
|
@@ -13,7 +13,7 @@ class RunSpec
|
|
|
13
13
|
server = fork do
|
|
14
14
|
serv = Opal::Server.new { |s|
|
|
15
15
|
s.append_path 'spec' # before mspec, so we use our overrides
|
|
16
|
-
s.
|
|
16
|
+
s.use_gem 'mspec'
|
|
17
17
|
s.debug = false
|
|
18
18
|
s.main = 'ospec/main'
|
|
19
19
|
}
|
|
@@ -25,10 +25,11 @@ class RunSpec
|
|
|
25
25
|
system "phantomjs \"spec/ospec/sprockets.js\" \"http://localhost:9999/\""
|
|
26
26
|
success = $?.success?
|
|
27
27
|
|
|
28
|
+
exit 1 unless success
|
|
29
|
+
|
|
30
|
+
ensure
|
|
28
31
|
Process.kill(:SIGINT, server)
|
|
29
32
|
Process.wait
|
|
30
|
-
|
|
31
|
-
exit 1 unless success
|
|
32
33
|
end
|
|
33
34
|
end
|
|
34
35
|
|
|
@@ -37,16 +38,39 @@ task :default do
|
|
|
37
38
|
RunSpec.new
|
|
38
39
|
end
|
|
39
40
|
|
|
41
|
+
desc "Build specs to build/specs.js and build/specs.min.js"
|
|
42
|
+
task :build_specs do
|
|
43
|
+
require 'uglifier'
|
|
44
|
+
|
|
45
|
+
Opal::Processor.arity_check_enabled = true
|
|
46
|
+
ENV['OPAL_SPEC'] = ["#{Dir.pwd}/spec/"].join(',')
|
|
47
|
+
|
|
48
|
+
env = Opal::Environment.new
|
|
49
|
+
env.append_path 'spec'
|
|
50
|
+
env.use_gem 'mspec'
|
|
51
|
+
|
|
52
|
+
FileUtils.mkdir_p 'build'
|
|
53
|
+
|
|
54
|
+
puts " * build/specs.js"
|
|
55
|
+
specs = env['ospec/main'].to_s
|
|
56
|
+
|
|
57
|
+
# puts " * build/specs.min.js"
|
|
58
|
+
# min = Uglifier.compile(specs)
|
|
59
|
+
|
|
60
|
+
File.open('build/specs.js', 'w+') { |o| o << specs }
|
|
61
|
+
# File.open('build/specs.min.js', 'w+') { |o| o << min }
|
|
62
|
+
end
|
|
63
|
+
|
|
40
64
|
desc "Run task with spec:dir:file helper"
|
|
41
65
|
namespace :spec do
|
|
42
66
|
task 'dirs' do
|
|
43
67
|
end
|
|
44
|
-
rule '' do |
|
|
68
|
+
rule '' do |task|
|
|
45
69
|
|
|
46
70
|
#build path for spec files\dirs.
|
|
47
71
|
#Example:
|
|
48
72
|
#spec:core => spec/core/
|
|
49
|
-
#spec:core:array:
|
|
73
|
+
#spec:core:array:allocate => spec/core/array/allocate_spec.rb
|
|
50
74
|
def path(dirs)
|
|
51
75
|
path = "#{Dir.pwd}"
|
|
52
76
|
dirs.each do |dir|
|
|
@@ -58,11 +82,11 @@ namespace :spec do
|
|
|
58
82
|
end
|
|
59
83
|
end
|
|
60
84
|
path = [path].flatten
|
|
61
|
-
raise "File or Dir with task #{
|
|
85
|
+
raise ArgumentError, "File or Dir with task #{dirs.join('/')} not found." if path.empty?
|
|
62
86
|
path
|
|
63
87
|
end
|
|
64
88
|
|
|
65
|
-
RunSpec.new(path(
|
|
89
|
+
RunSpec.new(path(task.name.split(":")))
|
|
66
90
|
end
|
|
67
91
|
end
|
|
68
92
|
|
|
@@ -104,7 +128,7 @@ end
|
|
|
104
128
|
|
|
105
129
|
# Used for uglifying source to minify
|
|
106
130
|
def uglify(str)
|
|
107
|
-
IO.popen('uglifyjs
|
|
131
|
+
IO.popen('uglifyjs', 'r+') do |i|
|
|
108
132
|
i.puts str
|
|
109
133
|
i.close_write
|
|
110
134
|
return i.read
|
data/bin/opal
CHANGED
|
@@ -1,33 +1,86 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
|
|
3
3
|
require 'optparse'
|
|
4
|
-
require 'opal'
|
|
5
4
|
|
|
6
5
|
options = {}
|
|
7
6
|
parser = OptionParser.new do |opts|
|
|
8
|
-
opts.banner =
|
|
7
|
+
opts.banner = 'Usage: opal [options] -- [programfile]'
|
|
9
8
|
|
|
10
|
-
opts.on(
|
|
11
|
-
|
|
9
|
+
opts.on('-v', '--version', 'Display Opal Version') do |v|
|
|
10
|
+
require 'opal/version'
|
|
11
|
+
puts "Opal v#{Opal::VERSION}"
|
|
12
12
|
exit
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
opts.on("-
|
|
15
|
+
opts.on("-h", "--help", "Show this message") do
|
|
16
|
+
puts opts
|
|
17
|
+
exit
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
opts.separator ''
|
|
21
|
+
opts.separator 'Basic Options:'
|
|
22
|
+
|
|
23
|
+
opts.on('-I', '--include DIR',
|
|
24
|
+
'Append a load path (may be used more than once)') do |i|
|
|
25
|
+
options[:load_paths] ||= []
|
|
26
|
+
options[:load_paths] << i
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
opts.on('-e', '--eval SOURCE', String,
|
|
30
|
+
'One line of script. Several -e\'s allowed. Omit [programfile]') do |source|
|
|
31
|
+
options[:evals] ||= []
|
|
32
|
+
options[:evals] << source
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
opts.on('-s', '--sexp', 'Show Sexps') do
|
|
16
36
|
options[:sexp] = true
|
|
17
37
|
end
|
|
18
|
-
end
|
|
19
38
|
|
|
20
|
-
|
|
39
|
+
opts.on('-c', '--compile', 'Compile to JavaScript') do
|
|
40
|
+
options[:compile] = true
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
opts.on('-s', '--server [PORT]', 'Start a server (default port: 3000)') do |port|
|
|
44
|
+
options[:server] = port.to_i
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
opts.separator ''
|
|
49
|
+
opts.separator 'Compilation Options:'
|
|
21
50
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
51
|
+
opts.on('-M', '--no-method-missing', 'Disable method missing') do |value|
|
|
52
|
+
options[:method_missing_enabled] = false
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
opts.on('-O', '--no-optimized-operators', 'Disable optimized operators') do |value|
|
|
56
|
+
options[:optimized_operators_enabled] = false
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
opts.on('-A', '--arity-check', 'Enable arity check') do |value|
|
|
60
|
+
options[:arity_check] = true
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
opts.on('-C', '--no-const-missing', 'Disable const missing') do |value|
|
|
64
|
+
options[:const_missing_enabled] = false
|
|
65
|
+
end
|
|
27
66
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
67
|
+
dynamic_require_levels = %w[error warning ignore]
|
|
68
|
+
opts.on('-D', '--dynamic-require LEVEL', dynamic_require_levels,
|
|
69
|
+
'Set levelDynamic require severity') do |level|
|
|
70
|
+
options[:dynamic_require_severity] = level
|
|
32
71
|
end
|
|
72
|
+
|
|
73
|
+
opts.on('-P', '--no-source-map', 'Disable source map') do |value|
|
|
74
|
+
options[:source_map_enabled] = false
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
opts.on("--irb", "IRB var mode") do |i|
|
|
78
|
+
options[:irb] = true
|
|
79
|
+
end
|
|
80
|
+
|
|
33
81
|
end
|
|
82
|
+
|
|
83
|
+
parser.parse!
|
|
84
|
+
|
|
85
|
+
require 'opal/cli'
|
|
86
|
+
Opal::CLI.new ARGV.first, options
|
data/config.ru
CHANGED
data/examples/native/app/app.rb
CHANGED
|
@@ -1,21 +1,41 @@
|
|
|
1
1
|
require 'opal'
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
# We can treat native objects (in this case `window`) as a ruby object
|
|
4
|
+
# and open up a singleton class on it and define methods on the object
|
|
5
|
+
# directly. This basically defines just a single ruby method onto
|
|
6
|
+
# `window`.
|
|
7
|
+
class << $global
|
|
8
|
+
|
|
9
|
+
# on_ready is a simple method that just adds a 'DOMContentLoaded'
|
|
10
|
+
# event onto window. `self` inside this method will be `window`,
|
|
11
|
+
# so we can call addEventListener as we would in ruby
|
|
12
|
+
def on_ready(&block)
|
|
13
|
+
addEventListener 'DOMContentLoaded', block, false
|
|
14
|
+
end
|
|
15
|
+
end
|
|
4
16
|
|
|
17
|
+
# Call our new method on window (which is accessed by `$global`
|
|
18
|
+
$global.on_ready do
|
|
5
19
|
css = <<-CSS
|
|
6
20
|
body {
|
|
7
21
|
font-family: 'Arial';
|
|
8
22
|
}
|
|
23
|
+
|
|
24
|
+
h1 {
|
|
25
|
+
color: rgb(10, 94, 232);
|
|
26
|
+
}
|
|
9
27
|
CSS
|
|
10
28
|
|
|
11
|
-
|
|
29
|
+
document = $global.document
|
|
30
|
+
|
|
31
|
+
title = document.createElement 'h1'
|
|
12
32
|
title.className = 'main-title'
|
|
13
33
|
title.innerHTML = 'Opal Native Example'
|
|
14
34
|
|
|
15
|
-
desc =
|
|
35
|
+
desc = document.createElement 'p'
|
|
16
36
|
desc.innerHTML = "Hello world! From Opal."
|
|
17
37
|
|
|
18
|
-
target =
|
|
38
|
+
target = document.getElementById 'native-example'
|
|
19
39
|
|
|
20
40
|
unless target
|
|
21
41
|
raise "'native-example' doesn't exist?"
|
|
@@ -24,15 +44,14 @@ $window.addEventListener 'DOMContentLoaded', proc {
|
|
|
24
44
|
target.appendChild title
|
|
25
45
|
target.appendChild desc
|
|
26
46
|
|
|
27
|
-
styles =
|
|
47
|
+
styles = document.createElement 'style'
|
|
28
48
|
styles.type = 'text/css'
|
|
29
49
|
|
|
30
50
|
if styles.respond_to? :styleSheet
|
|
31
51
|
styles.styleSheet.cssText = css
|
|
32
52
|
else
|
|
33
|
-
styles.appendChild
|
|
53
|
+
styles.appendChild document.createTextNode css
|
|
34
54
|
end
|
|
35
55
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}, false
|
|
56
|
+
document.getElementsByTagName('head')[0].appendChild(styles)
|
|
57
|
+
end
|
data/examples/rack/app/app.rb
CHANGED
data/lib/opal.rb
CHANGED
data/lib/opal/cli.rb
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
require 'opal'
|
|
2
|
+
|
|
3
|
+
module Opal
|
|
4
|
+
class CLI
|
|
5
|
+
attr_reader :options, :filename
|
|
6
|
+
|
|
7
|
+
def initialize _filename, options
|
|
8
|
+
@options = options
|
|
9
|
+
@filename = _filename
|
|
10
|
+
|
|
11
|
+
processor_options.each do |option|
|
|
12
|
+
key = option.to_sym
|
|
13
|
+
next unless options.has_key? key
|
|
14
|
+
Opal::Processor.send("#{option}=", options[key])
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
if options[:evals] and options[:evals].any?
|
|
18
|
+
require 'tempfile'
|
|
19
|
+
path = File.join(Dir.tmpdir,"opal-#{$$}.js.rb")
|
|
20
|
+
File.open(path, 'w') do |tempfile|
|
|
21
|
+
options[:load_paths] ||= []
|
|
22
|
+
options[:load_paths] << File.dirname(path)
|
|
23
|
+
|
|
24
|
+
options[:evals].each do |code|
|
|
25
|
+
tempfile.puts 'require "opal"'
|
|
26
|
+
tempfile.puts code
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
@filename = File.basename(path)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
case
|
|
33
|
+
when options[:sexp]
|
|
34
|
+
puts sexp.inspect
|
|
35
|
+
when options[:compile]
|
|
36
|
+
if File.exist?(filename)
|
|
37
|
+
puts sprockets[filename].to_a.last
|
|
38
|
+
else
|
|
39
|
+
puts Opal.parse(filename, options)
|
|
40
|
+
end
|
|
41
|
+
when options[:server]
|
|
42
|
+
server_start
|
|
43
|
+
else
|
|
44
|
+
run
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def run
|
|
49
|
+
begin
|
|
50
|
+
full_source = sprockets[filename]
|
|
51
|
+
IO.popen('node', 'w') do |stdin|
|
|
52
|
+
stdin.write full_source
|
|
53
|
+
end
|
|
54
|
+
rescue Errno::ENOENT
|
|
55
|
+
$stderr.puts 'Please install Node.js to be able to run Opal scripts.'
|
|
56
|
+
exit 127
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def sexp
|
|
61
|
+
Opal::Grammar.new.parse(source)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def source
|
|
65
|
+
File.exist?(filename) ? File.read(filename) : filename
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def processor_options
|
|
69
|
+
%w[
|
|
70
|
+
method_missing_enabled
|
|
71
|
+
optimized_operators_enabled
|
|
72
|
+
arity_check_enabled
|
|
73
|
+
const_missing_enabled
|
|
74
|
+
dynamic_require_severity
|
|
75
|
+
source_map_enabled
|
|
76
|
+
irb_enabled
|
|
77
|
+
]
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def sprockets
|
|
81
|
+
server.sprockets
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def server
|
|
85
|
+
@server ||= Opal::Server.new do |s|
|
|
86
|
+
(options[:load_paths] || []).each do |path|
|
|
87
|
+
s.append_path path
|
|
88
|
+
end
|
|
89
|
+
s.main = File.basename(filename, '.rb')
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def server_start
|
|
94
|
+
require 'rack'
|
|
95
|
+
require 'webrick'
|
|
96
|
+
require 'logger'
|
|
97
|
+
|
|
98
|
+
Rack::Server.start(
|
|
99
|
+
:app => server,
|
|
100
|
+
:Port => options[:port] || 3000,
|
|
101
|
+
:AccessLog => [],
|
|
102
|
+
:Logger => Logger.new($stdout)
|
|
103
|
+
)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|