openapi_parser 0.14.0 → 1.0.0

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: b1b06e3e4d6ad28828a02c2a4a79140439b9119ac53b73494318386195cc6275
4
- data.tar.gz: 4360946a10aa364d8c0de18d773eee3df2ee683373de2178307f52530806e81a
3
+ metadata.gz: 3019c8458c35d159f7c8eccc8f8203d39826438804460cccd1383f9e29b95299
4
+ data.tar.gz: 3471fed71a9d1f81688d87a0c907a0ab4c0529ca3e4a9d40159403b88238d1a6
5
5
  SHA512:
6
- metadata.gz: be2a98609d41e4207edff4aaa61687b34dc568cb36e38b37eef42c7edffc836ffb9110465dda772c41025bc0fce125115da370e36949414ceb8902051c81b7b8
7
- data.tar.gz: 3047ab4d4ef9f465e9c9373567c11e323ecd135d994002d8578426bdc38d5cdbe5922050d66bdf701551fb10fcb3206029276b49a33e2bc1d755278cb105a9e3
6
+ metadata.gz: d9f7ba65682079456e26ff03d4be816ad6f61b9bb9224c4cf37157a0bb4d4455d17c3e36fbadd0f557700d9926f69a50ae8ebdc9041412304b12b05feb91df4e
7
+ data.tar.gz: fd611630b787af1e69a003de92c01f8c83d9e9d6e8be68fe66fdba6a93ce2a8ca412c89a00fa35bcf4d7441fe10c309ec9eb9f3e91659957429b0375629a3671
@@ -6,7 +6,7 @@ jobs:
6
6
  fail-fast: false
7
7
  matrix:
8
8
  os: [ubuntu-latest, macos-latest]
9
- ruby: [2.4, 2.5, 2.6, 2.7, '3.0', head]
9
+ ruby: [2.6, 2.7, '3.0', '3.1']
10
10
  runs-on: ${{ matrix.os }}
11
11
  steps:
12
12
  - uses: actions/checkout@v2
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.1.0
data/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  ## Unreleased
2
2
 
3
+ ## 1.0.0 (2021-02-03)
4
+ ### Added
5
+ * Add date-time format validation #126
6
+
7
+ ## 1.0.0.beta1 (2021-12-15)
8
+ ### Added
9
+ * Add strict_reference_validation config and implementation to address/implement #29 #123
10
+
11
+ ## 0.15.0 (2021-09-27)
12
+ ### Added
13
+ * support: relative file path escape. #117
14
+
15
+ ## 0.14.1 (2021-07-9)
16
+ ### Fixed
17
+ * Fix bug for using path parameter and coerce option #115
18
+
3
19
  ## 0.14.0 (2021-05-24)
4
20
 
5
21
  ### Added
data/README.md CHANGED
@@ -62,6 +62,33 @@ We support additional type validation.
62
62
  |---|---|---|
63
63
  |string|uuid|validate uuid string. But we don't check uuid layout|
64
64
 
