@@ -89,8 +89,6 @@ def path_item(routes, options)
89
89
@item , path = GrapeSwagger ::DocMethods ::PathString . build ( route . route_path , options )
90
90
@entity = route . route_entity || route . route_success
91
91
92
- # ... replacing version params through submitted version
93
-
94
92
method = route . route_method . downcase . to_sym
95
93
request_params = method_object ( route , options , path )
96
94
@@ -124,14 +122,6 @@ def description_object(route, markdown)
124
122
description
125
123
end
126
124
127
- def consumes_object ( route , format )
128
- method = route . route_method . downcase . to_sym
129
- format = route . route_settings [ :description ] [ :consumes ] if route . route_settings [ :description ] && route . route_settings [ :description ] [ :consumes ]
130
- mime_types = GrapeSwagger ::DocMethods ::ProducesConsumes . call ( format ) if [ :post , :put ] . include? ( method )
131
-
132
- mime_types
133
- end
134
-
135
125
def produces_object ( route , format )
136
126
mime_types = GrapeSwagger ::DocMethods ::ProducesConsumes . call ( format )
137
127
@@ -143,13 +133,27 @@ def produces_object(route, format)
143
133
route_mime_types . present? ? route_mime_types : mime_types
144
134
end
145
135
136
+ def consumes_object ( route , format )
137
+ method = route . route_method . downcase . to_sym
138
+ format = route . route_settings [ :description ] [ :consumes ] if route . route_settings [ :description ] && route . route_settings [ :description ] [ :consumes ]
139
+ mime_types = GrapeSwagger ::DocMethods ::ProducesConsumes . call ( format ) if [ :post , :put ] . include? ( method )
140
+
141
+ mime_types
142
+ end
143
+
144
+ def params_object ( route )
145
+ partition_params ( route ) . map do |param , value |
146
+ value = { required : false } . merge ( value ) if value . is_a? ( Hash )
147
+ GrapeSwagger ::DocMethods ::ParseParams . call ( param , value , route )
148
+ end
149
+ end
150
+
146
151
def response_object ( route )
147
- default_code = default_staus_codes [ route . route_method . downcase . to_sym ]
152
+ default_code = default_status_codes [ route . route_method . downcase . to_sym ]
148
153
default_code [ :model ] = @entity if @entity
149
154
default_code [ :message ] = route . route_description || default_code [ :message ] . sub ( '{item}' , @item )
150
155
151
156
codes = [ default_code ] + ( route . route_http_codes || route . route_failure || [ ] )
152
-
153
157
codes . map! { |x | x . is_a? ( Array ) ? { code : x [ 0 ] , message : x [ 1 ] , model : x [ 2 ] } : x }
154
158
155
159
codes . each_with_object ( { } ) do |value , memo |
@@ -158,6 +162,8 @@ def response_object(route)
158
162
response_model = @item
159
163
response_model = expose_params_from_model ( value [ :model ] ) if value [ :model ]
160
164
165
+ memo [ 204 ] = memo . delete ( 200 ) if memo . key? ( 200 ) && route . route_method == 'DELETE' && value [ :model ] . nil?
166
+
161
167
next unless !response_model . start_with? ( 'Swagger_doc' ) &&
162
168
( ( @definitions [ response_model ] && value [ :code ] . to_s . start_with? ( '2' ) ) || value [ :model ] )
163
169
@@ -170,40 +176,32 @@ def response_object(route)
170
176
end
171
177
end
172
178
173
- def default_staus_codes
174
- {
175
- get : { code : 200 , message : 'get {item}(s)' } ,
176
- post : { code : 201 , message : 'created {item}' } ,
177
- put : { code : 200 , message : 'updated {item}' } ,
178
- patch : { code : 200 , message : 'patched {item}' } ,
179
- delete : { code : 200 , message : 'deleted {item}' }
180
- }
179
+ def tag_object ( route , version )
180
+ Array ( route . route_path . split ( '{' ) [ 0 ] . split ( '/' ) . reject ( &:empty? ) . delete_if { |i | ( ( i == route . route_prefix . to_s ) || ( i == version ) ) } . first )
181
181
end
182
182
183
- def params_object ( route )
184
- partition_params ( route ) . map do |param , value |
185
- value = { required : false } . merge ( value ) if value . is_a? ( Hash )
186
- GrapeSwagger ::DocMethods ::ParseParams . call ( param , value , route )
187
- end
188
- end
183
+ private
189
184
190
185
def partition_params ( route )
191
186
declared_params = route . route_settings [ :declared_params ] if route . route_settings [ :declared_params ] . present?
192
187
required , exposed = route . route_params . partition { |x | x . first . is_a? String }
193
188
194
189
unless declared_params . nil?
195
- required_params = parse_request_params ( required )
190
+ request_params = parse_request_params ( required )
196
191
end
197
192
198
- if !exposed . empty? && ! @entity
193
+ if !exposed . empty?
199
194
exposed_params = exposed . each_with_object ( { } ) { |x , memo | memo [ x . first ] = x . last }
200
195
properties = parse_response_params ( exposed_params )
201
-
202
- @definitions [ @item ] = { properties : properties }
196
+ else
197
+ properties = parse_response_params ( required )
203
198
end
204
199
200
+ key = model_name ( @entity || @item )
201
+ @definitions [ key ] = { type : 'object' , properties : properties } unless properties . empty? || @definitions . key? ( key ) || ( route . route_method == 'DELETE' && !@entity )
202
+
205
203
return route . route_params if route . route_params && !route . route_settings [ :declared_params ] . present?
206
- required_params || { }
204
+ request_params || { }
207
205
end
208
206
209
207
def parse_request_params ( required )
@@ -237,11 +235,12 @@ def parse_response_params(params)
237
235
{ '$ref' => "#/definitions/#{ name } " }
238
236
end
239
237
else
240
-
241
- data_type = GrapeSwagger ::DocMethods ::DataType . call ( x . last [ :documentation ] || x . last )
238
+ documented_type = x . last [ :type ]
239
+ documented_type ||= x . last [ :documentation ] [ :type ] if x . last [ :documentation ]
240
+ data_type = GrapeSwagger ::DocMethods ::DataType . call ( documented_type )
242
241
243
242
if GrapeSwagger ::DocMethods ::DataType . primitive? ( data_type )
244
- data = GrapeSwagger ::DocMethods ::DataType :: PRIMITIVE_MAPPINGS [ data_type ]
243
+ data = GrapeSwagger ::DocMethods ::DataType . mapping ( data_type )
245
244
memo [ x . first ] = { type : data . first , format : data . last }
246
245
else
247
246
memo [ x . first ] = { type : data_type }
@@ -253,9 +252,8 @@ def parse_response_params(params)
253
252
end
254
253
255
254
def expose_params_from_model ( model )
256
- model_name = model . respond_to? ( :name ) ? model . name . demodulize . camelize : model . split ( '::' ) . last
255
+ model_name = model_name ( model )
257
256
258
- # DONE: has to be adept, to be ready for grape-entity >0.5.0
259
257
# TODO: this should only be a temporary hack ;)
260
258
if GrapeEntity ::VERSION =~ /0\. 4\. \d /
261
259
parameters = model . exposures ? model . exposures : model . documentation
@@ -271,6 +269,20 @@ def expose_params_from_model(model)
271
269
model_name
272
270
end
273
271
272
+ def model_name ( name )
273
+ name . respond_to? ( :name ) ? name . name . demodulize . camelize : name . split ( '::' ) . last
274
+ end
275
+
276
+ def default_status_codes
277
+ {
278
+ get : { code : 200 , message : 'get {item}(s)' } ,
279
+ post : { code : 201 , message : 'created {item}' } ,
280
+ put : { code : 200 , message : 'updated {item}' } ,
281
+ patch : { code : 200 , message : 'patched {item}' } ,
282
+ delete : { code : 200 , message : 'deleted {item}' }
283
+ }
284
+ end
285
+
274
286
def could_it_be_a_model? ( value )
275
287
(
276
288
value [ :type ] . to_s . include? ( 'Entity' ) || value [ :type ] . to_s . include? ( 'Entities' )
@@ -289,9 +301,5 @@ def hidden?(route)
289
301
290
302
false
291
303
end
292
-
293
- def tag_object ( route , version )
294
- Array ( route . route_path . split ( '{' ) [ 0 ] . split ( '/' ) . reject ( &:empty? ) . delete_if { |i | ( ( i == route . route_prefix . to_s ) || ( i == version ) ) } . first )
295
- end
296
304
end
297
305
end
0 commit comments