rspec-sleeping_king_studios 2.0.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/DEVELOPMENT.md +17 -10
- data/README.md +6 -0
- data/lib/rspec/sleeping_king_studios/matchers/built_in/respond_to.rb +62 -7
- data/lib/rspec/sleeping_king_studios/matchers/core/construct.rb +53 -3
- data/lib/rspec/sleeping_king_studios/matchers/shared/match_parameters.rb +19 -14
- data/lib/rspec/sleeping_king_studios/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 001e7809e65b97646a63c8a663bcba7472df5327
|
4
|
+
data.tar.gz: a0309fd6b2ace7e0cceb015929d0b3449cb327df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 23957e513898499443a028ed1aadbed73aa31b19a7deec654988c418710c25cc7362791ea627344a1b2ed87ff25bf4580b4b819d2a9f553f5529da4874245296
|
7
|
+
data.tar.gz: 4ff7d63a7da8145d064e6c7902be789332ffd6613aa52c51db8540b2639a4c16e671ce5c7322f04fa51cdea4670b46749a80f1a31bb42c04910da961b110f6a7
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 2.0.2
|
4
|
+
|
5
|
+
#### `construct` and `respond_to` Matchers
|
6
|
+
|
7
|
+
Added new fluent syntax for keyword expectations:
|
8
|
+
|
9
|
+
expect(my_object).to respond_to(:my_method).with(1..2).arguments.and_keywords(:foo, :bar)
|
10
|
+
|
11
|
+
Also added support for expecting splatted arguments (`*args`) or keywords (`**kwargs`) using the `#with_unlimited_arguments` and `#with_arbitrary_keywords` methods.
|
12
|
+
|
13
|
+
The old syntax (`respond_to(:my_method).with(1, :foo, :bar)`) will be supported through 3.0.
|
14
|
+
|
3
15
|
## 2.0.1
|
4
16
|
|
5
17
|
Created suite of [Cucumber features](features) to validate and document the gem.
|
data/DEVELOPMENT.md
CHANGED
@@ -4,25 +4,26 @@
|
|
4
4
|
|
5
5
|
### Release Candidate
|
6
6
|
|
7
|
-
### 2.0.
|
7
|
+
### 2.0.2
|
8
8
|
|
9
|
-
- Add
|
10
|
-
-
|
11
|
-
-
|
12
|
-
|
13
|
-
- Alias `construct` as `be_constructable`.
|
14
|
-
- Rewrite failure messages "to construct" => "to be constructable".
|
9
|
+
- Add additional syntax option for #respond_to keywords, e.g. 'expect().to respond_to(:method).with(1).arguments.and_keywords(:foo, :bar)' DONE
|
10
|
+
- `expect().to respond_to().with_keywords()'
|
11
|
+
- `expect().to respond_to().with_arbitrary_keywords'
|
12
|
+
- Add additional syntax (see above) to #be_constructible. DONE
|
15
13
|
|
16
14
|
### 2.1.0+
|
17
15
|
|
18
16
|
- Add #wrap_context, #wrap_examples (alias encapsulate_X ?) for pattern `describe ""; include_examples "": end`
|
19
17
|
- Configuration option 'alias_wrap_examples'?
|
20
|
-
-
|
21
|
-
- Add
|
18
|
+
- Automatically-focused #fwrap_context, #fwrap_examples?
|
19
|
+
- Add #have_constant matcher.
|
20
|
+
- Add shared examples for 'should not have reader/writer/property'
|
22
21
|
|
23
22
|
### 2.2.0+
|
24
23
|
|
25
|
-
- Add
|
24
|
+
- Add shared examples for #belongs_to, #has_one, #has_many, #embedded_in, #embeds_one, #embeds_many.
|
25
|
+
- Add shared examples for core ActiveModel validations.
|
26
|
+
- Add alt doc test formatter - --format=list ? --format=documentation-list ?
|
26
27
|
- Prints full expanded example name for each example
|
27
28
|
- Add minimal test formatter - --format=smoke ? --format=librarian ?
|
28
29
|
- Prints nothing for examples
|
@@ -31,3 +32,9 @@
|
|
31
32
|
### 3.0.0
|
32
33
|
|
33
34
|
- Ensure behavior of `#have_reader`, `#have_writer`, `#have_property` is consistent.
|
35
|
+
|
36
|
+
### Maintenance
|
37
|
+
|
38
|
+
- Remove SCENARIOS from spec files.
|
39
|
+
- Revisit failure messages for #respond_to, #be_constructible.
|
40
|
+
- Pare down Cucumber features for matchers - repurpose as documentation/examples only.
|
data/README.md
CHANGED
@@ -158,7 +158,10 @@ Now has additional chaining functionality to validate the number of arguments ac
|
|
158
158
|
**Chaining:**
|
159
159
|
|
160
160
|
* **`#with`:** Expects at most one Integer or Range argument, and zero or more Symbol arguments corresponding to optional keywords. Verifies that the method accepts that keyword, or has a variadic keyword of the form `**params`. As of 2.1.0 and required keywords, verifies that all required keywords are provided.
|
161
|
+
* **`#with_unlimited_arguments`:** (also `and_unlimited_arguments`) No parameters. Verifies that the method accepts any number of arguments via a variadic argument of the form `*args`.
|
161
162
|
* **`#with_a_block`:** (also `and_a_block`) No parameters. Verifies that the method requires a block argument of the form `&my_argument`. _Important note:_ A negative result _does not_ mean the method cannot accept a block, merely that it does not require one. Also, _does not_ check whether the block is called or yielded.
|
163
|
+
* **`#with_keywords`:** (also `and_keywords`) Expects one or more String or Symbol arguments. Verifies that the method accepts each provided keyword or has a variadic keyword of the form `**params`. As of 2.1.0 and required keywords, verifies that all required keywords are provided.
|
164
|
+
* **`#with_arbitrary_keywords`:** (also `and_arbitrary_keywords`) No parameters. Verifies that the method accepts any keyword arguments via a variadic keyword of the form `**params`.
|
162
165
|
|
163
166
|
### Core
|
164
167
|
|
@@ -197,6 +200,9 @@ Verifies that the actual object can be constructed using `::new`. Can take an op
|
|
197
200
|
**Chaining:**
|
198
201
|
|
199
202
|
* **`#with`:** Expects one Integer, Range, or nil argument, and zero or more Symbol arguments corresponding to optional keywords. Verifies that the class's constructor accepts that keyword, or has a variadic keyword of the form `**params`. As of Ruby 2.1 and required keywords, verifies that all required keywords are provided.
|
203
|
+
* **`#with_unlimited_arguments`:** (also `and_unlimited_arguments`) No parameters. Verifies that the class's constructor accepts any number of arguments via a variadic argument of the form `*args`.
|
204
|
+
* **`#with_keywords`:** (also `and_keywords`) Expects one or more String or Symbol arguments. Verifies that the class's constructor accepts each provided keyword or has a variadic keyword of the form `**params`. As of 2.1.0 and required keywords, verifies that all required keywords are provided.
|
205
|
+
* **`#with_arbitrary_keywords`:** (also `and_arbitrary_keywords`) No parameters. Verifies that the class's constructor accepts any keyword arguments via a variadic keyword of the form `**params`.
|
200
206
|
|
201
207
|
#### `#have_property` Matcher
|
202
208
|
|
@@ -53,12 +53,48 @@ module RSpec::SleepingKingStudios::Matchers::BuiltIn
|
|
53
53
|
#
|
54
54
|
# @return [RespondToMatcher] self
|
55
55
|
def with *keywords
|
56
|
-
@expected_arity
|
57
|
-
|
56
|
+
@expected_arity = keywords.shift if Integer === keywords.first || Range === keywords.first
|
57
|
+
|
58
|
+
# TODO: Deprecate this behavior (for version 3.0?) - use the
|
59
|
+
# #with_keywords or #and_keywords methods instead.
|
60
|
+
(@expected_keywords ||= []).concat(keywords)
|
58
61
|
|
59
62
|
self
|
60
63
|
end # method with
|
61
64
|
|
65
|
+
# Adds an unlimited parameter count expectation, e.g. that the method
|
66
|
+
# supports splatted array arguments of the form *args.
|
67
|
+
#
|
68
|
+
# @return [RespondToMatcher] self
|
69
|
+
def with_unlimited_arguments
|
70
|
+
@expect_unlimited_arguments = true
|
71
|
+
|
72
|
+
self
|
73
|
+
end # method with_unlimited_arguments
|
74
|
+
alias_method :and_unlimited_arguments, :with_unlimited_arguments
|
75
|
+
|
76
|
+
# Adds one or more keyword expectations.
|
77
|
+
#
|
78
|
+
# @param [Array<String, Symbol>] keywords List of keyword arguments
|
79
|
+
# accepted by the method.
|
80
|
+
#
|
81
|
+
# @return [RespondToMatcher] self
|
82
|
+
def with_keywords *keywords
|
83
|
+
(@expected_keywords ||= []).concat(keywords)
|
84
|
+
|
85
|
+
self
|
86
|
+
end # method with_keywords
|
87
|
+
alias_method :and_keywords, :with_keywords
|
88
|
+
|
89
|
+
# Adds an arbitrary keyword expectation, e.g. that the method supports
|
90
|
+
# any keywords with splatted hash arguments of the form **kwargs.
|
91
|
+
def with_arbitrary_keywords
|
92
|
+
@expect_arbitrary_keywords = true
|
93
|
+
|
94
|
+
self
|
95
|
+
end # method with_arbitrary_keywords
|
96
|
+
alias_method :and_arbitrary_keywords, :with_arbitrary_keywords
|
97
|
+
|
62
98
|
# Adds a block expectation. The actual object will only match a block
|
63
99
|
# expectation if it expects a parameter of the form &block.
|
64
100
|
#
|
@@ -115,9 +151,9 @@ module RSpec::SleepingKingStudios::Matchers::BuiltIn
|
|
115
151
|
end # method find_failing_method_names
|
116
152
|
|
117
153
|
def matches_arity? actual, name
|
118
|
-
return true unless @expected_arity
|
154
|
+
return true unless @expected_arity || @expect_unlimited_arguments
|
119
155
|
|
120
|
-
if result = check_method_arity(actual.method(name), @expected_arity)
|
156
|
+
if result = check_method_arity(actual.method(name), @expected_arity, expect_unlimited_arguments: @expect_unlimited_arguments)
|
121
157
|
(@failing_method_reasons[name] ||= {}).update result
|
122
158
|
return false
|
123
159
|
end # if
|
@@ -127,9 +163,10 @@ module RSpec::SleepingKingStudios::Matchers::BuiltIn
|
|
127
163
|
|
128
164
|
def matches_keywords? actual, name
|
129
165
|
return true unless @expected_keywords ||
|
166
|
+
@expect_arbitrary_keywords ||
|
130
167
|
(@expected_arity && RUBY_VERSION >= "2.1.0")
|
131
168
|
|
132
|
-
if result = check_method_keywords(actual.method(name), @expected_keywords)
|
169
|
+
if result = check_method_keywords(actual.method(name), @expected_keywords, expect_arbitrary_keywords: @expect_arbitrary_keywords)
|
133
170
|
(@failing_method_reasons[name] ||= {}).update result
|
134
171
|
return false
|
135
172
|
end # if
|
@@ -164,10 +201,18 @@ module RSpec::SleepingKingStudios::Matchers::BuiltIn
|
|
164
201
|
messages << "#{@expected_arity.inspect} #{pluralize @expected_arity, 'argument', 'arguments'}"
|
165
202
|
end # if
|
166
203
|
|
204
|
+
if @expect_unlimited_arguments
|
205
|
+
messages << 'unlimited arguments'
|
206
|
+
end # if
|
207
|
+
|
167
208
|
if !(@expected_keywords.nil? || @expected_keywords.empty?)
|
168
209
|
messages << "#{pluralize @expected_keywords.count, 'keyword', 'keywords'} #{humanize_list @expected_keywords.map(&:inspect)}"
|
169
210
|
end # if
|
170
211
|
|
212
|
+
if @expect_arbitrary_keywords
|
213
|
+
messages << 'arbitrary keywords'
|
214
|
+
end # if
|
215
|
+
|
171
216
|
if @expected_block
|
172
217
|
messages << "a block"
|
173
218
|
end # if
|
@@ -180,9 +225,19 @@ module RSpec::SleepingKingStudios::Matchers::BuiltIn
|
|
180
225
|
|
181
226
|
if hsh = reasons.fetch(:not_enough_args, false)
|
182
227
|
messages << " expected at least #{hsh[:count]} arguments, but received #{hsh[:arity]}"
|
183
|
-
|
228
|
+
end # if
|
229
|
+
|
230
|
+
if hsh = reasons.fetch(:too_many_args, false)
|
184
231
|
messages << " expected at most #{hsh[:count]} arguments, but received #{hsh[:arity]}"
|
185
|
-
end # if
|
232
|
+
end # if
|
233
|
+
|
234
|
+
if hsh = reasons.fetch(:expected_unlimited_arguments, false)
|
235
|
+
messages << " expected at most #{hsh[:count]} arguments, but received unlimited arguments"
|
236
|
+
end # if
|
237
|
+
|
238
|
+
if reasons.fetch(:expected_arbitrary_keywords, false)
|
239
|
+
messages << " expected arbitrary keywords"
|
240
|
+
end # if
|
186
241
|
|
187
242
|
if ary = reasons.fetch(:missing_keywords, false)
|
188
243
|
messages << " missing #{pluralize ary.count, 'keyword', 'keywords'} #{humanize_list ary.map(&:inspect)}"
|
@@ -73,6 +73,39 @@ module RSpec::SleepingKingStudios::Matchers::Core
|
|
73
73
|
self
|
74
74
|
end # method with
|
75
75
|
|
76
|
+
# Adds an unlimited parameter count expectation, e.g. that the method
|
77
|
+
# supports splatted array arguments of the form *args.
|
78
|
+
#
|
79
|
+
# @return [RespondToMatcher] self
|
80
|
+
def with_unlimited_arguments
|
81
|
+
@expect_unlimited_arguments = true
|
82
|
+
|
83
|
+
self
|
84
|
+
end # method with_unlimited_arguments
|
85
|
+
alias_method :and_unlimited_arguments, :with_unlimited_arguments
|
86
|
+
|
87
|
+
# Adds one or more keyword expectations.
|
88
|
+
#
|
89
|
+
# @param [Array<String, Symbol>] keywords List of keyword arguments
|
90
|
+
# accepted by the method.
|
91
|
+
#
|
92
|
+
# @return [RespondToMatcher] self
|
93
|
+
def with_keywords *keywords
|
94
|
+
(@expected_keywords ||= []).concat(keywords)
|
95
|
+
|
96
|
+
self
|
97
|
+
end # method with_keywords
|
98
|
+
alias_method :and_keywords, :with_keywords
|
99
|
+
|
100
|
+
# Adds an arbitrary keyword expectation, e.g. that the method supports
|
101
|
+
# any keywords with splatted hash arguments of the form **kwargs.
|
102
|
+
def with_arbitrary_keywords
|
103
|
+
@expect_arbitrary_keywords = true
|
104
|
+
|
105
|
+
self
|
106
|
+
end # method with_arbitrary_keywords
|
107
|
+
alias_method :and_arbitrary_keywords, :with_arbitrary_keywords
|
108
|
+
|
76
109
|
# Convenience method for more fluent specs. Does nothing and returns self.
|
77
110
|
#
|
78
111
|
# @return [ConstructMatcher] self
|
@@ -102,9 +135,9 @@ module RSpec::SleepingKingStudios::Matchers::Core
|
|
102
135
|
private
|
103
136
|
|
104
137
|
def matches_arity? actual
|
105
|
-
return true unless @expected_arity
|
138
|
+
return true unless @expected_arity || @expect_unlimited_arguments
|
106
139
|
|
107
|
-
if result = check_method_arity(actual.allocate.method(:initialize), @expected_arity)
|
140
|
+
if result = check_method_arity(actual.allocate.method(:initialize), @expected_arity, expect_unlimited_arguments: @expect_unlimited_arguments)
|
108
141
|
@failing_method_reasons.update result
|
109
142
|
return false
|
110
143
|
end # if
|
@@ -114,9 +147,10 @@ module RSpec::SleepingKingStudios::Matchers::Core
|
|
114
147
|
|
115
148
|
def matches_keywords? actual
|
116
149
|
return true unless @expected_keywords ||
|
150
|
+
@expect_arbitrary_keywords ||
|
117
151
|
(@expected_arity && RUBY_VERSION >= "2.1.0")
|
118
152
|
|
119
|
-
if result = check_method_keywords(actual.allocate.method(:initialize), @expected_keywords)
|
153
|
+
if result = check_method_keywords(actual.allocate.method(:initialize), @expected_keywords, expect_arbitrary_keywords: @expect_arbitrary_keywords)
|
120
154
|
@failing_method_reasons.update result
|
121
155
|
return false
|
122
156
|
end # if
|
@@ -131,10 +165,18 @@ module RSpec::SleepingKingStudios::Matchers::Core
|
|
131
165
|
messages << "#{@expected_arity.inspect} argument#{1 == @expected_arity ? "" : "s"}"
|
132
166
|
end # if
|
133
167
|
|
168
|
+
if @expect_unlimited_arguments
|
169
|
+
messages << 'unlimited arguments'
|
170
|
+
end # if
|
171
|
+
|
134
172
|
if !(@expected_keywords.nil? || @expected_keywords.empty?)
|
135
173
|
messages << "#{pluralize @expected_keywords.count, 'keyword', 'keywords'} #{humanize_list @expected_keywords.map(&:inspect)}"
|
136
174
|
end # if
|
137
175
|
|
176
|
+
if @expect_arbitrary_keywords
|
177
|
+
messages << 'arbitrary keywords'
|
178
|
+
end # if
|
179
|
+
|
138
180
|
humanize_list messages
|
139
181
|
end # method format_expected_arguments
|
140
182
|
|
@@ -147,6 +189,10 @@ module RSpec::SleepingKingStudios::Matchers::Core
|
|
147
189
|
messages << " expected at most #{hsh[:count]} arguments, but received #{hsh[:arity]}"
|
148
190
|
end # if-elsif
|
149
191
|
|
192
|
+
if hsh = reasons.fetch(:expected_unlimited_arguments, false)
|
193
|
+
messages << " expected at most #{hsh[:count]} arguments, but received unlimited arguments"
|
194
|
+
end # if
|
195
|
+
|
150
196
|
if ary = reasons.fetch(:missing_keywords, false)
|
151
197
|
messages << " missing #{pluralize ary.count, 'keyword', 'keywords'} #{humanize_list ary.map(&:inspect)}"
|
152
198
|
end # if
|
@@ -155,6 +201,10 @@ module RSpec::SleepingKingStudios::Matchers::Core
|
|
155
201
|
messages << " unexpected #{pluralize ary.count, 'keyword', 'keywords'} #{humanize_list ary.map(&:inspect)}"
|
156
202
|
end # if
|
157
203
|
|
204
|
+
if reasons.fetch(:expected_arbitrary_keywords, false)
|
205
|
+
messages << " expected arbitrary keywords"
|
206
|
+
end # if
|
207
|
+
|
158
208
|
messages.join "\n"
|
159
209
|
end # method format_errors
|
160
210
|
end # class
|
@@ -8,39 +8,42 @@ module RSpec::SleepingKingStudios::Matchers::Shared
|
|
8
8
|
module MatchParameters
|
9
9
|
# Checks whether the method accepts the specified number or range of
|
10
10
|
# arguments.
|
11
|
-
#
|
11
|
+
#
|
12
12
|
# @param [Method] method the method to check
|
13
13
|
# @param [Integer, Range] arity the expected number or range of parameters
|
14
|
-
#
|
14
|
+
#
|
15
15
|
# @return [Boolean] true if the method accepts the specified number or both
|
16
16
|
# the specified minimum and maximum number of parameters; otherwise false
|
17
|
-
def check_method_arity method, arity
|
17
|
+
def check_method_arity method, arity, expect_unlimited_arguments: false
|
18
18
|
parameters = method.parameters
|
19
19
|
required = parameters.count { |type, | :req == type }
|
20
20
|
optional = parameters.count { |type, | :opt == type }
|
21
21
|
variadic = parameters.count { |type, | :rest == type }
|
22
|
+
reasons = {}
|
23
|
+
|
24
|
+
reasons[:expected_unlimited_arguments] = { count: required + optional } if 0 == variadic && expect_unlimited_arguments
|
22
25
|
|
23
26
|
min, max = arity.is_a?(Range) ?
|
24
27
|
[arity.begin, arity.end] :
|
25
28
|
[arity, arity]
|
26
29
|
|
27
|
-
if min < required
|
28
|
-
|
29
|
-
elsif 0 == variadic && max > required + optional
|
30
|
-
|
30
|
+
if min && min < required
|
31
|
+
reasons[:not_enough_args] = { arity: min, count: required }
|
32
|
+
elsif max && 0 == variadic && max > required + optional
|
33
|
+
reasons[:too_many_args] = { arity: max, count: required + optional }
|
31
34
|
end # if
|
32
35
|
|
33
|
-
nil
|
36
|
+
reasons.empty? ? nil : reasons
|
34
37
|
end # method check_method_arity
|
35
38
|
|
36
39
|
# Checks whether the method accepts the specified keywords.
|
37
|
-
#
|
40
|
+
#
|
38
41
|
# @param [Method] method the method to check
|
39
42
|
# @param [Array<String, Symbol>] keywords the expected keywords
|
40
|
-
#
|
43
|
+
#
|
41
44
|
# @return [Boolean] true if the method accepts the specified keywords;
|
42
45
|
# otherwise false
|
43
|
-
def check_method_keywords method, keywords
|
46
|
+
def check_method_keywords method, keywords, expect_arbitrary_keywords: false
|
44
47
|
keywords ||= []
|
45
48
|
parameters = method.parameters
|
46
49
|
reasons = {}
|
@@ -51,11 +54,13 @@ module RSpec::SleepingKingStudios::Matchers::Shared
|
|
51
54
|
parameters.select { |type, _| :keyreq == type }.each do |_, keyword|
|
52
55
|
missing << keyword unless keywords.include?(keyword)
|
53
56
|
end # each
|
54
|
-
|
57
|
+
|
55
58
|
reasons[:missing_keywords] = missing unless missing.empty?
|
56
59
|
end # if
|
57
60
|
|
58
61
|
unless 0 < parameters.count { |type, _| :keyrest == type }
|
62
|
+
reasons[:expected_arbitrary_keywords] = true if expect_arbitrary_keywords
|
63
|
+
|
59
64
|
mismatch = []
|
60
65
|
keywords.each do |keyword|
|
61
66
|
mismatch << keyword unless
|
@@ -70,9 +75,9 @@ module RSpec::SleepingKingStudios::Matchers::Shared
|
|
70
75
|
end # method check_method_keywords
|
71
76
|
|
72
77
|
# Checks whether the method expects a block.
|
73
|
-
#
|
78
|
+
#
|
74
79
|
# @param [Method] method the method to check
|
75
|
-
#
|
80
|
+
#
|
76
81
|
# @return [Boolean] true if the method expects a block argument; otherwise
|
77
82
|
# false
|
78
83
|
def check_method_block method
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-sleeping_king_studios
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rob "Merlin" Smith
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03
|
11
|
+
date: 2015-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|