apipie-rails 0.9.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rubocop.yml +2 -2
  3. data/.rubocop.yml +23 -14
  4. data/.rubocop_todo.yml +103 -487
  5. data/CHANGELOG.md +20 -3
  6. data/README.rst +12 -12
  7. data/app/controllers/apipie/apipies_controller.rb +6 -6
  8. data/app/helpers/apipie_helper.rb +1 -1
  9. data/lib/apipie/apipie_module.rb +5 -5
  10. data/lib/apipie/application.rb +81 -55
  11. data/lib/apipie/configuration.rb +19 -26
  12. data/lib/apipie/dsl_definition.rb +8 -9
  13. data/lib/apipie/error_description.rb +1 -1
  14. data/lib/apipie/errors.rb +2 -16
  15. data/lib/apipie/extractor/collector.rb +3 -3
  16. data/lib/apipie/extractor/recorder.rb +1 -1
  17. data/lib/apipie/extractor.rb +2 -2
  18. data/lib/apipie/generator/config.rb +12 -0
  19. data/lib/apipie/generator/swagger/computed_interface_id.rb +23 -0
  20. data/lib/apipie/generator/swagger/config.rb +78 -0
  21. data/lib/apipie/generator/swagger/context.rb +12 -1
  22. data/lib/apipie/generator/swagger/method_description/api_decorator.rb +20 -0
  23. data/lib/apipie/generator/swagger/method_description/api_schema_service.rb +86 -0
  24. data/lib/apipie/generator/swagger/method_description/decorator.rb +22 -0
  25. data/lib/apipie/generator/swagger/method_description/parameters_service.rb +139 -0
  26. data/lib/apipie/generator/swagger/method_description/response_schema_service.rb +46 -0
  27. data/lib/apipie/generator/swagger/method_description/response_service.rb +58 -0
  28. data/lib/apipie/generator/swagger/method_description.rb +2 -0
  29. data/lib/apipie/generator/swagger/operation_id.rb +2 -2
  30. data/lib/apipie/generator/swagger/param_description/builder.rb +4 -4
  31. data/lib/apipie/generator/swagger/param_description/composite.rb +9 -1
  32. data/lib/apipie/generator/swagger/param_description/in.rb +1 -1
  33. data/lib/apipie/generator/swagger/param_description/path_params_composite.rb +61 -0
  34. data/lib/apipie/generator/swagger/param_description/referenced_composite.rb +36 -0
  35. data/lib/apipie/generator/swagger/param_description/type.rb +9 -2
  36. data/lib/apipie/generator/swagger/path_decorator.rb +36 -0
  37. data/lib/apipie/generator/swagger/referenced_definitions.rb +17 -0
  38. data/lib/apipie/generator/swagger/resource_description_collection.rb +30 -0
  39. data/lib/apipie/generator/swagger/resource_description_composite.rb +56 -0
  40. data/lib/apipie/generator/swagger/schema.rb +63 -0
  41. data/lib/apipie/generator/swagger/type_extractor.rb +0 -19
  42. data/lib/apipie/generator/swagger/warning.rb +3 -6
  43. data/lib/apipie/generator/swagger/warning_writer.rb +7 -1
  44. data/lib/apipie/helpers.rb +3 -3
  45. data/lib/apipie/method_description.rb +5 -3
  46. data/lib/apipie/param_description.rb +4 -2
  47. data/lib/apipie/resource_description.rb +11 -8
  48. data/lib/apipie/response_description.rb +1 -1
  49. data/lib/apipie/response_description_adapter.rb +3 -3
  50. data/lib/apipie/routing.rb +1 -1
  51. data/lib/apipie/rspec/response_validation_helper.rb +1 -1
  52. data/lib/apipie/swagger_generator.rb +27 -551
  53. data/lib/apipie/validator.rb +9 -5
  54. data/lib/apipie/version.rb +1 -1
  55. data/lib/apipie-rails.rb +17 -0
  56. data/lib/tasks/apipie.rake +25 -20
  57. data/spec/controllers/api/v2/nested/resources_controller_spec.rb +2 -2
  58. data/spec/controllers/pets_controller_spec.rb +10 -16
  59. data/spec/controllers/users_controller_spec.rb +2 -2
  60. data/spec/dummy/app/controllers/pets_controller.rb +4 -4
  61. data/spec/dummy/app/controllers/pets_using_self_describing_classes_controller.rb +2 -2
  62. data/spec/dummy/app/controllers/twitter_example_controller.rb +2 -2
  63. data/spec/dummy/app/controllers/users_controller.rb +5 -5
  64. data/spec/dummy/config.ru +1 -1
  65. data/spec/lib/apipie/apipies_controller_spec.rb +4 -0
  66. data/spec/lib/apipie/application_spec.rb +25 -15
  67. data/spec/lib/apipie/configuration_spec.rb +15 -0
  68. data/spec/lib/apipie/generator/swagger/config_spec.rb +19 -0
  69. data/spec/lib/apipie/generator/swagger/context_spec.rb +23 -2
  70. data/spec/lib/apipie/generator/swagger/method_description/api_schema_service_spec.rb +106 -0
  71. data/spec/lib/apipie/generator/swagger/method_description/response_schema_service_spec.rb +105 -0
  72. data/spec/lib/apipie/generator/swagger/param_description/builder_spec.rb +1 -1
  73. data/spec/lib/apipie/generator/swagger/param_description/composite_spec.rb +2 -2
  74. data/spec/lib/apipie/generator/swagger/param_description/type_spec.rb +7 -7
  75. data/spec/lib/apipie/generator/swagger/path_decorator_spec.rb +57 -0
  76. data/spec/lib/apipie/generator/swagger/referenced_definitions_spec.rb +35 -0
  77. data/spec/lib/apipie/generator/swagger/resource_description_composite_spec.rb +37 -0
  78. data/spec/lib/apipie/generator/swagger/resource_descriptions_collection_spec.rb +57 -0
  79. data/spec/lib/apipie/generator/swagger/schema_spec.rb +89 -0
  80. data/spec/lib/apipie/generator/swagger/type_extractor_spec.rb +0 -43
  81. data/spec/lib/apipie/generator/swagger/warning_spec.rb +1 -1
  82. data/spec/lib/apipie/generator/swagger/warning_writer_spec.rb +19 -7
  83. data/spec/lib/apipie/method_description_spec.rb +101 -66
  84. data/spec/lib/apipie/no_documented_method_spec.rb +17 -0
  85. data/spec/lib/apipie/param_description_spec.rb +209 -49
  86. data/spec/lib/apipie/param_group_spec.rb +1 -0
  87. data/spec/lib/apipie/resource_description_spec.rb +71 -28
  88. data/spec/lib/apipie/response_does_not_match_swagger_schema_spec.rb +35 -0
  89. data/spec/lib/apipie/swagger_generator_spec.rb +94 -0
  90. data/spec/lib/apipie/validator_spec.rb +47 -11
  91. data/spec/lib/rake_spec.rb +1 -1
  92. data/spec/lib/swagger/rake_swagger_spec.rb +6 -6
  93. data/spec/lib/swagger/swagger_dsl_spec.rb +17 -11
  94. data/spec/lib/validators/array_validator_spec.rb +1 -1
  95. data/spec/spec_helper.rb +2 -2
  96. metadata +31 -3
