openapi_first 1.2.1 → 1.3.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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/lib/openapi_first/body_parser.rb +1 -0
  3. data/lib/openapi_first/configuration.rb +3 -1
  4. data/lib/openapi_first/definition/operation.rb +66 -5
  5. data/lib/openapi_first/definition/path_item.rb +1 -0
  6. data/lib/openapi_first/definition/request_body.rb +2 -1
  7. data/lib/openapi_first/definition/response.rb +7 -0
  8. data/lib/openapi_first/definition.rb +40 -0
  9. data/lib/openapi_first/error_response.rb +1 -1
  10. data/lib/openapi_first/errors.rb +6 -0
  11. data/lib/openapi_first/failure.rb +13 -2
  12. data/lib/openapi_first/middlewares/request_validation.rb +2 -5
  13. data/lib/openapi_first/middlewares/response_validation.rb +1 -4
  14. data/lib/openapi_first/plugins/default/error_response.rb +4 -4
  15. data/lib/openapi_first/plugins/default.rb +1 -1
  16. data/lib/openapi_first/plugins/jsonapi/error_response.rb +3 -2
  17. data/lib/openapi_first/plugins/jsonapi.rb +1 -1
  18. data/lib/openapi_first/plugins.rb +1 -0
  19. data/lib/openapi_first/request_validation/request_body_validator.rb +1 -1
  20. data/lib/openapi_first/request_validation/validator.rb +1 -0
  21. data/lib/openapi_first/response_validation/validator.rb +1 -0
  22. data/lib/openapi_first/runtime_request.rb +63 -3
  23. data/lib/openapi_first/runtime_response.rb +43 -4
  24. data/lib/openapi_first/schema/validation_error.rb +2 -0
  25. data/lib/openapi_first/schema/validation_result.rb +2 -0
  26. data/lib/openapi_first/schema.rb +1 -0
  27. data/lib/openapi_first/version.rb +1 -1
  28. data/lib/openapi_first.rb +8 -0
  29. metadata +5 -16
  30. data/.github/CODEOWNERS +0 -1
  31. data/.github/workflows/ruby.yml +0 -13
  32. data/.gitignore +0 -11
  33. data/CHANGELOG.md +0 -279
  34. data/Gemfile +0 -18
  35. data/Gemfile.lock +0 -166
  36. data/Gemfile.rack2 +0 -15
  37. data/Gemfile.rack2.lock +0 -95
  38. data/LICENSE.txt +0 -21
  39. data/README.md +0 -225
  40. data/openapi_first.gemspec +0 -47
