opal-webpack-loader 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,130 @@
1
+ // require requirements used below
2
+ const path = require('path');
3
+ const webpack = require('webpack');
4
+ const OwlResolver = require('opal-webpack-loader/resolver'); // to resolve ruby files
5
+
6
+ module.exports = {
7
+ context: path.resolve(__dirname, '<%= opal_directory %>'),
8
+ mode: "development",
9
+ optimization: {
10
+ minimize: false // dont minimize in development, to speed up hot reloads
11
+ },
12
+ performance: {
13
+ maxAssetSize: 20000000,
14
+ maxEntrypointSize: 20000000
15
+ },
16
+ entry: {
17
+ application: [path.resolve(__dirname, '<%= js_entry %>')],
18
+ application_ssr: [path.resolve(__dirname, '<%= js_ssr_entry %>')]
19
+ },
20
+ output: {
21
+ // webpack-dev-server keeps the output in memory
22
+ filename: '[name].js',
23
+ path: path.resolve(__dirname, '<%= asset_output_directory %>'),
24
+ publicPath: 'http://localhost:3035/assets/'
25
+ },
26
+ resolve: {
27
+ plugins: [
28
+ // this makes it possible for webpack to find ruby files
29
+ new OwlResolver('resolve', 'resolved')
30
+ ]
31
+ },
32
+ plugins: [
33
+ // both for hot reloading
34
+ new webpack.NamedModulesPlugin(),
35
+ new webpack.HotModuleReplacementPlugin()
36
+ ],
37
+ module: {
38
+ rules: [
39
+ {
40
+ // loader for .scss files
41
+ // test means "test for for file endings"
42
+ test: /.scss$/,
43
+ use: [
44
+ {
45
+ loader: "style-loader",
46
+ options: {
47
+ hmr: true
48
+ }
49
+ },
50
+ {
51
+ loader: "css-loader",
52
+ options: {
53
+ minimize: false // set to false to speed up hot reloads
54
+ }
55
+ },
56
+ {
57
+ loader: "sass-loader",
58
+ options: {
59
+ includePaths: [path.resolve(__dirname, '<%= stylesheets_directory %>')],
60
+ }
61
+ }
62
+ ]
63
+ },
64
+ {
65
+ // loader for .css files
66
+ test: /.css$/,
67
+ use: [
68
+ {
69
+ loader: "style-loader",
70
+ options: {
71
+ hmr: true
72
+ }
73
+ },
74
+ {
75
+ loader: "css-loader",
76
+ options: {
77
+ minimize: false // set to false to speed up hot reloads
78
+ }
79
+ }
80
+ ]
81
+ },
82
+ {
83
+ test: /.(png|svg|jpg|gif)$/,
84
+ use: [
85
+ 'file-loader'
86
+ ]
87
+ },
88
+ {
89
+ test: /.(woff|woff2|eot|ttf|otf)$/,
90
+ use: [
91
+ 'file-loader'
92
+ ]
93
+ },
94
+ {
95
+ // opal-webpack-loader will compile and include ruby files in the pack
96
+ test: /.(rb|js.rb)$/,
97
+ use: [
98
+ {
99
+ loader: 'opal-webpack-loader',
100
+ }
101
+ ]
102
+ }
103
+ ]
104
+ },
105
+ // configuration for webpack-dev-server
106
+ devServer: {
107
+ open: false,
108
+ lazy: false,
109
+ port: 3035,
110
+ hot: true,
111
+ // hotOnly: true,
112
+ inline: true,
113
+ https: false,
114
+ disableHostCheck: true,
115
+ headers: {
116
+ "Access-Control-Allow-Origin": "*",
117
+ "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS",
118
+ "Access-Control-Allow-Headers": "X-Requested-With, content-type, Authorization"
119
+ },
120
+ watchOptions: {
121
+ // in case of problems with hot reloading uncomment the following two lines:
122
+ // aggregateTimeout: 250,
123
+ // poll: 50,
124
+ ignored: /\bnode_modules\b/
125
+ },
126
+ contentBase: path.resolve(__dirname, 'public')
127
+ // watchContentBase: true
128
+ }
129
+ };
130
+
@@ -0,0 +1,11 @@
1
+ env = defined? Rails ? Rails.env : 'development'
2
+
3
+ if env != 'development'
4
+ OpalWebpackLoader.client_asset_path = '' # the full path is in the manifest already, like: /packs/website_packs-97fd9c2b7e7bdb112fc1.js
5
+ OpalWebpackLoader.manifest_path = 'public/assets/manifest.json'
6
+ OpalWebpackLoader.use_manifest = true
7
+ else
8
+ OpalWebpackLoader.client_asset_path = 'http://localhost:3035/assets/'
9
+ OpalWebpackLoader.manifest_path = nil
10
+ OpalWebpackLoader.use_manifest = false
11
+ end
@@ -0,0 +1,9 @@
1
+ require 'opal'
2
+
3
+ # the gem opal-autoloader may be used, so its not necessary to use 'require' all the time,
4
+ # just using 'require_tree' to bundle everything is enough:
5
+ #
6
+ # require 'opal-autoloader'
7
+ # require_tree 'my_app' # for a sub directory 'my_app'
8
+
9
+
@@ -0,0 +1,17 @@
1
+ {
2
+ "dependencies": {
3
+ },
4
+ "scripts": {
5
+ "debug": "<%= debug_script %>",
6
+ "development": "<%= development_script %>",
7
+ "production_build": "<%= production_script %>"
8
+ },
9
+ "devDependencies": {
10
+ "compression-webpack-plugin": "^2.0.0",
11
+ "opal-webpack-loader": "^<%= owl_version %>",
12
+ "webpack": "^4.30.0",
13
+ "webpack-cli": "^3.3.0",
14
+ "webpack-dev-server": "^3.3.1",
15
+ "webpack-manifest-plugin": "^2.0.4"
16
+ }
17
+ }
@@ -0,0 +1,107 @@
1
+ const path = require('path');
2
+ const OwlResolver = require('opal-webpack-loader/resolver');
3
+ const CompressionPlugin = require("compression-webpack-plugin"); // for gzipping the packs
4
+ const ManifestPlugin = require('webpack-manifest-plugin'); // for generating the manifest
5
+
6
+ module.exports = {
7
+ context: path.resolve(__dirname, '<%= opal_directory %>'),
8
+ mode: "production",
9
+ optimization: {
10
+ minimize: true // minimize
11
+ },
12
+ performance: {
13
+ maxAssetSize: 20000000,
14
+ maxEntrypointSize: 20000000
15
+ },
16
+ entry: {
17
+ application: [path.resolve(__dirname, '<%= js_entry %>')],
18
+ application_ssr: [path.resolve(__dirname, '<%= js_ssr_entry %>')]
19
+ },
20
+ output: {
21
+ filename: '[name]-[chunkhash].js', // include fingerprint in file name, so browsers get the latest
22
+ path: path.resolve(__dirname, '<%= asset_output_directory %>'),
23
+ publicPath: '/assets/'
24
+ },
25
+ resolve: {
26
+ plugins: [
27
+ new OwlResolver('resolve', 'resolved') // resolve ruby files
28
+ ]
29
+ },
30
+ plugins: [
31
+ new CompressionPlugin({ test: /^((?!application_ssr).)*$/ }), // gzip compress, exclude application_ssr.js
32
+ new ManifestPlugin({ fileName: 'manifest.json' }) // generate manifest
33
+ ],
34
+ module: {
35
+ rules: [
36
+ {
37
+ test: /.scss$/,
38
+ use: [
39
+ {
40
+ loader: "style-loader",
41
+ options: {
42
+ hmr: false
43
+ }
44
+ },
45
+ {
46
+ loader: "css-loader",
47
+ options: {
48
+ sourceMap: false, // set to false to speed up hot reloads
49
+ minimize: true // set to false to speed up hot reloads
50
+ }
51
+ },
52
+ {
53
+ loader: "sass-loader",
54
+ options: {
55
+ includePath: [path.resolve(__dirname, '<%= stylesheets_directory %>')],
56
+ sourceMap: false // set to false to speed up hot reloads
57
+ }
58
+ }
59
+ ]
60
+ },
61
+ {
62
+ // loader for .css files
63
+ test: /.css$/,
64
+ use: [
65
+ {
66
+ loader: "style-loader",
67
+ options: {
68
+ hmr: false
69
+ }
70
+ },
71
+ {
72
+ loader: "css-loader",
73
+ options: {
74
+ sourceMap: false, // set to false to speed up hot reloads
75
+ minimize: true // set to false to speed up hot reloads
76
+ }
77
+ }
78
+ ]
79
+ },
80
+ {
81
+ test: /.(png|svg|jpg|gif)$/,
82
+ use: [
83
+ 'file-loader'
84
+ ]
85
+ },
86
+ {
87
+ test: /.(woff|woff2|eot|ttf|otf)$/,
88
+ use: [
89
+ 'file-loader'
90
+ ]
91
+ },
92
+ {
93
+ // opal-webpack-loader will compile and include ruby files in the pack
94
+ test: /.(rb|js.rb)$/,
95
+ use: [
96
+ {
97
+ loader: 'opal-webpack-loader',
98
+ options: {
99
+ sourceMap: false
100
+ }
101
+ }
102
+ ]
103
+ }
104
+ ]
105
+ }
106
+ };
107
+
@@ -1,3 +1,3 @@
1
1
  module OpalWebpackLoader
