rspec-composable_json_matchers 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ac347d740dd20583329e5908285b186dd61aa27a
4
+ data.tar.gz: a9a956bdd23674f1c7af6ccede8717485709aeda
5
+ SHA512:
6
+ metadata.gz: 256ba8db6ac26b919e719a429044cc2099766f48206a90868dd14f2de56c36aa4cd226b01c3a6daceb993eca4f69d6bf64981fabb704189561fa83266e8394c1
7
+ data.tar.gz: b7a583703a4004e7b92a1ea93c9bf85c2dbc501769875586a8d96f012c18b11d5db7e30d11e4e70bd2eaac528fbe45bc8b86386af3d0559ea8dcfd41fd510a93
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/examples.txt
9
+ /spec/reports/
10
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
@@ -0,0 +1,12 @@
1
+ Lint/HandleExceptions:
2
+ Exclude:
3
+ - 'spec/**/*'
4
+
5
+ Metrics/LineLength:
6
+ Max: 100
7
+
8
+ Style/CaseEquality:
9
+ Enabled: false
10
+
11
+ Style/Documentation:
12
+ Enabled: false
@@ -0,0 +1,12 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 2.1.7
5
+ - 2.2.4
6
+ - 2.3.0
7
+ - jruby-19mode
8
+ - jruby-9.0.0.0
9
+ before_install: gem update bundler
10
+ script: bundle exec rake ci
11
+ sudo: false
12
+ cache: bundler
@@ -0,0 +1,2 @@
1
+ --markup markdown
2
+ --hide-void-return
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :development, :test do
6
+ gem 'coderay', '~> 1.1'
7
+ gem 'rake', '~> 10.0'
8
+ gem 'rubocop', '~> 0.37'
9
+ gem 'simplecov', '~> 0.11'
10
+ gem 'yard', '~> 0.8'
11
+ end
12
+
13
+ group :test do
14
+ gem 'coveralls', '~> 0.8'
15
+ end
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Yuji Nakayama
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,217 @@
1
+ [![Gem Version](http://img.shields.io/gem/v/rspec-composable_json_matchers.svg?style=flat)](http://badge.fury.io/rb/rspec-composable_json_matchers)
2
+ [![Dependency Status](http://img.shields.io/gemnasium/yujinakayama/rspec-composable_json_matchers.svg?style=flat)](https://gemnasium.com/yujinakayama/rspec-composable_json_matchers)
3
+ [![Build Status](https://travis-ci.org/yujinakayama/rspec-composable_json_matchers.svg?branch=master&style=flat)](https://travis-ci.org/yujinakayama/rspec-composable_json_matchers)
4
+ [![Coverage Status](http://img.shields.io/coveralls/yujinakayama/rspec-composable_json_matchers/master.svg?style=flat)](https://coveralls.io/r/yujinakayama/rspec-composable_json_matchers)
5
+ [![Code Climate](https://img.shields.io/codeclimate/github/yujinakayama/rspec-composable_json_matchers.svg?style=flat)](https://codeclimate.com/github/yujinakayama/rspec-composable_json_matchers)
6
+
7
+ # RSpec::ComposableJSONMatchers
8
+
9
+ **RSpec::ComposableJSONMatchers** provides `be_json` matcher,
10
+ which lets you express expected structures on JSON strings
11
+ with the power of RSpec's
12
+ [built-in matchers](https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers)
13
+ and
14
+ [composable matchers](https://relishapp.com/rspec/rspec-expectations/docs/composing-matchers).
15
+
16
+ ```ruby
17
+ json = '{ "foo": 1, "bar": 2 }'
18
+ expect(json).to be_json a_kind_of(Hash)
19
+ expect(json).to be_json matching(foo: 1, bar: a_kind_of(Integer))
20
+ expect(json).to be_json including(foo: 1)
21
+ ```
22
+
23
+ ## Installation
24
+
25
+ ### Adding `rspec-composable_json_matchers` dependency
26
+
27
+ Add this line to your `Gemfile`:
28
+
29
+ ```ruby
30
+ gem 'rspec-composable_json_matchers'
31
+ ```
32
+
33
+ And then run:
34
+
35
+ ```bash
36
+ $ bundle install
37
+ ```
38
+
39
+ ### Enabling `be_json` matcher
40
+
41
+ To make the `be_json` matcher available in every example,
42
+ add the following line to your `spec/spec_helper.rb`:
43
+
44
+ ```ruby
45
+ # spec/spec_helper.rb
46
+ require 'rspec/composable_json_matchers/setup'
47
+ ```
48
+
49
+ Or if you prefer more explicit way, add the following snippet:
50
+
51
+ ```ruby
52
+ # spec/spec_helper.rb
53
+ require 'rspec/composable_json_matchers'
54
+
55
+ RSpec.configure do |config|
56
+ include RSpec::ComposableJSONMatchers
57
+ end
58
+ ```
59
+
60
+ If you want to enable the `be_json` matcher only specific examples rather than every example,
61
+ include the `RSpec::ComposableJSONMatchers` in the example groups:
62
+
63
+ ```ruby
64
+ # spec/something_spec.rb
65
+ require 'rspec/composable_json_matchers'
66
+
67
+ describe 'something' do
68
+ include RSpec::ComposableJSONMatchers
69
+ end
70
+ ```
71
+
72
+ ## Usage
73
+
74
+ The `be_json` matcher takes another matcher, a hash, or an array.
75
+
76
+ When a matcher is given,
77
+ it passes if actual string can be decoded as JSON and the decoded structure passes the given matcher:
78
+
79
+ ```ruby
80
+ expect('{ "foo": 1, "bar": 2 }').to be_json a_kind_of(Hash)
81
+ expect('{ "foo": 1, "bar": 2 }').to be_json matching(foo: 1, bar: 2)
82
+ expect('{ "foo": 1, "bar": 2 }').to be_json including(foo: 1)
83
+
84
+ expect('["foo", "bar"]').to be_json a_kind_of(Array)
85
+ expect('["foo", "bar"]').to be_json matching(['foo', 'bar'])
86
+ expect('["foo", "bar"]').to be_json including('foo')
87
+ ```
88
+
89
+ When a hash or an array is given,
90
+ it's handled as `be_json matching(hash_or_array)` (`matching` is an alias of the `match` matcher):
91
+
92
+ ```ruby
93
+ # Equivalents
94
+ expect('{ "foo": 1, "bar": 2 }').to be_json(foo: 1, bar: 2)
95
+ expect('{ "foo": 1, "bar": 2 }').to be_json matching(foo: 1, bar: 2)
96
+ ```
97
+
98
+ You can compose matchers via given matchers:
99
+
100
+ ```ruby
101
+ expect('{ "foo": 1, "bar": 2 }').to be_json matching(
102
+ foo: a_kind_of(Integer),
103
+ bar: a_kind_of(Integer)
104
+ )
105
+
106
+ expect('{ "foo": 1, "bar": 2 }').to be_json including(foo: a_kind_of(Integer))
107
+ ```
108
+
109
+ For more practical example, see
110
+ [`spec/example_spec.rb`](https://github.com/yujinakayama/rspec-composable_json_matchers/blob/master/spec/example_spec.rb)
111
+ for the [GitHub Meta API](https://developer.github.com/v3/meta/).
112
+
113
+ ## Combinations with built-in matchers
114
+
115
+ Since decoded JSON is always a hash or an array, you may want to use any of the following built-in matchers.
116
+
117
+ Note that you can always use the `matching` matcher (internally uses `#===`)
118
+ instead of the `eq_to` matcher (internally uses `#==`),
119
+ because there's no objects that are parsed from JSON and behave differently between `#==` and `#===`.
120
+
121
+ Of course, any other custom matchers supporting a hash or an array can also be used.
122
+
123
+ ### `matching`
124
+
125
+ * Alias of [`match`](https://relishapp.com/rspec/rspec-expectations/docs/composing-matchers#composing-matchers-with-`match`:) matcher
126
+ * Supported structure: Hash and Array
127
+ * Accepts matchers as arguments: Yes
128
+
129
+ ```ruby
130
+ expect('{ "foo": 1, "bar": 2 }').to be_json matching(foo: 1, bar: a_kind_of(Integer))
131
+ expect('["foo", "bar"]').to be_json matching(['foo', a_string_starting_with('b')])
132
+ ```
133
+
134
+ ### `including`
135
+
136
+ * Alias of [`include`](https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/include-matcher#hash-usage) matcher
137
+ * Supported structure: Hash and Array
138
+ * Accepts matchers as arguments: Yes
139
+
140
+ ```ruby
141
+ expect('{ "foo": 1, "bar": 2 }').to be_json including(foo: 1)
142
+ expect('["foo", "bar"]').to be_json including('foo')
143
+ ```
144
+
145
+ ### `all`
146
+
147
+ * [`all`](https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/all-matcher) matcher
148
+ * Supported structure: Array
149
+ * Accepts matchers as arguments: Yes
150
+
151
+ ```ruby
152
+ expect('["foo", "bar"]').to be_json all be_a(String)
153
+ ```
154
+
155
+ ### `containing_exactly`
156
+
157
+ * Alias of [`contain_exactly`](https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/contain-exactly-matcher) matcher
158
+ * Supported structure: Array
159
+ * Accepts matchers as arguments: Yes
160
+
161
+ ```ruby
162
+ expect('["foo", "bar"]').to be_json containing_exactly('bar', 'foo')
163
+ ```
164
+
165
+ ### `starting_with`
166
+
167
+ * Alias of [`start_with`](https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/start-with-matcher) matcher
168
+ * Supported structure: Array
169
+ * Accepts matchers as arguments: Yes
170
+
171
+ ```ruby
172
+ expect('["foo", "bar"]').to be_json starting_with('foo')
173
+ ```
174
+
175
+ ### `ending_with`
176
+
177
+ * Alias of [`end_with`](https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/end-with-matcher) matcher
178
+ * Supported structure: Array
179
+ * Accepts matchers as arguments: Yes
180
+
181
+ ```ruby
182
+ expect('["foo", "bar"]').to be_json ending_with('bar')
183
+ ```
184
+
185
+ ### `a_kind_of`
186
+
187
+ * Alias of [`be_a_kind_of`](https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/type-matchers#be-(a-)kind-of-matcher) matcher
188
+ * Supported structure: Hash and Array
189
+ * Accepts matchers as arguments: No
190
+
191
+ ```ruby
192
+ expect('{}').to be_json a_kind_of(Hash)
193
+ expect('[]').to be_json a_kind_of(Array)
194
+ ```
195
+
196
+ ## Configuration
197
+
198
+ The `be_json` matcher internally uses
199
+ [`JSON.parse`](http://ruby-doc.org/stdlib-2.3.0/libdoc/json/rdoc/JSON.html#method-i-parse)
200
+ to decode JSON strings.
201
+ The default parser options used in the `be_json` matcher is `{ symbolize_names: true }`,
202
+ so you need to pass _a hash with symbol keys_ as an expected structure.
203
+
204
+ If you prefer string keys, add the following snippet to your `spec/spec_helper.rb`:
205
+
206
+ ```ruby
207
+ # spec/spec_helper.rb
208
+ RSpec::ComposableJSONMatchers.configure do |config|
209
+ config.parser_options = { symbolize_names: false }
210
+ end
211
+ ```
212
+
213
+ ## License
214
+
215
+ Copyright (c) 2016 Yuji Nakayama
216
+
217
+ See the [LICENSE.txt](LICENSE.txt) for details.
@@ -0,0 +1,12 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ require 'rubocop/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new do |task|
6
+ task.verbose = false
7
+ end
8
+
9
+ RuboCop::RakeTask.new
10
+
11
+ task default: [:spec, :rubocop]
12
+ task ci: [:spec, :rubocop]
@@ -0,0 +1,95 @@
1
+ require 'rspec/composable_json_matchers/be_json'
2
+ require 'rspec/composable_json_matchers/configuration'
3
+ require 'rspec/composable_json_matchers/version'
4
+
5
+ module RSpec
6
+ # Mix-in module for the `be_json` matcher.
7
+ #
8
+ # @example Make `be_json` matcher available everywhere
9
+ # # spec/spec_helper.rb
10
+ # require 'rspec/composable_json_matchers'
11
+ # RSpec.configure do |config|
12
+ # include RSpec::ComposableJSONMatchers
13
+ # end
14
+ #
15
+ # @example Make `be_json` matcher available only in specific example groups
16
+ # require 'rspec/composable_json_matchers'
17
+ # describe 'something' do
18
+ # include RSpec::ComposableJSONMatchers
19
+ # end
20
+ module ComposableJSONMatchers
21
+ class << self
22
+ # @api public
23
+ #
24
+ # Returns the current configuration.
25
+ #
26
+ # @return [RSpec::ComposableJSONMatchers::Configuration] the current configuration
27
+ #
28
+ # @see .configure
29
+ def configuration
30
+ @configuration ||= Configuration.new
31
+ end
32
+
33
+ # @api public
34
+ #
35
+ # Provides a block for configuring RSpec::ComposableJSONMatchers.
36
+ #
37
+ # @yieldparam config [RSpec::ComposableJSONMatchers::Configuration] the current configuration
38
+ #
39
+ # @return [void]
40
+ #
41
+ # @example
42
+ # # spec/spec_helper.rb
43
+ # RSpec::ComposableJSONMatchers.configure do |config|
44
+ # config.parser_options = { symbolize_names: false }
45
+ # end
46
+ #
47
+ # @see .configuration
48
+ def configure
49
+ yield configuration
50
+ end
51
+
52
+ # @api private
53
+ def reset!
54
+ @configuration = nil
55
+ end
56
+
57
+ # @api private
58
+ def matcher?(object)
59
+ begin
60
+ return false if object.respond_to?(:i_respond_to_everything_so_im_not_really_a_matcher)
61
+ rescue NoMethodError
62
+ return false
63
+ end
64
+
65
+ object.respond_to?(:matches?)
66
+ end
67
+ end
68
+
69
+ # @api public
70
+ #
71
+ # Passes if actual string can be decoded as JSON and the decoded structure passes the given
72
+ # matcher. When a hash is given, it's handled as `be_json matching(hash)` (`matching` is an
73
+ # alias of the [`match`](http://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/match-matcher)
74
+ # matcher).
75
+ #
76
+ # @param matcher_or_structure [#matches?, Hash, Array] a matcher object, a hash, or an array
77
+ #
78
+ # @example
79
+ # expect('{ "foo": 1, "bar": 2 }').to be_json(foo: 1, bar: 2)
80
+ # expect('{ "foo": 1, "bar": 2 }').to be_json(foo: 1, bar: a_kind_of(Integer))
81
+ # expect('{ "foo": 1, "bar": 2 }').to be_json matching(foo: 1, bar: 2)
82
+ # expect('{ "foo": 1, "bar": 2 }').to be_json including(foo: 1)
83
+ # expect('{ "foo": 1, "bar": 2 }').to be_json a_kind_of(Hash)
84
+ def be_json(matcher_or_structure)
85
+ if Hash === matcher_or_structure || Array === matcher_or_structure
86
+ matcher = matching(matcher_or_structure)
87
+ BeJSON.new(matcher, ComposableJSONMatchers.configuration)
88
+ elsif ComposableJSONMatchers.matcher?(matcher_or_structure)
89
+ BeJSON.new(matcher_or_structure, ComposableJSONMatchers.configuration)
90
+ else
91
+ raise ArgumentError, 'You must pass a matcher, a hash, or an array to `be_json` matcher.'
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,65 @@
1
+ module RSpec
2
+ module ComposableJSONMatchers
3
+ # @api private
4
+ class BeJSON
5
+ include RSpec::Matchers::Composable
6
+
7
+ attr_reader :matcher, :configuration, :original_actual, :decoded_actual, :parser_error
8
+
9
+ def initialize(matcher, configuration)
10
+ @matcher = matcher
11
+ @configuration = configuration
12
+ end
13
+
14
+ def matches?(actual)
15
+ @original_actual = actual
16
+ @decoded_actual = parse(original_actual)
17
+ matcher.matches?(decoded_actual)
18
+ rescue JSON::ParserError => error
19
+ @parser_error = error
20
+ false
21
+ end
22
+
23
+ def does_not_match?(actual)
24
+ matched = matches?(actual)
25
+ parser_error ? false : !matched
26
+ end
27
+
28
+ def description
29
+ "be JSON #{matcher.description}"
30
+ end
31
+
32
+ def failure_message
33
+ return parser_failure_message if parser_failure_message
34
+ "expected #{original_actual} to be JSON #{matcher.description}"
35
+ end
36
+
37
+ def failure_message_when_negated
38
+ return parser_failure_message if parser_failure_message
39
+ "expected #{original_actual} not to be JSON #{matcher.description}"
40
+ end
41
+
42
+ def diffable?
43
+ parser_error.nil? && matcher.diffable?
44
+ end
45
+
46
+ def expected
47
+ matcher.expected
48
+ end
49
+
50
+ alias actual decoded_actual
51
+
52
+ private
53
+
54
+ def parse(json)
55
+ require 'json'
56
+ JSON.parse(json, configuration.parser_options)
57
+ end
58
+
59
+ def parser_failure_message
60
+ return nil unless parser_error
61
+ "cannot parse #{original_actual.inspect} as JSON: #{parser_error.message}"
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,39 @@
1
+ module RSpec
2
+ module ComposableJSONMatchers
3
+ class Configuration
4
+ # @api public
5
+ #
6
+ # The default value of .parser_options.
7
+ #
8
+ # @see #parser_options
9
+ DEFAULT_PARSER_OPTIONS = { symbolize_names: true }.freeze
10
+
11
+ # @api public
12
+ #
13
+ # Returns the current options for JSON.parse used in the `be_json` matcher.
14
+ #
15
+ # @return [Hash] the current options for JSON.parse.
16
+ #
17
+ # @see #parser_options=
18
+ # @see http://ruby-doc.org/stdlib-2.3.0/libdoc/json/rdoc/JSON.html#method-i-parse
19
+ def parser_options
20
+ @parser_options ||= DEFAULT_PARSER_OPTIONS
21
+ end
22
+
23
+ # @api public
24
+ #
25
+ # Set the given hash as the option for JSON.parse used in the `be_json` matcher.
26
+ #
27
+ # @param hash [Hash] an option for JSON.parse
28
+ #
29
+ # @return [void]
30
+ #
31
+ # @see #parser_options
32
+ # @see http://ruby-doc.org/stdlib-2.3.0/libdoc/json/rdoc/JSON.html#method-i-parse
33
+ def parser_options=(hash)
34
+ raise ArgumentError, 'You must pass a hash to `parser_options=`.' unless hash.is_a?(Hash)
35
+ @parser_options = hash
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,2 @@
1
+ require 'rspec/composable_json_matchers'
2
+ RSpec.configuration.include(RSpec::ComposableJSONMatchers)
@@ -0,0 +1,14 @@
1
+ module RSpec
2
+ module ComposableJSONMatchers
3
+ # @api public
4
+ module Version
5
+ MAJOR = 1
6
+ MINOR = 0
7
+ PATCH = 0
8
+
9
+ def self.to_s
10
+ [MAJOR, MINOR, PATCH].join('.')
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rspec/composable_json_matchers/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'rspec-composable_json_matchers'
8
+ spec.version = RSpec::ComposableJSONMatchers::Version.to_s
9
+ spec.authors = ['Yuji Nakayama']
10
+ spec.email = ['nkymyj@gmail.com']
11
+
12
+ spec.summary = 'RSpec matchers for JSON strings with the power of ' \
13
+ 'built-in matchers and composable matchers'
14
+ spec.homepage = 'https://github.com/yujinakayama/rspec-composable_json_matchers'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = 'exe'
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.add_runtime_dependency 'rspec', '~> 3.0'
23
+
24
+ spec.add_development_dependency 'bundler', '~> 1.11'
25
+ end
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rspec-composable_json_matchers
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Yuji Nakayama
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-03-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.11'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.11'
41
+ description:
42
+ email:
43
+ - nkymyj@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".gitignore"
49
+ - ".rspec"
50
+ - ".rubocop.yml"
51
+ - ".travis.yml"
52
+ - ".yardopts"
53
+ - Gemfile
54
+ - LICENSE.txt
55
+ - README.md
56
+ - Rakefile
57
+ - lib/rspec/composable_json_matchers.rb
58
+ - lib/rspec/composable_json_matchers/be_json.rb
59
+ - lib/rspec/composable_json_matchers/configuration.rb
60
+ - lib/rspec/composable_json_matchers/setup.rb
61
+ - lib/rspec/composable_json_matchers/version.rb
62
+ - rspec-composable_json_matchers.gemspec
63
+ homepage: https://github.com/yujinakayama/rspec-composable_json_matchers
64
+ licenses:
65
+ - MIT
66
+ metadata: {}
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ requirements: []
82
+ rubyforge_project:
83
+ rubygems_version: 2.5.1
84
+ signing_key:
85
+ specification_version: 4
86
+ summary: RSpec matchers for JSON strings with the power of built-in matchers and composable
87
+ matchers
88
+ test_files: []
89
+ has_rdoc: