rspec-json_helpers 0.9.2
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/lib/rspec/json_helpers.rb +37 -0
- data/lib/rspec/json_helpers/equal_json_matcher.rb +56 -0
- data/lib/rspec/json_helpers/formatter.rb +53 -0
- metadata +206 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 10aa419eb89e6a30f376b366b7a40cc3abb8560e
|
4
|
+
data.tar.gz: 50fddf43ce7afe458390b798c1e4451fb8043231
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: beeaddaf3b01488b64dfc949899ccb573c7833e8b5bab6f8a55dd161789385dca9f7b5b1f156f43326cfecd23018326702b93022801ffa59986c5d980217ad63
|
7
|
+
data.tar.gz: 89a7378b3ff33f352535cad5097a5588a7fb0f29f22ddc4da1e6ac16f66a2d1f6ef12cc60ee6495cb55d9e76ced4cb98ccb070692cd2a310e8aca0f24623892a
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'json_helpers/equal_json_matcher'
|
4
|
+
require_relative 'json_helpers/formatter'
|
5
|
+
|
6
|
+
module RSpec
|
7
|
+
# Provides a `equal_json` rspec matcher.
|
8
|
+
module JsonHelpers
|
9
|
+
|
10
|
+
# @param [String<JSON>] expected
|
11
|
+
# @raise ArgumentError Raises an ArgumentError when the expected
|
12
|
+
# value is not a String that contains valid JSON.
|
13
|
+
def equal_json(expected)
|
14
|
+
EqualJsonMatcher.new(expected)
|
15
|
+
end
|
16
|
+
|
17
|
+
class << self
|
18
|
+
|
19
|
+
# @param [String<JSON>] json
|
20
|
+
# @return [String<JSON>]
|
21
|
+
# @raise ArgumentError Raises an ArgumentError when the given
|
22
|
+
# value is not valid JSON. expected
|
23
|
+
# @api private
|
24
|
+
def normalize_json(json)
|
25
|
+
Formatter.new.format(json)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
RSpec.configure do |config|
|
34
|
+
config.include RSpec::JsonHelpers
|
35
|
+
end
|
36
|
+
|
37
|
+
RSpec::Matchers.alias_matcher :eq_json, :equal_json
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'diff-lcs'
|
4
|
+
require 'diffy'
|
5
|
+
require 'stringio'
|
6
|
+
|
7
|
+
module RSpec
|
8
|
+
module JsonHelpers
|
9
|
+
# @api private
|
10
|
+
class EqualJsonMatcher
|
11
|
+
|
12
|
+
def initialize(expected, colorize: true)
|
13
|
+
@expected = JsonHelpers.normalize_json(expected)
|
14
|
+
@diff_format = colorize ? :color : :text
|
15
|
+
end
|
16
|
+
|
17
|
+
def matches?(actual)
|
18
|
+
@actual = JsonHelpers.normalize_json(actual)
|
19
|
+
@expected == @actual
|
20
|
+
rescue ArgumentError => error
|
21
|
+
@wrong_type_error_message = error.message
|
22
|
+
false
|
23
|
+
end
|
24
|
+
|
25
|
+
def failure_message
|
26
|
+
if @actual.is_a?(String)
|
27
|
+
diff_json_error_message
|
28
|
+
else
|
29
|
+
wrong_type_error_message
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def failure_message_when_negated
|
34
|
+
raise NotImplementedError
|
35
|
+
end
|
36
|
+
|
37
|
+
def diff_json_error_message
|
38
|
+
message = StringIO.new
|
39
|
+
message << "expected: #{@expected}\n\n"
|
40
|
+
message << "got: #{@actual}\n\n"
|
41
|
+
message << "Diff: #{diff}"
|
42
|
+
message.string
|
43
|
+
end
|
44
|
+
|
45
|
+
def diff
|
46
|
+
diff = Diffy::Diff.new(@expected, @actual).to_s(@diff_format)
|
47
|
+
diff.lines[0..-2].join
|
48
|
+
end
|
49
|
+
|
50
|
+
def wrong_type_error_message
|
51
|
+
@wrong_type_error_message
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module RSpec
|
6
|
+
module JsonHelpers
|
7
|
+
# @api private
|
8
|
+
class Formatter
|
9
|
+
|
10
|
+
WRONG_TYPE = 'Expected a JSON string, got %<type>s.'
|
11
|
+
|
12
|
+
# @param [String<JSON>] json
|
13
|
+
# @return [String<JSON>]
|
14
|
+
# @raise ArgumentError Raises `ArgumentError` when the given
|
15
|
+
# json value is not a string, or when when there is an error
|
16
|
+
# parsring string as JSON.
|
17
|
+
def format(json)
|
18
|
+
dump_json(deep_sort(parse_json(json)))
|
19
|
+
rescue JSON::ParserError => e
|
20
|
+
raise ArgumentError, 'Expected a string containing valid ' \
|
21
|
+
"JSON; got #{e.class.name}: #{e.message}"
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def parse_json(json)
|
27
|
+
if json.is_a?(String)
|
28
|
+
JSON.parse(json)
|
29
|
+
else
|
30
|
+
raise ArgumentError, Kernel.format(WRONG_TYPE, type: json.class.name)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def dump_json(value)
|
35
|
+
JSON.pretty_generate(value, indent: ' ')
|
36
|
+
end
|
37
|
+
|
38
|
+
def deep_sort(obj)
|
39
|
+
case obj
|
40
|
+
when Hash
|
41
|
+
obj.keys.sort.each_with_object({}) do |key, hash|
|
42
|
+
hash[key] = deep_sort(obj[key])
|
43
|
+
end
|
44
|
+
when Array
|
45
|
+
obj.map { |value| deep_sort(value) }
|
46
|
+
when String, Numeric, true, false, nil
|
47
|
+
obj
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
metadata
ADDED
@@ -0,0 +1,206 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rspec-json_helpers
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.9.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- The Incognito Coder
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-10-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: diff-lcs
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: diffy
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: coveralls
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.8'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.8'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: kramdown
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.16'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.16'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.11'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.11'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '12.3'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '12.3'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '3.7'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '3.7'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0.56'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0.56'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: semver-string
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '1.0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '1.0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: yard
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0.9'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0.9'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: yard-sitemap
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '1.0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '1.0'
|
167
|
+
description:
|
168
|
+
email:
|
169
|
+
- theincognitocoder@gmail.com
|
170
|
+
executables: []
|
171
|
+
extensions: []
|
172
|
+
extra_rdoc_files: []
|
173
|
+
files:
|
174
|
+
- lib/rspec/json_helpers.rb
|
175
|
+
- lib/rspec/json_helpers/equal_json_matcher.rb
|
176
|
+
- lib/rspec/json_helpers/formatter.rb
|
177
|
+
homepage: https://github.com/theincognitocoder/rspec-json_helpers
|
178
|
+
licenses:
|
179
|
+
- MIT
|
180
|
+
metadata:
|
181
|
+
bug_tracker_uri: https://github.com/theincognitocoder/rspec-json_helpers/issues
|
182
|
+
changelog_uri: https://github.com/theincognitocoder/rspec-json_helpers/blob/master/CHANGELOG.md
|
183
|
+
documentation_uri: https://www.rubydoc.info/github/theincognitocoder/rspec-json_helpers/master
|
184
|
+
homepage_uri: https://github.com/theincognitocoder/rspec-json_helpers
|
185
|
+
source_code_uri: https://github.com/theincognitocoder/rspec-json_helpers
|
186
|
+
post_install_message:
|
187
|
+
rdoc_options: []
|
188
|
+
require_paths:
|
189
|
+
- lib
|
190
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
196
|
+
requirements:
|
197
|
+
- - ">="
|
198
|
+
- !ruby/object:Gem::Version
|
199
|
+
version: '0'
|
200
|
+
requirements: []
|
201
|
+
rubyforge_project:
|
202
|
+
rubygems_version: 2.5.1
|
203
|
+
signing_key:
|
204
|
+
specification_version: 4
|
205
|
+
summary: RSpec helpers for working with JSON values.
|
206
|
+
test_files: []
|