@@ -24,7 +24,7 @@ module SwaggerRouting
24
24
private
25
25
26
26
def combine_routes ( app , doc_klass )
27
- app . routes . each do |route |
27
+ app . routes . each_with_object ( { } ) do |route , combined_routes |
28
28
route_path = route . path
29
29
route_match = route_path . split ( /^.*?#{ route . prefix } / ) . last
30
30
next unless route_match
@@ -37,31 +37,32 @@ def combine_routes(app, doc_klass)
37
37
38
38
resource = route_match . captures . first
39
39
resource = '/' if resource . empty?
40
- @target_class . combined_routes [ resource ] ||= [ ]
40
+ combined_routes [ resource ] ||= [ ]
41
41
next if doc_klass . hide_documentation_path && route . path . match ( /#{ doc_klass . mount_path } ($|\/ |\( \. )/ )
42
42
43
- @target_class . combined_routes [ resource ] << route
43
+ combined_routes [ resource ] << route
44
44
end
45
45
end
46
46
47
- def determine_namespaced_routes ( name , parent_route )
47
+ def determine_namespaced_routes ( name , parent_route , routes )
48
48
if parent_route . nil?
49
- @target_class . combined_routes . values . flatten
49
+ routes . values . flatten
50
50
else
51
51
parent_route . reject do |route |
52
52
!route_path_start_with? ( route , name ) || !route_instance_variable_equals? ( route , name )
53
53
end
54
54
end
55
55
end
56
56
57
- def combine_namespace_routes ( namespaces )
57
+ def combine_namespace_routes ( namespaces , routes )
58
+ combined_namespace_routes = { }
58
59
# iterate over each single namespace
59
60
namespaces . each_key do |name , _ |
60
61
# get the parent route for the namespace
61
62
parent_route_name = extract_parent_route ( name )
62
- parent_route = @target_class . combined_routes [ parent_route_name ]
63
+ parent_route = routes [ parent_route_name ]
63
64
# fetch all routes that are within the current namespace
64
- namespace_routes = determine_namespaced_routes ( name , parent_route )
65
+ namespace_routes = determine_namespaced_routes ( name , parent_route , routes )
65
66
66
67
# default case when not explicitly specified or nested == true
67
68
standalone_namespaces = namespaces . reject do |_ , ns |
@@ -76,12 +77,13 @@ def combine_namespace_routes(namespaces)
76
77
# rubocop:disable Style/Next
77
78
if parent_standalone_namespaces . empty?
78
79
# default option, append namespace methods to parent route
79
- parent_route = @target_class . combined_namespace_routes . key? ( parent_route_name )
80
- @target_class . combined_namespace_routes [ parent_route_name ] = [ ] unless parent_route
81
- @target_class . combined_namespace_routes [ parent_route_name ] . push ( *namespace_routes )
80
+ combined_namespace_routes [ parent_route_name ] ||= [ ]
81
+ combined_namespace_routes [ parent_route_name ] . push ( *namespace_routes )
82
82
end
83
83
# rubocop:enable Style/Next
84
84
end
85
+
86
+ combined_namespace_routes
85
87
end
86
88
87
89
def extract_parent_route ( name )
@@ -110,7 +112,7 @@ def route_path_start_with?(route, name)
110
112
end
111
113
112
114
module SwaggerDocumentationAdder
113
- attr_accessor :combined_namespaces , :combined_namespace_identifiers , : combined_routes, :combined_namespace_routes
115
+ attr_accessor :combined_namespaces , :combined_routes , :combined_namespace_routes
114
116
115
117
include SwaggerRouting
116
118
@@ -127,20 +129,16 @@ def add_swagger_documentation(options = {})
127
129
documentation_class . setup ( options )
128
130
mount ( documentation_class )
129
131
130
- @target_class . combined_routes = { }
131
- combine_routes ( @target_class , documentation_class )
132
-
133
- @target_class . combined_namespaces = { }
134
- combine_namespaces ( @target_class )
132
+ combined_routes = combine_routes ( @target_class , documentation_class )
133
+ combined_namespaces = combine_namespaces ( @target_class )
134
+ combined_namespace_routes = combine_namespace_routes ( combined_namespaces , combined_routes )
135
+ exclusive_route_keys = combined_routes . keys - combined_namespaces . keys
136
+ @target_class . combined_namespace_routes = combined_namespace_routes . merge (
137
+ combined_routes . slice ( *exclusive_route_keys )
138
+ )
139
+ @target_class . combined_routes = combined_routes
140
+ @target_class . combined_namespaces = combined_namespaces
135
141
136
- @target_class . combined_namespace_routes = { }
137
- @target_class . combined_namespace_identifiers = { }
138
- combine_namespace_routes ( @target_class . combined_namespaces )
139
-
140
- exclusive_route_keys = @target_class . combined_routes . keys - @target_class . combined_namespaces . keys
141
- exclusive_route_keys . each do |key |
142
- @target_class . combined_namespace_routes [ key ] = @target_class . combined_routes [ key ]
143
- end
144
142
documentation_class
145
143
end
146
144
@@ -151,17 +149,24 @@ def version_for(options)
151
149
end
152
150
153
151
def combine_namespaces ( app )
154
- app . endpoints . each do |endpoint |
152
+ combined_namespaces = { }
153
+ endpoints = app . endpoints . clone
154
+
155
+ while endpoints . any?
156
+ endpoint = endpoints . shift
157
+
158
+ endpoints . push ( *endpoint . options [ :app ] . endpoints ) if endpoint . options [ :app ]
155
159
ns = endpoint . namespace_stackable ( :namespace ) . last
160
+ next unless ns
156
161
157
162
# use the full namespace here (not the latest level only)
158
163
# and strip leading slash
159
164
mount_path = ( endpoint . namespace_stackable ( :mount_path ) || [ ] ) . join ( '/' )
160
165
full_namespace = ( mount_path + endpoint . namespace ) . sub ( /\/ {2,}/ , '/' ) . sub ( /^\/ / , '' )
161
- @target_class . combined_namespaces [ full_namespace ] = ns if ns
162
-
163
- combine_namespaces ( endpoint . options [ :app ] ) if endpoint . options [ :app ]
166
+ combined_namespaces [ full_namespace ] = ns
164
167
end
168
+
169
+ combined_namespaces
165
170
end
166
171
167
172
def create_documentation_class
0 commit comments