class Fdoc::Endpoint

Endpoints represent the schema for an API endpoint The consume_* methods will raise exceptions if input differs from the schema

Attributes

endpoint_path[R]
service[R]

Public Class Methods

new(endpoint_path, service=Fdoc::Service.default_service) click to toggle source
# File lib/fdoc/endpoint.rb, line 10
def initialize(endpoint_path, service=Fdoc::Service.default_service)
  @endpoint_path = endpoint_path
  @schema = YAML.load_file(@endpoint_path)
  @service = service
end

Public Instance Methods

consume_request(params, successful=true) click to toggle source
# File lib/fdoc/endpoint.rb, line 16
def consume_request(params, successful=true)
  if successful
    schema = set_additional_properties_false_on(request_parameters.dup)
    JSON::Validator.validate!(schema, stringify_keys(params))
  end
end
consume_response(params, status_code, successful=true) click to toggle source
# File lib/fdoc/endpoint.rb, line 23
def consume_response(params, status_code, successful=true)
  response_code = response_codes.find do |rc|
    rc["successful"] == successful && (
      rc["status"]      == status_code || # 200
      rc["status"].to_i == status_code    # "200 OK"
    )
  end


  if !response_code
    raise Fdoc::UndocumentedResponseCode,
      'Undocumented response: %s, successful: %s' % [
        status_code, successful
      ]
  elsif successful
    schema = set_additional_properties_false_on(response_parameters.dup)
    JSON::Validator.validate!(schema, stringify_keys(params))
  else
    true
  end
end
deprecated?() click to toggle source

properties

# File lib/fdoc/endpoint.rb, line 57
def deprecated?
  @schema["deprecated"]
end
description() click to toggle source
# File lib/fdoc/endpoint.rb, line 61
def description
  @schema["description"]
end
path() click to toggle source
# File lib/fdoc/endpoint.rb, line 49
def path
  @path ||= endpoint_path.
              gsub(service.service_dir, "").
              match(/\/?(.*)[-\/][A-Z]+\.fdoc/)[1]
end
request_parameters() click to toggle source
# File lib/fdoc/endpoint.rb, line 65
def request_parameters
  @schema["requestParameters"] ||= {}
end
response_codes() click to toggle source
# File lib/fdoc/endpoint.rb, line 73
def response_codes
  @schema["responseCodes"] ||= []
end
response_parameters() click to toggle source
# File lib/fdoc/endpoint.rb, line 69
def response_parameters
  @schema["responseParameters"] ||= {}
end
verb() click to toggle source
# File lib/fdoc/endpoint.rb, line 45
def verb
  @verb ||= endpoint_path.match(/([A-Z]*)\.fdoc$/)[1]
end

Protected Instance Methods

set_additional_properties_false_on(value) click to toggle source

default additionalProperties on objects to false create a copy, so we don’t mutate the input

# File lib/fdoc/endpoint.rb, line 81
def set_additional_properties_false_on(value)
  if value.kind_of? Hash
    copy = value.dup
    if value["type"] == "object" || value.has_key?("properties")
      copy["additionalProperties"] ||= false
    end
    value.each do |key, hash_val|
      unless key == "additionalProperties"
        copy[key] = set_additional_properties_false_on(hash_val)
      end
    end
    copy
  elsif value.kind_of? Array
    copy = value.map do |arr_val|
      set_additional_properties_false_on(arr_val)
    end
  else
    value
  end
end
stringify_keys(obj) click to toggle source
# File lib/fdoc/endpoint.rb, line 102
def stringify_keys(obj)
  case obj
  when Hash
    result = {}
    obj.each do |k, v|
      result[k.to_s] = stringify_keys(v)
    end
    result
  when Array then obj.map { |v| stringify_keys(v) }
  else obj
  end
end