sinatra-swagger-exposer 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile +0 -1
- data/README.md +1 -0
- data/lib/sinatra/swagger-exposer/configuration/swagger-configuration-utilities.rb +124 -0
- data/lib/sinatra/swagger-exposer/configuration/swagger-endpoint-parameter.rb +15 -20
- data/lib/sinatra/swagger-exposer/configuration/swagger-endpoint-response.rb +39 -7
- data/lib/sinatra/swagger-exposer/configuration/swagger-endpoint.rb +21 -8
- data/lib/sinatra/swagger-exposer/configuration/swagger-hash-like.rb +45 -0
- data/lib/sinatra/swagger-exposer/configuration/swagger-info.rb +9 -8
- data/lib/sinatra/swagger-exposer/configuration/swagger-response-header.rb +68 -0
- data/lib/sinatra/swagger-exposer/configuration/swagger-response-headers.rb +33 -0
- data/lib/sinatra/swagger-exposer/configuration/swagger-type-property.rb +7 -6
- data/lib/sinatra/swagger-exposer/configuration/swagger-type.rb +10 -9
- data/lib/sinatra/swagger-exposer/configuration/swagger-types.rb +4 -20
- data/lib/sinatra/swagger-exposer/processing/swagger-array-value-processor.rb +46 -0
- data/lib/sinatra/swagger-exposer/processing/{swagger-base-value-preprocessor.rb → swagger-base-value-processor.rb} +9 -7
- data/lib/sinatra/swagger-exposer/processing/{swagger-parameter-preprocessor.rb → swagger-parameter-processor.rb} +9 -9
- data/lib/sinatra/swagger-exposer/processing/{swagger-primitive-value-preprocessor.rb → swagger-primitive-value-processor.rb} +46 -46
- data/lib/sinatra/swagger-exposer/processing/{swagger-preprocessor-dispatcher.rb → swagger-processor-dispatcher.rb} +11 -11
- data/lib/sinatra/swagger-exposer/processing/swagger-request-processor.rb +123 -0
- data/lib/sinatra/swagger-exposer/processing/swagger-response-processor.rb +47 -0
- data/lib/sinatra/swagger-exposer/processing/swagger-type-value-processor.rb +37 -0
- data/lib/sinatra/swagger-exposer/swagger-content-creator.rb +3 -7
- data/lib/sinatra/swagger-exposer/swagger-exposer.rb +99 -33
- data/lib/sinatra/swagger-exposer/swagger-parameter-helper.rb +19 -19
- data/lib/sinatra/swagger-exposer/swagger-request-processor-creator.rb +180 -0
- data/lib/sinatra/swagger-exposer/version.rb +1 -1
- data/sinatra-swagger-exposer.gemspec +9 -8
- metadata +29 -11
- data/lib/sinatra/swagger-exposer/processing/swagger-array-value-preprocessor.rb +0 -46
- data/lib/sinatra/swagger-exposer/processing/swagger-request-preprocessor.rb +0 -64
- data/lib/sinatra/swagger-exposer/processing/swagger-type-value-preprocessor.rb +0 -37
- data/lib/sinatra/swagger-exposer/swagger-preprocessor-creator.rb +0 -137
- data/lib/sinatra/swagger-exposer/swagger-utilities.rb +0 -108
@@ -6,23 +6,23 @@ module Sinatra
|
|
6
6
|
|
7
7
|
module Processing
|
8
8
|
|
9
|
-
# Dispatch content to a
|
10
|
-
class
|
9
|
+
# Dispatch content to a processor
|
10
|
+
class SwaggerProcessorDispatcher
|
11
11
|
|
12
|
-
attr_reader :how_to_pass, :
|
12
|
+
attr_reader :how_to_pass, :processor
|
13
13
|
|
14
14
|
include Sinatra::SwaggerExposer::SwaggerParameterHelper
|
15
15
|
|
16
16
|
# Initialize
|
17
|
-
# @param how_to_pass how the value should be passed to the
|
18
|
-
# @param
|
19
|
-
def initialize(how_to_pass,
|
17
|
+
# @param how_to_pass how the value should be passed to the processor
|
18
|
+
# @param processor [Sinatra::SwaggerExposer::Processing::SwaggerBaseValueProcessor] processor for the values
|
19
|
+
def initialize(how_to_pass, processor)
|
20
20
|
@how_to_pass = how_to_pass
|
21
|
-
@
|
21
|
+
@processor = processor
|
22
22
|
end
|
23
23
|
|
24
24
|
def useful?
|
25
|
-
(@how_to_pass != HOW_TO_PASS_PATH) && @
|
25
|
+
(@how_to_pass != HOW_TO_PASS_PATH) && @processor.useful?
|
26
26
|
end
|
27
27
|
|
28
28
|
# Process the value
|
@@ -31,11 +31,11 @@ module Sinatra
|
|
31
31
|
when HOW_TO_PASS_PATH
|
32
32
|
# can't validate
|
33
33
|
when HOW_TO_PASS_QUERY
|
34
|
-
@
|
34
|
+
@processor.process(app.params)
|
35
35
|
when HOW_TO_PASS_HEADER
|
36
|
-
@
|
36
|
+
@processor.process(app.headers)
|
37
37
|
when HOW_TO_PASS_BODY
|
38
|
-
@
|
38
|
+
@processor.process(parsed_body || {})
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'mime-types'
|
3
|
+
|
4
|
+
require_relative '../swagger-invalid-exception'
|
5
|
+
|
6
|
+
module Sinatra
|
7
|
+
|
8
|
+
module SwaggerExposer
|
9
|
+
|
10
|
+
module Processing
|
11
|
+
|
12
|
+
# Custom mime types that matches everything when '*' is in list
|
13
|
+
class AllMimesTypes
|
14
|
+
|
15
|
+
def like?(other)
|
16
|
+
true
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
# A processor for a request, apply the parameters processors then execute the query code
|
22
|
+
class SwaggerRequestProcessor
|
23
|
+
|
24
|
+
attr_reader :processors_dispatchers, :response_processors, :produces
|
25
|
+
|
26
|
+
# @param produces [Array<String>]
|
27
|
+
def initialize(produces = nil)
|
28
|
+
@processors_dispatchers = []
|
29
|
+
@response_processors = {}
|
30
|
+
@produces = produces
|
31
|
+
if produces
|
32
|
+
@produces_types = produces.collect do |produce|
|
33
|
+
if produce == '*'
|
34
|
+
[Sinatra::SwaggerExposer::Processing::AllMimesTypes.new]
|
35
|
+
else
|
36
|
+
MIME::Types[produce]
|
37
|
+
end
|
38
|
+
end.flatten
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# @param dispatcher [Sinatra::SwaggerExposer::Processing::SwaggerProcessorDispatcher]
|
43
|
+
def add_dispatcher(dispatcher)
|
44
|
+
@processors_dispatchers << dispatcher
|
45
|
+
end
|
46
|
+
|
47
|
+
# @param response_processor [Sinatra::SwaggerExposer::Processing::SwaggerResponseProcessor]
|
48
|
+
def add_response_processor(code, response_processor)
|
49
|
+
@response_processors[code] = response_processor
|
50
|
+
end
|
51
|
+
|
52
|
+
JSON_CONTENT_TYPE = MIME::Types['application/json'].first
|
53
|
+
|
54
|
+
# Run the processor the call the route content
|
55
|
+
# @param app the sinatra app being run
|
56
|
+
# @param block_params [Array] the block parameters
|
57
|
+
# @param block the block containing the route content
|
58
|
+
def run(app, block_params, &block)
|
59
|
+
parsed_body = {}
|
60
|
+
if JSON_CONTENT_TYPE.like?(app.env['CONTENT_TYPE'])
|
61
|
+
body = app.request.body.read
|
62
|
+
unless body.empty?
|
63
|
+
begin
|
64
|
+
parsed_body = JSON.parse(body)
|
65
|
+
rescue JSON::ParserError => e
|
66
|
+
return [400, {:code => 400, :message => e.message}.to_json]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
app.params['parsed_body'] = parsed_body
|
71
|
+
unless @processors_dispatchers.empty?
|
72
|
+
@processors_dispatchers.each do |processor_dispatcher|
|
73
|
+
begin
|
74
|
+
processor_dispatcher.process(app, parsed_body)
|
75
|
+
rescue SwaggerInvalidException => e
|
76
|
+
app.content_type :json
|
77
|
+
return [400, {:code => 400, :message => e.message}.to_json]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
if block
|
82
|
+
# Execute the block in the context of the app
|
83
|
+
app.instance_exec(*block_params, &block)
|
84
|
+
else
|
85
|
+
''
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# Validate the response
|
90
|
+
# @param response_body [String] the body
|
91
|
+
# @param content_type [String] the content type
|
92
|
+
# @param response_status [Integer] the status
|
93
|
+
def validate_response(response_body, content_type, response_status)
|
94
|
+
validate_response_content_type(content_type, response_status)
|
95
|
+
if @response_processors.key?(response_status)
|
96
|
+
response_processor = response_processors[response_status]
|
97
|
+
if JSON_CONTENT_TYPE.like?(content_type) && response_processor
|
98
|
+
response_processor.validate_response(response_body)
|
99
|
+
end
|
100
|
+
else
|
101
|
+
raise SwaggerInvalidException.new("Status with unknown response status [#{response_status}], known statuses are [#{@response_processors.keys.join(', ')}] response value is #{response_body}")
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
# Validate a response content type
|
106
|
+
# @param content_type [String] the content type to validate
|
107
|
+
# @param response_status [Integer] the status
|
108
|
+
def validate_response_content_type(content_type, response_status)
|
109
|
+
if content_type.nil? && (response_status == 204)
|
110
|
+
# No content and no content type => everything is OK
|
111
|
+
elsif @produces
|
112
|
+
unless @produces_types.any? { |produce| produce.like?(content_type) }
|
113
|
+
raise SwaggerInvalidException.new("Undeclared content type [#{content_type}], declared content type are [#{@produces.join(', ')}]")
|
114
|
+
end
|
115
|
+
elsif !JSON_CONTENT_TYPE.like?(content_type)
|
116
|
+
raise SwaggerInvalidException.new("Undeclared content type [#{content_type}], if no declaration for the endpoint you should only return json")
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require_relative '../swagger-parameter-helper'
|
2
|
+
|
3
|
+
module Sinatra
|
4
|
+
|
5
|
+
module SwaggerExposer
|
6
|
+
|
7
|
+
module Processing
|
8
|
+
|
9
|
+
# Process a response
|
10
|
+
class SwaggerResponseProcessor
|
11
|
+
|
12
|
+
include Sinatra::SwaggerExposer::SwaggerParameterHelper
|
13
|
+
|
14
|
+
attr_reader :endpoint_response, :processor
|
15
|
+
|
16
|
+
# Initialize
|
17
|
+
# @param endpoint_response [Sinatra::SwaggerExposer::Configuration::SwaggerEndpointResponse]
|
18
|
+
# @param processor [Sinatra::SwaggerExposer::Processing::SwaggerTypeValueProcessor]
|
19
|
+
def initialize(endpoint_response, processor)
|
20
|
+
@endpoint_response = endpoint_response
|
21
|
+
@processor = processor
|
22
|
+
end
|
23
|
+
|
24
|
+
# Test if the processor is useful
|
25
|
+
# @return [TrueClass]
|
26
|
+
def useful?
|
27
|
+
(@endpoint_response && (@endpoint_response.type != TYPE_FILE)) || @processor
|
28
|
+
end
|
29
|
+
|
30
|
+
# Validate a response
|
31
|
+
# @param response_body [String] the body
|
32
|
+
def validate_response(response_body)
|
33
|
+
parsed_response_body = nil
|
34
|
+
begin
|
35
|
+
parsed_response_body = JSON.parse(response_body)
|
36
|
+
rescue JSON::ParserError => e
|
37
|
+
raise SwaggerInvalidException.new("Response is not a valid json [#{response_body}]")
|
38
|
+
end
|
39
|
+
if @processor
|
40
|
+
@processor.validate_value(parsed_response_body)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative 'swagger-base-value-processor'
|
2
|
+
|
3
|
+
module Sinatra
|
4
|
+
|
5
|
+
module SwaggerExposer
|
6
|
+
|
7
|
+
module Processing
|
8
|
+
|
9
|
+
# A processor for a type parameter
|
10
|
+
class SwaggerTypeValueProcessor < SwaggerBaseValueProcessor
|
11
|
+
|
12
|
+
attr_reader :attributes_processors
|
13
|
+
|
14
|
+
# Initialize
|
15
|
+
# @param name [String] the name
|
16
|
+
# @param required [TrueClass] if the parameter is required
|
17
|
+
# @param attributes_processors [Array<Sinatra::SwaggerExposer::Processing::SwaggerBaseValueProcessor>] the attributes processors
|
18
|
+
def initialize(name, required, attributes_processors)
|
19
|
+
super(name, required, nil)
|
20
|
+
@attributes_processors = attributes_processors
|
21
|
+
end
|
22
|
+
|
23
|
+
def useful?
|
24
|
+
super || (!(@attributes_processors.empty?))
|
25
|
+
end
|
26
|
+
|
27
|
+
def validate_value(value)
|
28
|
+
@attributes_processors.each do |attribute_processor|
|
29
|
+
attribute_processor.process(value)
|
30
|
+
end
|
31
|
+
value
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require_relative 'swagger-utilities'
|
2
|
-
|
3
1
|
module Sinatra
|
4
2
|
|
5
3
|
module SwaggerExposer
|
@@ -7,8 +5,6 @@ module Sinatra
|
|
7
5
|
# Create the swagger content
|
8
6
|
class SwaggerContentCreator
|
9
7
|
|
10
|
-
include SwaggerUtilities
|
11
|
-
|
12
8
|
def initialize(swagger_info, swagger_types, swagger_endpoints)
|
13
9
|
@swagger_info = swagger_info
|
14
10
|
@swagger_types = swagger_types
|
@@ -17,9 +13,9 @@ module Sinatra
|
|
17
13
|
|
18
14
|
def to_swagger
|
19
15
|
result = {
|
20
|
-
|
21
|
-
|
22
|
-
|
16
|
+
swagger: '2.0',
|
17
|
+
consumes: ['application/json'],
|
18
|
+
produces: ['application/json'],
|
23
19
|
}
|
24
20
|
if @swagger_info
|
25
21
|
result[:info] = @swagger_info.to_swagger
|
@@ -4,36 +4,48 @@ require 'json'
|
|
4
4
|
require_relative 'configuration/swagger-endpoint'
|
5
5
|
require_relative 'configuration/swagger-endpoint-parameter'
|
6
6
|
require_relative 'configuration/swagger-endpoint-response'
|
7
|
+
require_relative 'configuration/swagger-response-headers'
|
7
8
|
require_relative 'configuration/swagger-info'
|
8
9
|
require_relative 'configuration/swagger-types'
|
9
10
|
require_relative 'swagger-content-creator'
|
10
11
|
require_relative 'swagger-invalid-exception'
|
11
|
-
require_relative 'swagger-
|
12
|
+
require_relative 'swagger-request-processor-creator'
|
12
13
|
|
13
14
|
module Sinatra
|
14
15
|
|
15
16
|
# Expose swagger API from your Sinatra app
|
16
17
|
module SwaggerExposer
|
17
18
|
|
19
|
+
# Called when we register the extension
|
20
|
+
# @param app [Sinatra::Base]
|
18
21
|
def self.registered(app)
|
22
|
+
app.set :result_validation, (ENV['RACK_ENV'] != 'production')
|
19
23
|
app.set :swagger_endpoints, []
|
20
24
|
app.set :swagger_current_endpoint_info, {}
|
21
25
|
app.set :swagger_current_endpoint_parameters, {}
|
22
26
|
app.set :swagger_current_endpoint_responses, {}
|
27
|
+
|
23
28
|
swagger_types = Sinatra::SwaggerExposer::Configuration::SwaggerTypes.new
|
24
29
|
app.set :swagger_types, swagger_types
|
25
|
-
|
26
|
-
|
30
|
+
|
31
|
+
response_headers = Sinatra::SwaggerExposer::Configuration::SwaggerResponseHeaders.new
|
32
|
+
app.set :swagger_response_headers, response_headers
|
33
|
+
|
34
|
+
app.set :swagger_processor_creator, Sinatra::SwaggerExposer::SwaggerProcessorCreator.new(swagger_types)
|
35
|
+
declare_swagger_endpoint(app)
|
27
36
|
end
|
28
37
|
|
29
|
-
|
38
|
+
# Declare the endpoint to serve the swagger content
|
39
|
+
# @param app [Sinatra::Base]
|
40
|
+
def self.declare_swagger_endpoint(app)
|
30
41
|
app.endpoint_summary 'The swagger endpoint'
|
31
42
|
app.endpoint_tags 'swagger'
|
32
|
-
app.
|
43
|
+
app.endpoint_response 200
|
44
|
+
app.get('/swagger_doc.json') do
|
33
45
|
swagger_content = Sinatra::SwaggerExposer::SwaggerContentCreator.new(
|
34
|
-
|
35
|
-
|
36
|
-
|
46
|
+
settings.respond_to?(:swagger_info) ? settings.swagger_info : nil,
|
47
|
+
settings.swagger_types,
|
48
|
+
settings.swagger_endpoints
|
37
49
|
).to_swagger
|
38
50
|
content_type :json
|
39
51
|
swagger_content.to_json
|
@@ -41,32 +53,40 @@ module Sinatra
|
|
41
53
|
|
42
54
|
app.endpoint_summary 'Option method for the swagger endpoint, useful for some CORS stuff'
|
43
55
|
app.endpoint_tags 'swagger'
|
44
|
-
app.
|
56
|
+
app.endpoint_response 200
|
57
|
+
app.endpoint_produces 'text/plain;charset=utf-8'
|
58
|
+
app.options('/swagger_doc.json') do
|
59
|
+
content_type :text
|
45
60
|
200
|
46
61
|
end
|
47
62
|
end
|
48
63
|
|
49
64
|
# Provide a summary for the endpoint
|
65
|
+
# @param summary [String]
|
50
66
|
def endpoint_summary(summary)
|
51
67
|
set_if_type_and_not_exist(summary, :summary, String)
|
52
68
|
end
|
53
69
|
|
54
70
|
# Provide a path
|
71
|
+
# @param path [String]
|
55
72
|
def endpoint_path(path)
|
56
73
|
set_if_type_and_not_exist(path, :path, String)
|
57
74
|
end
|
58
75
|
|
59
76
|
# Provide a description for the endpoint
|
77
|
+
# @param description [String]
|
60
78
|
def endpoint_description(description)
|
61
79
|
set_if_type_and_not_exist(description, :description, String)
|
62
80
|
end
|
63
81
|
|
64
82
|
# Provide tags for the endpoint
|
83
|
+
# @param tags [Array<String>]
|
65
84
|
def endpoint_tags(*tags)
|
66
85
|
set_if_not_exist(tags, :tags)
|
67
86
|
end
|
68
87
|
|
69
88
|
# Provide produces params for the endpoint
|
89
|
+
# @param produces [Array<String>] the response types
|
70
90
|
def endpoint_produces(*produces)
|
71
91
|
set_if_not_exist(produces, :produces)
|
72
92
|
end
|
@@ -76,13 +96,13 @@ module Sinatra
|
|
76
96
|
parameters = settings.swagger_current_endpoint_parameters
|
77
97
|
check_if_not_duplicate(name, parameters, 'Parameter')
|
78
98
|
parameters[name] = Sinatra::SwaggerExposer::Configuration::SwaggerEndpointParameter.new(
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
99
|
+
name,
|
100
|
+
description,
|
101
|
+
how_to_pass,
|
102
|
+
required,
|
103
|
+
type,
|
104
|
+
params,
|
105
|
+
settings.swagger_types.types_names)
|
86
106
|
end
|
87
107
|
|
88
108
|
# Define fluent endpoint dispatcher
|
@@ -124,20 +144,62 @@ module Sinatra
|
|
124
144
|
settings.swagger_types.add_type(name, params)
|
125
145
|
end
|
126
146
|
|
147
|
+
# Declare a response header
|
148
|
+
def response_header(name, type, description)
|
149
|
+
settings.swagger_response_headers.add_response_header(name, type, description)
|
150
|
+
end
|
151
|
+
|
127
152
|
# Declare a response
|
128
|
-
|
153
|
+
# @param code [Integer] the response code
|
154
|
+
# @param type the type
|
155
|
+
# @param description [String] the description
|
156
|
+
# @param headers [Array<String>] the headers names
|
157
|
+
def endpoint_response(code, type = nil, description = nil, headers = [])
|
129
158
|
responses = settings.swagger_current_endpoint_responses
|
130
159
|
check_if_not_duplicate(code, responses, 'Response')
|
131
|
-
responses[code] = Sinatra::SwaggerExposer::Configuration::SwaggerEndpointResponse.new(
|
160
|
+
responses[code] = Sinatra::SwaggerExposer::Configuration::SwaggerEndpointResponse.new(
|
161
|
+
type,
|
162
|
+
description,
|
163
|
+
settings.swagger_types.types_names,
|
164
|
+
headers,
|
165
|
+
settings.swagger_response_headers
|
166
|
+
)
|
132
167
|
end
|
133
168
|
|
169
|
+
# Override Sinatra route method
|
134
170
|
def route(verb, path, options = {}, &block)
|
135
|
-
|
171
|
+
no_swagger = options[:no_swagger]
|
172
|
+
options.delete(:no_swagger)
|
173
|
+
if (verb == 'HEAD') || no_swagger
|
136
174
|
super(verb, path, options, &block)
|
137
175
|
else
|
138
|
-
|
176
|
+
request_processor = create_request_processor(verb.downcase, path, options)
|
139
177
|
super(verb, path, options) do |*params|
|
140
|
-
|
178
|
+
response = catch(:halt) do
|
179
|
+
request_processor.run(self, params, &block)
|
180
|
+
end
|
181
|
+
if settings.result_validation
|
182
|
+
begin
|
183
|
+
# Inspired from Sinatra#invoke
|
184
|
+
if (Fixnum === response) or (String === response)
|
185
|
+
response = [response]
|
186
|
+
end
|
187
|
+
if (Array === response) and (Fixnum === response.first)
|
188
|
+
response_for_validation = response.dup
|
189
|
+
response_status = response_for_validation.shift
|
190
|
+
response_body = response_for_validation.pop
|
191
|
+
response_headers = (response_for_validation.pop || {}).merge(self.response.header)
|
192
|
+
response_content_type = response_headers['Content-Type']
|
193
|
+
request_processor.validate_response(response_body, response_content_type, response_status)
|
194
|
+
elsif response.respond_to? :each
|
195
|
+
request_processor.validate_response(response.first.dup, self.response.header['Content-Type'], 200)
|
196
|
+
end
|
197
|
+
rescue Sinatra::SwaggerExposer::SwaggerInvalidException => e
|
198
|
+
content_type :json
|
199
|
+
throw :halt, [400, {:code => 400, :message => e.message}.to_json]
|
200
|
+
end
|
201
|
+
end
|
202
|
+
throw :halt, response
|
141
203
|
end
|
142
204
|
end
|
143
205
|
end
|
@@ -145,26 +207,26 @@ module Sinatra
|
|
145
207
|
private
|
146
208
|
|
147
209
|
# Call for each endpoint declaration
|
148
|
-
# @return [
|
149
|
-
def
|
210
|
+
# @return [Sinatra::SwaggerExposer::Processing::SwaggerRequestProcessor]
|
211
|
+
def create_request_processor(type, path, opts)
|
150
212
|
current_endpoint_info = settings.swagger_current_endpoint_info
|
151
213
|
current_endpoint_parameters = settings.swagger_current_endpoint_parameters
|
152
214
|
current_endpoint_responses = settings.swagger_current_endpoint_responses
|
153
215
|
endpoint = Sinatra::SwaggerExposer::Configuration::SwaggerEndpoint.new(
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
216
|
+
type,
|
217
|
+
path,
|
218
|
+
current_endpoint_parameters.values,
|
219
|
+
current_endpoint_responses.clone,
|
220
|
+
current_endpoint_info[:summary],
|
221
|
+
current_endpoint_info[:description],
|
222
|
+
current_endpoint_info[:tags],
|
223
|
+
current_endpoint_info[:path],
|
224
|
+
current_endpoint_info[:produces])
|
163
225
|
settings.swagger_endpoints << endpoint
|
164
226
|
current_endpoint_info.clear
|
165
227
|
current_endpoint_parameters.clear
|
166
228
|
current_endpoint_responses.clear
|
167
|
-
settings.
|
229
|
+
settings.swagger_processor_creator.create_request_processor(endpoint)
|
168
230
|
end
|
169
231
|
|
170
232
|
def set_if_not_exist(value, name)
|
@@ -181,6 +243,10 @@ module Sinatra
|
|
181
243
|
set_if_not_exist(value, name)
|
182
244
|
end
|
183
245
|
|
246
|
+
# Check if a value does not exist in a hash and throw an Exception
|
247
|
+
# @param key the key to validate
|
248
|
+
# @param values [Hash] the existing keys
|
249
|
+
# @param name [String] the valud name for the error message
|
184
250
|
def check_if_not_duplicate(key, values, name)
|
185
251
|
if values.key? key
|
186
252
|
raise SwaggerInvalidException.new("#{name} already exist for #{key} with value [#{values[key]}]")
|