committee 5.0.0 → 5.5.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: 284c8c1198255435e959dcee2b92cb25c3d80dd5fe6d4622b8077a69525712ed
4
- data.tar.gz: b306ec0ad5e628d9cc7b6382781c4b710c99bedb127a7000edadf9d0e0b8fa84
3
+ metadata.gz: 426a690ac272e53e30d9572a33564ea8cb7f2e92617e9dcd11b8061e32936b2f
4
+ data.tar.gz: c335a7d5bb6fe299d6584bf5838ac7972f9be312f431d15db8942cdd3c473cf4
5
5
  SHA512:
6
- metadata.gz: 687d9a47d2a17786313bde939339d464a8d775795458b09ad7d7784bfa337f848a9ffabe240e9f39173c4466589c026f64a8eede768e7abfff4b01b2672339f5
7
- data.tar.gz: 4ee7781341de9ebafae28d01d98c0f72d54067c425f3ee10b221c4eb88da85e79b36853bbda4818b20348177f8d975103cc5be694ff7e8252a6634a856853b7c
6
+ metadata.gz: 2e83410d227c6704e208c0bbac5e452a34887921fee1b3f9dbe5c082bbc5861533e49882428e94bb78140d647550047f57b990e7896583a6f18d8ee76d6fdb17
7
+ data.tar.gz: 610c2002488ee37be624df996fbfbfb9609c416a911583ed3177a0917061908c0efa71324d56b7b90e77ea538b8f6e00c8785c210bd2d8e67c8398177e3269fd
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'digest'
4
+
3
5
  module Committee
4
6
  module Drivers
5
7
  # Gets a driver instance from the specified name. Raises ArgumentError for
@@ -36,13 +38,16 @@ module Committee
36
38
  # @param [String] schema_path
37
39
  # @return [Committee::Driver]
38
40
  def self.load_from_file(schema_path, parser_options: {})
39
- case File.extname(schema_path)
40
- when '.json'
41
- load_from_json(schema_path, parser_options: parser_options)
42
- when '.yaml', '.yml'
43
- load_from_yaml(schema_path, parser_options: parser_options)
44
- else
45
- raise "Committee only supports the following file extensions: '.json', '.yaml', '.yml'"
41
+ @__load_from_file_cache ||= {}
42
+ @__load_from_file_cache[cache_key(schema_path, parser_options)] ||= begin
43
+ case File.extname(schema_path)
44
+ when '.json'
45
+ load_from_json(schema_path, parser_options: parser_options)
46
+ when '.yaml', '.yml'
47
+ load_from_yaml(schema_path, parser_options: parser_options)
48
+ else
49
+ raise "Committee only supports the following file extensions: '.json', '.yaml', '.yml'"
50
+ end
46
51
  end
47
52
  end
48
53
 
@@ -65,6 +70,12 @@ module Committee
65
70
  return Committee::Drivers::OpenAPI3::Driver.new.parse(openapi)
66
71
  end
67
72
 
73
+ if (version = hash['openapi'])
74
+ if Gem::Version.new(version) >= Gem::Version.new("3.1")
75
+ raise OpenAPI3Unsupported.new('Committee does not support OpenAPI 3.1+ yet')
76
+ end
77
+ end
78
+
68
79
  driver = if hash['swagger'] == '2.0'
69
80
  Committee::Drivers::OpenAPI2::Driver.new
70
81
  else
@@ -74,6 +85,17 @@ module Committee
74
85
  # TODO: in the future, pass `opts` here and allow optionality in other drivers?
75
86
  driver.parse(hash)
76
87
  end
88
+
89
+ class << self
90
+ private
91
+
92
+ def cache_key(schema_path, parser_options)
93
+ [
94
+ File.exist?(schema_path) ? Digest::MD5.hexdigest(File.read(schema_path)) : nil,
95
+ parser_options.hash,
96
+ ].join('_')
97
+ end
98
+ end
77
99
  end
78
100
  end
79
101
 
@@ -6,7 +6,7 @@ module Committee
6
6
  def initialize(app, options={})
7
7
  super
8
8
 
9
- @strict = options[:strict]
9
+ @strict = options[:strict]
10
10
  end
11
11
 
12
12
  def handle(request)
@@ -20,6 +20,7 @@ module Committee
20
20
  raise if @raise
21
21
  return @error_class.new(400, :bad_request, $!.message, request).render unless @ignore_error
22
22
  rescue Committee::NotFound => e
23
+ handle_exception($!, request.env)
23
24
  raise if @raise
24
25
  return @error_class.new(404, :not_found, e.message, request).render unless @ignore_error
25
26
  rescue JSON::ParserError
@@ -46,7 +46,11 @@ module Committee
46
46
  if @allow_form_params && %w[application/x-www-form-urlencoded multipart/form-data].include?(request.media_type)
47
47
  # Actually, POST means anything in the request body, could be from
48
48
  # PUT or PATCH too. Silly Rack.
