rspec-json_helpers 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
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: []