@@ -74,7 +74,7 @@ class Apipie::Generator::Swagger::ParamDescription::Composite
74
74
  end
75
75
  end
76
76
 
77
- if !Apipie.configuration.swagger_allow_additional_properties_in_response
77
+ if !Apipie.configuration.generator.swagger.allow_additional_properties_in_response
78
78
  @schema[:additionalProperties] = false
79
79
  end
80
80
 
@@ -85,6 +85,14 @@ class Apipie::Generator::Swagger::ParamDescription::Composite
85
85
  @schema
86
86
  end
87
87
 
88
+ # @param [Symbol, String] param_type
89
+ #
90
+ # @return [Apipie::Generator::Swagger::ParamDescription::ReferencedComposite]
91
+ def referenced(param_type)
92
+ Apipie::Generator::Swagger::ParamDescription::ReferencedComposite.
93
+ new(self, param_type)
94
+ end
95
+
88
96
  private
89
97
 
90
98
  def for_array(schema)
@@ -32,6 +32,6 @@ class Apipie::Generator::Swagger::ParamDescription::In
32
32
  end
33
33
 
34
34
  def body_allowed_for_current_method?
35
- ['get', 'head'].exclude?(@http_method)
35
+ %w[get head].exclude?(@http_method)
36
36
  end
37
37
  end
