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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0cab3ae5e12891d0181e466a9fd7536aab281437f0cab8ef6b70e1dbfb291d8f
4
- data.tar.gz: 4e246ee4c71e532ed38dbabb8f788d9ad7c85b5362b708482648b972a3ff9b8a
3
+ metadata.gz: b3129b448382c0b36273808c25a197c9264ec23d4729c93f8c5594375cf16cc5
4
+ data.tar.gz: 57aa683478c58dd684995e326687ef8e187a08fe4818e707812b1484a3e6e13b
5
5
  SHA512:
6
- metadata.gz: 68298030cbd034b42f46e6dc9781b905f8b1c993d56db02e33c750d91934560301b2664d3287c4c462d33483020dccc3d3de8906a2e9f7b905f2b5bea5324e68
7
- data.tar.gz: 68a9d252f6eb2ee4a5ce231b435c9022fc73b592e4eafc0e64b9aed4f711ebcfa66d079fb9f29dcd366b73d47a9426b594d3c30d032becbce035b67276da044a
6
+ metadata.gz: 1e99aa6ea5ae7234c886c17c6d48bdeb75480db7698057aa77825301c0151caa986b59f6cc0b5a5a421c135fb47fb513e6440b6a3a18db4dae2f25620001f05a
7
+ data.tar.gz: b5886770b412d8d73fe30a07039fcf76773880874e4762bd704e6ab3c4b545ade6ed722ebd010717af42c9e09e4e3ccd4fc0f53954c9d98bd24e64583ed99e48
@@ -1,5 +1,7 @@
1
1
  name: ci
2
- on: [push]
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@v4
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 valida all of value
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 additionalProperites, we allow not defined extra properties and lean on the specific
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 && !schema.additional_properties
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
- parsed_date = Date.iso8601(value)
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
- return [nil, OpenAPIParser::InvalidDateFormat.new(value, schema.object_reference)]
96
- end
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
@@ -1,3 +1,3 @@
1
1
  module OpenAPIParser
2
- VERSION = '2.2.6'.freeze
2
+ VERSION = '2.3.1'.freeze
3
3
  end
@@ -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.2.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.2.6
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: 2025-04-07 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: bundler
@@ -114,14 +113,14 @@ dependencies:
114
113
  requirements:
115
114
  - - "~>"
116
115
  - !ruby/object:Gem::Version
117
- version: 0.2.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.2.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.5.18
244
- signing_key:
241
+ rubygems_version: 3.6.9
245
242
  specification_version: 4
246
243
  summary: OpenAPI3 parser
247
244
  test_files: []