bpm 1.0.0.beta.13 → 1.0.0.rc.1

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.
Files changed (93) hide show
  1. data/CHANGELOG.md +35 -1
  2. data/README.md +1 -1
  3. data/bin/bpm +18 -1
  4. data/bpm.gemspec +3 -3
  5. data/lib/bpm.rb +34 -1
  6. data/lib/bpm/cli/base.rb +32 -44
  7. data/lib/bpm/errors.rb +15 -3
  8. data/lib/bpm/execjs_ext.rb +99 -0
  9. data/lib/bpm/local.rb +1 -1
  10. data/lib/bpm/package.rb +53 -51
  11. data/lib/bpm/pipeline.rb +21 -14
  12. data/lib/bpm/pipeline/directive_processor.rb +9 -0
  13. data/lib/bpm/pipeline/generated_asset.rb +59 -13
  14. data/lib/bpm/pipeline/package_pipeline.rb +2 -2
  15. data/lib/bpm/pipeline/plugin_asset.rb +1 -1
  16. data/lib/bpm/pipeline/plugin_context.rb +12 -2
  17. data/lib/bpm/pipeline/plugin_processor.rb +27 -4
  18. data/lib/bpm/project.rb +171 -139
  19. data/lib/bpm/server.rb +14 -9
  20. data/lib/bpm/version.rb +1 -1
  21. data/man/{bpm-compile.1.ronn → bpm-rebuild.1.ronn} +0 -0
  22. data/man/bpm.1.ronn +112 -9
  23. data/spec/cli/add_spec.rb +15 -6
  24. data/spec/cli/init_spec.rb +7 -7
  25. data/spec/cli/pack_spec.rb +13 -8
  26. data/spec/cli/preview_spec.rb +10 -0
  27. data/spec/cli/rebuild_spec.rb +5 -5
  28. data/spec/cli/remove_spec.rb +1 -1
  29. data/spec/fixtures/gems/core-test-0.4.9.bpkg +0 -0
  30. data/spec/fixtures/packages/backbone/package.json +2 -2
  31. data/spec/fixtures/packages/core-test/package.json +1 -1
  32. data/spec/fixtures/projects/coffee/coffee.json +4 -4
  33. data/spec/fixtures/projects/coffee/{packages → vendor}/coffee-script/compiler.js +0 -0
  34. data/spec/fixtures/projects/coffee/{packages → vendor}/coffee-script/lib/main.js +0 -0
  35. data/spec/fixtures/projects/coffee/{packages → vendor}/coffee-script/package.json +0 -0
  36. data/spec/fixtures/projects/coffee/{packages/handlebars → vendor/handlebars-format}/format.js +0 -0
  37. data/spec/fixtures/projects/coffee/{packages/handlebars → vendor/handlebars-format}/lib/main.js +0 -0
  38. data/spec/fixtures/projects/coffee/{packages/handlebars → vendor/handlebars-format}/package.json +2 -2
  39. data/spec/fixtures/projects/coffee/vendor/handlebars/package.json +15 -0
  40. data/spec/fixtures/projects/coffee/vendor/spade-coffee/package.json +15 -0
  41. data/spec/fixtures/projects/coffee/vendor/spade-handlebars/package.json +15 -0
  42. data/spec/fixtures/projects/coffee/vendor/spade/lib/main.js +1 -0
  43. data/spec/fixtures/projects/coffee/{packages → vendor}/spade/package.json +0 -0
  44. data/spec/fixtures/projects/coffee/{packages → vendor}/spade/transport.js +0 -0
  45. data/spec/fixtures/projects/hello2/{packages → vendor}/a/lib/main.js +0 -0
  46. data/spec/fixtures/projects/hello2/{packages → vendor}/a/package.json +0 -0
  47. data/spec/fixtures/projects/hello2/{packages → vendor}/b/lib/main.js +0 -0
  48. data/spec/fixtures/projects/hello2/{packages → vendor}/b/package.json +0 -0
  49. data/spec/fixtures/projects/hello2/{packages → vendor}/c/lib/main.js +0 -0
  50. data/spec/fixtures/projects/hello2/{packages → vendor}/c/package.json +0 -0
  51. data/spec/fixtures/projects/hello_dev/{packages → vendor}/style_package/css/some_style.css +0 -0
  52. data/spec/fixtures/projects/hello_dev/{packages → vendor}/style_package/package.json +0 -0
  53. data/spec/fixtures/projects/hello_world/another/one.js +1 -0
  54. data/spec/fixtures/projects/hello_world/another/two.js +1 -0
  55. data/spec/fixtures/projects/hello_world/hello_world.json +6 -5
  56. data/spec/fixtures/projects/hello_world/lib2/something.js +1 -0
  57. data/spec/fixtures/projects/hello_world/{packages → vendor}/custom_package/assets/dummy.txt +0 -0
  58. data/spec/fixtures/projects/hello_world/{packages → vendor}/custom_package/css/sample_styles.css +0 -0
  59. data/spec/fixtures/projects/hello_world/{packages → vendor}/custom_package/custom_dir/basic-module.js +0 -0
  60. data/spec/fixtures/projects/hello_world/{packages → vendor}/custom_package/lib/main.js +0 -0
  61. data/spec/fixtures/projects/hello_world/{packages → vendor}/custom_package/package.json +1 -1
  62. data/spec/fixtures/projects/hello_world/vendor/prerelease_package/package.json +4 -0
  63. data/spec/fixtures/projects/init_app/new_project.json +3 -3
  64. data/spec/fixtures/projects/init_default/new_project.json +2 -2
  65. data/spec/fixtures/projects/minitest/minitest.json +1 -1
  66. data/spec/fixtures/projects/minitest/{packages → vendor}/uglyduck/lib/main.js +0 -0
  67. data/spec/fixtures/projects/minitest/{packages → vendor}/uglyduck/minifier/main.js +0 -0
  68. data/spec/fixtures/projects/minitest/{packages → vendor}/uglyduck/package.json +0 -0
  69. data/spec/fixtures/projects/minitrans/minitrans.json +1 -1
  70. data/spec/fixtures/projects/minitrans/{packages → vendor}/transport/lib/main.js +0 -0
  71. data/spec/fixtures/projects/minitrans/{packages → vendor}/transport/package.json +0 -0
  72. data/spec/fixtures/projects/minitrans/{packages → vendor}/transport/transports/wrapper.js +0 -0
  73. data/spec/fixtures/projects/minitrans/{packages → vendor}/uglyduck/lib/main.js +0 -0
  74. data/spec/fixtures/projects/minitrans/{packages → vendor}/uglyduck/minifier/main.js +0 -0
  75. data/spec/fixtures/projects/minitrans/{packages → vendor}/uglyduck/package.json +0 -0
  76. data/spec/fixtures/projects/transporter/{packages → vendor}/transport/lib/main.js +0 -0
  77. data/spec/fixtures/projects/transporter/{packages → vendor}/transport/package.json +0 -0
  78. data/spec/fixtures/projects/transporter/{packages → vendor}/transport/transports/wrapper.js +0 -0
  79. data/spec/package_pipeline_spec.rb +8 -5
  80. data/spec/package_spec.rb +31 -26
  81. data/spec/pipeline_spec.rb +72 -64
  82. data/spec/plugins/format_spec.rb +7 -7
  83. data/spec/project_spec.rb +6 -5
  84. data/spec/spec_helper.rb +5 -4
  85. data/spec/support/cli.rb +9 -7
  86. data/spec/support/env.rb +7 -4
  87. data/spec/support/path.rb +1 -0
  88. data/support/es5-shim.js +935 -0
  89. data/templates/init/project.json +2 -3
  90. metadata +112 -97
  91. data/lib/bpm/pipeline/transport_processor.rb +0 -34
  92. data/spec/fixtures/projects/coffee/packages/spade/lib/main.js +0 -1
  93. data/spec/fixtures/projects/hello_world/vendor/lib/something.js +0 -1
