rspec-json_matchers 0.1.0.alpha.3 → 0.1.0.alpha.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +16 -0
- data/.rubocop.yml +477 -22
- data/.travis.yml +12 -3
- data/Appraisals +24 -4
- data/Gemfile +1 -0
- data/README.md +37 -20
- data/Rakefile +1 -0
- data/gemfiles/rspec_3_0.gemfile +2 -1
- data/gemfiles/rspec_3_1.gemfile +2 -1
- data/gemfiles/rspec_3_2.gemfile +2 -1
- data/gemfiles/rspec_3_3.gemfile +2 -1
- data/gemfiles/rspec_3_4.gemfile +7 -0
- data/gemfiles/rspec_3_5.gemfile +7 -0
- data/gemfiles/rspec_3_6.gemfile +7 -0
- data/lib/rspec/json_matchers/expectation.rb +6 -2
- data/lib/rspec/json_matchers/expectations/mixins/built_in.rb +84 -5
- data/lib/rspec/json_matchers/expectations/private.rb +4 -2
- data/lib/rspec/json_matchers/matchers.rb +0 -1
- data/lib/rspec/json_matchers/matchers/be_json_matcher.rb +0 -14
- data/lib/rspec/json_matchers/matchers/be_json_with_content_matcher.rb +144 -5
- data/lib/rspec/json_matchers/utils/key_path/extraction.rb +8 -8
- data/lib/rspec/json_matchers/utils/key_path/path.rb +1 -1
- data/lib/rspec/json_matchers/version.rb +1 -1
- data/rspec-json_matchers.gemspec +3 -2
- metadata +16 -13
- data/lib/rspec/json_matchers/comparers.rb +0 -13
- data/lib/rspec/json_matchers/comparers/abstract_comparer.rb +0 -323
- data/lib/rspec/json_matchers/comparers/comparison_result.rb +0 -22
- data/lib/rspec/json_matchers/comparers/exact_keys_comparer.rb +0 -27
- data/lib/rspec/json_matchers/comparers/include_keys_comparer.rb +0 -26
- data/lib/rspec/json_matchers/matchers/be_json_with_sizes_matcher.rb +0 -24
- data/lib/rspec/json_matchers/matchers/be_json_with_something_matcher.rb +0 -188
@@ -45,13 +45,13 @@ module RSpec
|
|
45
45
|
|
46
46
|
private
|
47
47
|
|
48
|
-
attr_accessor(
|
48
|
+
attr_accessor(
|
49
49
|
:object,
|
50
|
-
|
51
|
-
attr_reader(
|
50
|
+
)
|
51
|
+
attr_reader(
|
52
52
|
:path,
|
53
53
|
:failed,
|
54
|
-
|
54
|
+
)
|
55
55
|
alias_method :failed?, :failed
|
56
56
|
|
57
57
|
# @param path_part [String]
|
@@ -119,12 +119,12 @@ module RSpec
|
|
119
119
|
Result.new(object.slice(index), true)
|
120
120
|
end
|
121
121
|
|
122
|
-
attr_accessor(
|
122
|
+
attr_accessor(
|
123
123
|
:object,
|
124
|
-
|
125
|
-
attr_reader(
|
124
|
+
)
|
125
|
+
attr_reader(
|
126
126
|
:path_part,
|
127
|
-
|
127
|
+
)
|
128
128
|
end
|
129
129
|
|
130
130
|
# @api private
|
data/rspec-json_matchers.gemspec
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
+
# rubocop:disable Style/MethodCallWithArgsParentheses
|
2
3
|
lib = File.expand_path("../lib", __FILE__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require "rspec/json_matchers/version"
|
@@ -30,7 +31,7 @@ Gem::Specification.new do |spec|
|
|
30
31
|
spec.add_dependency "abstract_class", "~> 1.0", ">= 1.0.1"
|
31
32
|
|
32
33
|
spec.add_development_dependency "bundler", "~> 1.5"
|
33
|
-
spec.add_development_dependency "rake", "
|
34
|
+
spec.add_development_dependency "rake", ">= 10.0", "<= 13.0"
|
34
35
|
|
35
36
|
spec.add_development_dependency "appraisal", "~> 2.0"
|
36
37
|
|
@@ -43,7 +44,7 @@ Gem::Specification.new do |spec|
|
|
43
44
|
spec.add_development_dependency "rubocop", "~> 0.32"
|
44
45
|
spec.add_development_dependency "inch", "~> 0.6"
|
45
46
|
|
46
|
-
spec.required_ruby_version = ">= 2.
|
47
|
+
spec.required_ruby_version = ">= 2.1.0"
|
47
48
|
|
48
49
|
spec.required_rubygems_version = ">= 1.4.0"
|
49
50
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-json_matchers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.0.alpha.
|
4
|
+
version: 0.1.0.alpha.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- PikachuEXE
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -76,16 +76,22 @@ dependencies:
|
|
76
76
|
name: rake
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
78
78
|
requirements:
|
79
|
-
- - "
|
79
|
+
- - ">="
|
80
80
|
- !ruby/object:Gem::Version
|
81
81
|
version: '10.0'
|
82
|
+
- - "<="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '13.0'
|
82
85
|
type: :development
|
83
86
|
prerelease: false
|
84
87
|
version_requirements: !ruby/object:Gem::Requirement
|
85
88
|
requirements:
|
86
|
-
- - "
|
89
|
+
- - ">="
|
87
90
|
- !ruby/object:Gem::Version
|
88
91
|
version: '10.0'
|
92
|
+
- - "<="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '13.0'
|
89
95
|
- !ruby/object:Gem::Dependency
|
90
96
|
name: appraisal
|
91
97
|
requirement: !ruby/object:Gem::Requirement
|
@@ -181,6 +187,7 @@ executables: []
|
|
181
187
|
extensions: []
|
182
188
|
extra_rdoc_files: []
|
183
189
|
files:
|
190
|
+
- ".codeclimate.yml"
|
184
191
|
- ".gitignore"
|
185
192
|
- ".rubocop.yml"
|
186
193
|
- ".travis.yml"
|
@@ -195,13 +202,11 @@ files:
|
|
195
202
|
- gemfiles/rspec_3_1.gemfile
|
196
203
|
- gemfiles/rspec_3_2.gemfile
|
197
204
|
- gemfiles/rspec_3_3.gemfile
|
205
|
+
- gemfiles/rspec_3_4.gemfile
|
206
|
+
- gemfiles/rspec_3_5.gemfile
|
207
|
+
- gemfiles/rspec_3_6.gemfile
|
198
208
|
- lib/rspec-json_matchers.rb
|
199
209
|
- lib/rspec/json_matchers.rb
|
200
|
-
- lib/rspec/json_matchers/comparers.rb
|
201
|
-
- lib/rspec/json_matchers/comparers/abstract_comparer.rb
|
202
|
-
- lib/rspec/json_matchers/comparers/comparison_result.rb
|
203
|
-
- lib/rspec/json_matchers/comparers/exact_keys_comparer.rb
|
204
|
-
- lib/rspec/json_matchers/comparers/include_keys_comparer.rb
|
205
210
|
- lib/rspec/json_matchers/expectation.rb
|
206
211
|
- lib/rspec/json_matchers/expectations.rb
|
207
212
|
- lib/rspec/json_matchers/expectations/abstract.rb
|
@@ -211,8 +216,6 @@ files:
|
|
211
216
|
- lib/rspec/json_matchers/matchers.rb
|
212
217
|
- lib/rspec/json_matchers/matchers/be_json_matcher.rb
|
213
218
|
- lib/rspec/json_matchers/matchers/be_json_with_content_matcher.rb
|
214
|
-
- lib/rspec/json_matchers/matchers/be_json_with_sizes_matcher.rb
|
215
|
-
- lib/rspec/json_matchers/matchers/be_json_with_something_matcher.rb
|
216
219
|
- lib/rspec/json_matchers/utils.rb
|
217
220
|
- lib/rspec/json_matchers/utils/collection_keys_extractor.rb
|
218
221
|
- lib/rspec/json_matchers/utils/key_path/extraction.rb
|
@@ -231,7 +234,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
231
234
|
requirements:
|
232
235
|
- - ">="
|
233
236
|
- !ruby/object:Gem::Version
|
234
|
-
version: 2.
|
237
|
+
version: 2.1.0
|
235
238
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
236
239
|
requirements:
|
237
240
|
- - ">="
|
@@ -239,7 +242,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
239
242
|
version: 1.4.0
|
240
243
|
requirements: []
|
241
244
|
rubyforge_project:
|
242
|
-
rubygems_version: 2.
|
245
|
+
rubygems_version: 2.6.8
|
243
246
|
signing_key:
|
244
247
|
specification_version: 4
|
245
248
|
summary: A collection of RSpec matchers for testing JSON data.
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require_relative "comparers/exact_keys_comparer"
|
2
|
-
require_relative "comparers/include_keys_comparer"
|
3
|
-
|
4
|
-
module RSpec
|
5
|
-
module JsonMatchers
|
6
|
-
# @api private
|
7
|
-
#
|
8
|
-
# All classes & modules here (including itself) are for internal use only
|
9
|
-
# They could be renamed or re-structured anytime
|
10
|
-
module Comparers
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,323 +0,0 @@
|
|
1
|
-
require "abstract_class"
|
2
|
-
require "forwardable"
|
3
|
-
require "set"
|
4
|
-
require_relative "../expectation"
|
5
|
-
require_relative "comparison_result"
|
6
|
-
|
7
|
-
module RSpec
|
8
|
-
module JsonMatchers
|
9
|
-
module Comparers
|
10
|
-
# @api private
|
11
|
-
# @abstract
|
12
|
-
#
|
13
|
-
# The parent of all comparer classes
|
14
|
-
# It holds most of the responsibility
|
15
|
-
# The subclasses only need to implement the behaviour of matching keys
|
16
|
-
# when both expected & actual are same type of collection
|
17
|
-
class AbstractComparer
|
18
|
-
attr_reader(*[
|
19
|
-
:actual,
|
20
|
-
:expected,
|
21
|
-
:reasons,
|
22
|
-
:value_matching_proc,
|
23
|
-
])
|
24
|
-
|
25
|
-
# Creates a comparer that actually use the {value_matching_proc}
|
26
|
-
# for matching {#actual} and {#expected}
|
27
|
-
# This class is respossible to aggregating
|
28
|
-
# the matching result for each element of {#expected},
|
29
|
-
# and compare the keys/indices as well
|
30
|
-
#
|
31
|
-
# @param actual [Object]
|
32
|
-
# the actual "thing", should be an {Enumerable}
|
33
|
-
# @param expected [Object]
|
34
|
-
# the expected "thing", should be an {Enumerable}
|
35
|
-
# @param reasons [Array<String>]
|
36
|
-
# failure reasons, mostly the path parts
|
37
|
-
# @param value_matching_proc [Proc]
|
38
|
-
# the proc that actually compares
|
39
|
-
# the expected & actual and returns a boolean
|
40
|
-
def initialize(actual, expected, reasons, value_matching_proc)
|
41
|
-
@actual = actual
|
42
|
-
@expected = expected
|
43
|
-
@reasons = reasons
|
44
|
-
|
45
|
-
@value_matching_proc = value_matching_proc
|
46
|
-
end
|
47
|
-
|
48
|
-
# @return [Boolean]
|
49
|
-
# `true` if #actual & #expected are the same
|
50
|
-
def compare
|
51
|
-
return ComparisonResult.new(true, reasons) if has_matched_value?
|
52
|
-
|
53
|
-
has_matched_collection?
|
54
|
-
end
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
def has_matched_value?
|
59
|
-
value_matching_proc.call(expected, actual)
|
60
|
-
end
|
61
|
-
|
62
|
-
def has_matched_collection?
|
63
|
-
return ComparisonResult.new(false, reasons) unless is_collection?
|
64
|
-
return ComparisonResult.new(false, reasons) unless has_matched_class?
|
65
|
-
return ComparisonResult.new(false, reasons) unless has_matched_keys?
|
66
|
-
|
67
|
-
ComparisonResult.new(has_matched_values?, reasons)
|
68
|
-
end
|
69
|
-
|
70
|
-
def is_collection?
|
71
|
-
actual.is_a?(Array) || actual.is_a?(Hash)
|
72
|
-
end
|
73
|
-
|
74
|
-
def has_matched_class?
|
75
|
-
actual.class == expected.class
|
76
|
-
end
|
77
|
-
|
78
|
-
# @note with side effect on `#reasons`
|
79
|
-
def has_matched_keys?
|
80
|
-
fail NotImplementedError
|
81
|
-
end
|
82
|
-
|
83
|
-
# @note with side effect on `#reasons`
|
84
|
-
def has_matched_values?
|
85
|
-
comparison_result = EXPECTED_VALUE_CLASS_TO_EXPECTATION_MAPPING.
|
86
|
-
fetch(expected.class).
|
87
|
-
new(self).
|
88
|
-
comparison_result
|
89
|
-
|
90
|
-
comparison_result.matched?.tap do |matched|
|
91
|
-
@reasons = comparison_result.reasons unless matched
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def actual_keys
|
96
|
-
@actual_keys ||= Utils::CollectionKeysExtractor.extract(actual)
|
97
|
-
end
|
98
|
-
|
99
|
-
def expected_keys
|
100
|
-
@expected_keys ||= Utils::CollectionKeysExtractor.extract(expected)
|
101
|
-
end
|
102
|
-
|
103
|
-
# Represents an "expectation" for matching all elements
|
104
|
-
# in {#actual} & {#expected}
|
105
|
-
class HasMatchedValues
|
106
|
-
extend AbstractClass
|
107
|
-
extend Forwardable
|
108
|
-
|
109
|
-
public
|
110
|
-
|
111
|
-
# Create a "matching" operation object
|
112
|
-
# that can return a {Comparers::ComparisonResult}
|
113
|
-
#
|
114
|
-
# @param comparer [AbstractComparer]
|
115
|
-
# the comparer that creates this object, for fetching values
|
116
|
-
def initialize(comparer)
|
117
|
-
@comparer = comparer
|
118
|
-
end
|
119
|
-
|
120
|
-
def comparison_result
|
121
|
-
each_element_enumerator.each do |element|
|
122
|
-
result = comparison_result_for_element(element)
|
123
|
-
|
124
|
-
return result unless result.matched?
|
125
|
-
end
|
126
|
-
|
127
|
-
Comparers::ComparisonResult.new(true, reasons)
|
128
|
-
end
|
129
|
-
|
130
|
-
def each_element_enumerator
|
131
|
-
fail NotImplementedError
|
132
|
-
end
|
133
|
-
|
134
|
-
def has_matched_value_class
|
135
|
-
fail NotImplementedError
|
136
|
-
end
|
137
|
-
|
138
|
-
private
|
139
|
-
|
140
|
-
def_delegators(*[
|
141
|
-
:comparer,
|
142
|
-
:expected,
|
143
|
-
:reasons,
|
144
|
-
])
|
145
|
-
|
146
|
-
attr_reader(*[
|
147
|
-
:comparer,
|
148
|
-
])
|
149
|
-
|
150
|
-
def comparer_class
|
151
|
-
comparer.class
|
152
|
-
end
|
153
|
-
|
154
|
-
def comparison_result_for_element(element)
|
155
|
-
has_matched_value_class.
|
156
|
-
new(
|
157
|
-
element,
|
158
|
-
comparer,
|
159
|
-
).comparison_result
|
160
|
-
end
|
161
|
-
|
162
|
-
# Represents an "expectation" for matching one element
|
163
|
-
# in {#actual} & {#expected}
|
164
|
-
class HasMatchedValue
|
165
|
-
extend AbstractClass
|
166
|
-
extend Forwardable
|
167
|
-
|
168
|
-
public
|
169
|
-
|
170
|
-
# Create a "matching" operation object
|
171
|
-
# that can return a {Comparers::ComparisonResult}
|
172
|
-
# Unlike {HasMatchedValues}, this is for an element of `expected`
|
173
|
-
#
|
174
|
-
# @param element [Integer, String, Symbol]
|
175
|
-
# a index/key from expected (not value)
|
176
|
-
# @param (see HasMatchedValues#initialize)
|
177
|
-
def initialize(element, comparer)
|
178
|
-
@element = element
|
179
|
-
@comparer = comparer
|
180
|
-
end
|
181
|
-
|
182
|
-
def comparison_result
|
183
|
-
return false unless actual_contain_element?
|
184
|
-
|
185
|
-
result.tap do |result|
|
186
|
-
next if result.matched?
|
187
|
-
result.reasons.push(reason)
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
private
|
192
|
-
|
193
|
-
attr_reader(*[
|
194
|
-
:element,
|
195
|
-
:comparer,
|
196
|
-
])
|
197
|
-
|
198
|
-
def_delegators(*[
|
199
|
-
:comparer,
|
200
|
-
:expected,
|
201
|
-
:actual,
|
202
|
-
:reasons,
|
203
|
-
:value_matching_proc,
|
204
|
-
])
|
205
|
-
|
206
|
-
def comparer_class
|
207
|
-
comparer.class
|
208
|
-
end
|
209
|
-
|
210
|
-
def result
|
211
|
-
@result ||= comparer_class.
|
212
|
-
new(
|
213
|
-
actual_for_element,
|
214
|
-
expected_for_element,
|
215
|
-
reasons,
|
216
|
-
value_matching_proc,
|
217
|
-
).
|
218
|
-
compare
|
219
|
-
end
|
220
|
-
|
221
|
-
def actual_contain_element?
|
222
|
-
fail NotImplementedError
|
223
|
-
end
|
224
|
-
|
225
|
-
def actual_for_element
|
226
|
-
fail NotImplementedError
|
227
|
-
end
|
228
|
-
|
229
|
-
def expected_for_element
|
230
|
-
fail NotImplementedError
|
231
|
-
end
|
232
|
-
|
233
|
-
def reason
|
234
|
-
fail NotImplementedError
|
235
|
-
end
|
236
|
-
end
|
237
|
-
end
|
238
|
-
|
239
|
-
# (see HasMatchedValues)
|
240
|
-
# {#expected} should be {Array}
|
241
|
-
class HasMatchedArrayValues < HasMatchedValues
|
242
|
-
def each_element_enumerator
|
243
|
-
expected.each_index
|
244
|
-
end
|
245
|
-
|
246
|
-
def has_matched_value_class
|
247
|
-
HasMatchedArrayValue
|
248
|
-
end
|
249
|
-
|
250
|
-
# (see HasMatchedValues::HasMatchedValue)
|
251
|
-
# {#expected} should be {Array}
|
252
|
-
class HasMatchedArrayValue < HasMatchedValues::HasMatchedValue
|
253
|
-
private
|
254
|
-
|
255
|
-
alias_method :index, :element
|
256
|
-
|
257
|
-
public
|
258
|
-
|
259
|
-
def actual_contain_element?
|
260
|
-
index < actual.size
|
261
|
-
end
|
262
|
-
|
263
|
-
def actual_for_element
|
264
|
-
actual[index]
|
265
|
-
end
|
266
|
-
|
267
|
-
def expected_for_element
|
268
|
-
expected[index]
|
269
|
-
end
|
270
|
-
|
271
|
-
def reason
|
272
|
-
"[#{index}]"
|
273
|
-
end
|
274
|
-
end
|
275
|
-
end
|
276
|
-
|
277
|
-
# (see HasMatchedValues)
|
278
|
-
# {#expected} should be {Hash}
|
279
|
-
class HasMatchedHashValues < HasMatchedValues
|
280
|
-
def each_element_enumerator
|
281
|
-
expected.each_key
|
282
|
-
end
|
283
|
-
|
284
|
-
def has_matched_value_class
|
285
|
-
HasMatchedHashValue
|
286
|
-
end
|
287
|
-
|
288
|
-
# (see HasMatchedValues::HasMatchedValue)
|
289
|
-
# {#expected} should be {Array}
|
290
|
-
class HasMatchedHashValue < HasMatchedValues::HasMatchedValue
|
291
|
-
private
|
292
|
-
|
293
|
-
alias_method :key, :element
|
294
|
-
|
295
|
-
public
|
296
|
-
|
297
|
-
def actual_contain_element?
|
298
|
-
actual.key?(key.to_s)
|
299
|
-
end
|
300
|
-
|
301
|
-
def actual_for_element
|
302
|
-
actual[key.to_s]
|
303
|
-
end
|
304
|
-
|
305
|
-
def expected_for_element
|
306
|
-
expected[key]
|
307
|
-
end
|
308
|
-
|
309
|
-
def reason
|
310
|
-
key
|
311
|
-
end
|
312
|
-
end
|
313
|
-
end
|
314
|
-
|
315
|
-
EXPECTED_VALUE_CLASS_TO_EXPECTATION_MAPPING = {
|
316
|
-
Array => HasMatchedArrayValues,
|
317
|
-
Hash => HasMatchedHashValues,
|
318
|
-
}.freeze
|
319
|
-
private_constant :EXPECTED_VALUE_CLASS_TO_EXPECTATION_MAPPING
|
320
|
-
end
|
321
|
-
end
|
322
|
-
end
|
323
|
-
end
|