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.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +16 -0
  3. data/.rubocop.yml +477 -22
  4. data/.travis.yml +12 -3
  5. data/Appraisals +24 -4
  6. data/Gemfile +1 -0
  7. data/README.md +37 -20
  8. data/Rakefile +1 -0
  9. data/gemfiles/rspec_3_0.gemfile +2 -1
  10. data/gemfiles/rspec_3_1.gemfile +2 -1
  11. data/gemfiles/rspec_3_2.gemfile +2 -1
  12. data/gemfiles/rspec_3_3.gemfile +2 -1
  13. data/gemfiles/rspec_3_4.gemfile +7 -0
  14. data/gemfiles/rspec_3_5.gemfile +7 -0
  15. data/gemfiles/rspec_3_6.gemfile +7 -0
  16. data/lib/rspec/json_matchers/expectation.rb +6 -2
  17. data/lib/rspec/json_matchers/expectations/mixins/built_in.rb +84 -5
  18. data/lib/rspec/json_matchers/expectations/private.rb +4 -2
  19. data/lib/rspec/json_matchers/matchers.rb +0 -1
  20. data/lib/rspec/json_matchers/matchers/be_json_matcher.rb +0 -14
  21. data/lib/rspec/json_matchers/matchers/be_json_with_content_matcher.rb +144 -5
  22. data/lib/rspec/json_matchers/utils/key_path/extraction.rb +8 -8
  23. data/lib/rspec/json_matchers/utils/key_path/path.rb +1 -1
  24. data/lib/rspec/json_matchers/version.rb +1 -1
  25. data/rspec-json_matchers.gemspec +3 -2
  26. metadata +16 -13
  27. data/lib/rspec/json_matchers/comparers.rb +0 -13
  28. data/lib/rspec/json_matchers/comparers/abstract_comparer.rb +0 -323
  29. data/lib/rspec/json_matchers/comparers/comparison_result.rb +0 -22
  30. data/lib/rspec/json_matchers/comparers/exact_keys_comparer.rb +0 -27
  31. data/lib/rspec/json_matchers/comparers/include_keys_comparer.rb +0 -26
  32. data/lib/rspec/json_matchers/matchers/be_json_with_sizes_matcher.rb +0 -24
  33. data/lib/rspec/json_matchers/matchers/be_json_with_something_matcher.rb +0 -188
@@ -1,22 +0,0 @@
1
- module RSpec
2
- module JsonMatchers
3
- module Comparers
4
- # @api private
5
- #
6
- # A value object returned by comparers
7
- # Instead of just Boolean
8
- class ComparisonResult
9
- attr_reader :reasons
10
-
11
- def initialize(matched, reasons)
12
- @matched = matched
13
- @reasons = reasons
14
- end
15
-
16
- def matched?
17
- @matched
18
- end
19
- end
20
- end
21
- end
22
- end
@@ -1,27 +0,0 @@
1
- require_relative "abstract_comparer"
2
-
3
- module RSpec
4
- module JsonMatchers
5
- module Comparers
6
- # @api private
7
- #
8
- # The comparer class that disallow actual collection
9
- # to have more properties/elements than expected collection
10
- class ExactKeysComparer < AbstractComparer
11
- private
12
-
13
- # @note with side effect on `#reasons`
14
- def has_matched_keys?
15
- (actual_keys == expected_keys).tap do |success|
16
- reasons.push(diff_keys.awesome_inspect) unless success
17
- end
18
- end
19
-
20
- def diff_keys
21
- (actual_keys - expected_keys) +
22
- (expected_keys - actual_keys)
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,26 +0,0 @@
1
- require_relative "abstract_comparer"
2
-
3
- module RSpec
4
- module JsonMatchers
5
- module Comparers
6
- # @api private
7
- #
8
- # The comparer class that allow actual collection
9
- # to have more properties/elements than expected collection
10
- class IncludeKeysComparer < AbstractComparer
11
- private
12
-
13
- # @note with side effect on `#reasons`
14
- def has_matched_keys?
15
- (expected_keys.subset?(actual_keys)).tap do |success|
16
- reasons.push(diff_keys.awesome_inspect) unless success
17
- end
18
- end
19
-
20
- def diff_keys
21
- expected_keys - actual_keys
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,24 +0,0 @@
1
- require "json"
2
- require "awesome_print"
3
-
4
- require_relative "be_json_with_something_matcher"
5
- require_relative "../comparers"
6
- require_relative "../utils"
7
-
8
- module RSpec
9
- module JsonMatchers
10
- module Matchers
11
- # @api private
12
- class BeJsonWithSizesMatcher < BeJsonWithSomethingMatcher
13
- private
14
-
15
- def value_matching_proc
16
- lambda do |expected, actual|
17
- Expectations::Private::ArrayWithSize[expected].
18
- expect?(actual)
19
- end
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,188 +0,0 @@
1
- require "json"
2
- require "awesome_print"
3
- require "abstract_class"
4
-
5
- require_relative "be_json_matcher"
6
- require_relative "../utils"
7
-
8
- module RSpec
9
- module JsonMatchers
10
- module Matchers
11
- # @api private
12
- # @abstract
13
- #
14
- # Parent of matcher classes that requires {#at_path} & {#with_exact_keys}
15
- # This is not merged with {BeJsonMatcher}
16
- # since it should be able to be used alone
17
- class BeJsonWithSomethingMatcher < BeJsonMatcher
18
- extend AbstractClass
19
-
20
- attr_reader(*[:expected, :path, :with_exact_keys])
21
- alias_method :with_exact_keys?, :with_exact_keys
22
-
23
- def initialize(expected)
24
- @expected = expected
25
- @path = JsonMatchers::Utils::KeyPath::Path.new("")
26
- @exact_match = false
27
- end
28
-
29
- def matches?(*_args)
30
- super && has_valid_path? && expected_and_actual_matched?
31
- end
32
-
33
- def does_not_match?(*args)
34
- !matches?(*args) && has_valid_path?
35
- end
36
-
37
- # Override {BeJsonMatcher#actual}
38
- # It return actual object extracted by {#path}
39
- # And also detect & set state for path error
40
- # (either it's invalid or fails to extract)
41
- #
42
- # @return [Object]
43
- # extracted object but could be object in the middle
44
- # when extraction failed
45
- def actual
46
- result = path.extract(super)
47
- has_path_error! if result.failed?
48
- result.object
49
- end
50
-
51
- # Sets the path to be used for object,
52
- # to avoid passing a deep nested
53
- # {Hash} or {Array} as expectation
54
- # Defaults to "" (if this is not called)
55
- #
56
- # The path uses period (".") as separator for parts
57
- # Also period cannot be used as path name as a side-effect
58
- #
59
- # This does NOT raise error if the path is invalid
60
- # (like having 2 periods, 1 period at the start/end of string)
61
- # But it will fail the example with both `should` & `should_not`
62
- #
63
- # @param path [String] the "path" to be used
64
- #
65
- # @return [BeJsonWithSomethingMatcher] the match itself
66
- #
67
- # @throw [TypeError] when input is not a string
68
- def at_path(path)
69
- @path = JsonMatchers::Utils::KeyPath::Path.new(path)
70
- self
71
- end
72
-
73
- # When `exactly` is `true`,
74
- # makes the matcher to fail the example
75
- # when actual has more elements than expected even expectation passes
76
- #
77
- # When `exactly` is `true`,
78
- # makes the matcher to pass the example
79
- # when actual has more elements than expected and expectation passes
80
- #
81
- # @param exactly [Boolean]
82
- # whether the matcher should match keys in actual & expected exactly
83
- #
84
- # @return (see #at_path)
85
- def with_exact_keys(exactly = true)
86
- @with_exact_keys = exactly
87
- self
88
- end
89
-
90
- # Overrides {BeJsonMatcher#failure_message}
91
- def failure_message
92
- return super if has_parser_error?
93
- failure_message_for(true)
94
- end
95
-
96
- # Overrides {BeJsonMatcher#failure_message_when_negated}
97
- def failure_message_when_negated
98
- return super if has_parser_error?
99
- failure_message_for(false)
100
- end
101
-
102
- private
103
-
104
- def failure_message_for(should_match)
105
- return invalid_path_message unless has_valid_path?
106
- return path_error_message if has_path_error?
107
-
108
- inspection_messages(should_match)
109
- end
110
-
111
- # @return [Bool] Whether `expected` & `parsed` are "equal"
112
- def expected_and_actual_matched?
113
- extracted_actual = actual
114
- return false if has_path_error?
115
- result = comparer_klass.
116
- new(extracted_actual, expected, reasons, value_matching_proc).
117
- compare
118
-
119
- result.matched?.tap do |matched|
120
- @reasons = result.reasons unless matched
121
- end
122
- end
123
-
124
- def reasons
125
- @reasons ||= []
126
- end
127
-
128
- def inspection_messages(should_match)
129
- [
130
- ["expected", inspection_messages_prefix(should_match), "to match:"].
131
- compact.map(&:strip).join(" "),
132
- expected.awesome_inspect(indent: -2),
133
- "",
134
- "actual:",
135
- actual.awesome_inspect(indent: -2),
136
- "",
137
- inspection_message_for_reason,
138
- ].join("\n")
139
- end
140
-
141
- def inspection_messages_prefix(should_match)
142
- should_match ? nil : "not"
143
- end
144
-
145
- def inspection_message_for_reason
146
- reasons.any? ? "reason/path: #{reasons.reverse.join('.')}" : nil
147
- end
148
-
149
- def original_actual
150
- @actual
151
- end
152
-
153
- def has_path_error?
154
- @has_path_error
155
- end
156
-
157
- def has_path_error!
158
- @has_path_error = true
159
- end
160
-
161
- # For both positive and negative
162
- def path_error_message
163
- [
164
- %(path "#{path}" does not exists in actual: ),
165
- original_actual.awesome_inspect(indent: -2),
166
- ].join("\n")
167
- end
168
-
169
- def has_valid_path?
170
- (path.nil? || path.valid?)
171
- end
172
-
173
- # For both positive and negative
174
- def invalid_path_message
175
- %(path "#{path}" is invalid)
176
- end
177
-
178
- def comparer_klass
179
- if with_exact_keys?
180
- Comparers::ExactKeysComparer
181
- else
182
- Comparers::IncludeKeysComparer
183
- end
184
- end
185
- end
186
- end
187
- end
188
- end