opal 0.10.3 → 0.10.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9537a1e10b3a6f999f8d9abae55d49398f938aa6
4
- data.tar.gz: e39781ef2ad2832e32142bfe27dc69e61aa9c64d
3
+ metadata.gz: 89554baf418fe68fca2684442d11d361b74c6771
4
+ data.tar.gz: 7e44601e429aae698df5656a952447be076fc90f
5
5
  SHA512:
6
- metadata.gz: 985d042cb190d1f0fb610fbf96dd7ac099fd1e6b606e60f0c7445bf324621d57d6e272076885559b378edd54f5b4fe937fa2b82d4e8e7ece01998946637226af
7
- data.tar.gz: 2c4fdb0cf980e8c8c24305f0ec4020bf32fdde88b43732a88dffee61cfb4be55f3357bc2c23f0a58df2494825234b80d7140981bd93751008d27d701335594b0
6
+ metadata.gz: 6fc37070ccc46ba143fdad2056837f5dea4fc1bc3f3afbbd2839e978e85e005653301bafbba303af5e7f56b26158a64b9903b3385f8fda872a62cc09ecde0f57
7
+ data.tar.gz: 816cc90b77dbaa07d4bac8bcc32a54e218d6b1b9411a6c864b8f3eb87474c57bff6d648b18a295978c28e6387eae68bb4440d4b2d24f18b8e53ea48c450130cc
data/.rspec CHANGED
@@ -1,3 +1,2 @@
1
1
  --color
2
- --format progress
3
- --pattern spec/lib/**/*_spec.rb
2
+ --require lib/spec_helper
data/.travis.yml CHANGED
@@ -11,31 +11,31 @@ matrix:
11
11
  fast_finish: true
12
12
 
13
13
  include:
14
- - rvm: 2.3.1
14
+ - rvm: 2.3.3
15
15
  env: RUN=jshint SUITE=core
16
16
 
17
- - rvm: 2.3.1
17
+ - rvm: 2.3.3
18
18
  env: RUN=jshint SUITE=stdlib
19
19
 
20
- - rvm: 2.3.1
20
+ - rvm: 2.3.3
21
21
  env: RUN=mspec_opal_nodejs
22
22
 
23
- - rvm: 2.3.1
23
+ - rvm: 2.3.3
24
24
  env: RUN=mspec_ruby_nodejs TZ="/usr/share/zoneinfo/Pacific/Fiji"
25
25
 
26
- - rvm: 2.3.1
26
+ - rvm: 2.3.3
27
27
  env: RUN=mspec_ruby_sprockets_phantomjs
28
28
 
29
- - rvm: 2.3.1
29
+ - rvm: 2.3.3
30
30
  env: RUN=minitest
31
31
 
32
- - rvm: 2.3.1
32
+ - rvm: 2.3.3
33
33
  env: RUN=rspec RACK_VERSION='~> 2.0.0' CHECK_COVERAGE=true
34
34
 
35
35
  - rvm: ruby-head
36
36
  env: RUN=rspec
37
37
 
38
- - rvm: 2.2.4
38
+ - rvm: 2.2.6
39
39
  env: RUN=rspec TILT_VERSION=2.0.1 SPROCKETS_VERSION='~> 3.7'
40
40
 
41
41
  - rvm: 2.1.10
@@ -44,10 +44,7 @@ matrix:
44
44
  - rvm: 2.0.0
45
45
  env: RUN="rspec mspec_opal_nodejs" RACK_VERSION='< 2.0'
46
46
 
47
- - rvm: rbx
48
- env: RUN=rspec
49
-
50
- - rvm: jruby-9.0.5.0
47
+ - rvm: jruby-9.1.6.0
51
48
  env: RUN=rspec
52
49
 
53
50
  - rvm: jruby-head
@@ -55,7 +52,6 @@ matrix:
55
52
 
56
53
  allow_failures:
57
54
  - rvm: ruby-head
58
- - rvm: rbx
59
55
  - rvm: jruby-head
60
56
 
61
57
 
@@ -66,6 +62,7 @@ before_install:
66
62
  - git submodule update --init
67
63
  - npm install -g jshint
68
64
  - npm install -g uglify-js
65
+ - bundle config without doc
69
66
 
70
67
  script:
71
68
  - "bundle exec rake $RUN"
data/.yardopts CHANGED
@@ -1,6 +1,8 @@
1
1
  lib/opal.rb
