openapi_parser 2.2.1 → 2.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e5bbbc0335472ed4352c767db92dc1ed0259548e6d49ece1f5b5da3836fbdbc5
4
- data.tar.gz: bb600e479aff2c4b7ac0314215f49d3058491e93fde59240cd47339853a8ecf8
3
+ metadata.gz: ee47209ddc3182fdab488acfbda8e2fd628ab0bd0979bd04e60fcbf7f71365f3
4
+ data.tar.gz: 66a4c16d27ddeffd927ec5df1124572d3c885c3759630f0cae3edb9a122355f8
5
5
  SHA512:
6
- metadata.gz: 53f5d120721d58ae47a555a036ac037fbb5460cbf315f918b7f881bb1a5f4fffee5bad46118dfd085441fcd65c01f133bb84834e728582a8008aaeb46a943a3e
7
- data.tar.gz: 6ed888572b972db4ca33daffbfdef569de6f41153c5e798f42ee68badbe8154c1e206ec01300522d15aff56be1ecb5e4b4bd1209e99fc4da789e78ea4d1ba88f
6
+ metadata.gz: 3a7d3ec2c6e75fa903203dbae2a607f152e59e1299ab053df8923b9c8b69539a89dfa98a757481d8cb8dedec7e8e362c1f13f01a7087baff6dd017cd2c3dc3e9
7
+ data.tar.gz: 19cd5e1d6079c0b69f2ed4e849cc23a0d7b7e67fd780ad4cf2bb430d9ffbe86d4f84c36c8173e74f25905460c51af4d579f2fe19f3db215837ddef763c1fd1da
data/CHANGELOG.md CHANGED
@@ -1,5 +1,8 @@
1
1
  ## Unreleased
2
2
 
3
+ ## 2.2.2 (2024-11-21)
4
+ * make content-type lookup case-insensitive #178
5
+
3
6
  ## 2.2.1 (2024-10-23)
4
7
  * revert schemas validation in additionalProperties and remove additionalProperties logic from allof (breaking things for me, will revisit)
5
8
 
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  [![Yard Docs](https://img.shields.io/badge/yard-docs-blue.svg)](https://www.rubydoc.info/gems/openapi_parser)
5
5
  [![Inch CI](https://inch-ci.org/github/ota42y/openapi_parser.svg?branch=master)](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/[USERNAME]/openapi_parser/blob/master/CODE_OF_CONDUCT.md).
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
@@ -0,0 +1,6 @@
1
+ ## Security contact information
2
+
3
+ To report a security vulnerability, please contact
4
+ [Tidelift security](https://tidelift.com/security).
5
+
6
+ Tidelift will coordinate the fix and disclosure.
@@ -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['Content-Type'].to_s.split(';').first.to_s
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
@@ -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
@@ -50,7 +52,7 @@ class OpenAPIParser::SchemaValidator
50
52
 
51
53
  value.merge!(coerced_values.to_h) if @coerce_value
52
54
 
53
- [value, nil]
55
+ check_properties_number(value, schema)
54
56
  end
55
57
  end
56
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
- raise ::OpenAPIParser::NotExistContentTypeDefinition, object_reference if response_validate_options.strict
24
+ if response_validate_options.strict && response_body_not_blank(response_body)
25
+ raise ::OpenAPIParser::NotExistContentTypeDefinition, object_reference
26
+ end
25
27
 
26
- return nil
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
@@ -1,3 +1,3 @@
1
1
  module OpenAPIParser
2
- VERSION = '2.2.1'.freeze
2
+ VERSION = '2.2.2'.freeze
3
3
  end
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.1
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-10-23 00:00:00.000000000 Z
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