openapi_first 0.14.3 → 0.15.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: 1b6acd9051ff71dbc3980ec2547e6597992b4970f2aef176c4e118227f6ede01
4
- data.tar.gz: d8f7a2142aaf4c2d07f951c75500bf1790fc7e9bee0006242a075de6f35ed405
3
+ metadata.gz: 1c24075e5a05299387bba14bb16f931cf5e0f6cad58f0b0af04603ceb568dd78
4
+ data.tar.gz: 6e3eba2165048d139af385e736320157d6332f307d1cf99afe25172d5d48910d
5
5
  SHA512:
6
- metadata.gz: 5ca8769be4df5874bd1c4c36c80df6a9301c06687385cd6105f6c0acbcbcb39ff903b55a16df36aad3933e7f490ea8817975bf601c37b10d8b8489946e01cc1c
7
- data.tar.gz: '08588cfd43470ed9181b2420731e86ef2fdc99cb90dafd55af6228cd67d0e94c4eea9d7a9b3695a0034bd88c0d0a3ce071081579aeac66cf96ae995a8869d53f'
6
+ metadata.gz: 65b51042f045570f3f357108aee08519be8e0f0b0ca2b997fa4ba3bbb49bd4febb98a28efb624f6cacd41074383c7b8920748c2997fe5d943108d3d72db5194e
7
+ data.tar.gz: 9188f1624b57d2eb5eea004bef5b086037681603a7dc788b1810faa42b44005360663326d81aa53ba549442c8667fef6b4830dfc542f7f39e77c011db25f01f2
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.15.0
4
+
5
+ - Populate default parameter values
6
+
3
7
  ## 0.14.3
4
8
 
5
9
  - Use json_refs to resolve OpenAPI file. This removes oas_parser and ActiveSupport from list of dependencies
data/Gemfile.lock CHANGED
@@ -1,10 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- openapi_first (0.14.2)
4
+ openapi_first (0.15.0)
5
5
  deep_merge (>= 1.2.1)
6
- hanami-router (~> 2.0.alpha4)
7
- hanami-utils (~> 2.0.alpha1)
6
+ hanami-router (~> 2.0.alpha5)
7
+ hanami-utils (~> 2.0.alpha3)
8
8
  json_refs (>= 0.1.7)
9
9
  json_schemer (~> 0.2.16)
10
10
  multi_json (~> 1.14)
@@ -16,11 +16,11 @@ GEM
16
16
  ast (2.4.2)
17
17
  coderay (1.1.3)
18
18
  concurrent-ruby (1.1.9)
19
- deep_merge (1.2.1)
20
- diff-lcs (1.4.4)
19
+ deep_merge (1.2.2)
20
+ diff-lcs (1.5.0)
21
21
  dry-transformer (0.1.1)
22
- ecma-re-validator (0.3.0)
23
- regexp_parser (~> 2.0)
22
+ ecma-re-validator (0.4.0)
23
+ regexp_parser (~> 2.2)
24
24
  hana (1.3.7)
25
25
  hanami-router (2.0.0.alpha5)
26
26
  mustermann (~> 1.0)
@@ -45,7 +45,7 @@ GEM
45
45
  hansi (~> 0.2.0)
46
46
  mustermann (= 1.1.1)
47
47
  parallel (1.21.0)
48
- parser (3.0.2.0)
48
+ parser (3.1.0.0)
49
49
  ast (~> 2.4.1)
50
50
  pry (0.14.1)
51
51
  coderay (~> 1.1)
@@ -53,33 +53,33 @@ GEM
53
53
  rack (2.2.3)
54
54
  rack-test (1.1.0)
55
55
  rack (>= 1.0, < 3)
56
- rainbow (3.0.0)
56
+ rainbow (3.1.1)
57
57
  rake (13.0.6)
58
- regexp_parser (2.1.1)
58
+ regexp_parser (2.2.1)
59
59
  rexml (3.2.5)
60
- rspec (3.10.0)
61
- rspec-core (~> 3.10.0)
62
- rspec-expectations (~> 3.10.0)
63
- rspec-mocks (~> 3.10.0)
64
- rspec-core (3.10.1)
65
- rspec-support (~> 3.10.0)
66
- rspec-expectations (3.10.1)
60
+ rspec (3.11.0)
61
+ rspec-core (~> 3.11.0)
62
+ rspec-expectations (~> 3.11.0)
63
+ rspec-mocks (~> 3.11.0)
64
+ rspec-core (3.11.0)
65
+ rspec-support (~> 3.11.0)
66
+ rspec-expectations (3.11.0)
67
67
  diff-lcs (>= 1.2.0, < 2.0)