2
2
  lib/opal/**/*.rb
3
- --markup markdown
3
+ --markup=markdown
4
+ --markup-provider=redcarpet
5
+ --hide-void-return
4
6
  -
5
7
  CHANGELOG.md
6
8
  docs/compiler_directives.md
data/Gemfile CHANGED
@@ -35,3 +35,5 @@ unless ENV['CI']
35
35
  end
36
36
 
37
37
  gem 'mspec', path: 'spec/mspec'
38
+
39
+ gem 'redcarpet', group: :doc
data/lib/opal/config.rb CHANGED
@@ -2,53 +2,130 @@ require 'set'
2
2
 
3
3
  module Opal
4
4
  module Config
5
- def self.default_config
6
- {
7
- method_missing_enabled: true,
8
- arity_check_enabled: false,
9
- freezing_stubs_enabled: true,
10
- tainting_stubs_enabled: true,
11
- const_missing_enabled: true,
12
- dynamic_require_severity: :warning, # :error, :warning or :ignore
13
- irb_enabled: false,
14
- inline_operators_enabled: true,
15
- source_map_enabled: true,
16
- stubbed_files: Set.new,
17
- }
5
+ extend self
6
+
7
+ private
8
+
9
+ def config_options
10
+ @config_options ||= {}
18
11
  end
19
12
 
20
- def self.config
21
- @config ||= default_config
13
+ # Defines a new configuration option
14
+ #
15
+ # @param [String] name the option name
16
+ # @param [Object] default_value the option's default value
17
+ # @!macro [attach] property
18
+ # @!attribute [rw] $1
19
+ def config_option(name, default_value, options = {})
20
+ compiler = options.fetch(:compiler_option, nil)
21
+ valid_values = options.fetch(:valid_values , [true, false])
22
+
23
+ config_options[name] = {
24
+ default: default_value,
25
+ compiler: compiler,
26
+ }
27
+
28
+ define_singleton_method(name) { config.fetch(name, default_value) }
29
+ define_singleton_method("#{name}=") do |value|
30
+ unless valid_values.any? { |valid_value| valid_value === value }
31
+ raise ArgumentError, "Not a valid value for option #{self}.#{name}, provided #{value.inspect}. "\
32
+ "Must be #{valid_values.inspect} === #{value.inspect}"
33
+ end
34
+
35
+ config[name] = value
36
+ end
22
37
  end
23
38
 
24
- def self.reset!
25
- @config = nil
39
+ public
40
+
41
+ # @return [Hash] the default configuration
42
+ def default_config
43
+ default_config = {}
44
+ config_options.each do |name, options|
45
+ default_value = options.fetch(:default)
46
+ default_value = Proc === default_value ? default_value.call : default_value
47
+ default_config[name] = default_value
48
+ end
49
+ default_config
26
50
  end
27
51
 
28
- COMPILER_KEYS = {
29
- # Compiler option name: # Config option name
30
- method_missing: :method_missing_enabled,
31
- arity_check: :arity_check_enabled,
32
- freezing: :freezing_stubs_enabled,
33
- tainting: :tainting_stubs_enabled,
34
- const_missing: :const_missing_enabled,
35
- dynamic_require_severity: :dynamic_require_severity,
36
- irb: :irb_enabled,
37
- inline_operators: :inline_operators_enabled,
38
- }
39
-
40
- def self.compiler_options
41
- config = self.config
52
+ # @return [Hash] the configuration for Opal::Compiler
53
+ def compiler_options
42
54
  compiler_options = {}
43
- COMPILER_KEYS.each do |compiler_option_name, option_name|
44
- compiler_options[compiler_option_name] = config[option_name]
55
+ config_options.each do |name, options|
56
+ compiler_option_name = options.fetch(:compiler)
57
+ compiler_options[compiler_option_name] = config.fetch(name)
45
58
  end
46
59
  compiler_options
47
60
  end
48
61
 
49
- default_config.keys.each do |config_option|
50
- define_singleton_method(config_option) { config[config_option] }
51
- define_singleton_method("#{config_option}=") { |value| config[config_option] = value }
62
+ # @return [Hash] the current configuration, defaults to #default_config
63
+ def config
64
+ @config ||= default_config
52
65
  end
