apipie-rails 1.2.0 → 1.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 73f474f2a3ff7eda3acca1a76fb6199da314c0ad3c9a1241662bad03d3e762c9
4
- data.tar.gz: 677da6befb97f5eb0c6c761758c0e159cabe8de3d2bf15b2acdb2bc03f3d069f
3
+ metadata.gz: 555b019a70732e777c4f42b25dd62362be62674c55f31dba9106434969ff7f9f
4
+ data.tar.gz: e63cd96de5768bc21b4a86b755b883440a36ca8c8914ec5af4c89dfe525d94ab
5
5
  SHA512:
6
- metadata.gz: 2fc436669c44ca181d6a1fce639762bba9ae7f508d9527c52bbcf1e9846135bc94de36f7148e8b29273cf6f6e389aa6104cf0da7410d18c33856afa0a7f264e2
7
- data.tar.gz: afaedf8cdb2c0d0e326dcc82d896e9dd524cbc91b5c914e44c0b62272076f4830f8318e14985e59dfdceb81b7d4d5b7865dd27b82ffb687f100943cba0d6ac6b
6
+ metadata.gz: 0d6aca2dea2281738587924ee7e3388b1b36beb25d9bac7e46f05044080535f52fb77a3523d9262344410f3d76683c0d33a7d0188d99a51d957a9f9392ba7a3e
7
+ data.tar.gz: 7f74cc96e3694406b579649cbd44b8a9ab7d7c273b57d93a7530e1b67a2e32dca27efa408b27a10d87f342abc5badde819e7f02e363ff3d924d3988db33501f2
data/.rubocop.yml CHANGED
@@ -46,7 +46,7 @@ Metrics/ClassLength:
46
46
  - spec/dummy/app/controllers/users_controller.rb
47
47
 
48
48
  Metrics/BlockLength:
49
- Max: 25 # default
49
+ Max: 26 # default
50
50
  Exclude:
51
51
  - app/controllers/apipie/apipies_controller.rb
52
52
  - lib/apipie/generator/swagger/param_description/composite.rb
