lib/apipie/extractor.rb in apipie-rails-0.1.1 vs lib/apipie/extractor.rb in apipie-rails-0.1.2
- old
+ new
@@ -53,80 +53,97 @@
def write_examples
Writer.new(@collector).write_examples if @collector
end
- # TODO: this is a loooooooooong method :)
def apis_from_routes
return @apis_from_routes if @apis_from_routes
- api_prefix = Apipie.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]
- }
+ @api_prefix = Apipie.api_base_url.sub(/\/$/,"")
+ populate_api_routes
+ update_api_descriptions
+ @apis_from_routes
+ end
+ def controller_path(name)
+ Apipie.api_controllers_paths.detect { |p| p.include?("#{name}_controller.rb") }
+ end
+
+ private
+
+ def all_api_routes
+ all_routes = Apipie.configuration.api_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|
+
+ return all_routes.find_all do |r|
r[:path].starts_with?(Apipie.api_base_url)
end
+ end
+ def populate_api_routes
@apis_from_routes = Hash.new { |h, k| h[k] = [] }
- api_routes.each do |route|
+ all_api_routes.each do |route|
controller_path, action = route[:controller], route[:action]
next unless controller_path && action
controller_path = controller_path.split('::').map(&:camelize).join('::')
controller = "#{controller_path}Controller"
- path = if /^#{Regexp.escape(api_prefix)}(.*)$/ =~ route[:path]
+ 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
+ end
+ def all_apis_from_docs
resource_descriptions = Apipie.resource_descriptions.values.map(&:values).flatten
method_descriptions = resource_descriptions.map(&:method_descriptions).flatten
- apis_from_docs = method_descriptions.reduce({}) do |h, desc|
+
+ return method_descriptions.reduce({}) do |h, desc|
apis = desc.method_apis_to_json.map do |api|
{ :method => api[:http_method],
:path => api[:api_url],
:desc => api[:short_description] }
end
h.update(desc.id => apis)
end
+ end
+ def update_api_descriptions
+ apis_from_docs = all_apis_from_docs
@apis_from_routes.each do |(controller, action), new_apis|
method_key = "#{Apipie.get_resource_name(controller.constantize)}##{action}"
old_apis = apis_from_docs[method_key] || []
new_apis.each do |new_api|
new_api[:path].sub!(/\(\.:format\)$/,"")
old_api = old_apis.find do |api|
- api[:path] == "#{api_prefix}#{new_api[:path]}"
+ api[:path] == "#{@api_prefix}#{new_api[:path]}"
end
if old_api
new_api[:desc] = old_api[:desc]
end
end
end
- @apis_from_routes
end
end
end
end