66
+
67
+ # Resets the config to its default value
68
+ #
69
+ # @return [void]
70
+ def reset!
71
+ @config = nil
72
+ end
73
+
74
+
75
+ # Enable method_missing support.
76
+ #
77
+ # @return [true, false]
78
+ config_option :method_missing_enabled, true, compiler_option: :method_missing
79
+
80
+ # Enable const_missing support.
81
+ #
82
+ # @return [true, false]
83
+ config_option :const_missing_enabled, true, compiler_option: :const_missing
84
+
85
+ # Enable arity check on the arguments passed to methods, procs and lambdas.
86
+ #
87
+ # @return [true, false]
88
+ config_option :arity_check_enabled, false, compiler_option: :arity_check
89
+
90
+ # Add stubs for methods related to freezing objects (for compatibility).
91
+ #
92
+ # @return [true, false]
93
+ config_option :freezing_stubs_enabled, true, compiler_option: :freezing
94
+
95
+ # Add stubs for methods related to tainting objects (for compatibility).
96
+ #
97
+ # @return [true, false]
98
+ config_option :tainting_stubs_enabled, true, compiler_option: :tainting
99
+
100
+ # Set the error severity for when a require can't be solved at compile time.
101
+ #
102
+ # - `:error` will raise an error at compile time
103
+ # - `:warning` will print a warning on stderr at compile time
104
+ # - `:ignore` will skip the require silently at compile time
105
+ #
106
+ # @return [:error, :warning, :ignore]
107
+ config_option :dynamic_require_severity, :warning, compiler_option: :dynamic_require_severity, valid_values: [:error, :warning, :ignore]
108
+
109
+ # Enable IRB support for making local variables across multiple compilations.
110
+ #
111
+ # @return [true, false]
112
+ config_option :irb_enabled, false, compiler_option: :irb
113
+
114
+ # Enable for inline operators optimizations.
115
+ #
116
+ # @return [true, false]
117
+ config_option :inline_operators_enabled, true, compiler_option: :inline_operators
118
+
119
+ # Enable source maps support.
120
+ #
121
+ # @return [true, false]
122
+ config_option :source_map_enabled, true
123
+
124
+ # A set of stubbed files that will be marked as loaded and skipped during
125
+ # compilation. The value is expected to be mutated but it's ok to replace
126
+ # it.
127
+ #
128
+ # @return [Set]
129
+ config_option :stubbed_files, -> { Set.new }, valid_values: [Set]
53
130
  end
54
131
  end
@@ -9,7 +9,7 @@ module Opal
9
9
  #
10
10
  # @example
11
11
  #
12
- # Opal::Sprockets.load_asset(Rails.application.assets, 'application')
12
+ # Opal::Sprockets.load_asset('application')
13
13
  #
14
14
  # @example Will output the following JavaScript:
15
15
  #
@@ -19,38 +19,24 @@ module Opal
19
19
  # Opal.load("application");
20
20
  # }
21
21
  #
22
- # @param name [String] The logical name of the main asset to be loaded (without extension)
23
- # @param sprockets [Sprockets::Environment]
22
+ # @param name [String] The logical name of the main asset to be loaded (without extension)
24
23
  #
25
24
  # @return [String] JavaScript code
