openapi_parser_firetail 1.0.0
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 +7 -0
- data/.github/workflows/ci.yaml +25 -0
- data/.gitignore +15 -0
- data/.rspec +3 -0
- data/.rubocop.yml +13 -0
- data/.rubocop_ignore.yml +6 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +132 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +21 -0
- data/README.md +112 -0
- data/Rakefile +10 -0
- data/Steepfile +11 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/openapi_parser/concern.rb +5 -0
- data/lib/openapi_parser/concerns/expandable.rb +87 -0
- data/lib/openapi_parser/concerns/findable.rb +54 -0
- data/lib/openapi_parser/concerns/media_type_selectable.rb +29 -0
- data/lib/openapi_parser/concerns/parameter_validatable.rb +62 -0
- data/lib/openapi_parser/concerns/parser/core.rb +21 -0
- data/lib/openapi_parser/concerns/parser/hash.rb +10 -0
- data/lib/openapi_parser/concerns/parser/hash_body.rb +12 -0
- data/lib/openapi_parser/concerns/parser/list.rb +10 -0
- data/lib/openapi_parser/concerns/parser/object.rb +14 -0
- data/lib/openapi_parser/concerns/parser/value.rb +14 -0
- data/lib/openapi_parser/concerns/parser.rb +45 -0
- data/lib/openapi_parser/concerns/schema_loader/base.rb +28 -0
- data/lib/openapi_parser/concerns/schema_loader/creator.rb +48 -0
- data/lib/openapi_parser/concerns/schema_loader/hash_body_loader.rb +37 -0
- data/lib/openapi_parser/concerns/schema_loader/hash_objects_loader.rb +29 -0
- data/lib/openapi_parser/concerns/schema_loader/list_loader.rb +28 -0
- data/lib/openapi_parser/concerns/schema_loader/objects_loader.rb +21 -0
- data/lib/openapi_parser/concerns/schema_loader/values_loader.rb +10 -0
- data/lib/openapi_parser/concerns/schema_loader.rb +58 -0
- data/lib/openapi_parser/config.rb +55 -0
- data/lib/openapi_parser/errors.rb +281 -0
- data/lib/openapi_parser/parameter_validator.rb +33 -0
- data/lib/openapi_parser/path_item_finder.rb +161 -0
- data/lib/openapi_parser/reference_expander.rb +9 -0
- data/lib/openapi_parser/request_operation.rb +90 -0
- data/lib/openapi_parser/schema_validator/all_of_validator.rb +40 -0
- data/lib/openapi_parser/schema_validator/any_of_validator.rb +18 -0
- data/lib/openapi_parser/schema_validator/array_validator.rb +32 -0
- data/lib/openapi_parser/schema_validator/base.rb +39 -0
- data/lib/openapi_parser/schema_validator/boolean_validator.rb +29 -0
- data/lib/openapi_parser/schema_validator/enumable.rb +13 -0
- data/lib/openapi_parser/schema_validator/float_validator.rb +34 -0
- data/lib/openapi_parser/schema_validator/integer_validator.rb +32 -0
- data/lib/openapi_parser/schema_validator/minimum_maximum.rb +38 -0
- data/lib/openapi_parser/schema_validator/nil_validator.rb +11 -0
- data/lib/openapi_parser/schema_validator/object_validator.rb +56 -0
- data/lib/openapi_parser/schema_validator/one_of_validator.rb +22 -0
- data/lib/openapi_parser/schema_validator/options.rb +29 -0
- data/lib/openapi_parser/schema_validator/string_validator.rb +108 -0
- data/lib/openapi_parser/schema_validator/unspecified_type_validator.rb +8 -0
- data/lib/openapi_parser/schema_validator.rb +164 -0
- data/lib/openapi_parser/schemas/base.rb +28 -0
- data/lib/openapi_parser/schemas/classes.rb +22 -0
- data/lib/openapi_parser/schemas/components.rb +32 -0
- data/lib/openapi_parser/schemas/discriminator.rb +11 -0
- data/lib/openapi_parser/schemas/header.rb +18 -0
- data/lib/openapi_parser/schemas/info.rb +6 -0
- data/lib/openapi_parser/schemas/media_type.rb +18 -0
- data/lib/openapi_parser/schemas/openapi.rb +63 -0
- data/lib/openapi_parser/schemas/operation.rb +50 -0
- data/lib/openapi_parser/schemas/parameter.rb +20 -0
- data/lib/openapi_parser/schemas/path_item.rb +22 -0
- data/lib/openapi_parser/schemas/paths.rb +7 -0
- data/lib/openapi_parser/schemas/reference.rb +7 -0
- data/lib/openapi_parser/schemas/request_body.rb +34 -0
- data/lib/openapi_parser/schemas/response.rb +54 -0
- data/lib/openapi_parser/schemas/responses.rb +56 -0
- data/lib/openapi_parser/schemas/schema.rb +117 -0
- data/lib/openapi_parser/schemas/security.rb +7 -0
- data/lib/openapi_parser/schemas/security_schemes.rb +20 -0
- data/lib/openapi_parser/schemas.rb +20 -0
- data/lib/openapi_parser/version.rb +3 -0
- data/lib/openapi_parser.rb +108 -0
- data/openapi_parser.gemspec +43 -0
- data/sig/openapi_parser/config.rbs +19 -0
- data/sig/openapi_parser/errors.rbs +22 -0
- data/sig/openapi_parser/reference_expander.rbs +3 -0
- data/sig/openapi_parser/schema_validator.rbs +46 -0
- data/sig/openapi_parser/schema_validators/base.rbs +18 -0
- data/sig/openapi_parser/schema_validators/options.rbs +17 -0
- data/sig/openapi_parser/schemas/base.rbs +17 -0
- data/sig/openapi_parser/version.rbs +3 -0
- data/sig/openapi_parser.rbs +19 -0
- data/sig/types.rbs +13 -0
- data/sig/wip_types.rbs +64 -0
- metadata +288 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
module OpenAPIParser::ParameterValidatable
|
|
2
|
+
# @param [Hash] path_params path parameters
|
|
3
|
+
# @param [OpenAPIParser::SchemaValidator::Options] options request validator options
|
|
4
|
+
def validate_path_params(path_params, options)
|
|
5
|
+
OpenAPIParser::ParameterValidator.validate_parameter(path_parameter_hash, path_params, object_reference, options)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
# @param [Hash] params parameter hash
|
|
9
|
+
# @param [Hash] headers headers hash
|
|
10
|
+
# @param [OpenAPIParser::SchemaValidator::Options] options request validator options
|
|
11
|
+
def validate_request_parameter(params, headers, options)
|
|
12
|
+
validate_header_parameter(headers, object_reference, options) if options.validate_header
|
|
13
|
+
validate_query_parameter(params, object_reference, options)
|
|
14
|
+
end
|
|
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
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
# @param [Hash] params query parameter hash
|
|
25
|
+
# @param [String] object_reference
|
|
26
|
+
# @param [OpenAPIParser::SchemaValidator::Options] options request validator options
|
|
27
|
+
def validate_query_parameter(params, object_reference, options)
|
|
28
|
+
OpenAPIParser::ParameterValidator.validate_parameter(query_parameter_hash, params, object_reference, options)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# @param [Hash] headers header hash
|
|
32
|
+
# @param [String] object_reference
|
|
33
|
+
# @param [OpenAPIParser::SchemaValidator::Options] options request validator options
|
|
34
|
+
def validate_header_parameter(headers, object_reference, options)
|
|
35
|
+
OpenAPIParser::ParameterValidator.validate_parameter(header_parameter_hash, headers, object_reference, options, true)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def header_parameter_hash
|
|
39
|
+
divided_parameter_hash['header'] || []
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def path_parameter_hash
|
|
43
|
+
divided_parameter_hash['path'] || []
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def query_parameter_hash
|
|
47
|
+
divided_parameter_hash['query'] || []
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# @return [Hash{String => Hash{String => Parameter}}] hash[in][name] => Parameter
|
|
51
|
+
def divided_parameter_hash
|
|
52
|
+
@divided_parameter_hash ||=
|
|
53
|
+
(@merged_parameter || []).
|
|
54
|
+
group_by(&:in).
|
|
55
|
+
map { |in_type, params| # rubocop:disable Style/BlockDelimiters
|
|
56
|
+
[
|
|
57
|
+
in_type,
|
|
58
|
+
params.map { |param| [param.name, param] }.to_h,
|
|
59
|
+
]
|
|
60
|
+
}.to_h
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require_relative './value'
|
|
2
|
+
require_relative './object'
|
|
3
|
+
require_relative './list'
|
|
4
|
+
require_relative './hash'
|
|
5
|
+
require_relative './hash_body'
|
|
6
|
+
|
|
7
|
+
class OpenAPIParser::Parser::Core
|
|
8
|
+
include OpenAPIParser::Parser::Value
|
|
9
|
+
include OpenAPIParser::Parser::Object
|
|
10
|
+
include OpenAPIParser::Parser::List
|
|
11
|
+
include OpenAPIParser::Parser::Hash
|
|
12
|
+
include OpenAPIParser::Parser::HashBody
|
|
13
|
+
|
|
14
|
+
def initialize(target_klass)
|
|
15
|
+
@target_klass = target_klass
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
attr_reader :target_klass
|
|
21
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
module OpenAPIParser::Parser::Hash
|
|
2
|
+
def _openapi_attr_hash_objects
|
|
3
|
+
@_openapi_attr_hash_objects ||= {}
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def openapi_attr_hash_object(name, klass, options = {})
|
|
7
|
+
target_klass.send(:attr_reader, name)
|
|
8
|
+
_openapi_attr_hash_objects[name] = ::OpenAPIParser::SchemaLoader::HashObjectsLoader.new(name, options.merge(klass: klass))
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module OpenAPIParser::Parser::HashBody
|
|
2
|
+
def _openapi_attr_hash_body_objects
|
|
3
|
+
@_openapi_attr_hash_body_objects ||= {}
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def openapi_attr_hash_body_objects(name, klass, options = {})
|
|
7
|
+
# options[:reject_keys] = options[:reject_keys] ? options[:reject_keys].map(&:to_s) : []
|
|
8
|
+
|
|
9
|
+
target_klass.send(:attr_reader, name)
|
|
10
|
+
_openapi_attr_hash_body_objects[name] = ::OpenAPIParser::SchemaLoader::HashBodyLoader.new(name, options.merge(klass: klass))
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
module OpenAPIParser::Parser::List
|
|
2
|
+
def _openapi_attr_list_objects
|
|
3
|
+
@_openapi_attr_list_objects ||= {}
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def openapi_attr_list_object(name, klass, options = {})
|
|
7
|
+
target_klass.send(:attr_reader, name)
|
|
8
|
+
_openapi_attr_list_objects[name] = OpenAPIParser::SchemaLoader::ListLoader.new(name, options.merge(klass: klass))
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module OpenAPIParser::Parser::Object
|
|
2
|
+
def _openapi_attr_objects
|
|
3
|
+
@_openapi_attr_objects ||= {}
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def openapi_attr_objects(*names, klass)
|
|
7
|
+
names.each { |name| openapi_attr_object(name, klass) }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def openapi_attr_object(name, klass, options = {})
|
|
11
|
+
target_klass.send(:attr_reader, name)
|
|
12
|
+
_openapi_attr_objects[name] = OpenAPIParser::SchemaLoader::ObjectsLoader.new(name, options.merge(klass: klass))
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module OpenAPIParser::Parser::Value
|
|
2
|
+
def _openapi_attr_values
|
|
3
|
+
@_openapi_attr_values ||= {}
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def openapi_attr_values(*names)
|
|
7
|
+
names.each { |name| openapi_attr_value(name) }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def openapi_attr_value(name, options = {})
|
|
11
|
+
target_klass.send(:attr_reader, name)
|
|
12
|
+
_openapi_attr_values[name] = OpenAPIParser::SchemaLoader::ValuesLoader.new(name, options)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module OpenAPIParser::Parser
|
|
2
|
+
end
|
|
3
|
+
|
|
4
|
+
require 'forwardable'
|
|
5
|
+
|
|
6
|
+
require_relative './parser/core'
|
|
7
|
+
require_relative './schema_loader'
|
|
8
|
+
|
|
9
|
+
module OpenAPIParser::Parser
|
|
10
|
+
def self.included(base)
|
|
11
|
+
base.extend(ClassMethods)
|
|
12
|
+
end
|
|
13
|
+
module ClassMethods
|
|
14
|
+
extend Forwardable
|
|
15
|
+
|
|
16
|
+
def_delegators :_parser_core, :_openapi_attr_values, :openapi_attr_value, :openapi_attr_values
|
|
17
|
+
def_delegators :_parser_core, :_openapi_attr_objects, :openapi_attr_objects, :openapi_attr_object
|
|
18
|
+
def_delegators :_parser_core, :_openapi_attr_list_objects, :openapi_attr_list_object
|
|
19
|
+
def_delegators :_parser_core, :_openapi_attr_hash_objects, :openapi_attr_hash_object
|
|
20
|
+
def_delegators :_parser_core, :_openapi_attr_hash_body_objects, :openapi_attr_hash_body_objects
|
|
21
|
+
|
|
22
|
+
def _parser_core
|
|
23
|
+
@_parser_core ||= OpenAPIParser::Parser::Core.new(self)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @param [OpenAPIParser::Schemas::Base] old
|
|
28
|
+
# @param [OpenAPIParser::Schemas::Base] new
|
|
29
|
+
def _update_child_object(old, new)
|
|
30
|
+
_openapi_all_child_objects[old.object_reference] = new
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# @return [Hash{String => OpenAPIParser::Schemas::Base}]
|
|
34
|
+
def _openapi_all_child_objects
|
|
35
|
+
@_openapi_all_child_objects ||= {}
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# load data by schema definition in core and set children to _openapi_all_child_objects
|
|
39
|
+
# @return nil
|
|
40
|
+
def load_data
|
|
41
|
+
loader = ::OpenAPIParser::SchemaLoader.new(self, self.class._parser_core)
|
|
42
|
+
@_openapi_all_child_objects = loader.load_data
|
|
43
|
+
nil
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# loader base class
|
|
2
|
+
class OpenAPIParser::SchemaLoader::Base
|
|
3
|
+
# @param [String] variable_name
|
|
4
|
+
# @param [Hash] options
|
|
5
|
+
def initialize(variable_name, options)
|
|
6
|
+
@variable_name = variable_name
|
|
7
|
+
@schema_key = options[:schema_key] || variable_name
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# @param [OpenAPIParser::Schemas::Base] _target_object
|
|
11
|
+
# @param [Hash] _raw_schema
|
|
12
|
+
# @return [Array<OpenAPIParser::Schemas::Base>, nil]
|
|
13
|
+
def load_data(_target_object, _raw_schema)
|
|
14
|
+
raise 'need implement'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
attr_reader :variable_name, :schema_key
|
|
20
|
+
|
|
21
|
+
# create instance variable @variable_name using data
|
|
22
|
+
# @param [OpenAPIParser::Schemas::Base] target
|
|
23
|
+
# @param [String] variable_name
|
|
24
|
+
# @param [Object] data
|
|
25
|
+
def variable_set(target, variable_name, data)
|
|
26
|
+
target.instance_variable_set("@#{variable_name}", data)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# loader base class for create OpenAPI::Schemas::Base object
|
|
2
|
+
class OpenAPIParser::SchemaLoader::Creator < OpenAPIParser::SchemaLoader::Base
|
|
3
|
+
# @param [String] variable_name
|
|
4
|
+
# @param [Hash] options
|
|
5
|
+
def initialize(variable_name, options)
|
|
6
|
+
super(variable_name, options)
|
|
7
|
+
|
|
8
|
+
@klass = options[:klass]
|
|
9
|
+
@allow_reference = options[:reference] || false
|
|
10
|
+
@allow_data_type = options[:allow_data_type]
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
attr_reader :klass, :allow_reference, :allow_data_type
|
|
16
|
+
|
|
17
|
+
def build_object_reference_from_base(base, names)
|
|
18
|
+
names = [names] unless names.kind_of?(Array)
|
|
19
|
+
ref = names.map { |n| escape_reference(n) }.join('/')
|
|
20
|
+
|
|
21
|
+
"#{base}/#{ref}"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @return Boolean
|
|
25
|
+
def check_reference_schema?(check_schema)
|
|
26
|
+
check_object_schema?(check_schema) && !check_schema['$ref'].nil?
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def check_object_schema?(check_schema)
|
|
30
|
+
check_schema.kind_of?(::Hash)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def escape_reference(str)
|
|
34
|
+
str.to_s.gsub('/', '~1')
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def build_openapi_object_from_option(target_object, ref, schema)
|
|
38
|
+
return nil if schema.nil?
|
|
39
|
+
|
|
40
|
+
if @allow_data_type && !check_object_schema?(schema)
|
|
41
|
+
schema
|
|
42
|
+
elsif @allow_reference && check_reference_schema?(schema)
|
|
43
|
+
OpenAPIParser::Schemas::Reference.new(ref, target_object, target_object.root, schema)
|
|
44
|
+
else
|
|
45
|
+
@klass.new(ref, target_object, target_object.root, schema)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# hash body object loader
|
|
2
|
+
class OpenAPIParser::SchemaLoader::HashBodyLoader < OpenAPIParser::SchemaLoader::Creator
|
|
3
|
+
# @param [String] variable_name
|
|
4
|
+
# @param [Hash] options
|
|
5
|
+
def initialize(variable_name, options)
|
|
6
|
+
super(variable_name, options)
|
|
7
|
+
|
|
8
|
+
@reject_keys = options[:reject_keys] ? options[:reject_keys].map(&:to_s) : []
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# @param [OpenAPIParser::Schemas::Base] target_object
|
|
12
|
+
# @param [Hash] raw_schema
|
|
13
|
+
# @return [Array<OpenAPIParser::Schemas::Base>, nil]
|
|
14
|
+
def load_data(target_object, raw_schema)
|
|
15
|
+
# raw schema always exist because if not exist' this object don't create
|
|
16
|
+
create_hash_body_objects(target_object, raw_schema)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
# for responses and paths object
|
|
22
|
+
def create_hash_body_objects(target_object, raw_schema)
|
|
23
|
+
object_list = raw_schema.reject { |k, _| reject_keys.include?(k) }.map do |child_name, child_schema|
|
|
24
|
+
ref = build_object_reference_from_base(target_object.object_reference, escape_reference(child_name))
|
|
25
|
+
[
|
|
26
|
+
child_name.to_s, # support string key only in OpenAPI3
|
|
27
|
+
build_openapi_object_from_option(target_object, ref, child_schema),
|
|
28
|
+
]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
objects = object_list.to_h
|
|
32
|
+
variable_set(target_object, variable_name, objects)
|
|
33
|
+
objects.values
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
attr_reader :reject_keys
|
|
37
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# hash object loader
|
|
2
|
+
class OpenAPIParser::SchemaLoader::HashObjectsLoader < OpenAPIParser::SchemaLoader::Creator
|
|
3
|
+
# @param [OpenAPIParser::Schemas::Base] target_object
|
|
4
|
+
# @param [Hash] raw_schema
|
|
5
|
+
# @return [Array<OpenAPIParser::Schemas::Base>, nil]
|
|
6
|
+
def load_data(target_object, raw_schema)
|
|
7
|
+
create_attr_hash_object(target_object, raw_schema[ref_name_base.to_s])
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
private
|
|
11
|
+
|
|
12
|
+
def create_attr_hash_object(target_object, hash_schema)
|
|
13
|
+
unless hash_schema
|
|
14
|
+
variable_set(target_object, variable_name, nil)
|
|
15
|
+
return
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
data_list = hash_schema.map do |key, s|
|
|
19
|
+
ref = build_object_reference_from_base(target_object.object_reference, [ref_name_base, key])
|
|
20
|
+
[key, build_openapi_object_from_option(target_object, ref, s)]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
data = data_list.to_h
|
|
24
|
+
variable_set(target_object, variable_name, data)
|
|
25
|
+
data.values
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
alias_method :ref_name_base, :schema_key
|
|
29
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# list object loader
|
|
2
|
+
class OpenAPIParser::SchemaLoader::ListLoader < OpenAPIParser::SchemaLoader::Creator
|
|
3
|
+
# @param [OpenAPIParser::Schemas::Base] target_object
|
|
4
|
+
# @param [Hash] raw_schema
|
|
5
|
+
# @return [Array<OpenAPIParser::Schemas::Base>, nil]
|
|
6
|
+
def load_data(target_object, raw_schema)
|
|
7
|
+
create_attr_list_object(target_object, raw_schema[ref_name_base.to_s])
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
private
|
|
11
|
+
|
|
12
|
+
def create_attr_list_object(target_object, array_schema)
|
|
13
|
+
unless array_schema
|
|
14
|
+
variable_set(target_object, variable_name, nil)
|
|
15
|
+
return
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
data = array_schema.map.with_index do |s, idx|
|
|
19
|
+
ref = build_object_reference_from_base(target_object.object_reference, [ref_name_base, idx])
|
|
20
|
+
build_openapi_object_from_option(target_object, ref, s)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
variable_set(target_object, variable_name, data)
|
|
24
|
+
data
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
alias_method :ref_name_base, :schema_key
|
|
28
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Specific Object loader (defined by klass option)
|
|
2
|
+
class OpenAPIParser::SchemaLoader::ObjectsLoader < OpenAPIParser::SchemaLoader::Creator
|
|
3
|
+
# @param [OpenAPIParser::Schemas::Base] target_object
|
|
4
|
+
# @param [Hash] raw_schema
|
|
5
|
+
# @return [Array<OpenAPIParser::Schemas::Base>, nil]
|
|
6
|
+
def load_data(target_object, raw_schema)
|
|
7
|
+
obj = create_attr_object(target_object, raw_schema[schema_key.to_s])
|
|
8
|
+
[obj]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
# @return [OpenAPIParser::Schemas::Base]
|
|
14
|
+
def create_attr_object(target_object, schema)
|
|
15
|
+
ref = build_object_reference_from_base(target_object.object_reference, schema_key)
|
|
16
|
+
|
|
17
|
+
data = build_openapi_object_from_option(target_object, ref, schema)
|
|
18
|
+
variable_set(target_object, variable_name, data)
|
|
19
|
+
data
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# data type values loader
|
|
2
|
+
class OpenAPIParser::SchemaLoader::ValuesLoader < OpenAPIParser::SchemaLoader::Base
|
|
3
|
+
# @param [OpenAPIParser::Schemas::Base] target_object
|
|
4
|
+
# @param [Hash] raw_schema
|
|
5
|
+
# @return [Array<OpenAPIParser::Schemas::Base>, nil]
|
|
6
|
+
def load_data(target_object, raw_schema)
|
|
7
|
+
variable_set(target_object, variable_name, raw_schema[schema_key.to_s])
|
|
8
|
+
nil # this loader not return schema object
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
class OpenAPIParser::SchemaLoader
|
|
2
|
+
end
|
|
3
|
+
|
|
4
|
+
require_relative './schema_loader/base'
|
|
5
|
+
require_relative './schema_loader/creator'
|
|
6
|
+
require_relative './schema_loader/values_loader'
|
|
7
|
+
require_relative './schema_loader/list_loader'
|
|
8
|
+
require_relative './schema_loader/objects_loader'
|
|
9
|
+
require_relative './schema_loader/hash_objects_loader'
|
|
10
|
+
require_relative './schema_loader/hash_body_loader'
|
|
11
|
+
|
|
12
|
+
# load data to target_object by schema definition in core
|
|
13
|
+
class OpenAPIParser::SchemaLoader
|
|
14
|
+
# @param [OpenAPIParser::Schemas::Base] target_object
|
|
15
|
+
# @param [OpenAPIParser::Parser::Core] core
|
|
16
|
+
def initialize(target_object, core)
|
|
17
|
+
@target_object = target_object
|
|
18
|
+
@core = core
|
|
19
|
+
@children = {}
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @!attribute [r] children
|
|
23
|
+
# @return [Array<OpenAPIParser::Schemas::Base>]
|
|
24
|
+
attr_reader :children
|
|
25
|
+
|
|
26
|
+
# execute load data
|
|
27
|
+
# return data is equal to :children
|
|
28
|
+
# @return [Array<OpenAPIParser::Schemas::Base>]
|
|
29
|
+
def load_data
|
|
30
|
+
all_loader.each { |l| load_data_by_schema_loader(l) }
|
|
31
|
+
children
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
attr_reader :core, :target_object
|
|
37
|
+
|
|
38
|
+
# @param [OpenAPIParser::SchemaLoader::Base] schema_loader
|
|
39
|
+
def load_data_by_schema_loader(schema_loader)
|
|
40
|
+
children = schema_loader.load_data(target_object, target_object.raw_schema)
|
|
41
|
+
|
|
42
|
+
children.each { |c| register_child(c) } if children
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def register_child(object)
|
|
46
|
+
return unless object.kind_of?(OpenAPIParser::Parser)
|
|
47
|
+
|
|
48
|
+
@children[object.object_reference] = object
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def all_loader
|
|
52
|
+
core._openapi_attr_values.values +
|
|
53
|
+
core._openapi_attr_objects.values +
|
|
54
|
+
core._openapi_attr_list_objects.values +
|
|
55
|
+
core._openapi_attr_hash_objects.values +
|
|
56
|
+
core._openapi_attr_hash_body_objects.values
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
class OpenAPIParser::Config
|
|
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
|
|
11
|
+
@config = config
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def datetime_coerce_class
|
|
15
|
+
@config[:datetime_coerce_class]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def coerce_value
|
|
19
|
+
@config[:coerce_value]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def expand_reference
|
|
23
|
+
@config.fetch(:expand_reference, true)
|
|
24
|
+
end
|
|
25
|
+
|
|
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
|
|
29
|
+
@config.fetch(:strict_response_validation, false)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def strict_reference_validation
|
|
33
|
+
@config.fetch(:strict_reference_validation, false)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def validate_header
|
|
37
|
+
@config.fetch(:validate_header, true)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# @return [OpenAPIParser::SchemaValidator::Options]
|
|
41
|
+
def request_validator_options
|
|
42
|
+
@request_validator_options ||= OpenAPIParser::SchemaValidator::Options.new(coerce_value: coerce_value,
|
|
43
|
+
datetime_coerce_class: datetime_coerce_class,
|
|
44
|
+
validate_header: validate_header)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
alias_method :request_body_options, :request_validator_options
|
|
48
|
+
alias_method :path_params_options, :request_validator_options
|
|
49
|
+
|
|
50
|
+
# @return [OpenAPIParser::SchemaValidator::ResponseValidateOptions]
|
|
51
|
+
def response_validate_options
|
|
52
|
+
@response_validate_options ||= OpenAPIParser::SchemaValidator::ResponseValidateOptions.
|
|
53
|
+
new(strict: strict_response_validation, validate_header: validate_header)
|
|
54
|
+
end
|
|
55
|
+
end
|