openapi_first 1.0.0.beta5 → 1.0.0.beta6
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/.github/workflows/ruby.yml +2 -1
- data/CHANGELOG.md +8 -0
- data/Gemfile +2 -1
- data/Gemfile.lock +6 -9
- data/Gemfile.rack2 +15 -0
- data/lib/openapi_first/{body_parser_middleware.rb → body_parser.rb} +3 -15
- data/lib/openapi_first/definition/cookie_parameters.rb +12 -0
- data/lib/openapi_first/definition/has_content.rb +37 -0
- data/lib/openapi_first/definition/header_parameters.rb +12 -0
- data/lib/openapi_first/definition/operation.rb +103 -0
- data/lib/openapi_first/definition/parameters.rb +47 -0
- data/lib/openapi_first/definition/path_item.rb +23 -0
- data/lib/openapi_first/definition/path_parameters.rb +13 -0
- data/lib/openapi_first/definition/query_parameters.rb +12 -0
- data/lib/openapi_first/definition/request_body.rb +32 -0
- data/lib/openapi_first/definition/response.rb +37 -0
- data/lib/openapi_first/{json_schema → definition/schema}/result.rb +1 -1
- data/lib/openapi_first/{json_schema.rb → definition/schema.rb} +2 -2
- data/lib/openapi_first/definition.rb +26 -6
- data/lib/openapi_first/error_response.rb +2 -0
- data/lib/openapi_first/request_body_validator.rb +17 -21
- data/lib/openapi_first/request_validation.rb +34 -30
- data/lib/openapi_first/response_validation.rb +31 -11
- data/lib/openapi_first/router.rb +19 -53
- data/lib/openapi_first/version.rb +1 -1
- data/openapi_first.gemspec +7 -4
- metadata +32 -52
- data/.rspec +0 -3
- data/.rubocop.yml +0 -14
- data/Rakefile +0 -15
- data/benchmarks/Gemfile +0 -16
- data/benchmarks/Gemfile.lock +0 -142
- data/benchmarks/README.md +0 -29
- data/benchmarks/apps/committee_with_hanami_api.ru +0 -26
- data/benchmarks/apps/committee_with_response_validation.ru +0 -29
- data/benchmarks/apps/committee_with_sinatra.ru +0 -31
- data/benchmarks/apps/grape.ru +0 -21
- data/benchmarks/apps/hanami_api.ru +0 -21
- data/benchmarks/apps/hanami_router.ru +0 -14
- data/benchmarks/apps/openapi.yaml +0 -268
- data/benchmarks/apps/openapi_first_with_hanami_api.ru +0 -24
- data/benchmarks/apps/openapi_first_with_plain_rack.ru +0 -32
- data/benchmarks/apps/openapi_first_with_response_validation.ru +0 -25
- data/benchmarks/apps/openapi_first_with_sinatra.ru +0 -29
- data/benchmarks/apps/roda.ru +0 -27
- data/benchmarks/apps/sinatra.ru +0 -26
- data/benchmarks/apps/syro.ru +0 -25
- data/benchmarks/benchmark-wrk.sh +0 -3
- data/benchmarks/benchmarks.rb +0 -48
- data/benchmarks/post.lua +0 -3
- data/bin/console +0 -15
- data/bin/setup +0 -8
- data/examples/README.md +0 -13
- data/examples/app.rb +0 -18
- data/examples/config.ru +0 -7
- data/examples/openapi.yaml +0 -29
- data/lib/openapi_first/operation.rb +0 -170
- data/lib/openapi_first/string_keyed_hash.rb +0 -20
@@ -5,7 +5,6 @@ require 'multi_json'
|
|
5
5
|
require_relative 'use_router'
|
6
6
|
require_relative 'error_response'
|
7
7
|
require_relative 'request_body_validator'
|
8
|
-
require_relative 'string_keyed_hash'
|
9
8
|
require_relative 'request_validation_error'
|
10
9
|
require 'openapi_parameters'
|
11
10
|
|
@@ -19,11 +18,12 @@ module OpenapiFirst
|
|
19
18
|
|
20
19
|
# @param status [Integer] The intended HTTP status code (usually 400)
|
21
20
|
# @param location [Symbol] One of :body, :header, :cookie, :query, :path
|
22
|
-
# @param schema_validation [OpenapiFirst::
|
23
|
-
def self.fail!(status, location, schema_validation: nil)
|
21
|
+
# @param schema_validation [OpenapiFirst::Schema::Result]
|
22
|
+
def self.fail!(status, location, message: nil, schema_validation: nil)
|
24
23
|
throw FAIL, RequestValidationError.new(
|
25
24
|
status:,
|
26
25
|
location:,
|
26
|
+
message:,
|
27
27
|
schema_validation:
|
28
28
|
)
|
29
29
|
end
|
@@ -51,6 +51,7 @@ module OpenapiFirst
|
|
51
51
|
|
52
52
|
return @error_response_class.new(env, error).render
|
53
53
|
end
|
54
|
+
|
54
55
|
@app.call(env)
|
55
56
|
end
|
56
57
|
|
@@ -59,60 +60,63 @@ module OpenapiFirst
|
|
59
60
|
def validate_request(operation, env)
|
60
61
|
catch(FAIL) do
|
61
62
|
env[PARAMS] = {}
|
62
|
-
|
63
|
-
validate_path_params!(operation, env)
|
64
|
-
validate_cookie_params!(operation, env)
|
65
|
-
validate_header_params!(operation, env)
|
63
|
+
validate_parameters!(operation, env)
|
66
64
|
validate_request_body!(operation, env)
|
67
65
|
nil
|
68
66
|
end
|
69
67
|
end
|
70
68
|
|
69
|
+
def validate_parameters!(operation, env)
|
70
|
+
validate_query_params!(operation, env)
|
71
|
+
validate_path_params!(operation, env)
|
72
|
+
validate_cookie_params!(operation, env)
|
73
|
+
validate_header_params!(operation, env)
|
74
|
+
end
|
75
|
+
|
71
76
|
def validate_path_params!(operation, env)
|
72
|
-
|
73
|
-
return
|
77
|
+
parameters = operation.path_parameters
|
78
|
+
return unless parameters
|
74
79
|
|
75
|
-
|
76
|
-
|
77
|
-
schema_validation = operation.path_parameters_schema.validate(unpacked_path_params)
|
80
|
+
unpacked_params = parameters.unpack(env)
|
81
|
+
schema_validation = parameters.schema.validate(unpacked_params)
|
78
82
|
RequestValidation.fail!(400, :path, schema_validation:) if schema_validation.error?
|
79
|
-
env[PATH_PARAMS] =
|
80
|
-
env[PARAMS].merge!(
|
83
|
+
env[PATH_PARAMS] = unpacked_params
|
84
|
+
env[PARAMS].merge!(unpacked_params)
|
81
85
|
end
|
82
86
|
|
83
87
|
def validate_query_params!(operation, env)
|
84
|
-
|
85
|
-
return
|
88
|
+
parameters = operation.query_parameters
|
89
|
+
return unless parameters
|
86
90
|
|
87
|
-
|
88
|
-
schema_validation =
|
91
|
+
unpacked_params = parameters.unpack(env)
|
92
|
+
schema_validation = parameters.schema.validate(unpacked_params)
|
89
93
|
RequestValidation.fail!(400, :query, schema_validation:) if schema_validation.error?
|
90
|
-
env[QUERY_PARAMS] =
|
91
|
-
env[PARAMS].merge!(
|
94
|
+
env[QUERY_PARAMS] = unpacked_params
|
95
|
+
env[PARAMS].merge!(unpacked_params)
|
92
96
|
end
|
93
97
|
|
94
98
|
def validate_cookie_params!(operation, env)
|
95
|
-
|
96
|
-
return unless
|
99
|
+
parameters = operation.cookie_parameters
|
100
|
+
return unless parameters
|
97
101
|
|
98
|
-
unpacked_params =
|
99
|
-
schema_validation =
|
102
|
+
unpacked_params = parameters.unpack(env)
|
103
|
+
schema_validation = parameters.schema.validate(unpacked_params)
|
100
104
|
RequestValidation.fail!(400, :cookie, schema_validation:) if schema_validation.error?
|
101
105
|
env[COOKIE_PARAMS] = unpacked_params
|
102
106
|
end
|
103
107
|
|
104
108
|
def validate_header_params!(operation, env)
|
105
|
-
|
106
|
-
return
|
109
|
+
parameters = operation.header_parameters
|
110
|
+
return unless parameters
|
107
111
|
|
108
|
-
|
109
|
-
schema_validation =
|
112
|
+
unpacked_params = parameters.unpack(env)
|
113
|
+
schema_validation = parameters.schema.validate(unpacked_params)
|
110
114
|
RequestValidation.fail!(400, :header, schema_validation:) if schema_validation.error?
|
111
|
-
env[HEADER_PARAMS] =
|
115
|
+
env[HEADER_PARAMS] = unpacked_params
|
112
116
|
end
|
113
117
|
|
114
118
|
def validate_request_body!(operation, env)
|
115
|
-
RequestBodyValidator.new(operation, env).validate!
|
119
|
+
env[REQUEST_BODY] = RequestBodyValidator.new(operation, env).validate!
|
116
120
|
end
|
117
121
|
end
|
118
122
|
end
|
@@ -22,18 +22,39 @@ module OpenapiFirst
|
|
22
22
|
|
23
23
|
def validate(response, operation)
|
24
24
|
status, headers, body = response.to_a
|
25
|
-
|
25
|
+
response_definition = response_for(operation, status)
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
validate_response_headers(response_definition.headers, headers, openapi_version: operation.openapi_version)
|
28
|
+
|
29
|
+
return if no_content?(response_definition)
|
30
|
+
|
31
|
+
content_type = Rack::Response[status, headers, body].content_type
|
32
|
+
raise ResponseInvalid, "Response has no content-type for '#{operation.name}'" unless content_type
|
33
|
+
|
34
|
+
response_schema = response_definition.schema_for(content_type)
|
35
|
+
unless response_schema
|
36
|
+
message = "Response content type not found '#{content_type}' for '#{operation.name}'"
|
37
|
+
raise ResponseContentTypeNotFoundError, message
|
38
|
+
end
|
39
|
+
validate_response_body(response_schema, body)
|
31
40
|
end
|
32
41
|
|
33
42
|
private
|
34
43
|
|
44
|
+
def no_content?(response_definition)
|
45
|
+
response_definition.status == 204 || !response_definition.content?
|
46
|
+
end
|
47
|
+
|
48
|
+
def response_for(operation, status)
|
49
|
+
response = operation.response_for(status)
|
50
|
+
return response if response
|
51
|
+
|
52
|
+
message = "Response status code or default not found: #{status} for '#{operation.name}'"
|
53
|
+
raise OpenapiFirst::ResponseCodeNotFoundError, message
|
54
|
+
end
|
55
|
+
|
35
56
|
def validate_status_only(operation, status)
|
36
|
-
|
57
|
+
response_for(operation, status)
|
37
58
|
end
|
38
59
|
|
39
60
|
def validate_response_body(schema, response)
|
@@ -44,15 +65,14 @@ module OpenapiFirst
|
|
44
65
|
raise ResponseBodyInvalidError, validation.message if validation.error?
|
45
66
|
end
|
46
67
|
|
47
|
-
def validate_response_headers(
|
48
|
-
response_header_definitions = operation.response_for(status)&.dig('headers')
|
68
|
+
def validate_response_headers(response_header_definitions, response_headers, openapi_version:)
|
49
69
|
return unless response_header_definitions
|
50
70
|
|
51
71
|
unpacked_headers = unpack_response_headers(response_header_definitions, response_headers)
|
52
72
|
response_header_definitions.each do |name, definition|
|
53
73
|
next if name == 'Content-Type'
|
54
74
|
|
55
|
-
validate_response_header(name, definition, unpacked_headers, openapi_version:
|
75
|
+
validate_response_header(name, definition, unpacked_headers, openapi_version:)
|
56
76
|
end
|
57
77
|
end
|
58
78
|
|
@@ -65,7 +85,7 @@ module OpenapiFirst
|
|
65
85
|
|
66
86
|
return unless definition.key?('schema')
|
67
87
|
|
68
|
-
validation =
|
88
|
+
validation = Schema.new(definition['schema'], openapi_version:)
|
69
89
|
value = unpacked_headers[name]
|
70
90
|
schema_validation = validation.validate(value)
|
71
91
|
raise ResponseHeaderInvalidError, schema_validation.message if schema_validation.error?
|
@@ -73,7 +93,7 @@ module OpenapiFirst
|
|
73
93
|
|
74
94
|
def unpack_response_headers(response_header_definitions, response_headers)
|
75
95
|
headers_as_parameters = response_header_definitions.map do |name, definition|
|
76
|
-
definition.merge('name' => name)
|
96
|
+
definition.merge('name' => name, 'in' => 'header')
|
77
97
|
end
|
78
98
|
OpenapiParameters::Header.new(headers_as_parameters).unpack(response_headers)
|
79
99
|
end
|
data/lib/openapi_first/router.rb
CHANGED
@@ -2,14 +2,17 @@
|
|
2
2
|
|
3
3
|
require 'rack'
|
4
4
|
require 'multi_json'
|
5
|
-
require '
|
6
|
-
require_relative '
|
5
|
+
require 'mustermann'
|
6
|
+
require_relative 'body_parser'
|
7
7
|
|
8
8
|
module OpenapiFirst
|
9
9
|
class Router
|
10
10
|
# The unconverted path parameters before they are converted to the types defined in the API description
|
11
11
|
RAW_PATH_PARAMS = 'openapi.raw_path_params'
|
12
12
|
|
13
|
+
NOT_FOUND = Rack::Response.new('Not Found', 404).finish.freeze
|
14
|
+
METHOD_NOT_ALLOWED = Rack::Response.new('Method Not Allowed', 405).finish.freeze
|
15
|
+
|
13
16
|
def initialize(
|
14
17
|
app,
|
15
18
|
options
|
@@ -21,22 +24,28 @@ module OpenapiFirst
|
|
21
24
|
spec = options.fetch(:spec)
|
22
25
|
raise "You have to pass spec: when initializing #{self.class}" unless spec
|
23
26
|
|
24
|
-
|
25
|
-
|
26
|
-
@filepath = spec.filepath
|
27
|
-
@router = build_router(spec.operations)
|
27
|
+
@definition = spec.is_a?(Definition) ? spec : OpenapiFirst.load(spec)
|
28
|
+
@filepath = @definition.filepath
|
28
29
|
end
|
29
30
|
|
30
31
|
def call(env)
|
31
32
|
env[OPERATION] = nil
|
32
|
-
|
33
|
-
|
34
|
-
|
33
|
+
request = Rack::Request.new(env)
|
34
|
+
path_item, path_params = @definition.find_path_item_and_params(request.path)
|
35
|
+
operation = path_item&.find_operation(request.request_method.downcase)
|
36
|
+
|
37
|
+
env[OPERATION] = operation
|
38
|
+
env[RAW_PATH_PARAMS] = path_params
|
35
39
|
|
40
|
+
if operation.nil?
|
41
|
+
raise_error(env) if @raise
|
36
42
|
return @app.call(env) if @not_found == :continue
|
37
43
|
end
|
38
44
|
|
39
|
-
|
45
|
+
return NOT_FOUND unless path_item
|
46
|
+
return METHOD_NOT_ALLOWED unless operation
|
47
|
+
|
48
|
+
@app.call(env)
|
40
49
|
end
|
41
50
|
|
42
51
|
ORIGINAL_PATH = 'openapi_first.path_info'
|
@@ -55,48 +64,5 @@ module OpenapiFirst
|
|
55
64
|
}' in API description #{@filepath}"
|
56
65
|
raise NotFoundError, msg
|
57
66
|
end
|
58
|
-
|
59
|
-
def call_router(env)
|
60
|
-
# Changing and restoring PATH_INFO is needed, because Hanami::Router does not respect existing script_path
|
61
|
-
env[ORIGINAL_PATH] = env[Rack::PATH_INFO]
|
62
|
-
env[Rack::PATH_INFO] = Rack::Request.new(env).path
|
63
|
-
@router.call(env)
|
64
|
-
rescue BodyParsingError => e
|
65
|
-
message = e.message
|
66
|
-
raise RequestInvalidError, message if @raise
|
67
|
-
|
68
|
-
error = RequestValidationError.new(status: 400, location: :body, message:)
|
69
|
-
@error_response_class.new(env, error).render
|
70
|
-
ensure
|
71
|
-
env[Rack::PATH_INFO] = env.delete(ORIGINAL_PATH) if env[ORIGINAL_PATH]
|
72
|
-
end
|
73
|
-
|
74
|
-
def build_router(operations)
|
75
|
-
router = Hanami::Router.new.tap do |r|
|
76
|
-
operations.each do |operation|
|
77
|
-
normalized_path = operation.path.gsub('{', ':').gsub('}', '')
|
78
|
-
r.public_send(
|
79
|
-
operation.method,
|
80
|
-
normalized_path,
|
81
|
-
to: build_route(operation)
|
82
|
-
)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
Rack::Builder.app do
|
86
|
-
use(BodyParserMiddleware)
|
87
|
-
run router
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def build_route(operation)
|
92
|
-
lambda do |env|
|
93
|
-
env[OPERATION] = operation
|
94
|
-
path_info = env.delete(ORIGINAL_PATH)
|
95
|
-
env[REQUEST_BODY] = env.delete(ROUTER_PARSED_BODY) if env.key?(ROUTER_PARSED_BODY)
|
96
|
-
env[RAW_PATH_PARAMS] = env['router.params']
|
97
|
-
env[Rack::PATH_INFO] = path_info
|
98
|
-
@app.call(env)
|
99
|
-
end
|
100
|
-
end
|
101
67
|
end
|
102
68
|
end
|
data/openapi_first.gemspec
CHANGED
@@ -26,19 +26,22 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
27
27
|
`git ls-files -z`
|
28
28
|
.split("\x0")
|
29
|
-
.reject { |f| f.match(%r{^(test|spec|features)/}) }
|
30
|
-
.reject
|
29
|
+
.reject { |f| f.match(%r{^(test|spec|features|benchmarks|examples|bin)/}) }
|
30
|
+
.reject do |f|
|
31
|
+
%w[Dockerfile Jenkinsfile .tool-versions CODEOWNERS .rspec .rubocop.yml .tool-versions
|
32
|
+
Rakefile].include?(f)
|
33
|
+
end
|
31
34
|
end
|
32
35
|
spec.bindir = 'exe'
|
33
36
|
spec.require_paths = ['lib']
|
34
37
|
|
35
38
|
spec.required_ruby_version = '>= 3.1.1'
|
36
39
|
|
37
|
-
spec.add_runtime_dependency 'hanami-router', '~> 2.0.0'
|
38
40
|
spec.add_runtime_dependency 'json_refs', '~> 0.1', '>= 0.1.7'
|
39
41
|
spec.add_runtime_dependency 'json_schemer', '~> 2.0.0'
|
40
42
|
spec.add_runtime_dependency 'multi_json', '~> 1.15'
|
41
|
-
spec.add_runtime_dependency '
|
43
|
+
spec.add_runtime_dependency 'mustermann-contrib', '~> 3.0.0'
|
44
|
+
spec.add_runtime_dependency 'openapi_parameters', '>= 0.3.2', '< 2.0'
|
42
45
|
spec.add_runtime_dependency 'rack', '>= 2.2', '< 4.0'
|
43
46
|
spec.metadata = {
|
44
47
|
'rubygems_mfa_required' => 'true'
|
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.beta6
|
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-11-
|
11
|
+
date: 2023-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: hanami-router
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 2.0.0
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 2.0.0
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: json_refs
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,13 +58,27 @@ dependencies:
|
|
72
58
|
- - "~>"
|
73
59
|
- !ruby/object:Gem::Version
|
74
60
|
version: '1.15'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: mustermann-contrib
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 3.0.0
|
68
|
+
type: :runtime
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 3.0.0
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: openapi_parameters
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
78
78
|
requirements:
|
79
79
|
- - ">="
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version: 0.3.
|
81
|
+
version: 0.3.2
|
82
82
|
- - "<"
|
83
83
|
- !ruby/object:Gem::Version
|
84
84
|
version: '2.0'
|
@@ -88,7 +88,7 @@ dependencies:
|
|
88
88
|
requirements:
|
89
89
|
- - ">="
|
90
90
|
- !ruby/object:Gem::Version
|
91
|
-
version: 0.3.
|
91
|
+
version: 0.3.2
|
92
92
|
- - "<"
|
93
93
|
- !ruby/object:Gem::Version
|
94
94
|
version: '2.0'
|
@@ -122,51 +122,32 @@ files:
|
|
122
122
|
- ".github/CODEOWNERS"
|
123
123
|
- ".github/workflows/ruby.yml"
|
124
124
|
- ".gitignore"
|
125
|
-
- ".rspec"
|
126
|
-
- ".rubocop.yml"
|
127
125
|
- CHANGELOG.md
|
128
126
|
- Gemfile
|
129
127
|
- Gemfile.lock
|
128
|
+
- Gemfile.rack2
|
130
129
|
- LICENSE.txt
|
131
130
|
- README.md
|
132
|
-
- Rakefile
|
133
|
-
- benchmarks/Gemfile
|
134
|
-
- benchmarks/Gemfile.lock
|
135
|
-
- benchmarks/README.md
|
136
|
-
- benchmarks/apps/committee_with_hanami_api.ru
|
137
|
-
- benchmarks/apps/committee_with_response_validation.ru
|
138
|
-
- benchmarks/apps/committee_with_sinatra.ru
|
139
|
-
- benchmarks/apps/grape.ru
|
140
|
-
- benchmarks/apps/hanami_api.ru
|
141
|
-
- benchmarks/apps/hanami_router.ru
|
142
|
-
- benchmarks/apps/openapi.yaml
|
143
|
-
- benchmarks/apps/openapi_first_with_hanami_api.ru
|
144
|
-
- benchmarks/apps/openapi_first_with_plain_rack.ru
|
145
|
-
- benchmarks/apps/openapi_first_with_response_validation.ru
|
146
|
-
- benchmarks/apps/openapi_first_with_sinatra.ru
|
147
|
-
- benchmarks/apps/roda.ru
|
148
|
-
- benchmarks/apps/sinatra.ru
|
149
|
-
- benchmarks/apps/syro.ru
|
150
|
-
- benchmarks/benchmark-wrk.sh
|
151
|
-
- benchmarks/benchmarks.rb
|
152
|
-
- benchmarks/post.lua
|
153
|
-
- bin/console
|
154
|
-
- bin/setup
|
155
|
-
- examples/README.md
|
156
|
-
- examples/app.rb
|
157
|
-
- examples/config.ru
|
158
|
-
- examples/openapi.yaml
|
159
131
|
- lib/openapi_first.rb
|
160
|
-
- lib/openapi_first/
|
132
|
+
- lib/openapi_first/body_parser.rb
|
161
133
|
- lib/openapi_first/config.rb
|
162
134
|
- lib/openapi_first/definition.rb
|
135
|
+
- lib/openapi_first/definition/cookie_parameters.rb
|
136
|
+
- lib/openapi_first/definition/has_content.rb
|
137
|
+
- lib/openapi_first/definition/header_parameters.rb
|
138
|
+
- lib/openapi_first/definition/operation.rb
|
139
|
+
- lib/openapi_first/definition/parameters.rb
|
140
|
+
- lib/openapi_first/definition/path_item.rb
|
141
|
+
- lib/openapi_first/definition/path_parameters.rb
|
142
|
+
- lib/openapi_first/definition/query_parameters.rb
|
143
|
+
- lib/openapi_first/definition/request_body.rb
|
144
|
+
- lib/openapi_first/definition/response.rb
|
145
|
+
- lib/openapi_first/definition/schema.rb
|
146
|
+
- lib/openapi_first/definition/schema/result.rb
|
163
147
|
- lib/openapi_first/error_response.rb
|
164
148
|
- lib/openapi_first/error_responses/default.rb
|
165
149
|
- lib/openapi_first/error_responses/json_api.rb
|
166
150
|
- lib/openapi_first/errors.rb
|
167
|
-
- lib/openapi_first/json_schema.rb
|
168
|
-
- lib/openapi_first/json_schema/result.rb
|
169
|
-
- lib/openapi_first/operation.rb
|
170
151
|
- lib/openapi_first/plugins.rb
|
171
152
|
- lib/openapi_first/request_body_validator.rb
|
172
153
|
- lib/openapi_first/request_validation.rb
|
@@ -174,7 +155,6 @@ files:
|
|
174
155
|
- lib/openapi_first/response_validation.rb
|
175
156
|
- lib/openapi_first/response_validator.rb
|
176
157
|
- lib/openapi_first/router.rb
|
177
|
-
- lib/openapi_first/string_keyed_hash.rb
|
178
158
|
- lib/openapi_first/use_router.rb
|
179
159
|
- lib/openapi_first/version.rb
|
180
160
|
- openapi_first.gemspec
|
data/.rspec
DELETED
data/.rubocop.yml
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
AllCops:
|
2
|
-
TargetRubyVersion: 3.1.1
|
3
|
-
NewCops: enable
|
4
|
-
SuggestExtensions: false
|
5
|
-
Style/Documentation:
|
6
|
-
Enabled: false
|
7
|
-
Style/ExponentialNotation:
|
8
|
-
Enabled: true
|
9
|
-
Metrics/BlockLength:
|
10
|
-
Exclude:
|
11
|
-
- "spec/**/*.rb"
|
12
|
-
- "*.gemspec"
|
13
|
-
Metrics/MethodLength:
|
14
|
-
Max: 20
|
data/Rakefile
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'bundler/gem_tasks'
|
4
|
-
require 'rspec/core/rake_task'
|
5
|
-
require 'rubocop/rake_task'
|
6
|
-
|
7
|
-
RuboCop::RakeTask.new
|
8
|
-
|
9
|
-
task :version do
|
10
|
-
puts Gem::Specification.load('openapi_first.gemspec').version
|
11
|
-
end
|
12
|
-
|
13
|
-
RSpec::Core::RakeTask.new(:spec)
|
14
|
-
|
15
|
-
task default: %i[spec rubocop]
|
data/benchmarks/Gemfile
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
source 'https://rubygems.org'
|
4
|
-
|
5
|
-
gem 'benchmark-ips'
|
6
|
-
gem 'benchmark-memory'
|
7
|
-
gem 'committee'
|
8
|
-
gem 'grape'
|
9
|
-
gem 'hanami-api'
|
10
|
-
gem 'hanami-router'
|
11
|
-
gem 'multi_json'
|
12
|
-
gem 'openapi_first', path: '../'
|
13
|
-
gem 'puma'
|
14
|
-
gem 'roda'
|
15
|
-
gem 'sinatra'
|
16
|
-
gem 'syro'
|
data/benchmarks/Gemfile.lock
DELETED
@@ -1,142 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: ..
|
3
|
-
specs:
|
4
|
-
openapi_first (1.0.0.beta5)
|
5
|
-
hanami-router (~> 2.0.0)
|
6
|
-
json_refs (~> 0.1, >= 0.1.7)
|
7
|
-
json_schemer (~> 2.0.0)
|
8
|
-
multi_json (~> 1.15)
|
9
|
-
openapi_parameters (>= 0.3.1, < 2.0)
|
10
|
-
rack (>= 2.2, < 4.0)
|
11
|
-
|
12
|
-
GEM
|
13
|
-
remote: https://rubygems.org/
|
14
|
-
specs:
|
15
|
-
activesupport (7.1.2)
|
16
|
-
base64
|
17
|
-
bigdecimal
|
18
|
-
concurrent-ruby (~> 1.0, >= 1.0.2)
|
19
|
-
connection_pool (>= 2.2.5)
|
20
|
-
drb
|
21
|
-
i18n (>= 1.6, < 2)
|
22
|
-
minitest (>= 5.1)
|
23
|
-
mutex_m
|
24
|
-
tzinfo (~> 2.0)
|
25
|
-
base64 (0.2.0)
|
26
|
-
benchmark-ips (2.12.0)
|
27
|
-
benchmark-memory (0.2.0)
|
28
|
-
memory_profiler (~> 1)
|
29
|
-
bigdecimal (3.1.4)
|
30
|
-
builder (3.2.4)
|
31
|
-
committee (5.0.0)
|
32
|
-
json_schema (~> 0.14, >= 0.14.3)
|
33
|
-
openapi_parser (~> 1.0)
|
34
|
-
rack (>= 1.5)
|
35
|
-
concurrent-ruby (1.2.2)
|
36
|
-
connection_pool (2.4.1)
|
37
|
-
drb (2.2.0)
|
38
|
-
ruby2_keywords
|
39
|
-
dry-core (1.0.1)
|
40
|
-
concurrent-ruby (~> 1.0)
|
41
|
-
zeitwerk (~> 2.6)
|
42
|
-
dry-inflector (1.0.0)
|
43
|
-
dry-logic (1.5.0)
|
44
|
-
concurrent-ruby (~> 1.0)
|
45
|
-
dry-core (~> 1.0, < 2)
|
46
|
-
zeitwerk (~> 2.6)
|
47
|
-
dry-types (1.7.1)
|
48
|
-
concurrent-ruby (~> 1.0)
|
49
|
-
dry-core (~> 1.0)
|
50
|
-
dry-inflector (~> 1.0)
|
51
|
-
dry-logic (~> 1.4)
|
52
|
-
zeitwerk (~> 2.6)
|
53
|
-
grape (2.0.0)
|
54
|
-
activesupport (>= 5)
|
55
|
-
builder
|
56
|
-
dry-types (>= 1.1)
|
57
|
-
mustermann-grape (~> 1.0.0)
|
58
|
-
rack (>= 1.3.0)
|
59
|
-
rack-accept
|
60
|
-
hana (1.3.7)
|
61
|
-
hanami-api (0.3.0)
|
62
|
-
hanami-router (~> 2.0)
|
63
|
-
hanami-router (2.0.2)
|
64
|
-
mustermann (~> 3.0)
|
65
|
-
mustermann-contrib (~> 3.0)
|
66
|
-
rack (~> 2.0)
|
67
|
-
hansi (0.2.1)
|
68
|
-
i18n (1.14.1)
|
69
|
-
concurrent-ruby (~> 1.0)
|
70
|
-
json_refs (0.1.8)
|
71
|
-
hana
|
72
|
-
json_schema (0.21.0)
|
73
|
-
json_schemer (2.0.0)
|
74
|
-
hana (~> 1.3)
|
75
|
-
regexp_parser (~> 2.0)
|
76
|
-
simpleidn (~> 0.2)
|
77
|
-
memory_profiler (1.0.1)
|
78
|
-
minitest (5.20.0)
|
79
|
-
multi_json (1.15.0)
|
80
|
-
mustermann (3.0.0)
|
81
|
-
ruby2_keywords (~> 0.0.1)
|
82
|
-
mustermann-contrib (3.0.0)
|
83
|
-
hansi (~> 0.2.0)
|
84
|
-
mustermann (= 3.0.0)
|
85
|
-
mustermann-grape (1.0.2)
|
86
|
-
mustermann (>= 1.0.0)
|
87
|
-
mutex_m (0.2.0)
|
88
|
-
nio4r (2.5.9)
|
89
|
-
openapi_parameters (0.3.1)
|
90
|
-
rack (>= 2.2)
|
91
|
-
zeitwerk (~> 2.6)
|
92
|
-
openapi_parser (1.0.0)
|
93
|
-
puma (6.4.0)
|
94
|
-
nio4r (~> 2.0)
|
95
|
-
rack (2.2.8)
|
96
|
-
rack-accept (0.4.5)
|
97
|
-
rack (>= 0.4)
|
98
|
-
rack-protection (3.1.0)
|
99
|
-
rack (~> 2.2, >= 2.2.4)
|
100
|
-
regexp_parser (2.8.2)
|
101
|
-
roda (3.73.0)
|
102
|
-
rack
|
103
|
-
ruby2_keywords (0.0.5)
|
104
|
-
seg (1.2.0)
|
105
|
-
simpleidn (0.2.1)
|
106
|
-
unf (~> 0.1.4)
|
107
|
-
sinatra (3.1.0)
|
108
|
-
mustermann (~> 3.0)
|
109
|
-
rack (~> 2.2, >= 2.2.4)
|
110
|
-
rack-protection (= 3.1.0)
|
111
|
-
tilt (~> 2.0)
|
112
|
-
syro (3.2.1)
|
113
|
-
rack (>= 1.6.0)
|
114
|
-
seg
|
115
|
-
tilt (2.3.0)
|
116
|
-
tzinfo (2.0.6)
|
117
|
-
concurrent-ruby (~> 1.0)
|
118
|
-
unf (0.1.4)
|
119
|
-
unf_ext
|
120
|
-
unf_ext (0.0.9)
|
121
|
-
zeitwerk (2.6.12)
|
122
|
-
|
123
|
-
PLATFORMS
|
124
|
-
arm64-darwin-21
|
125
|
-
x86_64-linux
|
126
|
-
|
127
|
-
DEPENDENCIES
|
128
|
-
benchmark-ips
|
129
|
-
benchmark-memory
|
130
|
-
committee
|
131
|
-
grape
|
132
|
-
hanami-api
|
133
|
-
hanami-router
|
134
|
-
multi_json
|
135
|
-
openapi_first!
|
136
|
-
puma
|
137
|
-
roda
|
138
|
-
sinatra
|
139
|
-
syro
|
140
|
-
|
141
|
-
BUNDLED WITH
|
142
|
-
2.3.10
|