grape-swagger 2.1.2 → 2.1.3

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.
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GrapeSwagger
4
+ class TokenOwnerResolver
5
+ class << self
6
+ SUPPORTED_ARITY_TYPES = %i[req opt rest keyreq key keyrest].freeze
7
+ UNRESOLVED = Object.new.freeze
8
+ private_constant :UNRESOLVED
9
+
10
+ def resolve(endpoint, method_name)
11
+ return if method_name.nil?
12
+
13
+ method_name = method_name.to_sym
14
+ return endpoint.public_send(method_name) if endpoint.respond_to?(method_name, true)
15
+
16
+ helper_value = resolve_from_helpers(endpoint, method_name)
17
+ return helper_value unless helper_value.equal?(UNRESOLVED)
18
+
19
+ raise Errors::TokenOwnerNotFound, "undefined method `#{method_name}` for #{endpoint.class}"
20
+ end
21
+
22
+ def evaluate_proc(callable, token_owner)
23
+ return callable.call unless accepts_argument?(callable)
24
+
25
+ callable.call(token_owner)
26
+ end
27
+
28
+ private
29
+
30
+ def resolve_from_helpers(endpoint, method_name)
31
+ helpers = gather_helpers(endpoint)
32
+ return UNRESOLVED if helpers.empty?
33
+
34
+ helpers.each do |helper|
35
+ resolved = resolve_from_helper(endpoint, helper, method_name)
36
+ return resolved unless resolved.equal?(UNRESOLVED)
37
+ end
38
+
39
+ UNRESOLVED
40
+ end
41
+
42
+ def gather_helpers(endpoint)
43
+ return [] if endpoint.nil?
44
+
45
+ stackable_helpers = fetch_stackable_helpers(endpoint)
46
+ normalize_helpers(stackable_helpers)
47
+ end
48
+
49
+ def fetch_stackable_helpers(endpoint)
50
+ return unless endpoint.respond_to?(:inheritable_setting)
51
+
52
+ setting = endpoint.inheritable_setting
53
+ return unless setting.respond_to?(:namespace_stackable)
54
+
55
+ namespace_stackable = setting.namespace_stackable
56
+ return unless namespace_stackable.respond_to?(:[])
57
+
58
+ namespace_stackable[:helpers]
59
+ rescue NameError
60
+ nil
61
+ end
62
+
63
+ def normalize_helpers(helpers)
64
+ case helpers
65
+ when nil, false
66
+ []
67
+ when Module
68
+ [helpers]
69
+ when Array
70
+ helpers.compact
71
+ else
72
+ if helpers.respond_to?(:key?) && helpers.respond_to?(:[]) && helpers.key?(:helpers)
73
+ normalize_helpers(helpers[:helpers])
74
+ elsif helpers.respond_to?(:to_a)
75
+ Array(helpers.to_a).flatten.compact
76
+ else
77
+ Array(helpers).compact
78
+ end
79
+ end
80
+ end
81
+
82
+ def resolve_from_helper(endpoint, helper, method_name)
83
+ return UNRESOLVED unless helper_method_defined?(helper, method_name)
84
+
85
+ helper.instance_method(method_name).bind(endpoint).call
86
+ rescue NameError
87
+ UNRESOLVED
88
+ end
89
+
90
+ def helper_method_defined?(helper, method_name)
91
+ helper.method_defined?(method_name) || helper.private_method_defined?(method_name)
92
+ end
93
+
94
+ def accepts_argument?(callable)
95
+ return false unless callable.respond_to?(:parameters)
96
+
97
+ callable.parameters.any? { |type, _| SUPPORTED_ARITY_TYPES.include?(type) }
98
+ end
99
+ end
100
+ end
101
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GrapeSwagger
4
- VERSION = '2.1.2'
4
+ VERSION = '2.1.3'
5
5
  end
data/lib/grape-swagger.rb CHANGED
@@ -10,22 +10,28 @@ require 'grape-swagger/errors'
10
10
 
11
11
  require 'grape-swagger/doc_methods'
12
12
  require 'grape-swagger/model_parsers'
13
+ require 'grape-swagger/request_param_parser_registry'
14
+ require 'grape-swagger/token_owner_resolver'
13
15
 
14
16
  module GrapeSwagger
15
17
  class << self
16
18
  def model_parsers
17
19
  @model_parsers ||= GrapeSwagger::ModelParsers.new
18
20
  end
21
+
22
+ def request_param_parsers
23
+ @request_param_parsers ||= GrapeSwagger::RequestParamParserRegistry.new
24
+ end
19
25
  end
20
26
  autoload :Rake, 'grape-swagger/rake/oapi_tasks'
21
27
 
22
28
  # Copied from https://github.com/ruby-grape/grape/blob/v2.2.0/lib/grape/formatter.rb