data/CHANGELOG.md CHANGED
@@ -1,3 +1,37 @@
1
+ # 1.0.0.beta.14
2
+
3
+ * Switched from therubyracer to execjs, should provide Windows support
4
+ * Don't blow up when encountering invalid vendored packages
5
+ * Better error handling for CLI
6
+ * Added flag for easier debugging
7
+ * Allow packages to be put in vendor directory - Fixes #14
8
+ * Cleanup Package fields
9
+ * Allow packages to be developed in directories without matching names
10
+ * Fix prerelease flag for local packages - Fixes #16
11
+ * Bpm Init no longer changes folder name - Fixes #13
12
+ * Patched Sprockets directive bug
13
+
14
+ # 1.0.0.beta.13
15
+
16
+ * Updated to latest LibGems with bug fixes
17
+ * Improved error messages
18
+
19
+ # 1.0.0.beta.12
20
+
21
+ * Updated to Rack 1.3.2
22
+ * Removed old references to bpm:formats
23
+ * Added wiki link
24
+
25
+ # 1.0.0.beta.11
26
+
27
+ * Moved JSON transport and minifiers into bpm:provides
28
+ * Documentation updates and fixes - Fixes #3
29
+ * Updated options and fixed tests
30
+
31
+ # 1.0.0.beta.10
32
+
33
+ * Updated documentation
34
+ * Switched to GetBPM.org
1
35
 
