apipie-rails 0.9.2 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rubocop-challenger.yml +1 -1
  3. data/.github/workflows/rubocop.yml +20 -0
  4. data/.rubocop.yml +6 -0
  5. data/.rubocop_todo.yml +256 -371
  6. data/CHANGELOG.md +10 -1
  7. data/README.rst +20 -0
  8. data/apipie-rails.gemspec +4 -0
  9. data/app/views/apipie/apipies/_deprecation.html.erb +16 -0
  10. data/app/views/apipie/apipies/_params.html.erb +7 -1
  11. data/config/locales/en.yml +7 -0
  12. data/lib/apipie/application.rb +4 -6
  13. data/lib/apipie/configuration.rb +13 -2
  14. data/lib/apipie/dsl_definition.rb +2 -2
  15. data/lib/apipie/extractor/recorder.rb +1 -1
  16. data/lib/apipie/extractor.rb +1 -1
  17. data/lib/apipie/markup.rb +9 -8
  18. data/lib/apipie/param_description/deprecation.rb +24 -0
  19. data/lib/apipie/param_description.rb +38 -11
  20. data/lib/apipie/resource_description.rb +1 -1
  21. data/lib/apipie/validator.rb +7 -8
  22. data/lib/apipie/version.rb +1 -1
  23. data/lib/apipie-rails.rb +1 -0
  24. data/lib/tasks/apipie.rake +1 -0
  25. data/spec/controllers/users_controller_spec.rb +8 -1
  26. data/spec/{controllers → lib/apipie}/apipies_controller_spec.rb +2 -2
  27. data/spec/lib/{application_spec.rb → apipie/application_spec.rb} +6 -3
  28. data/spec/lib/apipie/configuration_spec.rb +23 -0
  29. data/spec/lib/apipie/extractor/recorder_spec.rb +40 -0
  30. data/spec/lib/{method_description_spec.rb → apipie/method_description_spec.rb} +4 -4
  31. data/spec/lib/apipie/param_description/deprecation_spec.rb +31 -0
  32. data/spec/lib/{param_description_spec.rb → apipie/param_description_spec.rb} +81 -1
  33. data/spec/lib/{resource_description_spec.rb → apipie/resource_description_spec.rb} +2 -2
  34. data/spec/lib/swagger/swagger_dsl_spec.rb +1 -1
  35. data/spec/spec_helper.rb +1 -1
  36. metadata +76 -28
  37. /data/spec/{lib/swagger/response_validation_spec.rb → controllers/pets_controller_spec.rb} +0 -0
  38. /data/spec/lib/{extractor → apipie/extractor/recorder}/middleware_spec.rb +0 -0
  39. /data/spec/lib/{extractor → apipie/extractor}/writer_spec.rb +0 -0
  40. /data/spec/lib/{extractor → apipie}/extractor_spec.rb +0 -0
  41. /data/spec/lib/{file_handler_spec.rb → apipie/file_handler_spec.rb} +0 -0
  42. /data/spec/lib/{generator → apipie/generator}/swagger/context_spec.rb +0 -0
  43. /data/spec/lib/{generator → apipie/generator}/swagger/operation_id_spec.rb +0 -0
  44. /data/spec/lib/{generator → apipie/generator}/swagger/param_description/builder_spec.rb +0 -0
  45. /data/spec/lib/{generator → apipie/generator}/swagger/param_description/composite_spec.rb +0 -0
  46. /data/spec/lib/{generator → apipie/generator}/swagger/param_description/description_spec.rb +0 -0
  47. /data/spec/lib/{generator → apipie/generator}/swagger/param_description/in_spec.rb +0 -0
  48. /data/spec/lib/{generator → apipie/generator}/swagger/param_description/name_spec.rb +0 -0
  49. /data/spec/lib/{generator → apipie/generator}/swagger/param_description/type_spec.rb +0 -0
  50. /data/spec/lib/{generator → apipie/generator}/swagger/param_description_spec.rb +0 -0
  51. /data/spec/lib/{generator → apipie/generator}/swagger/type_extractor_spec.rb +0 -0
  52. /data/spec/lib/{generator → apipie/generator}/swagger/warning_spec.rb +0 -0
  53. /data/spec/lib/{generator → apipie/generator}/swagger/warning_writer_spec.rb +0 -0
  54. /data/spec/lib/{method_description → apipie/method_description}/apis_service_spec.rb +0 -0
  55. /data/spec/lib/{param_group_spec.rb → apipie/param_group_spec.rb} +0 -0
  56. /data/spec/lib/{validator_spec.rb → apipie/validator_spec.rb} +0 -0
  57. /data/spec/{controllers → test_engine}/memes_controller_spec.rb +0 -0
data/CHANGELOG.md CHANGED
@@ -4,10 +4,19 @@
4
4
  Also deleted the `Gemfile` that was now a broken symlink.
5
5
  please use `export BUNDLE_GEMFILE='gemfiles/Gemfile.rails61'; bundle exec rspec` to run the test suite
6
6
 
7
+ ## [v0.9.3](https://github.com/Apipie/apipie-rails/tree/v0.9.3) (2023-03-08)
8
+ [Full Changelog](https://github.com/Apipie/apipie-rails/compare/v0.9.2...v0.9.3)
9
+ * [Feature] Allow Apipie::ParamDescription to be marked as deprecated [#819](https://github.com/Apipie/apipie-rails/pull/819)[#811](https://github.com/Apipie/apipie-rails/pull/811) (Panos Dalitsouris)
10
+ * [Fix] Make html markup thread safe ([#822](https://github.com/Apipie/apipie-rails/issues/822)) (Adam Růžička)
11
+ * [Feature] Allow action matcher strategy to be configured [#821](https://github.com/Apipie/apipie-rails/pull/821) (Panos Dalitsouris)
12
+ * [CI] Run Rubocop when opening PR [#826](https://github.com/Apipie/apipie-rails/pull/826) (Panos Dalitsouris)
13
+ * [CI] Green rubocop - Fix after rubocop challenger upgrade [#829](https://github.com/Apipie/apipie-rails/pull/829) (Mathieu Jobin)
14
+ * [Rubocop] More Rubocop Auto corrections [#818](https://github.com/Apipie/apipie-rails/pull/818)[#825](https://github.com/Apipie/apipie-rails/pull/825)[#827](https://github.com/Apipie/apipie-rails/pull/827)[#837](https://github.com/Apipie/apipie-rails/pull/837)[#839](https://github.com/Apipie/apipie-rails/pull/839) (Rubocop Challenger)
15
+
7
16
  ## [v0.9.2](https://github.com/Apipie/apipie-rails/tree/v0.9.2) (2023-02-07)
8
17
  [Full Changelog](https://github.com/Apipie/apipie-rails/compare/v0.9.1...v0.9.2)
9
18
  * [Rubocop] More Rubocop Auto corrections [#795](https://github.com/Apipie/apipie-rails/pull/795)[#781](https://github.com/Apipie/apipie-rails/pull/781)[#791](https://github.com/Apipie/apipie-rails/pull/791)[#788](https://github.com/Apipie/apipie-rails/pull/788) (Rubocop Challenger)
10
- * [Fix] Can't include translation in full description ([#446](https://github.com/Apipie/apipie-rails/issues/446)) [#808](https://github.com/Apipie/apipie-rails/pull/808)( Peter Nagy)
19
+ * [Fix] Can't include translation in full description ([#446](https://github.com/Apipie/apipie-rails/issues/446)) [#808](https://github.com/Apipie/apipie-rails/pull/808) (Peter Nagy)
11
20
  * [Refactor] Move swagger param description creation [#810](https://github.com/Apipie/apipie-rails/pull/810) (Panos Dalitsouris)
12
21
  * [Rubocop] Redo rubocop TODOs, set HashSyntax config to most used style [#814](https://github.com/Apipie/apipie-rails/pull/814) (Mathieu Jobin)
13
22
  * [Fix] Swagger missing i18n [#815](https://github.com/Apipie/apipie-rails/pull/815) (@jirubio)
data/README.rst CHANGED
@@ -355,6 +355,22 @@ Example:
355
355
  #...
356
356
  end
357
357
 
358
+ deprecated
359
+ Indicates if the parameter is marked as deprecated.
360
+
361
+ Example
362
+ ~~~~~~~~
363
+
364
+ .. code:: ruby
365
+
366
+ param :pet_name, String, desc: "Name of pet", deprecated: true
367
+ param :pet_name, String, desc: "Name of pet", deprecated: 'Some deprecation info'
368
+ param :pet_name, String, desc: "Name of pet", deprecated: { in: "2.3", info: "Something", sunset: "3.0" }
369
+ def create
370
+ #...
371
+ end
372
+
373
+
358
374
  DRY with param_group
359
375
  --------------------
360
376
 
@@ -982,6 +998,9 @@ reload_controllers
982
998
  api_controllers_matcher
983
999
  For reloading to work properly you need to specify where your API controllers are. Can be an array if multiple paths are needed
984
1000
 
1001
+ api_action_matcher
1002
+ Determines the strategy to identity the correct controller action. Needs to be a class that implements a `.call(controller)` method
1003
+
985
1004
  api_routes
986
1005
  Set if your application uses a custom API router, different from the Rails
987
1006
  default
@@ -1063,6 +1082,7 @@ Example:
1063
1082
  config.markup = Apipie::Markup::Markdown.new
1064
1083
  config.reload_controllers = Rails.env.development?
1065
1084
  config.api_controllers_matcher = File.join(Rails.root, "app", "controllers", "**","*.rb")
1085
+ config.api_action_matcher = proc { |controller| controller.params[:action] }
1066
1086
  config.api_routes = Rails.application.routes
1067
1087
  config.app_info["1.0"] = "
1068
1088
  This is where you can inform user about your application and API
data/apipie-rails.gemspec CHANGED
@@ -1,4 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
+
2
3
  $:.push File.expand_path('lib', __dir__)
3
4
  require "apipie/version"
4
5
 
@@ -28,6 +29,9 @@ Gem::Specification.new do |s|
28
29
  s.add_development_dependency "rspec-rails", "~> 3.0"
29
30
  s.add_development_dependency "rake"
30
31
  s.add_development_dependency 'rubocop_challenger'
32
+ s.add_development_dependency 'rubocop-rails'
33
+ s.add_development_dependency 'rubocop-rspec'
34
+ s.add_development_dependency 'rubocop-performance'
31
35
  s.add_development_dependency "simplecov"
32
36
  s.add_development_dependency "sqlite3"
33
37
  end
@@ -0,0 +1,16 @@
1
+ <% if deprecation.present? %>
2
+ <strong><%= t('apipie.deprecation_details') %></strong>
3
+ <ul>
4
+ <% if deprecation[:deprecated_in].present? %>
5
+ <li><%= t('apipie.deprecation.attributes.deprecated_in') %>: <%= deprecation[:deprecated_in] %></li>
6
+ <% end %>
7
+
8
+ <% if deprecation[:sunset_at].present? %>
9
+ <li><%= t('apipie.deprecation.attributes.sunset_at') %>: <%= deprecation[:sunset_at] %></li>
10
+ <% end %>
11
+
12
+ <% if deprecation[:info].present? %>
13
+ <li><%= t('apipie.deprecation.attributes.info') %>: <%= deprecation[:info] %></li>
14
+ <% end %>
15
+ </ul>
16
+ <% end %>
@@ -7,7 +7,11 @@
7
7
  <% end %>
8
8
  <tr style='background-color:rgb(<%= "#{col},#{col},#{col}" %>);'>
9
9
  <td>
10
- <strong><%= param[:full_name] %> </strong><br>
10
+ <strong><%= param[:full_name] %></strong>
11
+ <% if param[:deprecated].present? %>
12
+ <code><%= t('apipie.deprecated').upcase %></code>
13
+ <% end %>
14
+ <br>
11
15
  <small>
12
16
  <%= param[:required] ? t('apipie.required') : t('apipie.optional') %>
13
17
  <%= param[:allow_nil] ? ', '+t('apipie.nil_allowed') : '' %>
@@ -29,6 +33,8 @@
29
33
  </ul>
30
34
  <%- end %>
31
35
 
36
+ <%= render partial: 'deprecation', locals: { deprecation: param[:deprecation] } %>
37
+
32
38
  <% unless param[:metadata].blank? %>
33
39
  <br>
34
40
  Metadata:
@@ -30,3 +30,10 @@ en:
30
30
  headers: Headers
31
31
  header_name: Header name
32
32
  code: Code
33
+ deprecated: Deprecated
34
+ deprecation_details: Deprecation details
35
+ deprecation:
36
+ attributes:
37
+ deprecated_in: Deprecated in
38
+ sunset_at: Sunset at
39
+ info: Info
@@ -181,9 +181,7 @@ module Apipie
181
181
  else
182
182
  raise ArgumentError.new("Resource #{resource_name} does not exists.")
183
183
  end
184
- unless resource_description.nil?
185
- resource_description.method_description(method_name.to_sym)
186
- end
184
+ resource_description&.method_description(method_name.to_sym)
187
185
  end
188
186
  alias [] get_method_description
189
187
 
@@ -242,7 +240,7 @@ module Apipie
242
240
 
243
241
  # initialize variables for gathering dsl data
244
242
  def init_env
245
- @resource_descriptions = HashWithIndifferentAccess.new { |h, version| h[version] = {} }
243
+ @resource_descriptions = ActiveSupport::HashWithIndifferentAccess.new { |h, version| h[version] = {} }
246
244
  @controller_to_resource_id = {}
247
245
  @param_groups = {}
248
246
  @swagger_generator = Apipie::SwaggerGenerator.new(self)
@@ -388,11 +386,11 @@ module Apipie
388
386
  end
389
387
 
390
388
  def locale
391
- Apipie.configuration.locale.call(nil) if Apipie.configuration.locale
389
+ Apipie.configuration.locale&.call(nil)
392
390
  end
393
391
 
394
392
  def locale=(locale)
395
- Apipie.configuration.locale.call(locale) if Apipie.configuration.locale
393
+ Apipie.configuration.locale&.call(locale)
396
394
  end
397
395
 
398
396
  def translate(str, locale)
@@ -27,6 +27,16 @@ module Apipie
27
27
  # "#{Rails.root}/app/controllers/api/*.rb"
28
28
  attr_accessor :api_controllers_matcher
29
29
 
30
+ # An object that responds to a `.call(controller)` method responsible for
31
+ # matching the correct controller action
32
+ attr_reader :api_action_matcher
33
+
34
+ def api_action_matcher=(callable)
35
+ raise 'Must implement .call method' unless callable.respond_to?(:call)
36
+
37
+ @api_action_matcher = callable
38
+ end
39
+
30
40
  # set to true if you want to reload the controllers at each refresh of the
31
41
  # documentation. It requires +:api_controllers_matcher+ to be set to work
32
42
  # properly.
@@ -147,7 +157,7 @@ module Apipie
147
157
  def initialize
148
158
  @markup = Apipie::Markup::RDoc.new
149
159
  @app_name = "Another API"
150
- @app_info = HashWithIndifferentAccess.new
160
+ @app_info = ActiveSupport::HashWithIndifferentAccess.new
151
161
  @copyright = nil
152
162
  @validate = :implicitly
153
163
  @validate_value = true
@@ -155,7 +165,8 @@ module Apipie
155
165
  @validate_key = false
156
166
  @action_on_non_validated_keys = :raise
157
167
  @required_by_default = false
158
- @api_base_url = HashWithIndifferentAccess.new
168
+ @api_base_url = ActiveSupport::HashWithIndifferentAccess.new
169
+ @api_action_matcher = proc { |controller| controller.params[:action] }
159
170
  @doc_base_url = "/apipie"
160
171
  @layout = "apipie/apipie"
161
172
  @disqus_shortname = nil
@@ -145,7 +145,7 @@ module Apipie
145
145
  # EOS
146
146
  def resource_description(options = {}, &block) #:doc:
147
147
  return unless Apipie.active_dsl?
148
- raise ArgumentError, "Block expected" unless block_given?
148
+ raise ArgumentError, "Block expected" unless block
149
149
 
150
150
  dsl_data = ResourceDescriptionDsl.eval_dsl(self, &block)
151
151
  versions = dsl_data[:api_versions]
@@ -508,7 +508,7 @@ module Apipie
508
508
  end
509
509
 
510
510
  def _apipie_update_meta(method_desc, dsl_data)
511
- return unless dsl_data[:meta] && dsl_data[:meta].is_a?(Hash)
511
+ return unless dsl_data[:meta].is_a?(Hash)
512
512
 
513
513
  method_desc.metadata ||= {}
514
514
  method_desc.metadata.merge!(dsl_data[:meta])
@@ -24,7 +24,7 @@ module Apipie
24
24
 
25
25
  def analyse_controller(controller)
26
26
  @controller = controller.class
27
- @action = controller.params[:action]
27
+ @action = Apipie.configuration.api_action_matcher.call(controller)
28
28
  end
29
29
 
30
30
  def analyse_response(response)
@@ -157,7 +157,7 @@ module Apipie
157
157
  method_key = "#{Apipie.get_resource_name(controller.safe_constantize || next)}##{action}"
158
158
  old_apis = apis_from_docs[method_key] || []
159
159
  new_apis.each do |new_api|
160
- new_api[:path].sub!(/\(\.:format\)$/,"") if new_api[:path]
160
+ new_api[:path]&.sub!(/\(\.:format\)$/,"")
161
161
  old_api = old_apis.find do |api|
162
162
  api[:path] == "#{@api_prefix}#{new_api[:path]}"
163
163
  end
data/lib/apipie/markup.rb CHANGED
@@ -4,6 +4,11 @@ module Apipie
4
4
 
5
5
  class RDoc
6
6
 
7
+ def initialize
8
+ require 'rdoc'
9
+ require 'rdoc/markup/to_html'
10
+ end
11
+
7
12
  def to_html(text)
8
13
  rdoc.convert(text)
9
14
  end
@@ -11,14 +16,10 @@ module Apipie
11
16
  private
12
17
 
13
18
  def rdoc
14
- @rdoc ||= begin
15
- require 'rdoc'
16
- require 'rdoc/markup/to_html'
17
- if Gem::Version.new(::RDoc::VERSION) < Gem::Version.new('4.0.0')
18
- ::RDoc::Markup::ToHtml.new()
19
- else
20
- ::RDoc::Markup::ToHtml.new(::RDoc::Options.new)
21
- end
19
+ if Gem::Version.new(::RDoc::VERSION) < Gem::Version.new('4.0.0')
20
+ ::RDoc::Markup::ToHtml.new()
21
+ else
22
+ ::RDoc::Markup::ToHtml.new(::RDoc::Options.new)
22
23
  end
23
24
  end
24
25
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Apipie
4
+ class ParamDescription
5
+ # Data transfer object, used when param description is deprecated
6
+ class Deprecation
7
+ attr_reader :info, :deprecated_in, :sunset_at
8
+
9
+ def initialize(info: nil, deprecated_in: nil, sunset_at: nil)
10
+ @info = info
11
+ @deprecated_in = deprecated_in
12
+ @sunset_at = sunset_at
13
+ end
14
+
15
+ def to_json(*_args)
16
+ {
17
+ info: @info,
18
+ deprecated_in: @deprecated_in,
19
+ sunset_at: @sunset_at
20
+ }
21
+ end
22
+ end
23
+ end
24
+ end
@@ -97,6 +97,7 @@ module Apipie
97
97
  @validations = Array(options[:validations]).map {|v| concern_subst(Apipie.markup_to_html(v)) }
98
98
 
99
99
  @additional_properties = @options[:additional_properties]
100
+ @deprecated = @options[:deprecated] || false
100
101
  end
101
102
 
102
103
  def from_concern?
@@ -155,17 +156,25 @@ module Apipie
155
156
  end
156
157
 
157
158
  def to_json(lang = nil)
158
- hash = { :name => name.to_s,
159
- :full_name => full_name,
160
- :description => preformat_text(Apipie.app.translate(@options[:desc], lang)),
161
- :required => required,
162
- :allow_nil => allow_nil,
163
- :allow_blank => allow_blank,
164
- :validator => validator.to_s,
165
- :expected_type => validator.expected_type,
166
- :metadata => metadata,
167
- :show => show,
168
- :validations => validations }
159
+ hash = {
160
+ name: name.to_s,
161
+ full_name: full_name,
162
+ description: preformat_text(Apipie.app.translate(@options[:desc], lang)),
163
+ required: required,
164
+ allow_nil: allow_nil,
165
+ allow_blank: allow_blank,
166
+ validator: validator.to_s,
167
+ expected_type: validator.expected_type,
168
+ metadata: metadata,
169
+ show: show,
170
+ validations: validations,
171
+ deprecated: deprecated?
172
+ }
173
+
174
+ if deprecation.present?
175
+ hash[:deprecation] = deprecation.to_json
176
+ end
177
+
169
178
  if sub_params = validator.params_ordered
170
179
  hash[:params] = sub_params.map { |p| p.to_json(lang)}
171
180
  end
@@ -279,6 +288,24 @@ module Apipie
279
288
  end
280
289
  end
281
290
 
291
+ def deprecated?
292
+ @deprecated.present?
293
+ end
294
+
295
+ def deprecation
296
+ return if @deprecated.blank? || @deprecated == true
297
+
298
+ case @deprecated
299
+ when Hash
300
+ Apipie::ParamDescription::Deprecation.new(
301
+ info: @deprecated[:info],
302
+ deprecated_in: @deprecated[:in],
303
+ sunset_at: @deprecated[:sunset]
304
+ )
305
+ when String
306
+ Apipie::ParamDescription::Deprecation.new(info: @deprecated)
307
+ end
308
+ end
282
309
  end
283
310
 
284
311
  end
@@ -17,7 +17,7 @@ module Apipie
17
17
  :_path, :_name, :_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, &block)
20
+ def initialize(controller, resource_name, dsl_data = nil, version = nil)
21
21
 
22
22
  @_methods = ActiveSupport::OrderedHash.new
23
23
  @_params_args = []
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
+
2
3
  module Apipie
3
4
 
4
5
  module Validator
@@ -344,14 +345,12 @@ module Apipie
344
345
 
345
346
  def validate(value)
346
347
  return false if !value.is_a? Hash
347
- if @hash_params
348
- @hash_params.each do |k, p|
349
- if Apipie.configuration.validate_presence?
350
- raise ParamMissing.new(p) if p.required && !value.key?(k)
351
- end
352
- if Apipie.configuration.validate_value?
353
- p.validate(value[k]) if value.key?(k)
354
- end
348
+ @hash_params&.each do |k, p|
349
+ if Apipie.configuration.validate_presence?
350
+ raise ParamMissing.new(p) if p.required && !value.key?(k)
351
+ end
352
+ if Apipie.configuration.validate_value?
353
+ p.validate(value[k]) if value.key?(k)
355
354
  end
356
355
  end
357
356
  return true
@@ -1,3 +1,3 @@
1
1
  module Apipie
2
- VERSION = "0.9.2"
2
+ VERSION = "0.9.3"
3
3
  end
data/lib/apipie-rails.rb CHANGED
@@ -12,6 +12,7 @@ require "apipie/configuration"
12
12
  require "apipie/method_description"
13
13
  require "apipie/resource_description"
14
14
  require "apipie/param_description"
15
+ require "apipie/param_description/deprecation"
15
16
  require "apipie/method_description/api"
16
17
  require "apipie/method_description/apis_service"
17
18
  require "apipie/errors"
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
+
2
3
  require 'fileutils'
3
4
 
4
5
  namespace :apipie do
@@ -269,6 +269,7 @@ describe UsersController do
269
269
  :allow_blank => false,
270
270
  :metadata => nil,
271
271
  :show => true,
272
+ :deprecated => false,
272
273
  :expected_type => "hash",
273
274
  :validations => [])
274
275
  end
@@ -585,6 +586,7 @@ describe UsersController do
585
586
  :description=>"\n<p>Authorization</p>\n",
586
587
  :name=>"oauth",
587
588
  :show=>true,
589
+ :deprecated=>false,
588
590
  :expected_type=>"string"},
589
591
  {:validator=>"Must be a Hash",
590
592
  :description=>"\n<p>Deprecated parameter not documented</p>\n",
@@ -595,15 +597,17 @@ describe UsersController do
595
597
  :required=>false,
596
598
  :full_name=>"legacy_param",
597
599
  :show=>false,
600
+ :deprecated=>false,
598
601
  :params=>
599
602
  [{:validator=>"Must be a Hash",
600
603
  :description=>"\n<p>Param description for all methods</p>\n",
601
604
  :expected_type=>"hash",
602
605
  :allow_nil=>false,
603
- :allow_blank => false,
606
+ :allow_blank => false,
604
607
  :name=>"resource_param",
605
608
  :required=>false,
606
609
  :full_name=>"resource_param",
610
+ :deprecated=>false,
607
611
  :show=>true,
608
612
  :params=>
609
613
  [{:required=>true,
@@ -613,6 +617,7 @@ describe UsersController do
613
617
  :description=>"\n<p>Username for login</p>\n",
614
618
  :name=>"ausername", :full_name=>"resource_param[ausername]",
615
619
  :show=>true,
620
+ :deprecated=>false,
616
621
  :expected_type=>"string"},
617
622
  {:required=>true,
618
623
  :allow_nil => false,
@@ -621,6 +626,7 @@ describe UsersController do
621
626
  :description=>"\n<p>Password for login</p>\n",
622
627
  :name=>"apassword", :full_name=>"resource_param[apassword]",
623
628
  :show=>true,
629
+ :deprecated=>false,
624
630
  :expected_type=>"string"}
625
631
  ]}
626
632
  ]
@@ -631,6 +637,7 @@ describe UsersController do
631
637
  :description=>"\n<p>Company ID</p>\n",
632
638
  :name=>"id", :full_name=>"id",
633
639
  :show=>true,
640
+ :deprecated=>false,
634
641
  :expected_type=>"numeric"},
635
642
  ],
636
643
  :name => 'two_urls',
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
  require 'fileutils'
3
3
  require "json-schema"
4
4
 
5
- describe Apipie::ApipiesController do
5
+ describe Apipie::ApipiesController, type: :controller do
6
6
 
7
7
  describe "GET index" do
8
8
 
@@ -159,7 +159,7 @@ describe Apipie::ApipiesController do
159
159
  describe "GET index as swagger" do
160
160
 
161
161
  let(:swagger_schema) do
162
- File.read(File.join(File.dirname(__FILE__),"../lib/swagger/openapi_2_0_schema.json"))
162
+ File.read("#{Rails.root.parent}/lib/swagger/openapi_2_0_schema.json")
163
163
  end
164
164
 
165
165
  it "outputs swagger when format is json and type is swagger" do
@@ -3,7 +3,10 @@ require "spec_helper"
3
3
  describe Apipie::Application do
4
4
 
5
5
  describe "api_controllers_paths" do
6
- before { Apipie.configuration.api_controllers_matcher = [File.join(Rails.root, "app", "controllers", "**","*.rb"), File.join(Rails.root, "lib", "**","*.rb")] }
6
+ before do
7
+ Apipie.configuration.api_controllers_matcher = [File.join(Rails.root, "app", "controllers", "**","*.rb"),
8
+ File.join(Rails.root, "lib", "**","*.rb")]
9
+ end
7
10
 
8
11
  it "should support receiving array as parameter" do
9
12
  expect { Apipie.api_controllers_paths}.
@@ -19,11 +22,11 @@ describe Apipie::Application do
19
22
  context "with namespaced_resources enabled" do
20
23
  before { Apipie.configuration.namespaced_resources = true }
21
24
  context "with a defined base url" do
22
-
25
+
23
26
  it "should not overwrite the parent resource" do
24
27
  is_expected.not_to eq(Apipie.get_resource_name(Api::V2::ArchitecturesController))
25
28
  end
26
-
29
+
27
30
  end
28
31
 
29
32
  context "with an undefined base url" do
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe 'Apipie::Configuration' do
6
+ let(:configuration) { Apipie::Configuration.new }
7
+
8
+ describe '#api_action_matcher=' do
9
+ subject(:setter) { configuration.api_action_matcher = matcher }
10
+
11
+ let(:matcher) { proc { |_| :some_action } }
12
+
13
+ it { is_expected.to eq(matcher) }
14
+
15
+ context 'when matcher does not implement .call method' do
16
+ let(:matcher) { 'I do not implement .call' }
17
+
18
+ it 'raises and exception' do
19
+ expect { setter }.to raise_error('Must implement .call method')
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe 'Apipie::Extractor::Recorder' do
6
+ let(:recorder) { Apipie::Extractor::Recorder.new }
7
+
8
+ describe '#analyse_controller' do
9
+ subject do
10
+ recorder.analyse_controller(controller)
11
+ recorder.record[:action]
12
+ end
13
+
14
+ let(:action) { :show }
15
+
16
+ let(:request) do
17
+ request = ActionDispatch::Request.new({})
18
+ request.request_parameters = { action: action }
19
+ request
20
+ end
21
+
22
+ let(:controller) do
23
+ controller = ActionController::Metal.new
24
+ controller.set_request!(request)
25
+ controller
26
+ end
27
+
28
+ it { is_expected.to eq(action) }
29
+
30
+ context 'when a api_action_matcher is configured' do
31
+ let(:matcher_action) { "#{action}_from_new_matcher" }
32
+
33
+ before do
34
+ Apipie.configuration.api_action_matcher = proc { |_| matcher_action }
35
+ end
36
+
37
+ it { is_expected.to eq(matcher_action) }
38
+ end
39
+ end
40
+ end
@@ -58,12 +58,12 @@ describe Apipie::MethodDescription do
58
58
 
59
59
  it "should be ordered" do
60
60
  expect(@method.params.keys).to eq([:a, :b, :c])
61
- expect(@method.to_json[:params].map{|h| h[:name]}).to eq(['a', 'b', 'c'])
61
+ expect(@method.to_json[:params].map { |h| h[:name] }).to eq(['a', 'b', 'c'])
62
62
  end
63
63
 
64
64
  it "should be still ordered" do
65
65
  expect(@method.params.keys).to eq([:a, :b, :c])
66
- expect(@method.to_json[:params].map{|h| h[:name]}).to eq(['a', 'b', 'c'])
66
+ expect(@method.to_json[:params].map { |h| h[:name] }).to eq(['a', 'b', 'c'])
67
67
  end
68
68
 
69
69
  end
@@ -80,7 +80,7 @@ describe Apipie::MethodDescription do
80
80
 
81
81
  it "should ignore response-only parameters" do
82
82
  expect(@method.params.keys).to eq([:a, :c])
83
- expect(@method.to_json[:params].map{|h| h[:name]}).to eq(['a', 'c'])
83
+ expect(@method.to_json[:params].map { |h| h[:name] }).to eq(['a', 'c'])
84
84
  end
85
85
  end
86
86
 
@@ -90,7 +90,7 @@ describe Apipie::MethodDescription do
90
90
  @resource = Apipie::ResourceDescription.new(ApplicationController, "dummy")
91
91
  dsl_data[:returns] = { 200 => [{:param_group => 'pet', :array_of => 'pet'}, nil, nil] }
92
92
 
93
- expect {Apipie::MethodDescription.new(:a, @resource, dsl_data)}.to raise_error(Apipie::ReturnsMultipleDefinitionError)
93
+ expect { Apipie::MethodDescription.new(:a, @resource, dsl_data) }.to raise_error(Apipie::ReturnsMultipleDefinitionError)
94
94
  end
95
95
  end
96
96
 
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+
3
+ describe Apipie::ParamDescription::Deprecation do
4
+ let(:info) { nil }
5
+ let(:deprecated_in) { nil }
6
+ let(:sunset_at) { nil }
7
+
8
+ let(:deprecation) do
9
+ described_class.new(
10
+ info: info,
11
+ deprecated_in: deprecated_in,
12
+ sunset_at: sunset_at
13
+ )
14
+ end
15
+
16
+ describe '#to_json' do
17
+ subject { deprecation.to_json }
18
+
19
+ it { is_expected.to eq({ info: nil, deprecated_in: nil, sunset_at: nil }) }
20
+
21
+ context 'when attributes are given' do
22
+ let(:info) { 'info' }
23
+ let(:deprecated_in) { '2.3' }
24
+ let(:sunset_at) { '3.0' }
25
+
26
+ it 'returns the correct attributes' do
27
+ expect(subject).to eq({ info: info, deprecated_in: deprecated_in, sunset_at: sunset_at })
28
+ end
29
+ end
30
+ end
31
+ end