From 51ad0ed5e3a8a346b8c5cd1cf216e49bb86333e8 Mon Sep 17 00:00:00 2001 From: Daniel Fone Date: Sat, 4 Jul 2020 22:19:10 +1200 Subject: [PATCH 1/2] Validate path params defined on the path item Since parameters can be defined on both the path item or the operation, we need to validate path params against both objects, like we do with the query params. --- lib/openapi_parser/request_operation.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/openapi_parser/request_operation.rb b/lib/openapi_parser/request_operation.rb index f6b4d07..241950e 100644 --- a/lib/openapi_parser/request_operation.rb +++ b/lib/openapi_parser/request_operation.rb @@ -41,6 +41,7 @@ def initialize(http_method, result, config) def validate_path_params(options = nil) options ||= config.path_params_options + path_item&.validate_path_params(path_params, options) operation_object&.validate_path_params(path_params, options) end From 5fb59c653ecd0c5d4775fdb39f983d76f288e7ef Mon Sep 17 00:00:00 2001 From: Daniel Fone Date: Sun, 30 Aug 2020 21:53:36 +1200 Subject: [PATCH 2/2] Support inherited parameters for operations Since parameters can be defined at either the path item or operation level, operation params are effectively merged into the existing path item params for the given location. Per OpenAPI Specification 3.0.3: > If a parameter is already defined at the Path Item, the new definition will override it but can never remove it. The list MUST NOT include duplicated parameters. A unique parameter is defined by a combination of a name and location. --- .../concerns/parameter_validatable.rb | 24 +++++++++---------- lib/openapi_parser/request_operation.rb | 2 -- lib/openapi_parser/schemas/operation.rb | 15 ++++++++++++ 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/lib/openapi_parser/concerns/parameter_validatable.rb b/lib/openapi_parser/concerns/parameter_validatable.rb index 78c7031..1e56377 100644 --- a/lib/openapi_parser/concerns/parameter_validatable.rb +++ b/lib/openapi_parser/concerns/parameter_validatable.rb @@ -13,6 +13,18 @@ def validate_request_parameter(params, headers, options) validate_query_parameter(params, object_reference, options) end + def header_parameter_hash + divided_parameter_hash['header'] || {} + end + + def path_parameter_hash + divided_parameter_hash['path'] || {} + end + + def query_parameter_hash + divided_parameter_hash['query'] || {} + end + private # @param [Hash] params query parameter hash @@ -29,18 +41,6 @@ def validate_header_parameter(headers, object_reference, options) OpenAPIParser::ParameterValidator.validate_parameter(header_parameter_hash, headers, object_reference, options, true) end - def header_parameter_hash - divided_parameter_hash['header'] || [] - end - - def path_parameter_hash - divided_parameter_hash['path'] || [] - end - - def query_parameter_hash - divided_parameter_hash['query'] || [] - end - # @return [Hash{String => Hash{String => Parameter}}] hash[in][name] => Parameter def divided_parameter_hash @divided_parameter_hash ||= diff --git a/lib/openapi_parser/request_operation.rb b/lib/openapi_parser/request_operation.rb index 241950e..d0312b9 100644 --- a/lib/openapi_parser/request_operation.rb +++ b/lib/openapi_parser/request_operation.rb @@ -41,7 +41,6 @@ def initialize(http_method, result, config) def validate_path_params(options = nil) options ||= config.path_params_options - path_item&.validate_path_params(path_params, options) operation_object&.validate_path_params(path_params, options) end @@ -66,7 +65,6 @@ def validate_response_body(response_body, response_validate_options = nil) # @param [OpenAPIParser::SchemaValidator::Options] options request validator options def validate_request_parameter(params, headers, options = nil) options ||= config.request_validator_options - path_item&.validate_request_parameter(params, headers, options) operation_object&.validate_request_parameter(params, headers, options) end diff --git a/lib/openapi_parser/schemas/operation.rb b/lib/openapi_parser/schemas/operation.rb index 96b729c..d5fe12e 100644 --- a/lib/openapi_parser/schemas/operation.rb +++ b/lib/openapi_parser/schemas/operation.rb @@ -7,6 +7,8 @@ module OpenAPIParser::Schemas class Operation < Base include OpenAPIParser::ParameterValidatable + alias path_item parent + openapi_attr_values :tags, :summary, :description, :deprecated openapi_attr_value :operation_id, schema_key: :operationId @@ -30,5 +32,18 @@ def validate_request_body(content_type, params, options) def validate_response(response_body, response_validate_options) responses&.validate(response_body, response_validate_options) end + + def header_parameter_hash + @header_parameter_hash ||= path_item.header_parameter_hash.merge(super) + end + + def path_parameter_hash + @path_parameter_hash ||= path_item.path_parameter_hash.merge(super) + end + + def query_parameter_hash + @query_parameter_hash ||= path_item.query_parameter_hash.merge(super) + end + end end