2
36
  # 1.0.0.beta.9
3
37
 
@@ -68,4 +102,4 @@ New format for defining a format or transport plugin:
68
102
  # 1.0.0.beta.3.pre
69
103
 
70
104
  * started changelog
71
-
105
+
data/README.md CHANGED
@@ -50,4 +50,4 @@ still incomplete.
50
50
 
51
51
  # Additional Documentation
52
52
 
53
- https://github.com/getbpm/bpm/wiki
53
+ https://github.com/bpm/bpm/wiki
data/bin/bpm CHANGED
@@ -4,5 +4,22 @@ $:.unshift(lib) if File.exists?(lib)
4
4
 
5
5
  require 'bpm'
6
6
 
7
- BPM::CLI::Base.start
7
+ begin
8
+ BPM::CLI::Base.start
9
+ rescue BPM::Error => e
10
+ raise e if ENV['DEBUG']
11
+ warn e.message
12
+ exit false
13
+ rescue Interrupt => e
14
+ raise e if ENV['DEBUG']
15
+ puts "\nQuitting..."
16
+ exit false
17
+ rescue SystemExit => e
18
+ exit e.status
19
+ rescue Exception => e
20
+ warn "Unfortunately, a fatal error has occurred. " +
21
+ "Please report this error to the BPM issue tracker at " +
22
+ "https://github.com/bpm/bpm/issues so that we can fix it. Thanks!"
23
+ raise e
24
+ end
8
25
 
data/bpm.gemspec CHANGED
@@ -16,13 +16,13 @@ Gem::Specification.new do |s|
16
16
  mswin = RbConfig::CONFIG["host_os"] =~ %r!(msdos|mswin|djgpp|mingw)!
17
17
  mri = !mswin && (!defined?(RUBY_ENGINE) || RUBY_ENGINE == "ruby")
18
18
 
19
- s.add_dependency "libgems", "~> 0.1.0"
19
+ s.add_dependency "libgems", "~> 0.1.3"
20
20
  s.add_dependency "gemcutter", "~> 0.6.1"
21
21
  s.add_dependency "highline", "~> 1.6.1"
22
22
  s.add_dependency "json_pure", "~> 1.4.6"
23
23
  s.add_dependency "thor", "~> 0.14.3"
24
- s.add_dependency "therubyracer", "~> 0.9.3beta1"
25
- s.add_dependency "sprockets", "~> 2.0.0.beta.12"
24
+ s.add_dependency "execjs", "~> 1.2.4"
25
+ s.add_dependency "sprockets", "~> 2.0.0"
26
26
 
27
27
  s.add_development_dependency "rspec"
28
28
  s.add_development_dependency "rack", "~> 1.3.2"
data/lib/bpm.rb CHANGED
@@ -1,6 +1,9 @@
1
+ Encoding.default_external = 'UTF-8'
2
+
1
3
  module BPM
2
4
  BPM_DIR = ".bpm"
3
5
  TEMPLATES_DIR = File.expand_path("../../templates", __FILE__)
6
+ ES5_SHIM_PATH = File.expand_path("../../support/es5-shim.js", __FILE__)
4
7
 
5
8
  autoload :CLI, 'bpm/cli'
6
9
  autoload :Credentials, 'bpm/credentials'
@@ -18,7 +21,37 @@ module BPM
18
21
  autoload :PluginContext, 'bpm/pipeline/plugin_context'
19
22
  autoload :PackagePipeline, 'bpm/pipeline/package_pipeline'