23
29
  FORMATTER_DEFAULTS = {
30
+ xml: Grape::Formatter::Xml,
31
+ serializable_hash: Grape::Formatter::SerializableHash,
24
32
  json: Grape::Formatter::Json,
25
33
  jsonapi: Grape::Formatter::Json,
26
- serializable_hash: Grape::Formatter::SerializableHash,
27
- txt: Grape::Formatter::Txt,
28
- xml: Grape::Formatter::Xml
34
+ txt: Grape::Formatter::Txt
29
35
  }.freeze
30
36
 
31
37
  # Copied from https://github.com/ruby-grape/grape/blob/v2.2.0/lib/grape/content_types.rb
@@ -179,12 +185,13 @@ module SwaggerDocumentationAdder
179
185
  endpoint = endpoints.shift
180
186
 
181
187
  endpoints.push(*endpoint.options[:app].endpoints) if endpoint.options[:app]
182
- ns = endpoint.namespace_stackable(:namespace).last
188
+ namespace_stackable = endpoint.inheritable_setting.namespace_stackable
189
+ ns = (namespace_stackable[:namespace] || []).last
183
190
  next unless ns
184
191
 
185
192
  # use the full namespace here (not the latest level only)
186
193
  # and strip leading slash
187
- mount_path = (endpoint.namespace_stackable(:mount_path) || []).join('/')
194
+ mount_path = (namespace_stackable[:mount_path] || []).join('/')
188
195
  full_namespace = (mount_path + endpoint.namespace).sub(/\/{2,}/, '/').sub(/^\//, '')
189
196
  combined_namespaces[full_namespace] = ns
190
197
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape-swagger
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.2
4
+ version: 2.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - LeFnord
8
8
  - Tim Vandecasteele
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-01-07 00:00:00.000000000 Z
11
+ date: 1980-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grape
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '1.7'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '3.0'
22
+ version: '4.0'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,21 +29,7 @@ dependencies:
29
29
  version: '1.7'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '3.0'
33
- - !ruby/object:Gem::Dependency
34
- name: rack-test
35
- requirement: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - "~>"
38
- - !ruby/object:Gem::Version
39
- version: '2'
40
- type: :runtime
41
- prerelease: false
42
- version_requirements: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - "~>"
45
- - !ruby/object:Gem::Version
46
- version: '2'
32
+ version: '4.0'
47
33
  email:
48
34
  - pscholz.le@gmail.com
49
35
  - tim.vandecasteele@gmail.com
@@ -64,7 +50,6 @@ files:
64
50
  - lib/grape-swagger/doc_methods/data_type.rb
65
51
  - lib/grape-swagger/doc_methods/extensions.rb
66
52
  - lib/grape-swagger/doc_methods/format_data.rb
67
- - lib/grape-swagger/doc_methods/headers.rb
68
53
  - lib/grape-swagger/doc_methods/move_params.rb
69
54
  - lib/grape-swagger/doc_methods/operation_id.rb
70
55
  - lib/grape-swagger/doc_methods/optional_object.rb
@@ -75,11 +60,15 @@ files:
75
60
  - lib/grape-swagger/doc_methods/tag_name_description.rb
76
61
  - lib/grape-swagger/doc_methods/version.rb
77
62
  - lib/grape-swagger/endpoint.rb
78
- - lib/grape-swagger/endpoint/params_parser.rb
79
63
  - lib/grape-swagger/errors.rb
80
64
  - lib/grape-swagger/instance.rb
81
65
  - lib/grape-swagger/model_parsers.rb
82
66
  - lib/grape-swagger/rake/oapi_tasks.rb
67
+ - lib/grape-swagger/request_param_parser_registry.rb
68
+ - lib/grape-swagger/request_param_parsers/body.rb
69
+ - lib/grape-swagger/request_param_parsers/headers.rb
70
+ - lib/grape-swagger/request_param_parsers/route.rb
71
+ - lib/grape-swagger/token_owner_resolver.rb
83
72
  - lib/grape-swagger/version.rb
84
73
  homepage: https://github.com/ruby-grape/grape-swagger
85
74
  licenses:
@@ -100,7 +89,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
89
  - !ruby/object:Gem::Version
101
90
  version: '0'
102
91
  requirements: []
103
- rubygems_version: 3.6.2
92
+ rubygems_version: 3.6.8
104
93
  specification_version: 4
105
94
  summary: Add auto generated documentation to your Grape API that can be displayed
106
95
  with Swagger.
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GrapeSwagger
4
- module DocMethods
5
- class Headers
6
- class << self
7
- def parse(route)
8
- route.headers.to_a.map do |route_header|
9
- route_header.tap do |header|
10
- hash = header[1]
11
- description = hash.delete('description')
12
- hash[:documentation] = { desc: description, in: 'header' }
13
- hash[:type] = hash['type'].titleize if hash['type']
14
- end
15
- end
16
- end
17
- end
18
- end
19
- end
20
- end