class ApiCanon::ApiCanonController

Public Instance Methods

test() click to toggle source
# File app/controllers/api_canon_controller.rb, line 3
def test
  response = {:methods => matching_methods, :params => sanitized(params[:doco])}
  #TODO: Put routes in here, too.
  matching_methods.each do |m|
    response[:curl] ||= {}
    response[:urls] ||= {}
    if m == :get
      response[:curl][m] = as_curl(api_request_url)
      response[:urls][m] = api_request_url
    else
      response[:curl][m] = as_curl(api_request_url_for_non_get_requests, m, non_url_parameters_for_request_generation)
      response[:urls][m] = api_request_url_for_non_get_requests
    end
  end
  render :json => response
end

Private Instance Methods

api_document() click to toggle source
# File app/controllers/api_canon_controller.rb, line 57
def api_document
  doco = ApiCanon::DocumentationStore.fetch(requested_controller_path)
  doco.documented_actions.detect {|da| da.action_name.to_s == params[:doco][:action_name] }
end
api_request_url() click to toggle source
# File app/controllers/api_canon_controller.rb, line 93
def api_request_url
  unless Rails.version.starts_with?('2')
    self.class.send(:include, Rails.application.routes.url_helpers)
  end
  url_for parameters_for_request_generation
end
api_request_url_for_non_get_requests() click to toggle source
# File app/controllers/api_canon_controller.rb, line 86
def api_request_url_for_non_get_requests
  unless Rails.version.starts_with?('2')
    self.class.send(:include, Rails.application.routes.url_helpers)
  end
  url_for url_parameters_for_request_generation
end
as_curl(url, method=:get, params={}) click to toggle source
# File app/controllers/api_canon_controller.rb, line 33
def as_curl(url, method=:get, params={})
  case method
  when :get
    %{curl "#{url}"}
  when :post
    %{curl "#{url}" "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" --data "#{params.to_query}"}
  when :put
    %{curl "#{url}" "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" -X PUT --data "#{params.to_query}"}
  when :delete
    %{curl "#{url}" "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" -X DELETE --data "#{params.to_query}"}
  else
    "PATCH, HEAD, OPTIONS, TRACE, CONNECT are not implemented"
  end
end
matching_methods() click to toggle source
# File app/controllers/api_canon_controller.rb, line 48
def matching_methods
  #TODO: ApiDocument should define what methods it accepts, and fall back to route generation
  if Rails.version.starts_with?('2')
    matching_routes.map {|r| r.conditions[:method]}.uniq
  else
    matching_routes.map {|r| %w(GET PUT POST DELETE).select {|m| r.verb =~ m}}.flatten.uniq.map(&:downcase).map(&:to_sym)
  end
end
matching_routes() click to toggle source
# File app/controllers/api_canon_controller.rb, line 26
def matching_routes
  routes.select do |r|
    r.requirements[:controller] == requested_controller_path.to_s &&
      r.requirements[:action] == api_document.action_name.to_s
  end
end
non_url_parameters_for_request_generation() click to toggle source
# File app/controllers/api_canon_controller.rb, line 70
def non_url_parameters_for_request_generation
  parameters_for_request_generation.reject {|k,v| url_param_keys.include?(k)}
end
parameters_for_request_generation() click to toggle source
# File app/controllers/api_canon_controller.rb, line 66
def parameters_for_request_generation
  sanitized(params[:doco]).merge({:controller => "/#{requested_controller_path}", :action => api_document.action_name})
end
requested_controller_path() click to toggle source
# File app/controllers/api_canon_controller.rb, line 62
def requested_controller_path
  params[:doco][:controller_path]
end
routes() click to toggle source
# File app/controllers/api_canon_controller.rb, line 22
def routes
  Rails.version.starts_with?('2') ? ActionController::Routing::Routes.routes : Rails.application.routes.routes
end
sanitized(doco_params) click to toggle source
# File app/controllers/api_canon_controller.rb, line 100
def sanitized(doco_params)
  sanitized = doco_params.dup
  sanitized.delete_if {|k,v| %w(controller controller_path action controller_name action_name).include?(k.to_s) }
  sanitized.each {|k,v| v.reject!(&:blank?) if v.is_a? Array}
  sanitized.delete_if {|k,v| v.blank? }
  sanitized
end
url_param_keys() click to toggle source
# File app/controllers/api_canon_controller.rb, line 74
def url_param_keys
  if Rails.version.starts_with?('2')
    matching_routes.inject(Set.new()) {|set,r| set += r.significant_keys.map(&:to_s) }
  else
    matching_routes.inject(Set.new()) {|set,r| set += r.segment_keys.map(&:to_s) }
  end
end
url_parameters_for_request_generation() click to toggle source
# File app/controllers/api_canon_controller.rb, line 82
def url_parameters_for_request_generation
  parameters_for_request_generation.slice *url_param_keys
end