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