committee 4.4.0 → 5.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 +4 -4
- data/lib/committee/drivers/open_api_2/driver.rb +1 -1
- data/lib/committee/drivers/open_api_2/parameter_schema_builder.rb +1 -1
- data/lib/committee/drivers.rb +21 -9
- data/lib/committee/middleware/base.rb +5 -4
- data/lib/committee/middleware/request_validation.rb +1 -8
- data/lib/committee/middleware/response_validation.rb +13 -14
- data/lib/committee/request_unpacker.rb +1 -1
- data/lib/committee/schema_validator/hyper_schema/response_validator.rb +8 -2
- data/lib/committee/schema_validator/open_api_3/operation_wrapper.rb +36 -33
- data/lib/committee/schema_validator/open_api_3/request_validator.rb +11 -2
- data/lib/committee/schema_validator/open_api_3.rb +28 -15
- data/lib/committee/schema_validator/option.rb +5 -13
- data/lib/committee/schema_validator.rb +1 -1
- data/lib/committee/test/methods.rb +2 -7
- data/lib/committee/version.rb +5 -0
- data/lib/committee.rb +9 -2
- data/test/committee_test.rb +28 -2
- data/test/drivers/open_api_3/driver_test.rb +1 -1
- data/test/drivers_test.rb +20 -7
- data/test/middleware/base_test.rb +6 -13
- data/test/middleware/request_validation_open_api_3_test.rb +117 -41
- data/test/middleware/request_validation_test.rb +1 -28
- data/test/middleware/response_validation_open_api_3_test.rb +46 -3
- data/test/middleware/response_validation_test.rb +6 -25
- data/test/schema_validator/hyper_schema/response_validator_test.rb +10 -0
- data/test/schema_validator/hyper_schema/string_params_coercer_test.rb +1 -1
- data/test/schema_validator/open_api_3/operation_wrapper_test.rb +55 -11
- data/test/schema_validator/open_api_3/request_validator_test.rb +25 -1
- data/test/schema_validator/open_api_3/response_validator_test.rb +14 -0
- data/test/test/methods_new_version_test.rb +1 -1
- data/test/test/methods_test.rb +11 -31
- data/test/test_helper.rb +15 -5
- metadata +9 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 284c8c1198255435e959dcee2b92cb25c3d80dd5fe6d4622b8077a69525712ed
|
4
|
+
data.tar.gz: b306ec0ad5e628d9cc7b6382781c4b710c99bedb127a7000edadf9d0e0b8fa84
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 687d9a47d2a17786313bde939339d464a8d775795458b09ad7d7784bfa337f848a9ffabe240e9f39173c4466589c026f64a8eede768e7abfff4b01b2672339f5
|
7
|
+
data.tar.gz: 4ee7781341de9ebafae28d01d98c0f72d54067c425f3ee10b221c4eb88da85e79b36853bbda4818b20348177f8d975103cc5be694ff7e8252a6634a856853b7c
|
@@ -59,7 +59,7 @@ module Committee
|
|
59
59
|
schema.base_path = data['basePath'] || ''
|
60
60
|
|
61
61
|
# Arbitrarily choose the first media type found in these arrays. This
|
62
|
-
#
|
62
|
+
# approach could probably stand to be improved, but at least users will
|
63
63
|
# for now have the option of turning media type validation off if they so
|
64
64
|
# choose.
|
65
65
|
schema.consumes = data['consumes'].first
|
@@ -62,7 +62,7 @@ module Committee
|
|
62
62
|
# And same idea: despite parameters not being schemas, the items
|
63
63
|
# key (if preset) is actually a schema that defines each item of an
|
64
64
|
# array type, so we can just reflect that directly onto our
|
65
|
-
#
|
65
|
+
# artificial schema.
|
66
66
|
if param_data["type"] == "array" && param_data["items"]
|
67
67
|
param_schema.items = param_data["items"]
|
68
68
|
end
|
data/lib/committee/drivers.rb
CHANGED
@@ -20,26 +20,27 @@ module Committee
|
|
20
20
|
# load and build drive from JSON file
|
21
21
|
# @param [String] schema_path
|
22
22
|
# @return [Committee::Driver]
|
23
|
-
def self.load_from_json(schema_path)
|
24
|
-
load_from_data(JSON.parse(File.read(schema_path)), schema_path)
|
23
|
+
def self.load_from_json(schema_path, parser_options: {})
|
24
|
+
load_from_data(JSON.parse(File.read(schema_path)), schema_path, parser_options: parser_options)
|
25
25
|
end
|
26
26
|
|
27
27
|
# load and build drive from YAML file
|
28
28
|
# @param [String] schema_path
|
29
29
|
# @return [Committee::Driver]
|
30
|
-
def self.load_from_yaml(schema_path)
|
31
|
-
|
30
|
+
def self.load_from_yaml(schema_path, parser_options: {})
|
31
|
+
data = YAML.respond_to?(:unsafe_load_file) ? YAML.unsafe_load_file(schema_path) : YAML.load_file(schema_path)
|
32
|
+
load_from_data(data, schema_path, parser_options: parser_options)
|
32
33
|
end
|
33
34
|
|
34
35
|
# load and build drive from file
|
35
36
|
# @param [String] schema_path
|
36
37
|
# @return [Committee::Driver]
|
37
|
-
def self.load_from_file(schema_path)
|
38
|
+
def self.load_from_file(schema_path, parser_options: {})
|
38
39
|
case File.extname(schema_path)
|
39
40
|
when '.json'
|
40
|
-
load_from_json(schema_path)
|
41
|
+
load_from_json(schema_path, parser_options: parser_options)
|
41
42
|
when '.yaml', '.yml'
|
42
|
-
load_from_yaml(schema_path)
|
43
|
+
load_from_yaml(schema_path, parser_options: parser_options)
|
43
44
|
else
|
44
45
|
raise "Committee only supports the following file extensions: '.json', '.yaml', '.yml'"
|
45
46
|
end
|
@@ -48,9 +49,19 @@ module Committee
|
|
48
49
|
# load and build drive from Hash object
|
49
50
|
# @param [Hash] hash
|
50
51
|
# @return [Committee::Driver]
|
51
|
-
def self.load_from_data(hash, schema_path = nil)
|
52
|
+
def self.load_from_data(hash, schema_path = nil, parser_options: {})
|
52
53
|
if hash['openapi']&.start_with?('3.0.')
|
53
|
-
|
54
|
+
# From the next major version, we want to ensure `{ strict_reference_validation: true }`
|
55
|
+
# as a parser option here, but since it may break existing implementations, just warn
|
56
|
+
# if it is not explicitly set. See: https://github.com/interagent/committee/issues/343#issuecomment-997400329
|
57
|
+
opts = parser_options.dup
|
58
|
+
|
59
|
+
Committee.warn_deprecated_until_6(!opts.key?(:strict_reference_validation), 'openapi_parser will default to strict reference validation ' +
|
60
|
+
'from next version. Pass config `strict_reference_validation: true` (or false, if you must) ' +
|
61
|
+
'to quiet this warning.')
|
62
|
+
opts[:strict_reference_validation] ||= false
|
63
|
+
|
64
|
+
openapi = OpenAPIParser.parse_with_filepath(hash, schema_path, opts)
|
54
65
|
return Committee::Drivers::OpenAPI3::Driver.new.parse(openapi)
|
55
66
|
end
|
56
67
|
|
@@ -60,6 +71,7 @@ module Committee
|
|
60
71
|
Committee::Drivers::HyperSchema::Driver.new
|
61
72
|
end
|
62
73
|
|
74
|
+
# TODO: in the future, pass `opts` here and allow optionality in other drivers?
|
63
75
|
driver.parse(hash)
|
64
76
|
end
|
65
77
|
end
|
@@ -30,11 +30,12 @@ module Committee
|
|
30
30
|
class << self
|
31
31
|
def get_schema(options)
|
32
32
|
schema = options[:schema]
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
33
|
+
if !schema && options[:schema_path]
|
34
|
+
# In the future, we could have `parser_options` as an exposed config?
|
35
|
+
parser_options = options.key?(:strict_reference_validation) ? { strict_reference_validation: options[:strict_reference_validation] } : {}
|
36
|
+
schema = Committee::Drivers::load_from_file(options[:schema_path], parser_options: parser_options)
|
37
37
|
end
|
38
|
+
raise(ArgumentError, "Committee: need option `schema` or `schema_path`") unless schema
|
38
39
|
|
39
40
|
# Expect the type we want by now. If we don't have it, the user passed
|
40
41
|
# something else non-standard in.
|
@@ -34,14 +34,7 @@ module Committee
|
|
34
34
|
private
|
35
35
|
|
36
36
|
def handle_exception(e, env)
|
37
|
-
|
38
|
-
|
39
|
-
if @error_handler.arity > 1
|
40
|
-
@error_handler.call(e, env)
|
41
|
-
else
|
42
|
-
Committee.warn_deprecated('Using `error_handler.call(exception)` is deprecated and will be change to `error_handler.call(exception, request.env)` in next major version.')
|
43
|
-
@error_handler.call(e)
|
44
|
-
end
|
37
|
+
@error_handler.call(e, env) if @error_handler
|
45
38
|
end
|
46
39
|
end
|
47
40
|
end
|
@@ -7,10 +7,7 @@ module Committee
|
|
7
7
|
|
8
8
|
def initialize(app, options = {})
|
9
9
|
super
|
10
|
-
|
11
|
-
unless options[:strict].nil?
|
12
|
-
Committee.warn_deprecated("Committee: Committee::Middleware::ResponseValidation doesn't support strict option now but we'll support this option. This change break backward compatibility so please remove strict option from ResponseValidation")
|
13
|
-
end
|
10
|
+
@strict = options[:strict]
|
14
11
|
@validate_success_only = @schema.validator_option.validate_success_only
|
15
12
|
end
|
16
13
|
|
@@ -19,7 +16,7 @@ module Committee
|
|
19
16
|
|
20
17
|
begin
|
21
18
|
v = build_schema_validator(request)
|
22
|
-
v.response_validate(status, headers, response) if v.link_exist? && self.class.validate?(status, validate_success_only)
|
19
|
+
v.response_validate(status, headers, response, @strict) if v.link_exist? && self.class.validate?(status, validate_success_only)
|
23
20
|
|
24
21
|
rescue Committee::InvalidResponse
|
25
22
|
handle_exception($!, request.env)
|
@@ -38,21 +35,23 @@ module Committee
|
|
38
35
|
|
39
36
|
class << self
|
40
37
|
def validate?(status, validate_success_only)
|
41
|
-
|
38
|
+
case status
|
39
|
+
when 204
|
40
|
+
false
|
41
|
+
when 200..299
|
42
|
+
true
|
43
|
+
when 304
|
44
|
+
false
|
45
|
+
else
|
46
|
+
!validate_success_only
|
47
|
+
end
|
42
48
|
end
|
43
49
|
end
|
44
50
|
|
45
51
|
private
|
46
52
|
|
47
53
|
def handle_exception(e, env)
|
48
|
-
|
49
|
-
|
50
|
-
if @error_handler.arity > 1
|
51
|
-
@error_handler.call(e, env)
|
52
|
-
else
|
53
|
-
Committee.warn_deprecated('Using `error_handler.call(exception)` is deprecated and will be change to `error_handler.call(exception, request.env)` in next major version.')
|
54
|
-
@error_handler.call(e)
|
55
|
-
end
|
54
|
+
@error_handler.call(e, env) if @error_handler
|
56
55
|
end
|
57
56
|
end
|
58
57
|
end
|
@@ -27,7 +27,7 @@ module Committee
|
|
27
27
|
@optimistic_json = options[:optimistic_json]
|
28
28
|
end
|
29
29
|
|
30
|
-
#
|
30
|
+
# return params and is_form_params
|
31
31
|
def unpack_request_params(request)
|
32
32
|
# if Content-Type is empty or JSON, and there was a request body, try to
|
33
33
|
# interpret it as JSON
|
@@ -14,7 +14,7 @@ module Committee
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def call(status, headers, data)
|
17
|
-
unless status
|
17
|
+
unless [204, 304].include?(status) # 204 No Content or 304 Not Modified
|
18
18
|
response = Rack::Response.new(data, status, headers)
|
19
19
|
check_content_type!(response)
|
20
20
|
end
|
@@ -48,9 +48,15 @@ module Committee
|
|
48
48
|
private
|
49
49
|
|
50
50
|
def response_media_type(response)
|
51
|
-
response.
|
51
|
+
if response.respond_to?(:media_type)
|
52
|
+
response.media_type.to_s
|
53
|
+
else
|
54
|
+
# for rack compatibility. In rack v 1.5.0, Rack::Response doesn't have media_type
|
55
|
+
response.content_type.to_s.split(";").first.to_s
|
56
|
+
end
|
52
57
|
end
|
53
58
|
|
59
|
+
|
54
60
|
def check_content_type!(response)
|
55
61
|
if @link.media_type
|
56
62
|
unless Rack::Mime.match?(response_media_type(response), @link.media_type)
|
@@ -39,18 +39,12 @@ module Committee
|
|
39
39
|
raise Committee::InvalidResponse.new(e.message, original_error: e)
|
40
40
|
end
|
41
41
|
|
42
|
-
def validate_request_params(
|
42
|
+
def validate_request_params(path_params, query_params, body_params, headers, validator_option)
|
43
43
|
ret, err = case request_operation.http_method
|
44
|
-
when 'get'
|
45
|
-
validate_get_request_params(
|
46
|
-
when 'post'
|
47
|
-
validate_post_request_params(
|
48
|
-
when 'put'
|
49
|
-
validate_post_request_params(params, headers, validator_option)
|
50
|
-
when 'patch'
|
51
|
-
validate_post_request_params(params, headers, validator_option)
|
52
|
-
when 'delete'
|
53
|
-
validate_get_request_params(params, headers, validator_option)
|
44
|
+
when 'get', 'delete', 'head'
|
45
|
+
validate_get_request_params(path_params, query_params, headers, validator_option)
|
46
|
+
when 'post', 'put', 'patch', 'options'
|
47
|
+
validate_post_request_params(path_params, query_params, body_params, headers, validator_option)
|
54
48
|
else
|
55
49
|
raise "Committee OpenAPI3 not support #{request_operation.http_method} method"
|
56
50
|
end
|
@@ -58,6 +52,10 @@ module Committee
|
|
58
52
|
ret
|
59
53
|
end
|
60
54
|
|
55
|
+
def optional_body?
|
56
|
+
!request_operation.operation_object&.request_body&.required
|
57
|
+
end
|
58
|
+
|
61
59
|
def valid_request_content_type?(content_type)
|
62
60
|
if (request_body = request_operation.operation_object&.request_body)
|
63
61
|
!request_body.select_media_type(content_type).nil?
|
@@ -80,28 +78,17 @@ module Committee
|
|
80
78
|
# @return [OpenAPIParser::RequestOperation]
|
81
79
|
|
82
80
|
# @return [OpenAPIParser::SchemaValidator::Options]
|
83
|
-
def
|
84
|
-
|
85
|
-
datetime_coerce_class = validator_option.coerce_date_times ? DateTime : nil
|
86
|
-
validate_header = validator_option.check_header
|
87
|
-
OpenAPIParser::SchemaValidator::Options.new(coerce_value: coerce_value,
|
88
|
-
datetime_coerce_class: datetime_coerce_class,
|
89
|
-
validate_header: validate_header)
|
81
|
+
def build_openapi_parser_body_option(validator_option)
|
82
|
+
build_openapi_parser_option(validator_option, validator_option.coerce_form_params)
|
90
83
|
end
|
91
84
|
|
92
85
|
# @return [OpenAPIParser::SchemaValidator::Options]
|
93
|
-
def
|
94
|
-
|
95
|
-
datetime_coerce_class = validator_option.coerce_date_times ? DateTime : nil
|
96
|
-
validate_header = validator_option.check_header
|
97
|
-
OpenAPIParser::SchemaValidator::Options.new(coerce_value: coerce_value,
|
98
|
-
datetime_coerce_class: datetime_coerce_class,
|
99
|
-
validate_header: validate_header)
|
86
|
+
def build_openapi_parser_path_option(validator_option)
|
87
|
+
build_openapi_parser_option(validator_option, validator_option.coerce_query_params)
|
100
88
|
end
|
101
89
|
|
102
90
|
# @return [OpenAPIParser::SchemaValidator::Options]
|
103
|
-
def
|
104
|
-
coerce_value = validator_option.coerce_query_params
|
91
|
+
def build_openapi_parser_option(validator_option, coerce_value)
|
105
92
|
datetime_coerce_class = validator_option.coerce_date_times ? DateTime : nil
|
106
93
|
validate_header = validator_option.check_header
|
107
94
|
OpenAPIParser::SchemaValidator::Options.new(coerce_value: coerce_value,
|
@@ -109,24 +96,40 @@ module Committee
|
|
109
96
|
validate_header: validate_header)
|
110
97
|
end
|
111
98
|
|
112
|
-
def validate_get_request_params(
|
99
|
+
def validate_get_request_params(path_params, query_params, headers, validator_option)
|
113
100
|
# bad performance because when we coerce value, same check
|
114
|
-
|
101
|
+
validate_path_and_query_params(path_params, query_params, headers, validator_option)
|
115
102
|
rescue OpenAPIParser::OpenAPIError => e
|
116
103
|
raise Committee::InvalidRequest.new(e.message, original_error: e)
|
117
104
|
end
|
118
105
|
|
119
|
-
def validate_post_request_params(
|
106
|
+
def validate_post_request_params(path_params, query_params, body_params, headers, validator_option)
|
120
107
|
content_type = headers['Content-Type'].to_s.split(";").first.to_s
|
121
108
|
|
122
109
|
# bad performance because when we coerce value, same check
|
123
|
-
|
124
|
-
request_operation.
|
125
|
-
request_operation.validate_request_body(content_type, params, schema_validator_options)
|
110
|
+
validate_path_and_query_params(path_params, query_params, headers, validator_option)
|
111
|
+
request_operation.validate_request_body(content_type, body_params, build_openapi_parser_body_option(validator_option))
|
126
112
|
rescue => e
|
127
113
|
raise Committee::InvalidRequest.new(e.message, original_error: e)
|
128
114
|
end
|
129
115
|
|
116
|
+
def validate_path_and_query_params(path_params, query_params, headers, validator_option)
|
117
|
+
# it's currently impossible to validate path params and query params separately
|
118
|
+
# so we have to resort to this workaround
|
119
|
+
|
120
|
+
path_keys = path_params.keys.to_set
|
121
|
+
query_keys = query_params.keys.to_set
|
122
|
+
|
123
|
+
merged_params = query_params.merge(path_params)
|
124
|
+
|
125
|
+
request_operation.validate_request_parameter(merged_params, headers, build_openapi_parser_path_option(validator_option))
|
126
|
+
|
127
|
+
merged_params.each do |k, v|
|
128
|
+
path_params[k] = v if path_keys.include?(k)
|
129
|
+
query_params[k] = v if query_keys.include?(k)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
130
133
|
def response_validate_options(strict, check_header)
|
131
134
|
::OpenAPIParser::SchemaValidator::ResponseValidateOptions.new(strict: strict, validate_header: check_header)
|
132
135
|
end
|
@@ -11,11 +11,11 @@ module Committee
|
|
11
11
|
@validator_option = validator_option
|
12
12
|
end
|
13
13
|
|
14
|
-
def call(request,
|
14
|
+
def call(request, path_params, query_params, body_params, headers)
|
15
15
|
content_type = ::Committee::SchemaValidator.request_media_type(request)
|
16
16
|
check_content_type(request, content_type) if @validator_option.check_content_type
|
17
17
|
|
18
|
-
@operation_object.validate_request_params(
|
18
|
+
@operation_object.validate_request_params(path_params, query_params, body_params, headers, @validator_option)
|
19
19
|
end
|
20
20
|
|
21
21
|
private
|
@@ -24,6 +24,7 @@ module Committee
|
|
24
24
|
# support post, put, patch only
|
25
25
|
return true unless request.post? || request.put? || request.patch?
|
26
26
|
return true if @operation_object.valid_request_content_type?(content_type)
|
27
|
+
return true if @operation_object.optional_body? && empty_request?(request)
|
27
28
|
|
28
29
|
message = if valid_content_types.size > 1
|
29
30
|
types = valid_content_types.map {|x| %{"#{x}"} }.join(', ')
|
@@ -37,6 +38,14 @@ module Committee
|
|
37
38
|
def valid_content_types
|
38
39
|
@operation_object&.request_content_types
|
39
40
|
end
|
41
|
+
|
42
|
+
def empty_request?(request)
|
43
|
+
return true if !request.body
|
44
|
+
|
45
|
+
data = request.body.read
|
46
|
+
request.body.rewind
|
47
|
+
data.empty?
|
48
|
+
end
|
40
49
|
end
|
41
50
|
end
|
42
51
|
end
|
@@ -17,7 +17,7 @@ module Committee
|
|
17
17
|
request_unpack(request)
|
18
18
|
request_schema_validation(request)
|
19
19
|
|
20
|
-
|
20
|
+
copy_coerced_data_to_params(request)
|
21
21
|
end
|
22
22
|
|
23
23
|
def response_validate(status, headers, response, test_method = false)
|
@@ -34,6 +34,7 @@ module Committee
|
|
34
34
|
full_body
|
35
35
|
end
|
36
36
|
|
37
|
+
# TODO: refactoring name
|
37
38
|
strict = test_method
|
38
39
|
Committee::SchemaValidator::OpenAPI3::ResponseValidator.
|
39
40
|
new(@operation_object, validator_option).
|
@@ -57,7 +58,19 @@ module Committee
|
|
57
58
|
return unless @operation_object
|
58
59
|
|
59
60
|
validator = Committee::SchemaValidator::OpenAPI3::RequestValidator.new(@operation_object, validator_option: validator_option)
|
60
|
-
validator.call(request, request
|
61
|
+
validator.call(request, path_params(request), query_params(request), body_params(request), header(request))
|
62
|
+
end
|
63
|
+
|
64
|
+
def path_params(request)
|
65
|
+
request.env[validator_option.path_hash_key]
|
66
|
+
end
|
67
|
+
|
68
|
+
def query_params(request)
|
69
|
+
request.env[validator_option.query_hash_key]
|
70
|
+
end
|
71
|
+
|
72
|
+
def body_params(request)
|
73
|
+
request.env[validator_option.request_body_hash_key]
|
61
74
|
end
|
62
75
|
|
63
76
|
def header(request)
|
@@ -79,22 +92,22 @@ module Committee
|
|
79
92
|
request.env[validator_option.path_hash_key] = coerce_path_params
|
80
93
|
|
81
94
|
query_param = unpacker.unpack_query_params(request)
|
82
|
-
|
83
|
-
request.env[validator_option.
|
84
|
-
request.env[validator_option.params_key].merge!(Committee::Utils.deep_copy(query_param))
|
85
|
-
request.env[validator_option.params_key].merge!(Committee::Utils.deep_copy(request.env[validator_option.request_body_hash_key]))
|
86
|
-
request.env[validator_option.params_key].merge!(Committee::Utils.deep_copy(request.env[validator_option.path_hash_key]))
|
95
|
+
query_param.merge!(request_param) if request.get? && validator_option.allow_get_body
|
96
|
+
request.env[validator_option.query_hash_key] = query_param
|
87
97
|
end
|
88
98
|
|
89
|
-
def
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
99
|
+
def copy_coerced_data_to_params(request)
|
100
|
+
order = if validator_option.parameter_overwite_by_rails_rule
|
101
|
+
# (high priority) path_hash_key -> query_param -> request_body_hash
|
102
|
+
[validator_option.request_body_hash_key, validator_option.query_hash_key, validator_option.path_hash_key]
|
103
|
+
else
|
104
|
+
# (high priority) path_hash_key -> request_body_hash -> query_param
|
105
|
+
[validator_option.query_hash_key, validator_option.request_body_hash_key, validator_option.path_hash_key]
|
106
|
+
end
|
94
107
|
|
95
|
-
request.env[
|
96
|
-
|
97
|
-
request.env[
|
108
|
+
request.env[validator_option.params_key] = Committee::Utils.indifferent_hash
|
109
|
+
order.each do |key|
|
110
|
+
request.env[validator_option.params_key].merge!(Committee::Utils.deep_copy(request.env[key]))
|
98
111
|
end
|
99
112
|
end
|
100
113
|
end
|
@@ -16,7 +16,8 @@ module Committee
|
|
16
16
|
:coerce_recursive,
|
17
17
|
:optimistic_json,
|
18
18
|
:validate_success_only,
|
19
|
-
:parse_response_by_content_type
|
19
|
+
:parse_response_by_content_type,
|
20
|
+
:parameter_overwite_by_rails_rule
|
20
21
|
|
21
22
|
# Non-boolean options:
|
22
23
|
attr_reader :headers_key,
|
@@ -30,12 +31,7 @@ module Committee
|
|
30
31
|
# Non-boolean options
|
31
32
|
@headers_key = options[:headers_key] || "committee.headers"
|
32
33
|
@params_key = options[:params_key] || "committee.params"
|
33
|
-
@query_hash_key =
|
34
|
-
Committee.warn_deprecated('Committee: please set query_hash_key = rack.request.query_hash because we\'ll change default value in next major version.')
|
35
|
-
'rack.request.query_hash'
|
36
|
-
else
|
37
|
-
options.fetch(:query_hash_key)
|
38
|
-
end
|
34
|
+
@query_hash_key = options[:query_hash_key] || "committee.query_hash"
|
39
35
|
@path_hash_key = options[:path_hash_key] || "committee.path_hash"
|
40
36
|
@request_body_hash_key = options[:request_body_hash_key] || "committee.request_body_hash"
|
41
37
|
|
@@ -48,12 +44,8 @@ module Committee
|
|
48
44
|
@check_header = options.fetch(:check_header, true)
|
49
45
|
@coerce_recursive = options.fetch(:coerce_recursive, true)
|
50
46
|
@optimistic_json = options.fetch(:optimistic_json, false)
|
51
|
-
@parse_response_by_content_type =
|
52
|
-
|
53
|
-
false
|
54
|
-
else
|
55
|
-
options.fetch(:parse_response_by_content_type)
|
56
|
-
end
|
47
|
+
@parse_response_by_content_type = options.fetch(:parse_response_by_content_type, true)
|
48
|
+
@parameter_overwite_by_rails_rule = options.fetch(:parameter_overwite_by_rails_rule, true)
|
57
49
|
|
58
50
|
# Boolean options and have a different value by default
|
59
51
|
@allow_get_body = options.fetch(:allow_get_body, schema.driver.default_allow_get_body)
|
@@ -26,7 +26,7 @@ module Committee
|
|
26
26
|
status, headers, body = response_data
|
27
27
|
|
28
28
|
if expected_status.nil?
|
29
|
-
Committee.
|
29
|
+
Committee.need_good_option('Pass expected response status code to check it against the corresponding schema explicitly.')
|
30
30
|
elsif expected_status != status
|
31
31
|
response = "Expected `#{expected_status}` status code, but it was `#{status}`."
|
32
32
|
raise Committee::InvalidResponse.new(response)
|
@@ -77,12 +77,7 @@ module Committee
|
|
77
77
|
end
|
78
78
|
|
79
79
|
def old_behavior
|
80
|
-
|
81
|
-
if old_assert_behavior.nil?
|
82
|
-
Committee.warn_deprecated('Now assert_schema_conform check response schema only. but we will change check request and response in future major version. so if you want to conform response only, please use assert_response_schema_confirm, or you can suppress this message and keep old behavior by setting old_assert_behavior=true.')
|
83
|
-
old_assert_behavior = true
|
84
|
-
end
|
85
|
-
old_assert_behavior
|
80
|
+
committee_options.fetch(:old_assert_behavior, false)
|
86
81
|
end
|
87
82
|
end
|
88
83
|
end
|
data/lib/committee.rb
CHANGED
@@ -6,6 +6,8 @@ require "json_schema"
|
|
6
6
|
require "rack"
|
7
7
|
require 'openapi_parser'
|
8
8
|
|
9
|
+
require_relative "committee/version"
|
10
|
+
|
9
11
|
module Committee
|
10
12
|
def self.debug?
|
11
13
|
ENV["COMMITTEE_DEBUG"]
|
@@ -15,8 +17,13 @@ module Committee
|
|
15
17
|
$stderr.puts(message) if debug?
|
16
18
|
end
|
17
19
|
|
18
|
-
def self.
|
19
|
-
warn(
|
20
|
+
def self.need_good_option(message)
|
21
|
+
warn(message)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.warn_deprecated_until_6(cond, message)
|
25
|
+
raise "remove deprecated!" unless Committee::VERSION.start_with?("5")
|
26
|
+
warn("[DEPRECATION] #{message}") if cond
|
20
27
|
end
|
21
28
|
end
|
22
29
|
|
data/test/committee_test.rb
CHANGED
@@ -31,21 +31,47 @@ describe Committee do
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
+
it "warns need_good_option" do
|
35
|
+
old_stderr = $stderr
|
36
|
+
$stderr = StringIO.new
|
37
|
+
begin
|
38
|
+
Committee.need_good_option "show"
|
39
|
+
assert_equal "show\n", $stderr.string
|
40
|
+
ensure
|
41
|
+
$stderr = old_stderr
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
34
45
|
it "warns on deprecated unless $VERBOSE is nil" do
|
35
46
|
old_stderr = $stderr
|
36
47
|
old_verbose = $VERBOSE
|
37
48
|
$stderr = StringIO.new
|
38
49
|
begin
|
39
50
|
$VERBOSE = nil
|
40
|
-
Committee.
|
51
|
+
Committee.warn_deprecated_until_6 true, "blah"
|
41
52
|
assert_equal "", $stderr.string
|
42
53
|
|
43
54
|
$VERBOSE = true
|
44
|
-
Committee.
|
55
|
+
Committee.warn_deprecated_until_6 true, "blah"
|
45
56
|
assert_equal "[DEPRECATION] blah\n", $stderr.string
|
46
57
|
ensure
|
47
58
|
$stderr = old_stderr
|
48
59
|
$VERBOSE = old_verbose
|
49
60
|
end
|
50
61
|
end
|
62
|
+
|
63
|
+
|
64
|
+
it "doesn't warns on deprecated if cond is false" do
|
65
|
+
old_stderr = $stderr
|
66
|
+
old_verbose = $VERBOSE
|
67
|
+
$stderr = StringIO.new
|
68
|
+
begin
|
69
|
+
$VERBOSE = true
|
70
|
+
Committee.warn_deprecated_until_6 false, "blah"
|
71
|
+
assert_equal "", $stderr.string
|
72
|
+
ensure
|
73
|
+
$stderr = old_stderr
|
74
|
+
$VERBOSE = old_verbose
|
75
|
+
end
|
76
|
+
end
|
51
77
|
end
|
@@ -16,7 +16,7 @@ describe Committee::Drivers::OpenAPI3::Driver do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
it "override methods" do
|
19
|
-
parser = OpenAPIParser.parse(open_api_3_data)
|
19
|
+
parser = OpenAPIParser.parse(open_api_3_data, strict_reference_validation: false)
|
20
20
|
schema = @driver.parse(parser)
|
21
21
|
|
22
22
|
assert_kind_of Committee::Drivers::OpenAPI3::Schema, schema
|