2
- VERSION="0.5.0"
2
+ VERSION="0.5.1"
3
3
  end
@@ -8,5 +8,9 @@ module OpalWebpackLoader
8
8
  "<script type=\"application/javascript\" src=\"#{OpalWebpackLoader.client_asset_path}#{path}\"></script>"
9
9
  end
10
10
  end
11
+
12
+ def application_script_tag
13
+ "<script type=\"application/javascript\" src=\"#{OpalWebpackLoader.application_js_path}\"></script>"
14
+ end
11
15
  end
12
16
  end
@@ -3,28 +3,28 @@ require 'opal-webpack-loader/version'
3
3
  require 'opal-webpack-loader/manifest'
4
4
 
5
5
  module OpalWebpackLoader
6
- def self.manifest_path
7
- @manifest_path
8
- end
9
-
10
- def self.manifest_path=(path)
11
- @manifest_path = path
12
- end
13
-
14
- def self.client_asset_path
15
- @client_asset_path
16
- end
17
-
18
- def self.client_asset_path=(path)
19
- @client_asset_path = path
20
- end
21
-
22
- def self.use_manifest
23
- @use_manifest
24
- end
25
-
26
- def self.use_manifest=(bool)
27
- @use_manifest = bool
6
+ class << self
7
+ attr_accessor :client_asset_path
8
+ attr_accessor :manifest_path
9
+ attr_accessor :use_manifest
10
+
11
+ def application_js_path
12
+ if OpalWebpackLoader.use_manifest
13
+ asset_path = OpalWebpackLoader::Manifest.lookup_path_for("application.js")
14
+ "OpalWebpackLoader.client_asset_path}#{asset_path}"
15
+ else
16
+ "#{OpalWebpackLoader.client_asset_path}application.js"
17
+ end
18
+ end
19
+
20
+ def application_ssr_js_path
21
+ if OpalWebpackLoader.use_manifest
22
+ asset_path = OpalWebpackLoader::Manifest.lookup_path_for("application_ssr.js")
23
+ "OpalWebpackLoader.client_asset_path}#{asset_path}"
24
+ else
25
+ "#{OpalWebpackLoader.client_asset_path}application_ssr.js"
26
+ end
27
+ end
28
28
  end
