openapi_parser 2.2.6 → 2.3.1
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/.github/workflows/ci.yaml +4 -2
- data/CHANGELOG.md +8 -0
- data/README.md +1 -1
- data/lib/openapi_parser/config.rb +5 -0
- data/lib/openapi_parser/schema_validator/all_of_validator.rb +2 -2
- data/lib/openapi_parser/schema_validator/object_validator.rb +6 -3
- data/lib/openapi_parser/schema_validator/options.rb +5 -2
- data/lib/openapi_parser/schema_validator/string_validator.rb +12 -9
- data/lib/openapi_parser/schema_validator.rb +2 -1
- data/lib/openapi_parser/version.rb +1 -1
- data/openapi_parser.gemspec +1 -1
- data/sig/openapi_parser/config.rbs +1 -0
- data/sig/openapi_parser/schema_validator.rbs +1 -0
- data/sig/openapi_parser/schema_validators/options.rbs +1 -1
- metadata +5 -8
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b3129b448382c0b36273808c25a197c9264ec23d4729c93f8c5594375cf16cc5
|
|
4
|
+
data.tar.gz: 57aa683478c58dd684995e326687ef8e187a08fe4818e707812b1484a3e6e13b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1e99aa6ea5ae7234c886c17c6d48bdeb75480db7698057aa77825301c0151caa986b59f6cc0b5a5a421c135fb47fb513e6440b6a3a18db4dae2f25620001f05a
|
|
7
|
+
data.tar.gz: b5886770b412d8d73fe30a07039fcf76773880874e4762bd704e6ab3c4b545ade6ed722ebd010717af42c9e09e4e3ccd4fc0f53954c9d98bd24e64583ed99e48
|
data/.github/workflows/ci.yaml
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
name: ci
|
|
2
|
-
on:
|
|
2
|
+
on:
|
|
3
|
+
- pull_request
|
|
4
|
+
- push
|
|
3
5
|
jobs:
|
|
4
6
|
test:
|
|
5
7
|
strategy:
|
|
@@ -18,7 +20,7 @@ jobs:
|
|
|
18
20
|
- ruby-head
|
|
19
21
|
runs-on: ${{ matrix.os }}
|
|
20
22
|
steps:
|
|
21
|
-
- uses: actions/checkout@
|
|
23
|
+
- uses: actions/checkout@v5
|
|
22
24
|
- uses: ruby/setup-ruby@v1
|
|
23
25
|
with:
|
|
24
26
|
ruby-version: ${{ matrix.ruby }}
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
## Unreleased
|
|
2
2
|
|
|
3
|
+
## 2.3.1 (2025-11-14)
|
|
4
|
+
* add optional date coercion with behavior matching existing datetime coercion
|
|
5
|
+
|
|
6
|
+
## 2.3.0 (2025-10-01)
|
|
7
|
+
* bump base64 dep
|
|
8
|
+
* bump actions checkout dep
|
|
9
|
+
* improvements for additionalProperties validation #187
|
|
10
|
+
|
|
3
11
|
## 2.2.6 (2025-04-07)
|
|
4
12
|
* support validator options and allow_empty_date_and_datetime for response validate options #183
|
|
5
13
|
|
data/README.md
CHANGED
|
@@ -27,7 +27,7 @@ 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})
|
|
30
|
+
root = OpenAPIParser.parse(YAML.load_file('open_api_3/schema.yml'), {coerce_value: true, datetime_coerce_class: DateTime, date_coerce_class: Date})
|
|
31
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)>
|
|
@@ -19,6 +19,10 @@ class OpenAPIParser::Config
|
|
|
19
19
|
@config[:datetime_coerce_class]
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
+
def date_coerce_class
|
|
23
|
+
@config[:date_coerce_class]
|
|
24
|
+
end
|
|
25
|
+
|
|
22
26
|
def coerce_value
|
|
23
27
|
@config[:coerce_value]
|
|
24
28
|
end
|
|
@@ -46,6 +50,7 @@ class OpenAPIParser::Config
|
|
|
46
50
|
@request_validator_options ||= OpenAPIParser::SchemaValidator::Options.new(allow_empty_date_and_datetime: allow_empty_date_and_datetime,
|
|
47
51
|
coerce_value: coerce_value,
|
|
48
52
|
datetime_coerce_class: datetime_coerce_class,
|
|
53
|
+
date_coerce_class: date_coerce_class,
|
|
49
54
|
validate_header: validate_header)
|
|
50
55
|
end
|
|
51
56
|
|
|
@@ -9,7 +9,7 @@ class OpenAPIParser::SchemaValidator
|
|
|
9
9
|
return [value, nil]
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
# if any schema return error, it's not
|
|
12
|
+
# if any schema return error, it's not a valid all_of
|
|
13
13
|
remaining_keys = value.kind_of?(Hash) ? value.keys : []
|
|
14
14
|
nested_additional_properties = false
|
|
15
15
|
schema.all_of.each do |s|
|
|
@@ -32,7 +32,7 @@ class OpenAPIParser::SchemaValidator
|
|
|
32
32
|
return [nil, err] if err
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
# If there are nested
|
|
35
|
+
# If there are nested additionalProperties, we allow not defined extra properties and lean on the specific
|
|
36
36
|
# additionalProperties validation
|
|
37
37
|
if !nested_additional_properties && !remaining_keys.empty?
|
|
38
38
|
return [nil, OpenAPIParser::NotExistPropertyDefinition.new(remaining_keys, schema.object_reference)]
|
|
@@ -10,6 +10,7 @@ class OpenAPIParser::SchemaValidator
|
|
|
10
10
|
return OpenAPIParser::ValidateError.build_error_result(value, schema) unless value.kind_of?(Hash)
|
|
11
11
|
|
|
12
12
|
properties = schema.properties || {}
|
|
13
|
+
additional_properties = schema.additional_properties
|
|
13
14
|
|
|
14
15
|
required_set = schema.required ? schema.required.to_set : Set.new
|
|
15
16
|
remaining_keys = value.keys
|
|
@@ -29,9 +30,11 @@ class OpenAPIParser::SchemaValidator
|
|
|
29
30
|
coerced, err = if s
|
|
30
31
|
remaining_keys.delete(name)
|
|
31
32
|
validatable.validate_schema(v, s)
|
|
33
|
+
# TODO: better handling for parent_all_of with additional_properties
|
|
34
|
+
elsif !parent_all_of && additional_properties.is_a?(OpenAPIParser::Schemas::Schema)
|
|
35
|
+
remaining_keys.delete(name)
|
|
36
|
+
validatable.validate_schema(v, additional_properties)
|
|
32
37
|
else
|
|
33
|
-
# TODO: we need to perform a validation based on schema.additional_properties here, if
|
|
34
|
-
# additionalProperties are defined
|
|
35
38
|
[v, nil]
|
|
36
39
|
end
|
|
37
40
|
|
|
@@ -43,7 +46,7 @@ class OpenAPIParser::SchemaValidator
|
|
|
43
46
|
|
|
44
47
|
remaining_keys.delete(discriminator_property_name) if discriminator_property_name
|
|
45
48
|
|
|
46
|
-
if !remaining_keys.empty? && !parent_all_of && !
|
|
49
|
+
if !remaining_keys.empty? && !parent_all_of && !additional_properties
|
|
47
50
|
# If object is nested in all of, the validation is already done in allOf validator. Or if
|
|
48
51
|
# additionalProperties are defined, we will validate using that
|
|
49
52
|
return [nil, OpenAPIParser::NotExistPropertyDefinition.new(remaining_keys, schema.object_reference)]
|
|
@@ -6,14 +6,17 @@ class OpenAPIParser::SchemaValidator
|
|
|
6
6
|
# @return [Boolean] coerce value option on/off
|
|
7
7
|
# @!attribute [r] datetime_coerce_class
|
|
8
8
|
# @return [Object, nil] coerce datetime string by this Object class
|
|
9
|
+
# @!attribute [r] date_coerce_class
|
|
10
|
+
# @return [Object, nil] coerce date string by this Object class
|
|
9
11
|
# @!attribute [r] validate_header
|
|
10
12
|
# @return [Boolean] validate header or not
|
|
11
|
-
attr_reader :allow_empty_date_and_datetime, :coerce_value, :datetime_coerce_class, :validate_header
|
|
13
|
+
attr_reader :allow_empty_date_and_datetime, :coerce_value, :datetime_coerce_class, :validate_header, :date_coerce_class
|
|
12
14
|
|
|
13
|
-
def initialize(allow_empty_date_and_datetime: false, coerce_value: nil, datetime_coerce_class: nil, validate_header: true)
|
|
15
|
+
def initialize(allow_empty_date_and_datetime: false, coerce_value: nil, datetime_coerce_class: nil, validate_header: true, date_coerce_class: nil)
|
|
14
16
|
@allow_empty_date_and_datetime = allow_empty_date_and_datetime
|
|
15
17
|
@coerce_value = coerce_value
|
|
16
18
|
@datetime_coerce_class = datetime_coerce_class
|
|
19
|
+
@date_coerce_class = date_coerce_class
|
|
17
20
|
@validate_header = validate_header
|
|
18
21
|
end
|
|
19
22
|
end
|
|
@@ -2,10 +2,11 @@ class OpenAPIParser::SchemaValidator
|
|
|
2
2
|
class StringValidator < Base
|
|
3
3
|
include ::OpenAPIParser::SchemaValidator::Enumable
|
|
4
4
|
|
|
5
|
-
def initialize(validator, allow_empty_date_and_datetime, coerce_value, datetime_coerce_class)
|
|
5
|
+
def initialize(validator, allow_empty_date_and_datetime, coerce_value, datetime_coerce_class, date_coerce_class)
|
|
6
6
|
super(validator, coerce_value)
|
|
7
7
|
@allow_empty_date_and_datetime = allow_empty_date_and_datetime
|
|
8
8
|
@datetime_coerce_class = datetime_coerce_class
|
|
9
|
+
@date_coerce_class = date_coerce_class
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def coerce_and_validate(value, schema, **_keyword_args)
|
|
@@ -90,16 +91,18 @@ class OpenAPIParser::SchemaValidator
|
|
|
90
91
|
return [nil, OpenAPIParser::InvalidDateFormat.new(value, schema.object_reference)] unless value =~ /^\d{4}-\d{2}-\d{2}$/
|
|
91
92
|
|
|
92
93
|
begin
|
|
93
|
-
|
|
94
|
+
if @date_coerce_class.nil?
|
|
95
|
+
# validate only
|
|
96
|
+
Date.iso8601(value)
|
|
97
|
+
[value, nil]
|
|
98
|
+
else
|
|
99
|
+
# validate and coerce
|
|
100
|
+
[@date_coerce_class.iso8601(value), nil]
|
|
101
|
+
end
|
|
94
102
|
rescue ArgumentError
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
unless parsed_date.strftime('%Y-%m-%d') == value
|
|
99
|
-
return [nil, OpenAPIParser::InvalidDateFormat.new(value, schema.object_reference)]
|
|
103
|
+
# when rfc3339(value) failed
|
|
104
|
+
[nil, OpenAPIParser::InvalidDateFormat.new(value, schema.object_reference)]
|
|
100
105
|
end
|
|
101
|
-
|
|
102
|
-
return [value, nil]
|
|
103
106
|
end
|
|
104
107
|
|
|
105
108
|
def validate_datetime_format(value, schema)
|
|
@@ -56,6 +56,7 @@ class OpenAPIParser::SchemaValidator
|
|
|
56
56
|
@allow_empty_date_and_datetime = options.allow_empty_date_and_datetime
|
|
57
57
|
@coerce_value = options.coerce_value
|
|
58
58
|
@datetime_coerce_class = options.datetime_coerce_class
|
|
59
|
+
@date_coerce_class = options.date_coerce_class
|
|
59
60
|
end
|
|
60
61
|
|
|
61
62
|
# execute validate data
|
|
@@ -121,7 +122,7 @@ class OpenAPIParser::SchemaValidator
|
|
|
121
122
|
end
|
|
122
123
|
|
|
123
124
|
def string_validator
|
|
124
|
-
@string_validator ||= OpenAPIParser::SchemaValidator::StringValidator.new(self, @allow_empty_date_and_datetime, @coerce_value, @datetime_coerce_class)
|
|
125
|
+
@string_validator ||= OpenAPIParser::SchemaValidator::StringValidator.new(self, @allow_empty_date_and_datetime, @coerce_value, @datetime_coerce_class, @date_coerce_class)
|
|
125
126
|
end
|
|
126
127
|
|
|
127
128
|
def integer_validator
|
data/openapi_parser.gemspec
CHANGED
|
@@ -36,5 +36,5 @@ Gem::Specification.new do |spec|
|
|
|
36
36
|
spec.add_development_dependency 'simplecov'
|
|
37
37
|
spec.add_development_dependency "steep"
|
|
38
38
|
# for steep + ruby-head
|
|
39
|
-
spec.add_development_dependency 'base64', '~> 0.
|
|
39
|
+
spec.add_development_dependency 'base64', '~> 0.3.0'
|
|
40
40
|
end
|
|
@@ -9,6 +9,7 @@ module OpenAPIParser
|
|
|
9
9
|
|
|
10
10
|
def initialize: (untyped config) -> untyped
|
|
11
11
|
def allow_empty_date_and_datetime: -> bool
|
|
12
|
+
def date_coerce_class: -> (singleton(Object) | nil)
|
|
12
13
|
def datetime_coerce_class: -> (singleton(Object) | nil)
|
|
13
14
|
def coerce_value: -> bool
|
|
14
15
|
def expand_reference: -> bool
|
|
@@ -6,6 +6,7 @@ module OpenAPIParser
|
|
|
6
6
|
@schema: OpenAPIParser::Schemas::Schema
|
|
7
7
|
@coerce_value: bool | nil
|
|
8
8
|
@datetime_coerce_class: singleton(Object) | nil
|
|
9
|
+
@date_coerce_class: singleton(Object) | nil
|
|
9
10
|
@string_validator: OpenAPIParser::SchemaValidator::StringValidator | nil
|
|
10
11
|
@integer_validator: OpenAPIParser::SchemaValidator::IntegerValidator | nil
|
|
11
12
|
@float_validator: OpenAPIParser::SchemaValidator::FloatValidator | nil
|
|
@@ -6,7 +6,7 @@ module OpenAPIParser
|
|
|
6
6
|
attr_reader coerce_value: bool | nil
|
|
7
7
|
attr_reader datetime_coerce_class: singleton(Object) | nil
|
|
8
8
|
attr_reader validate_header: bool
|
|
9
|
-
def initialize: (?allow_empty_date_and_datetime: bool | nil, ?coerce_value: bool | nil, ?datetime_coerce_class: singleton(Object) | nil, ?validate_header: bool) -> untyped
|
|
9
|
+
def initialize: (?allow_empty_date_and_datetime: bool | nil, ?coerce_value: bool | nil, ?datetime_coerce_class: singleton(Object) | nil, ?date_coerce_class: singleton(Object) | nil, ?validate_header: bool) -> untyped
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
class ResponseValidateOptions
|
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: openapi_parser
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.3.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- ota42y
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: exe
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: bundler
|
|
@@ -114,14 +113,14 @@ dependencies:
|
|
|
114
113
|
requirements:
|
|
115
114
|
- - "~>"
|
|
116
115
|
- !ruby/object:Gem::Version
|
|
117
|
-
version: 0.
|
|
116
|
+
version: 0.3.0
|
|
118
117
|
type: :development
|
|
119
118
|
prerelease: false
|
|
120
119
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
120
|
requirements:
|
|
122
121
|
- - "~>"
|
|
123
122
|
- !ruby/object:Gem::Version
|
|
124
|
-
version: 0.
|
|
123
|
+
version: 0.3.0
|
|
125
124
|
description: parser for OpenAPI 3.0 or later
|
|
126
125
|
email:
|
|
127
126
|
- ota42y@gmail.com
|
|
@@ -225,7 +224,6 @@ homepage: https://github.com/ota42y/openapi_parser
|
|
|
225
224
|
licenses:
|
|
226
225
|
- MIT
|
|
227
226
|
metadata: {}
|
|
228
|
-
post_install_message:
|
|
229
227
|
rdoc_options: []
|
|
230
228
|
require_paths:
|
|
231
229
|
- lib
|
|
@@ -240,8 +238,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
240
238
|
- !ruby/object:Gem::Version
|
|
241
239
|
version: '0'
|
|
242
240
|
requirements: []
|
|
243
|
-
rubygems_version: 3.
|
|
244
|
-
signing_key:
|
|
241
|
+
rubygems_version: 3.6.9
|
|
245
242
|
specification_version: 4
|
|
246
243
|
summary: OpenAPI3 parser
|
|
247
244
|
test_files: []
|