openapi_contracts 0.14.0 → 0.16.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6a860586af31ca0bcf61a9301dba60df4466d367a495efbb306498eb71496f09
4
- data.tar.gz: d74042e38633c207a4410ba6e961e68ed206f4b9d3a0d1fe0ea8d8aa1f4f4982
3
+ metadata.gz: 04f75eda460ed18d448950e07a369562fb8b6f8b93127f311d8a42756f7d3a3f
4
+ data.tar.gz: 92527099886fe57922ffbd87c9fff3fffdae96f1a56beb59a59a1a6e7362b1f0
5
5
  SHA512:
6
- metadata.gz: 0bdddf66b9418f3374179566ebccfa5d7abad647708557ce5ec176afe620cbfcf79102743ffff6d293503278eeaccd8465e0a8627ff03b646b44c2c0aeb7e8f4
7
- data.tar.gz: 9c0e8a0ba61f44bb8bde129524531a7a60918c9ff5fc23072c3d547a23a70ae45ef1e1a0983dc48b0ff2f57c8caf4e5998b5c80088d08aa645c99ccc0ed9acf6
6
+ metadata.gz: 46eff36fa87371d04173b695fcf82f0f613685c0a1a87cd74988f72dde2d439c1b86c664fdc183f172f0b25c2bf7c0d196d7d9e3876f10bbb60c52ec6524fca1
7
+ data.tar.gz: a4e7e55983e3acdffbc2e18af27910792156396d5af7274cff178dba6386bd51e0250c27f510a33cf21063eae3cba17e1d2103f243c07296d538eb279be877c7
@@ -36,4 +36,5 @@ module OpenapiContracts
36
36
 
37
37
  PayloadParser.register(%r{(/|\+)json$}, ->(raw) { JSON(raw) })
38
38
  PayloadParser.register('application/x-www-form-urlencoded', ->(raw) { Rack::Utils.parse_nested_query(raw) })
39
+ PayloadParser.register(%r{^text/}, ->(raw) { raw })
39
40
  end
@@ -1,3 +1,5 @@
1
+ require 'rspec/matchers'
2
+
1
3
  RSpec::Matchers.define :match_openapi_doc do |doc, options = {}| # rubocop:disable Metrics/BlockLength
2
4
  include OpenapiContracts::Helper
3
5
 
@@ -27,7 +29,9 @@ RSpec::Matchers.define :match_openapi_doc do |doc, options = {}| # rubocop:disab
27
29
 
28
30
  def with_http_status(status)
29
31
  if status.is_a? Symbol
30
- @status = Rack::Utils::SYMBOL_TO_STATUS_CODE[status]
32
+ @status = Rack::Utils::SYMBOL_TO_STATUS_CODE.fetch(status) do
33
+ raise ArgumentError, "Unknown status #{status.inspect}"
34
+ end
31
35
  else
32
36
  @status = status
33
37
  end
@@ -9,12 +9,35 @@ module OpenapiContracts::Validators
9
9
  def validate
10
10
  spec.headers.each do |header|
11
11
  value = response.headers[header.name]
12
+
13
+ # Rack 3.0.0 returns an Array for multi-value headers. OpenAPI doesn't
14
+ # support multi-value headers, so we join them into a single string.
15
+ #
16
+ # @see https://github.com/rack/rack/issues/1598
17
+ value = value.join("\n") if value.is_a?(Array)
18
+
12
19
  if value.blank?
13
20
  @errors << "Missing header #{header.name}" if header.required?
14
- elsif !JSONSchemer.schema(header.schema).valid?(value)
15
- @errors << "Header #{header.name} does not match"
21
+ else
22
+ schemer = JSONSchemer.schema(header.schema)
23
+ unless schemer.valid?(value)
24
+ validation_errors = schemer.validate(value).to_a
25
+ @errors << validation_error_message(header, value, validation_errors)
26
+ end
16
27
  end
17
28
  end
18
29
  end
30
+
31
+ def validation_error_message(header, value, error_array)
32
+ if error_array.empty?
33
+ "Header #{header.name} does not match schema"
34
+ else
35
+ error_array.map { |error|
36
+ error_message = "Header #{header.name} validation error: #{error['error']}"
37
+ truncated_value = value.to_s.truncate(100)
38
+ error_message + " (value: #{truncated_value})"
39
+ }.join("\n")
40
+ end
41
+ end
19
42
  end
