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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +111 -107
- data/README.md +150 -29
- data/RELEASING.md +8 -8
- data/grape-swagger.gemspec +1 -2
- data/lib/grape-swagger/doc_methods/build_model_definition.rb +1 -1
- data/lib/grape-swagger/doc_methods/format_data.rb +1 -1
- data/lib/grape-swagger/doc_methods/move_params.rb +1 -1
- data/lib/grape-swagger/doc_methods/parse_params.rb +4 -2
- data/lib/grape-swagger/doc_methods.rb +0 -1
- data/lib/grape-swagger/endpoint.rb +17 -43
- data/lib/grape-swagger/errors.rb +2 -0
- data/lib/grape-swagger/request_param_parser_registry.rb +48 -0
- data/lib/grape-swagger/{endpoint/params_parser.rb → request_param_parsers/body.rb} +21 -22
- data/lib/grape-swagger/request_param_parsers/headers.rb +33 -0
- data/lib/grape-swagger/request_param_parsers/route.rb +66 -0
- data/lib/grape-swagger/token_owner_resolver.rb +101 -0
- data/lib/grape-swagger/version.rb +1 -1
- data/lib/grape-swagger.rb +12 -5
- metadata +10 -21
- data/lib/grape-swagger/doc_methods/headers.rb +0 -20
|
@@ -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
|
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
|
-
|
|
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
|
-
|
|
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 = (
|
|
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.
|
|
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:
|
|
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: '
|
|
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: '
|
|
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.
|
|
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
|