openapi_first 2.2.0 → 2.2.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 +4 -4
- data/CHANGELOG.md +9 -0
- data/lib/openapi_first/builder.rb +11 -2
- data/lib/openapi_first/json.rb +0 -1
- data/lib/openapi_first/ref_resolver.rb +12 -4
- data/lib/openapi_first/test/methods.rb +9 -10
- data/lib/openapi_first/test/minitest_helpers.rb +28 -0
- data/lib/openapi_first/test/plain_helpers.rb +26 -0
- data/lib/openapi_first/test.rb +6 -0
- data/lib/openapi_first/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: de3cced92ef56a41399e4baa7aaf2b42250d2d3e532a22b245edd70d2b7446d2
|
|
4
|
+
data.tar.gz: b433a7d18c02176dda8ce12ff41636d4f19bd99632cbc0085879e34b3090cb76
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 58613cfd3648073dee3189cfced111adcdfd4471ee67a07517d3c800c69aded0ab46b50a69d56fda453a2af9078db74ee45c260c601c16cdd2896428d330068b
|
|
7
|
+
data.tar.gz: ae57aa8b109569165e9bb9ce3e9eb380e387a0eb1afb3cde850f7a2d3979391dc62ebe567cacb51492aefe4d9ef2db2db8963c4ca2b256cbf0c5b3e9491a2de3
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 2.2.2
|
|
6
|
+
|
|
7
|
+
- Fix parsing parameters with referenced schemas (https://github.com/ahx/openapi_first/issues/316)
|
|
8
|
+
|
|
9
|
+
## 2.2.1
|
|
10
|
+
|
|
11
|
+
- Fix issue with $ref resolving paths poiting outside directories `$ref: '../a/b.yaml'` (https://github.com/ahx/openapi_first/issues/313)
|
|
12
|
+
- Remove warning about missing assertions when using assert_api_conform ([https://github.com/ahx/openapi_first/issues/313](https://github.com/ahx/openapi_first/issues/312))
|
|
13
|
+
|
|
5
14
|
## 2.2.0
|
|
6
15
|
|
|
7
16
|
- Fix support for discriminator in response bodies if no mapping is defined (https://github.com/ahx/openapi_first/issues/285)
|
|
@@ -47,10 +47,11 @@ module OpenapiFirst
|
|
|
47
47
|
def router # rubocop:disable Metrics/MethodLength
|
|
48
48
|
router = OpenapiFirst::Router.new
|
|
49
49
|
@contents.fetch('paths').each do |path, path_item_object|
|
|
50
|
+
path_parameters = resolve_parameters(path_item_object['parameters'])
|
|
50
51
|
path_item_object.resolved.keys.intersection(REQUEST_METHODS).map do |request_method|
|
|
51
52
|
operation_object = path_item_object[request_method]
|
|
52
|
-
|
|
53
|
-
parameters = parse_parameters(
|
|
53
|
+
operation_parameters = resolve_parameters(operation_object['parameters'])
|
|
54
|
+
parameters = parse_parameters(operation_parameters.chain(path_parameters))
|
|
54
55
|
|
|
55
56
|
build_requests(path:, request_method:, operation_object:,
|
|
56
57
|
parameters:).each do |request|
|
|
@@ -89,6 +90,14 @@ module OpenapiFirst
|
|
|
89
90
|
)
|
|
90
91
|
end
|
|
91
92
|
|
|
93
|
+
def resolve_parameters(parameters)
|
|
94
|
+
parameters&.map do |parameter|
|
|
95
|
+
result = parameter.resolved
|
|
96
|
+
result['schema'] = parameter['schema'].resolved
|
|
97
|
+
result
|
|
98
|
+
end.to_a
|
|
99
|
+
end
|
|
100
|
+
|
|
92
101
|
def build_parameter_schema(parameters)
|
|
93
102
|
schema = build_parameters_schema(parameters)
|
|
94
103
|
|
data/lib/openapi_first/json.rb
CHANGED
|
@@ -40,7 +40,7 @@ module OpenapiFirst
|
|
|
40
40
|
def initialize(value, context: value, dir: nil)
|
|
41
41
|
@value = value
|
|
42
42
|
@context = context
|
|
43
|
-
@dir = dir
|
|
43
|
+
@dir = (dir && File.absolute_path(dir)) || Dir.pwd
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
# The value of this node
|
|
@@ -108,15 +108,17 @@ module OpenapiFirst
|
|
|
108
108
|
|
|
109
109
|
def schema(options = {})
|
|
110
110
|
ref_resolver = JSONSchemer::CachedResolver.new do |uri|
|
|
111
|
-
FileLoader.load(
|
|
111
|
+
FileLoader.load(uri.path)
|
|
112
112
|
end
|
|
113
|
-
|
|
114
|
-
JSONSchemer::Schema.new(
|
|
113
|
+
base_uri = URI::File.build({ path: "#{dir}/" })
|
|
114
|
+
root = JSONSchemer::Schema.new(context, base_uri:, ref_resolver:, **options)
|
|
115
|
+
JSONSchemer::Schema.new(value, nil, root, base_uri:, **options)
|
|
115
116
|
end
|
|
116
117
|
end
|
|
117
118
|
|
|
118
119
|
# @visibility private
|
|
119
120
|
class Array
|
|
121
|
+
include Enumerable
|
|
120
122
|
include Resolvable
|
|
121
123
|
include Diggable
|
|
122
124
|
|
|
@@ -127,6 +129,12 @@ module OpenapiFirst
|
|
|
127
129
|
RefResolver.for(item, dir:, context:)
|
|
128
130
|
end
|
|
129
131
|
|
|
132
|
+
def each
|
|
133
|
+
resolved.each do |item|
|
|
134
|
+
yield RefResolver.for(item, dir:, context:)
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
130
138
|
def resolved
|
|
131
139
|
value.map do |item|
|
|
132
140
|
if item.respond_to?(:key?) && item.key?('$ref')
|
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative 'minitest_helpers'
|
|
4
|
+
require_relative 'plain_helpers'
|
|
5
|
+
|
|
3
6
|
module OpenapiFirst
|
|
7
|
+
# Test integration
|
|
4
8
|
module Test
|
|
5
9
|
# Methods to use in integration tests
|
|
6
10
|
module Methods
|
|
7
|
-
def
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
raise OpenapiFirst::Error,
|
|
13
|
-
"Expected status #{status}, but got #{response.status} " \
|
|
14
|
-
"from #{request.request_method.upcase} #{request.path}."
|
|
11
|
+
def self.included(base)
|
|
12
|
+
if Test.minitest?(base)
|
|
13
|
+
base.include(OpenapiFirst::Test::MinitestHelpers)
|
|
14
|
+
else
|
|
15
|
+
base.include(OpenapiFirst::Test::PlainHelpers)
|
|
15
16
|
end
|
|
16
|
-
api.validate_request(request, raise_error: true)
|
|
17
|
-
api.validate_response(request, response, raise_error: true)
|
|
18
17
|
end
|
|
19
18
|
end
|
|
20
19
|
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module OpenapiFirst
|
|
4
|
+
module Test
|
|
5
|
+
# Assertion methods for Minitest
|
|
6
|
+
module MinitestHelpers
|
|
7
|
+
# :nocov:
|
|
8
|
+
def assert_api_conform(status: nil, api: :default)
|
|
9
|
+
api = OpenapiFirst::Test[api]
|
|
10
|
+
request = respond_to?(:last_request) ? last_request : @request
|
|
11
|
+
response = respond_to?(:last_response) ? last_response : @response
|
|
12
|
+
|
|
13
|
+
if status
|
|
14
|
+
assert_equal status, response.status,
|
|
15
|
+
"Expected status #{status}, but got #{response.status} " \
|
|
16
|
+
"from #{request.request_method.upcase} #{request.path}."
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
validated_request = api.validate_request(request, raise_error: false)
|
|
20
|
+
validated_response = api.validate_response(request, response, raise_error: false)
|
|
21
|
+
|
|
22
|
+
assert validated_request.valid?, validated_request.error&.exception_message
|
|
23
|
+
assert validated_response.valid?, validated_response.error&.exception_message
|
|
24
|
+
end
|
|
25
|
+
# :nocov:
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module OpenapiFirst
|
|
4
|
+
module Test
|
|
5
|
+
# Assertion methods to use when no known test framework was found
|
|
6
|
+
# These methods just raise an exception if an error was found
|
|
7
|
+
module PlainHelpers
|
|
8
|
+
def assert_api_conform(status: nil, api: :default)
|
|
9
|
+
api = OpenapiFirst::Test[api]
|
|
10
|
+
# :nocov:
|
|
11
|
+
request = respond_to?(:last_request) ? last_request : @request
|
|
12
|
+
response = respond_to?(:last_response) ? last_response : @response
|
|
13
|
+
# :nocov:
|
|
14
|
+
|
|
15
|
+
if status && status != response.status
|
|
16
|
+
raise OpenapiFirst::Error,
|
|
17
|
+
"Expected status #{status}, but got #{response.status} " \
|
|
18
|
+
"from #{request.request_method.upcase} #{request.path}."
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
api.validate_request(request, raise_error: true)
|
|
22
|
+
api.validate_response(request, response, raise_error: true)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
data/lib/openapi_first/test.rb
CHANGED
|
@@ -5,6 +5,12 @@ require_relative 'test/methods'
|
|
|
5
5
|
module OpenapiFirst
|
|
6
6
|
# Test integration
|
|
7
7
|
module Test
|
|
8
|
+
def self.minitest?(base)
|
|
9
|
+
base.include?(::Minitest::Assertions)
|
|
10
|
+
rescue NameError
|
|
11
|
+
false
|
|
12
|
+
end
|
|
13
|
+
|
|
8
14
|
class NotRegisteredError < StandardError; end
|
|
9
15
|
|
|
10
16
|
DEFINITIONS = {} # rubocop:disable Style/MutableConstant
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: openapi_first
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.2.
|
|
4
|
+
version: 2.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Andreas Haller
|
|
8
8
|
bindir: bin
|
|
9
9
|
cert_chain: []
|
|
10
|
-
date: 2025-01-
|
|
10
|
+
date: 2025-01-21 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
12
|
- !ruby/object:Gem::Dependency
|
|
13
13
|
name: hana
|
|
@@ -124,6 +124,8 @@ files:
|
|
|
124
124
|
- lib/openapi_first/schema/validation_result.rb
|
|
125
125
|
- lib/openapi_first/test.rb
|
|
126
126
|
- lib/openapi_first/test/methods.rb
|
|
127
|
+
- lib/openapi_first/test/minitest_helpers.rb
|
|
128
|
+
- lib/openapi_first/test/plain_helpers.rb
|
|
127
129
|
- lib/openapi_first/validated_request.rb
|
|
128
130
|
- lib/openapi_first/validated_response.rb
|
|
129
131
|
- lib/openapi_first/validators/request_body.rb
|