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 +7 -0
- data/.circleci/config.yml +14 -0
- data/.gitignore +13 -0
- data/.rspec +3 -0
- data/.rubocop.yml +7 -0
- data/.ruby-version +1 -0
- data/Gemfile +6 -0
- data/LICENSE.md +21 -0
- data/README.md +186 -0
- data/Rakefile +8 -0
- data/lib/rspec/arguments.rb +18 -0
- data/lib/rspec/arguments/arguments.rb +119 -0
- data/lib/rspec/arguments/example_group.rb +78 -0
- data/lib/rspec/arguments/monkey_patcher.rb +21 -0
- data/lib/rspec/arguments/version.rb +7 -0
- data/rspec-arguments.gemspec +39 -0
- metadata +173 -0
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
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.4.3
|
data/Gemfile
ADDED
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 [](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,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,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: []
|