apipie-rails 1.2.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
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