49
- return [request.POST, true] if request.POST
49
+ begin
50
+ return [request.POST, true] if request.POST
51
+ ensure
52
+ request.body.rewind
53
+ end
50
54
  end
51
55
 
52
56
  [{}, false]
@@ -73,6 +77,7 @@ module Committee
73
77
  def parse_json(request)
74
78
  return nil if request.request_method == "GET" && !@allow_get_body
75
79
 
80
+ return nil if request.body.nil?
76
81
  body = request.body.read
77
82
  # if request body is empty, we just have empty params
78
83
  return nil if body.length == 0
@@ -4,11 +4,12 @@ module Committee
4
4
  module SchemaValidator
5
5
  class HyperSchema
6
6
  class ResponseValidator
7
- attr_reader :validate_success_only
7
+ attr_reader :allow_blank_structures, :validate_success_only
8
8
 
9
9
  def initialize(link, options = {})
10
10
  @link = link
11
11
  @validate_success_only = options[:validate_success_only]
12
+ @allow_blank_structures = options[:allow_blank_structures]
12
13
 
13
14
  @validator = JsonSchema::Validator.new(target_schema(link))
14
15
  end
@@ -39,9 +40,18 @@ module Committee
39
40
  return if data == nil
40
41
  end
41
42
 
42
- if Committee::Middleware::ResponseValidation.validate?(status, validate_success_only) && !@validator.validate(data)
43
- errors = JsonSchema::SchemaError.aggregate(@validator.errors).join("\n")
44
- raise InvalidResponse, "Invalid response.\n\n#{errors}"
43
+ if allow_blank_structures && @link.is_a?(Committee::Drivers::OpenAPI2::Link) && !@link.target_schema
44
+ return if data.nil?
45
+ end
46
+
47
+ begin
48
+ if Committee::Middleware::ResponseValidation.validate?(status, validate_success_only) && !@validator.validate(data)
49
+ errors = JsonSchema::SchemaError.aggregate(@validator.errors).join("\n")
50
+ raise InvalidResponse, "Invalid response.\n\n#{errors}"
51
+ end
52
+ rescue => e
53
+ raise InvalidResponse, "Invalid response.\n\nschema is undefined" if /undefined method .all_of. for nil/ =~ e.message
54
+ raise e
45
55
  end
46
56
  end
47
57
 
@@ -33,7 +33,7 @@ module Committee
33
33
  data = JSON.parse(full_body) if parse_to_json
34
34
  end
35
35
 
36
- Committee::SchemaValidator::HyperSchema::ResponseValidator.new(link, validate_success_only: validator_option.validate_success_only).call(status, headers, data)
36
+ Committee::SchemaValidator::HyperSchema::ResponseValidator.new(link, validate_success_only: validator_option.validate_success_only, allow_blank_structures: validator_option.allow_blank_structures).call(status, headers, data)
37
37
  end
38
38
 
39
39
  def link_exist?
@@ -21,8 +21,8 @@ module Committee
21
21
  private
22
22
 
23
23
  def check_content_type(request, content_type)
24
- # support post, put, patch only
25
- return true unless request.post? || request.put? || request.patch?
24
+ # support post, put, patch, options only
25
+ return true unless request.post? || request.put? || request.patch? || request.options?
26
26
  return true if @operation_object.valid_request_content_type?(content_type)
27
27
  return true if @operation_object.optional_body? && empty_request?(request)
28
28
 
@@ -87,7 +87,7 @@ module Committee
87
87
 
88
88
  request.env[validator_option.headers_key] = unpacker.unpack_headers(request)
89
89
 
90
- request_param, is_form_params = unpacker.unpack_request_params(request)
90
+ request_param, _is_form_params = unpacker.unpack_request_params(request)
91
91
  request.env[validator_option.request_body_hash_key] = request_param
92
92
  request.env[validator_option.path_hash_key] = coerce_path_params
93
93
 
@@ -97,7 +97,7 @@ module Committee
97
97
  end
98
98
 
99
99
  def copy_coerced_data_to_params(request)
100
- order = if validator_option.parameter_overwite_by_rails_rule
100
+ order = if validator_option.parameter_overwrite_by_rails_rule
101
101
  # (high priority) path_hash_key -> query_param -> request_body_hash
102
102
  [validator_option.request_body_hash_key, validator_option.query_hash_key, validator_option.path_hash_key]
103
103
  else
@@ -4,7 +4,8 @@ module Committee
4
4
  module SchemaValidator
5
5
  class Option
6
6
  # Boolean Options
7
- attr_reader :allow_form_params,
7
+ attr_reader :allow_blank_structures,
8
+ :allow_form_params,
8
9
  :allow_get_body,
9
10
  :allow_query_params,
10
11
  :check_content_type,
@@ -17,7 +18,7 @@ module Committee
17
18
  :optimistic_json,
18
19
  :validate_success_only,
19
20
  :parse_response_by_content_type,
20
- :parameter_overwite_by_rails_rule
21
+ :parameter_overwrite_by_rails_rule
21
22
 
