apipie-rails-jq 1.4.3.pre.beta.pre.jq.1

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 (258) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/build.yml +32 -0
  3. data/.github/workflows/rubocop-challenger.yml +26 -0
  4. data/.github/workflows/rubocop.yml +18 -0
  5. data/.gitignore +16 -0
  6. data/.rspec +2 -0
  7. data/.rubocop.yml +132 -0
  8. data/.rubocop_todo.yml +1967 -0
  9. data/.vscode/settings.json +3 -0
  10. data/APACHE-LICENSE-2.0 +202 -0
  11. data/CHANGELOG.md +693 -0
  12. data/Gemfile +19 -0
  13. data/MIT-LICENSE +20 -0
  14. data/NOTICE +4 -0
  15. data/PROPOSAL_FOR_RESPONSE_DESCRIPTIONS.md +244 -0
  16. data/README.md +2088 -0
  17. data/Rakefile +8 -0
  18. data/apipie-rails.gemspec +44 -0
  19. data/app/controllers/apipie/apipies_controller.rb +184 -0
  20. data/app/helpers/apipie_helper.rb +10 -0
  21. data/app/public/apipie/javascripts/apipie.js +6 -0
  22. data/app/public/apipie/javascripts/bundled/bootstrap-collapse.js +167 -0
  23. data/app/public/apipie/javascripts/bundled/bootstrap.js +2280 -0
  24. data/app/public/apipie/javascripts/bundled/jquery.js +2 -0
  25. data/app/public/apipie/javascripts/bundled/prettify.js +28 -0
  26. data/app/public/apipie/stylesheets/application.css +7 -0
  27. data/app/public/apipie/stylesheets/bundled/bootstrap-responsive.min.css +9 -0
  28. data/app/public/apipie/stylesheets/bundled/bootstrap.min.css +9 -0
  29. data/app/public/apipie/stylesheets/bundled/prettify.css +30 -0
  30. data/app/views/apipie/apipies/_deprecation.html.erb +16 -0
  31. data/app/views/apipie/apipies/_disqus.html.erb +13 -0
  32. data/app/views/apipie/apipies/_errors.html.erb +23 -0
  33. data/app/views/apipie/apipies/_headers.html.erb +26 -0
  34. data/app/views/apipie/apipies/_languages.erb +6 -0
  35. data/app/views/apipie/apipies/_metadata.erb +1 -0
  36. data/app/views/apipie/apipies/_method_detail.erb +63 -0
  37. data/app/views/apipie/apipies/_params.html.erb +49 -0
  38. data/app/views/apipie/apipies/_params_plain.html.erb +21 -0
  39. data/app/views/apipie/apipies/apipie_404.html.erb +17 -0
  40. data/app/views/apipie/apipies/apipie_checksum.json.erb +1 -0
  41. data/app/views/apipie/apipies/getting_started.html.erb +6 -0
  42. data/app/views/apipie/apipies/index.html.erb +56 -0
  43. data/app/views/apipie/apipies/method.html.erb +41 -0
  44. data/app/views/apipie/apipies/plain.html.erb +77 -0
  45. data/app/views/apipie/apipies/resource.html.erb +80 -0
  46. data/app/views/apipie/apipies/static.html.erb +103 -0
  47. data/app/views/layouts/apipie/apipie.html.erb +27 -0
  48. data/config/locales/de.yml +28 -0
  49. data/config/locales/en.yml +41 -0
  50. data/config/locales/es.yml +28 -0
  51. data/config/locales/fr.yml +31 -0
  52. data/config/locales/it.yml +41 -0
  53. data/config/locales/ja.yml +31 -0
  54. data/config/locales/ko.yml +32 -0
  55. data/config/locales/pl.yml +28 -0
  56. data/config/locales/pt-BR.yml +28 -0
  57. data/config/locales/ru.yml +28 -0
  58. data/config/locales/tr.yml +28 -0
  59. data/config/locales/zh-CN.yml +28 -0
  60. data/config/locales/zh-TW.yml +28 -0
  61. data/gemfiles/Gemfile.tools +9 -0
  62. data/images/screenshot-1.png +0 -0
  63. data/images/screenshot-2.png +0 -0
  64. data/lib/apipie/apipie_module.rb +83 -0
  65. data/lib/apipie/application.rb +499 -0
  66. data/lib/apipie/configuration.rb +196 -0
  67. data/lib/apipie/core_ext/route.rb +9 -0
  68. data/lib/apipie/dsl_definition.rb +630 -0
  69. data/lib/apipie/error_description.rb +46 -0
  70. data/lib/apipie/errors.rb +86 -0
  71. data/lib/apipie/extractor/collector.rb +116 -0
  72. data/lib/apipie/extractor/recorder.rb +193 -0
  73. data/lib/apipie/extractor/writer.rb +454 -0
  74. data/lib/apipie/extractor.rb +181 -0
  75. data/lib/apipie/generator/config.rb +12 -0
  76. data/lib/apipie/generator/generator.rb +2 -0
  77. data/lib/apipie/generator/swagger/computed_interface_id.rb +23 -0
  78. data/lib/apipie/generator/swagger/config.rb +80 -0
  79. data/lib/apipie/generator/swagger/context.rb +38 -0
  80. data/lib/apipie/generator/swagger/method_description/api_decorator.rb +20 -0
  81. data/lib/apipie/generator/swagger/method_description/api_schema_service.rb +89 -0
  82. data/lib/apipie/generator/swagger/method_description/decorator.rb +22 -0
  83. data/lib/apipie/generator/swagger/method_description/parameters_service.rb +139 -0
  84. data/lib/apipie/generator/swagger/method_description/response_schema_service.rb +46 -0
  85. data/lib/apipie/generator/swagger/method_description/response_service.rb +71 -0
  86. data/lib/apipie/generator/swagger/method_description.rb +2 -0
  87. data/lib/apipie/generator/swagger/operation_id.rb +51 -0
  88. data/lib/apipie/generator/swagger/param_description/builder.rb +114 -0
  89. data/lib/apipie/generator/swagger/param_description/composite.rb +119 -0
  90. data/lib/apipie/generator/swagger/param_description/description.rb +15 -0
  91. data/lib/apipie/generator/swagger/param_description/in.rb +37 -0
  92. data/lib/apipie/generator/swagger/param_description/name.rb +18 -0
  93. data/lib/apipie/generator/swagger/param_description/path_params_composite.rb +61 -0
  94. data/lib/apipie/generator/swagger/param_description/referenced_composite.rb +36 -0
  95. data/lib/apipie/generator/swagger/param_description/type.rb +132 -0
  96. data/lib/apipie/generator/swagger/param_description.rb +18 -0
  97. data/lib/apipie/generator/swagger/path_decorator.rb +36 -0
  98. data/lib/apipie/generator/swagger/referenced_definitions.rb +17 -0
  99. data/lib/apipie/generator/swagger/resource_description_collection.rb +30 -0
  100. data/lib/apipie/generator/swagger/resource_description_composite.rb +56 -0
  101. data/lib/apipie/generator/swagger/schema.rb +63 -0
  102. data/lib/apipie/generator/swagger/swagger.rb +2 -0
  103. data/lib/apipie/generator/swagger/type.rb +16 -0
  104. data/lib/apipie/generator/swagger/type_extractor.rb +51 -0
  105. data/lib/apipie/generator/swagger/warning.rb +74 -0
  106. data/lib/apipie/generator/swagger/warning_writer.rb +54 -0
  107. data/lib/apipie/helpers.rb +73 -0
  108. data/lib/apipie/markup.rb +52 -0
  109. data/lib/apipie/method_description/api.rb +12 -0
  110. data/lib/apipie/method_description/apis_service.rb +82 -0
  111. data/lib/apipie/method_description.rb +230 -0
  112. data/lib/apipie/middleware/checksum_in_headers.rb +35 -0
  113. data/lib/apipie/param_description/deprecation.rb +24 -0
  114. data/lib/apipie/param_description.rb +313 -0
  115. data/lib/apipie/railtie.rb +9 -0
  116. data/lib/apipie/resource_description.rb +152 -0
  117. data/lib/apipie/response_description.rb +157 -0
  118. data/lib/apipie/response_description_adapter.rb +202 -0
  119. data/lib/apipie/routes_formatter.rb +33 -0
  120. data/lib/apipie/routing.rb +16 -0
  121. data/lib/apipie/rspec/response_validation_helper.rb +194 -0
  122. data/lib/apipie/see_description.rb +39 -0
  123. data/lib/apipie/static_dispatcher.rb +75 -0
  124. data/lib/apipie/swagger_generator.rb +45 -0
  125. data/lib/apipie/tag_list_description.rb +11 -0
  126. data/lib/apipie/validator.rb +552 -0
  127. data/lib/apipie/version.rb +3 -0
  128. data/lib/apipie-rails.rb +60 -0
  129. data/lib/generators/apipie/install/README +6 -0
  130. data/lib/generators/apipie/install/install_generator.rb +25 -0
  131. data/lib/generators/apipie/install/templates/initializer.rb.erb +7 -0
  132. data/lib/generators/apipie/views_generator.rb +11 -0
  133. data/lib/tasks/apipie.rake +355 -0
  134. data/rel-eng/gem_release.ipynb +398 -0
  135. data/rel-eng/packages/.readme +3 -0
  136. data/rel-eng/packages/rubygem-apipie-rails +1 -0
  137. data/rel-eng/tito.props +5 -0
  138. data/spec/controllers/api/v1/architectures_controller_spec.rb +29 -0
  139. data/spec/controllers/api/v2/architectures_controller_spec.rb +19 -0
  140. data/spec/controllers/api/v2/empty_middle_controller_spec.rb +23 -0
  141. data/spec/controllers/api/v2/nested/resources_controller_spec.rb +27 -0
  142. data/spec/controllers/api/v2/sub/footguns_controller_spec.rb +19 -0
  143. data/spec/controllers/concerns_controller_spec.rb +42 -0
  144. data/spec/controllers/extended_controller_spec.rb +14 -0
  145. data/spec/controllers/included_param_group_controller_spec.rb +13 -0
  146. data/spec/controllers/pets_controller_spec.rb +98 -0
  147. data/spec/controllers/users_controller_spec.rb +794 -0
  148. data/spec/dummy/Rakefile +7 -0
  149. data/spec/dummy/app/controllers/api/base_controller.rb +4 -0
  150. data/spec/dummy/app/controllers/api/v1/architectures_controller.rb +43 -0
  151. data/spec/dummy/app/controllers/api/v1/base_controller.rb +11 -0
  152. data/spec/dummy/app/controllers/api/v2/architectures_controller.rb +31 -0
  153. data/spec/dummy/app/controllers/api/v2/base_controller.rb +17 -0
  154. data/spec/dummy/app/controllers/api/v2/empty_middle_controller.rb +14 -0
  155. data/spec/dummy/app/controllers/api/v2/nested/architectures_controller.rb +32 -0
  156. data/spec/dummy/app/controllers/api/v2/nested/resources_controller.rb +33 -0
  157. data/spec/dummy/app/controllers/api/v2/sub/footguns_controller.rb +30 -0
  158. data/spec/dummy/app/controllers/application_controller.rb +18 -0
  159. data/spec/dummy/app/controllers/concerns_controller.rb +8 -0
  160. data/spec/dummy/app/controllers/extended_controller.rb +14 -0
  161. data/spec/dummy/app/controllers/extending_concern.rb +10 -0
  162. data/spec/dummy/app/controllers/files_controller.rb +5 -0
  163. data/spec/dummy/app/controllers/included_param_group_controller.rb +19 -0
  164. data/spec/dummy/app/controllers/overridden_concerns_controller.rb +31 -0
  165. data/spec/dummy/app/controllers/pets_controller.rb +408 -0
  166. data/spec/dummy/app/controllers/pets_using_auto_views_controller.rb +73 -0
  167. data/spec/dummy/app/controllers/pets_using_self_describing_classes_controller.rb +95 -0
  168. data/spec/dummy/app/controllers/sample_controller.rb +39 -0
  169. data/spec/dummy/app/controllers/tagged_cats_controller.rb +32 -0
  170. data/spec/dummy/app/controllers/tagged_dogs_controller.rb +15 -0
  171. data/spec/dummy/app/controllers/twitter_example_controller.rb +307 -0
  172. data/spec/dummy/app/controllers/users_controller.rb +310 -0
  173. data/spec/dummy/app/helpers/random_param_group.rb +8 -0
  174. data/spec/dummy/app/views/layouts/application.html.erb +21 -0
  175. data/spec/dummy/components/test_engine/Gemfile +6 -0
  176. data/spec/dummy/components/test_engine/app/controllers/test_engine/application_controller.rb +4 -0
  177. data/spec/dummy/components/test_engine/app/controllers/test_engine/memes_controller.rb +37 -0
  178. data/spec/dummy/components/test_engine/config/routes.rb +3 -0
  179. data/spec/dummy/components/test_engine/db/.gitkeep +0 -0
  180. data/spec/dummy/components/test_engine/lib/test_engine.rb +7 -0
  181. data/spec/dummy/components/test_engine/test_engine.gemspec +11 -0
  182. data/spec/dummy/config/application.rb +47 -0
  183. data/spec/dummy/config/boot.rb +12 -0
  184. data/spec/dummy/config/database.yml +21 -0
  185. data/spec/dummy/config/environment.rb +8 -0
  186. data/spec/dummy/config/environments/development.rb +25 -0
  187. data/spec/dummy/config/environments/production.rb +49 -0
  188. data/spec/dummy/config/environments/test.rb +33 -0
  189. data/spec/dummy/config/initializers/apipie.rb +110 -0
  190. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  191. data/spec/dummy/config/initializers/inflections.rb +10 -0
  192. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  193. data/spec/dummy/config/initializers/secret_token.rb +8 -0
  194. data/spec/dummy/config/initializers/session_store.rb +8 -0
  195. data/spec/dummy/config/locales/en.yml +5 -0
  196. data/spec/dummy/config/routes.rb +61 -0
  197. data/spec/dummy/config.ru +4 -0
  198. data/spec/dummy/db/.gitkeep +0 -0
  199. data/spec/dummy/doc/apipie_examples.json +1 -0
  200. data/spec/dummy/doc/users/desc_from_file.md +1 -0
  201. data/spec/dummy/public/404.html +26 -0
  202. data/spec/dummy/public/422.html +26 -0
  203. data/spec/dummy/public/500.html +26 -0
  204. data/spec/dummy/public/favicon.ico +0 -0
  205. data/spec/dummy/public/stylesheets/.gitkeep +0 -0
  206. data/spec/dummy/script/rails +6 -0
  207. data/spec/lib/apipie/apipies_controller_spec.rb +345 -0
  208. data/spec/lib/apipie/application_spec.rb +62 -0
  209. data/spec/lib/apipie/configuration_spec.rb +38 -0
  210. data/spec/lib/apipie/extractor/collector_spec.rb +57 -0
  211. data/spec/lib/apipie/extractor/recorder/middleware_spec.rb +44 -0
  212. data/spec/lib/apipie/extractor/recorder_spec.rb +77 -0
  213. data/spec/lib/apipie/extractor/writer_spec.rb +112 -0
  214. data/spec/lib/apipie/extractor_spec.rb +9 -0
  215. data/spec/lib/apipie/file_handler_spec.rb +25 -0
  216. data/spec/lib/apipie/generator/swagger/config_spec.rb +19 -0
  217. data/spec/lib/apipie/generator/swagger/context_spec.rb +56 -0
  218. data/spec/lib/apipie/generator/swagger/method_description/api_schema_service_spec.rb +119 -0
  219. data/spec/lib/apipie/generator/swagger/method_description/response_schema_service_spec.rb +105 -0
  220. data/spec/lib/apipie/generator/swagger/method_description/response_service_spec.rb +62 -0
  221. data/spec/lib/apipie/generator/swagger/operation_id_spec.rb +63 -0
  222. data/spec/lib/apipie/generator/swagger/param_description/builder_spec.rb +245 -0
  223. data/spec/lib/apipie/generator/swagger/param_description/composite_spec.rb +95 -0
  224. data/spec/lib/apipie/generator/swagger/param_description/description_spec.rb +79 -0
  225. data/spec/lib/apipie/generator/swagger/param_description/in_spec.rb +86 -0
  226. data/spec/lib/apipie/generator/swagger/param_description/name_spec.rb +81 -0
  227. data/spec/lib/apipie/generator/swagger/param_description/type_spec.rb +210 -0
  228. data/spec/lib/apipie/generator/swagger/param_description_spec.rb +28 -0
  229. data/spec/lib/apipie/generator/swagger/path_decorator_spec.rb +57 -0
  230. data/spec/lib/apipie/generator/swagger/referenced_definitions_spec.rb +35 -0
  231. data/spec/lib/apipie/generator/swagger/resource_description_composite_spec.rb +37 -0
  232. data/spec/lib/apipie/generator/swagger/resource_descriptions_collection_spec.rb +57 -0
  233. data/spec/lib/apipie/generator/swagger/schema_spec.rb +89 -0
  234. data/spec/lib/apipie/generator/swagger/type_extractor_spec.rb +38 -0
  235. data/spec/lib/apipie/generator/swagger/warning_spec.rb +51 -0
  236. data/spec/lib/apipie/generator/swagger/warning_writer_spec.rb +71 -0
  237. data/spec/lib/apipie/method_description/apis_service_spec.rb +60 -0
  238. data/spec/lib/apipie/method_description_spec.rb +133 -0
  239. data/spec/lib/apipie/no_documented_method_spec.rb +17 -0
  240. data/spec/lib/apipie/param_description/deprecation_spec.rb +31 -0
  241. data/spec/lib/apipie/param_description_spec.rb +671 -0
  242. data/spec/lib/apipie/param_group_spec.rb +61 -0
  243. data/spec/lib/apipie/resource_description_spec.rb +91 -0
  244. data/spec/lib/apipie/response_description/response_object_spec.rb +22 -0
  245. data/spec/lib/apipie/response_description_spec.rb +56 -0
  246. data/spec/lib/apipie/response_does_not_match_swagger_schema_spec.rb +35 -0
  247. data/spec/lib/apipie/swagger_generator_spec.rb +94 -0
  248. data/spec/lib/apipie/validator_spec.rb +149 -0
  249. data/spec/lib/rake_spec.rb +69 -0
  250. data/spec/lib/swagger/openapi_2_0_schema.json +1614 -0
  251. data/spec/lib/swagger/rake_swagger_spec.rb +159 -0
  252. data/spec/lib/swagger/swagger_dsl_spec.rb +664 -0
  253. data/spec/lib/validators/array_validator_spec.rb +85 -0
  254. data/spec/spec_helper.rb +92 -0
  255. data/spec/support/custom_bool_validator.rb +17 -0
  256. data/spec/support/rake.rb +21 -0
  257. data/spec/test_engine/memes_controller_spec.rb +10 -0
  258. metadata +499 -0