data/.rubocop_todo.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config --exclude-limit 180`
3
- # on 2023-06-02 23:32:14 UTC using RuboCop version 1.52.0.
3
+ # on 2023-06-09 05:29:05 UTC using RuboCop version 1.52.0.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
@@ -118,7 +118,7 @@ Layout/ElseAlignment:
118
118
  - 'lib/apipie/param_description.rb'
119
119
  - 'lib/apipie/resource_description.rb'
120
120
 
121
- # Offense count: 59
121
+ # Offense count: 58
122
122
  # This cop supports safe autocorrection (--autocorrect).
123
123
  Layout/EmptyLineAfterGuardClause:
124
124
  Exclude:
@@ -783,6 +783,12 @@ Lint/Void:
783
783
  Metrics/AbcSize:
784
784
  Max: 96
785
785
 
786
+ # Offense count: 1
787
+ # Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns, inherit_mode.
788
+ # AllowedMethods: refine
789
+ Metrics/BlockLength:
790
+ Max: 26
791
+
786
792
  # Offense count: 4
787
793
  # Configuration parameters: CountBlocks.
788
794
  Metrics/BlockNesting:
@@ -793,11 +799,16 @@ Metrics/BlockNesting:
793
799
  Metrics/CyclomaticComplexity:
794
800
  Max: 24
795
801
 
796
- # Offense count: 78
802
+ # Offense count: 79
797
803
  # Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
798
804
  Metrics/MethodLength:
799
805
  Max: 58
800
806
 
807
+ # Offense count: 1
808
+ # Configuration parameters: CountComments, CountAsOne.
809
+ Metrics/ModuleLength:
810
+ Max: 101
811
+
801
812
  # Offense count: 4
802
813
  # Configuration parameters: CountKeywordArgs.
803
814
  Metrics/ParameterLists:
@@ -1048,7 +1059,7 @@ RSpec/EmptyLineAfterHook:
1048
1059
  RSpec/ExampleLength:
1049
1060
  Max: 85
1050
1061
 
1051
- # Offense count: 158
1062
+ # Offense count: 159
1052
1063
  # This cop supports safe autocorrection (--autocorrect).
1053
1064
  # Configuration parameters: CustomTransform, IgnoredWords, DisallowedExamples.
1054
1065
  # DisallowedExamples: works
@@ -1137,7 +1148,7 @@ RSpec/MessageSpies:
1137
1148
  RSpec/MultipleExpectations:
1138
1149
  Max: 19
1139
1150
 
1140
- # Offense count: 154
1151
+ # Offense count: 156
1141
1152
  # Configuration parameters: AllowSubject.
1142
1153
  RSpec/MultipleMemoizedHelpers:
1143
1154
  Max: 15
@@ -1162,18 +1173,17 @@ RSpec/NamedSubject:
1162
1173
  - 'spec/lib/swagger/rake_swagger_spec.rb'
1163
1174
  - 'spec/lib/swagger/swagger_dsl_spec.rb'
1164
1175
 
1165
- # Offense count: 93
1176
+ # Offense count: 94
1166
1177
  # Configuration parameters: AllowedGroups.
1167
1178
  RSpec/NestedGroups:
1168
1179
  Max: 6
1169
1180
 
1170
- # Offense count: 2
1181
+ # Offense count: 1
1171
1182
  # Configuration parameters: AllowedPatterns.
1172
1183
  # AllowedPatterns: ^expect_, ^assert_
1173
1184
  RSpec/NoExpectationExample:
1174
1185
  Exclude:
1175
1186
  - 'spec/controllers/users_controller_spec.rb'
1176
- - 'spec/test_engine/memes_controller_spec.rb'
1177
1187
 
1178
1188
  # Offense count: 2
1179
1189
  # This cop supports safe autocorrection (--autocorrect).
@@ -1366,7 +1376,7 @@ Style/AndOr:
1366
1376
  Exclude:
1367
1377
  - 'lib/apipie/param_description.rb'
1368
1378
 
1369
- # Offense count: 17
1379
+ # Offense count: 18
1370
1380
  # This cop supports safe autocorrection (--autocorrect).
1371
1381
  # Configuration parameters: EnforcedStyle, ProceduralMethods, FunctionalMethods, AllowedMethods, AllowedPatterns, AllowBracesOnProceduralOneLiners, BracesRequiredMethods.
1372
1382
  # SupportedStyles: line_count_based, semantic, braces_for_chaining, always_braces
@@ -1522,7 +1532,7 @@ Style/EmptyElse:
1522
1532
  - 'lib/apipie/extractor/recorder.rb'
1523
1533
  - 'lib/apipie/extractor/writer.rb'
1524
1534
 
1525
- # Offense count: 26
1535
+ # Offense count: 27
1526
1536
  # This cop supports safe autocorrection (--autocorrect).
1527
1537
  # Configuration parameters: EnforcedStyle.
1528
1538
  # SupportedStyles: compact, expanded
@@ -1765,7 +1775,6 @@ Style/Proc:
1765
1775
  Style/RaiseArgs:
1766
1776
  Exclude:
1767
1777
  - 'lib/apipie/application.rb'
1768
- - 'lib/apipie/dsl_definition.rb'
1769
1778
  - 'lib/apipie/extractor/writer.rb'
1770
1779
  - 'lib/apipie/param_description.rb'
1771
1780
  - 'lib/apipie/see_description.rb'
@@ -1917,7 +1926,7 @@ Style/StringConcatenation:
1917
1926
  - 'lib/apipie/application.rb'
1918
1927
  - 'lib/apipie/extractor/writer.rb'
1919
1928
 
1920
- # Offense count: 1210
1929
+ # Offense count: 1212
1921
1930
  # This cop supports safe autocorrection (--autocorrect).
1922
1931
  # Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline.
1923
1932
  # SupportedStyles: single_quotes, double_quotes
data/CHANGELOG.md CHANGED
@@ -1,6 +1,14 @@
1
1
  Changelog
2
2
  ===========
3
3
 
4
+ ## [v1.2.1](https://github.com/Apipie/apipie-rails/tree/v1.2.1) (2023-06-09)
5
+ [Full Changelog](https://github.com/Apipie/apipie-rails/compare/v1.2.0...v1.2.1)
6
+ * rspec: Fixes deprecated matcher ([#882](https://github.com/Apipie/apipie-rails/pull/882)) (David Wessman)
7
+ * Fix streaming bug ([#677](https://github.com/Apipie/apipie-rails/pull/677)) (Hunter Braun)
8
+ * Update README URLs based on HTTP redirects ([#448](https://github.com/Apipie/apipie-rails/pull/448)) (ReadmeCritic)
9
+ * Swagger: Adds option to skip default tags ([#881](https://github.com/Apipie/apipie-rails/pull/881)) (David Wessman)
10
+ * Parameter validation: Raises error for all missing ([#886](https://github.com/Apipie/apipie-rails/pull/886)) (David Wessman)
11
+
4
12
  ## [v1.2.0](https://github.com/Apipie/apipie-rails/tree/v1.2.0) (2023-06-03)
5
13
  [Full Changelog](https://github.com/Apipie/apipie-rails/compare/v1.1.0...v1.2.0)
6
14
  * Allow resource_name to be inherited ([#872](https://github.com/Apipie/apipie-rails/pull/872)) (Eric Hankins)
data/README.rst CHANGED
@@ -56,7 +56,7 @@ Run your application and see the result at
56
56
  use ``http://localhost:3000/apipie.json``.
57
57
 
58
58
  For a more comprehensive getting started guide, see
59
- `this demo <https://github.com/iNecas/apipie-demo>`_, which includes
59
+ `this demo <https://github.com/Apipie/apipie-demo>`_, which includes
60
60
  features such as generating documentation from tests, recording examples etc.