20
23
  autoload :FormatProcessor, 'bpm/pipeline/format_processor'
21
- autoload :PluginProcessor, 'bpm/pipeline/plugin_processor'
24
+ autoload :PluginProcessor, 'bpm/pipeline/plugin_processor'
25
+
26
+ def self.compile_js(data)
27
+ require 'bpm/execjs_ext'
28
+ @es5_shim ||= File.read(ES5_SHIM_PATH)
29
+ ExecJS.compile(@es5_shim+"\n"+data)
30
+ end
31
+
32
+ @@show_deprecations = false
33
+ @@deprecation_count = 0
34
+
35
+ def self.show_deprecations
36
+ @@show_deprecations
37
+ end
38
+
39
+ def self.show_deprecations=(val)
40
+ @@show_deprecations = val
41
+ end
42
+
43
+ def self.deprecation_count
44
+ @@deprecation_count
45
+ end
46
+
47
+ def self.deprecation_warning(message)
48
+ if show_deprecations
49
+ warn "[DEPRECATION] #{message}"
50
+ else
51
+ @@deprecation_count += 1
52
+ end
53
+ end
54
+
22
55
  end
23
56
 
24
57
  # The BPM constants need to be defined first
data/lib/bpm/cli/base.rb CHANGED
@@ -16,7 +16,19 @@ module BPM
16
16
  shell.say "\nbpm (v#{BPM::VERSION}) - the browser package manager\n\n"
17
17
  super shell, subcommand
18
18
  end
19
-
19
+
20
+ def self.start(given_args=ARGV, config={})
21
+ if given_args.include?('--verbose') || given_args.include?('-V')
22
+ BPM.show_deprecations = true
23
+ end
24
+
25
+ super
26
+
27
+ if BPM.deprecation_count > 0
28
+ puts "[WARN] #{BPM.deprecation_count} deprecation warnings were hidden. Run with --verbose to see them."
29
+ end
30
+ end
31
+
20
32
  desc "owner", "Manage users for a package"
21
33
  subcommand "owner", BPM::CLI::Owner
22
34
 
@@ -44,11 +56,11 @@ module BPM
44
56
  end
45
57
  end
46
58
  rescue LibGems::InstallError => e
47
- abort "Fetch error: #{e}"
59
+ raise BPM::Error.new("Fetch error: #{e}")
48
60
  rescue LibGems::GemNotFoundException => e
49
61
  abort "Can't find package #{e.name} #{e.version} available for fetch"
50
62
  rescue Errno::EACCES, LibGems::FilePermissionError => e
51
- abort e.message
63
+ raise BPM::Error.new(e.message)
52
64
  end
53
65
  end
54
66
  end
@@ -78,7 +90,7 @@ module BPM
78
90
 
79
91
  deps = {}
80
92
  package_names.each do |name|
81
- vers = options[:version] || (options[:prerelease] ? '>= 0-pre' : '>= 0')
93
+ vers = options[:version] || (options[:prerelease] ? '>= 0.pre' : '>= 0')
82
94
  if name =~ /^(.+?)(-(\d[\w\.]*))?\.bpkg$/
83
95
  name = $1
84
96
  vers = $3 if $3
@@ -90,12 +102,8 @@ module BPM
90
102
  # find project
91
103
  project = find_project
92
104
 
93
- begin
94
- project.add_dependencies deps, options[:development], true
95
- project.build options[:mode], true
96
- rescue BPM::Error => e
97
- abort e.message
98
- end
105
+ project.add_dependencies deps, options[:development], true
106
+ project.build options[:mode], true
99
107
  end
100
108
 
101
109
  desc "remove [PACKAGE]", "Remove one or more packages from a bpm project"
@@ -108,14 +116,10 @@ module BPM
108
116
  abort "You must specify at least one package"
109
117
  end
110
118
 
111
- begin
112
- project = find_project
113
- project.unbuild options[:verbose]
114
- project.remove_dependencies package_names, true
115
- project.build options[:mode], true
116
- rescue BPM::Error => e
117
- abort e.message
118
- end
119
+ project = find_project
120
+ project.unbuild options[:verbose]
121
+ project.remove_dependencies package_names, true
122
+ project.build options[:mode], true
119
123
  end
120
124
 
121
125
  desc "preview", "Preview server that will autocompile assets as you request them. Useful for hacking"