26
- def self.load_asset(name, sprockets)
27
- asset = sprockets[name.sub(/(\.(js|rb|opal))*#{REGEXP_END}/, '.js')]
28
- return '' if asset.nil?
29
-
30
- opal_extnames = sprockets.engines.map do |ext, engine|
31
- ext if engine <= ::Opal::Processor
32
- end.compact
25
+ def self.load_asset(name, _sprockets = :deprecated)
26
+ if _sprockets != :deprecated && !@load_asset_warning_displayed
27
+ @load_asset_warning_displayed = true
28
+ warn "Passing a sprockets environment to Opal::Sprockets.load_asset no more needed.\n #{caller(1, 3).join("\n ")}"
29
+ end
33
30
 
34
- module_name = -> asset { asset.logical_path.sub(/\.js#{REGEXP_END}/, '') }
35
- path_extnames = -> path { File.basename(path).scan(/\.[^.]+/) }
36
- mark_loaded = -> paths { "Opal.loaded([#{paths.map(&:inspect).join(',')}]);" }
37
- processed_by_opal = -> asset { (path_extnames[asset.pathname] & opal_extnames).any? }
31
+ name = name.sub(/(\.(js|rb|opal))*\z/, '')
38
32
  stubbed_files = ::Opal::Config.stubbed_files
39
33
 
40
- non_opal_assets = ([asset]+asset.dependencies)
41
- .select { |asset| not(processed_by_opal[asset]) }
42
- .map { |asset| module_name[asset] }
43
-
44
- loaded = ['opal'] + non_opal_assets + stubbed_files.to_a
45
-
46
- if processed_by_opal[asset]
47
- load_asset_code = "Opal.load(#{module_name[asset].inspect});"
48
- end
49
-
34
+ loaded = ['opal', 'corelib/runtime'] + stubbed_files.to_a
50
35
 
51
36
  "if (typeof(Opal) !== 'undefined') { "\
52
- "#{mark_loaded[loaded]} "\
53
- "#{load_asset_code} "\
37
+ "Opal.loaded(#{loaded.to_json}); "\
38
+ "if (typeof(OpalLoaded) === 'undefined') Opal.loaded(OpalLoaded); "\
39
+ "if (Opal.modules[#{name.to_json}]) Opal.load(#{name.to_json}); "\
54
40
  "}"
55
41
  end
56
42
 
@@ -83,7 +69,7 @@ module Opal
83
69
  scripts << %{<script src="#{prefix}/#{name}.js"></script>}
84
70
  end
85
71
 
86
- scripts << %{<script>#{::Opal::Sprockets.load_asset(name, sprockets)}</script>}
72
+ scripts << %{<script>#{::Opal::Sprockets.load_asset(name)}</script>}
87
73
 
88
74
  scripts.join "\n"
89
75
  end
@@ -48,10 +48,8 @@ module Opal
48
48
  process_requires(compiler.requires, context)
49
49
  process_required_trees(compiler.required_trees, context)
50
50
 
51
- if Opal::Config.source_map_enabled
52
- map_contents = compiler.source_map.as_json.to_json
53
- ::Opal::SourceMapServer.set_map_cache(sprockets, logical_path, map_contents)
54
- end
51
+ map_contents = compiler.source_map.as_json.to_json
52
+ ::Opal::SourceMapServer.set_map_cache(sprockets, logical_path, map_contents)
55
53
 
56
54
  result.to_s
57
55
  end
@@ -139,10 +137,37 @@ module Opal
139
137
  end
140
138
  end
141
139
 
140
+ module Opal::Sprockets::Processor
141
+ module PlainJavaScriptLoader
142
+ def self.call(input)
143
+ sprockets = input[:environment]
144
+ asset = OpenStruct.new(input)
145
+
146
+ opal_extnames = sprockets.engines.map do |ext, engine|
147
+ ext if engine <= ::Opal::Processor
148
+ end.compact
149
+
150
+ path_extnames = -> path { File.basename(path).scan(/\.[^.]+/) }
151
+ processed_by_opal = -> asset { (path_extnames[asset.filename] & opal_extnames).any? }
152
+
153
+ unless processed_by_opal[asset]
154
+ [
155
+ input[:data],
156
+ %{if (typeof(OpalLoaded) === 'undefined') OpalLoaded = []; OpalLoaded.push(#{input[:name].to_json});}
157
+ ].join(";\n")
158
+ end
159
+ end
160
+ end
161
+ end
162
+
163
+
142
164
  if Sprockets.respond_to? :register_transformer
143
- Sprockets.register_engine '.rb', Opal::Processor, mime_type: 'application/javascript', silence_deprecation: true
144
- Sprockets.register_engine '.opal', Opal::Processor, mime_type: 'application/javascript', silence_deprecation: true
165
+ extra_args = [{mime_type: 'application/javascript', silence_deprecation: true}]
145
166
  else
146
- Sprockets.register_engine '.rb', Opal::Processor
147
- Sprockets.register_engine '.opal', Opal::Processor
167
+ extra_args = []
148
168
  end
169
+
170
+ Sprockets.register_engine '.rb', Opal::Processor, *extra_args
171
+ Sprockets.register_engine '.opal', Opal::Processor, *extra_args
172
+ Sprockets.register_postprocessor 'application/javascript', Opal::Sprockets::Processor::PlainJavaScriptLoader
173
+
data/lib/opal/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Opal
2
2
  # WHEN RELEASING:
3
3
  # Remember to update RUBY_ENGINE_VERSION in opal/corelib/constants.rb too!
4
- VERSION = '0.10.3'
4
+ VERSION = '0.10.4'
5
5
  end
data/opal.gemspec CHANGED
@@ -28,7 +28,7 @@ Gem::Specification.new do |s|
28
28
  s.add_development_dependency 'mspec', '1.5.20'
29
29
  s.add_development_dependency 'rake'
30
30
  s.add_development_dependency 'racc'
31
- s.add_development_dependency 'rspec', '~> 2.99'
31
+ s.add_development_dependency 'rspec', '~> 3.5.0'
32
32
  s.add_development_dependency 'octokit', '~> 2.4.0'
33
33
  s.add_development_dependency 'bundler', '~> 1.5'
34
34
  s.add_development_dependency 'yard', '~> 0.8.7'
@@ -1,8 +1,8 @@
1
1
  RUBY_PLATFORM = 'opal'
2
2
  RUBY_ENGINE = 'opal'
3
- RUBY_VERSION = '2.2.5'
4
- RUBY_ENGINE_VERSION = '0.10.3'
5
- RUBY_RELEASE_DATE = '2016-10-31'
3
+ RUBY_VERSION = '2.2.6'
4
+ RUBY_ENGINE_VERSION = '0.10.4'
5
+ RUBY_RELEASE_DATE = '2017-05-06'
6
6
  RUBY_PATCHLEVEL = 0
7
7
  RUBY_REVISION = 0
8
8
  RUBY_COPYRIGHT = 'opal - Copyright (C) 2013-2015 Adam Beynon'
@@ -3,9 +3,9 @@ require 'opal/cli_runners/phantomjs'
3
3
  require 'stringio'
4
4
 
5
5
  describe Opal::CliRunners::Phantomjs do
6
- # FIXME: Unfotunately there are some issues on jruby and 1.9.3, probably
6
+ # FIXME: Unfotunately there are some issues on 1.9.3, probably
7
7
  # related to IO.pipe and process spawning in general.
8
- before { pending if RUBY_PLATFORM == 'java' or RUBY_VERSION == '1.9.3' }
8
+ before { pending if RUBY_VERSION == '1.9.3' }
9
9
 
10
10
  it 'accepts arguments' do
11
11
  expect(output_of(%{
@@ -2,12 +2,109 @@ require 'lib/spec_helper'
2
2
  require 'opal/config'
3
3
 
4
4
  describe Opal::Config do
5
+ before { described_class.reset! }
6
+ after { described_class.reset! }
7
+
5
8
  describe '.default_config' do
6
9
  it 'is new each time' do
7
10
  default_config1 = described_class.default_config
8
11
  default_config2 = described_class.default_config
9
12
  expect(default_config1).to eq(default_config2)
10
13
  expect(default_config1).not_to equal(default_config2)
14
+ described_class.default_config[:stubbed_files] << :foo
15
+ expect(described_class.default_config[:stubbed_files]).to eq(Set.new)
11
16
  end
12
17
  end
18
+
19
+ it 'has expected default values' do
20
+ expect(described_class.method_missing_enabled).to eq(true)
21
+ expect(described_class.const_missing_enabled).to eq(true)
22
+ expect(described_class.arity_check_enabled).to eq(false)
23
+ expect(described_class.freezing_stubs_enabled).to eq(true)
24
+ expect(described_class.tainting_stubs_enabled).to eq(true)
25
+ expect(described_class.dynamic_require_severity).to eq(:warning)
26
+ expect(described_class.irb_enabled).to eq(false)
27
+ expect(described_class.inline_operators_enabled).to eq(true)
28
+ expect(described_class.source_map_enabled).to eq(true)
29
+ expect(described_class.stubbed_files).to eq(Set.new)
30
+ end
31
+
32
+ it 'raises an ArgumentError if provided with an unexpected value' do
33
+ expect{ described_class.method_missing_enabled = :foobar }.to raise_error(ArgumentError)
34
+ expect{ described_class.const_missing_enabled = :foobar }.to raise_error(ArgumentError)
35
+ expect{ described_class.arity_check_enabled = :foobar }.to raise_error(ArgumentError)
36
+ expect{ described_class.freezing_stubs_enabled = :foobar }.to raise_error(ArgumentError)
37
+ expect{ described_class.tainting_stubs_enabled = :foobar }.to raise_error(ArgumentError)
38
+ expect{ described_class.dynamic_require_severity = :foobar }.to raise_error(ArgumentError)
39
+ expect{ described_class.irb_enabled = :foobar }.to raise_error(ArgumentError)
40
+ expect{ described_class.inline_operators_enabled = :foobar }.to raise_error(ArgumentError)
41
+ expect{ described_class.source_map_enabled = :foobar }.to raise_error(ArgumentError)
42
+ expect{ described_class.stubbed_files = :foobar }.to raise_error(ArgumentError)
43
+ end
44
+
45
+ it 'does not raises errors if provided with an expected value' do
46
+ expect{ described_class.arity_check_enabled = false }.not_to raise_error
47
+ expect(described_class.arity_check_enabled).to eq(false)
48
+
49
+ expect{ described_class.arity_check_enabled = true }.not_to raise_error
50
+ expect(described_class.arity_check_enabled).to eq(true)
51
+
52
+ expect{ described_class.const_missing_enabled = false }.not_to raise_error
53
+ expect(described_class.const_missing_enabled).to eq(false)
54
+
55
+ expect{ described_class.const_missing_enabled = true }.not_to raise_error
56
+ expect(described_class.const_missing_enabled).to eq(true)
57
+
58
+ expect{ described_class.dynamic_require_severity = :error }.not_to raise_error
59
+ expect(described_class.dynamic_require_severity).to eq(:error)
60
+
61
+ expect{ described_class.dynamic_require_severity = :ignore }.not_to raise_error
62
+ expect(described_class.dynamic_require_severity).to eq(:ignore)
63
+
64
+ expect{ described_class.dynamic_require_severity = :warning }.not_to raise_error
65
+ expect(described_class.dynamic_require_severity).to eq(:warning)
66
+
67
+ expect{ described_class.freezing_stubs_enabled = false }.not_to raise_error
68
+ expect(described_class.freezing_stubs_enabled).to eq(false)
69
+
70
+ expect{ described_class.freezing_stubs_enabled = true }.not_to raise_error
71
+ expect(described_class.freezing_stubs_enabled).to eq(true)
72
+
73
+ expect{ described_class.inline_operators_enabled = false }.not_to raise_error
74
+ expect(described_class.inline_operators_enabled).to eq(false)
75
+
76
+ expect{ described_class.inline_operators_enabled = true }.not_to raise_error
77
+ expect(described_class.inline_operators_enabled).to eq(true)
78
+
79
+ expect{ described_class.irb_enabled = false }.not_to raise_error
80
+ expect(described_class.irb_enabled).to eq(false)
81
+
82
+ expect{ described_class.irb_enabled = true }.not_to raise_error
83
+ expect(described_class.irb_enabled).to eq(true)
84
+
85
+ expect{ described_class.method_missing_enabled = false }.not_to raise_error
86
+ expect(described_class.method_missing_enabled).to eq(false)
87
+
88
+ expect{ described_class.method_missing_enabled = true }.not_to raise_error
89
+ expect(described_class.method_missing_enabled).to eq(true)
90
+
91
+ expect{ described_class.source_map_enabled = false }.not_to raise_error
92
+ expect(described_class.source_map_enabled).to eq(false)
93
+
94
+ expect{ described_class.source_map_enabled = true }.not_to raise_error
95
+ expect(described_class.source_map_enabled).to eq(true)
96
+
97
+ expect{ described_class.stubbed_files << 'foo' }.not_to raise_error
98
+ expect(described_class.stubbed_files).to eq(['foo'].to_set)
99
+
100
+ expect{ described_class.stubbed_files = %w[foo bar].to_set }.not_to raise_error
101
+ expect(described_class.stubbed_files).to eq(%w[foo bar].to_set)
102
+
103
+ expect{ described_class.tainting_stubs_enabled = false }.not_to raise_error
104
+ expect(described_class.tainting_stubs_enabled).to eq(false)
105
+
106
+ expect{ described_class.tainting_stubs_enabled = true }.not_to raise_error
107
+ expect(described_class.tainting_stubs_enabled).to eq(true)
108
+
109
+ end
13
110
  end
@@ -12,9 +12,9 @@ describe Opal::PathReader do
12
12
  let(:contents) { File.read(full_path) }
13
13
 
14
14
  before do
15
- path_finder.stub(:find) {|path| nil}
16
- path_finder.stub(:find).with(path).and_return(full_path)
17
- path_finder.stub(:paths).and_return(Opal.paths)
15
+ allow(path_finder).to receive(:find) {|path| nil}
16
+ allow(path_finder).to receive(:find).with(path).and_return(full_path)
17
+ allow(path_finder).to receive(:paths).and_return(Opal.paths)
18
18
  end
19
19
 
20
20
  include_examples :path_finder
@@ -5,12 +5,96 @@ end
5
5
 
6
6
  require 'opal'
7
7
 
8
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
8
9
  RSpec.configure do |config|
9
- config.treat_symbols_as_metadata_keys_with_true_values = true
10
- config.run_all_when_everything_filtered = true
11
- config.filter_run :focus
12
- config.order = 'random'
13
10
  config.before { Opal.reset_paths! }
14
11
  config.before { Opal::Config.reset! if defined? Opal::Config }
15
12
  config.before { Opal::Processor.reset_cache_key! if defined? Opal::Processor }
13
+
14
+ # rspec-expectations config goes here. You can use an alternate
15
+ # assertion/expectation library such as wrong or the stdlib/minitest
16
+ # assertions if you prefer.
17
+ config.expect_with :rspec do |expectations|
18
+ # This option will default to `true` in RSpec 4. It makes the `description`
19
+ # and `failure_message` of custom matchers include text for helper methods
20
+ # defined using `chain`, e.g.:
21
+ # be_bigger_than(2).and_smaller_than(4).description
22
+ # # => "be bigger than 2 and smaller than 4"
23
+ # ...rather than:
24
+ # # => "be bigger than 2"
25
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
26
+
27
+ expectations.syntax = [:expect, :should]
28
+ end
29
+
30
+ # rspec-mocks config goes here. You can use an alternate test double
31
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
32
+ config.mock_with :rspec do |mocks|
33
+ # Prevents you from mocking or stubbing a method that does not exist on
34
+ # a real object. This is generally recommended, and will default to
35
+ # `true` in RSpec 4.
36
+ mocks.verify_partial_doubles = true
37
+
38
+ mocks.syntax = [:expect, :should]
39
+ end
40
+
41
+ # This option will default to `:apply_to_host_groups` in RSpec 4 (and will
42
+ # have no way to turn it off -- the option exists only for backwards
43
+ # compatibility in RSpec 3). It causes shared context metadata to be
44
+ # inherited by the metadata hash of host groups and examples, rather than
45
+ # triggering implicit auto-inclusion in groups with matching metadata.
46
+ config.shared_context_metadata_behavior = :apply_to_host_groups
47
+
48
+ # This allows you to limit a spec run to individual examples or groups
49
+ # you care about by tagging them with `:focus` metadata. When nothing
50
+ # is tagged with `:focus`, all examples get run. RSpec also provides
51
+ # aliases for `it`, `||\describe`, and `context` that include `:focus`
52
+ # metadata: `fit`, `fdescribe` and `fcontext`, respectively.
53
+ config.filter_run_when_matching :focus
54
+
55
+ # Allows RSpec to persist some state between runs in order to support
56
+ # the `--only-failures` and `--next-failure` CLI options. We recommend
57
+ # you configure your source control system to ignore this file.
58
+ config.example_status_persistence_file_path = "tmp/examples.txt"
59
+
60
+ # Limits the available syntax to the non-monkey patched syntax that is
61
+ # recommended. For more details, see:
62
+ # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
63
+ # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
64
+ # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
65
+ # config.disable_monkey_patching!
66
+
67
+ # This setting enables warnings. It's recommended, but in some cases may
68
+ # be too noisy due to issues in dependencies.
69
+ # config.warnings = true
70
+
71
+ # Many RSpec users commonly either run the entire suite or an individual
72
+ # file, and it's useful to allow more verbose output when running an
73
+ # individual spec file.
74
+ if config.files_to_run.one?
75
+ # Use the documentation formatter for detailed output,
76
+ # unless a formatter has already been configured
77
+ # (e.g. via a command-line flag).
78
+ config.default_formatter = 'doc'
79
+ else
80
+ # The RSpec specs are stored in spec/lib.
81
+ config.pattern = 'spec/lib/**/*_spec.rb'
82
+ end
83
+
84
+ # Print the 10 slowest examples and example groups at the
85
+ # end of the spec run, to help surface which specs are running
86
+ # particularly slow.
87
+ config.profile_examples = 10
88
+
89
+ # Run specs in random order to surface order dependencies. If you find an
90
+ # order dependency and want to debug it, you can fix the order by providing
91
+ # the seed, which is printed after each run.
92
+ # --seed 1234
93
+ config.order = :random
94
+
95
+ # Seed global randomization in this process using the `--seed` CLI option.
96
+ # Setting this allows you to use `--seed` to deterministically reproduce
97
+ # test failures related to randomization by passing the same `--seed` value
98
+ # as the one that triggered the failure.
99
+ Kernel.srand config.seed
16
100
  end
@@ -19,7 +19,7 @@ describe Opal::ERB::Processor do
19
19
  ) }
20
20
  let(:required_assets) { [] }
21
21
  let(:template) { described_class.new { |t| %Q{<% print("") %><a href="<%= url %>"><%= name %></a>} } }
22
- before { sprockets_context.stub(:require_asset) {|asset| required_assets << asset } }
22
+ before { allow(sprockets_context).to receive(:require_asset) {|asset| required_assets << asset } }
23
23
 
24
24
  let(:ext) { 'opalerb' }
25
25
 
@@ -45,13 +45,13 @@ describe Opal::Processor do
45
45
  let(:config) { Opal::Config }
46
46
 
47
47
  it 'usually require files' do
48
- sprockets_context.should_receive(:require_asset).with(stubbed_file)
48
+ expect(sprockets_context).to receive(:require_asset).with(stubbed_file)
49
49
  template.render(sprockets_context)
50
50
  end
51
51
 
52
52
  it 'skips require of stubbed file' do
53
53
  config.stubbed_files << stubbed_file.to_s
54
- sprockets_context.should_not_receive(:require_asset).with(stubbed_file)
54
+ expect(sprockets_context).not_to receive(:require_asset).with(stubbed_file)
55
55
  template.render(sprockets_context)
56
56
  end
57
57
 
@@ -61,7 +61,7 @@ describe Opal::Processor do
61
61
  environment.stub(:[]).with('bar.js') { asset }
62
62
  environment.stub(:engines) { {'.rb' => described_class, '.opal' => described_class} }
63
63
 
64
- code = ::Opal::Sprockets.load_asset('bar', environment)
64
+ code = ::Opal::Sprockets.load_asset('bar')
65
65
  code.should match stubbed_file
66
66
  end
67
67
  end
@@ -7,21 +7,28 @@ describe Opal::Sprockets do
7
7
 
8
8
  describe '.load_asset' do
9
9
  it 'loads the main asset' do
10
- code = described_class.load_asset('console', env)
10
+ code = described_class.load_asset('console')
11
11
  expect(code).to include('Opal.load("console");')
12
12
  end
13
13
 
14
14
  it 'marks as loaded "opal" plus all non opal assets' do
15
- code = described_class.load_asset('corelib/runtime', env)
15
+ code = described_class.load_asset('corelib/runtime')
16
16
  expect(code).to include('Opal.loaded(["opal","corelib/runtime"]);')
17
17
  end
18
18
 
19
- it 'returns an empty string if the asset is not found' do
20
- code = described_class.load_asset('foo', env)
21
- expect(code).to eq('')
19
+ it 'tries to load an asset if it is registered as opal module' do
20
+ code = described_class.load_asset('foo')
21
+ expect(code).to include('if (Opal.modules["foo"]) Opal.load("foo");')
22
22
  end
23
23
  end
24
24
 
25
+ it 'warns the user that passing an env is not needed, only once' do
26
+ expect(described_class).to receive(:warn).once
27
+ described_class.load_asset('foo', env)
28
+ described_class.load_asset('foo', env)
29
+ described_class.load_asset('foo', env)
30
+ end
31
+
25
32
  describe '.javascript_include_tag' do
26
33
  it 'works with trailing / in the prefix' do
27
34
  code = described_class.javascript_include_tag('corelib/runtime', prefix: '/', sprockets: env, debug: false)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.3
4
+ version: 0.10.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Beynon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-31 00:00:00.000000000 Z
11
+ date: 2017-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sourcemap
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '2.99'
117
+ version: 3.5.0
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '2.99'
124
+ version: 3.5.0
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: octokit
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -1156,7 +1156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1156
1156
  version: '0'
1157
1157
  requirements: []
1158
1158
  rubyforge_project:
1159
- rubygems_version: 2.6.4
1159
+ rubygems_version: 2.6.8
1160
1160
  signing_key:
1161
1161
  specification_version: 4
1162
1162
  summary: Ruby runtime and core library for JavaScript