class ApidocoDsl::ApiDoc

Constants

SETTABLE

attr_reader :api

Attributes

doc_description[RW]
doc_endpoint[RW]
doc_examples[RW]
doc_header[RW]
doc_http_method[RW]
doc_markdown[RW]
doc_name[RW]
doc_namespace[RW]
doc_published[RW]
doc_request_example[RW]
doc_request_params[RW]
doc_resource[RW]
doc_response_example[RW]
doc_response_params[RW]
doc_return_code[RW]
doc_sort_order[RW]

Public Class Methods

new(api) click to toggle source
# File lib/apidoco_dsl/api_doc.rb, line 16
def initialize(api)
  @api                 = api
  @doc_request_params  = []
  @doc_response_params = []
  @doc_examples        = []
  @doc_namespace       = @api.namespace
  @doc_resource        = @api.resource
  @param_destination   = 'request'
end

Public Instance Methods

description(txt = nil, path: nil) click to toggle source
# File lib/apidoco_dsl/api_doc.rb, line 60
def description(txt = nil, path: nil)
  if path
    txt  = File.read(path)
    erb  = ERB.new(txt).result
    html = Kramdown::Document.new(erb).to_html
    @doc_description = ERB.new(html).result
  else
    @doc_description = txt
  end
end
doc_file() click to toggle source
# File lib/apidoco_dsl/api_doc.rb, line 75
def doc_file
  doc_name.gsub(/\s/, '').underscore
end
doc_folder() click to toggle source
# File lib/apidoco_dsl/api_doc.rb, line 71
def doc_folder
  doc_namespace.split('::').map(&:underscore).map(&:downcase).join('/') + "/#{doc_resource.to_s.underscore}/"
end
example_request(path: nil) { || ... } click to toggle source
# File lib/apidoco_dsl/api_doc.rb, line 46
def example_request(path: nil)
  ex = {}
  ex['request'] = yield if block_given?
  ex['request'] = JSON.parse(File.read(path)) if path
  @doc_examples << ex
end
example_response(path: nil) { || ... } click to toggle source
# File lib/apidoco_dsl/api_doc.rb, line 53
def example_response(path: nil)
  ex = {}
  ex['response'] = yield if block_given?
  ex['response'] = JSON.parse(File.read(path)) if path
  @doc_examples << ex
end
method_missing(name, *args) click to toggle source
Calls superclass method
# File lib/apidoco_dsl/api_doc.rb, line 37
def method_missing(name, *args)
  return set_attribute(name, *args) if SETTABLE.include?(name.to_s)
  super
end
param_key() click to toggle source
# File lib/apidoco_dsl/api_doc.rb, line 26
def param_key
  "Document"
end
returns(code: 200, &block) click to toggle source
# File lib/apidoco_dsl/api_doc.rb, line 30
def returns(code: 200, &block)
  @doc_return_code = translate_return_code(code)
  @param_destination = 'response'
  self.instance_exec(&block) if block_given?
  @param_destination = 'request'
end
set_attribute(name, value) click to toggle source
# File lib/apidoco_dsl/api_doc.rb, line 42
def set_attribute(name, value)
  self.send(:"doc_#{name}=", value)
end
to_json() click to toggle source
# File lib/apidoco_dsl/api_doc.rb, line 79
def to_json
  doc = {}
  doc['published']       = doc_published unless doc_published.nil?
  doc['name']            = doc_name unless doc_name.nil?
  doc['end_point']       = doc_endpoint unless doc_endpoint.nil?
  doc['http_method']     = doc_http_method unless doc_http_method.nil?
  doc['params']          = unroll_parameters(doc_request_params, [])  unless doc_request_params.empty?
  doc['response_params'] = unroll_parameters(doc_response_params, []) unless doc_response_params.empty?
  doc['header']          = doc_header unless doc_header.nil?
  doc['description']     = doc_description unless doc_description.nil?
  doc['examples']        = doc_examples unless doc_examples.empty?
  doc['sort_order']      = doc_sort_order unless doc_sort_order.nil?
  doc['return_code']     = doc_return_code
  doc['markdown']        = doc_markdown

  return JSON.pretty_generate(doc)
end

Private Instance Methods

push_to() click to toggle source
# File lib/apidoco_dsl/api_doc.rb, line 175
def push_to
  self.send(:"doc_#{@param_destination}_params")
end
translate_return_code(code) click to toggle source
# File lib/apidoco_dsl/api_doc.rb, line 99
def translate_return_code(code)
  trans = {
    100 => :continue,
    101 => :switching_protocols,
    102 => :processing,
    200 => :ok,
    201 => :created,
    202 => :accepted,
    203 => :non_authoritative_information,
    204 => :no_content,
    205 => :reset_content,
    206 => :partial_content,
    207 => :multi_status,
    226 => :im_used,
    300 => :multiple_choices,
    301 => :moved_permanently,
    302 => :found,
    303 => :see_other,
    304 => :not_modified,
    305 => :use_proxy,
    307 => :temporary_redirect,
    400 => :bad_request,
    401 => :unauthorized,
    402 => :payment_required,
    403 => :forbidden,
    404 => :not_found,
    405 => :method_not_allowed,
    406 => :not_acceptable,
    407 => :proxy_authentication_required,
    408 => :request_timeout,
    409 => :conflict,
    410 => :gone,
    411 => :length_required,
    412 => :precondition_failed,
    413 => :request_entity_too_large,
    414 => :request_uri_too_long,
    415 => :unsupported_media_type,
    416 => :requested_range_not_satisfiable,
    417 => :expectation_failed,
    422 => :unprocessable_entity,
    423 => :locked,
    424 => :failed_dependency,
    426 => :upgrade_required,
    500 => :internal_server_error,
    501 => :not_implemented,
    502 => :bad_gateway,
    503 => :service_unavailable,
    504 => :gateway_timeout,
    505 => :http_version_not_supported,
    507 => :insufficient_storage,
    510 => :not_extended
  }.invert

  trans[code] || code
end
unroll_parameters(params, unrolled = []) click to toggle source
# File lib/apidoco_dsl/api_doc.rb, line 155
def unroll_parameters(params, unrolled = [])
  # Unrolling parameters is a matter of recursively seeking down through each base set of params for
  # each of _their_ params, and assigning/setting keys appropriately.

  params.each do |pr|
    if pr.params.any?

      unrolled << pr.to_h
      duped = pr.params.dup
      duped.each{|d| d.parent = pr; }
      unroll_parameters(duped, unrolled)
    else
      unrolled << pr.to_h
    end

  end

  return unrolled
end