56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
# File 'lib/restapi/extractor.rb', line 56
def apis_from_routes
return @apis_from_routes if @apis_from_routes
api_prefix = Restapi.configuration.api_base_url.sub(/\/$/,"")
all_routes = Rails.application.routes.routes.map do |r|
{
:verb => case r.verb
when Regexp then r.verb.source[/\w+/]
else r.verb.to_s
end,
:path => case
when r.path.respond_to?(:spec) then r.path.spec.to_s
else r.path.to_s
end,
:controller => r.requirements[:controller],
:action => r.requirements[:action]
}
end
api_routes = all_routes.find_all do |r|
r[:path].starts_with?(Restapi.configuration.api_base_url)
end
@apis_from_routes = Hash.new { |h, k| h[k] = [] }
api_routes.each do |route|
controller_path, action = route[:controller], route[:action]
next unless controller_path && action
controller = "#{controller_path}_controller".camelize
path = if /^#{Regexp.escape(api_prefix)}(.*)$/ =~ route[:path]
$1.sub!(/\(\.:format\)$/,"")
else
nil
end
if route[:verb].present?
@apis_from_routes[[controller, action]] << {:method => route[:verb], :path => path}
end
end
@apis_from_routes
apis_from_docs = Restapi.method_descriptions.reduce({}) do |h, (method, desc)|
apis = desc.apis.map do |api|
{:method => api.http_method, :path => api.api_url, :desc => api.short_description}
end
h.update(method => apis)
end
@apis_from_routes.each do |(controller, action), new_apis|
method_key = "#{controller.constantize.controller_name}##{action}"
old_apis = apis_from_docs[method_key] || []
new_apis.each do |new_api|
new_api[:path].sub!(/\(\.:format\)$/,"")
if old_api = old_apis.find { |api| api[:path] == "#{api_prefix}#{new_api[:path]}" }
new_api[:desc] = old_api[:desc]
end
end
end
@apis_from_routes
end
|