@@ -127,7 +131,7 @@ module BPM
127
131
  project.verify_and_repair options[:mode], options[:verbose]
128
132
  BPM::Server.start project, :Port => options[:port], :mode => options[:mode].to_sym
129
133
  end
130
-
134
+
131
135
  desc "rebuild", "Rebuilds bpm assets, does not update versions"
132
136
  method_option :mode, :type => :string, :default => :production, :aliases => ['-m'], :desc => 'Build mode for compile'
133
137
  method_option :project, :type => :string, :default => nil, :aliases => ['-p'], :desc => 'Specify project location other than working directory'
@@ -135,10 +139,8 @@ module BPM
135
139
  def rebuild
136
140
  find_project.fetch_dependencies(true) if options[:update]
137
141
  find_project.build options[:mode].to_sym, true
138
- rescue BPM::Error => e
139
- abort e.message
140
142
  end
141
-
143
+
142
144
  desc "login", "Log in with your BPM credentials"
143
145
  method_option :username, :type => :string, :default => nil, :aliases => ['-u'], :desc => 'Specify the username to login as'
144
146
  method_option :password, :type => :string, :default => nil, :aliases => ['-p'], :desc => 'Specify the login password'
@@ -224,7 +226,7 @@ module BPM
224
226
  packages = nil if packages.size == 0
225
227
  project = find_project
226
228
  project.verify_and_repair
227
-
229
+
228
230
  deps = options[:development] ? project.sorted_development_deps : project.sorted_runtime_deps
229
231
  deps.each do |dep|
230
232
  next if packages && !packages.include?(dep.name)
@@ -249,11 +251,11 @@ module BPM
249
251
  paths.each do |path|
250
252
  name = options[:name] || File.basename(path)
251
253
 
252
- # if someone specified both a name and path assume they meant
253
- # exactly what they said and don't normalize it.
254
+ # if someone specified both a name and path assume they meant
255
+ # exactly what they said
254
256
  if name == File.basename(path)
255
- underscored = File.join(File.dirname(path), underscore(File.basename(path)))
256
- path = underscored if !File.directory?(path)
257
+ new_path = File.join(File.dirname(path), File.basename(path))
258
+ path = new_path if !File.directory?(path)
257
259
  end
258
260
 
259
261
  if File.directory?(path)
@@ -266,11 +268,7 @@ module BPM
266
268
  success = generator.new(self, name, path, template_path, package).run
267
269
  run_init(name, true, path, package) if success
268
270
  end
269
-
270
271
  end
271
-
272
- rescue BPM::Error => e
273
- abort e.message
274
272
  end
275
273
 
276
274
  desc "pack [PACKAGE]", "Build a bpm package from a package.json"
@@ -289,8 +287,6 @@ module BPM
289
287
  end
290
288
  abort failure_message
291
289
  end
292
- rescue BPM::Error => e
293
- abort e.message
294
290
  end
295
291
 
296
292
  desc "unpack [PACKAGE]", "Extract files from a bpm package"
@@ -334,7 +330,7 @@ module BPM
334
330
 
335
331
  def run_init(name, include_app, path, package=nil)
336
332
 
337
- # we only need to create a new project.json if one does not
333
+ # we only need to create a new project.json if one does not
338
334
  # already exist.
339
335
  unless BPM::Project.is_project_root? path
340
336
  template_path = package ? package.template_path(:init) : nil
@@ -379,10 +375,10 @@ module BPM
379
375
  abort "You do not appear to be inside of a bpm project"
380
376
  end
381
377
  end
382
-
378
+
383
379
  project
384
380
  end
385
-
381
+
386
382
  def print_specs(names, index)
387
383
  packages = {}
388
384
 
@@ -414,14 +410,6 @@ module BPM
414
410
  BPM::Package.from_spec(spec)
415
411
  end
416
412
 
417
- def underscore(str)
418
- str.gsub(/::/, '/').
419
- gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
420
- gsub(/([a-z\d])([A-Z])/,'\1_\2').
421
- tr("-", "_").
422
- downcase
423
- end
424
-
425
413
  end
426
414
  end
427
415
  end
data/lib/bpm/errors.rb CHANGED
@@ -14,11 +14,16 @@ module BPM
14
14
  class InvalidPackageError < BPM::Error
