rspec-arguments 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []