committee 3.1.0 → 3.1.1

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.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/bin/committee-stub +1 -0
  3. data/lib/committee.rb +12 -34
  4. data/lib/committee/bin/committee_stub.rb +6 -4
  5. data/lib/committee/drivers.rb +15 -67
  6. data/lib/committee/drivers/driver.rb +47 -0
  7. data/lib/committee/drivers/hyper_schema.rb +8 -171
  8. data/lib/committee/drivers/hyper_schema/driver.rb +105 -0
  9. data/lib/committee/drivers/hyper_schema/link.rb +68 -0
  10. data/lib/committee/drivers/hyper_schema/schema.rb +22 -0
  11. data/lib/committee/drivers/open_api_2.rb +9 -416
  12. data/lib/committee/drivers/open_api_2/driver.rb +253 -0
  13. data/lib/committee/drivers/open_api_2/header_schema_builder.rb +33 -0
  14. data/lib/committee/drivers/open_api_2/link.rb +36 -0
  15. data/lib/committee/drivers/open_api_2/parameter_schema_builder.rb +83 -0
  16. data/lib/committee/drivers/open_api_2/schema.rb +26 -0
  17. data/lib/committee/drivers/open_api_2/schema_builder.rb +33 -0
  18. data/lib/committee/drivers/open_api_3.rb +7 -75
  19. data/lib/committee/drivers/open_api_3/driver.rb +51 -0
  20. data/lib/committee/drivers/open_api_3/schema.rb +41 -0
  21. data/lib/committee/drivers/schema.rb +23 -0
  22. data/lib/committee/errors.rb +2 -0
  23. data/lib/committee/middleware.rb +11 -0
  24. data/lib/committee/middleware/base.rb +38 -34
  25. data/lib/committee/middleware/request_validation.rb +51 -30
  26. data/lib/committee/middleware/response_validation.rb +49 -26
  27. data/lib/committee/middleware/stub.rb +55 -51
  28. data/lib/committee/request_unpacker.rb +3 -1
  29. data/lib/committee/schema_validator.rb +23 -0
  30. data/lib/committee/schema_validator/hyper_schema.rb +85 -74
  31. data/lib/committee/schema_validator/hyper_schema/parameter_coercer.rb +60 -54
  32. data/lib/committee/schema_validator/hyper_schema/request_validator.rb +43 -37
  33. data/lib/committee/schema_validator/hyper_schema/response_generator.rb +86 -80
  34. data/lib/committee/schema_validator/hyper_schema/response_validator.rb +65 -59
  35. data/lib/committee/schema_validator/hyper_schema/router.rb +35 -29
  36. data/lib/committee/schema_validator/hyper_schema/string_params_coercer.rb +87 -81
  37. data/lib/committee/schema_validator/open_api_3.rb +71 -61
  38. data/lib/committee/schema_validator/open_api_3/operation_wrapper.rb +121 -115
  39. data/lib/committee/schema_validator/open_api_3/request_validator.rb +24 -18
  40. data/lib/committee/schema_validator/open_api_3/response_validator.rb +22 -16
  41. data/lib/committee/schema_validator/open_api_3/router.rb +30 -24
  42. data/lib/committee/schema_validator/option.rb +42 -38
  43. data/lib/committee/test/methods.rb +55 -51
  44. data/lib/committee/validation_error.rb +2 -0
  45. data/test/bin/committee_stub_test.rb +3 -1
  46. data/test/bin_test.rb +3 -1
  47. data/test/committee_test.rb +3 -1
  48. data/test/drivers/hyper_schema/driver_test.rb +49 -0
  49. data/test/drivers/{hyper_schema_test.rb → hyper_schema/link_test.rb} +2 -45
  50. data/test/drivers/open_api_2/driver_test.rb +156 -0
  51. data/test/drivers/open_api_2/header_schema_builder_test.rb +26 -0
  52. data/test/drivers/open_api_2/link_test.rb +52 -0
  53. data/test/drivers/open_api_2/parameter_schema_builder_test.rb +195 -0
  54. data/test/drivers/{open_api_3_test.rb → open_api_3/driver_test.rb} +5 -3
  55. data/test/drivers_test.rb +12 -10
  56. data/test/middleware/base_test.rb +3 -1
  57. data/test/middleware/request_validation_open_api_3_test.rb +4 -2
  58. data/test/middleware/request_validation_test.rb +46 -5
  59. data/test/middleware/response_validation_open_api_3_test.rb +3 -1
  60. data/test/middleware/response_validation_test.rb +39 -4
  61. data/test/middleware/stub_test.rb +3 -1
  62. data/test/request_unpacker_test.rb +2 -2
  63. data/test/schema_validator/hyper_schema/parameter_coercer_test.rb +2 -2
  64. data/test/schema_validator/hyper_schema/request_validator_test.rb +3 -1
  65. data/test/schema_validator/hyper_schema/response_generator_test.rb +3 -1
  66. data/test/schema_validator/hyper_schema/response_validator_test.rb +3 -1
  67. data/test/schema_validator/hyper_schema/router_test.rb +5 -3
  68. data/test/schema_validator/hyper_schema/string_params_coercer_test.rb +3 -1
  69. data/test/schema_validator/open_api_3/operation_wrapper_test.rb +3 -1
  70. data/test/schema_validator/open_api_3/request_validator_test.rb +11 -1
  71. data/test/schema_validator/open_api_3/response_validator_test.rb +3 -1
  72. data/test/test/methods_new_version_test.rb +3 -1
  73. data/test/test/methods_test.rb +4 -2
  74. data/test/test_helper.rb +16 -16
  75. data/test/validation_error_test.rb +3 -1
  76. metadata +52 -6
  77. data/lib/committee/schema_validator/schema_validator.rb +0 -15
  78. data/test/drivers/open_api_2_test.rb +0 -416
@@ -1,8 +1,10 @@
1
- require_relative "../test_helper"
1
+ # frozen_string_literal: true
2
2
 
3
- describe Committee::Drivers::OpenAPI3 do
3
+ require "test_helper"
4
+
5
+ describe Committee::Drivers::OpenAPI3::Driver do
4
6
  before do
5
- @driver = Committee::Drivers::OpenAPI3.new
7
+ @driver = Committee::Drivers::OpenAPI3::Driver.new
6
8
  end
7
9
 
8
10
  it "has a name" do
data/test/drivers_test.rb CHANGED
@@ -1,4 +1,6 @@
1
- require_relative "test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::Drivers do
4
6
  DRIVERS = [
@@ -99,13 +101,13 @@ end
99
101
 
100
102
  describe Committee::Drivers::Driver do
101
103
  DRIVER_METHODS = {
102
- :default_allow_get_body => [],
103
- :default_coerce_form_params => [],
104
- :default_path_params => [],
105
- :default_query_params => [],
106
- :name => [],
107
- :parse => [nil],
108
- :schema_class => [],
104
+ default_allow_get_body: [],
105
+ default_coerce_form_params: [],
106
+ default_path_params: [],
107
+ default_query_params: [],
108
+ name: [],
109
+ parse: [nil],
110
+ schema_class: [],
109
111
  }
110
112
 
111
113
  it "has a set of abstract methods" do
@@ -122,8 +124,8 @@ end
122
124
 
123
125
  describe Committee::Drivers::Schema do
124
126
  SCHEMA_METHODS = {
125
- :driver => [],
126
- :build_router => [validator_option: nil, prefix: nil]
127
+ driver: [],
128
+ build_router: [validator_option: nil, prefix: nil]
127
129
  }
128
130
 
129
131
  it "has a set of abstract methods" do
@@ -1,4 +1,6 @@
1
- require_relative "../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::Middleware::Base do
4
6
  include Rack::Test::Methods
@@ -1,4 +1,6 @@
1
- require_relative "../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::Middleware::RequestValidation do
4
6
  include Rack::Test::Methods
@@ -254,7 +256,7 @@ describe Committee::Middleware::RequestValidation do
254
256
  it "rescues JSON errors" do
255
257
  @app = new_rack_app(schema: open_api_3_schema)
256
258
  header "Content-Type", "application/json"
257
- post "/apps", "{x:y}"
259
+ post "/characters", "{x:y}"
258
260
  assert_equal 400, last_response.status
259
261
  assert_match(/valid json/i, last_response.body)
260
262
  end
@@ -1,4 +1,6 @@
1
- require_relative "../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::Middleware::RequestValidation do
4
6
  include Rack::Test::Methods
@@ -61,9 +63,21 @@ describe Committee::Middleware::RequestValidation do
61
63
  assert_equal 200, last_response.status
62
64
  end
63
65
 
64
- it "doesn't call error_handler when request is valid" do
66
+ it "doesn't call error_handler (has a arg) when request is valid" do
65
67
  called_error = false
66
- pr = ->(_) { called_error = true }
68
+ pr = ->(_e) { called_error = true }
69
+ @app = new_rack_app(schema: hyper_schema, error_handler: pr)
70
+ params = {
71
+ "name" => "cloudnasium"
72
+ }
73
+ header "Content-Type", "application/json"
74
+ post "/apps", JSON.generate(params)
75
+ assert !called_error
76
+ end
77
+
78
+ it "doesn't call error_handler (has 2 args) when request is valid" do
79
+ called_error = false
80
+ pr = ->(_e, _env) { called_error = true }
67
81
  @app = new_rack_app(schema: hyper_schema, error_handler: pr)
68
82
  params = {
69
83
  "name" => "cloudnasium"
@@ -282,7 +296,7 @@ describe Committee::Middleware::RequestValidation do
282
296
  assert_match(/invalid request/i, last_response.body)
283
297
  end
284
298
 
285
- it "calls error_handler when request is invalid" do
299
+ it "calls error_handler (has a arg) when request is invalid" do
286
300
  called_err = nil
287
301
  pr = ->(e) { called_err = e }
288
302
  @app = new_rack_app(schema: hyper_schema, error_handler: pr)
@@ -290,6 +304,21 @@ describe Committee::Middleware::RequestValidation do
290
304
  params = {
291
305
  "name" => 1
292
306
  }
307
+ _, err = capture_io do
308
+ post "/apps", JSON.generate(params)
309
+ end
310
+ assert_kind_of Committee::InvalidRequest, called_err
311
+ assert_match(/\[DEPRECATION\]/i, err)
312
+ end
313
+
314
+ it "calls error_handler (has two args) when request is invalid" do
315
+ called_err = nil
316
+ pr = ->(e, _env) { called_err = e }
317
+ @app = new_rack_app(schema: hyper_schema, error_handler: pr)
318
+ header "Content-Type", "application/json"
319
+ params = {
320
+ "name" => 1
321
+ }
293
322
  post "/apps", JSON.generate(params)
294
323
  assert_kind_of Committee::InvalidRequest, called_err
295
324
  end
@@ -302,11 +331,23 @@ describe Committee::Middleware::RequestValidation do
302
331
  assert_match(/valid json/i, last_response.body)
303
332
  end
304
333
 
305
- it "calls error_handler when it rescues JSON errors" do
334
+ it "calls error_handler (has a arg) when it rescues JSON errors" do
306
335
  called_err = nil
307
336
  pr = ->(e) { called_err = e }
308
337
  @app = new_rack_app(schema: hyper_schema, error_handler: pr)
309
338
  header "Content-Type", "application/json"
339
+ _, err = capture_io do
340
+ post "/apps", "{x:y}"
341
+ end
342
+ assert_kind_of JSON::ParserError, called_err
343
+ assert_match(/\[DEPRECATION\]/i, err)
344
+ end
345
+
346
+ it "calls error_handler (has two args) when it rescues JSON errors" do
347
+ called_err = nil
348
+ pr = ->(e, _env) { called_err = e }
349
+ @app = new_rack_app(schema: hyper_schema, error_handler: pr)
350
+ header "Content-Type", "application/json"
310
351
  post "/apps", "{x:y}"
311
352
  assert_kind_of JSON::ParserError, called_err
312
353
  end
@@ -1,4 +1,6 @@
1
- require_relative "../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::Middleware::ResponseValidation do
4
6
  include Rack::Test::Methods
@@ -1,4 +1,6 @@
1
- require_relative "../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::Middleware::ResponseValidation do
4
6
  include Rack::Test::Methods
@@ -13,7 +15,7 @@ describe Committee::Middleware::ResponseValidation do
13
15
  assert_equal 200, last_response.status
14
16
  end
15
17
 
16
- it "doesn't call error_handler when response is valid" do
18
+ it "doesn't call error_handler (has a arg) when response is valid" do
17
19
  called = false
18
20
  pr = ->(_e) { called = true }
19
21
  @app = new_rack_app(JSON.generate([ValidApp]), {}, schema: hyper_schema, error_handler: pr)
@@ -21,6 +23,14 @@ describe Committee::Middleware::ResponseValidation do
21
23
  assert !called, "error_handler is called"
22
24
  end
23
25
 
26
+ it "doesn't call error_handler (has two args) when response is valid" do
27
+ called = false
28
+ pr = ->(_e, _env) { called = true }
29
+ @app = new_rack_app(JSON.generate([ValidApp]), {}, schema: hyper_schema, error_handler: pr)
30
+ get "/apps"
31
+ assert !called, "error_handler is called"
32
+ end
33
+
24
34
  it "detects a response invalid due to schema" do
25
35
  @app = new_rack_app("{}", {}, schema: hyper_schema)
26
36
  get "/apps"
@@ -75,10 +85,21 @@ describe Committee::Middleware::ResponseValidation do
75
85
  assert_match(/valid json/i, last_response.body)
76
86
  end
77
87
 
78
- it "calls error_handler when it rescues JSON errors" do
88
+ it "calls error_handler (has a arg) when it rescues JSON errors" do
79
89
  called_err = nil
80
90
  pr = ->(e) { called_err = e }
81
91
  @app = new_rack_app("[{x:y}]", {}, schema: hyper_schema, error_handler: pr)
92
+ _, err = capture_io do
93
+ get "/apps"
94
+ end
95
+ assert_kind_of JSON::ParserError, called_err
96
+ assert_match(/\[DEPRECATION\]/i, err)
97
+ end
98
+
99
+ it "calls error_handler (has two args) when it rescues JSON errors" do
100
+ called_err = nil
101
+ pr = ->(e, _env) { called_err = e }
102
+ @app = new_rack_app("[{x:y}]", {}, schema: hyper_schema, error_handler: pr)
82
103
  get "/apps"
83
104
  assert_kind_of JSON::ParserError, called_err
84
105
  end
@@ -97,10 +118,24 @@ describe Committee::Middleware::ResponseValidation do
97
118
  end
98
119
  end
99
120
 
100
- it "calls error_handler when it rescues JSON errors" do
121
+ it "calls error_handler (has a arg) when it rescues JSON errors" do
101
122
  called_err = nil
102
123
  pr = ->(e) { called_err = e }
103
124
  @app = new_rack_app("[{x:y}]", {}, raise: true, schema: hyper_schema, error_handler: pr)
125
+ assert_raises(Committee::InvalidResponse) do
126
+ _, err = capture_io do
127
+ get "/apps"
128
+ end
129
+
130
+ assert_kind_of JSON::ParserError, called_err
131
+ assert_match(/\[DEPRECATION\]/i, err)
132
+ end
133
+ end
134
+
135
+ it "calls error_handler (has two args) when it rescues JSON errors" do
136
+ called_err = nil
137
+ pr = ->(e, _env) { called_err = e }
138
+ @app = new_rack_app("[{x:y}]", {}, raise: true, schema: hyper_schema, error_handler: pr)
104
139
  assert_raises(Committee::InvalidResponse) do
105
140
  get "/apps"
106
141
  assert_kind_of JSON::ParserError, called_err
@@ -1,4 +1,6 @@
1
- require_relative "../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::Middleware::Stub do
4
6
  include Rack::Test::Methods
@@ -1,6 +1,6 @@
1
- require_relative "test_helper"
1
+ # frozen_string_literal: true
2
2
 
3
- require "stringio"
3
+ require "test_helper"
4
4
 
5
5
  describe Committee::RequestUnpacker do
6
6
  it "unpacks JSON on Content-Type: application/json" do
@@ -1,6 +1,6 @@
1
- require_relative "../../test_helper"
1
+ # frozen_string_literal: true
2
2
 
3
- require "stringio"
3
+ require "test_helper"
4
4
 
5
5
  describe Committee::SchemaValidator::HyperSchema::ParameterCoercer do
6
6
  before do
@@ -1,4 +1,6 @@
1
- require_relative "../../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  require "stringio"
4
6
 
@@ -1,4 +1,6 @@
1
- require_relative "../../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::SchemaValidator::HyperSchema::ResponseGenerator do
4
6
  before do
@@ -1,4 +1,6 @@
1
- require_relative "../../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::SchemaValidator::HyperSchema::ResponseValidator do
4
6
  before do
@@ -1,4 +1,6 @@
1
- require_relative "../../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::SchemaValidator::HyperSchema::Router do
4
6
  it "builds routes without parameters" do
@@ -67,14 +69,14 @@ describe Committee::SchemaValidator::HyperSchema::Router do
67
69
  end
68
70
 
69
71
  def hyper_schema_router(options = {})
70
- schema = Committee::Drivers::HyperSchema.new.parse(hyper_schema_data)
72
+ schema = Committee::Drivers::HyperSchema::Driver.new.parse(hyper_schema_data)
71
73
  validator_option = Committee::SchemaValidator::Option.new(options, schema, :hyper_schema)
72
74
 
73
75
  Committee::SchemaValidator::HyperSchema::Router.new(schema, validator_option)
74
76
  end
75
77
 
76
78
  def open_api_2_router(options = {})
77
- schema = Committee::Drivers::OpenAPI2.new.parse(open_api_2_data)
79
+ schema = Committee::Drivers::OpenAPI2::Driver.new.parse(open_api_2_data)
78
80
  validator_option = Committee::SchemaValidator::Option.new(options, schema, :hyper_schema)
79
81
 
80
82
  Committee::SchemaValidator::HyperSchema::Router.new(schema, validator_option)
@@ -1,4 +1,6 @@
1
- require_relative "../../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::SchemaValidator::HyperSchema::StringParamsCoercer do
4
6
  before do
@@ -1,4 +1,6 @@
1
- require_relative "../../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  require "stringio"
4
6
 
@@ -1,4 +1,6 @@
1
- require_relative "../../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::SchemaValidator::OpenAPI3::RequestValidator do
4
6
  describe 'OpenAPI3' do
@@ -8,6 +10,14 @@ describe Committee::SchemaValidator::OpenAPI3::RequestValidator do
8
10
  @app
9
11
  end
10
12
 
13
+ it "skip validaiton when link does not exist" do
14
+ @app = new_rack_app(schema: open_api_3_schema)
15
+ params = {}
16
+ header "Content-Type", "application/json"
17
+ post "/unknown", JSON.generate(params)
18
+ assert_equal 200, last_response.status
19
+ end
20
+
11
21
  it "optionally content_type check" do
12
22
  @app = new_rack_app(check_content_type: true, schema: open_api_3_schema)
13
23
  params = {
@@ -1,4 +1,6 @@
1
- require_relative "../../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::SchemaValidator::OpenAPI3::ResponseValidator do
4
6
  before do
@@ -1,4 +1,6 @@
1
- require_relative "../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::Test::Methods do
4
6
  include Committee::Test::Methods
@@ -1,4 +1,6 @@
1
- require_relative "../test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
2
4
 
3
5
  describe Committee::Test::Methods do
4
6
  include Committee::Test::Methods
@@ -33,7 +35,7 @@ describe Committee::Test::Methods do
33
35
  before do
34
36
  sc = JsonSchema.parse!(hyper_schema_data)
35
37
  sc.expand_references!
36
- s = Committee::Drivers::HyperSchema.new.parse(sc)
38
+ s = Committee::Drivers::HyperSchema::Driver.new.parse(sc)
37
39
  @committee_options = {schema: s}
38
40
  end
39
41
 
data/test/test_helper.rb CHANGED
@@ -1,19 +1,18 @@
1
- if RUBY_VERSION >= '2.0.0'
2
- require 'simplecov'
3
-
4
- SimpleCov.start do
5
- # We do our utmost to test our executables by modularizing them into
6
- # testable pieces, but testing them to completion is nearly impossible as
7
- # far as I can tell, so include them in our tests but don't calculate
8
- # coverage.
9
- add_filter "/bin/"
10
-
11
- add_filter "/test/"
12
-
13
- # This library has a pretty modest number of lines, so let's try to stick
14
- # to a 100% coverage target for a while and see what happens.
15
- minimum_coverage 100
16
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'simplecov'
4
+
5
+ SimpleCov.start do
6
+ # We do our utmost to test our executables by modularizing them into
7
+ # testable pieces, but testing them to completion is nearly impossible as
8
+ # far as I can tell, so include them in our tests but don't calculate
9
+ # coverage.
10
+ add_filter "/bin/"
11
+ add_filter "/test/"
12
+
13
+ # This library has a pretty modest number of lines, so let's try to stick
14
+ # to a 100% coverage target for a while and see what happens.
15
+ minimum_coverage 100
17
16
  end
18
17
 
19
18
  require "minitest"
@@ -22,6 +21,7 @@ require "minitest/autorun"
22
21
  require "rack/test"
23
22
  require "rr"
24
23
  require "pry"
24
+ require "stringio"
25
25
 
26
26
  require_relative "../lib/committee"
27
27