22
23
  # Non-boolean options:
23
24
  attr_reader :headers_key,
@@ -29,30 +30,38 @@ module Committee
29
30
 
30
31
  def initialize(options, schema, schema_type)
31
32
  # Non-boolean options
32
- @headers_key = options[:headers_key] || "committee.headers"
33
- @params_key = options[:params_key] || "committee.params"
34
- @query_hash_key = options[:query_hash_key] || "committee.query_hash"
35
- @path_hash_key = options[:path_hash_key] || "committee.path_hash"
33
+ @headers_key = options[:headers_key] || "committee.headers"
34
+ @params_key = options[:params_key] || "committee.params"
35
+ @query_hash_key = options[:query_hash_key] || "committee.query_hash"
36
+ @path_hash_key = options[:path_hash_key] || "committee.path_hash"
36
37
  @request_body_hash_key = options[:request_body_hash_key] || "committee.request_body_hash"
37
38
 
38
- @prefix = options[:prefix]
39
+ @prefix = options[:prefix]
39
40
 
40
41
  # Boolean options and have a common value by default
41
- @allow_form_params = options.fetch(:allow_form_params, true)
42
- @allow_query_params = options.fetch(:allow_query_params, true)
43
- @check_content_type = options.fetch(:check_content_type, true)
44
- @check_header = options.fetch(:check_header, true)
45
- @coerce_recursive = options.fetch(:coerce_recursive, true)
46
- @optimistic_json = options.fetch(:optimistic_json, false)
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)
42
+ @allow_blank_structures = options.fetch(:allow_blank_structures, false)
43
+ @allow_form_params = options.fetch(:allow_form_params, true)
44
+ @allow_query_params = options.fetch(:allow_query_params, true)
45
+ @check_content_type = options.fetch(:check_content_type, true)
46
+ @check_header = options.fetch(:check_header, true)
47
+ @coerce_recursive = options.fetch(:coerce_recursive, true)
48
+ @optimistic_json = options.fetch(:optimistic_json, false)
49
+ @parse_response_by_content_type = options.fetch(:parse_response_by_content_type, true)
50
+
51
+ @parameter_overwrite_by_rails_rule =
52
+ if options.key?(:parameter_overwite_by_rails_rule)
53
+ Committee.warn_deprecated_until_6(true, "The option `parameter_overwite_by_rails_rule` is deprecated. Use `parameter_overwrite_by_rails_rule` instead.")
54
+ options[:parameter_overwite_by_rails_rule]
55
+ else
56
+ options.fetch(:parameter_overwrite_by_rails_rule, true)
57
+ end
49
58
 
50
59
  # Boolean options and have a different value by default
51
- @allow_get_body = options.fetch(:allow_get_body, schema.driver.default_allow_get_body)
52
- @coerce_date_times = options.fetch(:coerce_date_times, schema.driver.default_coerce_date_times)
53
- @coerce_form_params = options.fetch(:coerce_form_params, schema.driver.default_coerce_form_params)
54
- @coerce_path_params = options.fetch(:coerce_path_params, schema.driver.default_path_params)
55
- @coerce_query_params = options.fetch(:coerce_query_params, schema.driver.default_query_params)
60
+ @allow_get_body = options.fetch(:allow_get_body, schema.driver.default_allow_get_body)
61
+ @coerce_date_times = options.fetch(:coerce_date_times, schema.driver.default_coerce_date_times)
62
+ @coerce_form_params = options.fetch(:coerce_form_params, schema.driver.default_coerce_form_params)
63
+ @coerce_path_params = options.fetch(:coerce_path_params, schema.driver.default_path_params)
64
+ @coerce_query_params = options.fetch(:coerce_query_params, schema.driver.default_query_params)
56
65
  @validate_success_only = options.fetch(:validate_success_only, schema.driver.default_validate_success_only)
57
66
  end
58
67
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Committee
4
- VERSION = '5.0.0'.freeze
4
+ VERSION = '5.5.0'.freeze
5
5
  end
data/lib/committee.rb CHANGED
@@ -22,7 +22,7 @@ module Committee
22
22
  end
23
23
 
24
24
  def self.warn_deprecated_until_6(cond, message)
25
- raise "remove deprecated!" unless Committee::VERSION.start_with?("5")
25
+ raise "remove deprecated!" unless Committee::VERSION.start_with?("5")
26
26
  warn("[DEPRECATION] #{message}") if cond
27
27
  end
28
28
  end
@@ -44,8 +44,6 @@ describe Committee::Bin::CommitteeStub, "app" do
44
44
 
45
45
  def app
46
46
  options = {}
47
- # TODO: delete when 5.0.0 released because default value changed
48
- options[:parse_response_by_content_type] = false
49
47
 
50
48
  @bin.get_app(hyper_schema, options)
51
49
  end
@@ -19,13 +19,15 @@ describe Committee do
19
19
  old_stderr = $stderr
20
20
  $stderr = StringIO.new
21
21
  begin
22
- stub(Committee).debug? { false }
23
- Committee.log_debug "blah"
24
- assert_equal "", $stderr.string
22
+ Committee.stub(:debug?, false) do
23
+ Committee.log_debug "blah"
24
+ assert_equal "", $stderr.string
25
+ end
25
26
 
26
- stub(Committee).debug? { true }
27
- Committee.log_debug "blah"
28
- assert_equal "blah\n", $stderr.string
27
+ Committee.stub(:debug?, true) do
28
+ Committee.log_debug "blah"
29
+ assert_equal "blah\n", $stderr.string
30
+ end
29
31
  ensure
30
32
  $stderr = old_stderr
31
33
  end
data/test/drivers_test.rb CHANGED
@@ -48,6 +48,13 @@ describe Committee::Drivers do
48
48
  assert_kind_of Committee::Drivers::OpenAPI3::Schema, s
49
49
  end
50
50
 
51
+ it 'fails to load OpenAPI 3.1+' do
52
+ e = assert_raises(Committee::OpenAPI3Unsupported) do
53
+ Committee::Drivers.load_from_file(open_api_3_1_schema_path, parser_options:{strict_reference_validation: true})
54
+ end
55
+ assert_equal 'Committee does not support OpenAPI 3.1+ yet', e.message
56
+ end
57
+
51
58
  it 'fails to load OpenAPI 3 with invalid reference' do
52
59
  parser_options = { strict_reference_validation: true }
53
60
  assert_raises(OpenAPIParser::MissingReferenceError) do
@@ -67,6 +74,35 @@ describe Committee::Drivers do
67
74
  end
68
75
  assert_equal "Committee only supports the following file extensions: '.json', '.yaml', '.yml'", e.message
69
76
  end
77
+
78
+ describe 'cache behavior' do
79
+ describe 'when loading the same file' do
80
+ it 'returns the same object when the options are identical' do
81
+ assert_equal(
82
+ Committee::Drivers.load_from_file(open_api_3_schema_path, parser_options:{strict_reference_validation: true}).object_id,
83
+ Committee::Drivers.load_from_file(open_api_3_schema_path, parser_options:{strict_reference_validation: true}).object_id,
84
+ )
85
+ end
86
+
87
+ it 'returns different objects if the options are different' do
88
+ refute_equal(
89
+ Committee::Drivers.load_from_file(open_api_3_schema_path, parser_options:{strict_reference_validation: true}).object_id,
90
+ Committee::Drivers.load_from_file(open_api_3_schema_path, parser_options:{strict_reference_validation: false}).object_id,
91
+ )
92
+ end
93
+
94
+ it 'returns different objects if the file contents have changed' do
95
+ object_id = Committee::Drivers.load_from_file(open_api_3_schema_path, parser_options:{strict_reference_validation: true}).object_id
96
+ original_file_contents = File.read(open_api_3_schema_path)
97
+ File.write(open_api_3_schema_path, original_file_contents + "\n")
98
+ refute_equal(
99
+ Committee::Drivers.load_from_file(open_api_3_schema_path, parser_options:{strict_reference_validation: true}).object_id,
100
+ object_id,
101
+ )
102
+ File.write(open_api_3_schema_path, original_file_contents)
103
+ end
104
+ end
105
+ end
70
106
  end
71
107
 
72
108
  describe 'load_from_json(schema_path)' do
@@ -109,6 +145,13 @@ describe Committee::Drivers do
109
145
  assert_kind_of Committee::Drivers::Schema, s
110
146
  assert_kind_of Committee::Drivers::HyperSchema::Schema, s
111
147
  end
148
+
149
+ it 'fails to load OpenAPI 3.1+' do
150
+ e = assert_raises(Committee::OpenAPI3Unsupported) do
151
+ Committee::Drivers.load_from_data(open_api_3_1_data)
152
+ end
153
+ assert_equal 'Committee does not support OpenAPI 3.1+ yet', e.message
154
+ end
112
155
  end
113
156
  end
114
157
 
@@ -117,9 +117,6 @@ describe Committee::Middleware::Base do
117
117
  private
118
118
 
119
119
  def new_rack_app(options = {})
120
- # TODO: delete when 5.0.0 released because default value changed
121
- options[:parse_response_by_content_type] = true if options[:parse_response_by_content_type] == nil
122
-
123
120
  Rack::Builder.new {
124
121
  use Committee::Middleware::RequestValidation, options
125
122
  run lambda { |_|
@@ -419,7 +419,7 @@ describe Committee::Middleware::RequestValidation do
419
419
  assert_equal env['committee.query_hash']['integer'], 42
420
420
  #assert_equal env['rack.request.query_hash'][:integer], 42 # this isn't hash indifferent hash because we use rack.request.query_hash
421
421
  [204, {}, []]
422
- end, schema: open_api_3_schema, parameter_overwite_by_rails_rule: false)
422
+ end, schema: open_api_3_schema, parameter_overwrite_by_rails_rule: false)
423
423
 
