openapi_first 1.0.0.beta1 → 1.0.0.beta3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/Gemfile.lock +3 -17
- data/README.md +12 -16
- data/benchmarks/Gemfile.lock +11 -17
- data/benchmarks/apps/openapi_first_with_hanami_api.ru +1 -2
- data/benchmarks/apps/openapi_first_with_plain_rack.ru +32 -0
- data/benchmarks/apps/openapi_first_with_response_validation.ru +14 -11
- data/benchmarks/apps/openapi_first_with_sinatra.ru +29 -0
- data/lib/openapi_first/utils.rb +0 -16
- data/lib/openapi_first/version.rb +1 -1
- data/lib/openapi_first.rb +0 -18
- data/openapi_first.gemspec +1 -4
- metadata +8 -55
- data/benchmarks/apps/openapi_first.ru +0 -22
- /data/benchmarks/apps/{committee.ru → committee_with_hanami_api.ru} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 800354f7ac2847fb16987e6961589aaebb84c161f3b76ea652a00a4cf8762fbe
|
4
|
+
data.tar.gz: f443b72fa8ce1103bfc5a7b30367ce96f84e0dc7ad137722424cab0ac0c13357
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e454ee38c95a21915869e5feae0f38f65e0aa9a0a5001b6b752043fa379836164af1bf7eac9bcff192822d66053dda00d6dfa787296cce82bccf346d218f4c6c
|
7
|
+
data.tar.gz: 11a0a0ac1e1bbd350d1edfe1dcae4ccae15bcfe2f1863320f30f554c3ad16934b07891c578225d2d7d128c3cb7dafd4093407c1c153713567db4db3d9c99c938
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## Unreleased
|
4
|
+
|
5
|
+
## 1.0.0.beta3
|
6
|
+
|
7
|
+
- Remove obsolete dependency: deep_merge
|
8
|
+
- Remove obsolete dependency: hanami-utils
|
9
|
+
|
10
|
+
## 1.0.0.beta2
|
11
|
+
- Fixed dependencies. Remove unused code.
|
12
|
+
|
3
13
|
## 1.0.0.beta1
|
4
14
|
- Removed: `OpenapiFirst::Responder` and `OpenapiFirst::RackResponder`
|
5
15
|
- Removed: `OpenapiFirst.app` and `OpenapiFirst.middleware`
|
data/Gemfile.lock
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
openapi_first (1.0.0.
|
5
|
-
deep_merge (>= 1.2.1)
|
4
|
+
openapi_first (1.0.0.beta3)
|
6
5
|
hanami-router (~> 2.0.0)
|
7
|
-
hanami-utils (~> 2.0.0)
|
8
6
|
json_refs (~> 0.1, >= 0.1.7)
|
9
7
|
json_schemer (~> 0.2.16)
|
10
8
|
multi_json (~> 1.14)
|
11
|
-
|
9
|
+
openapi_parameters (~> 0.2)
|
12
10
|
rack (>= 2.2, < 4.0)
|
13
11
|
|
14
12
|
GEM
|
@@ -16,14 +14,7 @@ GEM
|
|
16
14
|
specs:
|
17
15
|
ast (2.4.2)
|
18
16
|
coderay (1.1.3)
|
19
|
-
concurrent-ruby (1.2.2)
|
20
|
-
deep_merge (1.2.2)
|
21
17
|
diff-lcs (1.5.0)
|
22
|
-
dry-core (1.0.0)
|
23
|
-
concurrent-ruby (~> 1.0)
|
24
|
-
zeitwerk (~> 2.6)
|
25
|
-
dry-transformer (1.0.1)
|
26
|
-
zeitwerk (~> 2.6)
|
27
18
|
ecma-re-validator (0.4.0)
|
28
19
|
regexp_parser (~> 2.2)
|
29
20
|
hana (1.3.7)
|
@@ -31,10 +22,6 @@ GEM
|
|
31
22
|
mustermann (~> 3.0)
|
32
23
|
mustermann-contrib (~> 3.0)
|
33
24
|
rack (~> 2.0)
|
34
|
-
hanami-utils (2.0.3)
|
35
|
-
concurrent-ruby (~> 1.0)
|
36
|
-
dry-core (~> 1.0, < 2)
|
37
|
-
dry-transformer (~> 1.0, < 2)
|
38
25
|
hansi (0.2.1)
|
39
26
|
json (2.6.3)
|
40
27
|
json_refs (0.1.7)
|
@@ -51,7 +38,7 @@ GEM
|
|
51
38
|
mustermann-contrib (3.0.0)
|
52
39
|
hansi (~> 0.2.0)
|
53
40
|
mustermann (= 3.0.0)
|
54
|
-
openapi_parameters (0.2.
|
41
|
+
openapi_parameters (0.2.1)
|
55
42
|
rack (>= 2.2)
|
56
43
|
zeitwerk (~> 2.6)
|
57
44
|
parallel (1.22.1)
|
@@ -104,7 +91,6 @@ PLATFORMS
|
|
104
91
|
DEPENDENCIES
|
105
92
|
bundler (~> 2)
|
106
93
|
openapi_first!
|
107
|
-
openapi_parameters (~> 0.2, <= 2.0.0)
|
108
94
|
pry
|
109
95
|
rack-test (~> 1)
|
110
96
|
rake (~> 13)
|
data/README.md
CHANGED
@@ -2,28 +2,26 @@
|
|
2
2
|
|
3
3
|
[](https://gitter.im/openapi_first/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
4
4
|
|
5
|
-
OpenapiFirst helps to implement HTTP APIs based on an [
|
5
|
+
OpenapiFirst helps to implement HTTP APIs based on an [OpenAPI](https://www.openapis.org/) API description.
|
6
6
|
|
7
|
-
|
7
|
+
It provides these Rack middlewares:
|
8
8
|
|
9
|
-
OpenapiFirst
|
9
|
+
- [`OpenapiFirst::RequestValidation`](#request-validation) – Validates the request against the API description and returns 400 if the request is invalid.
|
10
|
+
- [`OpenapiFirst::ResponseValidation`](#response-validation) Validates the response and raises an exception if the response body is invalid.
|
11
|
+
- [`OpenapiFirst::Router`](#openapifirstrouter) – This internal middleware is added automatically when using request/response validation. It adds the OpenAPI operation for the current request to the Rack env.
|
10
12
|
|
11
|
-
|
12
|
-
- [`OpenapiFirst::ResponseValidation`](#OpenapiFirst::ResponseValidation) Validates the response and raises an exception if the response body is invalid.
|
13
|
-
- [`OpenapiFirst::Router`](#OpenapiFirst::Router) – This internal middleware is added automatically when using request/response validation. It adds the OpenAPI operation for the current request to the Rack env or returns 404 if no operation was found.
|
13
|
+
## Request Validation
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
This middleware returns a 400 status code with a body that describes the error if the request is not valid.
|
15
|
+
The `OpenapiFirst::RequestValidation` middleware returns a 400 status code with a body that describes the error if the request is not valid.
|
18
16
|
|
19
17
|
```ruby
|
20
18
|
use OpenapiFirst::RequestValidation, spec: 'openapi.yaml'
|
21
19
|
```
|
22
20
|
|
23
|
-
|
24
|
-
- `env[OpenapiFirst::OPERATION]` – The Operation object for the current request. This is an instance of `OpenapiFirst::Operation`.
|
21
|
+
It adds these fields to the Rack env:
|
25
22
|
- `env[OpenapiFirst::PARAMS]` – The parsed parameters (query, path) for the current request (string keyed)
|
26
23
|
- `env[OpenapiFirst::REQUEST_BODY]` – The parsed request body (string keyed)
|
24
|
+
- `env[OpenapiFirst::OPERATION]` (Added via Router) – The Operation object for the current request. This is an instance of `OpenapiFirst::Operation`.
|
27
25
|
|
28
26
|
### Options and defaults
|
29
27
|
|
@@ -54,7 +52,6 @@ content-type: "application/vnd.api+json"
|
|
54
52
|
|
55
53
|
### Parameters
|
56
54
|
|
57
|
-
|
58
55
|
The `RequestValidation` middleware adds `env[OpenapiFirst::PARAMS]` (or `env['openapi.params']` ) with the converted query and path parameters. This only includes the 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. So you can do things these:
|
59
56
|
|
60
57
|
```ruby
|
@@ -85,10 +82,9 @@ Request validation fails if request includes a property with `readOnly: true`.
|
|
85
82
|
|
86
83
|
Response validation fails if response body includes a property with `writeOnly: true`.
|
87
84
|
|
88
|
-
##
|
89
|
-
|
90
|
-
This middleware is especially useful when testing. It _always_ raises an error if the response is not valid.
|
85
|
+
## Response validation
|
91
86
|
|
87
|
+
The `OpenapiFirst::ResponseValidation` middleware is especially useful when testing. It _always_ raises an error if the response is not valid.
|
92
88
|
|
93
89
|
```ruby
|
94
90
|
use OpenapiFirst::ResponseValidation, spec: 'openapi.yaml' if ENV['RACK_ENV'] == 'test'
|
@@ -102,7 +98,7 @@ use OpenapiFirst::ResponseValidation, spec: 'openapi.yaml' if ENV['RACK_ENV'] ==
|
|
102
98
|
|
103
99
|
## OpenapiFirst::Router
|
104
100
|
|
105
|
-
This middleware is used automatically, but you can add it to the top of your middleware stack if you want to
|
101
|
+
This middleware is used automatically, but you can add it to the top of your middleware stack if you want to customize the behavior via options.
|
106
102
|
|
107
103
|
```ruby
|
108
104
|
use OpenapiFirst::Router, spec: './openapi/openapi.yaml'
|
data/benchmarks/Gemfile.lock
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
openapi_first (1.0.0.
|
5
|
-
deep_merge (>= 1.2.1)
|
4
|
+
openapi_first (1.0.0.beta3)
|
6
5
|
hanami-router (~> 2.0.0)
|
7
|
-
hanami-utils (~> 2.0.0)
|
8
6
|
json_refs (~> 0.1, >= 0.1.7)
|
9
7
|
json_schemer (~> 0.2.16)
|
10
8
|
multi_json (~> 1.14)
|
11
|
-
|
9
|
+
openapi_parameters (~> 0.2)
|
12
10
|
rack (>= 2.2, < 4.0)
|
13
11
|
|
14
12
|
GEM
|
@@ -28,7 +26,6 @@ GEM
|
|
28
26
|
openapi_parser (~> 1.0)
|
29
27
|
rack (>= 1.5)
|
30
28
|
concurrent-ruby (1.2.2)
|
31
|
-
deep_merge (1.2.2)
|
32
29
|
dry-core (1.0.0)
|
33
30
|
concurrent-ruby (~> 1.0)
|
34
31
|
zeitwerk (~> 2.6)
|
@@ -37,8 +34,6 @@ GEM
|
|
37
34
|
concurrent-ruby (~> 1.0)
|
38
35
|
dry-core (~> 1.0, < 2)
|
39
36
|
zeitwerk (~> 2.6)
|
40
|
-
dry-transformer (1.0.1)
|
41
|
-
zeitwerk (~> 2.6)
|
42
37
|
dry-types (1.7.1)
|
43
38
|
concurrent-ruby (~> 1.0)
|
44
39
|
dry-core (~> 1.0)
|
@@ -61,10 +56,6 @@ GEM
|
|
61
56
|
mustermann (~> 3.0)
|
62
57
|
mustermann-contrib (~> 3.0)
|
63
58
|
rack (~> 2.0)
|
64
|
-
hanami-utils (2.0.3)
|
65
|
-
concurrent-ruby (~> 1.0)
|
66
|
-
dry-core (~> 1.0, < 2)
|
67
|
-
dry-transformer (~> 1.0, < 2)
|
68
59
|
hansi (0.2.1)
|
69
60
|
i18n (1.12.0)
|
70
61
|
concurrent-ruby (~> 1.0)
|
@@ -86,24 +77,27 @@ GEM
|
|
86
77
|
mustermann (= 3.0.0)
|
87
78
|
mustermann-grape (1.0.2)
|
88
79
|
mustermann (>= 1.0.0)
|
89
|
-
nio4r (2.5.
|
80
|
+
nio4r (2.5.9)
|
81
|
+
openapi_parameters (0.2.1)
|
82
|
+
rack (>= 2.2)
|
83
|
+
zeitwerk (~> 2.6)
|
90
84
|
openapi_parser (1.0.0)
|
91
|
-
puma (6.2.
|
85
|
+
puma (6.2.2)
|
92
86
|
nio4r (~> 2.0)
|
93
87
|
rack (2.2.6.4)
|
94
88
|
rack-accept (0.4.5)
|
95
89
|
rack (>= 0.4)
|
96
|
-
rack-protection (3.0.
|
90
|
+
rack-protection (3.0.6)
|
97
91
|
rack
|
98
92
|
regexp_parser (2.8.0)
|
99
|
-
roda (3.
|
93
|
+
roda (3.67.0)
|
100
94
|
rack
|
101
95
|
ruby2_keywords (0.0.5)
|
102
96
|
seg (1.2.0)
|
103
|
-
sinatra (3.0.
|
97
|
+
sinatra (3.0.6)
|
104
98
|
mustermann (~> 3.0)
|
105
99
|
rack (~> 2.2, >= 2.2.4)
|
106
|
-
rack-protection (= 3.0.
|
100
|
+
rack-protection (= 3.0.6)
|
107
101
|
tilt (~> 2.0)
|
108
102
|
syro (3.2.1)
|
109
103
|
rack (>= 1.6.0)
|
@@ -19,7 +19,6 @@ app = Class.new(Hanami::API) do
|
|
19
19
|
end
|
20
20
|
end.new
|
21
21
|
|
22
|
-
use OpenapiFirst::
|
23
|
-
use OpenapiFirst::RequestValidation
|
22
|
+
use OpenapiFirst::RequestValidation, spec: File.absolute_path('./openapi.yaml', __dir__)
|
24
23
|
|
25
24
|
run app
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'multi_json'
|
4
|
+
require 'openapi_first'
|
5
|
+
|
6
|
+
app = Rack::Builder.new do
|
7
|
+
use OpenapiFirst::RequestValidation, spec: File.expand_path('./openapi.yaml', __dir__)
|
8
|
+
|
9
|
+
handlers = {
|
10
|
+
'find_thing' => lambda do |env|
|
11
|
+
params = env[OpenapiFirst::PARAMS]
|
12
|
+
body = MultiJson.dump(hello: 'world', id: params.fetch('id'))
|
13
|
+
[200, { 'Content-Type' => 'application/json' }, [body]]
|
14
|
+
end,
|
15
|
+
'find_things' => lambda do |_env|
|
16
|
+
body = MultiJson.dump(hello: 'world')
|
17
|
+
[200, { 'Content-Type' => 'application/json' }, [body]]
|
18
|
+
end,
|
19
|
+
'create_thing' => lambda do |_env|
|
20
|
+
body = MultiJson.dump(hello: 'world')
|
21
|
+
[201, { 'Content-Type' => 'application/json' }, [body]]
|
22
|
+
end
|
23
|
+
}
|
24
|
+
|
25
|
+
not_found = ->(_env) { [404, {}, []] }
|
26
|
+
|
27
|
+
run lambda do |env|
|
28
|
+
handlers.fetch(env[OpenapiFirst::OPERATION]&.operation_id, not_found).call(env)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
run app
|
@@ -2,21 +2,24 @@
|
|
2
2
|
|
3
3
|
require 'multi_json'
|
4
4
|
require 'openapi_first'
|
5
|
+
require 'hanami/api'
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
7
|
+
app = Class.new(Hanami::API) do
|
8
|
+
get '/hello/:id' do
|
9
|
+
json(hello: 'world', id: params.fetch(:id))
|
9
10
|
end
|
10
11
|
|
11
|
-
|
12
|
-
[{ hello: 'world' }]
|
12
|
+
get '/hello' do
|
13
|
+
json([{ hello: 'world' }])
|
13
14
|
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
16
|
+
post '/hello' do
|
17
|
+
status 201
|
18
|
+
json(hello: 'world')
|
18
19
|
end
|
19
|
-
end
|
20
|
+
end.new
|
20
21
|
|
21
|
-
|
22
|
-
|
22
|
+
use OpenapiFirst::RequestValidation, spec: File.absolute_path('./openapi.yaml', __dir__)
|
23
|
+
use OpenapiFirst::ResponseValidation
|
24
|
+
|
25
|
+
run app
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'multi_json'
|
4
|
+
require 'openapi_first'
|
5
|
+
require 'sinatra'
|
6
|
+
|
7
|
+
class SinatraWithOpenapiFirstExample < Sinatra::Base
|
8
|
+
set :environment, :production
|
9
|
+
|
10
|
+
get '/hello/:id' do
|
11
|
+
content_type :json
|
12
|
+
MultiJson.dump(hello: 'world', id: params.fetch('id'))
|
13
|
+
end
|
14
|
+
|
15
|
+
get '/hello' do
|
16
|
+
content_type :json
|
17
|
+
MultiJson.dump([{ hello: 'world' }])
|
18
|
+
end
|
19
|
+
|
20
|
+
post '/hello' do
|
21
|
+
content_type :json
|
22
|
+
status 201
|
23
|
+
MultiJson.dump(hello: 'world')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
use OpenapiFirst::RequestValidation, spec: File.absolute_path('./openapi.yaml', __dir__)
|
28
|
+
|
29
|
+
run SinatraWithOpenapiFirstExample
|
data/lib/openapi_first/utils.rb
CHANGED
@@ -1,23 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'hanami/utils/string'
|
4
|
-
require 'hanami/utils/hash'
|
5
|
-
require 'deep_merge/core'
|
6
|
-
|
7
3
|
module OpenapiFirst
|
8
4
|
module Utils
|
9
|
-
def self.deep_merge!(dest, source)
|
10
|
-
DeepMerge.deep_merge!(source, dest)
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.underscore(string)
|
14
|
-
Hanami::Utils::String.underscore(string)
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.classify(string)
|
18
|
-
Hanami::Utils::String.classify(string)
|
19
|
-
end
|
20
|
-
|
21
5
|
class StringKeyedHash
|
22
6
|
def initialize(original)
|
23
7
|
@orig = original
|
data/lib/openapi_first.rb
CHANGED
@@ -28,22 +28,4 @@ module OpenapiFirst
|
|
28
28
|
resolved['paths'].filter!(&->(key, _) { only.call(key) }) if only
|
29
29
|
Definition.new(resolved, spec_path)
|
30
30
|
end
|
31
|
-
|
32
|
-
def self.app(
|
33
|
-
spec,
|
34
|
-
namespace:,
|
35
|
-
router_raise_error: false,
|
36
|
-
request_validation_raise_error: false,
|
37
|
-
response_validation: false
|
38
|
-
)
|
39
|
-
spec = OpenapiFirst.load(spec) unless spec.is_a?(Definition)
|
40
|
-
App.new(
|
41
|
-
nil,
|
42
|
-
spec,
|
43
|
-
namespace: namespace,
|
44
|
-
router_raise_error: router_raise_error,
|
45
|
-
request_validation_raise_error: request_validation_raise_error,
|
46
|
-
response_validation: response_validation
|
47
|
-
)
|
48
|
-
end
|
49
31
|
end
|
data/openapi_first.gemspec
CHANGED
@@ -34,17 +34,14 @@ Gem::Specification.new do |spec|
|
|
34
34
|
|
35
35
|
spec.required_ruby_version = '>= 3.0.5'
|
36
36
|
|
37
|
-
spec.add_runtime_dependency 'deep_merge', '>= 1.2.1'
|
38
37
|
spec.add_runtime_dependency 'hanami-router', '~> 2.0.0'
|
39
|
-
spec.add_runtime_dependency 'hanami-utils', '~> 2.0.0'
|
40
38
|
spec.add_runtime_dependency 'json_refs', '~> 0.1', '>= 0.1.7'
|
41
39
|
spec.add_runtime_dependency 'json_schemer', '~> 0.2.16'
|
42
40
|
spec.add_runtime_dependency 'multi_json', '~> 1.14'
|
43
|
-
spec.add_runtime_dependency '
|
41
|
+
spec.add_runtime_dependency 'openapi_parameters', '~> 0.2'
|
44
42
|
spec.add_runtime_dependency 'rack', '>= 2.2', '< 4.0'
|
45
43
|
|
46
44
|
spec.add_development_dependency 'bundler', '~> 2'
|
47
|
-
spec.add_development_dependency 'openapi_parameters', '~> 0.2', '<= 2.0.0'
|
48
45
|
spec.add_development_dependency 'rack-test', '~> 1'
|
49
46
|
spec.add_development_dependency 'rake', '~> 13'
|
50
47
|
spec.add_development_dependency 'rspec', '~> 3'
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openapi_first
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andreas Haller
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-04-
|
11
|
+
date: 2023-04-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: deep_merge
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 1.2.1
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 1.2.1
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: hanami-router
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,20 +24,6 @@ dependencies:
|
|
38
24
|
- - "~>"
|
39
25
|
- !ruby/object:Gem::Version
|
40
26
|
version: 2.0.0
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: hanami-utils
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 2.0.0
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 2.0.0
|
55
27
|
- !ruby/object:Gem::Dependency
|
56
28
|
name: json_refs
|
57
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,19 +73,19 @@ dependencies:
|
|
101
73
|
- !ruby/object:Gem::Version
|
102
74
|
version: '1.14'
|
103
75
|
- !ruby/object:Gem::Dependency
|
104
|
-
name:
|
76
|
+
name: openapi_parameters
|
105
77
|
requirement: !ruby/object:Gem::Requirement
|
106
78
|
requirements:
|
107
79
|
- - "~>"
|
108
80
|
- !ruby/object:Gem::Version
|
109
|
-
version:
|
81
|
+
version: '0.2'
|
110
82
|
type: :runtime
|
111
83
|
prerelease: false
|
112
84
|
version_requirements: !ruby/object:Gem::Requirement
|
113
85
|
requirements:
|
114
86
|
- - "~>"
|
115
87
|
- !ruby/object:Gem::Version
|
116
|
-
version:
|
88
|
+
version: '0.2'
|
117
89
|
- !ruby/object:Gem::Dependency
|
118
90
|
name: rack
|
119
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -148,26 +120,6 @@ dependencies:
|
|
148
120
|
- - "~>"
|
149
121
|
- !ruby/object:Gem::Version
|
150
122
|
version: '2'
|
151
|
-
- !ruby/object:Gem::Dependency
|
152
|
-
name: openapi_parameters
|
153
|
-
requirement: !ruby/object:Gem::Requirement
|
154
|
-
requirements:
|
155
|
-
- - "~>"
|
156
|
-
- !ruby/object:Gem::Version
|
157
|
-
version: '0.2'
|
158
|
-
- - "<="
|
159
|
-
- !ruby/object:Gem::Version
|
160
|
-
version: 2.0.0
|
161
|
-
type: :development
|
162
|
-
prerelease: false
|
163
|
-
version_requirements: !ruby/object:Gem::Requirement
|
164
|
-
requirements:
|
165
|
-
- - "~>"
|
166
|
-
- !ruby/object:Gem::Version
|
167
|
-
version: '0.2'
|
168
|
-
- - "<="
|
169
|
-
- !ruby/object:Gem::Version
|
170
|
-
version: 2.0.0
|
171
123
|
- !ruby/object:Gem::Dependency
|
172
124
|
name: rack-test
|
173
125
|
requirement: !ruby/object:Gem::Requirement
|
@@ -231,16 +183,17 @@ files:
|
|
231
183
|
- benchmarks/Gemfile
|
232
184
|
- benchmarks/Gemfile.lock
|
233
185
|
- benchmarks/README.md
|
234
|
-
- benchmarks/apps/
|
186
|
+
- benchmarks/apps/committee_with_hanami_api.ru
|
235
187
|
- benchmarks/apps/committee_with_response_validation.ru
|
236
188
|
- benchmarks/apps/committee_with_sinatra.ru
|
237
189
|
- benchmarks/apps/grape.ru
|
238
190
|
- benchmarks/apps/hanami_api.ru
|
239
191
|
- benchmarks/apps/hanami_router.ru
|
240
192
|
- benchmarks/apps/openapi.yaml
|
241
|
-
- benchmarks/apps/openapi_first.ru
|
242
193
|
- benchmarks/apps/openapi_first_with_hanami_api.ru
|
194
|
+
- benchmarks/apps/openapi_first_with_plain_rack.ru
|
243
195
|
- benchmarks/apps/openapi_first_with_response_validation.ru
|
196
|
+
- benchmarks/apps/openapi_first_with_sinatra.ru
|
244
197
|
- benchmarks/apps/roda.ru
|
245
198
|
- benchmarks/apps/sinatra.ru
|
246
199
|
- benchmarks/apps/syro.ru
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'multi_json'
|
4
|
-
require 'openapi_first'
|
5
|
-
|
6
|
-
namespace = Module.new do
|
7
|
-
def self.find_thing(params, _res)
|
8
|
-
{ hello: 'world', id: params.fetch('id') }
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.find_things(_params, _res)
|
12
|
-
[{ hello: 'world' }]
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.create_thing(_params, res)
|
16
|
-
res.status = 201
|
17
|
-
{ hello: 'world' }
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
oas_path = File.absolute_path('./openapi.yaml', __dir__)
|
22
|
-
run OpenapiFirst.app(oas_path, namespace: namespace)
|
File without changes
|