openapi_parser 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 +6 -0
- data/README.md +5 -5
- data/SECURITY.md +6 -0
- data/lib/openapi_parser/errors.rb +22 -0
- data/lib/openapi_parser/request_operation.rb +2 -1
- data/lib/openapi_parser/schema_validator/all_of_validator.rb +17 -0
- data/lib/openapi_parser/schema_validator/object_validator.rb +8 -4
- data/lib/openapi_parser/schema_validator/properties_number.rb +30 -0
- data/lib/openapi_parser/schema_validator/string_validator.rb +2 -0
- data/lib/openapi_parser/schema_validator.rb +1 -0
- data/lib/openapi_parser/schemas/response.rb +9 -2
- data/lib/openapi_parser/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: ee47209ddc3182fdab488acfbda8e2fd628ab0bd0979bd04e60fcbf7f71365f3
|
4
|
+
data.tar.gz: 66a4c16d27ddeffd927ec5df1124572d3c885c3759630f0cae3edb9a122355f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a7d3ec2c6e75fa903203dbae2a607f152e59e1299ab053df8923b9c8b69539a89dfa98a757481d8cb8dedec7e8e362c1f13f01a7087baff6dd017cd2c3dc3e9
|
7
|
+
data.tar.gz: 19cd5e1d6079c0b69f2ed4e849cc23a0d7b7e67fd780ad4cf2bb430d9ffbe86d4f84c36c8173e74f25905460c51af4d579f2fe19f3db215837ddef763c1fd1da
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
## Unreleased
|
2
2
|
|
3
|
+
## 2.2.2 (2024-11-21)
|
4
|
+
* make content-type lookup case-insensitive #178
|
5
|
+
|
6
|
+
## 2.2.1 (2024-10-23)
|
7
|
+
* revert schemas validation in additionalProperties and remove additionalProperties logic from allof (breaking things for me, will revisit)
|
8
|
+
|
3
9
|
## 2.2.0 (2024-10-23)
|
4
10
|
### Fixed
|
5
11
|
* support schemas validation in additionalProperties and remove additionalProperties logic from allof
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
[](https://www.rubydoc.info/gems/openapi_parser)
|
5
5
|
[](https://inch-ci.org/github/ota42y/openapi_parser)
|
6
6
|
|
7
|
-
This is OpenAPI3 parser and validator.
|
7
|
+
This is OpenAPI3 parser and validator.
|
8
8
|
|
9
9
|
## Usage
|
10
10
|
|
@@ -27,8 +27,8 @@ request_operation.path_params
|
|
27
27
|
# => {"template_name"=>"1"}
|
28
28
|
|
29
29
|
# coerce parameter
|
30
|
-
root = OpenAPIParser.parse(YAML.load_file('open_api_3/schema.yml'), {coerce_value: true, datetime_coerce_class: DateTime})
|
31
|
-
request_operation = root.request_operation(:get, '/string_params_coercer')
|
30
|
+
root = OpenAPIParser.parse(YAML.load_file('open_api_3/schema.yml'), {coerce_value: true, datetime_coerce_class: DateTime})
|
31
|
+
request_operation = root.request_operation(:get, '/string_params_coercer')
|
32
32
|
request_operation.validate_request_parameter({'integer_1' => '1', 'datetime_string' => '2016-04-01T16:00:00+09:00'})
|
33
33
|
# => {"integer_1"=>1, "datetime_string"=>#<DateTime: 2016-04-01T16:00:00+09:00 ((2457480j,25200s,0n),+32400s,2299161j)>
|
34
34
|
# convert number string to Integer and datetime string to DateTime class
|
@@ -52,7 +52,7 @@ Or install it yourself as:
|
|
52
52
|
$ gem install openapi_parser
|
53
53
|
|
54
54
|
## Additional features
|
55
|
-
OpenAPI Parser's validation based on [OpenAPI spec](https://github.com/OAI/OpenAPI-Specification)
|
55
|
+
OpenAPI Parser's validation based on [OpenAPI spec](https://github.com/OAI/OpenAPI-Specification)
|
56
56
|
But we support few useful features.
|
57
57
|
|
58
58
|
### type validation
|
@@ -109,4 +109,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
109
109
|
|
110
110
|
## Code of Conduct
|
111
111
|
|
112
|
-
Everyone interacting in the OpenAPIParser project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/
|
112
|
+
Everyone interacting in the OpenAPIParser project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/ota42y/openapi_parser/blob/master/CODE_OF_CONDUCT.md).
|
data/SECURITY.md
ADDED
@@ -160,6 +160,28 @@ module OpenAPIParser
|
|
160
160
|
end
|
161
161
|
end
|
162
162
|
|
163
|
+
class LessThanMinProperties < OpenAPIError
|
164
|
+
def initialize(value, reference)
|
165
|
+
super(reference)
|
166
|
+
@value = value
|
167
|
+
end
|
168
|
+
|
169
|
+
def message
|
170
|
+
"#{@reference} #{@value.size} is less than minProperties value"
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
class MoreThanMaxProperties < OpenAPIError
|
175
|
+
def initialize(value, reference)
|
176
|
+
super(reference)
|
177
|
+
@value = value
|
178
|
+
end
|
179
|
+
|
180
|
+
def message
|
181
|
+
"#{@reference} #{@value.size} is more than maxProperties value"
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
163
185
|
class InvalidPattern < OpenAPIError
|
164
186
|
def initialize(value, pattern, reference, example)
|
165
187
|
super(reference)
|
@@ -78,7 +78,8 @@ class OpenAPIParser::RequestOperation
|
|
78
78
|
end
|
79
79
|
|
80
80
|
def content_type
|
81
|
-
headers
|
81
|
+
content_type_key = headers.keys.detect { |k| k.casecmp?('Content-Type') }
|
82
|
+
headers[content_type_key].to_s.split(';').first.to_s
|
82
83
|
end
|
83
84
|
end
|
84
85
|
end
|
@@ -10,6 +10,8 @@ class OpenAPIParser::SchemaValidator
|
|
10
10
|
end
|
11
11
|
|
12
12
|
# if any schema return error, it's not valida all of value
|
13
|
+
remaining_keys = value.kind_of?(Hash) ? value.keys : []
|
14
|
+
nested_additional_properties = false
|
13
15
|
schema.all_of.each do |s|
|
14
16
|
# We need to store the reference to all of, so we can perform strict check on allowed properties
|
15
17
|
_coerced, err = validatable.validate_schema(
|
@@ -18,9 +20,24 @@ class OpenAPIParser::SchemaValidator
|
|
18
20
|
:parent_all_of => true,
|
19
21
|
parent_discriminator_schemas: keyword_args[:parent_discriminator_schemas]
|
20
22
|
)
|
23
|
+
|
24
|
+
if s.type == "object"
|
25
|
+
remaining_keys -= (s.properties || {}).keys
|
26
|
+
nested_additional_properties = true if s.additional_properties
|
27
|
+
else
|
28
|
+
# If this is not allOf having array of objects inside, but e.g. having another anyOf/oneOf nested
|
29
|
+
remaining_keys.clear
|
30
|
+
end
|
31
|
+
|
21
32
|
return [nil, err] if err
|
22
33
|
end
|
23
34
|
|
35
|
+
# If there are nested additionalProperites, we allow not defined extra properties and lean on the specific
|
36
|
+
# additionalProperties validation
|
37
|
+
if !nested_additional_properties && !remaining_keys.empty?
|
38
|
+
return [nil, OpenAPIParser::NotExistPropertyDefinition.new(remaining_keys, schema.object_reference)]
|
39
|
+
end
|
40
|
+
|
24
41
|
[value, nil]
|
25
42
|
end
|
26
43
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
class OpenAPIParser::SchemaValidator
|
2
2
|
class ObjectValidator < Base
|
3
|
+
include ::OpenAPIParser::SchemaValidator::PropertiesNumber
|
4
|
+
|
3
5
|
# @param [Hash] value
|
4
6
|
# @param [OpenAPIParser::Schemas::Schema] schema
|
5
7
|
# @param [Boolean] parent_all_of true if component is nested under allOf
|
@@ -27,9 +29,9 @@ class OpenAPIParser::SchemaValidator
|
|
27
29
|
coerced, err = if s
|
28
30
|
remaining_keys.delete(name)
|
29
31
|
validatable.validate_schema(v, s)
|
30
|
-
elsif schema.additional_properties != true && schema.additional_properties != false
|
31
|
-
validatable.validate_schema(v, schema.additional_properties)
|
32
32
|
else
|
33
|
+
# TODO: we need to perform a validation based on schema.additional_properties here, if
|
34
|
+
# additionalProperties are defined
|
33
35
|
[v, nil]
|
34
36
|
end
|
35
37
|
|
@@ -41,14 +43,16 @@ class OpenAPIParser::SchemaValidator
|
|
41
43
|
|
42
44
|
remaining_keys.delete(discriminator_property_name) if discriminator_property_name
|
43
45
|
|
44
|
-
if !remaining_keys.empty? && !schema.additional_properties
|
46
|
+
if !remaining_keys.empty? && !parent_all_of && !schema.additional_properties
|
47
|
+
# If object is nested in all of, the validation is already done in allOf validator. Or if
|
48
|
+
# additionalProperties are defined, we will validate using that
|
45
49
|
return [nil, OpenAPIParser::NotExistPropertyDefinition.new(remaining_keys, schema.object_reference)]
|
46
50
|
end
|
47
51
|
return [nil, OpenAPIParser::NotExistRequiredKey.new(required_set.to_a, schema.object_reference)] unless required_set.empty?
|
48
52
|
|
49
53
|
value.merge!(coerced_values.to_h) if @coerce_value
|
50
54
|
|
51
|
-
|
55
|
+
check_properties_number(value, schema)
|
52
56
|
end
|
53
57
|
end
|
54
58
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class OpenAPIParser::SchemaValidator
|
2
|
+
module PropertiesNumber
|
3
|
+
# check minProperties and manProperties value by schema
|
4
|
+
# @param [Object] value
|
5
|
+
# @param [OpenAPIParser::Schemas::Schema] schema
|
6
|
+
def check_properties_number(value, schema)
|
7
|
+
include_properties_num = schema.minProperties || schema.maxProperties
|
8
|
+
return [value, nil] unless include_properties_num
|
9
|
+
|
10
|
+
validate(value, schema)
|
11
|
+
[value, nil]
|
12
|
+
rescue OpenAPIParser::OpenAPIError => e
|
13
|
+
return [nil, e]
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def validate(value, schema)
|
19
|
+
reference = schema.object_reference
|
20
|
+
|
21
|
+
if schema.minProperties && (value.size < schema.minProperties)
|
22
|
+
raise OpenAPIParser::LessThanMinProperties.new(value, reference)
|
23
|
+
end
|
24
|
+
|
25
|
+
if schema.maxProperties && (value.size > schema.maxProperties)
|
26
|
+
raise OpenAPIParser::MoreThanMaxProperties.new(value, reference)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -71,6 +71,8 @@ class OpenAPIParser::SchemaValidator
|
|
71
71
|
def validate_date_format(value, schema)
|
72
72
|
return [value, nil] unless schema.format == 'date'
|
73
73
|
|
74
|
+
return [nil, OpenAPIParser::InvalidDateFormat.new(value, schema.object_reference)] unless value =~ /^\d{4}-\d{2}-\d{2}$/
|
75
|
+
|
74
76
|
begin
|
75
77
|
parsed_date = Date.iso8601(value)
|
76
78
|
rescue ArgumentError
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require_relative 'schema_validator/options'
|
2
2
|
require_relative 'schema_validator/enumable'
|
3
3
|
require_relative 'schema_validator/minimum_maximum'
|
4
|
+
require_relative 'schema_validator/properties_number'
|
4
5
|
require_relative 'schema_validator/base'
|
5
6
|
require_relative 'schema_validator/string_validator'
|
6
7
|
require_relative 'schema_validator/integer_validator'
|
@@ -21,9 +21,11 @@ module OpenAPIParser::Schemas
|
|
21
21
|
|
22
22
|
media_type = select_media_type(response_body.content_type)
|
23
23
|
unless media_type
|
24
|
-
|
24
|
+
if response_validate_options.strict && response_body_not_blank(response_body)
|
25
|
+
raise ::OpenAPIParser::NotExistContentTypeDefinition, object_reference
|
26
|
+
end
|
25
27
|
|
26
|
-
return
|
28
|
+
return true
|
27
29
|
end
|
28
30
|
|
29
31
|
options = ::OpenAPIParser::SchemaValidator::Options.new # response validator not support any options
|
@@ -39,6 +41,11 @@ module OpenAPIParser::Schemas
|
|
39
41
|
|
40
42
|
private
|
41
43
|
|
44
|
+
# @param [OpenAPIParser::RequestOperation::ValidatableResponseBody]
|
45
|
+
def response_body_not_blank(response_body)
|
46
|
+
!(response_body.response_data.nil? || response_body.response_data.empty?)
|
47
|
+
end
|
48
|
+
|
42
49
|
# @param [Hash] response_headers
|
43
50
|
def validate_header(response_headers)
|
44
51
|
return unless headers
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openapi_parser
|
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
|
- ota42y
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-11-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -142,6 +142,7 @@ files:
|
|
142
142
|
- LICENSE.txt
|
143
143
|
- README.md
|
144
144
|
- Rakefile
|
145
|
+
- SECURITY.md
|
145
146
|
- Steepfile
|
146
147
|
- bin/console
|
147
148
|
- bin/setup
|
@@ -186,6 +187,7 @@ files:
|
|
186
187
|
- lib/openapi_parser/schema_validator/object_validator.rb
|
187
188
|
- lib/openapi_parser/schema_validator/one_of_validator.rb
|
188
189
|
- lib/openapi_parser/schema_validator/options.rb
|
190
|
+
- lib/openapi_parser/schema_validator/properties_number.rb
|
189
191
|
- lib/openapi_parser/schema_validator/string_validator.rb
|
190
192
|
- lib/openapi_parser/schema_validator/unspecified_type_validator.rb
|
191
193
|
- lib/openapi_parser/schemas.rb
|