65
+ ### Reference Validation on Schema Load
66
+ Invalid references (missing definitions, typos, etc.) can cause validation to fail in runtime,
67
+ and these errors can be difficult to debug (see: https://github.com/ota42y/openapi_parser/issues/29).
68
+
69
+ Pass the `strict_reference_validation: true` option to detect invalid references.
70
+ An `OpenAPIError::MissingReferenceError` exception will be raised when a reference cannot be resolved.
71
+
72
+ If the `expand_reference` configuration is explicitly `false` (default is `true`), then
73
+ this configuration has no effect.
74
+
75
+ DEPRECATION NOTICE: To maintain compatibility with the previous behavior, this version sets `false` as a default.
76
+ This behavior will be changed to `true` in a later version, so you should explicitly pass `strict_reference_validation: false`
77
+ if you wish to keep the old behavior (and please let the maintainers know your use-case for this configuration!).
78
+
79
+ ```ruby
80
+ yaml_file = YAML.load_file('open_api_3/schema_with_broken_references.yml')
81
+ options = {
82
+ coerce_value: true,
83
+ datetime_coerce_class: DateTime,
84
+ # This defaults to false (for now) - passing `true` provides load-time validation of refs
85
+ strict_reference_validation: true
86
+ }
87
+
88
+ # Will raise with OpenAPIParser::MissingReferenceError
89
+ OpenAPIParser.parse(yaml_file, options)
90
+ ```
91
+
65
92
  ## ToDo
66
93
  - correct schema checker
67
94
  - more detailed validator
data/Rakefile CHANGED
@@ -3,4 +3,8 @@ require 'rspec/core/rake_task'
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task :default => :spec
6
+ task :steep do
7
+ sh 'steep check'
8
+ end
9
+
10
+ task :default => [:steep, :spec]
data/Steepfile ADDED
@@ -0,0 +1,11 @@
1
+ target :lib do
2
+ signature "sig"
3
+ #check "lib"
4
+
5
+ check "lib/openapi_parser.rb"
6
+ check "lib/openapi_parser/config.rb"
7
+ check "lib/openapi_parser/schema_validators/options.rb"
8
+ check "lib/openapi_parser/schema_validators/base.rb"
9
+
10
+ library 'uri'
11
+ end
@@ -2,28 +2,28 @@ module OpenAPIParser::Expandable
2
2
  # expand refs
3
3
  # @param [OpenAPIParser::Schemas::Base] root
4
4
  # @return nil
5
- def expand_reference(root)
6
- expand_list_objects(root, self.class._openapi_attr_list_objects.keys)
7
- expand_objects(root, self.class._openapi_attr_objects.keys)
8
- expand_hash_objects(root, self.class._openapi_attr_hash_objects.keys)
9
- expand_hash_objects(root, self.class._openapi_attr_hash_body_objects.keys)
5
+ def expand_reference(root, validate_references)
6
+ expand_list_objects(root, self.class._openapi_attr_list_objects.keys, validate_references)
7
+ expand_objects(root, self.class._openapi_attr_objects.keys, validate_references)
8
+ expand_hash_objects(root, self.class._openapi_attr_hash_objects.keys, validate_references)
9
+ expand_hash_objects(root, self.class._openapi_attr_hash_body_objects.keys, validate_references)
10
10
  nil
11
11
  end
12
12
 
13
13
  private
14
14
 
15
- def expand_hash_objects(root, attribute_names)
15
+ def expand_hash_objects(root, attribute_names, validate_references)
16
16
  return unless attribute_names
17
17
 
18
- attribute_names.each { |name| expand_hash_attribute(root, name) }
18
+ attribute_names.each { |name| expand_hash_attribute(root, name, validate_references) }
19
19
  end
20
20
 
21
- def expand_hash_attribute(root, name)
21
+ def expand_hash_attribute(root, name, validate_references)
22
22
  h = send(name)
23
23
  return if h.nil?
24
24
 
25
25
  update_values = h.map do |k, v|
26
- new_object = expand_object(root, v)
26
+ new_object = expand_object(root, v, validate_references)
27
27
  new_object.nil? ? nil : [k, new_object]
28
28
  end
29
29
 
@@ -33,14 +33,14 @@ module OpenAPIParser::Expandable
33
33
  end
34
34
  end
35
35
 
36
- def expand_objects(root, attribute_names)
36
+ def expand_objects(root, attribute_names, validate_references)
37
37
  return unless attribute_names
38
38
 
39
39
  attribute_names.each do |name|
40
40
  v = send(name)
41
41
  next if v.nil?
42
42
 
43
- new_object = expand_object(root, v)
43
+ new_object = expand_object(root, v, validate_references)
44
44
  next if new_object.nil?
45
45
 
46
46
  _update_child_object(v, new_object)
@@ -48,7 +48,7 @@ module OpenAPIParser::Expandable
48
48
  end
49
49
  end
50
50
 
51
- def expand_list_objects(root, attribute_names)
51
+ def expand_list_objects(root, attribute_names, validate_references)
52
52
  return unless attribute_names
53
53
 
54
54
  attribute_names.each do |name|
@@ -56,7 +56,7 @@ module OpenAPIParser::Expandable
56
56
  next if l.nil?
57
57
 
58
58
  l.each_with_index do |v, idx|
59
- new_object = expand_object(root, v)
59
+ new_object = expand_object(root, v, validate_references)
60
60
  next if new_object.nil?
61
61
 
62
62
  _update_child_object(v, new_object)
@@ -65,12 +65,15 @@ module OpenAPIParser::Expandable
65
65
  end
66
66
  end
67
67
 
68
- def expand_object(root, object)
68
+ def expand_object(root, object, validate_references)
69
69
  if object.kind_of?(OpenAPIParser::Schemas::Reference)
70
- return referenced_object(root, object)
70
+ ref_object = referenced_object(root, object)
71
+ raise OpenAPIParser::MissingReferenceError.new(object.ref) if ref_object.nil? && validate_references
72
+
73
+ return ref_object
71
74
  end
72
75
 
73
- object.expand_reference(root) if object.kind_of?(OpenAPIParser::Expandable)
76
+ object.expand_reference(root, validate_references) if object.kind_of?(OpenAPIParser::Expandable)
74
77
  nil
75
78
  end
76
79
 
@@ -46,8 +46,8 @@ module OpenAPIParser::Findable
46
46
  private
47
47
 
48
48
  def find_remote_object(reference)
49
- reference_uri = URI(reference)
50
- fragment = reference_uri.fragment
49
+ uri, fragment = reference.split("#", 2)
50
+ reference_uri = URI(uri)
51
51
  reference_uri.fragment = nil
52
52
  root.load_another_schema(reference_uri)&.find_object("##{fragment}")
53
53
  end
@@ -13,6 +13,12 @@ module OpenAPIParser::ParameterValidatable
13
13
  validate_query_parameter(params, object_reference, options)
14
14
  end
15
15
 
16
+ # @param [PathItem] path_item parent
17
+ def set_parent_path_item(path_item)
18
+ @merged_parameter = (parameters || []) + (path_item.parameters || [])
19
+ nil
20
+ end
21
+
16
22
  private
17
23
 
18
24
  # @param [Hash] params query parameter hash
@@ -44,7 +50,7 @@ module OpenAPIParser::ParameterValidatable
44
50
  # @return [Hash{String => Hash{String => Parameter}}] hash[in][name] => Parameter
45
51
  def divided_parameter_hash
46
52
  @divided_parameter_hash ||=
47
- (parameters || []).
53
+ (@merged_parameter || []).
48
54
  group_by(&:in).
49
55
  map { |in_type, params| # rubocop:disable Style/BlockDelimiters
50
56
  [
@@ -1,5 +1,13 @@
1
1
  class OpenAPIParser::Config
2
2
  def initialize(config)
3
+ # TODO: This deprecation warning can be removed after we set the default to `true`
4
+ # in a later (major?) version update.
5
+ unless config.key?(:strict_reference_validation)
6
+ msg = "[DEPRECATION] strict_reference_validation config is not set. It defaults to `false` now, " +
7
+ "but will be `true` in a future version. Please explicitly set to `false` " +
8
+ "if you want to skip reference validation on schema load."
9
+ warn(msg)
10
+ end
3
11
  @config = config
4
12
  end
5
13
 
@@ -16,9 +24,15 @@ class OpenAPIParser::Config
16
24
  end
17
25
 
18
26
  def strict_response_validation
27
+ # TODO: in a major version update, change this to default to `true`.
28
+ # https://github.com/ota42y/openapi_parser/pull/123/files#r767142217
19
29
  @config.fetch(:strict_response_validation, false)
20
30
  end
21
31
 
32
+ def strict_reference_validation
33
+ @config.fetch(:strict_reference_validation, false)
34
+ end
35
+
22
36
  def validate_header
23
37
  @config.fetch(:validate_header, true)
24
38
  end
@@ -5,6 +5,12 @@ module OpenAPIParser
5
5
  end
6
6
  end
7
7
 
8
+ class MissingReferenceError < OpenAPIError
9
+ def message
10
+ "'#{@reference}' was referenced but could not be found"
11
+ end
12
+ end
13
+
8
14
  class ValidateError < OpenAPIError
9
15
  def initialize(data, type, reference)
10
16
  super(reference)
@@ -200,6 +206,17 @@ module OpenAPIParser
200
206
  end
201
207
  end
202
208
 
209
+ class InvalidDateTimeFormat < OpenAPIError
210
+ def initialize(value, reference)
211
+ super(reference)
212
+ @value = value
213
+ end
214
+
215
+ def message
216
+ "#{@reference} Value: #{@value.inspect} is not conformant with date-time format"
217
+ end
218
+ end
219
+
203
220
  class NotExistStatusCodeDefinition < OpenAPIError
204
221
  def message
205
222
  "#{@reference} status code definition does not exist"
@@ -1,8 +1,8 @@
1
1
  class OpenAPIParser::ReferenceExpander
2
2
  class << self
3
3
  # @param [OpenAPIParser::Schemas::OpenAPI] openapi
4
- def expand(openapi)
5
- openapi.expand_reference(openapi)
4
+ def expand(openapi, validate_references)
5
+ openapi.expand_reference(openapi, validate_references)
6
6
  openapi.purge_object_cache
7
7
  end
8
8
  end
@@ -65,7 +65,6 @@ class OpenAPIParser::RequestOperation
65
65
  # @param [OpenAPIParser::SchemaValidator::Options] options request validator options
66
66
  def validate_request_parameter(params, headers, options = nil)
67
67
  options ||= config.request_validator_options
68
- path_item&.validate_request_parameter(params, headers, options)
69
68
  operation_object&.validate_request_parameter(params, headers, options)
70
69
  end
71
70
 
@@ -1,6 +1,5 @@
1
1
  class OpenAPIParser::SchemaValidator
2
2
  class Base
3
- # @param [OpenAPIParser::SchemaValidator::Validatable] validatable
4
3
  def initialize(validatable, coerce_value)
5
4
  @validatable = validatable
6
5
  @coerce_value = coerce_value
@@ -8,21 +7,17 @@ class OpenAPIParser::SchemaValidator
8
7
 
9
8
  attr_reader :validatable
10
9
 
11
- # @!attribute [r] validatable
12
- # @return [OpenAPIParser::SchemaValidator::Validatable]
13
-
14
10
  # need override
15
- # @param [Array] _value
16
- # @param [OpenAPIParser::Schemas::Schema] _schema
17
11
  def coerce_and_validate(_value, _schema, **_keyword_args)
18
12
  raise 'need implement'
19
13
  end
20
14
 
21
15
  def validate_discriminator_schema(discriminator, value, parent_discriminator_schemas: [])
22
- unless value.key?(discriminator.property_name)
16
+ property_name = discriminator.property_name
17
+ unless (property_name && value.key?(property_name))
23
18
  return [nil, OpenAPIParser::NotExistDiscriminatorPropertyName.new(discriminator.property_name, value, discriminator.object_reference)]
24
19
  end
25
- mapping_key = value[discriminator.property_name]
20
+ mapping_key = value[property_name]
26
21
 
27
22
  # it's allowed to have discriminator without mapping, then we need to lookup discriminator.property_name
28
23
  # but the format is not the full path, just model name in the components
@@ -16,11 +16,6 @@ class OpenAPIParser::SchemaValidator
16
16
  value, err = pattern_validate(value, schema)
17
17
  return [nil, err] if err
18
18
 
19
- unless @datetime_coerce_class.nil?
20
- value, err = coerce_date_time(value, schema)
21
- return [nil, err] if err
22
- end
23
-
24
19
  value, err = validate_max_min_length(value, schema)
25
20
  return [nil, err] if err
26
21
 
@@ -33,28 +28,14 @@ class OpenAPIParser::SchemaValidator
33
28
  value, err = validate_date_format(value, schema)
34
29
  return [nil, err] if err
35
30
 
31
+ value, err = validate_datetime_format(value, schema)
32
+ return [nil, err] if err
33
+
36
34
  [value, nil]
37
35
  end
38
36
 
39
37
  private
40
38
 
41
- # @param [OpenAPIParser::Schemas::Schema] schema
42
- def coerce_date_time(value, schema)
43
- return parse_date_time(value, schema) if schema.format == 'date-time'
44
-
45
- [value, nil]
46
- end
47
-
48
- def parse_date_time(value, schema)
49
- begin
50
- return @datetime_coerce_class.parse(value), nil
51
- rescue ArgumentError => e
52
- raise e unless e.message =~ /invalid date/
53
- end
54
-
55
- OpenAPIParser::ValidateError.build_error_result(value, schema)
56
- end
57
-
58
39
  # @param [OpenAPIParser::Schemas::Schema] schema
59
40
  def pattern_validate(value, schema)
60
41
  # pattern support string only so put this
@@ -101,5 +82,27 @@ class OpenAPIParser::SchemaValidator
101
82
 
102
83
  return [value, nil]
103
84
  end
85
+
86
+ def validate_datetime_format(value, schema)
87
+ return [value, nil] unless schema.format == 'date-time'
88
+
89
+ begin
90
+ if @datetime_coerce_class.nil?
91
+ # validate only
92
+ DateTime.rfc3339(value)
93
+ [value, nil]
94
+ else
95
+ # validate and coerce
96
+ if @datetime_coerce_class == Time
97
+ [DateTime.rfc3339(value).to_time, nil]
98
+ else
99
+ [@datetime_coerce_class.rfc3339(value), nil]
100
+ end
101
+ end
102
+ rescue ArgumentError
103
+ # when rfc3339(value) failed
104
+ [nil, OpenAPIParser::InvalidDateTimeFormat.new(value, schema.object_reference)]
105
+ end
106
+ end
104
107
  end
105
108
  end
@@ -3,8 +3,6 @@
3
3
 
4
4
  module OpenAPIParser::Schemas
5
5
  class PathItem < Base
6
- include OpenAPIParser::ParameterValidatable
7
-
8
6
  openapi_attr_values :summary, :description
9
7
 
10
8
  openapi_attr_objects :get, :put, :post, :delete, :options, :head, :patch, :trace, Operation
@@ -16,5 +14,9 @@ module OpenAPIParser::Schemas
16
14
  rescue NoMethodError
17
15
  nil
18
16
  end
17
+
18
+ def set_path_item_to_operation
19
+ [:get, :put, :post, :delete, :options, :head, :patch, :trace].each{ |method| operation(method)&.set_parent_path_item(self)}
20
+ end
19
21
  end
20
22
  end
@@ -1,3 +1,3 @@
1
1
  module OpenAPIParser
2
- VERSION = '0.14.0'.freeze
2
+ VERSION = '1.0.0'.freeze
3
3
  end
@@ -44,9 +44,9 @@ module OpenAPIParser
44
44
  # Open-uri doesn't open file scheme uri, so we try to open file path directly
45
45
  # File scheme uri which points to a remote file is not supported.
46
46
  content = if uri.scheme == 'file'
47
- open(uri.path, &:read)
48
- else
49
- uri.open(&:read)
47
+ open(uri.path)&.read
48
+ elsif uri.is_a?(OpenURI::OpenRead)
49
+ uri.open()&.read
50
50
  end
51
51
 
52
52
  extension = Pathname.new(uri.path).extname
@@ -61,8 +61,8 @@ module OpenAPIParser
61
61
  URI.join("file:///", path.to_s)
62
62
  end
63
63
 
64
- def parse_file(content, extension)
65
- case extension.downcase
64
+ def parse_file(content, ext)
65
+ case ext.downcase
66
66
  when '.yaml', '.yml'
67
67
  parse_yaml(content)
68
68
  when '.json'
@@ -91,7 +91,12 @@ module OpenAPIParser
91
91
  def load_hash(hash, config:, uri:, schema_registry:)
92
92
  root = Schemas::OpenAPI.new(hash, config, uri: uri, schema_registry: schema_registry)
93
93
 
94
- OpenAPIParser::ReferenceExpander.expand(root) if config.expand_reference
94
+ OpenAPIParser::ReferenceExpander.expand(root, config.strict_reference_validation) if config.expand_reference
95
+
96
+ # TODO: use callbacks
97
+ root.paths&.path&.values&.each do | path_item |
98
+ path_item.set_path_item_to_operation
99
+ end
95
100
 
96
101
  root
97
102
  end
@@ -12,6 +12,7 @@ Gem::Specification.new do |spec|
12
12
  spec.description = 'parser for OpenAPI 3.0 or later'
13
13
  spec.homepage = 'https://github.com/ota42y/openapi_parser'
14
14
  spec.license = 'MIT'
15
+ spec.required_ruby_version = ">= 2.6.0"
15
16
 
16
17
  # Specify which files should be added to the gem when it is released.
17
18
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -24,10 +25,17 @@ Gem::Specification.new do |spec|
24
25
 
25
26
  spec.add_development_dependency 'bundler', '>= 1.16'
26
27
  spec.add_development_dependency 'fincop'
27
- spec.add_development_dependency 'pry', '~> 0.12.0'
28
- spec.add_development_dependency 'pry-byebug'
28
+
29
+ if Gem::Version.create(RUBY_VERSION) < Gem::Version.create("3.2.0")
30
+ spec.add_development_dependency 'pry', '~> 0.12.0'
31
+ spec.add_development_dependency 'pry-byebug'
32
+ end
29
33
  spec.add_development_dependency 'rake', '>= 12.3.3'
30
34
  spec.add_development_dependency 'rspec', '~> 3.0'
31
35
  spec.add_development_dependency 'rspec-parameterized'
32
36
  spec.add_development_dependency 'simplecov'
37
+ spec.add_development_dependency "steep"
38
+ # for steep
39
+ # https://github.com/soutaro/steep/issues/466
40
+ spec.add_development_dependency "activesupport", '~> 6.0'
33
41
  end
@@ -0,0 +1,17 @@
1
+ # Classes
2
+ module OpenAPIParser
3
+ class Config
4
+ @config: untyped
5
+ alias request_body_options request_validator_options
6
+ alias path_params_options request_validator_options
7
+
8
+ def initialize: (untyped config) -> untyped
9
+ def datetime_coerce_class: -> (singleton(Object) | nil)
10
+ def coerce_value: -> bool
11
+ def expand_reference: -> bool
12
+ def strict_response_validation: -> bool
13
+ def validate_header: -> bool
14
+ def request_validator_options: -> OpenAPIParser::SchemaValidator::Options
15
+ def response_validate_options: -> OpenAPIParser::SchemaValidator::ResponseValidateOptions
16
+ end
17
+ end
@@ -0,0 +1,46 @@
1
+ # Classes
2
+ module OpenAPIParser
3
+ class SchemaValidator
4
+ include Validatable
5
+ @value: Hash[bot, bot]
6
+ @schema: OpenAPIParser::Schemas::Schema
7
+ @coerce_value: bool | nil
8
+ @datetime_coerce_class: singleton(Object) | nil
9
+ @string_validator: OpenAPIParser::SchemaValidator::StringValidator | nil
10
+ @integer_validator: OpenAPIParser::SchemaValidator::IntegerValidator | nil
11
+ @float_validator: OpenAPIParser::SchemaValidator::FloatValidator | nil
12
+ @boolean_validator: OpenAPIParser::SchemaValidator::BooleanValidator | nil
13
+ @object_validator: OpenAPIParser::SchemaValidator::ObjectValidator | nil
14
+ @array_validator: OpenAPIParser::SchemaValidator::ArrayValidator | nil
15
+ @any_of_validator: OpenAPIParser::SchemaValidator::AnyOfValidator | nil
16
+ @all_of_validator: OpenAPIParser::SchemaValidator::AllOfValidator | nil
17
+ @one_of_validator: OpenAPIParser::SchemaValidator::OneOfValidator | nil
18
+ @nil_validator: OpenAPIParser::SchemaValidator::NilValidator | nil
19
+ @unspecified_type_validator: OpenAPIParser::SchemaValidator::UnspecifiedTypeValidator | nil
20
+
21
+ def self.validate: (Hash[bot, bot] value, OpenAPIParser::Schemas::Schema schema, OpenAPIParser::SchemaValidator::Options options) -> Object
22
+ def initialize: (Hash[bot, bot] value, OpenAPIParser::Schemas::Schema schema, OpenAPIParser::SchemaValidator::Options options) -> untyped
23
+ def validate_data: -> Object
24
+ def validate_schema: (Object value, OpenAPIParser::Schemas::Schema schema, **bot) -> [Object, OpenAPIParser::validate_error]
25
+ def validate_integer: (Object value, OpenAPIParser::Schemas::Schema schema) -> [Object, OpenAPIParser::validate_error]
26
+
27
+ private
28
+ def validator: (Object value, OpenAPIParser::Schemas::Schema schema) -> [OpenAPIParser::SchemaValidator::Base, OpenAPIParser::validate_error]
29
+ def string_validator: -> OpenAPIParser::SchemaValidator::StringValidator
30
+ def integer_validator: -> OpenAPIParser::SchemaValidator::IntegerValidator
31
+ def float_validator: -> OpenAPIParser::SchemaValidator::FloatValidator
32
+ def boolean_validator: -> OpenAPIParser::SchemaValidator::BooleanValidator
33
+ def object_validator: -> OpenAPIParser::SchemaValidator::ObjectValidator
34
+ def array_validator: -> OpenAPIParser::SchemaValidator::ArrayValidator
35
+ def any_of_validator: -> OpenAPIParser::SchemaValidator::AnyOfValidator
36
+ def all_of_validator: -> OpenAPIParser::SchemaValidator::AllOfValidator
37
+ def one_of_validator: -> OpenAPIParser::SchemaValidator::OneOfValidator
38
+ def nil_validator: -> OpenAPIParser::SchemaValidator::NilValidator
39
+ def unspecified_type_validator: -> OpenAPIParser::SchemaValidator::UnspecifiedTypeValidator
40
+
41
+ module Validatable
42
+ def validate_schema: (Object value, OpenAPIParser::Schemas::Schema schema, **untyped) -> [Object, OpenAPIParser::validate_error]
43
+ def validate_integer: (Object _value, OpenAPIParser::Schemas::Schema _schema) -> [Object, OpenAPIParser::validate_error]
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,17 @@
1
+ # Classes
2
+ module OpenAPIParser
3
+ class SchemaValidator
4
+ class Base
5
+ @coerce_value: bool | nil
6
+
7
+ def initialize: (OpenAPIParser::SchemaValidator::Validatable validatable, (bool | nil) coerce_value) -> untyped
8
+ attr_reader validatable: OpenAPIParser::SchemaValidator::Validatable
9
+ def coerce_and_validate: (Object _value, OpenAPIParser::Schemas::Schema _schema, **untyped) -> bot
10
+ def validate_discriminator_schema: (
11
+ OpenAPIParser::Schemas::Discriminator discriminator,
12
+ Hash[String, bot] value,
13
+ ?parent_discriminator_schemas: Array[OpenAPIParser::Schemas::Schema]
14
+ ) -> [Object | nil, OpenAPIParser::validate_error]
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # Classes
2
+ module OpenAPIParser
3
+ class SchemaValidator
4
+ class Options
5
+ attr_reader coerce_value: bool | nil
6
+ attr_reader datetime_coerce_class: singleton(Object) | nil
7
+ attr_reader validate_header: bool
8
+ def initialize: (?coerce_value: bool | nil, ?datetime_coerce_class: singleton(Object) | nil, ?validate_header: bool) -> untyped
9
+ end
10
+
11
+ class ResponseValidateOptions
12
+ attr_reader strict: bool
13
+ attr_reader validate_header: bool
14
+ def initialize: (?strict: bool, ?validate_header: bool) -> untyped
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # Classes
2
+ module OpenAPIParser
3
+ module Schemas
4
+ class Base
5
+ include OpenAPIParser::Expandable
6
+ include OpenAPIParser::Findable
7
+
8
+ attr_reader parent: OpenAPIParser::Schemas::Base | nil
9
+ attr_reader raw_schema: Hash[String, bot]
10
+ attr_reader object_reference: String
11
+ attr_reader root: OpenAPIParser::Schemas::OpenAPI
12
+ def initialize: (String object_reference, OpenAPIParser::Schemas::Base | nil parent, OpenAPIParser::Schemas::OpenAPI root, Hash[String, bot] raw_schema) -> nil
13
+ def after_init: -> nil
14
+ def inspect: -> String
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ module OpenAPIParser
2
+ VERSION: String
3
+ end
@@ -0,0 +1,19 @@
1
+ module OpenAPIParser
2
+ def self.parse: (Hash[bot, bot] schema, ?Hash[bot, bot] config) -> OpenAPIParser::Schemas::OpenAPI
3
+ def self.parse_with_filepath: (Hash[bot, bot] schema, String filepath, ?Hash[bot, bot] config) -> OpenAPIParser::Schemas::OpenAPI
4
+ def self.load: (String filepath, ?Hash[bot, bot] config) -> OpenAPIParser::Schemas::OpenAPI
5
+ def self.load_uri: (OpenAPIParser::readable_uri uri, config: untyped, schema_registry: Hash[bot, bot]) -> OpenAPIParser::Schemas::OpenAPI
6
+ def self.file_uri: (String filepath) -> URI::Generic
7
+ def self.parse_file: (String? content, String ext) -> Hash[bot, bot]
8
+ def self.parse_yaml: (String? content) -> Hash[bot, bot]
9
+ def self.parse_json: (String? content) -> Hash[bot, bot]
10
+ def self.load_hash: (Hash[bot, bot] hash, config: untyped, uri: OpenAPIParser::readable_uri?, schema_registry: Hash[bot, bot]) -> OpenAPIParser::Schemas::OpenAPI
11
+ end
12
+
13
+ module OpenAPIParser
14
+ module Schemas
15
+ class OpenAPI
16
+ def initialize: (Hash[bot, bot] hash, untyped config, uri: OpenAPIParser::readable_uri?, schema_registry: Hash[bot, bot]) -> OpenAPIParser::Schemas::OpenAPI
17
+ end
18
+ end
19
+ end
data/sig/types.rbs ADDED
@@ -0,0 +1,8 @@
1
+ module OpenURI
2
+ module OpenRead
3
+ def open: () -> (IO | nil)
4
+ def path: () -> String
5
+ def scheme: () -> String
6
+ end
7
+ end
8
+
data/sig/wip_types.rbs ADDED
@@ -0,0 +1,67 @@
1
+ module OpenAPIParser
2
+ type readable_uri = URI::Generic | OpenURI::OpenRead
3
+ type validate_error = nil
4
+ end
5
+
6
+ module OpenAPIParser
7
+ module Schemas
8
+ class Schema
9
+ end
10
+ end
11
+ end
12
+
13
+ class OpenAPIParser::SchemaValidator::Base
14
+ end
15
+
16
+ class OpenAPIParser::SchemaValidator::StringValidator
17
+ end
18
+
19
+ class OpenAPIParser::SchemaValidator::IntegerValidator
20
+ end
21
+
22
+ class OpenAPIParser::SchemaValidator::FloatValidator
23
+ end
24
+
25
+ class OpenAPIParser::SchemaValidator::BooleanValidator
26
+ end
27
+
28
+ class OpenAPIParser::SchemaValidator::ObjectValidator
29
+ end
30
+
31
+ class OpenAPIParser::SchemaValidator::ArrayValidator
32
+ end
33
+
34
+ class OpenAPIParser::SchemaValidator::AnyOfValidator
35
+ end
36
+
37
+ class OpenAPIParser::SchemaValidator::AllOfValidator
38
+ end
39
+
40
+ class OpenAPIParser::SchemaValidator::OneOfValidator
41
+ end
42
+
43
+ class OpenAPIParser::SchemaValidator::NilValidator
44
+ end
45
+
46
+ class OpenAPIParser::SchemaValidator::UnspecifiedTypeValidator
47
+ end
48
+
49
+ class OpenAPIParser::Schemas::OpenAPI < OpenAPIParser::Schemas::Base
50
+ attr_reader paths: untyped
51
+ end
52
+
53
+ module OpenAPIParser::Expandable
54
+ def expand_reference: (OpenAPIParser::Schemas::OpenAPI root) -> nil
55
+ end
56
+
57
+ module OpenAPIParser::Findable
58
+ def find_object: (String reference) -> ::OpenAPIParser::Schemas::Schema
59
+ end
60
+
61
+ class OpenAPIParser::Schemas::Discriminator < OpenAPIParser::Schemas::Base
62
+ attr_reader property_name: (String | nil)
63
+ attr_reader mapping: Hash[String, String]
64
+ end
65
+
66
+ class OpenAPIParser::OpenAPIError
67
+ 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: 0.14.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ota42y
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-06-12 00:00:00.000000000 Z
11
+ date: 2022-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -122,6 +122,34 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: steep
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: activesupport
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '6.0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '6.0'
125
153
  description: parser for OpenAPI 3.0 or later
126
154
  email:
127
155
  - ota42y@gmail.com
@@ -134,12 +162,14 @@ files:
134
162
  - ".rspec"
135
163
  - ".rubocop.yml"
136
164
  - ".rubocop_ignore.yml"
165
+ - ".ruby-version"
137
166
  - CHANGELOG.md
138
167
  - CODE_OF_CONDUCT.md
139
168
  - Gemfile
140
169
  - LICENSE.txt
141
170
  - README.md
142
171
  - Rakefile
172
+ - Steepfile
143
173
  - bin/console
144
174
  - bin/setup
145
175
  - lib/openapi_parser.rb
@@ -204,6 +234,15 @@ files:
204
234
  - lib/openapi_parser/schemas/schema.rb
205
235
  - lib/openapi_parser/version.rb
206
236
  - openapi_parser.gemspec
237
+ - sig/openapi_parser.rbs
238
+ - sig/openapi_parser/config.rbs
239
+ - sig/openapi_parser/schema_validator.rbs
240
+ - sig/openapi_parser/schema_validators/base.rbs
241
+ - sig/openapi_parser/schema_validators/options.rbs
242
+ - sig/openapi_parser/schemas/base.rbs
243
+ - sig/openapi_parser/version.rbs
244
+ - sig/types.rbs
245
+ - sig/wip_types.rbs
207
246
  homepage: https://github.com/ota42y/openapi_parser
208
247
  licenses:
209
248
  - MIT
@@ -216,14 +255,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
216
255
  requirements:
217
256
  - - ">="
218
257
  - !ruby/object:Gem::Version
219
- version: '0'
258
+ version: 2.6.0
220
259
  required_rubygems_version: !ruby/object:Gem::Requirement
221
260
  requirements:
222
261
  - - ">="
223
262
  - !ruby/object:Gem::Version
224
263
  version: '0'
225
264
  requirements: []
226
- rubygems_version: 3.2.3
265
+ rubygems_version: 3.3.3
227
266
  signing_key:
228
267
  specification_version: 4
229
268
  summary: OpenAPI3 parser