424
424
  header "Content-Type", "application/json"
425
425
  post '/overwrite_same_parameter?integer=42'
@@ -434,7 +434,7 @@ describe Committee::Middleware::RequestValidation do
434
434
  assert_equal env['committee.request_body_hash'][:integer], 21
435
435
  assert_equal env['committee.query_hash']['integer'], 42
436
436
  [204, {}, []]
437
- end, schema: open_api_3_schema, parameter_overwite_by_rails_rule: false)
437
+ end, schema: open_api_3_schema, parameter_overwrite_by_rails_rule: false)
438
438
 
439
439
  params = {integer: 21}
440
440
 
@@ -454,7 +454,7 @@ describe Committee::Middleware::RequestValidation do
454
454
  assert_equal env['committee.query_hash']['integer'], 84 # we can't use query_parameter :(
455
455
  #assert_equal env['rack.request.query_hash'][:integer], 21 # this isn't hash indifferent hash because we use rack.request.query_hash
456
456
  [204, {}, []]
457
- end, schema: open_api_3_schema, parameter_overwite_by_rails_rule: false)
457
+ end, schema: open_api_3_schema, parameter_overwrite_by_rails_rule: false)
458
458
 
459
459
  params = {integer: 21}
460
460
 
@@ -615,9 +615,6 @@ describe Committee::Middleware::RequestValidation do
615
615
  end
616
616
 
617
617
  def new_rack_app_with_lambda(check_lambda, options = {})
