rspec-arguments 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: aa45770cbce05f67cb6327da20658a93390aa8fb
4
+ data.tar.gz: c4cafadad2c0267ef4461eca12c9871c4192dea2
5
+ SHA512:
6
+ metadata.gz: 150fe729c934b7ad59c3262ed15eb9664f4368476d8ba3a95badb2e691f66ef1c8770b3aef9ce80d8f8b44ea95d82a00fa2afa54e24c3f0cd6f76d5665c432b0
7
+ data.tar.gz: 9a2214ef9770faa796659fd193137692953be0e7379d85e5045bd2b05a9ef261fef97e63dbe19d073d5411e6ebe571c5cb2be4262296aee30151c94241d9f944
@@ -0,0 +1,14 @@
1
+ # Ruby CircleCI 2.0 configuration file
2
+ # Check https://circleci.com/docs/2.0/language-ruby/ for more details
3
+ version: 2
4
+ jobs:
5
+ build:
6
+ docker:
7
+ - image: circleci/ruby:2.4.3
8
+ working_directory: ~/repo
9
+ steps:
10
+ - checkout
11
+ - run: bundle install --jobs=4 --retry=3 --path vendor/bundle
12
+ - run: bundle exec bundle-audit update && bundle exec bundle-audit check
13
+ - run: bundle exec rubocop
14
+ - run: bundle exec rspec
data/.gitignore ADDED
@@ -0,0 +1,13 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+
11
+ # rspec failure tracking
12
+ .rspec_status
13
+ *.gem
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,7 @@
1
+ inherit_gem:
2
+ ws-style:
3
+ - default.yml
4
+
5
+ AllCops:
6
+ # Specify your target Ruby version here (only major/minor versions):
7
+ TargetRubyVersion: 2.4
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.4.3
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in rspec-arguments.gemspec
6
+ gemspec
data/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2018 Wealthsimple
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,186 @@
1
+ # RSpec Arguments [![CircleCI](https://circleci.com/gh/wealthsimple/rspec-arguments.svg?style=svg)](https://circleci.com/gh/wealthsimple/rspec-arguments)
2
+
3
+ Provide arguments to the implicit RSpec `subject`.
4
+ Also, call instance and class methods implicitly.
5
+
6
+ ## Example (TL;DR)
7
+
8
+ ```ruby
9
+ class Thing
10
+ def initializer(username)
11
+ end
12
+
13
+ def perform(save:)
14
+ save
15
+ end
16
+ end
17
+
18
+ RSpec.describe Thing do
19
+ arg(:username, 0) { 'user123' }
20
+
21
+ it { is_expected.to be_a(Thing) }
22
+
23
+ describe '#save', :method do
24
+ method_arg(:save) { true }
25
+
26
+ it { is_expected.to eq(save) }
27
+ end
28
+ end
29
+ ```
30
+
31
+ ## Documentation
32
+
33
+ Out-of-the box, RSpec provides us with an implicit `subject` method that instantiates the described class under test, giving us an instance which we can assert on:
34
+
35
+ ```ruby
36
+ class User
37
+ end
38
+
39
+ RSpec.describe User do
40
+ it { is_expected.to be_a(User) }
41
+ do
42
+ ```
43
+
44
+ This is very terse and works great for classes with no initialization parameters.
45
+
46
+ But we can't use the implicit `subject` when initialization parameters need to be provided.
47
+
48
+ ```ruby
49
+ class User
50
+ def initialize(name, tag:)
51
+ # ...
52
+ end
53
+ end
54
+
55
+ RSpec.describe User do
56
+ let(:name) { 'Eva' }
57
+ let(:tag) { :mobile }
58
+
59
+ subject { described_class.new(name, tag: tag) }
60
+
61
+ it { is_expected.to be_a(User) }
62
+ do
63
+ ```
64
+
65
+ Now you have to explicitly declare your `subject`, proving the required parameters to the initializer.
66
+
67
+ Having parameters in initializers is not uncommon.
68
+ This gem provides new methods that allow you to implicitly provide initializer arguments to the implicit `subject`:
69
+
70
+ ```ruby
71
+ RSpec.describe User do
72
+ arg(:name, 0) { 'Eva' }
73
+ arg(:tag) { :mobile }
74
+
75
+ # Translates to:
76
+ # subject { described_class.new(name, tag: tag) }
77
+
78
+ it { is_expected.to be_a(User) }
79
+ end
80
+ ```
81
+
82
+ In this example, `:name` is an initializer positional argument, at position `0`, and `:tag` is the keyword argument with the same symbol.
83
+
84
+ The interesting part happens when we want to call a method from the class instance under test, a very common use case.
85
+
86
+ To illustrate this, let's add a new method `save` to the class `User`:
87
+
88
+ ```ruby
89
+ class User
90
+ def initialize(name, tag:)
91
+ # ...
92
+ end
93
+
94
+ def save(validate, touch)
95
+ # ...
96
+ return validate
97
+ end
98
+ end
99
+ ```
100
+
101
+ Traditionally, we could test it as such:
102
+
103
+ ```ruby
104
+ RSpec.describe User do
105
+ arg(:name, 0) { 'Eva' }
106
+ arg(:tag) { :mobile }
107
+
108
+ it { is_expected.to be_a(User) }
109
+
110
+ describe '#save' do
111
+ let(:validate) { false }
112
+ let(:touch) { true }
113
+
114
+ subject { described_class.new(name, tag: tag).save(validate, touch) }
115
+
116
+ it { is_expected.to eq(validate) }
117
+ end
118
+ end
119
+ ```
120
+
121
+ Notice we can't reuse our implicit `subject`, and have to resort to re-initializing our `described_class`, and proving the required arguments to the desired method.
122
+
123
+ Similarly to initializer methods, this gem introduces methods to facilitate implicit method calls.
124
+
125
+ ```ruby
126
+ RSpec.describe User do
127
+ arg(:name, 0) { 'Eva' }
128
+ arg(:tag) { :mobile }
129
+
130
+ it { is_expected.to be_a(User) }
131
+
132
+ describe '#save', :method do
133
+ method_arg(:validate, 0) { false }
134
+ method_arg(:touch, 1) { true }
135
+
136
+ # Translates to:
137
+ # subject { described_class.new(name, tag: tag).save(validate, touch) }
138
+
139
+ it { is_expected.to eq(validate) }
140
+ end
141
+ end
142
+ ```
143
+
144
+ Notice that we don't have to repeat ourselves on what method needs to be tested, `save` in this case, as we can infer it from the `describe '#method_name', :method do` context.
145
+
146
+ Lastly, here's a full example, including methods requiring `&block` arguments, and class method calls:
147
+
148
+ ```ruby
149
+ class User
150
+ def initialize(name, tag:)
151
+ # ...
152
+ end
153
+
154
+ def save(validate, touch)
155
+ # ...
156
+ return validate
157
+ end
158
+
159
+ def self.find_all(&block)
160
+ # ...
161
+ block.call
162
+ end
163
+ end
164
+ ```
165
+
166
+ ```ruby
167
+ RSpec.describe User do
168
+ arg(:name, 0) { 'Eva' }
169
+ arg(:tag) { :mobile }
170
+
171
+ it { is_expected.to be_a(User) }
172
+
173
+ describe '#save', :method do
174
+ method_arg(:validate, 0) { false }
175
+ method_arg(:touch, 1) { true }
176
+
177
+ it { is_expected.to eq(validate) }
178
+ end
179
+
180
+ context '.find_all', :class_method do
181
+ method_arg_block(:block) { proc { 1 } }
182
+
183
+ it { is_expected.to eq(1) }
184
+ end
185
+ end
186
+ ```
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task default: :spec
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rspec/support'
4
+
5
+ RSpec::Support.define_optimized_require_for_rspec(:arguments) { |f| require_relative(f) }
6
+
7
+ %w[
8
+ arguments
9
+ example_group
10
+ monkey_patcher
11
+ version
12
+ ].each { |file| RSpec::Support.require_rspec_arguments(file) }
13
+
14
+ RSpec.configure do |c|
15
+ c.extend RSpec::Arguments::ExampleGroup
16
+ c.include RSpec::Arguments::MonkeyPatcher
17
+ c.backtrace_exclusion_patterns << %r(/lib/rspec/arguments)
18
+ end
@@ -0,0 +1,119 @@
1
+ module RSpec
2
+ module Arguments
3
+ ARG_PREFIX = '__arg_'.freeze
4
+ METHOD_ARG_PREFIX = '__m_arg_'.freeze
5
+
6
+ POSITIONAL_ARG_SUFFIX = 'pos_'.freeze
7
+ KEYWORD_ARG_SUFFIX = 'kw_'.freeze
8
+ BLOCK_ARG_SUFFIX = 'blk_'.freeze
9
+
10
+ POSITIONAL_ARG = ARG_PREFIX + POSITIONAL_ARG_SUFFIX
11
+ KEYWORD_ARG = ARG_PREFIX + KEYWORD_ARG_SUFFIX
12
+ BLOCK_ARG = ARG_PREFIX + BLOCK_ARG_SUFFIX
13
+
14
+ METHOD_POSITIONAL_ARG = METHOD_ARG_PREFIX + POSITIONAL_ARG_SUFFIX
15
+ METHOD_KEYWORD_ARG = METHOD_ARG_PREFIX + KEYWORD_ARG_SUFFIX
16
+ METHOD_BLOCK_ARG = METHOD_ARG_PREFIX + BLOCK_ARG_SUFFIX
17
+
18
+ def process_subject(clazz)
19
+ class_method = method_under_test(:class_method)
20
+
21
+ return call_method_with_args(clazz, class_method.to_sym) if class_method
22
+
23
+ process_instance_subject(clazz)
24
+ end
25
+
26
+ def process_instance_subject(clazz)
27
+ instance = call_initializer_with_args(clazz)
28
+
29
+ method = method_under_test(:method)
30
+
31
+ return instance unless method
32
+
33
+ call_method_with_args(instance, method.to_sym)
34
+ end
35
+
36
+ def call_with_args(list, positional_arg, keyword_arg, block_arg, &proc)
37
+ positional_args = []
38
+ keyword_args = {}
39
+ block_args = nil
40
+
41
+ list.sort.each do |name|
42
+ if name.to_s.start_with?(positional_arg)
43
+ positional_args << send(name)
44
+ elsif name.to_s.start_with?(keyword_arg)
45
+ key = name[keyword_arg.size..-1].to_sym
46
+ keyword_args[key] = send(name)
47
+ elsif name.to_s.start_with?(block_arg)
48
+ block_args = send(name)
49
+ end
50
+ end
51
+
52
+ # DEBUG CODE
53
+ # puts "positional_args #{positional_args}"
54
+ # puts "keyword_args #{keyword_args}"
55
+ # puts "block_arg #{block_args}"
56
+
57
+ positional_args << keyword_args unless keyword_args.empty?
58
+
59
+ proc.call(*positional_args, &block_args)
60
+ end
61
+
62
+ # Search for method under testing
63
+ # inside ExampleGroupHash metadata
64
+ #
65
+ # TODO This can likely be improved by using
66
+ # TODO RSpec filtered extensions.
67
+ #
68
+ def method_under_test(key)
69
+ method_arg = self.class.metadata[key]
70
+
71
+ return unless method_arg
72
+
73
+ # Return here if you were nice and declared
74
+ # your method under test using
75
+ # `method: :method_name`.
76
+ return method_arg if method_arg.is_a?(Symbol)
77
+
78
+ # Otherwise, we have to search for the described
79
+ # name string somewhere in our ancestor chain.
80
+
81
+ # If we are inside a nested example group,
82
+ # recursively search ascendants' metadata
83
+ # for the correct method under testing.
84
+ method_name = search_method_name(self.class.metadata, key)
85
+ method_name.sub!('#', '')
86
+ method_name.sub!('.', '')
87
+ method_name.to_sym
88
+ end
89
+
90
+ def search_method_name(metadata, key)
91
+ description = metadata[:description]
92
+ return description unless metadata[:parent_example_group] && metadata[:parent_example_group][key]
93
+
94
+ search_method_name(metadata[:parent_example_group], key) if metadata[:parent_example_group]
95
+ end
96
+
97
+ def call_initializer_with_args(receiver)
98
+ call_with_args(
99
+ self.class.instance_methods,
100
+ POSITIONAL_ARG,
101
+ KEYWORD_ARG,
102
+ BLOCK_ARG,
103
+ ) do |*args, &block|
104
+ receiver.new(*args, &block)
105
+ end
106
+ end
107
+
108
+ def call_method_with_args(receiver, method_sym)
109
+ call_with_args(
110
+ self.class.instance_methods,
111
+ METHOD_POSITIONAL_ARG,
112
+ METHOD_KEYWORD_ARG,
113
+ METHOD_BLOCK_ARG,
114
+ ) do |*args, &block|
115
+ receiver.send(method_sym, *args, &block)
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,78 @@
1
+ module RSpec
2
+ module Arguments
3
+ module ExampleGroup
4
+ #
5
+ # @param name [Symbol] binds this parameter to the named method `name`,
6
+ # implemented by calling `let(name)`.
7
+ # @param position [Integer,Symbol] if an Integer is provided, binds this
8
+ # argument to a the positional argument at position `position`, 0 indexed.
9
+ # If Symbol is provided, binds thi argument to the keyword argument `position`.
10
+ # @param block [Proc] value to be used for this argument
11
+ #
12
+ # @example
13
+ #
14
+ # describe Thing do
15
+ # arg(:first, 0) { '0' }
16
+ # arg(:second, 1) { '1' }
17
+ # arg(:kw_arg) { 3 }
18
+ # arg_block(:blk) { proc { 'body' } }
19
+ #
20
+ # # `subject` is now: Thing.new('0', '1', kw_arg: 3, &blk)
21
+ #
22
+ # it { is_expect(subject).to be_a(Thing) }
23
+ # it { is_expect(subject.perform).to be_nil }
24
+ # end
25
+ #
26
+ # TODO support anonymous positional: arg(0) { '0' }
27
+ #
28
+ def arg(name, position = nil, &block)
29
+ _arg(POSITIONAL_ARG, KEYWORD_ARG, name, position, &block)
30
+ end
31
+
32
+ #
33
+ # Similar to `arg(name, position, &block)`,
34
+ # but binds this argument as the &block argument
35
+ # provided to the instance initializer.
36
+ #
37
+ def arg_block(name = '', &block)
38
+ _arg_block(BLOCK_ARG, name, &block)
39
+ end
40
+
41
+ #
42
+ # Similar to `arg(name, position, &block)`,
43
+ # but binds this argument to the described method,
44
+ # instead of described class.
45
+ #
46
+ def method_arg(name, position = nil, &block)
47
+ _arg(METHOD_POSITIONAL_ARG, METHOD_KEYWORD_ARG, name, position, &block)
48
+ end
49
+
50
+ #
51
+ # Similar to `arg_block(name, &block)`,
52
+ # but binds this argument to the described method,
53
+ # instead of described class.
54
+ #
55
+ def method_arg_block(name = '', &block)
56
+ _arg_block(METHOD_BLOCK_ARG, name, &block)
57
+ end
58
+
59
+ private
60
+
61
+ def _arg(positional_arg, keyword_arg, name, position = nil, &block)
62
+ let(name, &block)
63
+
64
+ if position.is_a?(Integer)
65
+ let(positional_arg.+(position.to_s).to_sym) { send(name) }
66
+ else
67
+ let(keyword_arg.+((position || name).to_s).to_sym) { send(name) }
68
+ end
69
+ end
70
+
71
+ def _arg_block(block_arg, name, &block)
72
+ let(name, &block)
73
+
74
+ let(block_arg.+(name.to_s).to_sym) { send(name) }
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,21 @@
1
+ module RSpec
2
+ module Arguments
3
+ module MonkeyPatcher
4
+ include RSpec::Arguments
5
+
6
+ #
7
+ # The only monkey-patching in this gem.
8
+ #
9
+ # Mostly untouched, except we call
10
+ # `process_subject`, instead of simply
11
+ # instantiating the described_class.
12
+ #
13
+ def subject
14
+ __memoized.fetch_or_store(:subject) do
15
+ described = described_class || self.class.metadata.fetch(:description_args).first
16
+ described.is_a?(Class) ? process_subject(described) : described
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpec
4
+ module Arguments
5
+ VERSION = '0.1.0'
6
+ end
7
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'rspec/arguments/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'rspec-arguments'
9
+ spec.version = RSpec::Arguments::VERSION
10
+ spec.authors = ['Marco Costa']
11
+ spec.email = ['marco@marcotc.com']
12
+ spec.license = "MIT"
13
+
14
+ spec.summary = ' Parameter passing to implicit RSpec subjects.'
15
+ spec.description = <<~DESC
16
+ Allows parameter passing to implicit RSpec subjects.
17
+ It also adds support for implicit method calls on described_class instances.
18
+ DESC
19
+ spec.homepage = 'https://github.com/wealthsimple/rspec-arguments'
20
+
21
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
22
+ f.match(%r{^(test|spec|features)/})
23
+ end
24
+ spec.bindir = 'exe'
25
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
+ spec.require_paths = ['lib']
27
+
28
+ spec.required_ruby_version = '>= 2.4'
29
+
30
+ spec.add_dependency 'rspec-support', '~> 3'
31
+
32
+ spec.add_development_dependency 'bundler', '~> 1.15'
33
+ spec.add_development_dependency 'bundler-audit'
34
+ spec.add_development_dependency 'rake', '~> 10.0'
35
+ spec.add_development_dependency 'rspec', '~> 3.0'
36
+ spec.add_development_dependency 'rspec-its', '~> 1'
37
+ spec.add_development_dependency 'rubocop', '0.49.1' # Temporarily necessary to avoid breaking ws-style
38
+ spec.add_development_dependency 'ws-style'
39
+ end
metadata ADDED
@@ -0,0 +1,173 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rspec-arguments
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Marco Costa
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-04-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec-support
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.15'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.15'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler-audit
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec-its
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 0.49.1
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 0.49.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: ws-style
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: |
126
+ Allows parameter passing to implicit RSpec subjects.
127
+ It also adds support for implicit method calls on described_class instances.
128
+ email:
129
+ - marco@marcotc.com
130
+ executables: []
131
+ extensions: []
132
+ extra_rdoc_files: []
133
+ files:
134
+ - ".circleci/config.yml"
135
+ - ".gitignore"
136
+ - ".rspec"
137
+ - ".rubocop.yml"
138
+ - ".ruby-version"
139
+ - Gemfile
140
+ - LICENSE.md
141
+ - README.md
142
+ - Rakefile
143
+ - lib/rspec/arguments.rb
144
+ - lib/rspec/arguments/arguments.rb
145
+ - lib/rspec/arguments/example_group.rb
146
+ - lib/rspec/arguments/monkey_patcher.rb
147
+ - lib/rspec/arguments/version.rb
148
+ - rspec-arguments.gemspec
149
+ homepage: https://github.com/wealthsimple/rspec-arguments
150
+ licenses:
151
+ - MIT
152
+ metadata: {}
153
+ post_install_message:
154
+ rdoc_options: []
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '2.4'
162
+ required_rubygems_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ requirements: []
168
+ rubyforge_project:
169
+ rubygems_version: 2.6.14
170
+ signing_key:
171
+ specification_version: 4
172
+ summary: Parameter passing to implicit RSpec subjects.
173
+ test_files: []