61
61
 
62
62
  Screenshots
@@ -78,7 +78,7 @@ See `Contributors page <https://github.com/Apipie/apipie-rails/graphs/contribut
78
78
  License
79
79
  -------
80
80
 
81
- Apipie-rails is released under the `MIT License <http://opensource.org/licenses/MIT>`_
81
+ Apipie-rails is released under the `MIT License <https://opensource.org/licenses/MIT>`_
82
82
 
83
83
  ===============
84
84
  Documentation
@@ -1730,6 +1730,9 @@ There are several configuration parameters that determine the structure of the g
1730
1730
  See [https://swagger.io/docs/specification/2-0/authentication/] for details of what values can be specified
1731
1731
  By default, no security is defined.
1732
1732
 
1733
+ ``config.generator.swagger.skip_default_tags``
1734
+ By setting ``false`` (default): The resource name for e.g. ``/pets/{petId}`` will automatically be added as a tag ``pets``.
1735
+ By setting ``true``: The tags needs to be explicitly added to the resource using the DSL.
1733
1736
 
1734
1737
  Known limitations of the current implementation
1735
1738
  -------------------------------------------------
@@ -1940,7 +1943,7 @@ Then, you can install dependencies and run the test suite:
1940
1943
  Disqus Integration
1941
1944
  ====================
1942
1945
 
1943
- You can setup `Disqus <http://www.disqus.com>`_ discussion within
1946
+ You can setup `Disqus <https://disqus.com/>`_ discussion within
1944
1947
  your documentation. Just set the credentials in the Apipie
1945
1948
  configuration:
1946
1949
 
@@ -241,9 +241,11 @@ module Apipie
241
241
  method_params = self.class._apipie_get_method_params(action_name)
242
242
 
243
243
  if Apipie.configuration.validate_presence?
244
- method_params.each do |_, param|
245
- # check if required parameters are present
246
- raise ParamMissing.new(param) if param.required && !params.key?(param.name)
244
+ Validator::BaseValidator.raise_if_missing_params do |missing|
245
+ method_params.each do |_, param|
246
+ # check if required parameters are present
247
+ missing << param if param.required && !params.key?(param.name)
248
+ end
247
249
  end
248
250
  end
249
251
 
@@ -285,7 +287,6 @@ module Apipie
285
287
  old_method.bind(self).call(*args)
286
288
  end
287
289
  end
288
-
289
290
  end
290
291
  end
291
292
 
data/lib/apipie/errors.rb CHANGED
@@ -24,6 +24,20 @@ module Apipie
24
24
  end
25
25
  end
26
26
 
27
+ class ParamMultipleMissing < ParamError
28
+ attr_accessor :params
29
+
30
+ def initialize(params)
31
+ @params = params
32
+ end
33
+
34
+ def to_s
35
+ params.map do |param|
36
+ ParamMissing.new(param).to_s
37
+ end.join("\n")
38
+ end
39
+ end
40
+
27
41
  class ParamMissing < DefinedParamError
28
42
  def to_s
29
43
  unless @param.options[:missing_message].nil?
@@ -15,10 +15,13 @@ class Apipie::Railtie
15
15
  end
16
16
  end
17
17
  end
18
- app.middleware.use ::Apipie::Extractor::Recorder::Middleware
19
18
 
20
- ActionController::TestCase.send(:prepend, Apipie::Extractor::Recorder::FunctionalTestRecording)
21
- ActionController::TestCase::Behavior.send(:prepend, Apipie::Extractor::Recorder::FunctionalTestRecording)
19
+ if Apipie.configuration.record
20
+ app.middleware.use ::Apipie::Extractor::Recorder::Middleware
21
+
22
+ ActionController::TestCase.send(:prepend, Apipie::Extractor::Recorder::FunctionalTestRecording)
23
+ ActionController::TestCase::Behavior.send(:prepend, Apipie::Extractor::Recorder::FunctionalTestRecording)
24
+ end
22
25
  end
23
26
  end
24
27
 
@@ -10,7 +10,7 @@ module Apipie
10
10
  :json_input_uses_refs, :suppress_warnings, :api_host,
11
11
  :generate_x_computed_id_field, :allow_additional_properties_in_response,
12
12
  :responses_use_refs, :schemes, :security_definitions,
13
- :global_security].freeze
13
+ :global_security, :skip_default_tags].freeze
14
14
 
