sinatra-swagger-exposer 0.2.0 → 0.3.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 +4 -0
- data/lib/sinatra/swagger-exposer/configuration/swagger-endpoint-parameter.rb +118 -0
- data/lib/sinatra/swagger-exposer/configuration/swagger-endpoint-response.rb +64 -0
- data/lib/sinatra/swagger-exposer/configuration/swagger-endpoint.rb +88 -0
- data/lib/sinatra/swagger-exposer/configuration/swagger-info.rb +72 -0
- data/lib/sinatra/swagger-exposer/configuration/swagger-parameter-validation-helper.rb +106 -0
- data/lib/sinatra/swagger-exposer/configuration/swagger-type-property.rb +82 -0
- data/lib/sinatra/swagger-exposer/configuration/swagger-type.rb +127 -0
- data/lib/sinatra/swagger-exposer/configuration/swagger-types.rb +51 -0
- data/lib/sinatra/swagger-exposer/processing/swagger-array-value-preprocessor.rb +46 -0
- data/lib/sinatra/swagger-exposer/processing/swagger-base-value-preprocessor.rb +48 -0
- data/lib/sinatra/swagger-exposer/processing/swagger-parameter-preprocessor.rb +47 -0
- data/lib/sinatra/swagger-exposer/processing/swagger-preprocessor-dispatcher.rb +45 -0
- data/lib/sinatra/swagger-exposer/processing/swagger-primitive-value-preprocessor.rb +165 -0
- data/lib/sinatra/swagger-exposer/processing/swagger-request-preprocessor.rb +64 -0
- data/lib/sinatra/swagger-exposer/processing/swagger-type-value-preprocessor.rb +37 -0
- data/lib/sinatra/swagger-exposer/swagger-content-creator.rb +3 -2
- data/lib/sinatra/swagger-exposer/swagger-exposer.rb +18 -20
- data/lib/sinatra/swagger-exposer/swagger-parameter-helper.rb +1 -1
- data/lib/sinatra/swagger-exposer/swagger-preprocessor-creator.rb +137 -0
- data/lib/sinatra/swagger-exposer/swagger-utilities.rb +1 -1
- data/lib/sinatra/swagger-exposer/version.rb +1 -1
- metadata +18 -10
- data/lib/sinatra/swagger-exposer/swagger-endpoint-parameter.rb +0 -197
- data/lib/sinatra/swagger-exposer/swagger-endpoint-response.rb +0 -63
- data/lib/sinatra/swagger-exposer/swagger-endpoint.rb +0 -94
- data/lib/sinatra/swagger-exposer/swagger-info.rb +0 -70
- data/lib/sinatra/swagger-exposer/swagger-parameter-preprocessor.rb +0 -187
- data/lib/sinatra/swagger-exposer/swagger-request-preprocessor.rb +0 -56
- data/lib/sinatra/swagger-exposer/swagger-type-property.rb +0 -72
- data/lib/sinatra/swagger-exposer/swagger-type.rb +0 -125
@@ -0,0 +1,165 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
require_relative 'swagger-base-value-preprocessor'
|
4
|
+
require_relative '../swagger-parameter-helper'
|
5
|
+
require_relative '../swagger-invalid-exception'
|
6
|
+
|
7
|
+
module Sinatra
|
8
|
+
|
9
|
+
module SwaggerExposer
|
10
|
+
|
11
|
+
module Processing
|
12
|
+
|
13
|
+
# Validate primitive parameters
|
14
|
+
class SwaggerPrimitiveValuePreprocessor < SwaggerBaseValuePreprocessor
|
15
|
+
|
16
|
+
include Sinatra::SwaggerExposer::SwaggerParameterHelper
|
17
|
+
|
18
|
+
attr_reader :type, :params
|
19
|
+
|
20
|
+
# Initialize
|
21
|
+
# @param name [String] the name
|
22
|
+
# @param required [TrueClass] if the parameter is required
|
23
|
+
# @param type [String] the type name
|
24
|
+
# @param default [Object] the default value
|
25
|
+
# @param params [Hash] parameters
|
26
|
+
def initialize(name, required, type, default, params)
|
27
|
+
super(name, required, default)
|
28
|
+
@type = type
|
29
|
+
@params = params
|
30
|
+
end
|
31
|
+
|
32
|
+
def useful?
|
33
|
+
super ||
|
34
|
+
[TYPE_NUMBER, TYPE_INTEGER, TYPE_BOOLEAN, TYPE_DATE_TIME].include?(@type) || # Must check type
|
35
|
+
(@params.key? PARAMS_MIN_LENGTH) || (@params.key? PARAMS_MAX_LENGTH) # Must check string
|
36
|
+
end
|
37
|
+
|
38
|
+
# Dispatch method
|
39
|
+
def validate_param_value(value)
|
40
|
+
case @type
|
41
|
+
when TYPE_NUMBER
|
42
|
+
return validate_param_value_number(value)
|
43
|
+
when TYPE_INTEGER
|
44
|
+
return validate_param_value_integer(value)
|
45
|
+
when TYPE_BOOLEAN
|
46
|
+
return validate_param_value_boolean(value)
|
47
|
+
when TYPE_DATE_TIME
|
48
|
+
return validate_param_value_date_time(value)
|
49
|
+
else
|
50
|
+
return validate_param_value_string(value)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Validate a boolean parameter
|
55
|
+
def validate_param_value_boolean(value)
|
56
|
+
if (value == 'true') || value.is_a?(TrueClass)
|
57
|
+
return true
|
58
|
+
elsif (value == 'false') || value.is_a?(FalseClass)
|
59
|
+
return false
|
60
|
+
else
|
61
|
+
raise SwaggerInvalidException.new("Parameter [#{name}] should be an boolean but is [#{value}]")
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Validate an integer parameter
|
66
|
+
def validate_param_value_integer(value)
|
67
|
+
begin
|
68
|
+
f = Float(value)
|
69
|
+
i = Integer(value)
|
70
|
+
if f == i
|
71
|
+
i
|
72
|
+
else
|
73
|
+
raise SwaggerInvalidException.new("Parameter [#{name}] should be an integer but is [#{value}]")
|
74
|
+
end
|
75
|
+
value = Integer(value)
|
76
|
+
validate_numerical_value(value)
|
77
|
+
value
|
78
|
+
rescue ArgumentError
|
79
|
+
raise SwaggerInvalidException.new("Parameter [#{name}] should be an integer but is [#{value}]")
|
80
|
+
rescue TypeError
|
81
|
+
raise SwaggerInvalidException.new("Parameter [#{name}] should be an integer but is [#{value}]")
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Validate a number parameter
|
86
|
+
def validate_param_value_number(value)
|
87
|
+
begin
|
88
|
+
value = Float(value)
|
89
|
+
validate_numerical_value(value)
|
90
|
+
return value
|
91
|
+
rescue ArgumentError
|
92
|
+
raise SwaggerInvalidException.new("Parameter [#{name}] should be a float but is [#{value}]")
|
93
|
+
rescue TypeError
|
94
|
+
raise SwaggerInvalidException.new("Parameter [#{name}] should be a float but is [#{value}]")
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# Validate a numerical value
|
99
|
+
# @param value [Numeric] the value
|
100
|
+
def validate_numerical_value(value)
|
101
|
+
validate_numerical_value_internal(
|
102
|
+
value,
|
103
|
+
PARAMS_MINIMUM,
|
104
|
+
PARAMS_EXCLUSIVE_MINIMUM,
|
105
|
+
'>=',
|
106
|
+
'>')
|
107
|
+
validate_numerical_value_internal(
|
108
|
+
value,
|
109
|
+
PARAMS_MAXIMUM,
|
110
|
+
PARAMS_EXCLUSIVE_MAXIMUM,
|
111
|
+
'<=',
|
112
|
+
'<')
|
113
|
+
end
|
114
|
+
|
115
|
+
# Validate a date time parameter
|
116
|
+
def validate_param_value_date_time(value)
|
117
|
+
begin
|
118
|
+
DateTime.rfc3339(value)
|
119
|
+
rescue ArgumentError
|
120
|
+
raise SwaggerInvalidException.new("Parameter [#{name}] should be a date time but is [#{value}]")
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
# Validate a string parameter
|
125
|
+
def validate_param_value_string(value)
|
126
|
+
if value
|
127
|
+
validate_param_value_string_length(value, PARAMS_MIN_LENGTH, '>=')
|
128
|
+
validate_param_value_string_length(value, PARAMS_MAX_LENGTH, '<=')
|
129
|
+
end
|
130
|
+
value
|
131
|
+
end
|
132
|
+
|
133
|
+
# Validate the length of a string parameter
|
134
|
+
# @param value the value to check
|
135
|
+
# @param limit_param_name [Symbol] the param that contain the value to compare to
|
136
|
+
# @param limit_param_method [String] the comparison method to call
|
137
|
+
def validate_param_value_string_length(value, limit_param_name, limit_param_method)
|
138
|
+
if @params.key? limit_param_name
|
139
|
+
target_value = @params[limit_param_name]
|
140
|
+
unless value.length.send(limit_param_method, target_value)
|
141
|
+
raise SwaggerInvalidException.new("Parameter [#{name}] length should be #{limit_param_method} than #{target_value} but is #{value.length} for [#{value}]")
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
# Validate the value of a number
|
147
|
+
# @param value the value to check
|
148
|
+
# @param limit_param_name [Symbol] the param that contain the value to compare to
|
149
|
+
# @param exclusive_limit_param_name [Symbol] the param that indicates if the comparison is absolute
|
150
|
+
# @param limit_param_method [String] the comparison method to call
|
151
|
+
# @param exclusive_limit_param_method [String] the absolute comparison method to call
|
152
|
+
def validate_numerical_value_internal(value, limit_param_name, exclusive_limit_param_name, limit_param_method, exclusive_limit_param_method)
|
153
|
+
if @params.key? limit_param_name
|
154
|
+
target_value = @params[limit_param_name]
|
155
|
+
method_to_call = @params[exclusive_limit_param_name] ? exclusive_limit_param_method : limit_param_method
|
156
|
+
unless value.send(method_to_call, target_value)
|
157
|
+
raise SwaggerInvalidException.new("Parameter [#{name}] should be #{method_to_call} than [#{target_value}] but is [#{value}]")
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
require_relative '../swagger-invalid-exception'
|
4
|
+
|
5
|
+
module Sinatra
|
6
|
+
|
7
|
+
module SwaggerExposer
|
8
|
+
|
9
|
+
module Processing
|
10
|
+
|
11
|
+
# A preprocessor for a request, apply the parameters preprocessors then execute the query code
|
12
|
+
class SwaggerRequestPreprocessor
|
13
|
+
|
14
|
+
attr_reader :preprocessors_dispatchers
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@preprocessors_dispatchers = []
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_dispatcher(dispatcher)
|
21
|
+
@preprocessors_dispatchers << dispatcher
|
22
|
+
end
|
23
|
+
|
24
|
+
VALID_JSON_CONTENT_TYPES = ['application/json', 'application/json; charset=utf-8']
|
25
|
+
|
26
|
+
# Run the preprocessor the call the route content
|
27
|
+
# @param app the sinatra app being run
|
28
|
+
# @params block_params [Array] the block parameters
|
29
|
+
# @param block the block containing the route content
|
30
|
+
def run(app, block_params, &block)
|
31
|
+
parsed_body = {}
|
32
|
+
if VALID_JSON_CONTENT_TYPES.include? app.env['CONTENT_TYPE']
|
33
|
+
body = app.request.body.read
|
34
|
+
unless body.empty?
|
35
|
+
begin
|
36
|
+
parsed_body = JSON.parse(body)
|
37
|
+
rescue JSON::ParserError => e
|
38
|
+
return [400, {:code => 400, :message => e.message}.to_json]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
app.params['parsed_body'] = parsed_body
|
43
|
+
unless @preprocessors_dispatchers.empty?
|
44
|
+
@preprocessors_dispatchers.each do |preprocessor_dispatcher|
|
45
|
+
begin
|
46
|
+
preprocessor_dispatcher.process(app, parsed_body)
|
47
|
+
rescue SwaggerInvalidException => e
|
48
|
+
app.content_type :json
|
49
|
+
return [400, {:code => 400, :message => e.message}.to_json]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
if block
|
54
|
+
# Execute the block in the context of the app
|
55
|
+
app.instance_exec(*block_params, &block)
|
56
|
+
else
|
57
|
+
''
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative 'swagger-base-value-preprocessor'
|
2
|
+
|
3
|
+
module Sinatra
|
4
|
+
|
5
|
+
module SwaggerExposer
|
6
|
+
|
7
|
+
module Processing
|
8
|
+
|
9
|
+
# A preprocessor for a type parameter
|
10
|
+
class SwaggerTypeValuePreprocessor < SwaggerBaseValuePreprocessor
|
11
|
+
|
12
|
+
attr_reader :attributes_preprocessors
|
13
|
+
|
14
|
+
# Initialize
|
15
|
+
# @param name [String] the name
|
16
|
+
# @param required [TrueClass] if the parameter is required
|
17
|
+
# @param attributes_preprocessors [Array[Sinatra::SwaggerExposer::Processing::SwaggerBaseValuePreprocessor]] the attributes preprocessors
|
18
|
+
def initialize(name, required, attributes_preprocessors)
|
19
|
+
super(name, required)
|
20
|
+
@attributes_preprocessors = attributes_preprocessors
|
21
|
+
end
|
22
|
+
|
23
|
+
def useful?
|
24
|
+
super || (!(@attributes_preprocessors.empty?))
|
25
|
+
end
|
26
|
+
|
27
|
+
def validate_param_value(value)
|
28
|
+
@attributes_preprocessors.each do |attribute_preprocessor|
|
29
|
+
attribute_preprocessor.process(value)
|
30
|
+
end
|
31
|
+
value
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -25,8 +25,9 @@ module Sinatra
|
|
25
25
|
result[:info] = @swagger_info.to_swagger
|
26
26
|
end
|
27
27
|
|
28
|
-
|
29
|
-
|
28
|
+
swagger_types_as_swagger = @swagger_types.to_swagger
|
29
|
+
if swagger_types_as_swagger
|
30
|
+
result[:definitions] = swagger_types_as_swagger
|
30
31
|
end
|
31
32
|
|
32
33
|
unless @swagger_endpoints.empty?
|
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'sinatra/base'
|
2
2
|
require 'json'
|
3
3
|
|
4
|
-
require_relative 'swagger-endpoint'
|
5
|
-
require_relative 'swagger-endpoint-parameter'
|
6
|
-
require_relative 'swagger-endpoint-response'
|
7
|
-
require_relative 'swagger-info'
|
8
|
-
require_relative 'swagger-
|
9
|
-
require_relative 'swagger-type'
|
10
|
-
|
4
|
+
require_relative 'configuration/swagger-endpoint'
|
5
|
+
require_relative 'configuration/swagger-endpoint-parameter'
|
6
|
+
require_relative 'configuration/swagger-endpoint-response'
|
7
|
+
require_relative 'configuration/swagger-info'
|
8
|
+
require_relative 'configuration/swagger-types'
|
11
9
|
require_relative 'swagger-content-creator'
|
10
|
+
require_relative 'swagger-invalid-exception'
|
11
|
+
require_relative 'swagger-preprocessor-creator'
|
12
12
|
|
13
13
|
module Sinatra
|
14
14
|
|
@@ -20,7 +20,9 @@ module Sinatra
|
|
20
20
|
app.set :swagger_current_endpoint_info, {}
|
21
21
|
app.set :swagger_current_endpoint_parameters, {}
|
22
22
|
app.set :swagger_current_endpoint_responses, {}
|
23
|
-
|
23
|
+
swagger_types = Sinatra::SwaggerExposer::Configuration::SwaggerTypes.new
|
24
|
+
app.set :swagger_types, swagger_types
|
25
|
+
app.set :swagger_preprocessor_creator, Sinatra::SwaggerExposer::SwaggerPreprocessorCreator.new(swagger_types)
|
24
26
|
declare_swagger_endpoints(app)
|
25
27
|
end
|
26
28
|
|
@@ -28,7 +30,7 @@ module Sinatra
|
|
28
30
|
app.endpoint_summary 'The swagger endpoint'
|
29
31
|
app.endpoint_tags 'swagger'
|
30
32
|
app.get '/swagger_doc.json' do
|
31
|
-
swagger_content =
|
33
|
+
swagger_content = Sinatra::SwaggerExposer::SwaggerContentCreator.new(
|
32
34
|
settings.respond_to?(:swagger_info) ? settings.swagger_info : nil,
|
33
35
|
settings.swagger_types,
|
34
36
|
settings.swagger_endpoints
|
@@ -73,14 +75,14 @@ module Sinatra
|
|
73
75
|
def endpoint_parameter(name, description, how_to_pass, required, type, params = {})
|
74
76
|
parameters = settings.swagger_current_endpoint_parameters
|
75
77
|
check_if_not_duplicate(name, parameters, 'Parameter')
|
76
|
-
parameters[name] = SwaggerEndpointParameter.new(
|
78
|
+
parameters[name] = Sinatra::SwaggerExposer::Configuration::SwaggerEndpointParameter.new(
|
77
79
|
name,
|
78
80
|
description,
|
79
81
|
how_to_pass,
|
80
82
|
required,
|
81
83
|
type,
|
82
84
|
params,
|
83
|
-
settings.swagger_types.
|
85
|
+
settings.swagger_types.types_names)
|
84
86
|
end
|
85
87
|
|
86
88
|
# Define fluent endpoint dispatcher
|
@@ -114,23 +116,19 @@ module Sinatra
|
|
114
116
|
|
115
117
|
# General information
|
116
118
|
def general_info(params)
|
117
|
-
set :swagger_info, SwaggerInfo.new(params)
|
119
|
+
set :swagger_info, Sinatra::SwaggerExposer::Configuration::SwaggerInfo.new(params)
|
118
120
|
end
|
119
121
|
|
120
122
|
# Declare a type
|
121
123
|
def type(name, params)
|
122
|
-
|
123
|
-
if types.key? name
|
124
|
-
raise SwaggerInvalidException.new("Type [#{name}] already exist with value #{types[name]}")
|
125
|
-
end
|
126
|
-
types[name] = SwaggerType.new(name, params, settings.swagger_types.keys)
|
124
|
+
settings.swagger_types.add_type(name, params)
|
127
125
|
end
|
128
126
|
|
129
127
|
# Declare a response
|
130
128
|
def endpoint_response(code, type = nil, description = nil)
|
131
129
|
responses = settings.swagger_current_endpoint_responses
|
132
130
|
check_if_not_duplicate(code, responses, 'Response')
|
133
|
-
responses[code] = SwaggerEndpointResponse.new(type, description, settings.swagger_types.
|
131
|
+
responses[code] = Sinatra::SwaggerExposer::Configuration::SwaggerEndpointResponse.new(type, description, settings.swagger_types.types_names)
|
134
132
|
end
|
135
133
|
|
136
134
|
def route(verb, path, options = {}, &block)
|
@@ -152,7 +150,7 @@ module Sinatra
|
|
152
150
|
current_endpoint_info = settings.swagger_current_endpoint_info
|
153
151
|
current_endpoint_parameters = settings.swagger_current_endpoint_parameters
|
154
152
|
current_endpoint_responses = settings.swagger_current_endpoint_responses
|
155
|
-
endpoint = SwaggerEndpoint.new(
|
153
|
+
endpoint = Sinatra::SwaggerExposer::Configuration::SwaggerEndpoint.new(
|
156
154
|
type,
|
157
155
|
path,
|
158
156
|
current_endpoint_parameters.values,
|
@@ -166,7 +164,7 @@ module Sinatra
|
|
166
164
|
current_endpoint_info.clear
|
167
165
|
current_endpoint_parameters.clear
|
168
166
|
current_endpoint_responses.clear
|
169
|
-
endpoint
|
167
|
+
settings.swagger_preprocessor_creator.create_endpoint_processor(endpoint)
|
170
168
|
end
|
171
169
|
|
172
170
|
def set_if_not_exist(value, name)
|
@@ -22,6 +22,7 @@ module Sinatra
|
|
22
22
|
TYPE_NUMBER = 'number'
|
23
23
|
TYPE_PASSWORD = 'password'
|
24
24
|
TYPE_STRING = 'string'
|
25
|
+
TYPE_ARRAY = 'array'
|
25
26
|
|
26
27
|
PRIMITIVE_TYPES = [
|
27
28
|
TYPE_INTEGER,
|
@@ -66,7 +67,6 @@ module Sinatra
|
|
66
67
|
PARAMS_MAX_LENGTH,
|
67
68
|
]
|
68
69
|
|
69
|
-
|
70
70
|
end
|
71
71
|
|
72
72
|
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
require_relative 'swagger-utilities'
|
2
|
+
require_relative 'processing/swagger-array-value-preprocessor'
|
3
|
+
require_relative 'processing/swagger-preprocessor-dispatcher'
|
4
|
+
require_relative 'processing/swagger-primitive-value-preprocessor'
|
5
|
+
require_relative 'processing/swagger-request-preprocessor'
|
6
|
+
require_relative 'processing/swagger-type-value-preprocessor'
|
7
|
+
|
8
|
+
module Sinatra
|
9
|
+
|
10
|
+
module SwaggerExposer
|
11
|
+
|
12
|
+
# Create processor from configuration
|
13
|
+
class SwaggerPreprocessorCreator
|
14
|
+
|
15
|
+
include Sinatra::SwaggerExposer::SwaggerUtilities
|
16
|
+
|
17
|
+
# Initialize
|
18
|
+
# @param types [Sinatra::SwaggerExposer::SwaggerTypes]
|
19
|
+
def initialize(types)
|
20
|
+
@types = types
|
21
|
+
end
|
22
|
+
|
23
|
+
# Create an endpoint processor
|
24
|
+
# @param swagger_endpoint [Sinatra::SwaggerExposer::Configuration::SwaggerEndpoint] the endpoint
|
25
|
+
# @return [Sinatra::SwaggerExposer::Processing::SwaggerRequestPreprocessor]
|
26
|
+
def create_endpoint_processor(swagger_endpoint)
|
27
|
+
request_preprocessor = Sinatra::SwaggerExposer::Processing::SwaggerRequestPreprocessor.new
|
28
|
+
swagger_endpoint.parameters.each do |parameter|
|
29
|
+
preprocessor = create_value_preprocessor(parameter)
|
30
|
+
dispatcher = Sinatra::SwaggerExposer::Processing::SwaggerPreprocessorDispatcher.new(parameter.how_to_pass, preprocessor)
|
31
|
+
if dispatcher.useful?
|
32
|
+
request_preprocessor.add_dispatcher(dispatcher)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
request_preprocessor
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
# Create a parameter preprocessor for a parameter
|
41
|
+
# @param parameter [Sinatra::SwaggerExposer::Configuration::SwaggerEndpointParameter]
|
42
|
+
def create_value_preprocessor(parameter)
|
43
|
+
type_name = parameter.type
|
44
|
+
if type_name == TYPE_ARRAY
|
45
|
+
if PRIMITIVE_TYPES.include? parameter.items
|
46
|
+
preprocessor_for_values = Sinatra::SwaggerExposer::Processing::SwaggerPrimitiveValuePreprocessor.new(
|
47
|
+
parameter.name,
|
48
|
+
false,
|
49
|
+
parameter.items,
|
50
|
+
parameter.default,
|
51
|
+
parameter.params
|
52
|
+
)
|
53
|
+
else
|
54
|
+
preprocessor_for_values = create_preprocessor_for_type(parameter.name, parameter.items, false)
|
55
|
+
end
|
56
|
+
Sinatra::SwaggerExposer::Processing::SwaggerArrayValuePreprocessor.new(parameter.name, parameter.required, preprocessor_for_values)
|
57
|
+
elsif PRIMITIVE_TYPES.include? type_name
|
58
|
+
Sinatra::SwaggerExposer::Processing::SwaggerPrimitiveValuePreprocessor.new(
|
59
|
+
parameter.name,
|
60
|
+
parameter.required,
|
61
|
+
type_name,
|
62
|
+
parameter.default,
|
63
|
+
parameter.params
|
64
|
+
)
|
65
|
+
else
|
66
|
+
create_preprocessor_for_type(parameter.name, parameter.type, parameter.required)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Create a type parameter preprocessor for a type parameter
|
71
|
+
# @param parameter_name [String] the parameter name
|
72
|
+
# @param parameter_type [String] the parameter type
|
73
|
+
# @param parameter_required [TrueClass] if the parameter is required
|
74
|
+
# @return [Sinatra::SwaggerExposer::Processing::SwaggerTypeValuePreprocessor]
|
75
|
+
def create_preprocessor_for_type(parameter_name, parameter_type, parameter_required)
|
76
|
+
attributes_preprocessors = create_attributes_preprocessors_for_type(parameter_type)
|
77
|
+
Sinatra::SwaggerExposer::Processing::SwaggerTypeValuePreprocessor.new(
|
78
|
+
parameter_name,
|
79
|
+
parameter_required,
|
80
|
+
attributes_preprocessors
|
81
|
+
)
|
82
|
+
end
|
83
|
+
|
84
|
+
# Get attributes preprocessor for a type
|
85
|
+
# @param type_name [String] the type name
|
86
|
+
# @return [Array[Sinatra::SwaggerExposer::Processing::SwaggerPrimitiveValuePreprocessor]]
|
87
|
+
def create_attributes_preprocessors_for_type(type_name)
|
88
|
+
type = @types[type_name]
|
89
|
+
attributes_preprocessors = []
|
90
|
+
type.properties.each_pair do |property_name, property|
|
91
|
+
attributes_preprocessors <<
|
92
|
+
create_preprocessor_for_property(
|
93
|
+
property_name,
|
94
|
+
property,
|
95
|
+
type.required.include?(property.name)
|
96
|
+
)
|
97
|
+
end
|
98
|
+
if type.extends
|
99
|
+
attributes_preprocessors = attributes_preprocessors + create_attributes_preprocessors_for_type(type.extends)
|
100
|
+
end
|
101
|
+
attributes_preprocessors
|
102
|
+
end
|
103
|
+
|
104
|
+
# Create a processor for a type property
|
105
|
+
# @param type_property [Sinatra::SwaggerExposer::Configuration::SwaggerTypeProperty]
|
106
|
+
def create_preprocessor_for_property(name, type_property, required)
|
107
|
+
property_type = type_property.type
|
108
|
+
if property_type == TYPE_ARRAY
|
109
|
+
if PRIMITIVE_TYPES.include? type_property.items
|
110
|
+
preprocessor_for_values = Sinatra::SwaggerExposer::Processing::SwaggerPrimitiveValuePreprocessor.new(
|
111
|
+
name,
|
112
|
+
false,
|
113
|
+
type_property.items,
|
114
|
+
type_property.properties[:default],
|
115
|
+
type_property.properties
|
116
|
+
)
|
117
|
+
else
|
118
|
+
preprocessor_for_values = create_preprocessor_for_type(name, type_property.items, false)
|
119
|
+
end
|
120
|
+
Sinatra::SwaggerExposer::Processing::SwaggerArrayValuePreprocessor.new(name, required, preprocessor_for_values)
|
121
|
+
elsif PRIMITIVE_TYPES.include? property_type
|
122
|
+
Sinatra::SwaggerExposer::Processing::SwaggerPrimitiveValuePreprocessor.new(
|
123
|
+
name,
|
124
|
+
required,
|
125
|
+
property_type,
|
126
|
+
type_property.properties[:default],
|
127
|
+
type_property.properties
|
128
|
+
)
|
129
|
+
else
|
130
|
+
create_preprocessor_for_type(name, property_type, required)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
end
|