29
29
  end
30
30
 
@@ -38,18 +38,20 @@ OpalWebpackLoader.manifest_path = File.join(Dir.getwd, 'public', 'assets', 'mani
38
38
  OpalWebpackLoader.client_asset_path = 'http://localhost:3035/assets/'
39
39
  OpalWebpackLoader.use_manifest = false
40
40
 
41
+ # TODO require yarn instead of npm
42
+ # TODO don't depend on which for non unixes
41
43
  npm = `which npm`.chop
42
44
 
43
45
  if npm != ''
44
46
  bin_dir = `npm bin`.chop
45
47
  begin
46
- owl_npm_version = `#{bin_dir}/opal-webpack-loader-npm-version`.chop
48
+ owl_npm_version = `#{File.join(bin_dir, 'opal-webpack-loader-npm-version')}`.chop
47
49
  rescue
48
50
  owl_npm_version = nil
49
51
  end
50
52
 
51
53
  if owl_npm_version != OpalWebpackLoader::VERSION
52
- raise "opal-webpack-loader: Incorrect version of npm package found or npm package not installed.\n" +
54
+ STDERR.puts "opal-webpack-loader: Incorrect version of npm package found or npm package not installed.\n" +
53
55
  "Please install the npm package for opal-webpack-loader:\n" +
54
56
  "\twith npm:\tnpm install opal-webpack-loader@#{OpalWebpackLoader::VERSION} --save-dev\n" +
55
57
  "\tor with yarn:\tyarn add opal-webpack-loader@#{OpalWebpackLoader::VERSION} --dev\n"
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
+
4
+ gem 'puma', '~> 3.12.0', require: false
5
+
6
+ gem 'roda', '~> 3.15.0'
7
+
8
+
9
+
10
+
@@ -0,0 +1,8 @@
1
+ require 'bundler/setup'
2
+ if ENV['FLATTERING_ENV'] && ENV['FLATTERING_ENV'] == 'test'
3
+ Bundler.require(:default, :test)
4
+ elsif ENV['FLATTERING_ENV'] && ENV['FLATTERING_ENV'] == 'production'
5
+ Bundler.require(:default, :production)
6
+ else
7
+ Bundler.require(:default, :development)
8
+ end
@@ -0,0 +1,22 @@
1
+ require './app_loader.rb'
2
+
3
+ class App < Roda
4
+
5
+
6
+ route do |r|
7
+ r.root do
8
+ <<~HTML
9
+ <html>
10
+ <head>
11
+ <title>Welcome</title>
12
+ </head>
13
+ <body>
14
+ <div>Hello world!</div>
15
+ </body>
16
+ </html>
17
+ HTML
18
+ end
19
+ end
20
+ end
21
+
22
+ run App.app
@@ -0,0 +1,96 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'owl installer' do
4
+ context 'structure: :app' do
5
+ before do
6
+ Dir.chdir('spec')
7
+ Dir.chdir('test_apps')
8
+ FileUtils.rm_rf('railing') if Dir.exist?('railing')
9
+ end
10
+
11
+ after do
12
+ Dir.chdir('..') if Dir.pwd.end_with?('railing')
13
+ FileUtils.rm_rf('railing') if Dir.exist?('railing')
14
+ Dir.chdir('..')
15
+ Dir.chdir('..')
16
+ end
17
+
18
+ it 'can install in a rails app without sprockets and webpacker gem' do
19
+ `bundle exec rails new railing --skip-git --skip-bundle --skip-sprockets --skip-spring --skip-bootsnap`
20
+ expect(Dir.exist?('railing')).to be true
21
+ Dir.chdir('railing')
22
+ arg_val = %w[rails]
23
+ expect(Dir.exist?(File.join('railing', 'config', 'webpack'))).to be false
24
+ OpalWebpackLoader::Installer::CLI.start(arg_val)
25
+
26
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application.js'))).to be true
27
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application.js_owl_new'))).to be true
28
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application_common.js'))).to be true
29
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application_debug.js'))).to be true
30
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application_ssr.js'))).to be true
31
+ expect(File.exist?(File.join('app', 'opal', 'opal_loader.rb'))).to be true
32
+ expect(File.exist?(File.join('config', 'initializers', 'opal_webpack_loader.rb'))).to be true
33
+ expect(File.exist?(File.join('config', 'webpack', 'debug.js'))).to be true
34
+ expect(File.exist?(File.join('config', 'webpack', 'development.js'))).to be true
35
+ expect(File.exist?(File.join('config', 'webpack', 'production.js'))).to be true
36
+ expect(File.exist?('package.json')).to be true
37
+ expect(File.exist?('Procfile')).to be true
38
+ end
39
+
40
+ it 'can install in a rails app without sprockets and webpacker gem specifying another opal files dir' do
41
+ `bundle exec rails new railing --skip-git --skip-bundle --skip-sprockets --skip-spring --skip-bootsnap`
42
+ expect(Dir.exist?('railing')).to be true
43
+ Dir.chdir('railing')
44
+ arg_val = %w[rails -o hyperhyper]
45
+ expect(Dir.exist?(File.join('railing', 'config', 'webpack'))).to be false
46
+ OpalWebpackLoader::Installer::CLI.start(arg_val)
47
+
48
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application.js'))).to be true
49
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application.js_owl_new'))).to be true
50
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application_common.js'))).to be true
51
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application_debug.js'))).to be true
52
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application_ssr.js'))).to be true
53
+ expect(File.exist?(File.join('app', 'hyperhyper', 'hyperhyper_loader.rb'))).to be true
54
+ expect(File.exist?(File.join('config', 'initializers', 'opal_webpack_loader.rb'))).to be true
55
+ expect(File.exist?(File.join('config', 'webpack', 'debug.js'))).to be true
56
+ expect(File.exist?(File.join('config', 'webpack', 'development.js'))).to be true
57
+ expect(File.exist?(File.join('config', 'webpack', 'production.js'))).to be true
58
+ expect(File.exist?('package.json')).to be true
59
+ expect(File.exist?('Procfile')).to be true
60
+ end
61
+ end
62
+
63
+ context 'structure: :flat' do
64
+ before do
65
+ Dir.chdir('spec')
66
+ Dir.chdir('test_apps')
67
+ FileUtils.rm_rf('flattering') if Dir.exist?('flattering')
68
+ end
69
+
70
+ after do
71
+ Dir.chdir('..') if Dir.pwd.end_with?('flattering')
72
+ FileUtils.rm_rf('flattering') if Dir.exist?('flattering')
73
+ Dir.chdir('..')
74
+ Dir.chdir('..')
75
+ end
76
+
77
+ it 'can install in a roda app' do
78
+ FileUtils.cp_r(File.join('..', 'fixtures', 'flattering'), File.join('.'))
79
+ expect(Dir.exist?('flattering')).to be true
80
+ Dir.chdir('flattering')
81
+ arg_val = %w[flat]
82
+ OpalWebpackLoader::Installer::CLI.start(arg_val)
83
+ expect(File.exist?(File.join('javascripts', 'application.js'))).to be true
84
+ expect(File.exist?(File.join('javascripts', 'application_common.js'))).to be true
85
+ expect(File.exist?(File.join('javascripts', 'application_debug.js'))).to be true
86
+ expect(File.exist?(File.join('javascripts', 'application_ssr.js'))).to be true
87
+ expect(File.exist?(File.join('opal', 'opal_loader.rb'))).to be true
88
+ expect(File.exist?(File.join('owl_init.rb'))).to be true
89
+ expect(File.exist?(File.join('webpack', 'debug.js'))).to be true
90
+ expect(File.exist?(File.join('webpack', 'development.js'))).to be true
91
+ expect(File.exist?(File.join('webpack', 'production.js'))).to be true
92
+ expect(File.exist?('package.json')).to be true
93
+ expect(File.exist?('Procfile')).to be true
94
+ end
95
+ end
96
+ end
data/spec/owl_spec.rb ADDED
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'owl' do
4
+ context 'in a rails app' do
5
+ before do
6
+ Dir.chdir('spec')
7
+ Dir.chdir('test_apps')
8
+ FileUtils.rm_rf('railing') if Dir.exist?('railing')
9
+ end
10
+
11
+ after do
12
+ Dir.chdir('..') if Dir.pwd.end_with?('railing')
13
+ FileUtils.rm_rf('railing') if Dir.exist?('railing')
14
+ Dir.chdir('..')
15
+ Dir.chdir('..')
16
+ end
17
+
18
+ it 'can run the production build script' do
19
+ `bundle exec rails new railing --skip-git --skip-bundle --skip-sprockets --skip-spring --skip-bootsnap`
20
+ expect(Dir.exist?('railing')).to be true
21
+ Dir.chdir('railing')
22
+ arg_val = %w[rails]
23
+ expect(Dir.exist?(File.join('railing', 'config', 'webpack'))).to be false
24
+ OpalWebpackLoader::Installer::CLI.start(arg_val)
25
+ FileUtils.mv(File.join('app', 'assets', 'javascripts', 'application.js_owl_new'), File.join('app', 'assets', 'javascripts', 'application.js´'))
26
+ gemfile = File.read('Gemfile')
27
+ gemfile << <<~GEMS
28
+
29
+ gem 'opal', github: 'janbiedermann/opal', branch: 'es6_import_export'
30
+ gem 'opal-webpack-loader', path: '#{File.realpath(File.join('..','..', '..', '..', 'opal-webpack-loader'))}'
31
+
32
+ GEMS
33
+ File.write('Gemfile', gemfile)
34
+ `yarn install`
35
+ # bundler set some environment things, but we need a clean environment, so things don't get mixed up, use env
36
+ `env -i PATH="#{ENV['PATH']}" bundle install`
37
+ expect(File.exist?('Gemfile.lock')).to be true
38
+ `env -i PATH="#{ENV['PATH']}" yarn run production_build`
39
+ expect(File.exist?(File.join('public', 'assets', 'manifest.json'))).to be true
40
+ manifest = Oj.load(File.read(File.join('public', 'assets', 'manifest.json')), mode: :strict)
41
+ application_js = manifest['application.js']
42
+ expect(File.exist?(File.join('public', application_js))).to be true
43
+ end
44
+ end
45
+
46
+ context 'in a roda app' do
47
+ before do
48
+ Dir.chdir('spec')
49
+ Dir.chdir('test_apps')
50
+ FileUtils.rm_rf('flattering') if Dir.exist?('flattering')
51
+ end
52
+
53
+ after do
54
+ Dir.chdir('..') if Dir.pwd.end_with?('flattering')
55
+ FileUtils.rm_rf('flattering') if Dir.exist?('flattering')
56
+ Dir.chdir('..')
57
+ Dir.chdir('..')
58
+ end
59
+
60
+ it 'can install in a roda app' do
61
+ FileUtils.cp_r(File.join('..', 'fixtures', 'flattering'), File.join('.'))
62
+ expect(Dir.exist?('flattering')).to be true
63
+ Dir.chdir('flattering')
64
+ arg_val = %w[flat]
65
+ OpalWebpackLoader::Installer::CLI.start(arg_val)
66
+
67
+ gemfile = File.read('Gemfile')
68
+ gemfile << <<~GEMS
69
+
70
+ gem 'opal', github: 'janbiedermann/opal', branch: 'es6_import_export'
71
+ gem 'opal-webpack-loader', path: '#{File.realpath(File.join('..','..', '..', '..', 'opal-webpack-loader'))}'
72
+
73
+ GEMS
74
+ File.write('Gemfile', gemfile)
75
+ `yarn install`
76
+ # bundler set some environment things, but we need a clean environment, so things don't get mixed up, use env
77
+ `env -i PATH="#{ENV['PATH']}" bundle install`
78
+ expect(File.exist?('Gemfile.lock')).to be true
79
+ `env -i PATH="#{ENV['PATH']}" yarn run production_build`
80
+ expect(File.exist?(File.join('public', 'assets', 'manifest.json'))).to be true
81
+ manifest = Oj.load(File.read(File.join('public', 'assets', 'manifest.json')), mode: :strict)
82
+ application_js = manifest['application.js']
83
+ expect(File.exist?(File.join('public', application_js))).to be true
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,16 @@
1
+ require 'fileutils'
2
+ require 'oj'
3
+ require 'thor'
4
+ require_relative '../lib/opal-webpack-loader/installer_cli'
5
+
6
+ RSpec.configure do |config|
7
+ config.expect_with :rspec do |expectations|
8
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
9
+ end
10
+
11
+ config.mock_with :rspec do |mocks|
12
+ mocks.verify_partial_doubles = true
13
+ end
14
+
15
+ config.shared_context_metadata_behavior = :apply_to_host_groups
16
+ end