data/Gemfile.lock DELETED
@@ -1,166 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- openapi_first (1.2.1)
5
- json_refs (~> 0.1, >= 0.1.7)
6
- json_schemer (~> 2.1.0)
7
- multi_json (~> 1.15)
8
- mustermann (~> 3.0.0)
9
- openapi_parameters (>= 0.3.2, < 2.0)
10
- rack (>= 2.2, < 4.0)
11
-
12
- GEM
13
- remote: https://rubygems.org/
14
- specs:
15
- actionpack (7.1.3)
16
- actionview (= 7.1.3)
17
- activesupport (= 7.1.3)
18
- nokogiri (>= 1.8.5)
19
- racc
20
- rack (>= 2.2.4)
21
- rack-session (>= 1.0.1)
22
- rack-test (>= 0.6.3)
23
- rails-dom-testing (~> 2.2)
24
- rails-html-sanitizer (~> 1.6)
25
- actionview (7.1.3)
26
- activesupport (= 7.1.3)
27
- builder (~> 3.1)
28
- erubi (~> 1.11)
29
- rails-dom-testing (~> 2.2)
30
- rails-html-sanitizer (~> 1.6)
31
- activesupport (7.1.3)
32
- base64
33
- bigdecimal
34
- concurrent-ruby (~> 1.0, >= 1.0.2)
35
- connection_pool (>= 2.2.5)
36
- drb
37
- i18n (>= 1.6, < 2)
38
- minitest (>= 5.1)
39
- mutex_m
40
- tzinfo (~> 2.0)
41
- ast (2.4.2)
42
- base64 (0.2.0)
43
- bigdecimal (3.1.6)
44
- builder (3.2.4)
45
- concurrent-ruby (1.2.3)
46
- connection_pool (2.4.1)
47
- crass (1.0.6)
48
- diff-lcs (1.5.0)
49
- docile (1.4.0)
50
- drb (2.2.0)
51
- ruby2_keywords
52
- erubi (1.12.0)
53
- hana (1.3.7)
54
- i18n (1.14.1)
55
- concurrent-ruby (~> 1.0)
56
- json (2.7.1)
57
- json_refs (0.1.8)
58
- hana
59
- json_schemer (2.1.1)
60
- hana (~> 1.3)
61
- regexp_parser (~> 2.0)
62
- simpleidn (~> 0.2)
63
- language_server-protocol (3.17.0.3)
64
- loofah (2.22.0)
65
- crass (~> 1.0.2)
66
- nokogiri (>= 1.12.0)
67
- minitest (5.21.2)
68
- multi_json (1.15.0)
69
- mustermann (3.0.0)
70
- ruby2_keywords (~> 0.0.1)
71
- mutex_m (0.2.0)
72
- nokogiri (1.16.0-arm64-darwin)
73
- racc (~> 1.4)
74
- nokogiri (1.16.0-x86_64-linux)
75
- racc (~> 1.4)
76
- openapi_parameters (0.3.2)
77
- rack (>= 2.2)
78
- zeitwerk (~> 2.6)
79
- parallel (1.24.0)
80
- parser (3.3.0.5)
81
- ast (~> 2.4.1)
82
- racc
83
- racc (1.7.3)
84
- rack (3.0.8)
85
- rack-session (2.0.0)
86
- rack (>= 3.0.0)
87
- rack-test (2.1.0)
88
- rack (>= 1.3)
89
- rackup (2.1.0)
90
- rack (>= 3)
91
- webrick (~> 1.8)
92
- rails-dom-testing (2.2.0)
93
- activesupport (>= 5.0.0)
94
- minitest
95
- nokogiri (>= 1.6)
96
- rails-html-sanitizer (1.6.0)
97
- loofah (~> 2.21)
98
- nokogiri (~> 1.14)
99
- rainbow (3.1.1)
100
- rake (13.1.0)
101
- regexp_parser (2.9.0)
102
- rexml (3.2.6)
103
- rspec (3.12.0)
104
- rspec-core (~> 3.12.0)
105
- rspec-expectations (~> 3.12.0)
106
- rspec-mocks (~> 3.12.0)
107
- rspec-core (3.12.2)
108
- rspec-support (~> 3.12.0)
109
- rspec-expectations (3.12.3)
110
- diff-lcs (>= 1.2.0, < 2.0)
111
- rspec-support (~> 3.12.0)
112
- rspec-mocks (3.12.6)
113
- diff-lcs (>= 1.2.0, < 2.0)
114
- rspec-support (~> 3.12.0)
115
- rspec-support (3.12.1)
116
- rubocop (1.60.1)
117
- json (~> 2.3)
118
- language_server-protocol (>= 3.17.0)
119
- parallel (~> 1.10)
120
- parser (>= 3.3.0.2)
121
- rainbow (>= 2.2.2, < 4.0)
122
- regexp_parser (>= 1.8, < 3.0)
123
- rexml (>= 3.2.5, < 4.0)
124
- rubocop-ast (>= 1.30.0, < 2.0)
125
- ruby-progressbar (~> 1.7)
126
- unicode-display_width (>= 2.4.0, < 3.0)
127
- rubocop-ast (1.30.0)
128
- parser (>= 3.2.1.0)
129
- ruby-progressbar (1.13.0)
130
- ruby2_keywords (0.0.5)
131
- simplecov (0.22.0)
132
- docile (~> 1.1)
133
- simplecov-html (~> 0.11)
134
- simplecov_json_formatter (~> 0.1)
135
- simplecov-html (0.12.3)
136
- simplecov_json_formatter (0.1.4)
137
- simpleidn (0.2.1)
138
- unf (~> 0.1.4)
139
- tzinfo (2.0.6)
140
- concurrent-ruby (~> 1.0)
141
- unf (0.1.4)
142
- unf_ext
143
- unf_ext (0.0.9.1)
144
- unicode-display_width (2.5.0)
145
- webrick (1.8.1)
146
- zeitwerk (2.6.12)
147
-
148
- PLATFORMS
149
- arm64-darwin-21
150
- arm64-darwin-22
151
- x86_64-linux
152
-
153
- DEPENDENCIES
154
- actionpack
155
- bundler
156
- openapi_first!
157
- rack (>= 3.0.0)
158
- rack-test
159
- rackup
160
- rake
161
- rspec
162
- rubocop
163
- simplecov
164
-
165
- BUNDLED WITH
166
- 2.3.10
data/Gemfile.rack2 DELETED
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- gemspec
6
-
7
- gem 'rack', '< 3.0.0'
8
-
9
- group :test, :development do
10
- gem 'bundler'
11
- gem 'rack-test'
12
- gem 'rake'
13
- gem 'rspec'
14
- gem 'rubocop'
15
- end
data/Gemfile.rack2.lock DELETED
@@ -1,95 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- openapi_first (1.1.1)
5
- json_refs (~> 0.1, >= 0.1.7)
6
- json_schemer (~> 2.1.0)
7
- multi_json (~> 1.15)
8
- mustermann (~> 3.0.0)
9
- openapi_parameters (>= 0.3.2, < 2.0)
10
- rack (>= 2.2, < 4.0)
11
-
12
- GEM
13
- remote: https://rubygems.org/
14
- specs:
15
- ast (2.4.2)
16
- diff-lcs (1.5.0)
17
- hana (1.3.7)
18
- json (2.7.1)
19
- json_refs (0.1.8)
20
- hana
21
- json_schemer (2.1.1)
22
- hana (~> 1.3)
23
- regexp_parser (~> 2.0)
24
- simpleidn (~> 0.2)
25
- language_server-protocol (3.17.0.3)
26
- multi_json (1.15.0)
27
- mustermann (3.0.0)
28
- ruby2_keywords (~> 0.0.1)
29
- openapi_parameters (0.3.2)
30
- rack (>= 2.2)
31
- zeitwerk (~> 2.6)
32
- parallel (1.24.0)
33
- parser (3.2.2.4)
34
- ast (~> 2.4.1)
35
- racc
36
- racc (1.7.3)
37
- rack (2.2.8)
38
- rack-test (2.1.0)
39
- rack (>= 1.3)
40
- rainbow (3.1.1)
41
- rake (13.1.0)
42
- regexp_parser (2.8.3)
43
- rexml (3.2.6)
44
- rspec (3.12.0)
45
- rspec-core (~> 3.12.0)
46
- rspec-expectations (~> 3.12.0)
47
- rspec-mocks (~> 3.12.0)
48
- rspec-core (3.12.2)
49
- rspec-support (~> 3.12.0)
50
- rspec-expectations (3.12.3)
51
- diff-lcs (>= 1.2.0, < 2.0)
52
- rspec-support (~> 3.12.0)
53
- rspec-mocks (3.12.6)
54
- diff-lcs (>= 1.2.0, < 2.0)
55
- rspec-support (~> 3.12.0)
56
- rspec-support (3.12.1)
57
- rubocop (1.59.0)
58
- json (~> 2.3)
59
- language_server-protocol (>= 3.17.0)
60
- parallel (~> 1.10)
61
- parser (>= 3.2.2.4)
62
- rainbow (>= 2.2.2, < 4.0)
63
- regexp_parser (>= 1.8, < 3.0)
64
- rexml (>= 3.2.5, < 4.0)
65
- rubocop-ast (>= 1.30.0, < 2.0)
66
- ruby-progressbar (~> 1.7)
67
- unicode-display_width (>= 2.4.0, < 3.0)
68
- rubocop-ast (1.30.0)
69
- parser (>= 3.2.1.0)
70
- ruby-progressbar (1.13.0)
71
- ruby2_keywords (0.0.5)
72
- simpleidn (0.2.1)
73
- unf (~> 0.1.4)
74
- unf (0.1.4)
75
- unf_ext
76
- unf_ext (0.0.9.1)
77
- unicode-display_width (2.5.0)
78
- zeitwerk (2.6.12)
79
-
80
- PLATFORMS
81
- arm64-darwin-22
82
- ruby
83
- x86_64-linux
84
-
85
- DEPENDENCIES
86
- bundler
87
- openapi_first!
88
- rack (< 3.0.0)
89
- rack-test
90
- rake
91
- rspec
92
- rubocop
93
-
94
- BUNDLED WITH
95
- 2.5.3
data/LICENSE.txt DELETED
@@ -1,21 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2020 Andreas Haller
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- THE SOFTWARE.
data/README.md DELETED
@@ -1,225 +0,0 @@
1
- # openapi_first
2
-
3
- OpenapiFirst helps to implement HTTP APIs based on an [OpenAPI](https://www.openapis.org/) API description. It supports OpenAPI 3.0 and 3.1. It offers request and response validation and it ensures that your implementation follows exactly the API description.
4
-
5
- ## Contents
6
-
7
- <!-- TOC -->
8
-
9
- - [Manual use](#manual-use)
10
- - [Rack Middlewares](#rack-middlewares)
11
- - [Request validation](#request-validation)
12
- - [Response validation](#response-validation)
13
- - [Configuration](#configuration)
14
- - [Development](#development)
15
- - [Benchmarks](#benchmarks)
16
- - [Contributing](#contributing)
17
-
18
- <!-- /TOC -->
19
-
20
- ## Manual use
21
-
22
- Load the API description:
23
-
24
- ```ruby
25
- require 'openapi_first'
26
-
27
- definition = OpenapiFirst.load('petstore.yaml')
28
- ```
29
-
30
- Validate request / response:
31
-
32
- ```ruby
33
-
34
- # Find the request
35
- rack_request = Rack::Request.new(env) # GET /pets/42
36
- request = definition.request(rack_request)
37
-
38
- # Inspect the request and access parsed parameters
39
- request.known? # Is the request defined in the API description?
40
- request.content_type
41
- request.body # alias: parsed_body
42
- request.path_parameters # => { "pet_id" => 42 }
43
- request.query_parameters # alias: query
44
- request.params # Merged path and query parameters
45
- request.headers
46
- request.cookies
47
- request.request_method # => "get"
48
- request.path # => "/pets/42"
49
- request.path_definition # => "/pets/{pet_id}"
50
-
51
- # Validate the request
52
- request.validate # Returns OpenapiFirst:::Failure if validation fails
53
- request.validate! # Raises OpenapiFirst::RequestInvalidError or OpenapiFirst::NotFoundError if validation fails
54
-
55
- # Find the response
56
- rack_response = Rack::Response[*app.call(env)]
57
- response = request.response(rack_response) # or definition.response(rack_request, rack_response)
58
-
59
- # Inspect the response
60
- response.known? # Is the response defined in the API description?
61
- response.status # => 200
62
- response.content_type
63
- response.body
64
- request.headers # parsed response headers
65
-
66
- # Validate response
67
- response.validate # Returns OpenapiFirst::Failure if validation fails
68
- response.validate! # Raises OpenapiFirst::ResponseInvalidError or OpenapiFirst::ResponseNotFoundError if validation fails
69
- ```
70
-
71
- OpenapiFirst uses [`multi_json`](https://rubygems.org/gems/multi_json).
72
-
73
- ## Rack Middlewares
74
-
75
- All middlewares add a _request_ object to the current Rack env at `env[OpenapiFirst::REQUEST]`), which is in an instance of `OpenapiFirst::RuntimeRequest` that responds to `.params`, `.parsed_body` etc.
76
-
77
- This gives you access to the converted request parameters and body exaclty as described in your API description instead of relying on Rack alone to parse the request. This only includes query parameters that are defined in the API description. It supports every [`style` and `explode` value as described](https://spec.openapis.org/oas/latest.html#style-examples) in the OpenAPI 3.0 and 3.1 specs.
78
-
79
- ### Request validation
80
-
81
- The request validation middleware returns a 4xx if the request is invalid or not defined in the API description.
82
-
83
- ```ruby
84
- use OpenapiFirst::Middlewares::RequestValidation, spec: 'openapi.yaml'
85
- ```
86
-
87
- #### Options
88
-
89
- | Name | Possible values | Description |
90
- | :---------------- | ------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------- |
91
- | `spec:` | | The path to the spec file or spec loaded via `OpenapiFirst.load` |
92
- | `raise_error:` | `false` (default), `true` | If set to true the middleware raises `OpenapiFirst::RequestInvalidError` or `OpenapiFirst::NotFoundError` instead of returning 4xx. |
93
- | `error_response:` | `:default` (default), `:jsonapi`, Your implementation of `ErrorResponse` |
94
-
95
- Here in an example response body about an invalid request body. See also [RFC 9457](https://www.rfc-editor.org/rfc/rfc9457).
96
-
97
- ```json
98
- http-status: 400
99
- content-type: "application/problem+json"
100
-
101
- {
102
- "title": "Bad Request Body",
103
- "status": 400,
104
- "errors": [
105
- {
106
- "message": "value at `/data/name` is not a string",
107
- "pointer": "/data/name",
108
- "code": "string"
109
- },
110
- {
111
- "message": "number at `/data/numberOfLegs` is less than: 2",
112
- "pointer": "/data/numberOfLegs",
113
- "code": "minimum"
114
- },
115
- {
116
- "message": "object at `/data` is missing required properties: mandatory",
117
- "pointer": "/data",
118
- "code": "required"
119
- }
120
- ]
121
- }
122
- ```
123
-
124
- openapi_first offers a [JSON:API](https://jsonapi.org/) error response as well:
125
-
126
- ```ruby
127
- use OpenapiFirst::Middlewares::RequestValidation, spec: 'openapi.yaml, error_response: :jsonapi'
128
- ```
129
-
130
- Here is an example error response:
131
-
132
- ```json
133
- // http-status: 400
134
- // content-type: "application/vnd.api+json"
135
-
136
- {
137
- "errors": [
138
- {
139
- "status": "400",
140
- "source": {
141
- "pointer": "/data/name"
142
- },
143
- "title": "value at `/data/name` is not a string",
144
- "code": "string"
145
- },
146
- {
147
- "status": "400",
148
- "source": {
149
- "pointer": "/data/numberOfLegs"
150
- },
151
- "title": "number at `/data/numberOfLegs` is less than: 2",
152
- "code": "minimum"
153
- },
154
- {
155
- "status": "400",
156
- "source": {
157
- "pointer": "/data"
158
- },
159
- "title": "object at `/data` is missing required properties: mandatory",
160
- "code": "required"
161
- }
162
- ]
163
- }
164
- ```
165
-
166
- You can build your own custom error response with `error_response: MyCustomClass` that implements `OpenapiFirst::ErrorResponse`.
167
-
168
- #### readOnly / writeOnly properties
169
-
170
- Request validation fails if request includes a property with `readOnly: true`.
171
-
172
- Response validation fails if response body includes a property with `writeOnly: true`.
173
-
174
- ### Response validation
175
-
176
- This middleware is especially useful when testing. It _always_ raises an error if the response is not valid.
177
-
178
- ```ruby
179
- use OpenapiFirst::Middlewares::ResponseValidation, spec: 'openapi.yaml' if ENV['RACK_ENV'] == 'test'
180
- ```
181
-
182
- #### Options
183
-
184
- | Name | Possible values | Description |
185
- | :------ | --------------- | ---------------------------------------------------------------- |
186
- | `spec:` | | The path to the spec file or spec loaded via `OpenapiFirst.load` |
187
-
188
- ## Configuration
189
-
190
- You can configure default options globally:
191
-
192
- ```ruby
193
- OpenapiFirst.configure do |config|
194
- # Specify which plugin is used to render error responses returned by the request validation middleware (defaults to :default)
195
- config.request_validation_error_response = :jsonapi
196
- # Configure if the response validation middleware should raise an exception (defaults to false)
197
- config.request_validation_raise_error = true
198
- end
199
- ```
200
-
201
- ## Development
202
-
203
- Run `bin/setup` to install dependencies.
204
-
205
- See `bundle exec rake` to run the linter and the tests.
206
-
207
- Run `bundle exec rspec` to run the tests only.
208
-
209
- ### Benchmarks
210
-
211
- [Results](https://gist.github.com/ahx/e6ffced58bd2e8d5baffb2f4d2c1f823)
212
-
213
- Run benchmarks:
214
-
215
- ```sh
216
- cd benchmarks
217
- bundle
218
- bundle exec ruby benchmarks.rb
219
- ```
220
-
221
- ### Contributing
222
-
223
- If you have a question or an idea or found a bug don't hesitate to [create an issue](https://github.com/ahx/openapi_first/issues) or [start a discussion](https://github.com/ahx/openapi_first/discussions).
224
-
225
- Pull requests are very welcome as well, of course. Feel free to create a "draft" pull request early on, even if your change is still work in progress. 🤗
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- lib = File.expand_path('lib', __dir__)
4
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require 'openapi_first/version'
6
-
7
- Gem::Specification.new do |spec|
8
- spec.name = 'openapi_first'
9
- spec.version = OpenapiFirst::VERSION
10
- spec.authors = ['Andreas Haller']
11
- spec.email = ['andreas.haller@posteo.de']
12
- spec.licenses = ['MIT']
13
-
14
- spec.summary = 'Implement REST APIs based on OpenApi 3.x'
15
- spec.homepage = 'https://github.com/ahx/openapi_first'
16
-
17
- if spec.respond_to?(:metadata)
18
- spec.metadata['https://github.com/ahx/openapi_first'] = spec.homepage
19
- spec.metadata['source_code_uri'] = 'https://github.com/ahx/openapi_first'
20
- spec.metadata['changelog_uri'] = 'https://github.com/ahx/openapi_first/blob/main/CHANGELOG.md'
21
- spec.metadata['rubygems_mfa_required'] = 'true'
22
- else
23
- raise 'RubyGems 2.0 or newer is required to protect against ' \
24
- 'public gem pushes.'
25
- end
26
-
27
- spec.files = Dir.chdir(File.expand_path(__dir__)) do
28
- `git ls-files -z`
29
- .split("\x0")
30
- .reject { |f| f.match(%r{^(test|spec|features|benchmarks|examples|bin)/}) }
31
- .reject do |f|
32
- %w[Dockerfile Jenkinsfile .tool-versions CODEOWNERS .rspec .rubocop.yml .tool-versions
33
- Rakefile].include?(f)
34
- end
35
- end
36
- spec.bindir = 'exe'
37
- spec.require_paths = ['lib']
38
-
39
- spec.required_ruby_version = '>= 3.1.1'
40
-
41
- spec.add_runtime_dependency 'json_refs', '~> 0.1', '>= 0.1.7'
42
- spec.add_runtime_dependency 'json_schemer', '~> 2.1.0'
43
- spec.add_runtime_dependency 'multi_json', '~> 1.15'
44
- spec.add_runtime_dependency 'mustermann', '~> 3.0.0'
45
- spec.add_runtime_dependency 'openapi_parameters', '>= 0.3.2', '< 2.0'
46
- spec.add_runtime_dependency 'rack', '>= 2.2', '< 4.0'
47
- end