jsonapi_rspec 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8409f6d1d66e1c807057ae55f76b8fcbd2d22383
4
+ data.tar.gz: 94cf34c0cb18fdbd4b8c7ec1a3d90beb751da926
5
+ SHA512:
6
+ metadata.gz: 717a0dea8650593f11055f37b483bb53f4d57c516024cddce6ff344517d145b9aa78437479db856d46772a55c3cb6b30c5b88eba7b7dee6c43b0fbad485959a9
7
+ data.tar.gz: fef72061c50a0bb8f9f622e871015627f625125265621e14bb037d41070774c41ab49050e57ab06c85b4f8afb0ff1fc2596dc37d6838d0979a88b2f9bc5b94fb
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.3.1
5
+ before_install: bundle update
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in jsonapi_rspec.gemspec
6
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,71 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ jsonapi_rspec (0.1.0)
5
+ activesupport (>= 4.2.8)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ activesupport (5.1.4)
11
+ concurrent-ruby (~> 1.0, >= 1.0.2)
12
+ i18n (~> 0.7)
13
+ minitest (~> 5.1)
14
+ tzinfo (~> 1.1)
15
+ coderay (1.1.2)
16
+ concurrent-ruby (1.0.5)
17
+ diff-lcs (1.3)
18
+ docile (1.1.5)
19
+ i18n (0.8.6)
20
+ json (2.1.0)
21
+ method_source (0.8.2)
22
+ midwire_common (0.3.0)
23
+ thor (~> 0.19)
24
+ minitest (5.10.3)
25
+ pry (0.10.4)
26
+ coderay (~> 1.1.0)
27
+ method_source (~> 0.8.1)
28
+ slop (~> 3.4)
29
+ pry-nav (0.2.4)
30
+ pry (>= 0.9.10, < 0.11.0)
31
+ rack (2.0.3)
32
+ rake (10.5.0)
33
+ rspec (3.6.0)
34
+ rspec-core (~> 3.6.0)
35
+ rspec-expectations (~> 3.6.0)
36
+ rspec-mocks (~> 3.6.0)
37
+ rspec-core (3.6.0)
38
+ rspec-support (~> 3.6.0)
39
+ rspec-expectations (3.6.0)
40
+ diff-lcs (>= 1.2.0, < 2.0)
41
+ rspec-support (~> 3.6.0)
42
+ rspec-mocks (3.6.0)
43
+ diff-lcs (>= 1.2.0, < 2.0)
44
+ rspec-support (~> 3.6.0)
45
+ rspec-support (3.6.0)
46
+ simplecov (0.15.1)
47
+ docile (~> 1.1.0)
48
+ json (>= 1.8, < 3)
49
+ simplecov-html (~> 0.10.0)
50
+ simplecov-html (0.10.2)
51
+ slop (3.6.0)
52
+ thor (0.20.0)
53
+ thread_safe (0.3.6)
54
+ tzinfo (1.2.3)
55
+ thread_safe (~> 0.1)
56
+
57
+ PLATFORMS
58
+ ruby
59
+
60
+ DEPENDENCIES
61
+ bundler (~> 1.15.4)
62
+ jsonapi_rspec!
63
+ midwire_common (~> 0.1)
64
+ pry-nav (~> 0.2.4)
65
+ rack
66
+ rake (~> 10.0)
67
+ rspec (~> 3.0)
68
+ simplecov
69
+
70
+ BUNDLED WITH
71
+ 1.16.0.pre.3
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 Chris Blackburn
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.
data/README.md ADDED
@@ -0,0 +1,107 @@
1
+ # JsonapiRspec
2
+
3
+ [![Build Status](https://travis-ci.org/midwire/jsonapi_rspec.svg?branch=master)](https://travis-ci.org/midwire/jsonapi_rspec)
4
+
5
+ Match json:api formatted Rack::Response (or Rails controller response) to an instantiated object or ActiveRecord/ActiveModel object.
6
+
7
+ This project started because I wanted to be able to easily compare a json:api response to a model in my Rails API controllers, across several projects. Finding myself copying the code between projects, I decided to stick it all in a gem.
8
+
9
+ As such, it may not strictly suit your needs, but if you let me know I'll do my best to accommodate.
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ ```ruby
16
+ group :test do
17
+ gem 'jsonapi_rspec'
18
+ end
19
+ ```
20
+
21
+ And then execute:
22
+
23
+ $ bundle
24
+
25
+ ## Usage
26
+
27
+ In your controller specs:
28
+
29
+ ```ruby
30
+ my_model = MyModel.create(...)
31
+ get :show, params: { id: my_model.id }
32
+ expect(response).to be_jsonapi_response_for(my_model)
33
+ ```
34
+
35
+ It currently tests for required json:api sections and matching attributes for the passed model instance.
36
+ ```json
37
+ {
38
+ "jsonapi": "version 1.1", // does not check
39
+ "data":{ // checks if exists and is a hash
40
+ "id":"123", // checks if this matches the object.id
41
+ "type":"tags", // checks if exists and is the matching type for object
42
+ "attributes":{ // checks each attrib. against object attributes
43
+ "string_attribute":"Category",
44
+ "datetime_attribute":"2017-10-13T19:33:54+00:00",
45
+ "time_attribute":"2017-10-14 17:12:45 -0500",
46
+ "true_attribute":true,
47
+ "false_attribute":false,
48
+ "nil_attribute":null,
49
+ "fixnum_attribute":11,
50
+ "float_attribute":11.11,
51
+ "bignum_attribute":9999999999999999999999999999999,
52
+ "links":{ // does not check
53
+ "self":"http://test.host/api/v1/tag_types.123"
54
+ }
55
+ }
56
+ },
57
+ "included": [{ // does not check
58
+ "type": "users",
59
+ "id": 9,
60
+ "attributes": {
61
+ "first-name": "Dan",
62
+ "last-name": "Gebhardt",
63
+ "twitter": "dgeb"
64
+ },
65
+ "links": {
66
+ "self": "http://example.com/users/9"
67
+ }
68
+ }],
69
+ "meta":{ // does not check for existance by default
70
+ "copyright":"Copyright 2017 Chris Blackburn", // required if meta tag exists
71
+ "version":"v1" // required if meta tag exists
72
+ }
73
+ }
74
+ ```
75
+
76
+ ### Possible Failure Messages
77
+
78
+ * 'Response is an error'
79
+ * "Unexpected key in response: '#{key}'"
80
+ * 'Expected response to match an object instance but it is an empty string'
81
+ * "The 'data' section is missing or invalid"
82
+ * "Expected data:type '#{data_type}' to match: '#{object_type}'"
83
+ * "The 'meta' section is missing or invalid"
84
+ * "The 'meta:version' is missing"
85
+ * "The 'meta:copyright' is missing or invalid - regex: '/^Copyright.+\\d{4}/'"
86
+ * "Fix 'match_attribute?' method to handle: '#{obj_val_class_name}'" - please file an issue if you get this one.
87
+ * "Attribute: :#{attr_name} with a value of '#{json_val}'(#{json_val.class.name}) does not match object: '#{obj_val}'(#{obj_val.class.name})
88
+ * "Expected '#{value}' to match object id: '#{object_id}'"
89
+
90
+ See the specs for details.
91
+
92
+ ### Configuration
93
+
94
+ This is the only configuration option at the moment:
95
+
96
+ JsonapiRspec.configure do |config|
97
+ config.meta_required = false # default
98
+ end
99
+
100
+
101
+ ## Contributing
102
+
103
+ Bug reports and pull requests are welcome on GitHub at https://github.com/midwire/jsonapi_rspec.
104
+
105
+ ## License
106
+
107
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rspec/core/rake_task'
4
+ RSpec::Core::RakeTask.new(:spec)
5
+ task default: :spec
6
+
7
+ begin
8
+ require 'midwire_common/rake_tasks'
9
+ rescue StandardError => e
10
+ puts(">>> Can't load midwire_common/rake_tasks.")
11
+ puts(">>> Did you 'bundle exec'?: #{e.message}")
12
+ exit
13
+ end
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "jsonapi_rspec"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,33 @@
1
+
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'jsonapi_rspec/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'jsonapi_rspec'
8
+ spec.version = JsonapiRspec::VERSION
9
+ spec.authors = ['Chris Blackburn']
10
+ spec.email = ['chris@midwiretech.com']
11
+
12
+ spec.summary = 'Provides RSpec matchers for json:api related specs'
13
+ spec.description = spec.summary
14
+ spec.homepage = 'https://github.com/midwire/jsonapi_rspec'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
+ f.match(%r{^(test|spec|features)/})
19
+ end
20
+ spec.bindir = 'exe'
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ['lib']
23
+
24
+ spec.add_development_dependency 'bundler', '~> 1.15.4'
25
+ spec.add_development_dependency 'rake', '~> 10.0'
26
+ spec.add_development_dependency 'rspec', '~> 3.0'
27
+ spec.add_development_dependency 'pry-nav', '~> 0.2.4'
28
+ spec.add_development_dependency 'rack'
29
+ spec.add_development_dependency 'simplecov'
30
+ spec.add_development_dependency 'midwire_common', '~> 0.1'
31
+
32
+ spec.add_dependency 'activesupport', '>= 4.2.8'
33
+ end
@@ -0,0 +1,190 @@
1
+ require_relative 'string'
2
+ require 'active_support/all'
3
+
4
+ # Class BeJsonApiResponseFor provides custom RSpec matching for json:api
5
+ # responses for a given object instance. It checks attributes and elements
6
+ # iteratively and fails on the first mismatch that it finds.
7
+ #
8
+ # It expects a Rack::Response (or similar) object to be passed as the left-side
9
+ # of the comparison and a regular Object-derived instance as the right-side.
10
+ #
11
+ # Usage:
12
+ # expect(response).to BeJsonApiResponseFor.new(object_instance)
13
+ #
14
+ # @author Chris Blackburn <87a1779b@opayq.com>
15
+ #
16
+ class BeJsonApiResponseFor
17
+ def initialize(object_instance)
18
+ @object_instance = object_instance
19
+ end
20
+
21
+ def matches?(response)
22
+ return false unless valid_response?(response)
23
+
24
+ @parsed_response = JSON.parse(response.body)
25
+
26
+ return false if response_is_error?
27
+ return false unless valid_data_section?
28
+ if JsonapiRspec.configuration.meta_required
29
+ return false unless valid_meta_section?
30
+ end
31
+
32
+ @parsed_response.each do |key, value|
33
+ case key.to_sym
34
+ when :data
35
+ return false unless match_object?(value)
36
+ when :meta
37
+ return false unless valid_meta_section?
38
+ when :jsonapi
39
+ next # this can legally be anything
40
+ when :included
41
+ next # TODO: handle included objects
42
+ else
43
+ return set_failure_message("Unexpected key in response: '#{key}'")
44
+ end
45
+ end
46
+
47
+ true
48
+ end
49
+
50
+ def failure_message
51
+ @failure_message ||= "Expected object [#{@object_instance}] to match"
52
+ "#{@failure_message} - parsed response: #{pretty_response}"
53
+ end
54
+
55
+ def failure_message_when_negated
56
+ @failure_message = "handle method 'failure_message_when_negated' in custom_matchers.rb"
57
+ "#{@failure_message}: #{pretty_response}"
58
+ end
59
+
60
+ private
61
+
62
+ def pretty_response
63
+ JSON.pretty_generate(@parsed_response)
64
+ rescue JSON::GeneratorError
65
+ @parsed_response.to_s
66
+ end
67
+
68
+ # Set the failure message
69
+ #
70
+ # @param [String] msg Failure message
71
+ #
72
+ # @return [Boolean] always returns false
73
+ #
74
+ def set_failure_message(msg)
75
+ @failure_message = msg
76
+ false
77
+ end
78
+
79
+ def valid_response?(response)
80
+ if response.body == ''
81
+ return set_failure_message('Expected response to match an object instance but it is an empty string')
82
+ end
83
+ true
84
+ end
85
+
86
+ def valid_data_section?
87
+ unless @parsed_response.dig('data').is_a?(Hash)
88
+ return set_failure_message("The 'data' section is missing or invalid")
89
+ end
90
+ true
91
+ end
92
+
93
+ def valid_type?(data_type)
94
+ object_type = @object_instance.class.name.underscore.dasherize.pluralize
95
+ unless data_type == object_type
96
+ return set_failure_message("Expected data:type '#{data_type}' to match: '#{object_type}'")
97
+ end
98
+ true
99
+ end
100
+
101
+ def valid_meta_section?
102
+ meta = @parsed_response.dig('meta')
103
+ return set_failure_message("The 'meta' section is missing or invalid") unless meta.is_a?(Hash)
104
+ return set_failure_message("The 'meta:version' is missing") if meta.dig('version').nil?
105
+ unless meta.dig('copyright') =~ /^Copyright.+\d{4}/
106
+ return set_failure_message("The 'meta:copyright' is missing or invalid - regex: '/^Copyright.+\\d{4}/'")
107
+ end
108
+ true
109
+ end
110
+
111
+ def response_is_error?
112
+ is_error = !@parsed_response.dig('errors').nil?
113
+ set_failure_message('Response is an error') if is_error
114
+ is_error
115
+ end
116
+
117
+ def match_attribute?(attr_name, json_val)
118
+ obj_val = @object_instance.send(attr_name.to_sym)
119
+ obj_val_class_name = obj_val.class.name
120
+
121
+ case obj_val_class_name
122
+ when 'Float'
123
+ matched = obj_val == json_val.to_f
124
+ when 'DateTime'
125
+ matched = obj_val.to_i == DateTime.parse(json_val).to_i
126
+ when 'Time'
127
+ matched = obj_val.to_i == Time.parse(json_val).to_i
128
+ when 'String', 'NilClass', 'TrueClass', 'FalseClass', 'Fixnum', 'Integer', 'Bignum'
129
+ matched = obj_val == json_val
130
+ else
131
+ return set_failure_message("Fix 'match_attribute?' method to handle: '#{obj_val_class_name}'")
132
+ end
133
+
134
+ unless matched
135
+ return set_failure_message(
136
+ <<-STRING.here_with_pipe!(' ')
137
+ |Attribute: :#{attr_name}
138
+ |with a value of '#{json_val}'(#{json_val.class.name})
139
+ |does not match object: '#{obj_val}'(#{obj_val.class.name})
140
+ STRING
141
+ )
142
+ end
143
+ true
144
+ end
145
+
146
+ def match_object?(values)
147
+ values.each do |key, value|
148
+ case key.to_sym
149
+ when :id
150
+ object_id = @object_instance.send(key)
151
+ unless object_id == value.to_i
152
+ return set_failure_message("Expected '#{value}' to match object id: '#{object_id}'")
153
+ end
154
+ when :type
155
+ return false unless valid_type?(value)
156
+ when :attributes
157
+ value.each do |attr, val|
158
+ attribute = attr.underscore
159
+ next if attr.to_sym == :links # skip link validation
160
+ # return false unless @object_instance.send(attribute) == val
161
+ return false unless match_attribute?(attribute, val)
162
+ end
163
+ when :relationships
164
+ next # skip relationships validation
165
+ else
166
+ fail "Invalid attribute: '#{key}'"
167
+ end
168
+ end
169
+ true
170
+ end
171
+ end
172
+
173
+ # Usage:
174
+ # expect(response).to be_jsonapi_response_for(object_instance)
175
+ #
176
+ RSpec::Matchers.define :be_jsonapi_response_for do |object|
177
+ match do |actual_response|
178
+ @instance = BeJsonApiResponseFor.new(object)
179
+
180
+ def failure_message
181
+ @instance.failure_message
182
+ end
183
+
184
+ def failure_message_when_negated
185
+ @instance.failure_message
186
+ end
187
+
188
+ @instance.matches?(actual_response)
189
+ end
190
+ end
@@ -0,0 +1,9 @@
1
+ module JsonapiRspec
2
+ class Configuration
3
+ attr_accessor :meta_required
4
+
5
+ def initialize
6
+ @meta_required = false
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,22 @@
1
+ class String
2
+ # Helper for the heredoc functionality. Allows pipe '|' delimeted heredocs
3
+ # with a parameterized delimeter.
4
+ #
5
+ # Example:
6
+ # html = <<-stop.here_with_pipe(delimeter="\n")
7
+ # |<!-- Begin: comment -->
8
+ # |<script type="text/javascript">
9
+ # stop
10
+ # html == '<!-- Begin: comment -->\n<script type="text/javascript">'
11
+ #
12
+ # @param [String] delimeter Joins the lines of strings with this delimeter.
13
+ #
14
+ # @return [String] Returns the concatenated string.
15
+ #
16
+ def here_with_pipe!(delimeter = ' ')
17
+ lines = split("\n")
18
+ lines.map! { |c| c.sub!(/\s*\|/, '') }
19
+ new_string = lines.join(delimeter)
20
+ replace(new_string)
21
+ end
22
+ end
@@ -0,0 +1,3 @@
1
+ module JsonapiRspec
2
+ VERSION = '0.1.0'.freeze
3
+ end
@@ -0,0 +1,21 @@
1
+ require 'jsonapi_rspec/version'
2
+ require 'jsonapi_rspec/be_json_api_response_for'
3
+
4
+ module JsonapiRspec
5
+ class << self
6
+ attr_accessor :configuration
7
+
8
+ def root
9
+ Pathname.new(File.dirname(__FILE__)).parent
10
+ end
11
+
12
+ def configure
13
+ self.configuration ||= Configuration.new
14
+ yield(configuration)
15
+ end
16
+ end
17
+
18
+ autoload :Configuration, 'jsonapi_rspec/configuration'
19
+ end
20
+
21
+ JsonapiRspec.configure {} # initialize the configuration
metadata ADDED
@@ -0,0 +1,172 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jsonapi_rspec
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Chris Blackburn
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-10-17 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.15.4
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.15.4
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: pry-nav
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.2.4
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.2.4
69
+ - !ruby/object:Gem::Dependency
70
+ name: rack
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: simplecov
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: midwire_common
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.1'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.1'
111
+ - !ruby/object:Gem::Dependency
112
+ name: activesupport
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 4.2.8
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: 4.2.8
125
+ description: Provides RSpec matchers for json:api related specs
126
+ email:
127
+ - chris@midwiretech.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".gitignore"
133
+ - ".rspec"
134
+ - ".travis.yml"
135
+ - Gemfile
136
+ - Gemfile.lock
137
+ - LICENSE.txt
138
+ - README.md
139
+ - Rakefile
140
+ - bin/console
141
+ - bin/setup
142
+ - jsonapi_rspec.gemspec
143
+ - lib/jsonapi_rspec.rb
144
+ - lib/jsonapi_rspec/be_json_api_response_for.rb
145
+ - lib/jsonapi_rspec/configuration.rb
146
+ - lib/jsonapi_rspec/string.rb
147
+ - lib/jsonapi_rspec/version.rb
148
+ homepage: https://github.com/midwire/jsonapi_rspec
149
+ licenses:
150
+ - MIT
151
+ metadata: {}
152
+ post_install_message:
153
+ rdoc_options: []
154
+ require_paths:
155
+ - lib
156
+ required_ruby_version: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ required_rubygems_version: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ requirements: []
167
+ rubyforge_project:
168
+ rubygems_version: 2.5.1
169
+ signing_key:
170
+ specification_version: 4
171
+ summary: Provides RSpec matchers for json:api related specs
172
+ test_files: []