class Apipie::MethodDescription

Attributes

apis[R]
examples[R]
formats[R]
full_description[R]
headers[R]
metadata[RW]
method[R]
resource[R]
see[R]
show[R]

Public Class Methods

new(method, resource, dsl_data) click to toggle source
# File lib/apipie/method_description.rb, line 23
def initialize(method, resource, dsl_data)
  @method = method.to_s
  @resource = resource
  @from_concern = dsl_data[:from_concern]
  @apis = api_data(dsl_data).map do |mthd, path, desc, opts|
    MethodDescription::Api.new(mthd, concern_subst(path), concern_subst(desc), opts)
  end

  desc = dsl_data[:description] || ''
  @full_description = Apipie.markup_to_html(desc)

  @errors = dsl_data[:errors].map do |args|
    Apipie::ErrorDescription.from_dsl_data(args)
  end

  @tag_list = dsl_data[:tag_list]

  @returns = dsl_data[:returns].map do |code,args|
    Apipie::ResponseDescription.from_dsl_data(self, code, args)
  end

  @see = dsl_data[:see].map do |args|
    Apipie::SeeDescription.new(args)
  end

  @formats = dsl_data[:formats]
  @examples = dsl_data[:examples]
  @examples += load_recorded_examples

  @metadata = dsl_data[:meta]

  @params_ordered = dsl_data[:params].map do |args|
    Apipie::ParamDescription.from_dsl_data(self, args)
  end.reject{|p| p.response_only? }

  @params_ordered = ParamDescription.unify(@params_ordered)
  @headers = dsl_data[:headers]

  @show = if dsl_data.has_key? :show
    dsl_data[:show]
  else
    true
  end
end

Public Instance Methods

create_api_url(api) click to toggle source
# File lib/apipie/method_description.rb, line 153
def create_api_url(api)
  path = api.path
  unless api.from_routes
    path = "#{@resource._api_base_url}#{path}"
  end
  path = path[0..-2] if path[-1..-1] == '/'
  return path
end
doc_url() click to toggle source
# File lib/apipie/method_description.rb, line 145
def doc_url
  crumbs = []
  crumbs << @resource._version if Apipie.configuration.version_in_url
  crumbs << @resource._id
  crumbs << @method
  Apipie.full_url crumbs.join('/')
end
errors() click to toggle source
# File lib/apipie/method_description.rb, line 124
def errors
  return @merged_errors if @merged_errors
  @merged_errors = []
  if @resource
    resource_errors = @resource._errors_args.map do |args|
      Apipie::ErrorDescription.from_dsl_data(args)
    end

    # exclude overwritten parent errors
    @merged_errors = resource_errors.find_all do |err|
      !@errors.any? { |e| e.code == err.code }
    end
  end
  @merged_errors.concat(@errors)
  return @merged_errors
end
from_concern?() click to toggle source

was the description defines in a module instead of directly in controller?

# File lib/apipie/method_description.rb, line 200
def from_concern?
  @from_concern
end
id() click to toggle source
# File lib/apipie/method_description.rb, line 68
def id
  "#{resource._id}##{method}"
end
method_apis_to_json(lang = nil) click to toggle source
# File lib/apipie/method_description.rb, line 162
def method_apis_to_json(lang = nil)
  @apis.each.collect do |api|
    {
      :api_url => create_api_url(api),
      :http_method => api.http_method.to_s,
      :short_description => Apipie.app.translate(api.short_description, lang),
      :deprecated => resource._deprecated || api.options[:deprecated]
    }
  end
end
params() click to toggle source
# File lib/apipie/method_description.rb, line 72
def params
  params_ordered.reduce(ActiveSupport::OrderedHash.new) { |h,p| h[p.name] = p; h }
end
params_ordered() click to toggle source
# File lib/apipie/method_description.rb, line 80
def params_ordered
  all_params = []
  parent = Apipie.get_resource_description(@resource.controller.superclass)

  # get params from parent resource description
  [parent, @resource].compact.each do |resource|
    resource_params = resource._params_args.map do |args|
      Apipie::ParamDescription.from_dsl_data(self, args)
    end
    merge_params(all_params, resource_params)
  end

  merge_params(all_params, @params_ordered)
  all_params.find_all(&:validator)
end
params_ordered_self() click to toggle source
# File lib/apipie/method_description.rb, line 76
def params_ordered_self
  @params_ordered