15
15
  attr_accessor(*CONFIG_ATTRIBUTES)
16
16
 
@@ -43,6 +43,7 @@ module Apipie
43
43
  alias include_warning_tags? include_warning_tags
44
44
  alias json_input_uses_refs? json_input_uses_refs
45
45
  alias responses_use_refs? responses_use_refs
46
+ alias skip_default_tags? skip_default_tags
46
47
  alias generate_x_computed_id_field? generate_x_computed_id_field
47
48
  alias swagger_include_warning_tags? swagger_include_warning_tags
48
49
  alias swagger_json_input_uses_refs? swagger_json_input_uses_refs
@@ -61,6 +62,7 @@ module Apipie
61
62
  @schemes = [:https]
62
63
  @security_definitions = {}
63
64
  @global_security = []
65
+ @skip_default_tags = false
64
66
  end
65
67
 
66
68
  def self.deprecated_methods
@@ -47,9 +47,12 @@ class Apipie::Generator::Swagger::MethodDescription::ApiSchemaService
47
47
  end
48
48
 
49
49
  def tags
50
- [@method_description.resource._id] +
51
- warning_tags +
52
- @method_description.tag_list.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
53
56
  end
54
57
 
55
58
  def warning_tags
@@ -38,6 +38,16 @@ module Apipie
38
38
  return nil
39
39
  end
40
40
 
41
+ def self.raise_if_missing_params
42
+ missing_params = []
43
+ yield missing_params
44
+ if missing_params.size > 1
45
+ raise ParamMultipleMissing.new(missing_params)
46
+ elsif missing_params.size == 1
47
+ raise ParamMissing.new(missing_params.first)
48
+ end
49
+ end
50
+
41
51
  # check if value is valid
42
52
  def valid?(value)
43
53
  if self.validate(value)
@@ -345,14 +355,18 @@ module Apipie
345
355
 
346
356
  def validate(value)
347
357
  return false if !value.is_a? Hash
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)
358
+
359
+ BaseValidator.raise_if_missing_params do |missing|
360
+ @hash_params&.each do |k, p|
361
+ if Apipie.configuration.validate_presence?
362
+ missing << p if p.required && !value.key?(k)
363
+ end
364
+ if Apipie.configuration.validate_value?
365
+ p.validate(value[k]) if value.key?(k)
366
+ end
354
367
  end
355
368
  end
369
+
356
370
  return true
357
371
  end
358
372
 
@@ -1,3 +1,3 @@
1
1
  module Apipie
2
- VERSION = "1.2.0"
2
+ VERSION = "1.2.1"
3
3
  end
@@ -37,6 +37,7 @@ describe UsersController do
37
37
  expect(methods.keys).to include(:update)
38
38
  expect(methods.keys).to include(:two_urls)
39
39
  expect(methods.keys).to include(:action_with_headers)
40
+ expect(methods.keys).to include(:multiple_required_params)
40
41
  end
41
42
 
42
43
  it "should contain info about resource" do
@@ -101,6 +102,10 @@ describe UsersController do
101
102
  expect { get :show, :params => { :id => 5 }}.to raise_error(Apipie::ParamMissing, /session_parameter_is_required/)
102
103
  end
103
104
 
105
+ it "should fail if multiple required parameters are missing" do
106
+ expect { get :multiple_required_params }.to raise_error(Apipie::ParamMultipleMissing, /required_param1.*\n.*required_param2|required_param2.*\n.*required_parameter1/)
107
+ end
108
+
104
109
  it "should pass if required parameter has wrong type" do
105
110
  expect { get :show, :params => { :id => 5 , :session => "secret_hash" }}.not_to raise_error
106
111
  expect { get :show, :params => { :id => "ten" , :session => "secret_hash" }}.not_to raise_error
@@ -246,6 +251,11 @@ describe UsersController do
246
251
  post :create, :params => { :user => { :name => "root", :pass => "12345", :membership => "____" } }
247
252
  }.to raise_error(Apipie::ParamInvalid, /membership/)
248
253
 
254
+ # Should include both pass and name
255
+ expect {
256
+ post :create, :params => { :user => { :membership => "standard" } }
257
+ }.to raise_error(Apipie::ParamMultipleMissing, /pass.*\n.*name|name.*\n.*pass/)
258
+
249
259
  expect {
250
260
  post :create, :params => { :user => { :name => "root" } }
251
261
  }.to raise_error(Apipie::ParamMissing, /pass/)
@@ -301,4 +301,10 @@ class UsersController < ApplicationController
301
301
  header :HeaderNameWithDefaultValue, 'Header with default value', required: true, default: 'default value'
302
302
  def action_with_headers
303
303
  end
304
+
305
+ api :GET, '/users/multiple_required_params'
306
+ param :required_param1, String, required: true
307
+ param :required_param2, String, required: true
308
+ def multiple_required_params
309
+ end
304
310
  end
@@ -8,6 +8,7 @@ Dummy::Application.routes.draw do
8
8
  resources :users do
9
9
  collection do
10
10
  post :create_route
11
+ get :multiple_required_params
11
12
  end
12
13
  end
13
14
  resources :concerns, :only => [:index, :show]
@@ -64,6 +64,19 @@ describe Apipie::Generator::Swagger::MethodDescription::ApiSchemaService do
64
64
  it { is_expected.to include(*tags) }
65
65
  end
66
66
 
67
+ context 'when Apipie.configuration.generator.swagger.skip_default_tags is enabled' do
68
+ before { Apipie.configuration.generator.swagger.skip_default_tags = true }
69
+ after { Apipie.configuration.generator.swagger.skip_default_tags = false }
70
+
71
+ it { is_expected.to be_empty }
72
+
73
+ context 'when tags are available' do
74
+ let(:tags) { ['Tag 1', 'Tag 2'] }
75
+
76
+ it { is_expected.to eq(tags) }
77
+ end
78
+ end
79
+
67
80
  context 'when Apipie.configuration.generator.swagger.include_warning_tags is enabled' do
68
81
  before { Apipie.configuration.generator.swagger.include_warning_tags = true }
69
82
 
@@ -4,7 +4,7 @@ describe TestEngine::MemesController do
4
4
 
5
5
  describe "#index" do
6
6
  it "should have the full mounted path of engine" do
7
- Apipie.routes_for_action(TestEngine::MemesController, :index, {}).first[:path].should eq("/test/memes")
7
+ expect(Apipie.routes_for_action(TestEngine::MemesController, :index, {}).first[:path]).to eq("/test/memes")
8
8
  end
9
9
  end
10
10
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: apipie-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel Pokorny
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-06-03 00:00:00.000000000 Z
12
+ date: 2023-06-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionpack