rspec-resembles_json_matchers 0.5.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/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +16 -0
- data/Appraisals +14 -0
- data/Gemfile +4 -0
- data/Guardfile +47 -0
- data/README.md +225 -0
- data/Rakefile +6 -0
- data/examples/example_spec.rb +123 -0
- data/gemfiles/rails_42.gemfile +8 -0
- data/gemfiles/rails_42.gemfile.lock +173 -0
- data/gemfiles/rails_42_rspec_33.gemfile +8 -0
- data/gemfiles/rails_42_rspec_33.gemfile.lock +173 -0
- data/gemfiles/rails_5.gemfile +8 -0
- data/gemfiles/rails_5.gemfile.lock +184 -0
- data/lib/rspec/resembles_json_matchers.rb +57 -0
- data/lib/rspec/resembles_json_matchers/attribute_matcher.rb +85 -0
- data/lib/rspec/resembles_json_matchers/helpers.rb +29 -0
- data/lib/rspec/resembles_json_matchers/json_matcher.rb +85 -0
- data/lib/rspec/resembles_json_matchers/matcherizer.rb +25 -0
- data/lib/rspec/resembles_json_matchers/resembles_any_of_matcher.rb +61 -0
- data/lib/rspec/resembles_json_matchers/resembles_array_matcher.rb +35 -0
- data/lib/rspec/resembles_json_matchers/resembles_class_matcher.rb +29 -0
- data/lib/rspec/resembles_json_matchers/resembles_date_matcher.rb +44 -0
- data/lib/rspec/resembles_json_matchers/resembles_hash_matcher.rb +110 -0
- data/lib/rspec/resembles_json_matchers/resembles_matcher.rb +59 -0
- data/lib/rspec/resembles_json_matchers/resembles_numeric_matcher.rb +32 -0
- data/lib/rspec/resembles_json_matchers/resembles_route_matcher.rb +25 -0
- data/lib/rspec/resembles_json_matchers/resembles_string_matcher.rb +25 -0
- data/lib/rspec/resembles_json_matchers/version.rb +5 -0
- data/rspec-resembles_json_matchers.gemspec +39 -0
- metadata +226 -0
@@ -0,0 +1,110 @@
|
|
1
|
+
require "active_support/core_ext/string/indent" # indent
|
2
|
+
|
3
|
+
module RSpec::ResemblesJsonMatchers
|
4
|
+
class ResemblesHashMatcher
|
5
|
+
include Helpers
|
6
|
+
|
7
|
+
def self.can_match?(hash)
|
8
|
+
hash.is_a? Hash
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :expected
|
12
|
+
|
13
|
+
def initialize(expected)
|
14
|
+
@expected = expected
|
15
|
+
@failed_matches = {}
|
16
|
+
@matched_keys = []
|
17
|
+
@matched_matchers = []
|
18
|
+
end
|
19
|
+
|
20
|
+
def matches?(actual)
|
21
|
+
@actual = actual
|
22
|
+
expected_matchers.each do |expected_key, value_matcher|
|
23
|
+
@matched_keys << expected_key
|
24
|
+
|
25
|
+
attr_matcher = RSpec::ResemblesJsonMatchers::AttributeMatcher.new(expected_key, value_matcher)
|
26
|
+
match = attr_matcher.matches?(actual)
|
27
|
+
|
28
|
+
if match
|
29
|
+
@matched_matchers << value_matcher
|
30
|
+
else
|
31
|
+
@failed_matches[expected_key] = value_matcher unless match
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
actual.keys.each { |k| unmatched_matchers.delete(k) }
|
36
|
+
|
37
|
+
!failed_matches.any? and
|
38
|
+
!unmatched_keys.any? and
|
39
|
+
!unmatched_matchers.any?
|
40
|
+
end
|
41
|
+
|
42
|
+
def description
|
43
|
+
"resemble json\n" + expected_formatted.indent(2)
|
44
|
+
end
|
45
|
+
|
46
|
+
def failure_message
|
47
|
+
"failed because\n" +
|
48
|
+
pretty_failed_matches.indent(2) +
|
49
|
+
pretty_unmatched_keys.indent(2) +
|
50
|
+
pretty_unmatched_matchers.indent(2) +
|
51
|
+
"\n"
|
52
|
+
end
|
53
|
+
|
54
|
+
protected
|
55
|
+
|
56
|
+
def expected_matchers
|
57
|
+
@expected_matchers ||= {}.tap do |hsh|
|
58
|
+
expected.each do |key, value_matcher|
|
59
|
+
hsh[key] = matcherize(value_matcher)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def failed_matches
|
65
|
+
@failed_matches
|
66
|
+
end
|
67
|
+
|
68
|
+
def unmatched_keys
|
69
|
+
@actual.keys - @matched_keys
|
70
|
+
end
|
71
|
+
|
72
|
+
def unmatched_matchers
|
73
|
+
@unmatched_matchers ||= expected_matchers.dup
|
74
|
+
end
|
75
|
+
|
76
|
+
def expected_formatted
|
77
|
+
out = "{\n"
|
78
|
+
out << expected_matchers.map do |k,v|
|
79
|
+
%{ "%s": %s} % [k, v.expected_formatted]
|
80
|
+
end.join(",\n")
|
81
|
+
out << "\n}\n"
|
82
|
+
end
|
83
|
+
|
84
|
+
def pretty_failed_matches
|
85
|
+
failed_matches.map do |k,matcher|
|
86
|
+
next unless @actual.key?(k) # Covered by the unmatched matchers messages
|
87
|
+
matcher_failure_message =
|
88
|
+
matcher.failure_message
|
89
|
+
.gsub("(compared using ==)", "") # From the equality matcher, ugly in this context
|
90
|
+
.strip
|
91
|
+
.indent(2)
|
92
|
+
|
93
|
+
"attribute #{k.to_s.inspect}:\n#{matcher_failure_message}"
|
94
|
+
end.join("\n")
|
95
|
+
end
|
96
|
+
|
97
|
+
def pretty_unmatched_keys
|
98
|
+
unmatched_keys.map do |key|
|
99
|
+
"attribute #{key.to_s.inspect}:\n is present, but no matcher provided to match it"
|
100
|
+
end.join("\n")
|
101
|
+
end
|
102
|
+
|
103
|
+
def pretty_unmatched_matchers
|
104
|
+
unmatched_matchers.map do |key, matcher|
|
105
|
+
"attribute #{key.to_s.inspect}:\n has a matcher defined, but that attribute was not provided"
|
106
|
+
end.join("\n")
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require "active_support/core_ext/array/wrap"
|
2
|
+
|
3
|
+
module RSpec::ResemblesJsonMatchers
|
4
|
+
|
5
|
+
def resembles(expected)
|
6
|
+
ResemblesMatcher.new(expected)
|
7
|
+
end
|
8
|
+
|
9
|
+
class ResemblesMatcher
|
10
|
+
def initialize(expected, inclusion: nil)
|
11
|
+
@expected = expected
|
12
|
+
|
13
|
+
candidate_class = if inclusion == :any
|
14
|
+
ResemblesAnyOfMatcher
|
15
|
+
elsif inclusion == :all
|
16
|
+
ResemblesAllOfMatcher
|
17
|
+
else
|
18
|
+
candidates.detect { |candidate| candidate.can_match?(@expected) }
|
19
|
+
end
|
20
|
+
|
21
|
+
if candidate_class
|
22
|
+
@candidate = candidate_class.new(expected)
|
23
|
+
else
|
24
|
+
fail "Could not find an acceptable resembles matcher for #{@expected.inspect}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def description
|
29
|
+
@candidate.description
|
30
|
+
end
|
31
|
+
|
32
|
+
def matches?(actual)
|
33
|
+
@actual = actual
|
34
|
+
if @candidate
|
35
|
+
@candidate.matches?(actual)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def failure_message(negated: false)
|
40
|
+
"expected #{@actual.inspect} to #{negated ? "not " : ""}#{description}"
|
41
|
+
end
|
42
|
+
|
43
|
+
def negative_failure_message
|
44
|
+
failure_message(negated: true)
|
45
|
+
end
|
46
|
+
|
47
|
+
def candidates
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class ResemblesAllOfMatcher
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
RSpec.configure { |c| c.include self }
|
58
|
+
end
|
59
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
|
2
|
+
module RSpec::ResemblesJsonMatchers
|
3
|
+
class ResemblesNumericMatcher
|
4
|
+
NUMBER_REGEX = /\A\d+\Z/.freeze
|
5
|
+
def self.can_match?(number)
|
6
|
+
number.is_a?(Numeric) ||
|
7
|
+
number =~ NUMBER_REGEX
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(expected)
|
11
|
+
@expected = expected
|
12
|
+
end
|
13
|
+
|
14
|
+
def description
|
15
|
+
"resemble the number #{@expected.inspect}"
|
16
|
+
end
|
17
|
+
|
18
|
+
# TODO Make sure int/float matches? Numbers are within an order of magnitude?
|
19
|
+
def matches?(actual)
|
20
|
+
@actual = actual
|
21
|
+
self.class.can_match?(actual)
|
22
|
+
end
|
23
|
+
|
24
|
+
def expected_formatted
|
25
|
+
@expected
|
26
|
+
end
|
27
|
+
|
28
|
+
def failure_message
|
29
|
+
"#{@actual.inspect} does not resemble a number"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
module RSpec::ResemblesJsonMatchers
|
3
|
+
class ResemblesRouteMatcher
|
4
|
+
ROUTE_REGEX = %r{\A/.*:}.freeze
|
5
|
+
def self.can_match?(route_string)
|
6
|
+
defined?(ActionDispatch) &&
|
7
|
+
route_string.is_a?(String) &&
|
8
|
+
route_string.start_with?("/") &&
|
9
|
+
route_string.include?(":")
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(expected_route)
|
13
|
+
@expected_route = expected_route
|
14
|
+
end
|
15
|
+
|
16
|
+
def description
|
17
|
+
"resemble route #{@expected_route.inspect}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def matches?(actual)
|
21
|
+
path = ActionDispatch::Journey::Path::Pattern.from_string(@expected_route)
|
22
|
+
actual =~ path.to_regexp
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
module RSpec::ResemblesJsonMatchers
|
3
|
+
class ResemblesStringMatcher
|
4
|
+
def self.can_match?(string)
|
5
|
+
string.is_a? String
|
6
|
+
end
|
7
|
+
|
8
|
+
def initialize(expected)
|
9
|
+
@expected = expected
|
10
|
+
end
|
11
|
+
|
12
|
+
def description
|
13
|
+
"resemble text #{@expected.inspect}"
|
14
|
+
end
|
15
|
+
|
16
|
+
# TODO make sure the lengths are kinda the same? Levenschtien distances?
|
17
|
+
def matches?(actual)
|
18
|
+
self.class.can_match?(actual)
|
19
|
+
end
|
20
|
+
|
21
|
+
def expected_formatted
|
22
|
+
@expected
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'rspec/resembles_json_matchers/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "rspec-resembles_json_matchers"
|
8
|
+
spec.version = Rspec::ResemblesJsonMatchers::VERSION
|
9
|
+
spec.authors = ["Paul Sadauskas"]
|
10
|
+
spec.email = ["psadauskas@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Helpful matchers for comparing JSON documents.}
|
13
|
+
spec.homepage = "https://github.com/paul/rspec-resembles_json_matchers"
|
14
|
+
|
15
|
+
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
16
|
+
# delete this section to allow pushing this gem to any host.
|
17
|
+
# if spec.respond_to?(:metadata)
|
18
|
+
# spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
|
19
|
+
# else
|
20
|
+
# raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
|
21
|
+
# end
|
22
|
+
|
23
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
24
|
+
spec.bindir = "exe"
|
25
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
26
|
+
spec.require_paths = ["lib"]
|
27
|
+
|
28
|
+
spec.add_development_dependency "bundler", "~> 1.11"
|
29
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
30
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
31
|
+
spec.add_development_dependency "appraisal"
|
32
|
+
spec.add_development_dependency "guard"
|
33
|
+
spec.add_development_dependency "guard-rspec"
|
34
|
+
spec.add_development_dependency "awesome_print"
|
35
|
+
|
36
|
+
spec.add_runtime_dependency "rspec", ">= 2.0", "< 4.0.0.a"
|
37
|
+
spec.add_runtime_dependency "rspec-expectations", ">= 2.0", "< 4.0.0.a"
|
38
|
+
spec.add_runtime_dependency "activesupport", ">= 4.0" # For String#indent
|
39
|
+
end
|
metadata
ADDED
@@ -0,0 +1,226 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rspec-resembles_json_matchers
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Paul Sadauskas
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-08-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.11'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.11'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: appraisal
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: guard
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: guard-rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: awesome_print
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rspec
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '2.0'
|
118
|
+
- - "<"
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: 4.0.0.a
|
121
|
+
type: :runtime
|
122
|
+
prerelease: false
|
123
|
+
version_requirements: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '2.0'
|
128
|
+
- - "<"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: 4.0.0.a
|
131
|
+
- !ruby/object:Gem::Dependency
|
132
|
+
name: rspec-expectations
|
133
|
+
requirement: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '2.0'
|
138
|
+
- - "<"
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: 4.0.0.a
|
141
|
+
type: :runtime
|
142
|
+
prerelease: false
|
143
|
+
version_requirements: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - ">="
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '2.0'
|
148
|
+
- - "<"
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: 4.0.0.a
|
151
|
+
- !ruby/object:Gem::Dependency
|
152
|
+
name: activesupport
|
153
|
+
requirement: !ruby/object:Gem::Requirement
|
154
|
+
requirements:
|
155
|
+
- - ">="
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '4.0'
|
158
|
+
type: :runtime
|
159
|
+
prerelease: false
|
160
|
+
version_requirements: !ruby/object:Gem::Requirement
|
161
|
+
requirements:
|
162
|
+
- - ">="
|
163
|
+
- !ruby/object:Gem::Version
|
164
|
+
version: '4.0'
|
165
|
+
description:
|
166
|
+
email:
|
167
|
+
- psadauskas@gmail.com
|
168
|
+
executables: []
|
169
|
+
extensions: []
|
170
|
+
extra_rdoc_files: []
|
171
|
+
files:
|
172
|
+
- ".gitignore"
|
173
|
+
- ".rspec"
|
174
|
+
- ".travis.yml"
|
175
|
+
- Appraisals
|
176
|
+
- Gemfile
|
177
|
+
- Guardfile
|
178
|
+
- README.md
|
179
|
+
- Rakefile
|
180
|
+
- examples/example_spec.rb
|
181
|
+
- gemfiles/rails_42.gemfile
|
182
|
+
- gemfiles/rails_42.gemfile.lock
|
183
|
+
- gemfiles/rails_42_rspec_33.gemfile
|
184
|
+
- gemfiles/rails_42_rspec_33.gemfile.lock
|
185
|
+
- gemfiles/rails_5.gemfile
|
186
|
+
- gemfiles/rails_5.gemfile.lock
|
187
|
+
- lib/rspec/resembles_json_matchers.rb
|
188
|
+
- lib/rspec/resembles_json_matchers/attribute_matcher.rb
|
189
|
+
- lib/rspec/resembles_json_matchers/helpers.rb
|
190
|
+
- lib/rspec/resembles_json_matchers/json_matcher.rb
|
191
|
+
- lib/rspec/resembles_json_matchers/matcherizer.rb
|
192
|
+
- lib/rspec/resembles_json_matchers/resembles_any_of_matcher.rb
|
193
|
+
- lib/rspec/resembles_json_matchers/resembles_array_matcher.rb
|
194
|
+
- lib/rspec/resembles_json_matchers/resembles_class_matcher.rb
|
195
|
+
- lib/rspec/resembles_json_matchers/resembles_date_matcher.rb
|
196
|
+
- lib/rspec/resembles_json_matchers/resembles_hash_matcher.rb
|
197
|
+
- lib/rspec/resembles_json_matchers/resembles_matcher.rb
|
198
|
+
- lib/rspec/resembles_json_matchers/resembles_numeric_matcher.rb
|
199
|
+
- lib/rspec/resembles_json_matchers/resembles_route_matcher.rb
|
200
|
+
- lib/rspec/resembles_json_matchers/resembles_string_matcher.rb
|
201
|
+
- lib/rspec/resembles_json_matchers/version.rb
|
202
|
+
- rspec-resembles_json_matchers.gemspec
|
203
|
+
homepage: https://github.com/paul/rspec-resembles_json_matchers
|
204
|
+
licenses: []
|
205
|
+
metadata: {}
|
206
|
+
post_install_message:
|
207
|
+
rdoc_options: []
|
208
|
+
require_paths:
|
209
|
+
- lib
|
210
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
211
|
+
requirements:
|
212
|
+
- - ">="
|
213
|
+
- !ruby/object:Gem::Version
|
214
|
+
version: '0'
|
215
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
216
|
+
requirements:
|
217
|
+
- - ">="
|
218
|
+
- !ruby/object:Gem::Version
|
219
|
+
version: '0'
|
220
|
+
requirements: []
|
221
|
+
rubyforge_project:
|
222
|
+
rubygems_version: 2.5.1
|
223
|
+
signing_key:
|
224
|
+
specification_version: 4
|
225
|
+
summary: Helpful matchers for comparing JSON documents.
|
226
|
+
test_files: []
|