end
returns() click to toggle source
# File lib/apipie/method_description.rb, line 109
def returns
  all_returns = []
  parent = Apipie.get_resource_description(@resource.controller.superclass)

  # get response descriptions from parent resource description
  [parent, @resource].compact.each do |resource|
    resource_returns = resource._returns_args.map do |code, args|
      Apipie::ResponseDescription.from_dsl_data(self, code, args)
    end
    merge_returns(all_returns, resource_returns)
  end

  merge_returns(all_returns, @returns)
end
returns_self() click to toggle source
# File lib/apipie/method_description.rb, line 96
def returns_self
  @returns
end
tag_list() click to toggle source
# File lib/apipie/method_description.rb, line 100
def tag_list
  all_tag_list = []
  parent = Apipie.get_resource_description(@resource.controller.superclass)

  # get tags from parent resource description
  parent_tags = [parent, @resource].compact.flat_map { |resource| resource._tag_list_arg }
  Apipie::TagListDescription.new((parent_tags + @tag_list).uniq.compact)
end
to_json(lang=nil) click to toggle source
# File lib/apipie/method_description.rb, line 181
def to_json(lang=nil)
  {
    :doc_url => doc_url,
    :name => @method,
    :apis => method_apis_to_json(lang),
    :formats => formats,
    :full_description => Apipie.app.translate(@full_description, lang),
    :errors => errors.map(&:to_json),
    :params => params_ordered.map{ |param| param.to_json(lang) }.flatten,
    :returns => @returns.map{ |return_item| return_item.to_json(lang) }.flatten,
    :examples => @examples,
    :metadata => @metadata,
    :see => see.map(&:to_json),
    :headers => headers,
    :show => @show
  }
end
version() click to toggle source
# File lib/apipie/method_description.rb, line 141
def version
  resource._version
end

Private Instance Methods

api_data(dsl_data) click to toggle source
# File lib/apipie/method_description.rb, line 206
def api_data(dsl_data)
  ret = dsl_data[:api_args].dup
  if dsl_data[:api_from_routes]
    desc = dsl_data[:api_from_routes][:desc]
    options = dsl_data[:api_from_routes][:options]

    api_from_routes = Apipie.routes_for_action(resource.controller, method, {:desc => desc, :options => options}).map do |route_info|
      [route_info[:verb],
       route_info[:path],
       route_info[:desc],
       (route_info[:options] || {}).merge(:from_routes => true)]
    end
    ret.concat(api_from_routes)
  end
  ret
end
concern_subst(string) click to toggle source
# File lib/apipie/method_description.rb, line 263
def concern_subst(string)
  return if string.nil?
  if from_concern?
    resource.controller._apipie_perform_concern_subst(string)
  else
    string
  end
end
format_example(ex) click to toggle source
# File lib/apipie/method_description.rb, line 252
def format_example(ex)
  example = ""
  example << "// #{ex[:title]}\n" if ex[:title].present?
  example << "#{ex[:verb]} #{ex[:path]}"
  example << "?#{ex[:query]}" unless ex[:query].blank?
  example << "\n" << format_example_data(ex[:request_data]).to_s if ex[:request_data]
  example << "\n" << ex[:code].to_s
  example << "\n" << format_example_data(ex[:response_data]).to_s if ex[:response_data]
  example
end
format_example_data(data) click to toggle source
# File lib/apipie/method_description.rb, line 243
def format_example_data(data)
  case data
  when Array, Hash
    JSON.pretty_generate(data).gsub(/: \[\s*\]/,": []").gsub(/\{\s*\}/,"{}")
  else
    data
  end
end
load_recorded_examples() click to toggle source
# File lib/apipie/method_description.rb, line 235
def load_recorded_examples
  (Apipie.recorded_examples[id] || []).
    find_all { |ex| ex["show_in_doc"].to_i > 0 }.
    find_all { |ex| ex["versions"].nil? || ex["versions"].include?(self.version) }.
    sort_by { |ex| ex["show_in_doc"] }.
    map { |ex| format_example(ex.symbolize_keys) }
end
merge_params(params, new_params) click to toggle source
# File lib/apipie/method_description.rb, line 223
def merge_params(params, new_params)
  new_param_names = Set.new(new_params.map(&:name))
  params.delete_if { |p| new_param_names.include?(p.name) }
  params.concat(new_params)
end
merge_returns(returns, new_returns) click to toggle source
# File lib/apipie/method_description.rb, line 229
def merge_returns(returns, new_returns)
  new_return_codes = Set.new(new_returns.map(&:code))
  returns.delete_if { |p| new_return_codes.include?(p.code) }
  returns.concat(new_returns)
end