20
43
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openapi_contracts
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.16.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - mkon
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-06-25 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: activesupport
@@ -19,7 +18,7 @@ dependencies:
19
18
  version: '6.1'
20
19
  - - "<"
21
20
  - !ruby/object:Gem::Version
22
- version: '8'
21
+ version: '8.1'
23
22
  type: :runtime
24
23
  prerelease: false
25
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,27 +28,27 @@ dependencies:
29
28
  version: '6.1'
30
29
  - - "<"
31
30
  - !ruby/object:Gem::Version
32
- version: '8'
31
+ version: '8.1'
33
32
  - !ruby/object:Gem::Dependency
34
33
  name: json_schemer
35
34
  requirement: !ruby/object:Gem::Requirement
36
35
  requirements:
37
36
  - - ">="
38
37
  - !ruby/object:Gem::Version
39
- version: '2'
38
+ version: '2.1'
40
39
  - - "<"
41
40
  - !ruby/object:Gem::Version
42
- version: '2.2'
41
+ version: '2.5'
43
42
  type: :runtime
44
43
  prerelease: false
45
44
  version_requirements: !ruby/object:Gem::Requirement
46
45
  requirements:
47
46
  - - ">="
48
47
  - !ruby/object:Gem::Version
49
- version: '2'
48
+ version: '2.1'
50
49
  - - "<"
51
50
  - !ruby/object:Gem::Version
52
- version: '2.2'
51
+ version: '2.5'
53
52
  - !ruby/object:Gem::Dependency
54
53
  name: openapi_parameters
55
54
  requirement: !ruby/object:Gem::Requirement
@@ -118,28 +117,28 @@ dependencies:
118
117
  requirements:
119
118
  - - '='
120
119
  - !ruby/object:Gem::Version
121
- version: 1.64.1
120
+ version: 1.72.1
122
121
  type: :development
123
122
  prerelease: false
124
123
  version_requirements: !ruby/object:Gem::Requirement
125
124
  requirements:
126
125
  - - '='
127
126
  - !ruby/object:Gem::Version
128
- version: 1.64.1
127
+ version: 1.72.1
129
128
  - !ruby/object:Gem::Dependency
130
129
  name: rubocop-rspec
131
130
  requirement: !ruby/object:Gem::Requirement
132
131
  requirements:
133
132
  - - '='
134
133
  - !ruby/object:Gem::Version
135
- version: 2.31.0
134
+ version: 3.7.0
136
135
  type: :development
137
136
  prerelease: false
138
137
  version_requirements: !ruby/object:Gem::Requirement
139
138
  requirements:
140
139
  - - '='
141
140
  - !ruby/object:Gem::Version
142
- version: 2.31.0
141
+ version: 3.7.0
143
142
  - !ruby/object:Gem::Dependency
144
143
  name: simplecov
145
144
  requirement: !ruby/object:Gem::Requirement
@@ -154,7 +153,6 @@ dependencies:
154
153
  - - "~>"
155
154
  - !ruby/object:Gem::Version
156
155
  version: 0.22.0
157
- description:
158
156
  email:
159
157
  - konstantin@munteanu.de
160
158
  executables: []
@@ -199,7 +197,6 @@ licenses:
199
197
  - MIT
200
198
  metadata:
201
199
  rubygems_mfa_required: 'true'
202
- post_install_message:
203
200
  rdoc_options: []
204
201
  require_paths:
205
202
  - lib
@@ -207,18 +204,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
207
204
  requirements:
208
205
  - - ">="
209
206
  - !ruby/object:Gem::Version
210
- version: '3.1'
207
+ version: '3.2'
211
208
  - - "<"
212
209
  - !ruby/object:Gem::Version
213
- version: '3.4'
210
+ version: '3.5'
214
211
  required_rubygems_version: !ruby/object:Gem::Requirement
215
212
  requirements:
216
213
  - - ">="
217
214
  - !ruby/object:Gem::Version
218
215
  version: '0'
219
216
  requirements: []
220
- rubygems_version: 3.5.11
221
- signing_key:
217
+ rubygems_version: 3.6.9
222
218
  specification_version: 4
223
219
  summary: Openapi schemas as API contracts
224
220
  test_files: []