apipie-rails 0.9.1 → 0.9.2

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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +75 -0
  3. data/.rubocop_todo.yml +780 -201
  4. data/CHANGELOG.md +8 -0
  5. data/app/controllers/apipie/apipies_controller.rb +5 -6
  6. data/lib/apipie/apipie_module.rb +2 -2
  7. data/lib/apipie/application.rb +6 -6
  8. data/lib/apipie/configuration.rb +11 -11
  9. data/lib/apipie/dsl_definition.rb +11 -10
  10. data/lib/apipie/error_description.rb +2 -2
  11. data/lib/apipie/extractor/writer.rb +11 -11
  12. data/lib/apipie/generator/swagger/context.rb +27 -0
  13. data/lib/apipie/generator/swagger/operation_id.rb +51 -0
  14. data/lib/apipie/generator/swagger/param_description/builder.rb +105 -0
  15. data/lib/apipie/generator/swagger/param_description/composite.rb +111 -0
  16. data/lib/apipie/generator/swagger/param_description/description.rb +15 -0
  17. data/lib/apipie/generator/swagger/param_description/in.rb +37 -0
  18. data/lib/apipie/generator/swagger/param_description/name.rb +18 -0
  19. data/lib/apipie/generator/swagger/param_description/type.rb +108 -0
  20. data/lib/apipie/generator/swagger/param_description.rb +18 -0
  21. data/lib/apipie/generator/swagger/type_extractor.rb +2 -2
  22. data/lib/apipie/method_description.rb +4 -5
  23. data/lib/apipie/param_description.rb +7 -7
  24. data/lib/apipie/resource_description.rb +3 -3
  25. data/lib/apipie/response_description.rb +2 -2
  26. data/lib/apipie/response_description_adapter.rb +7 -5
  27. data/lib/apipie/swagger_generator.rb +54 -202
  28. data/lib/apipie/validator.rb +3 -3
  29. data/lib/apipie/version.rb +1 -1
  30. data/lib/apipie-rails.rb +9 -0
  31. data/lib/tasks/apipie.rake +5 -6
  32. data/spec/controllers/users_controller_spec.rb +3 -2
  33. data/spec/lib/generator/swagger/context_spec.rb +35 -0
  34. data/spec/lib/generator/swagger/operation_id_spec.rb +63 -0
  35. data/spec/lib/generator/swagger/param_description/builder_spec.rb +163 -0
  36. data/spec/lib/generator/swagger/param_description/composite_spec.rb +95 -0
  37. data/spec/lib/generator/swagger/param_description/description_spec.rb +79 -0
  38. data/spec/lib/generator/swagger/param_description/in_spec.rb +86 -0
  39. data/spec/lib/generator/swagger/param_description/name_spec.rb +81 -0
  40. data/spec/lib/generator/swagger/param_description/type_spec.rb +178 -0
  41. data/spec/lib/generator/swagger/param_description_spec.rb +28 -0
  42. data/spec/lib/generator/swagger/type_extractor_spec.rb +38 -18
  43. data/spec/lib/param_group_spec.rb +5 -5
  44. metadata +20 -2
@@ -0,0 +1,108 @@
1
+ class Apipie::Generator::Swagger::ParamDescription::Type
2
+ def initialize(param_description, with_null:, controller_method:)
3
+ @param_description = param_description
4
+ @with_null = with_null
5
+ @controller_method = controller_method
6
+ end
7
+
8
+ # @return [Hash]
9
+ def to_hash
10
+ type_definition = {}
11
+
12
+ case type.to_s
13
+ when 'array'
14
+ type_definition.merge!(for_array_type)
15
+ when 'enum'
16
+ type_definition.merge!(for_enum_type)
17
+ when 'object'
18
+ # We only get here if there is no specification
19
+ # of properties for this object.
20
+ type_definition.merge!(for_object_type)
21
+ warn_hash_without_internal_typespec
22
+ else
23
+ type_definition.merge!({ type: type.to_s })
24
+ end
25
+
26
+ if @param_description.is_array?
27
+ type_definition = {
28
+ items: type_definition,
29
+ type: 'array'
30
+ }
31
+
32
+ if @with_null
33
+ type_definition[:type] = [type_definition[:type], 'null']
34
+ end
35
+ end
36
+
37
+ if @with_null
38
+ type_definition[:type] = [type_definition[:type], 'null']
39
+ end
40
+
41
+ type_definition
42
+ end
43
+
44
+ private
45
+
46
+ def params_in_body_use_reference?
47
+ Apipie.configuration.swagger_json_input_uses_refs
48
+ end
49
+
50
+ # @return [Apipie::Generator::Swagger::Type, String]
51
+ def type
52
+ @_type ||= Apipie::Generator::Swagger::TypeExtractor.
53
+ new(validator).
54
+ extract
55
+ end
56
+
57
+ def for_array_type
58
+ validator_opts = validator.param_description.options
59
+ items_type = validator_opts[:of].to_s || validator_opts[:array_of].to_s
60
+
61
+ if items_type == 'Hash' && params_in_body_use_reference?
62
+ reference_name = Apipie::Generator::Swagger::OperationId.
63
+ from(@param_description.method_description, param: @param_description.name).
64
+ to_s
65
+
66
+ items = {
67
+ '$ref' => reference_name
68
+ }
69
+ else
70
+ items = { type: 'string' }
71
+ end
72
+
73
+ enum = @param_description.options[:in]
74
+
75
+ items[:enum] = enum if enum.present?
76
+
77
+ {
78
+ type: 'array',
79
+ items: items
80
+ }
81
+ end
82
+
83
+ def for_enum_type
84
+ {
85
+ type: 'string',
86
+ enum: @param_description.validator.values
87
+ }
88
+ end
89
+
90
+ def for_object_type
91
+ {
92
+ type: 'object',
93
+ additionalProperties: true
94
+ }
95
+ end
96
+
97
+ def validator
98
+ @_validator ||= @param_description.validator
99
+ end
100
+
101
+ def warn_hash_without_internal_typespec
102
+ Apipie::Generator::Swagger::Warning.for_code(
103
+ Apipie::Generator::Swagger::Warning::HASH_WITHOUT_INTERNAL_TYPESPEC_CODE,
104
+ @controller_method,
105
+ { parameter: @param_description.name }
106
+ ).warn_through_writer
107
+ end
108
+ end
@@ -0,0 +1,18 @@
1
+ module Apipie::Generator::Swagger::ParamDescription
2
+ # @param [Apipie::MethodDescription] method_description
3
+ # @param [String] name
4
+ #
5
+ # @return [Apipie::ParamDescription]
6
+ def self.create_for_missing_param(method_description, name)
7
+ Apipie::ParamDescription.new(
8
+ method_description,
9
+ name,
10
+ Numeric,
11
+ {
12
+ in: "path",
13
+ required: true,
14
+ added_from_path: true,
15
+ }
16
+ )
17
+ end
18
+ end
@@ -34,8 +34,6 @@ class Apipie::Generator::Swagger::TypeExtractor
34
34
  extract
35
35
  end
36
36
 
37
- private
38
-
39
37
  def extract
40
38
  expected_type =
41
39
  if string?
@@ -51,6 +49,8 @@ class Apipie::Generator::Swagger::TypeExtractor
51
49
  TYPES[expected_type] || @validator.expected_type
52
50
  end
53
51
 
52
+ private
53
+
54
54
  def string?
55
55
  @validator.blank?
56
56
  end
@@ -10,8 +10,7 @@ module Apipie
10
10
  @from_concern = dsl_data[:from_concern]
11
11
  @apis = ApisService.new(resource, method, dsl_data).call
12
12
 
13
- desc = dsl_data[:description] || ''
14
- @full_description = Apipie.markup_to_html(desc)
13
+ @full_description = dsl_data[:description] || ''
15
14
 
16
15
  @errors = dsl_data[:errors].map do |args|
17
16
  Apipie::ErrorDescription.from_dsl_data(args)
@@ -40,7 +39,7 @@ module Apipie
40
39
  @params_ordered = ParamDescription.unify(@params_ordered)
41
40
  @headers = dsl_data[:headers]
42
41
 
43
- @show = if dsl_data.has_key? :show
42
+ @show = if dsl_data.key? :show
44
43
  dsl_data[:show]
45
44
  else
46
45
  true
@@ -166,8 +165,8 @@ module Apipie
166
165
  :name => @method,
167
166
  :apis => method_apis_to_json(lang),
168
167
  :formats => formats,
169
- :full_description => Apipie.app.translate(@full_description, lang),
170
- :errors => errors.map(&:to_json),
168
+ :full_description => Apipie.markup_to_html(Apipie.app.translate(@full_description, lang)),
169
+ :errors => errors.map{ |error| error.to_json(lang) }.flatten,
171
170
  :params => params_ordered.map{ |param| param.to_json(lang) }.flatten,
172
171
  :returns => @returns.map{ |return_item| return_item.to_json(lang) }.flatten,
173
172
  :examples => @examples,
@@ -12,9 +12,9 @@ module Apipie
12
12
  attr_reader :additional_properties, :is_array
13
13
  attr_accessor :parent, :required
14
14
 
15
- alias_method :response_only?, :response_only
16
- alias_method :request_only?, :request_only
17
- alias_method :is_array?, :is_array
15
+ alias response_only? response_only
16
+ alias request_only? request_only
17
+ alias is_array? is_array
18
18
 
19
19
  def self.from_dsl_data(method_description, args)
20
20
  param_name, validator, desc_or_options, options, block = args
@@ -71,7 +71,7 @@ module Apipie
71
71
  @request_only = (@options[:only_in] == :request)
72
72
  raise ArgumentError.new("'#{@options[:only_in]}' is not a valid value for :only_in") if (!@response_only && !@request_only) && @options[:only_in].present?
73
73
 
74
- @show = if @options.has_key? :show
74
+ @show = if @options.key? :show
75
75
  @options[:show]
76
76
  else
77
77
  true
@@ -212,7 +212,7 @@ module Apipie
212
212
  # action awareness is being inherited from ancestors (in terms of
213
213
  # nested params)
214
214
  def action_aware?
215
- if @options.has_key?(:action_aware)
215
+ if @options.key?(:action_aware)
216
216
  return @options[:action_aware]
217
217
  elsif @parent
218
218
  @parent.action_aware?
@@ -237,7 +237,7 @@ module Apipie
237
237
  # crate/update actions.
238
238
  def action_awareness
239
239
  if action_aware?
240
- if !@options.has_key?(:allow_nil)
240
+ if !@options.key?(:allow_nil)
241
241
  if @required
242
242
  @allow_nil = false
243
243
  else
@@ -268,7 +268,7 @@ module Apipie
268
268
  end
269
269
 
270
270
  def is_required?
271
- if @options.has_key?(:required)
271
+ if @options.key?(:required)
272
272
  if (@options[:required] == true) || (@options[:required] == false)
273
273
  @options[:required]
274
274
  else
@@ -35,7 +35,7 @@ module Apipie
35
35
 
36
36
  def update_from_dsl_data(dsl_data)
37
37
  @_name = dsl_data[:resource_name] if dsl_data[:resource_name]
38
- @_full_description = Apipie.markup_to_html(dsl_data[:description])
38
+ @_full_description = dsl_data[:description]
39
39
  @_short_description = dsl_data[:short_description]
40
40
  @_path = dsl_data[:path] || ""
41
41
  @_formats = dsl_data[:formats]
@@ -71,7 +71,7 @@ module Apipie
71
71
  end
72
72
 
73
73
  def remove_method_description(method_name)
74
- if @_methods.has_key?(method_name)
74
+ if @_methods.key?(method_name)
75
75
  @_methods.delete(method_name)
76
76
  end
77
77
  end
@@ -110,7 +110,7 @@ module Apipie
110
110
  :api_url => api_url,
111
111
  :name => @_name,
112
112
  :short_description => Apipie.app.translate(@_short_description, lang),
113
- :full_description => Apipie.app.translate(@_full_description, lang),
113
+ :full_description => Apipie.markup_to_html(Apipie.app.translate(@_full_description, lang)),
114
114
  :version => _version,
115
115
  :formats => @_formats,
116
116
  :metadata => @_metadata,
@@ -116,12 +116,12 @@ module Apipie
116
116
  def additional_properties
117
117
  !!@response_object.additional_properties
118
118
  end
119
- alias :allow_additional_properties :additional_properties
119
+ alias allow_additional_properties additional_properties
120
120
 
121
121
  def to_json(lang=nil)