@@ -0,0 +1,61 @@
1
+ class Apipie::Generator::Swagger::ParamDescription::PathParamsComposite
2
+ # @param [Array<Apipie::ParamDescription>] param_descriptions
3
+ # @param [Apipie::Generator::Swagger::Context] context
4
+ def initialize(param_descriptions, context)
5
+ @param_descriptions = param_descriptions
6
+ @context = context
7
+ @result = []
8
+ end
9
+
10
+ # @return [Array]
11
+ def to_swagger
12
+ @param_descriptions.each do |desc|
13
+ context = @context.dup
14
+
15
+ type = Apipie::Generator::Swagger::TypeExtractor.new(desc.validator).extract
16
+
17
+ if type == 'object' && desc.validator.params_ordered.blank?
18
+ warn_param_ignored_in_form_data(desc.name)
19
+ next
20
+ end
21
+
22
+ has_nested_params = type == 'object' &&
23
+ desc.validator.params_ordered.present?
24
+
25
+ if has_nested_params
26
+ context.add_to_prefix!(desc.name)
27
+
28
+ out = Apipie::Generator::Swagger::ParamDescription::PathParamsComposite
29
+ .new(desc.validator.params_ordered, context)
30
+ .to_swagger
31
+
32
+ @result.concat(out)
33
+ else
34
+ param_entry =
35
+ Apipie::Generator::Swagger::ParamDescription::Builder
36
+ .new(desc, in_schema: false, controller_method: context.controller_method)
37
+ .with_description(language: context.language)
38
+ .with_name(prefix: context.prefix)
39
+ .with_type(with_null: context.allow_null?)
40
+ .with_in(
41
+ http_method: context.http_method,
42
+ default_in_value: context.default_in_value
43
+ ).to_swagger
44
+
45
+ @result << param_entry
46
+ end
47
+ end
48
+
49
+ @result.sort_by { |p| p[:required] ? 0 : 1 }
50
+ end
51
+
52
+ private
53
+
54
+ def warn_param_ignored_in_form_data(name)
55
+ Apipie::Generator::Swagger::Warning.for_code(
56
+ Apipie::Generator::Swagger::Warning::PARAM_IGNORED_IN_FORM_DATA_CODE,
57
+ @context.controller_method.ruby_name,
58
+ { parameter: name }
59
+ ).warn_through_writer
60
+ end
61
+ end
@@ -0,0 +1,36 @@
1
+ # A Composite that keeps track when a param description has been added to references
2
+ # and returns the reference instead of the complete object
3
+ class Apipie::Generator::Swagger::ParamDescription::ReferencedComposite
4
+ # @param [Apipie::Generator::Swagger::ParamDescription::Composite] composite
5
+ # @param [Symbol, String] param_type
6
+ def initialize(composite, param_type)
7
+ @composite = composite
8
+ @param_type = param_type.to_sym
9
+ end
10
+
11
+ def to_swagger
12
+ return ref_to(:name) if added?(:name)
13
+
14
+ schema_obj = @composite.to_swagger
15
+
16
+ return nil if schema_obj.nil?
17
+
18
+ add(schema_obj)
19
+
20
+ { '$ref' => ref_to(@param_type) }
21
+ end
22
+
23
+ private
24
+
25
+ def ref_to(name)
26
+ "#/definitions/#{name}"
27
+ end
28
+
29
+ def add(schema)
30
+ Apipie::Generator::Swagger::ReferencedDefinitions.instance.add!(@param_type, schema)
31
+ end
32
+
33
+ def added?(name)
34
+ Apipie::Generator::Swagger::ReferencedDefinitions.instance.added?(name)
35
+ end
36
+ end
@@ -44,7 +44,7 @@ class Apipie::Generator::Swagger::ParamDescription::Type
44
44
  private
45
45
 
46
46
  def params_in_body_use_reference?
47
- Apipie.configuration.swagger_json_input_uses_refs
47
+ Apipie.configuration.generator.swagger.json_input_uses_refs
48
48
  end
49
49
 
50
50
  # @return [Apipie::Generator::Swagger::Type, String]
@@ -99,9 +99,16 @@ class Apipie::Generator::Swagger::ParamDescription::Type
99
99
  end
100
100
 
101
101
  def warn_hash_without_internal_typespec
102
+ method_id =
103
+ if @param_description.is_a?(Apipie::ResponseDescriptionAdapter::PropDesc)
104
+ @controller_method.method
105
+ else
106
+ Apipie::Generator::Swagger::MethodDescription::Decorator.new(@param_description.method_description).ruby_name
107
+ end
108
+
102
109
  Apipie::Generator::Swagger::Warning.for_code(
103
110
  Apipie::Generator::Swagger::Warning::HASH_WITHOUT_INTERNAL_TYPESPEC_CODE,
104
- @controller_method,
111
+ method_id,
105
112
  { parameter: @param_description.name }
106
113
  ).warn_through_writer
107
114
  end
@@ -0,0 +1,36 @@
1
+ class Apipie::Generator::Swagger::PathDecorator < SimpleDelegator
2
+ def param_names
3
+ @param_names ||= scan(/:(\w+)/).map { |ar| ar[0].to_sym }
4
+ end
5
+
6
+ # @param [Symbol] param_name
7
+ def param?(param_name)
8
+ param_names.include?(param_name)
9
+ end
10
+
11
+ # @param [String] controller_method
12
+ #
13
+ # @return [Apipie::Generator::Swagger::PathDecorator]
14
+ def swagger_path(controller_method = nil)
15
+ current_path = gsub(/:(\w+)/, '{\1}').gsub(%r{/$}, '')
16
+
17
+ unless current_path.starts_with?('/')
18
+ warn_for_missing_slash(controller_method) if controller_method.present?
19
+
20
+ current_path = "/#{current_path}"
21
+ end
22
+
23
+ current_path
24
+ end
25
+
26
+ private
27
+
28
+ # @param [String] controller_method
29
+ def warn_for_missing_slash(controller_method)
30
+ Apipie::Generator::Swagger::Warning.for_code(
31
+ Apipie::Generator::Swagger::Warning::ADDED_MISSING_SLASH_CODE,
32
+ controller_method,
33
+ { path: self }
34
+ ).warn_through_writer
35
+ end
36
+ end
@@ -0,0 +1,17 @@
1
+ class Apipie::Generator::Swagger::ReferencedDefinitions
2
+ include Singleton
3
+
4
+ attr_reader :definitions
5
+
6
+ def initialize
7
+ @definitions = {}
8
+ end
9
+
10
+ def add!(param_type, schema)
11
+ @definitions[param_type] = schema
12
+ end
13
+
14
+ def added?(name)
15
+ @definitions.key?(name)
16
+ end
17
+ end
@@ -0,0 +1,30 @@
1
+ class Apipie::Generator::Swagger::ResourceDescriptionsCollection
2
+ # @param [Hash{String->Apipie::ResourceDescription}] resource_descriptions
3
+ def initialize(resource_descriptions)
4
+ @resource_descriptions = resource_descriptions
5
+ end
6
+
7
+ # @return [Array<Apipie::ResourceDescription>]
8
+ def filter(version:, resource_id:, method_name: nil)
9
+ resources = []
10
+
11
+ # If resource_id is blank, take just resources which have some methods because
12
+ # we dont want to show eg ApplicationController as resource
13
+ # otherwise, take only the specified resource
14
+ @resource_descriptions[version].each do |resource_description_id, resource_description|
15
+ if (resource_id.blank? && resource_description._methods.present?) || resource_description_id == resource_id
16
+ resources << resource_description
17
+ end
18
+ end
19
+
20
+ if method_name.present?
21
+ resources = resources.select do |resource_description|
22
+ resource_description._methods.select do |method_description_name, _|
23
+ method_description_name == method_name
24
+ end.present?
25
+ end
26
+ end
27
+
28
+ resources
29
+ end
30
+ end
@@ -0,0 +1,56 @@
1
+ class Apipie::Generator::Swagger::ResourceDescriptionComposite
2
+ # @param [Array<Apipie::ResourceDescription>] resource_descriptions
3
+ def initialize(resource_descriptions, language:)
4
+ @resource_descriptions = resource_descriptions
5
+ @language = language
6
+ end
7
+
8
+ # @return [Hash{Symbol->Array | Hash}]
9
+ def to_swagger
10
+ {
11
+ tags: tags,
12
+ paths: paths
13
+ }
14
+ end
15
+
16
+ # @return [Array]
17
+ def tags
18
+ results = []
19
+
20
+ @resource_descriptions.each do |resource_description|
21
+ next unless resource_description._full_description
22
+
23
+ results << {
24
+ name: resource_description._id,
25
+ description: Apipie.app.translate(
26
+ resource_description._full_description,
27
+ @language
28
+ )
29
+ }
30
+ end
31
+
32
+ results
33
+ end
34
+
35
+ # @return [Hash]
36
+ def paths
37
+ results = {}
38
+
39
+ @resource_descriptions.each do |resource_description|
40
+ resource_description._methods.each_value do |method_description|
41
+ next unless method_description.show
42
+
43
+ result = Apipie::Generator::Swagger::MethodDescription::ApiSchemaService
44
+ .new(
45
+ Apipie::Generator::Swagger::MethodDescription::Decorator.new(method_description),
46
+ language: @language
47
+ )
48
+ .call
49
+
50
+ results.deep_merge!(result)
51
+ end
52
+ end
53
+
54
+ results
55
+ end
56
+ end
@@ -0,0 +1,63 @@
1
+ class Apipie::Generator::Swagger::Schema
2
+ # @param [Array<Apipie::ResourceDescription>] resource_descriptions
3
+ def initialize(resource_descriptions, version:, language:, clear_warnings:)
4
+ @resource_descriptions = resource_descriptions
5
+ @language = language
6
+ @clear_warnings = clear_warnings
7
+ @swagger = {
8
+ swagger: '2.0',
9
+ info: {
10
+ title: Apipie.configuration.app_name.to_s,
11
+ description: "#{Apipie.app_info(version, @language)}#{Apipie.configuration.copyright}",
12
+ version: version.to_s,
13
+ 'x-copyright': Apipie.configuration.copyright
14
+ },
15
+ basePath: Apipie.api_base_url(version),
16
+ consumes: [],
17
+ paths: {},
18
+ definitions: {},
19
+ schemes: Apipie.configuration.generator.swagger.schemes,
20
+ tags: [],
21
+ securityDefinitions: Apipie.configuration.generator.swagger.security_definitions,
22
+ security: Apipie.configuration.generator.swagger.global_security
23
+ }
24
+ end
25
+
26
+ def generate
27
+ if Apipie.configuration.generator.swagger.api_host.present?
28
+ @swagger[:host] = Apipie.configuration.generator.swagger.api_host
29
+ end
30
+
31
+ if Apipie.configuration.generator.swagger.content_type_input == :json
32
+ @swagger[:consumes] = ['application/json']
33
+ @swagger[:info][:title] += ' (params in:body)'
34
+ else
35
+ @swagger[:consumes] = ['application/x-www-form-urlencoded', 'multipart/form-data']
36
+ @swagger[:info][:title] += ' (params in:formData)'
37
+ end
38
+
39
+ if @clear_warnings
40
+ Apipie::Generator::Swagger::WarningWriter.instance.clear!
41
+ end
42
+
43
+ @swagger.merge!(tags_and_paths)
44
+
45
+ if Apipie.configuration.generator.swagger.generate_x_computed_id_field?
46
+ @swagger[:info]['x-computed-id'] =
47
+ Apipie::Generator::Swagger::ComputedInterfaceId.instance.id
48
+ end
49
+
50
+ @swagger[:definitions] =
51
+ Apipie::Generator::Swagger::ReferencedDefinitions.instance.definitions
52
+
53
+ @swagger
54
+ end
55
+
56
+ private
57
+
58
+ def tags_and_paths
59
+ Apipie::Generator::Swagger::ResourceDescriptionComposite
60
+ .new(@resource_descriptions, language: @language)
61
+ .to_swagger
62
+ end
63
+ end
@@ -25,21 +25,10 @@ class Apipie::Generator::Swagger::TypeExtractor
25
25
  @validator = validator
26
26
  end
27
27
 
28
- # @param [Hash<Symbol, Apipie::Generator::Swagger::Warning>] warnings
29
- def extract_with_warnings(warnings = {})
30
- if boolean? && warnings[:boolean].present?
31
- Apipie::Generator::Swagger::WarningWriter.instance.warn(warnings[:boolean])
32
- end
33
-
34
- extract
35
- end
36
-
37
28
  def extract
38
29
  expected_type =
39
30
  if string?
40
31
  :string
41
- elsif boolean?
42
- :boolean
43
32
  elsif enum?
44
33
  :enum
45
34
  else
@@ -59,12 +48,4 @@ class Apipie::Generator::Swagger::TypeExtractor
59
48
  @validator.is_a?(Apipie::Validator::EnumValidator) ||
60
49
  (@validator.respond_to?(:is_enum?) && @validator.is_enum?)
61
50
  end
62
-
63
- def boolean?
64
- @_boolean ||= enum? && boolean_values?
65
- end
66
-
67
- def boolean_values?
68
- @validator.values.to_set == Set.new([true, false])
69
- end
70
51
  end
@@ -7,7 +7,6 @@ class Apipie::Generator::Swagger::Warning
7
7
  OPTIONAL_WITHOUT_DEFAULT_VALUE_CODE = 105
8
8
  PARAM_IGNORED_IN_FORM_DATA_CODE = 106
9
9
  PATH_PARAM_NOT_DESCRIBED_CODE = 107
10
- INFERRING_BOOLEAN_CODE = 108
11
10
 
12
11
  CODES = {
13
12
  missing_method_summary: MISSING_METHOD_SUMMARY_CODE,
@@ -17,8 +16,7 @@ class Apipie::Generator::Swagger::Warning
17
16
  optional_param_in_path: OPTIONAL_PARAM_IN_PATH_CODE,
18
17
  optional_without_default_value: OPTIONAL_WITHOUT_DEFAULT_VALUE_CODE,
19
18
  param_ignored_in_form_data: PARAM_IGNORED_IN_FORM_DATA_CODE,
20
- path_param_not_described_code: PATH_PARAM_NOT_DESCRIBED_CODE,
21
- inferring_boolean: INFERRING_BOOLEAN_CODE
19
+ path_param_not_described_code: PATH_PARAM_NOT_DESCRIBED_CODE
22
20
  }
23
21
 
24
22
  MESSAGES = {
@@ -29,8 +27,7 @@ class Apipie::Generator::Swagger::Warning
29
27
  OPTIONAL_PARAM_IN_PATH_CODE => "The parameter :%{parameter} is 'in-path'. Ignoring 'not required' in DSL",
30
28
  OPTIONAL_WITHOUT_DEFAULT_VALUE_CODE => "The parameter :%{parameter} is optional but default value is not specified (use :default_value => ...)",
31
29
  PARAM_IGNORED_IN_FORM_DATA_CODE => "Ignoring param :%{parameter} -- cannot include Hash without fields in a formData specification",
32
- PATH_PARAM_NOT_DESCRIBED_CODE => "The parameter :%{name} appears in the path %{path} but is not described",
33
- INFERRING_BOOLEAN_CODE => "The parameter [%{parameter}] is Enum with [true, false] values. Inferring 'boolean'"
30
+ PATH_PARAM_NOT_DESCRIBED_CODE => "The parameter :%{name} appears in the path %{path} but is not described"
34
31
  }
35
32
 
36
33
  attr_reader :code
@@ -46,7 +43,7 @@ class Apipie::Generator::Swagger::Warning
46
43
  end
47
44
 
48
45
  def warning_message
49
- "WARNING (#{@code}): [#{@method_id}] -- #{@info_message}"
46
+ "WARNING (#{@code}): [#{@method_id}] -- #{@info_message}\n"
50
47
  end
51
48
 
52
49
  def warn
@@ -18,6 +18,12 @@ class Apipie::Generator::Swagger::WarningWriter
18
18
  @issued_warnings.count > 0
19
19
  end
20
20
 
21
+ def clear!
22
+ @issued_warnings = []
23
+
24
+ self
25
+ end
26
+
21
27
  private
22
28
 
23
29
  # @param [Apipie::Generator::Swagger::Warning] warning