618
- # TODO: delete when 5.0.0 released because default value changed
619
- options[:parse_response_by_content_type] = true if options[:parse_response_by_content_type] == nil
620
-
621
618
  Rack::Builder.new {
622
619
  use Committee::Middleware::RequestValidation, options
623
620
  run check_lambda
@@ -505,9 +505,6 @@ describe Committee::Middleware::RequestValidation do
505
505
 
506
506
 
507
507
  def new_rack_app_with_lambda(check_lambda, options = {})
508
- # TODO: delete when 5.0.0 released because default value changed
509
- options[:parse_response_by_content_type] = true if options[:parse_response_by_content_type] == nil
510
-
511
508
  Rack::Builder.new {
512
509
  use Committee::Middleware::RequestValidation, options
513
510
  run check_lambda
@@ -273,9 +273,6 @@ describe Committee::Middleware::ResponseValidation do
273
273
  private
274
274
 
275
275
  def new_response_rack(response, headers = {}, options = {}, rack_options = {})
276
- # TODO: delete when 5.0.0 released because default value changed
277
- options[:parse_response_by_content_type] = true if options[:parse_response_by_content_type] == nil
278
-
279
276
  status = rack_options[:status] || 200
280
277
  content_type = rack_options[:content_type] || "application/json"
281
278
  headers = {
@@ -15,14 +15,6 @@ describe Committee::Middleware::ResponseValidation do
15
15
  assert_equal 200, last_response.status
16
16
  end
17
17
 
18
- # TODO: remove 5.0.0
19
- it "passes through a valid response" do
20
- # will show deprecated message
21
- @app = new_rack_app(JSON.generate([ValidApp]), {}, schema: hyper_schema, strict: true)
22
- get "/apps"
23
- assert_equal 200, last_response.status
24
- end
25
-
26
18
  it "doesn't call error_handler (has a arg) when response is valid" do
27
19
  called = false
28
20
  pr = ->(_e) { called = true }
@@ -144,6 +136,29 @@ describe Committee::Middleware::ResponseValidation do
144
136
  assert_equal 200, last_response.status
145
137
  end
146
138
 
139
+ it "passes through a valid response for OpenAPI when data=nil, target_schema=empty, allow_blank_structures=true" do
140
+ @app = new_rack_app("null", {},
141
+ allow_blank_structures: true, schema: open_api_2_schema)
142
+ get "/api/pets/cat"
143
+ assert_equal 200, last_response.status
144
+ end
145
+
146
+ it "invalid responses for OpenAPI when data=nil, target_schema=empty, allow_blank_structures=false" do
147
+ @app = new_rack_app("null", {},
148
+ allow_blank_structures: false, schema: open_api_2_schema)
149
+ get "/api/pets/cat"
150
+ assert_equal 500, last_response.status
151
+ assert_match(/Invalid response/i, last_response.body)
152
+ end
153
+
154
+ it "passes through a valid response for OpenAPI when data=nil, target_schema=present, allow_blank_structures=true" do
155
+ @app = new_rack_app("null", {},
156
+ allow_blank_structures: true, schema: open_api_2_schema)
157
+ get "/api/pets/dog"
158
+ assert_equal 500, last_response.status
159
+ assert_match(/nil is not an array/i, last_response.body)
160
+ end
161
+
147
162
  it "detects an invalid response for OpenAPI" do
148
163
  @app = new_rack_app("{_}", {}, schema: open_api_2_schema)
149
164
  get "/api/pets"
@@ -173,9 +188,6 @@ describe Committee::Middleware::ResponseValidation do
173
188
  private
174
189
 
175
190
  def new_rack_app(response, headers = {}, options = {})
176
- # TODO: delete when 5.0.0 released because default value changed
177
- options[:parse_response_by_content_type] = true if options[:parse_response_by_content_type] == nil
178
-
179
191
  headers = {
180
192
  "Content-Type" => "application/json"
181
193
  }.merge(headers)
@@ -113,9 +113,6 @@ describe Committee::Middleware::Stub do
113
113
  response = options.delete(:response)
114
114
  suppress = options.delete(:suppress)
115
115
 
116
- # TODO: delete when 5.0.0 released because default value changed
117
- options[:parse_response_by_content_type] = true if options[:parse_response_by_content_type] == nil
118
-
119
116
  Rack::Builder.new {
120
117
  use Committee::Middleware::Stub, options
121
118
  run lambda { |env|
@@ -69,8 +69,6 @@ describe Committee::SchemaValidator::HyperSchema::Router do
69
69
  end
70
70
 
71
71
  def hyper_schema_router(options = {})
72
- # TODO: delete when 5.0.0 released because default value changed
73
- options[:parse_response_by_content_type] = true if options[:parse_response_by_content_type] == nil
74
72
  schema = Committee::Drivers::HyperSchema::Driver.new.parse(hyper_schema_data)
75
73
  validator_option = Committee::SchemaValidator::Option.new(options, schema, :hyper_schema)
76
74
 
@@ -78,8 +76,6 @@ describe Committee::SchemaValidator::HyperSchema::Router do
78
76
  end
79
77
 
80
78
  def open_api_2_router(options = {})
81
- # TODO: delete when 5.0.0 released because default value changed
82
- options[:parse_response_by_content_type] = true if options[:parse_response_by_content_type] == nil
83
79
  schema = Committee::Drivers::OpenAPI2::Driver.new.parse(open_api_2_data)
84
80
  validator_option = Committee::SchemaValidator::Option.new(options, schema, :hyper_schema)
85
81
 
@@ -9,12 +9,7 @@ describe Committee::SchemaValidator::OpenAPI3::OperationWrapper do
9
9
  before do
10
10
  @path = '/validate'
11
11
  @method = 'post'
12
-
13
- # TODO: delete when 5.0.0 released because default value changed
14
- options = {}
15
- options[:parse_response_by_content_type] = true if options[:parse_response_by_content_type] == nil
16
-
17
- @validator_option = Committee::SchemaValidator::Option.new(options, open_api_3_schema, :open_api_3)
12
+ @validator_option = Committee::SchemaValidator::Option.new({}, open_api_3_schema, :open_api_3)
18
13
  end
19
14
 
20
15
  def operation_object
@@ -95,10 +95,14 @@ describe Committee::SchemaValidator::OpenAPI3::RequestValidator do
95
95
  assert_equal 400, last_response.status
96
96
  end
97
97
 
98
- def new_rack_app(options = {})
99
- # TODO: delete when 5.0.0 released because default value changed
100
- options[:parse_response_by_content_type] = true if options[:parse_response_by_content_type] == nil
98
+ it "validates content_type for option request" do
99
+ @app = new_rack_app(check_content_type: true, schema: open_api_3_schema)
100
+ header "Content-Type", "text/html"
101
+ options "/validate", "{}"
102
+ assert_equal 400, last_response.status
103
+ end
101
104
 
105
+ def new_rack_app(options = {})
102
106
  Rack::Builder.new {
103
107
  use Committee::Middleware::RequestValidation, options
104
108
  run lambda { |_|
@@ -13,11 +13,7 @@ describe Committee::SchemaValidator::OpenAPI3::ResponseValidator do
13
13
  @path = '/validate'
14
14
  @method = 'post'
15
15
 
16
- # TODO: delete when 5.0.0 released because default value changed
17
- options = {}
18
- options[:parse_response_by_content_type] = true if options[:parse_response_by_content_type] == nil
19
-
20
- @validator_option = Committee::SchemaValidator::Option.new(options, open_api_3_schema, :open_api_3)
16
+ @validator_option = Committee::SchemaValidator::Option.new({}, open_api_3_schema, :open_api_3)
21
17
  end
22
18
 
23
19
  it "passes through a valid response" do
@@ -30,9 +30,6 @@ describe Committee::Test::Methods do
30
30
  @committee_schema = nil
31
31
 
32
32
  @committee_options = {schema: hyper_schema}
33
-
34
- # TODO: delete when 5.0.0 released because default value changed
35
- @committee_options[:parse_response_by_content_type] = false
36
33
  end
37
34
 
38
35
  describe "#assert_schema_conform" do
@@ -29,9 +29,6 @@ describe Committee::Test::Methods do
29
29
  @committee_router = nil
30
30
  @committee_schema = nil
31
31
  @committee_options = {}
32
-
33
- # TODO: delete when 5.0.0 released because default value changed
34
- @committee_options[:parse_response_by_content_type] = true
35
32
  end
36
33
 
37
34
  describe "Hyper-Schema" do
@@ -61,13 +58,13 @@ describe Committee::Test::Methods do
61
58
 
62
59
  describe "assert_request_schema_confirm" do
63
60
  it "passes through a valid request" do
64
- @app = new_rack_app([])
61
+ @app = new_rack_app
65
62
  get "/apps"
66
63
  assert_request_schema_confirm
67
64
  end
68
65
 
69
66
  it "not exist required" do
70
- @app = new_rack_app([])
67
+ @app = new_rack_app
71
68
  get "/search/apps", {}
72
69
  e = assert_raises(Committee::InvalidRequest) do
73
70
  assert_request_schema_confirm
@@ -76,7 +73,7 @@ describe Committee::Test::Methods do
76
73
  end
77
74
 
78
75
  it "path undefined in schema" do
79
- @app = new_rack_app([])
76
+ @app = new_rack_app
80
77
  get "/undefined"
81
78
  e = assert_raises(Committee::InvalidRequest) do
82
79
  assert_request_schema_confirm
@@ -149,13 +146,13 @@ describe Committee::Test::Methods do
149
146
 
150
147
  describe "assert_request_schema_confirm" do
151
148
  it "passes through a valid request" do
152
- @app = new_rack_app([])
149
+ @app = new_rack_app
153
150
  get "/characters"
154
151
  assert_request_schema_confirm
155
152
  end
156
153
 
157
154
  it "not exist required" do
158
- @app = new_rack_app([])
155
+ @app = new_rack_app
159
156
  get "/validate", {"query_string" => "query", "query_integer_list" => [1, 2]}
160
157
  e = assert_raises(Committee::InvalidRequest) do
161
158
  assert_request_schema_confirm
@@ -165,7 +162,7 @@ describe Committee::Test::Methods do
165
162
  end
166
163
 
167
164
  it "path undefined in schema" do
168
- @app = new_rack_app([])
165
+ @app = new_rack_app
169
166
  get "/undefined"
170
167
  e = assert_raises(Committee::InvalidRequest) do
171
168
  assert_request_schema_confirm
@@ -353,7 +350,7 @@ describe Committee::Test::Methods do
353
350
 
354
351
  private
355
352
 
356
- def new_rack_app(response, headers={ "Content-Type" => "application/json" }, status_code = 200)
353
+ def new_rack_app(response = nil, headers={ "Content-Type" => "application/json" }, status_code = 200)
357
354
  Rack::Builder.new {
358
355
  run lambda { |_|
359
356
  [status_code, headers, [response]]
data/test/test_helper.rb CHANGED
@@ -21,7 +21,6 @@ require "minitest"
21
21
  require "minitest/spec"
22
22
  require "minitest/autorun"
23
23
  require "rack/test"
24
- require "rr"
25
24
  require "pry"
26
25
  require "stringio"
27
26
 
@@ -91,6 +90,14 @@ def open_api_3_data
91
90
  end
92
91
  end
93
92
 
93
+ def open_api_3_1_data
94
+ if YAML.respond_to?(:unsafe_load_file)
95
+ YAML.unsafe_load_file(open_api_3_1_schema_path)
96
+ else
97
+ YAML.load_file(open_api_3_1_schema_path)
98
+ end
99
+ end
100
+
94
101
  def hyper_schema_schema_path
95
102
  "./test/data/hyperschema/paas.json"
96
103
  end
@@ -115,6 +122,10 @@ def open_api_3_0_1_schema_path
115
122
  "./test/data/openapi3/3_0_1.yaml"
116
123
  end
117
124
 
125
+ def open_api_3_1_schema_path
126
+ "./test/data/openapi3/3_1.yaml"
127
+ end
128
+
118
129
  def open_api_3_invalid_reference_path
119
130
  "./test/data/openapi3/invalid_reference.yaml"
120
131
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: committee
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0
4
+ version: 5.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandur
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2023-01-28 00:00:00.000000000 Z
13
+ date: 2024-11-25 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: json_schema
@@ -39,6 +39,9 @@ dependencies:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '1.5'
42
+ - - "<"
43
+ - !ruby/object:Gem::Version
44
+ version: '3.2'
42
45
  type: :runtime
43
46
  prerelease: false
44
47
  version_requirements: !ruby/object:Gem::Requirement
@@ -46,20 +49,23 @@ dependencies:
46
49
  - - ">="
47
50
  - !ruby/object:Gem::Version
48
51
  version: '1.5'
52
+ - - "<"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.2'
49
55
  - !ruby/object:Gem::Dependency
50
56
  name: openapi_parser
51
57
  requirement: !ruby/object:Gem::Requirement
52
58
  requirements:
53
59
  - - "~>"
54
60
  - !ruby/object:Gem::Version
55
- version: '1.0'
61
+ version: '2.0'
56
62
  type: :runtime
57
63
  prerelease: false
58
64
  version_requirements: !ruby/object:Gem::Requirement
59
65
  requirements:
60
66
  - - "~>"
61
67
  - !ruby/object:Gem::Version
62
- version: '1.0'
68
+ version: '2.0'
63
69
  - !ruby/object:Gem::Dependency
64
70
  name: minitest
65
71
  requirement: !ruby/object:Gem::Requirement
@@ -78,44 +84,30 @@ dependencies:
78
84
  name: rack-test
79
85
  requirement: !ruby/object:Gem::Requirement
80
86
  requirements:
81
- - - "~>"
87
+ - - ">="
82
88
  - !ruby/object:Gem::Version
83
- version: '0.8'
89
+ version: '0'
84
90
  type: :development
85
91
  prerelease: false
86
92
  version_requirements: !ruby/object:Gem::Requirement
87
93
  requirements:
88
- - - "~>"
94
+ - - ">="
89
95
  - !ruby/object:Gem::Version
90
- version: '0.8'
96
+ version: '0'
91
97
  - !ruby/object:Gem::Dependency
92
98
  name: rake
93
99
  requirement: !ruby/object:Gem::Requirement
94
100
  requirements:
95
101
  - - "~>"
96
102
  - !ruby/object:Gem::Version
97
- version: '12.3'
98
- type: :development
99
- prerelease: false
100
- version_requirements: !ruby/object:Gem::Requirement
101
- requirements:
102
- - - "~>"
103
- - !ruby/object:Gem::Version
104
- version: '12.3'
105
- - !ruby/object:Gem::Dependency
106
- name: rr
107
- requirement: !ruby/object:Gem::Requirement
108
- requirements:
109
- - - "~>"
110
- - !ruby/object:Gem::Version
111
- version: '1.1'
103
+ version: '13.1'
112
104
  type: :development
113
105
  prerelease: false
114
106
  version_requirements: !ruby/object:Gem::Requirement
115
107
  requirements:
116
108
  - - "~>"
117
109
  - !ruby/object:Gem::Version
118
- version: '1.1'
110
+ version: '13.1'
119
111
  - !ruby/object:Gem::Dependency
120
112
  name: pry
121
113
  requirement: !ruby/object:Gem::Requirement
@@ -146,20 +138,6 @@ dependencies:
146
138
  version: '0'
147
139
  - !ruby/object:Gem::Dependency
148
140
  name: rubocop
149
- requirement: !ruby/object:Gem::Requirement
150
- requirements:
151
- - - "<"
152
- - !ruby/object:Gem::Version
153
- version: 1.13.0
154
- type: :development
155
- prerelease: false
156
- version_requirements: !ruby/object:Gem::Requirement
157
- requirements:
158
- - - "<"
159
- - !ruby/object:Gem::Version
160
- version: 1.13.0
161
- - !ruby/object:Gem::Dependency
162
- name: rubocop-performance
163
141
  requirement: !ruby/object:Gem::Requirement
164
142
  requirements:
165
143
  - - ">="
@@ -173,21 +151,7 @@ dependencies:
173
151
  - !ruby/object:Gem::Version
174
152
  version: '0'
175
153
  - !ruby/object:Gem::Dependency
176
- name: rubocop-minitest
177
- requirement: !ruby/object:Gem::Requirement
178
- requirements:
179
- - - ">="
180
- - !ruby/object:Gem::Version
181
- version: '0'
182
- type: :development
183
- prerelease: false
184
- version_requirements: !ruby/object:Gem::Requirement
185
- requirements:
186
- - - ">="
187
- - !ruby/object:Gem::Version
188
- version: '0'
189
- - !ruby/object:Gem::Dependency
190
- name: rubocop-rake
154
+ name: rubocop-performance
191
155
  requirement: !ruby/object:Gem::Requirement
192
156
  requirements:
193
157
  - - ">="
@@ -305,7 +269,11 @@ files:
305
269
  homepage: https://github.com/interagent/committee
306
270
  licenses:
307
271
  - MIT
308
- metadata: {}
272
+ metadata:
273
+ bug_tracker_uri: https://github.com/interagent/committee/issues
274
+ changelog_uri: https://github.com/interagent/committee/blob/master/CHANGELOG.md
275
+ rubygems_mfa_required: 'true'
276
+ source_code_uri: https://github.com/interagent/committee
309
277
  post_install_message:
310
278
  rdoc_options: []
311
279
  require_paths:
@@ -314,14 +282,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
314
282
  requirements:
315
283
  - - ">="
316
284
  - !ruby/object:Gem::Version
317
- version: 2.6.0
285
+ version: 2.7.0
318
286
  required_rubygems_version: !ruby/object:Gem::Requirement
319
287
  requirements:
320
288
  - - ">="
321
289
  - !ruby/object:Gem::Version
322
290
  version: '0'
323
291
  requirements: []
324
- rubygems_version: 3.3.3
292
+ rubygems_version: 3.5.18
325
293
  signing_key:
326
294
  specification_version: 4
327
295
  summary: A collection of Rack middleware to support JSON Schema.