15
15
  def format_message(package, msg=nil)
16
16
  msg = msg.nil? ? '' : ": #{msg}"
17
- "There was a problem parsing #{File.basename(package.json_path)}#{msg}"
17
+ path = begin
18
+ Pathname.new(package.json_path).relative_path_from(Pathname.new(Dir.pwd))
19
+ rescue
20
+ package.json_path
21
+ end
22
+ "There was a problem parsing #{path}#{msg}"
18
23
  end
19
24
  end
20
25
 
21
- class InvalidPackageNameError < BPM::InvalidPackageError
26
+ class InvalidPackagePathError < BPM::InvalidPackageError
22
27
  def format_message(package)
23
28
  "Package at #{package.root_path} name and directory do not match. (name: #{package.name}). Change the directory or package.json name to match."
24
29
  end
@@ -55,5 +60,12 @@ module BPM
55
60
  EOF
56
61
  end
57
62
  end
58
-
63
+
64
+ class CircularDependencyError < BPM::Error
65
+ def initialize(original)
66
+ set_backtrace(original.backtrace)
67
+ super(original.message)
68
+ end
69
+ end
70
+
59
71
  end
@@ -0,0 +1,99 @@
1
+ require 'execjs'
2
+
3
+ # The following is backported from ExecJS master (post 1.2.4)
4
+ # Once 1.2.5 is released, we can remove this
5
+
6
+ module ExecJS
7
+ class ExternalRuntime
8
+ def initialize(options)
9
+ @name = options[:name]
10
+ @command = options[:command]
11
+ @runner_path = options[:runner_path]
12
+ @test_args = options[:test_args]
13
+ @test_match = options[:test_match]
14
+ @encoding = options[:encoding]
15
+ @binary = locate_binary
16
+ end
17
+
18
+ def exec_runtime(filename)
19
+ output = sh("#{@binary} #{filename} 2>&1")
20
+ if $?.success?
21
+ output
22
+ else
23
+ raise RuntimeError, output
24
+ end
25
+ end
26
+
27
+ protected
28
+
29
+ def which(command)
30
+ Array(command).each do |name|
31
+ name, args = name.split(/\s+/, 2)
32
+ result = if ExecJS.windows?
33
+ `"#{ExecJS.root}/support/which.bat" #{name}`
34
+ else
35
+ `command -v #{name} 2>/dev/null`
36
+ end
37
+
38
+ if path = result.strip.split("\n").first
39
+ return args ? "#{path} #{args}" : path
40
+ end
41
+ end
42
+ nil
43
+ end
44
+
45
+ if "".respond_to?(:force_encoding)
46
+ def sh(command)
47
+ output, options = nil, {}
48
+ options[:internal_encoding] = 'UTF-8'
49
+ options[:external_encoding] = @encoding if @encoding
50
+ IO.popen(command, options) { |f| output = f.read }
51
+ output
52
+ end
53
+ else
54
+ require "iconv"
55
+
56
+ def sh(command)
57
+ output = nil
58
+ IO.popen(command) { |f| output = f.read }
59
+
60
+ if @encoding
61
+ Iconv.new('UTF-8', @encoding).iconv(output)
62
+ else
63
+ output
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ module Runtimes
70
+ remove_const :JavaScriptCore
71
+ JavaScriptCore = ExternalRuntime.new(
72
+ :name => "JavaScriptCore",
73
+ :command => ["/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc", "jsc"],
74
+ :runner_path => ExecJS.root + "/support/jsc_runner.js"
75
+ )
76
+
77
+ remove_const :JScript
78
+ JScript = ExternalRuntime.new(
79
+ :name => "JScript",
80
+ :command => "cscript //E:jscript //Nologo //U",
81
+ :runner_path => ExecJS.root + "/support/jscript_runner.js",
82
+ :encoding => 'UTF-16LE' # CScript with //U returns UTF-16LE
83
+ )
84
+
85
+ instance_variable_set(:@runtimes, [
86
+ RubyRacer,
87
+ RubyRhino,
88
+ Johnson,
89
+ Mustang,
90
+ Node,
91
+ JavaScriptCore,
92
+ SpiderMonkey,
93
+ JScript
94
+ ])
95
+ end
96
+
97
+ self.runtime = Runtimes.autodetect
98
+
99
+ end