@@ -43,6 +49,6 @@ class Apipie::Generator::Swagger::WarningWriter
43
49
 
44
50
  # @return [FalseClass, TrueClass, Array]
45
51
  def suppress_warnings_config
46
- Apipie.configuration.swagger_suppress_warnings
52
+ Apipie.configuration.generator.swagger.suppress_warnings
47
53
  end
48
54
  end
@@ -25,10 +25,10 @@ module Apipie
25
25
  @url_prefix << request_script_name
26
26
  @url_prefix << Apipie.configuration.doc_base_url
27
27
  end
28
- path = path.sub(/^\//,"")
28
+ path = path.sub(%r{^/},"")
29
29
  ret = "#{@url_prefix}/#{path}"
30
- ret.insert(0,"/") unless ret =~ /\A[.\/]/
31
- ret.sub!(/\/*\Z/,"")
30
+ ret.insert(0,"/") unless ret =~ %r{\A[./]}
31
+ ret.sub!(%r{/*\Z},"")
32
32
  ret
33
33
  end
34
34
 
@@ -1,5 +1,4 @@
1
1
  module Apipie
2
-
3
2
  class MethodDescription
4
3
  attr_reader :full_description, :method, :resource, :apis, :examples, :see, :formats, :headers, :show
5
4
  attr_accessor :metadata
@@ -159,7 +158,7 @@ module Apipie
159
158
  @formats || @resource._formats
160
159
  end
161
160
 
162
- def to_json(lang=nil)
161
+ def to_json(lang = nil)
163
162
  {
164
163
  :doc_url => doc_url,
165
164
  :name => @method,
@@ -182,6 +181,10 @@ module Apipie
182
181
  @from_concern
183
182
  end
184
183
 
184
+ def method_name
185
+ @method
186
+ end
187
+
185
188
  private
186
189
 
187
190
  def merge_params(params, new_params)
@@ -224,5 +227,4 @@ module Apipie
224
227
  example
225
228
  end
226
229
  end
227
-
228
230
  end
@@ -57,6 +57,10 @@ module Apipie
57
57
  @from_concern = @options[:param_group][:from_concern]
58
58
  end
59
59
 
60
+ if validator.is_a?(Hash)
61
+ @options.merge!(validator.select{|k,v| k != :array_of })
62
+ end
63
+
60
64
  @method_description = method_description
61
65
  @name = concern_subst(name)
62
66
  @as = options[:as] || @name
@@ -85,9 +89,7 @@ module Apipie
85
89
  if validator
86
90
  if (validator != Hash) && (validator.is_a? Hash) && (validator[:array_of])
87
91
  @is_array = true
88
- rest_of_options = validator
89
92
  validator = validator[:array_of]
90
- options.merge!(rest_of_options.select{|k,v| k != :array_of })
91
93
  raise "an ':array_of =>' validator is allowed exclusively on response-only fields" unless @response_only
92
94
  end
93
95
  @validator = Validator::BaseValidator.find(self, validator, @options, block)
@@ -14,27 +14,25 @@ module Apipie
14
14
  class ResourceDescription
15
15
 
16
16
  attr_reader :controller, :_short_description, :_full_description, :_methods, :_id,
17
- :_path, :_name, :_params_args, :_returns_args, :_tag_list_arg, :_errors_args,
17
+ :_path, :_params_args, :_returns_args, :_tag_list_arg, :_errors_args,
18
18
  :_formats, :_parent, :_metadata, :_headers, :_deprecated
19
19
 
20
- def initialize(controller, resource_name, dsl_data = nil, version = nil)
21
-
20
+ def initialize(controller, id, dsl_data = nil, version = nil)
22
21
  @_methods = ActiveSupport::OrderedHash.new
23
22
  @_params_args = []
24
23
  @_errors_args = []
25
24
  @_returns_args = []
26
25
 
27
26
  @controller = controller
28
- @_id = resource_name
27
+ @_id = id
29
28
  @_version = version || Apipie.configuration.default_version
30
- @_name = @_id.humanize
31
29
  @_parent = Apipie.get_resource_description(controller.superclass, version)
32
30
 
33
31
  update_from_dsl_data(dsl_data) if dsl_data
34
32
  end
35
33
 
36
34
  def update_from_dsl_data(dsl_data)
37
- @_name = dsl_data[:resource_name] if dsl_data[:resource_name]
35
+ @_resource_name = dsl_data[:resource_name] if dsl_data[:resource_name]
38
36
  @_full_description = dsl_data[:description]
39
37
  @_short_description = dsl_data[:short_description]
40
38
  @_path = dsl_data[:path] || ""
@@ -61,8 +59,13 @@ module Apipie
61
59
  @_api_base_url || @_parent.try(:_api_base_url) || Apipie.api_base_url(_version)
62
60
  end
63
61
 
62
+ def name
63
+ @name ||= @_resource_name.presence || @_id.split('-').map(&:capitalize).join('::')
64
+ end
65
+ alias _name name
66
+
64
67
  def add_method_description(method_description)
65
- Apipie.debug "@resource_descriptions[#{self._version}][#{self._name}]._methods[#{method_description.method}] = #{method_description}"
68
+ Apipie.debug "@resource_descriptions[#{self._version}][#{self._id}]._methods[#{method_description.method}] = #{method_description}"
66
69
  @_methods[method_description.method.to_sym] = method_description
67
70
  end
68
71
 
@@ -108,7 +111,7 @@ module Apipie
108
111
  :doc_url => doc_url,
109
112
  :id => _id,
110
113
  :api_url => api_url,
111
- :name => @_name,
114
+ :name => name,
112
115
  :short_description => Apipie.app.translate(@_short_description, lang),
113
116
  :full_description => Apipie.markup_to_html(Apipie.app.translate(@_full_description, lang)),
114
117
  :version => _version,
@@ -118,7 +118,7 @@ module Apipie
118
118
  end
119
119
  alias allow_additional_properties additional_properties
120
120
 
121
- def to_json(lang=nil)
121
+ def to_json(lang = nil)
122
122
  {
123
123
  :code => code,
124
124
  :description => Apipie.app.translate(description, lang),
@@ -1,6 +1,6 @@
1
1
  module Apipie
2
2
 
3
- def self.prop(name, expected_type, options={}, sub_properties=[])
3
+ def self.prop(name, expected_type, options = {}, sub_properties = [])
4
4
  Apipie::ResponseDescriptionAdapter::PropDesc.new(name, expected_type, options, sub_properties)
5
5
  end
6
6
 
@@ -60,7 +60,7 @@ module Apipie
60
60
  return self.send(key) if self.respond_to?(key.to_s)
61
61
  end
62
62
 
63
- def initialize(expected_type, enum_values=nil, sub_properties=nil)
63
+ def initialize(expected_type, enum_values = nil, sub_properties = nil)
64
64
  @expected_type = expected_type
65
65
  @enum_values = enum_values
66
66
  @is_enum = !!enum_values
@@ -84,7 +84,7 @@ module Apipie
84
84
  #======================================================================
85
85
 
86
86
 
87
- def initialize(name, expected_type, options={}, sub_properties=[])
87
+ def initialize(name, expected_type, options = {}, sub_properties = [])
88
88
  @name = name
89
89
  @required = true
90
90
  @required = false if options[:required] == false
@@ -4,7 +4,7 @@ module Apipie
4
4
  def apipie(options = {})
5
5
  namespace "apipie", :path => Apipie.configuration.doc_base_url do
6
6
  get 'apipie_checksum', :to => "apipies#apipie_checksum", :format => "json"
7
- constraints(:version => /[^\/]+/, :resource => /[^\/]+/, :method => /[^\/]+/) do
7
+ constraints(:version => %r{[^/]+}, :resource => %r{[^/]+}, :method => %r{[^/]+}) do
8
8
  get(options.reverse_merge("(:version)/(:resource)/(:method)" => "apipies#index", :as => :apipie))
9
9
  end
10
10
  end
@@ -112,7 +112,7 @@ class ActionController::Base
112
112
  end
113
113
 
114
114
  module Apipie
115
- def self.print_validation_errors(validation_errors, schema, response, error_object=nil)
115
+ def self.print_validation_errors(validation_errors, schema, response, error_object = nil)
116
116
  Rails.logger.warn(validation_errors.to_s)
117
117
  if Rails.env.test?
118
118
  puts "schema validation errors:"