@@ -0,0 +1,80 @@
1
+ require 'singleton'
2
+
3
+ module Apipie
4
+ module Generator
5
+ module Swagger
6
+ class Config
7
+ include Singleton
8
+
9
+ CONFIG_ATTRIBUTES = [:include_warning_tags, :content_type_input,
10
+ :json_input_uses_refs, :suppress_warnings, :api_host,
11
+ :generate_x_computed_id_field, :allow_additional_properties_in_response,
12
+ :responses_use_refs, :schemes, :security_definitions,
13
+ :global_security, :skip_default_tags].freeze
14
+
15
+ attr_accessor(*CONFIG_ATTRIBUTES)
16
+
17
+ CONFIG_ATTRIBUTES.each do |attribute|
18
+ old_setter_method = "swagger_#{attribute}="
19
+ define_method(old_setter_method) do |value|
20
+ ActiveSupport::Deprecation.warn(
21
+ <<~HEREDOC
22
+ config.#{old_setter_method}#{value} is deprecated.
23
+ config.generator.swagger.#{attribute} instead.
24
+ HEREDOC
25
+ )
26
+
27
+ send(:"#{attribute}=", value)
28
+ end
29
+
30
+ old_setter_method = "swagger_#{attribute}"
31
+ define_method(old_setter_method) do
32
+ ActiveSupport::Deprecation.warn(
33
+ <<~HEREDOC
34
+ config.#{old_setter_method} is deprecated.
35
+ Use config.generator.swagger.#{attribute} instead.
36
+ HEREDOC
37
+ )
38
+
39
+ send(attribute)
40
+ end
41
+ end
42
+
43
+ alias include_warning_tags? include_warning_tags
44
+ alias json_input_uses_refs? json_input_uses_refs
45
+ alias responses_use_refs? responses_use_refs
46
+ alias skip_default_tags? skip_default_tags
47
+ alias generate_x_computed_id_field? generate_x_computed_id_field
48
+ alias swagger_include_warning_tags? swagger_include_warning_tags
49
+ alias swagger_json_input_uses_refs? swagger_json_input_uses_refs
50
+ alias swagger_responses_use_refs? swagger_responses_use_refs
51
+ alias swagger_generate_x_computed_id_field? swagger_generate_x_computed_id_field
52
+
53
+ def initialize
54
+ @content_type_input = :form_data # this can be :json or :form_data
55
+ @json_input_uses_refs = false
56
+ @include_warning_tags = false
57
+ @suppress_warnings = false # [105,100,102]
58
+ @api_host = 'localhost:3000'
59
+ @generate_x_computed_id_field = false
60
+ @allow_additional_properties_in_response = false
61
+ @responses_use_refs = true
62
+ @schemes = [:https]
63
+ @security_definitions = {}
64
+ @global_security = []
65
+ @skip_default_tags = false
66
+ end
67
+
68
+ def self.deprecated_methods
69
+ CONFIG_ATTRIBUTES.map do |attribute|
70
+ [
71
+ :"swagger_#{attribute}=",
72
+ :"swagger_#{attribute}?",
73
+ :"swagger_#{attribute}"
74
+ ]
75
+ end.flatten
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,38 @@
1
+ class Apipie::Generator::Swagger::Context
2
+ attr_reader :default_in_value, :language, :http_method, :controller_method,
3
+ :prefix
4
+
5
+ def initialize(
6
+ allow_null:,
7
+ http_method:,
8
+ controller_method:,
9
+ prefix: nil,
10
+ default_in_value: nil,
11
+ language: nil,
12
+ in_schema: true
13
+ )
14
+ @default_in_value = default_in_value
15
+ @allow_null = allow_null
16
+ @language = language
17
+ @in_schema = in_schema
18
+ @http_method = http_method
19
+ @controller_method = controller_method
20
+ @prefix = prefix
21
+ end
22
+
23
+ def allow_null?
24
+ @allow_null == true
25
+ end
26
+
27
+ def in_schema?
28
+ @in_schema == true
29
+ end
30
+
31
+ def add_to_prefix!(prefix)
32
+ @prefix = if @prefix.present?
33
+ "#{@prefix}[#{prefix}]"
34
+ else
35
+ prefix
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,20 @@
1
+ class Apipie::Generator::Swagger::MethodDescription::ApiDecorator < SimpleDelegator
2
+ def normalized_http_method
3
+ @normalized_http_method ||= http_method.downcase
4
+ end
5
+
6
+ def summary(method_description:, language:)
7
+ s = Apipie.app.translate(short_description, language)
8
+
9
+ if s.blank?
10
+ Apipie::Generator::Swagger::Warning.for_code(
11
+ Apipie::Generator::Swagger::Warning::MISSING_METHOD_SUMMARY_CODE,
12
+ method_description.ruby_name
13
+ ).warn_through_writer
14
+
15
+ nil
16
+ else
17
+ s
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,89 @@
1
+ class Apipie::Generator::Swagger::MethodDescription::ApiSchemaService
2
+ # @param [Apipie::Generator::Swagger::MethodDescription::Decorator] method_description
3
+ def initialize(method_description, language: nil)
4
+ @method_description = method_description
5
+ @language = language
6
+ end
7
+
8
+ # @return [Hash]
9
+ def call
10
+ @method_description.apis.each_with_object({}) do |api, paths|
11
+ api = Apipie::Generator::Swagger::MethodDescription::ApiDecorator.new(api)
12
+ path = Apipie::Generator::Swagger::PathDecorator.new(api.path)
13
+ op_id = Apipie::Generator::Swagger::OperationId.from(api).to_s
14
+
15
+ if Apipie.configuration.generator.swagger.generate_x_computed_id_field?
16
+ Apipie::Generator::Swagger::ComputedInterfaceId.instance.add!(op_id)
17
+ end
18
+
19
+ parameters = Apipie::Generator::Swagger::MethodDescription::ParametersService
20
+ .new(@method_description, path: path, http_method: api.normalized_http_method)
21
+ .call
22
+
23
+ paths[path.swagger_path(@method_description)] ||= {}
24
+ paths[path.swagger_path(@method_description)][api.normalized_http_method] = {
25
+ tags: tags,
26
+ consumes: consumes,
27
+ operationId: op_id,
28
+ summary: api.summary(method_description: @method_description, language: @language),
29
+ parameters: parameters,
30
+ responses: responses(api),
31
+ description: Apipie.app.translate(@method_description.full_description, @language)
32
+ }.compact
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def summary(api)
39
+ translated_description = Apipie.app.translate(api.short_description, @language)
40
+
41
+ return translated_description if translated_description.present?
42
+
43
+ Apipie::Generator::Swagger::Warning.for_code(
44
+ Apipie::Generator::Swagger::Warning::MISSING_METHOD_SUMMARY_CODE,
45
+ @method_description.ruby_name
46
+ ).warn_through_writer
47
+ end
48
+
49
+ def tags
50
+ tags = if Apipie.configuration.generator.swagger.skip_default_tags?
51
+ []
52
+ else
53
+ [@method_description.resource._id]
54
+ end
55
+ tags + warning_tags + @method_description.tag_list.tags
56
+ end
57
+
58
+ def warning_tags
59
+ if Apipie.configuration.generator.swagger.include_warning_tags? &&
60
+ Apipie::Generator::Swagger::WarningWriter.instance.issued_warnings?
61
+ ['warnings issued']
62
+ else
63
+ []
64
+ end
65
+ end
66
+
67
+ def consumes
68
+ if params_in_body?
69
+ ['application/json']
70
+ else
71
+ ['application/x-www-form-urlencoded', 'multipart/form-data']
72
+ end
73
+ end
74
+
75
+ def params_in_body?
76
+ Apipie.configuration.generator.swagger.content_type_input == :json
77
+ end
78
+
79
+ # @param [Apipie::Generator::Swagger::MethodDescription::ApiDecorator] api
80
+ def responses(api)
81
+ Apipie::Generator::Swagger::MethodDescription::ResponseService
82
+ .new(
83
+ @method_description,
84
+ language: @language,
85
+ http_method: api.normalized_http_method
86
+ )
87
+ .call
88
+ end
89
+ end
@@ -0,0 +1,22 @@
1
+ class Apipie::Generator::Swagger::MethodDescription::Decorator < SimpleDelegator
2
+ # @return [String]
3
+ def operation_id
4
+ "#{object.resource.controller.name}__#{object.method_name}"
5
+ end
6
+
7
+ # @return [String]
8
+ def ruby_name
9
+ if object.blank?
10
+ '<no method>'
11
+ else
12
+ "#{object.resource.controller.name}##{object.method_name}"
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ # @return [Apipie::MethodDescription, nil]
19
+ def object
20
+ __getobj__
21
+ end
22
+ end
@@ -0,0 +1,139 @@
1
+ class Apipie::Generator::Swagger::MethodDescription::ParametersService
2
+ # @param [Apipie::Generator::Swagger::MethodDescription::Decorator] method_description
3
+ # @param [Apipie::Generator::Swagger::PathDecorator] path
4
+ # @param [Symbol] http_method
5
+ def initialize(method_description, path:, http_method:)
6
+ @method_description = method_description
7
+ @path = path
8
+ @http_method = http_method
9
+ end
10
+
11
+ # @return [Array]
12
+ def call
13
+ path_params_schema + body_params_schema + header_params_schema
14
+ end
15
+
16
+ private
17
+
18
+ def path_params_schema
19
+ Apipie::Generator::Swagger::ParamDescription::PathParamsComposite.new(
20
+ path_param_descriptions,
21
+ Apipie::Generator::Swagger::Context.new(
22
+ allow_null: false,
23
+ default_in_value: 'path',
24
+ http_method: @http_method,
25
+ controller_method: @method_description
26
+ )
27
+ ).to_swagger
28
+ end
29
+
30
+ def body_params_schema
31
+ if params_in_body? && body_allowed_for_current_method?
32
+ composite = Apipie::Generator::Swagger::ParamDescription::Composite.new(
33
+ body_param_descriptions,
34
+ Apipie::Generator::Swagger::Context.new(
35
+ allow_null: false,
36
+ http_method: @http_method,
37
+ controller_method: @method_description
38
+ )
39
+ )
40
+
41
+ if Apipie.configuration.generator.swagger.json_input_uses_refs?
42
+ composite = composite
43
+ .referenced("#{@method_description.operation_id}_input")
44
+ end
45
+
46
+ swagger_schema_for_body = composite.to_swagger
47
+
48
+ swagger_body_param = {
49
+ name: 'body',
50
+ in: 'body',
51
+ schema: swagger_schema_for_body
52
+ }
53
+
54
+ if swagger_schema_for_body.present?
55
+ [swagger_body_param]
56
+ else
57
+ []
58
+ end
59
+ else
60
+ Apipie::Generator::Swagger::ParamDescription::PathParamsComposite.new(
61
+ body_param_descriptions,
62
+ Apipie::Generator::Swagger::Context.new(
63
+ allow_null: false,
64
+ http_method: @http_method,
65
+ controller_method: @method_description
66
+ )
67
+ ).to_swagger
68
+ end
69
+ end
70
+
71
+ def all_params
72
+ @all_params ||=
73
+ begin
74
+ param_names_from_method = @method_description.params.keys
75
+ missing = @path.param_names - param_names_from_method
76
+
77
+ result = @method_description.params
78
+
79
+ missing.each do |name|
80
+ warn_path_parameter_not_described(name, @path)
81
+
82
+ result[name.to_sym] = Apipie::Generator::Swagger::ParamDescription
83
+ .create_for_missing_param(@method_description, name)
84
+ end
85
+
86
+ result
87
+ end
88
+ end
89
+
90
+ def body_param_descriptions
91
+ @body_param_descriptions ||= all_params
92
+ .reject { |k, _| @path.param?(k) }
93
+ .values
94
+ end
95
+
96
+ def path_param_descriptions
97
+ @path_param_descriptions ||= all_params
98
+ .select { |k, _| @path.param?(k) }
99
+ .each_value { |desc| desc.required = true }
100
+ .values
101
+ end
102
+
103
+ # @return [Array]
104
+ def header_params_schema
105
+ return [] if @method_description.headers.blank?
106
+
107
+ @method_description.headers.map do |header|
108
+ header_hash = {
109
+ name: header[:name],
110
+ in: 'header',
111
+ required: header[:options][:required],
112
+ description: header[:description],
113
+ type: header[:options][:type] || 'string'
114
+
115
+ }
116
+ if header[:options][:default]
117
+ header_hash[:default] = header[:options][:default]
118
+ end
119
+
120
+ header_hash
121
+ end
122
+ end
123
+
124
+ def params_in_body?
125
+ Apipie.configuration.generator.swagger.content_type_input == :json
126
+ end
127
+
128
+ def body_allowed_for_current_method?
129
+ %w[get head].exclude?(@http_method)
130
+ end
131
+
132
+ def warn_path_parameter_not_described(name, path)
133
+ Apipie::Generator::Swagger::Warning.for_code(
134
+ Apipie::Generator::Swagger::Warning::PATH_PARAM_NOT_DESCRIBED_CODE,
135
+ @method_description.ruby_name,
136
+ { name: name, path: path }
137
+ ).warn_through_writer
138
+ end
139
+ end
@@ -0,0 +1,46 @@
1
+ class Apipie::Generator::Swagger::MethodDescription::ResponseSchemaService
2
+ # @param [Apipie::ResponseDescription, Apipie::ResponseDescriptionAdapter] response_description
3
+ def initialize(response_description, allow_null:, http_method:, controller_method:)
4
+ @response_description = response_description
5
+ @allow_null = allow_null
6
+ @http_method = http_method
7
+ @controller_method = controller_method
8
+ end
9
+
10
+ def to_swagger
11
+ composite = Apipie::Generator::Swagger::ParamDescription::Composite.new(
12
+ @response_description.params_ordered,
13
+ Apipie::Generator::Swagger::Context.new(
14
+ allow_null: @allow_null,
15
+ http_method: @http_method,
16
+ controller_method: @controller_method
17
+ )
18
+ )
19
+
20
+ if Apipie.configuration.generator.swagger.responses_use_refs? && @response_description.typename.present?
21
+ composite = composite.referenced(@response_description.typename)
22
+ end
23
+
24
+ schema = composite.to_swagger
25
+
26
+ if @response_description.is_array? && schema
27
+ schema = { type: type_for_array, items: schema }
28
+ end
29
+
30
+ if @response_description.allow_additional_properties
31
+ schema[:additionalProperties] = true
32
+ end
33
+
34
+ schema
35
+ end
36
+
37
+ private
38
+
39
+ def type_for_array
40
+ if @allow_null == true
41
+ %w[array null]
42
+ else
43
+ 'array'
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,71 @@
1
+ class Apipie::Generator::Swagger::MethodDescription::ResponseService
2
+ # @param [Apipie::Generator::Swagger::MethodDescription::Decorator] method_description
3
+ # @param [Symbol] http_method
4
+ def initialize(method_description, http_method:, language:)
5
+ @method_description = method_description
6
+ @http_method = http_method
7
+ @language = language
8
+ end
9
+
10
+ # @return [Hash]
11
+ def call
12
+ result = {}
13
+ result.merge!(errors)
14
+ result.merge!(responses)
15
+ result.merge!(empty_returns)
16
+
17
+ result
18
+ end
19
+
20
+ private
21
+
22
+ # @return [Hash]
23
+ def errors
24
+ @errors ||= @method_description.errors.each_with_object({}) do |error, errors|
25
+ errors[error.code] = {
26
+ description: Apipie.app.translate(error.description, @language)
27
+ }
28
+ end
29
+ end
30
+
31
+ # @return [Hash]
32
+ def responses
33
+ @responses ||=
34
+ @method_description.returns.each_with_object({}) do |response, responses_schema|
35
+ responses_schema[response.code] = {
36
+ description: Apipie.app.translate(response.description, @language),
37
+ schema: Apipie::Generator::Swagger::MethodDescription::ResponseSchemaService.new(
38
+ response,
39
+ allow_null: false,
40
+ http_method: @http_method,
41
+ controller_method: @method_description
42
+ ).to_swagger,
43
+ headers: response_headers(response.headers)
44
+ }.compact
45
+ end
46
+ end
47
+
48
+ # @return [Hash]
49
+ def empty_returns
50
+ return {} if errors.present? || responses.present?
51
+
52
+ Apipie::Generator::Swagger::Warning.for_code(
53
+ Apipie::Generator::Swagger::Warning::NO_RETURN_CODES_SPECIFIED_CODE,
54
+ @method_description.ruby_name
55
+ ).warn_through_writer
56
+
57
+ { 200 => { description: 'ok' } }
58
+ end
59
+
60
+ # @param [Array<Hash>] headers
61
+ #
62
+ # https://swagger.io/specification/v2/#header-object
63
+ def response_headers(headers)
64
+ headers.each_with_object({}) do |header, result|
65
+ result[header[:name].to_s] = {
66
+ description: header[:description],
67
+ type: header[:validator]
68
+ }
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,2 @@
1
+ module Apipie::Generator::Swagger::MethodDescription
2
+ end
@@ -0,0 +1,51 @@
1
+ class Apipie::Generator::Swagger::OperationId
2
+ def initialize(path:, http_method:, param: nil)
3
+ @path = path
4
+ @http_method = http_method
5
+ @param = param
6
+ end
7
+
8
+ # @return [String]
9
+ def to_s
10
+ base = normalized_http_method + path
11
+
12
+ if @param.present?
13
+ "#{base}_param_#{@param}"
14
+ else
15
+ base
16
+ end
17
+ end
18
+
19
+ # @param [Apipie::MethodDescription::Api, Apipie::MethodDescription] describable
20
+ # @param [String, Symbol, nil] param
21
+ #
22
+ # @return [Apipie::Generator::Swagger::OperationId]
23
+ def self.from(describable, param: nil)
24
+ path, http_method =
25
+ if describable.respond_to?(:path) && describable.respond_to?(:http_method)
26
+ [describable.path, describable.http_method]
27
+ elsif describable.is_a?(Apipie::MethodDescription)
28
+ [describable.apis.first.path, describable.apis.first.http_method]
29
+ end
30
+
31
+ new(path: path, http_method: http_method, param: param)
32
+ end
33
+
34
+ private
35
+
36
+ # Converts an http path for example `/api/concerns/:id` to `_api_concerns_id`
37
+ #
38
+ # @return [String]
39
+ def path
40
+ @path.gsub(%r{/}, '_').gsub(/:(\w+)/, '\1').gsub(/_$/, '')
41
+ end
42
+
43
+ # Converts an http method like `GET` to `get` Using lowercase http method,
44
+ # because the 'swagger-codegen' tool outputs strange method names if the
45
+ # http method is in uppercase
46
+ #
47
+ # @return [String]
48
+ def normalized_http_method
49
+ @http_method.to_s.downcase
50
+ end
51
+ end
@@ -0,0 +1,114 @@
1
+ class Apipie::Generator::Swagger::ParamDescription::Builder
2
+ # @param [Apipie::ParamDescription] param_description
3
+ # @param [TrueClass, FalseClass] in_schema
4
+ # @param [Apipie::MethodDescription, nil] controller_method
5
+ def initialize(param_description, in_schema:, controller_method:)
6
+ @param_description = param_description
7
+ @in_schema = in_schema
8
+ @controller_method = controller_method
9
+ end
10
+
11
+ # @param [String, nil] prefix
12
+ def with_name(prefix: nil)
13
+ @name = Apipie::Generator::Swagger::ParamDescription::Name.
14
+ new(@param_description, prefixed_by: prefix)
15
+
16
+ self
17
+ end
18
+
19
+ # @param [String] language
20
+ def with_description(language:)
21
+ @description = Apipie::Generator::Swagger::ParamDescription::Description.
22
+ new(@param_description, language: language)
23
+
24
+ self
25
+ end
26
+
27
+ # @param [TrueClass, FalseClass] with_null
28
+ def with_type(with_null:)
29
+ @type = Apipie::Generator::Swagger::ParamDescription::Type.
30
+ new(@param_description, with_null: with_null, controller_method: @controller_method)
31
+
32
+ self
33
+ end
34
+
35
+ def with_in(http_method:, default_in_value: nil)
36
+ @in = Apipie::Generator::Swagger::ParamDescription::In.new(
37
+ @param_description,
38
+ in_schema: @in_schema,
39
+ default_in_value: default_in_value,
40
+ http_method: http_method
41
+ )
42
+
43
+ self
44
+ end
45
+
46
+ # @return [Hash]
47
+ def to_swagger
48
+ definition = {}
49
+
50
+ definition.merge!(@name.to_hash) if @name.present?
51
+ definition.merge!(@type.to_hash) if @type.present?
52
+ definition.merge!(@in.to_hash) if @in.present?
53
+
54
+ definition.merge!(for_default)
55
+ definition.merge!(for_required)
56
+ definition.merge!(for_example)
57
+ definition.merge!(@description.to_hash) if @description.present?
58
+
59
+ warn_optional_without_default_value(definition)
60
+
61
+ definition
62
+ end
63
+
64
+ private
65
+
66
+ def for_required
67
+ return {} if !required?
68
+
69
+ {
70
+ required: true
71
+ }
72
+ end
73
+
74
+ def for_default
75
+ return {} unless @param_description.options.key?(:default_value)
76
+
77
+ {
78
+ default: @param_description.options[:default_value],
79
+ }
80
+ end
81
+
82
+ def for_example
83
+ return {} unless @param_description.options.key?(:example)
84
+
85
+ {
86
+ example: @param_description.options[:example],
87
+ }
88
+ end
89
+
90
+ def required?
91
+ required_from_path? || @param_description.required
92
+ end
93
+
94
+ def required_from_path?
95
+ @param_description.options[:added_from_path] == true
96
+ end
97
+
98
+ def warn_optional_without_default_value(definition)
99
+ if !required? && !definition.key?(:default)
100
+ method_id =
101
+ if @controller_method.present? && @param_description.is_a?(Apipie::ResponseDescriptionAdapter::PropDesc)
102
+ @controller_method.method_name
103
+ else
104
+ Apipie::Generator::Swagger::MethodDescription::Decorator.new(@controller_method).ruby_name
105
+ end
106
+
107
+ Apipie::Generator::Swagger::Warning.for_code(
108
+ Apipie::Generator::Swagger::Warning::OPTIONAL_WITHOUT_DEFAULT_VALUE_CODE,
109
+ method_id,
110
+ { parameter: @param_description.name }
111
+ ).warn_through_writer
112
+ end
113
+ end
114
+ end