68
- rspec-support (~> 3.10.0)
69
- rspec-mocks (3.10.2)
68
+ rspec-support (~> 3.11.0)
69
+ rspec-mocks (3.11.0)
70
70
  diff-lcs (>= 1.2.0, < 2.0)
71
- rspec-support (~> 3.10.0)
72
- rspec-support (3.10.3)
73
- rubocop (1.23.0)
71
+ rspec-support (~> 3.11.0)
72
+ rspec-support (3.11.0)
73
+ rubocop (1.25.1)
74
74
  parallel (~> 1.10)
75
- parser (>= 3.0.0.0)
75
+ parser (>= 3.1.0.0)
76
76
  rainbow (>= 2.2.2, < 4.0)
77
77
  regexp_parser (>= 1.8, < 3.0)
78
78
  rexml
79
- rubocop-ast (>= 1.12.0, < 2.0)
79
+ rubocop-ast (>= 1.15.1, < 2.0)
80
80
  ruby-progressbar (~> 1.7)
81
81
  unicode-display_width (>= 1.4.0, < 3.0)
82
- rubocop-ast (1.13.0)
82
+ rubocop-ast (1.15.2)
83
83
  parser (>= 3.0.1.1)
84
84
  ruby-progressbar (1.11.0)
85
85
  ruby2_keywords (0.0.5)
@@ -99,4 +99,4 @@ DEPENDENCIES
99
99
  rubocop
100
100
 
101
101
  BUNDLED WITH
102
- 2.2.28
102
+ 2.3.7
data/README.md CHANGED
@@ -15,6 +15,7 @@ This gem is inspired by [committee](https://github.com/interagent/committee) (Ru
15
15
  Here's a [comparison between committee and openapi_first](https://gist.github.com/ahx/1538c31f0652f459861713b5259e366a).
16
16
 
17
17
  ## Rack middlewares
18
+
18
19
  OpenapiFirst consists of these Rack middlewares:
19
20
 
20
21
  - [`OpenapiFirst::Router`](#OpenapiFirst::Router) – Finds the OpenAPI operation for the current request or returns 404 if no operation was found. This can be customized.
@@ -23,6 +24,7 @@ OpenapiFirst consists of these Rack middlewares:
23
24
  - [`OpenapiFirst::ResponseValidation`](#OpenapiFirst::ResponseValidation) Validates the response and raises an exception if the response body is invalid.
24
25
 
25
26
  ## OpenapiFirst::Router
27
+
26
28
  You always have to add this middleware first in order to make the other middlewares work.
27
29
 
28
30
  ```ruby
@@ -33,11 +35,11 @@ This middleware adds `env[OpenapiFirst::OPERATION]` which holds an Operation obj
33
35
 
34
36
  ### Options and defaults
35
37
 
36
- | Name | Possible values | Description | Default
37
- |:---|---|---|---|
38
- |`spec:`| | The spec loaded via `OpenapiFirst.load` ||
39
- | `raise_error:` |`false`, `true` | If set to true the middleware raises `OpenapiFirst::NotFoundError` when a path or method was not found in the API description. This is useful during testing to spot an incomplete API description. | `false` (don't raise an exception)
40
- | `not_found:` | `:continue`, `:halt`| If set to `:continue` the middleware will not return 404 (405, 415), but just pass handling the request to the next middleware or application in the Rack stack. If combined with `raise_error: true` `raise_error` gets preference and an exception is raised. | `:halt` (return 4xx response)
38
+ | Name | Possible values | Description | Default |
39
+ | :------------- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- |
40
+ | `spec:` | | The spec loaded via `OpenapiFirst.load` | |
41
+ | `raise_error:` | `false`, `true` | If set to true the middleware raises `OpenapiFirst::NotFoundError` when a path or method was not found in the API description. This is useful during testing to spot an incomplete API description. | `false` (don't raise an exception) |
42
+ | `not_found:` | `:continue`, `:halt` | If set to `:continue` the middleware will not return 404 (405, 415), but just pass handling the request to the next middleware or application in the Rack stack. If combined with `raise_error: true` `raise_error` gets preference and an exception is raised. | `:halt` (return 4xx response) |
41
43
 
42
44
  ## OpenapiFirst::RequestValidation
43
45
 
@@ -47,12 +49,11 @@ This middleware returns a 400 status code with a body that describes the error i
47
49
  use OpenapiFirst::RequestValidation
48
50
  ```
49
51
 
50
-
51
52
  ### Options and defaults
52
53
 
53
- | Name | Possible values | Description | Default
54
- |:---|---|---|---|
55
- | `raise_error:` |`false`, `true` | If set to true the middleware raises `OpenapiFirst::RequestInvalidError` instead of returning 4xx. | `false` (don't raise an exception)
54
+ | Name | Possible values | Description | Default |
55
+ | :------------- | --------------- | -------------------------------------------------------------------------------------------------- | ---------------------------------- |
56
+ | `raise_error:` | `false`, `true` | If set to true the middleware raises `OpenapiFirst::RequestInvalidError` instead of returning 4xx. | `false` (don't raise an exception) |
56
57
 
57
58
  The error responses conform with [JSON:API](https://jsonapi.org).
58
59
 
@@ -110,17 +111,18 @@ Response validation fails if response body includes a property with `writeOnly:
110
111
  This Rack endpoint maps the HTTP request to a method call based on the [operationId](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#operation-object) in your API description and calls it. Responder also adds a content-type to the response.
111
112
 
112
113
  ```ruby
113
- run OpenapiFirst::Responder, spec: OpenapiFirst.load('./openapi/openapi.yaml')
114
+ run OpenapiFirst::Responder
114
115
  ```
115
116
 
116
117
  ### Options
117
- | Name | Description
118
- |:---|---|
119
- | `namespace:` | Optional. A class or module where to find the handler method. |
120
- | `resolver:` | Optional. An object that responds to `#call(operation)` and returns a [handler](#handlers). By default this is an instance of [DefaultOperationResolver](#OpenapiFirst::DefaultOperationResolver) |
121
118
 
119
+ | Name | Description |
120
+ | :----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
121
+ | `namespace:` | Optional. A class or module where to find the handler method. |
122
+ | `resolver:` | Optional. An object that responds to `#call(operation)` and returns a [handler](#handlers). By default this is an instance of [DefaultOperationResolver](#OpenapiFirst::DefaultOperationResolver) |
122
123
 
123
124
  ### OpenapiFirst::DefaultOperationResolver
125
+
124
126
  This is the default way to look up a handler method for an operation. Handlers are always looked up in a namespace module that needs to be specified.
125
127
 
126
128
  It works like this:
@@ -144,13 +146,15 @@ There are two ways to set the response body:
144
146
  - Returning a value which will get converted to JSON
145
147
 
146
148
  ## OpenapiFirst::ResponseValidation
147
- This middleware is especially useful when testing. It *always* raises an error if the response is not valid.
149
+
150
+ This middleware is especially useful when testing. It _always_ raises an error if the response is not valid.
148
151
 
149
152
  ```ruby
150
153
  use OpenapiFirst::ResponseValidation if ENV['RACK_ENV'] == 'test'
151
154
  ```
152
155
 
153
156
  ## Standalone usage
157
+
154
158
  Instead of composing these middlewares yourself you can use `OpenapiFirst.app`.
155
159
 
156
160
  ```ruby
@@ -181,15 +185,14 @@ The above will use the mentioned Rack middlewares to:
181
185
 
182
186
  ### Options and defaults
183
187
 
184
- | Name | Possible values | Description | Default
185
- |:---|---|---|---|
186
- | `spec_path` || A filepath to an OpenAPI definition file. |
187
- | `namespace:` || A class or module where to find the handler methods.|
188
- | `response_validation:` | `true`, `false` | If set to true it raises an exception if the response is invalid. This is useful during testing. | `false`
189
- | `router_raise_error:` | `true`, `false` | If set to true it raises an exception (subclass of `OpenapiFirst::Error` when a request path/method is not specified. This is useful during testing. | `false`
190
- | `request_validation_raise_error:` | `true`, `false` | If set to true it raises an exception (subclass of `OpenapiFirst::Error` when a request is not valid. | `false`
191
- | `resolver:` | | Option to customize finding the [handler](#handlers) method for an operation. See [OpenapiFirst::Responder](#OpenapiFirst::Responder) for details.
192
-
188
+ | Name | Possible values | Description | Default |
189
+ | :-------------------------------- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
190
+ | `spec_path` | | A filepath to an OpenAPI definition file. |
191
+ | `namespace:` | | A class or module where to find the handler methods. |
192
+ | `response_validation:` | `true`, `false` | If set to true it raises an exception if the response is invalid. This is useful during testing. | `false` |
193
+ | `router_raise_error:` | `true`, `false` | If set to true it raises an exception (subclass of `OpenapiFirst::Error` when a request path/method is not specified. This is useful during testing. | `false` |
194
+ | `request_validation_raise_error:` | `true`, `false` | If set to true it raises an exception (subclass of `OpenapiFirst::Error` when a request is not valid. | `false` |
195
+ | `resolver:` | | Option to customize finding the [handler](#handlers) method for an operation. See [OpenapiFirst::Responder](#OpenapiFirst::Responder) for details. |
193
196
 
194
197
  Handler functions (`find_pet`) are called with two arguments:
195
198
 
data/benchmarks/Gemfile CHANGED
@@ -7,7 +7,7 @@ gem 'benchmark-memory'
7
7
  gem 'committee'
8
8
  gem 'grape'
9
9
  gem 'hanami-api'
10
- gem 'hanami-router', '~> 2.0.0.alpha3'
10
+ gem 'hanami-router', '~> 2.0.0.alpha5'
11
11
  gem 'multi_json'
12
12
  gem 'openapi_first', path: '../'
13
13
  gem 'sinatra'
@@ -1,10 +1,10 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- openapi_first (0.14.2)
4
+ openapi_first (0.15.0)
5
5
  deep_merge (>= 1.2.1)
6
- hanami-router (~> 2.0.alpha4)
7
- hanami-utils (~> 2.0.alpha1)
6
+ hanami-router (~> 2.0.alpha5)
7
+ hanami-utils (~> 2.0.alpha3)
8
8
  json_refs (>= 0.1.7)
9
9
  json_schemer (~> 0.2.16)
10
10
  multi_json (~> 1.14)
@@ -13,13 +13,12 @@ PATH
13
13
  GEM
14
14
  remote: https://rubygems.org/
15
15
  specs:
16
- activesupport (6.1.4.1)
16
+ activesupport (7.0.2.2)
17
17
  concurrent-ruby (~> 1.0, >= 1.0.2)
18
18
  i18n (>= 1.6, < 2)
19
19
  minitest (>= 5.1)
20
20
  tzinfo (~> 2.0)
21
- zeitwerk (~> 2.3)
22
- benchmark-ips (2.9.2)
21
+ benchmark-ips (2.9.3)
23
22
  benchmark-memory (0.2.0)
24
23
  memory_profiler (~> 1)
25
24
  builder (3.2.4)
@@ -28,8 +27,8 @@ GEM
28
27
  openapi_parser (>= 0.11.1, < 1.0)
29
28
  rack (>= 1.5)
30
29
  concurrent-ruby (1.1.9)
31
- deep_merge (1.2.1)
32
- dry-configurable (0.13.0)
30
+ deep_merge (1.2.2)
31
+ dry-configurable (0.14.0)
33
32
  concurrent-ruby (~> 1.0)
34
33
  dry-core (~> 0.6)
35
34
  dry-container (0.9.0)
@@ -48,9 +47,9 @@ GEM
48
47
  dry-core (~> 0.5, >= 0.5)
49
48
  dry-inflector (~> 0.1, >= 0.1.2)
50
49
  dry-logic (~> 1.0, >= 1.0.2)
51
- ecma-re-validator (0.3.0)
52
- regexp_parser (~> 2.0)
53
- grape (1.6.0)
50
+ ecma-re-validator (0.4.0)
51
+ regexp_parser (~> 2.2)
52
+ grape (1.6.2)
54
53
  activesupport
55
54
  builder
56
55
  dry-types (>= 1.1)
@@ -64,11 +63,11 @@ GEM
64
63
  mustermann (~> 1.0)
65
64
  mustermann-contrib (~> 1.0)
66
65
  rack (~> 2.0)
67
- hanami-utils (2.0.0.alpha3)
66
+ hanami-utils (2.0.0.alpha6)
68
67
  concurrent-ruby (~> 1.0)
69
68
  dry-transformer (~> 0.1)
70
69
  hansi (0.2.0)
71
- i18n (1.8.11)
70
+ i18n (1.9.1)
72
71
  concurrent-ruby (~> 1.0)
73
72
  json_refs (0.1.7)
74
73
  hana
@@ -79,7 +78,7 @@ GEM
79
78
  regexp_parser (~> 2.0)
80
79
  uri_template (~> 0.7)
81
80
  memory_profiler (1.0.0)
82
- minitest (5.14.4)
81
+ minitest (5.15.0)
83
82
  multi_json (1.15.0)
84
83
  mustermann (1.1.1)
85
84
  ruby2_keywords (~> 0.0.1)
@@ -94,7 +93,7 @@ GEM
94
93
  rack (>= 0.4)
95
94
  rack-protection (2.1.0)
96
95
  rack
97
- regexp_parser (2.1.1)
96
+ regexp_parser (2.2.1)
98
97
  ruby2_keywords (0.0.5)
99
98
  seg (1.2.0)
100
99
  sinatra (2.1.0)
@@ -109,7 +108,6 @@ GEM
109
108
  tzinfo (2.0.4)
110
109
  concurrent-ruby (~> 1.0)
111
110
  uri_template (0.7.0)
112
- zeitwerk (2.5.1)
113
111
 
114
112
  PLATFORMS
115
113
  x86_64-darwin-20
@@ -120,7 +118,7 @@ DEPENDENCIES
120
118
  committee
121
119
  grape
122
120
  hanami-api
123
- hanami-router (~> 2.0.0.alpha3)
121
+ hanami-router (~> 2.0.0.alpha5)
124
122
  multi_json
125
123
  openapi_first!
126
124
  sinatra
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'forwardable'
4
+ require 'set'
4
5
  require_relative 'schema_validation'
5
6
  require_relative 'utils'
6
7
  require_relative 'response_object'
@@ -105,8 +105,10 @@ module OpenapiFirst
105
105
  return unless schema
106
106
 
107
107
  params = filtered_params(schema.raw_schema, params)
108
- errors = schema.validate(Utils.deep_stringify(params))
108
+ params = Utils.deep_stringify(params)
109
+ errors = schema.validate(params)
109
110
  halt_with_error(400, serialize_query_parameter_errors(errors)) if errors.any?
111
+ params = Utils.deep_symbolize(params)
110
112
  env[PARAMETERS] = params
111
113
  env[INBOX].merge! params
112
114
  end
@@ -14,6 +14,7 @@ module OpenapiFirst
14
14
  @schemer = JSONSchemer.schema(
15
15
  schema,
16
16
  keywords: custom_keywords,
17
+ insert_property_defaults: true,
17
18
  before_property_validation: proc do |data, property, property_schema, parent|
18
19
  convert_nullable(data, property, property_schema, parent)
19
20
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OpenapiFirst
4
- VERSION = '0.14.3'
4
+ VERSION = '0.15.0'
5
5
  end
@@ -35,8 +35,8 @@ Gem::Specification.new do |spec|
35
35
  spec.required_ruby_version = '>= 2.6.0'
36
36
 
37
37
  spec.add_runtime_dependency 'deep_merge', '>= 1.2.1'
38
- spec.add_runtime_dependency 'hanami-router', '~> 2.0.alpha4'
39
- spec.add_runtime_dependency 'hanami-utils', '~> 2.0.alpha1'
38
+ spec.add_runtime_dependency 'hanami-router', '~> 2.0.alpha5'
39
+ spec.add_runtime_dependency 'hanami-utils', '~> 2.0.alpha3'
40
40
  spec.add_runtime_dependency 'json_refs', '>= 0.1.7'
41
41
  spec.add_runtime_dependency 'json_schemer', '~> 0.2.16'
42
42
  spec.add_runtime_dependency 'multi_json', '~> 1.14'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openapi_first
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.3
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andreas Haller
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-02-02 00:00:00.000000000 Z
11
+ date: 2022-02-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deep_merge
@@ -30,28 +30,28 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 2.0.alpha4
33
+ version: 2.0.alpha5
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 2.0.alpha4
40
+ version: 2.0.alpha5
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: hanami-utils
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 2.0.alpha1
47
+ version: 2.0.alpha3
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 2.0.alpha1
54
+ version: 2.0.alpha3
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: json_refs
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -243,7 +243,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
243
243
  - !ruby/object:Gem::Version
244
244
  version: '0'
245
245
  requirements: []
246
- rubygems_version: 3.2.22
246
+ rubygems_version: 3.3.3
247
247
  signing_key:
248
248
  specification_version: 4
249
249
  summary: Implement REST APIs based on OpenApi.