122
122
  {
123
123
  :code => code,
124
- :description => description,
124
+ :description => Apipie.app.translate(description, lang),
125
125
  :is_array => is_array?,
126
126
  :returns_object => params_ordered.map{ |param| param.to_json(lang).tap{|h| h.delete(:validations) }}.flatten,
127
127
  :additional_properties => additional_properties,
@@ -107,9 +107,10 @@ module Apipie
107
107
 
108
108
  def add_sub_property(prop_desc)
109
109
  raise "Only properties with expected_type 'object' can have sub-properties" unless @expected_type == 'object'
110
- if prop_desc.is_a? PropDesc
110
+ case prop_desc
111
+ when PropDesc
111
112
  @sub_properties << prop_desc
112
- elsif prop_desc.is_a? Modifier
113
+ when Modifier
113
114
  prop_desc.apply(self)
114
115
  else
115
116
  raise "Unrecognized prop_desc type (#{prop_desc.class})"
@@ -130,7 +131,7 @@ module Apipie
130
131
  attr_reader :name, :required, :expected_type, :options, :description
131
132
  attr_accessor :additional_properties
132
133
 
133
- alias_method :desc, :description
134
+ alias desc description
134
135
 
135
136
  def is_array?
136
137
  @is_array
@@ -170,9 +171,10 @@ module Apipie
170
171
  end
171
172
 
172
173
  def add(prop_desc)
173
- if prop_desc.is_a? PropDesc
174
+ case prop_desc
175
+ when PropDesc
174
176
  @property_descs << prop_desc
175
- elsif prop_desc.is_a? Modifier
177
+ when Modifier
176
178
  prop_desc.apply(self)
177
179
  else
178
180
  raise "Unrecognized prop_desc type (#{prop_desc.class})"
@@ -36,7 +36,6 @@ module Apipie
36
36
  def generate_from_resources(version, resources, method_name, lang, clear_warnings=false)
37
37
  init_swagger_vars(version, lang, clear_warnings)
38
38
 
39
- @lang = lang
40
39
  @only_method = method_name
41
40
  add_resources(resources)
42
41
 
@@ -143,13 +142,6 @@ module Apipie
143
142
  warn(Apipie::Generator::Swagger::Warning::NO_RETURN_CODES_SPECIFIED_CODE)
144
143
  end
145
144
 
146
- def warn_hash_without_internal_typespec(param_name)
147
- warn(
148
- Apipie::Generator::Swagger::Warning::HASH_WITHOUT_INTERNAL_TYPESPEC_CODE,
149
- { parameter: param_name }
150
- )
151
- end
152
-
153
145
  def warn_optional_param_in_path(param_name)
154
146
  warn(
155
147
  Apipie::Generator::Swagger::Warning::OPTIONAL_PARAM_IN_PATH_CODE,
@@ -261,7 +253,7 @@ module Apipie
261
253
  warning_tags = []
262
254
  end
263
255
 
264
- op_id = swagger_op_id_for_path(api.http_method, api.path)
256
+ op_id = Apipie::Generator::Swagger::OperationId.from(api).to_s
265
257
 
266
258
  include_op_id_in_computed_interface_id(op_id)
267
259
 
@@ -275,7 +267,7 @@ module Apipie
275
267
  summary: Apipie.app.translate(api.short_description, @current_lang),
276
268
  parameters: swagger_params_array_for_method(ruby_method, api.path),
277
269
  responses: responses,
278
- description: ruby_method.full_description
270
+ description: Apipie.app.translate(ruby_method.full_description, @current_lang)
279
271
  }
280
272
 
281
273
  if methods[method_key][:summary].nil?
@@ -283,6 +275,7 @@ module Apipie
283
275
  warn_missing_method_summary
284
276
  end
285
277
  end
278
+
286
279
  end
287
280
 
288
281
  #--------------------------------------------------------------------------
@@ -308,16 +301,6 @@ module Apipie
308
301
  remove_colons method.resource.controller.name + "::" + method.method
309
302
  end
310
303
 
311
- def swagger_id_for_typename(typename)
312
- typename
313
- end
314
-
315
- def swagger_op_id_for_path(http_method, path)
316
- # using lowercase http method, because the 'swagger-codegen' tool outputs
317
- # strange method names if the http method is in uppercase
318
- http_method.downcase + path.gsub(/\//,'_').gsub(/:(\w+)/, '\1').gsub(/_$/,'')
319
- end
320
-
321
304
  def swagger_param_type(param_desc)
322
305
  if param_desc.blank?
323
306
  raise ArgumentError, 'param_desc is required'
@@ -343,11 +326,10 @@ module Apipie
343
326
  def json_schema_for_method_response(method, return_code, allow_nulls)
344
327
  @definitions = {}
345
328
  for response in method.returns
346
- if response.code.to_s == return_code.to_s
347
- schema = response_schema(response, allow_nulls) if response.code.to_s == return_code.to_s
348
- schema[:definitions] = @definitions if @definitions != {}
349
- return schema
350
- end
329
+ next unless response.code.to_s == return_code.to_s
330
+ schema = response_schema(response, allow_nulls)
331
+ schema[:definitions] = @definitions if @definitions != {}
332
+ return schema
351
333
  end
352
334
  nil
353
335
  end
@@ -364,9 +346,22 @@ module Apipie
364
346
  @disable_default_value_warning = true
365
347
 
366
348
  if responses_use_reference? && response.typename
367
- schema = {"$ref" => gen_referenced_block_from_params_array(swagger_id_for_typename(response.typename), response.params_ordered, allow_nulls)}
349
+ schema = {
350
+ "$ref" => gen_referenced_block_from_params_array(
351
+ response.typename,
352
+ response.params_ordered,
353
+ allow_nulls
354
+ )
355
+ }
368
356
  else
369
- schema = json_schema_obj_from_params_array(response.params_ordered, allow_nulls)
357
+ schema = Apipie::Generator::Swagger::ParamDescription::Composite.new(
358
+ response.params_ordered,
359
+ Apipie::Generator::Swagger::Context.new(
360
+ allow_null: allow_nulls,
361
+ http_method: @current_http_method,
362
+ controller_method: @current_method
363
+ )
364
+ ).to_swagger
370
365
  end
371
366
 
372
367
  ensure
@@ -397,7 +392,7 @@ module Apipie
397
392
 
398
393
  for response in method.returns
399
394
  swagger_response_block = {
400
- description: response.description
395
+ description: Apipie.app.translate(response.description, @current_lang)
401
396
  }
402
397
 
403
398
  schema = response_schema(response)
@@ -434,105 +429,14 @@ module Apipie
434
429
 
435
430
  missing.each do |name|
436
431
  warn_path_parameter_not_described(name, path)
437
- result[name.to_sym] = OpenStruct.new({
438
- required: true,
439
- _gen_added_from_path: true,
440
- name: name,
441
- validator: Apipie::Validator::NumberValidator.new(nil),
442
- options: {
443
- in: "path"
444
- }
445
- })
446
- end
447
-
448
- result
449
- end
450
-
451
- #--------------------------------------------------------------------------
452
- # The core routine for creating a swagger parameter definition block.
453
- # The output is slightly different when the parameter is inside a schema block.
454
- #--------------------------------------------------------------------------
455
- def swagger_atomic_param(param_desc, in_schema, name, allow_nulls)
456
- def save_field(entry, openapi_key, v, apipie_key=openapi_key, translate=false)
457
- if v.key?(apipie_key)
458
- if translate
459
- entry[openapi_key] = Apipie.app.translate(v[apipie_key], @current_lang)
460
- else
461
- entry[openapi_key] = v[apipie_key]
462
- end
463
- end
464
- end
465
-
466
- swagger_def = {}
467
- swagger_def[:name] = name if !name.nil?
468
-
469
- swg_param_type = swagger_param_type(param_desc)
470
- swagger_def[:type] = swg_param_type.to_s
471
- if (swg_param_type.is_a? Apipie::Generator::Swagger::Type) && !swg_param_type.str_format.nil?
472
- swagger_def[:format] = swg_param_type.str_format
473
- end
474
-
475
- if swagger_def[:type] == "array"
476
- array_of_validator_opts = param_desc.validator.param_description.options
477
- items_type = array_of_validator_opts[:of].to_s || array_of_validator_opts[:array_of].to_s
478
- if items_type == "Hash"
479
- ref_name = "#{swagger_op_id_for_path(param_desc.method_description.apis.first.http_method, param_desc.method_description.apis.first.path)}_param_#{param_desc.name}"
480
- swagger_def[:items] = {"$ref" => gen_referenced_block_from_params_array(ref_name, param_desc.validator.param_description.validator.params_ordered, allow_nulls)}
481
- else
482
- swagger_def[:items] = {type: "string"}
483
- end
484
-
485
- enum = param_desc.options.fetch(:in, [])
486
- swagger_def[:items][:enum] = enum if enum.any?
487
- end
488
-
489
- if swagger_def[:type] == "enum"
490
- swagger_def[:type] = "string"
491
- swagger_def[:enum] = param_desc.validator.values
492
- end
493
432
 
494
- if swagger_def[:type] == "object" # we only get here if there is no specification of properties for this object
495
- swagger_def[:additionalProperties] = true
496
- warn_hash_without_internal_typespec(param_desc.name)
433
+ result[name.to_sym] = Apipie::Generator::Swagger::ParamDescription.
434
+ create_for_missing_param(method, name)
497
435
  end
498
436
 
499
- if param_desc.is_array?
500
- new_swagger_def = {
501
- items: swagger_def,
502
- type: 'array'
503
- }
504
- swagger_def = new_swagger_def
505
- if allow_nulls
506
- swagger_def[:type] = [swagger_def[:type], "null"]
507
- end
508
- end
509
-
510
- if allow_nulls
511
- swagger_def[:type] = [swagger_def[:type], "null"]
512
- end
513
-
514
- if !in_schema
515
- # the "name" and "in" keys can only be set on root parameters (non-nested)
516
- swagger_def[:in] = @default_value_for_param_in if name.present?
517
- swagger_def[:required] = param_desc.required if param_desc.required
518
- end
519
-
520
- save_field(swagger_def, :description, param_desc.options, :desc, true) unless param_desc.options[:desc].nil?
521
- save_field(swagger_def, :default, param_desc.options, :default_value)
522
-
523
- if param_desc.respond_to?(:_gen_added_from_path) && !param_desc.required
524
- warn_optional_param_in_path(param_desc.name)
525
- swagger_def[:required] = true
526
- end
527
-
528
- if !swagger_def[:required] && !swagger_def.key?(:default)
529
- warn_optional_without_default_value(param_desc.name) unless @disable_default_value_warning
530
- end
531
-
532
- swagger_def
437
+ result
533
438
  end
534
439
 
535
-
536
440
  #--------------------------------------------------------------------------
537
441
  # JSON schema and referenced-object generation
538
442
  #--------------------------------------------------------------------------
@@ -541,79 +445,24 @@ module Apipie
541
445
  "#/definitions/#{name}"
542
446
  end
543
447
 
544
-
545
- def json_schema_obj_from_params_array(params_array, allow_nulls = false)
546
- (param_defs, required_params) = json_schema_param_defs_from_params_array(params_array, allow_nulls)
547
-
548
- result = {type: "object"}
549
- result[:properties] = param_defs
550
- result[:additionalProperties] = false unless Apipie.configuration.swagger_allow_additional_properties_in_response
551
- result[:required] = required_params if required_params.length > 0
552
-
553
- param_defs.length > 0 ? result : nil
554
- end
555
-
556
448
  def gen_referenced_block_from_params_array(name, params_array, allow_nulls=false)
557
449
  return ref_to(:name) if @definitions.key(:name)
558
450
 
559
- schema_obj = json_schema_obj_from_params_array(params_array, allow_nulls)
451
+ schema_obj = Apipie::Generator::Swagger::ParamDescription::Composite.new(
452
+ params_array,
453
+ Apipie::Generator::Swagger::Context.new(
454
+ allow_null: allow_nulls,
455
+ http_method: @current_http_method,
456
+ controller_method: @current_method
457
+ )
458
+ ).to_swagger
459
+
560
460
  return nil if schema_obj.nil?
561
461
 
562
462
  @definitions[name.to_sym] = schema_obj
563
463
  ref_to(name.to_sym)
564
464
  end
565
465
 
566
- def json_schema_param_defs_from_params_array(params_array, allow_nulls = false)
567
- param_defs = {}
568
- required_params = []
569
-
570
- params_array ||= []
571
-
572
-
573
- for param_desc in params_array
574
- if !param_desc.respond_to?(:required)
575
- # pp param_desc
576
- raise ("unexpected param_desc format")
577
- end
578
-
579
- required_params.push(param_desc.name.to_sym) if param_desc.required
580
-
581
- param_type = swagger_param_type(param_desc)
582
-
583
- if param_type == "object" && param_desc.validator.params_ordered
584
- schema = json_schema_obj_from_params_array(param_desc.validator.params_ordered, allow_nulls)
585
- if param_desc.additional_properties
586
- schema[:additionalProperties] = true
587
- end
588
-
589
- if param_desc.is_array?
590
- new_schema = {
591
- type: 'array',
592
- items: schema
593
- }
594
- schema = new_schema
595
- end
596
-
597
- if allow_nulls
598
- # ideally we would write schema[:type] = ["object", "null"]
599
- # but due to a bug in the json-schema gem, we need to use anyOf
600
- # see https://github.com/ruby-json-schema/json-schema/issues/404
601
- new_schema = {
602
- anyOf: [schema, {type: "null"}]
603
- }
604
- schema = new_schema
605
- end
606
- param_defs[param_desc.name.to_sym] = schema if !schema.nil?
607
- else
608
- param_defs[param_desc.name.to_sym] = swagger_atomic_param(param_desc, true, nil, allow_nulls)
609
- end
610
- end
611
-
612
- [param_defs, required_params]
613
- end
614
-
615
-
616
-
617
466
  #--------------------------------------------------------------------------
618
467
  # swagger "Params" block generation
619
468
  #--------------------------------------------------------------------------
@@ -638,7 +487,15 @@ module Apipie
638
487
  if params_in_body_use_reference?
639
488
  swagger_schema_for_body = {"$ref" => gen_referenced_block_from_params_array("#{swagger_op_id_for_method(method)}_input", body_param_defs_array)}
640
489
  else
641
- swagger_schema_for_body = json_schema_obj_from_params_array(body_param_defs_array)
490
+ swagger_schema_for_body =
491
+ Apipie::Generator::Swagger::ParamDescription::Composite.new(
492
+ body_param_defs_array,
493
+ Apipie::Generator::Swagger::Context.new(
494
+ allow_null: false,
495
+ http_method: @current_http_method,
496
+ controller_method: @current_method
497
+ )
498
+ ).to_swagger
642
499
  end
643
500
 
644
501
  swagger_body_param = {
@@ -675,20 +532,7 @@ module Apipie
675
532
 
676
533
 
677
534
  def add_params_from_hash(swagger_params_array, param_defs, prefix=nil, default_value_for_in=nil)
678
-
679
- if default_value_for_in
680
- @default_value_for_param_in = default_value_for_in
681
- else
682
- if body_allowed_for_current_method
683
- @default_value_for_param_in = "formData"
684
- else
685
- @default_value_for_param_in = "query"
686
- end
687
- end
688
-
689
-
690
535
  param_defs.each do |name, desc|
691
-
692
536
  if !prefix.nil?
693
537
  name = "#{prefix}[#{name}]"
694
538
  end
@@ -701,13 +545,21 @@ module Apipie
701
545
  warn_param_ignored_in_form_data(desc.name)
702
546
  end
703
547
  else
704
- param_entry = swagger_atomic_param(desc, false, name, false)
548
+ param_entry = Apipie::Generator::Swagger::ParamDescription::Builder.
549
+ new(desc, in_schema: false, controller_method: @current_method).
550
+ with_description(language: @current_lang).
551
+ with_name(prefix: prefix).
552
+ with_type(with_null: @allow_null).
553
+ with_in(
554
+ http_method: @current_http_method,
555
+ default_in_value: default_value_for_in
556
+ ).to_swagger
557
+
705
558
  if param_entry[:required]
706
559
  swagger_params_array.unshift(param_entry)
707
560
  else
708
561
  swagger_params_array.push(param_entry)
709
562
  end
710
-
711
563
  end
712
564
  end
713
565
  end
@@ -347,10 +347,10 @@ module Apipie
347
347
  if @hash_params
348
348
  @hash_params.each do |k, p|
349
349
  if Apipie.configuration.validate_presence?
350
- raise ParamMissing.new(p) if p.required && !value.has_key?(k)
350
+ raise ParamMissing.new(p) if p.required && !value.key?(k)
351
351
  end
352
352
  if Apipie.configuration.validate_value?
353
- p.validate(value[k]) if value.has_key?(k)
353
+ p.validate(value[k]) if value.key?(k)
354
354
  end
355
355
  end
356
356
  end
@@ -360,7 +360,7 @@ module Apipie
360
360
  def process_value(value)
361
361
  if @hash_params && value
362
362
  return @hash_params.each_with_object({}) do |(key, param), api_params|
363
- if value.has_key?(key)
363
+ if value.key?(key)
364
364
  api_params[param.as] = param.process_value(value[key])
365
365
  end
366
366
  end