class ApiRecipes::Route

Attributes

attributes[RW]
path[RW]
request[R]
request_params[RW]
response[R]
url[R]

Public Class Methods

new(api: nil, endpoint: nil, path: nil, attributes: {}, req_pars: {}) click to toggle source
# File lib/api_recipes/route.rb, line 7
def initialize(api: nil, endpoint: nil, path: nil, attributes: {}, req_pars: {})
  @api = api
  @endpoint = endpoint
  @path = path.to_s
  @attributes = attributes
  self.request_params = req_pars
  @url = nil

  prepare_request
end

Public Instance Methods

fill(object) { |object, data, status| ... } click to toggle source
# File lib/api_recipes/route.rb, line 18
def fill(object)
  data = @response.parse @attributes[:mime_type]
  if block_given?
    tap do
      try_to_fill object, data
      yield object, data, @response.status
    end
  else
    try_to_fill object, data
  end
end
start_request(&block) click to toggle source
# File lib/api_recipes/route.rb, line 30
def start_request(&block)
  original_response = @request.send http_verb, @url, request_params
  @response = Response.new original_response, attributes
  check_response_code

  if block_given?
    tap { block.call @response }
  else
    response
  end
end

Private Instance Methods

build_url_from_path() click to toggle source
# File lib/api_recipes/route.rb, line 44
def build_url_from_path
  attrs = {
      scheme: settings[:protocol].to_s,
      host: settings[:host],
      port: port,
      path: path
  }
  URI::Generic.build2 attrs
end
check_response_code() click to toggle source
# File lib/api_recipes/route.rb, line 54
def check_response_code
  ok_code = false
  code = @response.code
  message = nil

  verify_with = attributes[:verify_with]
  if verify_with && @api.object.respond_to?(verify_with, true )
    ok_code = @api.object.send verify_with, @response
    message = "response for request on route '#{path}' was not valid. Verified with #{@api.object}##{verify_with}.\n\nResponse body:\n #{@response.body}"
  else
    # If :ok_code property is present, check the response code
    if expected_code = attributes[:ok_code]
      # If the code does not match, apply the requested strategy
      ok_code = true if code == expected_code
    else
      # Default: 200 <= OK < 300
      ok_code = true if @response.status.success?
      expected_code = '200 <= CODE < 300'
    end
  end

  unless ok_code
    case attributes[:on_bad_code].to_s
    when 'ignore'
    when 'raise'
      raise ResponseCodeNotAsExpected.new(path, expected_code, @response, message: message)
    end
  end
end
extract_headers() click to toggle source
# File lib/api_recipes/route.rb, line 84
def extract_headers
  settings[:default_headers] || {}
end
fill_object_with(object, data) click to toggle source
# File lib/api_recipes/route.rb, line 150
def fill_object_with(object, data)
  data.each do |key, value|
    begin
      object.send "#{key}=", value
    rescue
    end
  end

  object
end
http_verb() click to toggle source
# File lib/api_recipes/route.rb, line 161
def http_verb
  attributes[:verb]
end
port() click to toggle source
# File lib/api_recipes/route.rb, line 92
def port
  settings[:port].to_s || case settings[:protocol].to_s
                          when 'http'
                            '80'
                          when 'https'
                            '443'
                          end
end
prepare_request() click to toggle source
# File lib/api_recipes/route.rb, line 101
def prepare_request
  @url = build_url_from_path
  puts @url if ApiRecipes.configuration.print_urls

  @request = request_with_auth
end
request_params=(params) click to toggle source
# File lib/api_recipes/route.rb, line 108
def request_params=(params)
  unless params.is_a? Hash
    raise ArgumentError, 'provided params must be an Hash'
  end
  # Merge route attributes with defaults and deep clone route attributes
  @request_params = params
end
request_with_auth() click to toggle source
# File lib/api_recipes/route.rb, line 116
def request_with_auth
  req = HTTP
  req = req.headers(extract_headers)
            .timeout(timeout)

  basic_auth = @api.basic_auth
  if basic_auth
    req = req.basic_auth basic_auth
  end
  authorization = @api.authorization
  if authorization
    req = req.auth authorization
  end
  req
end
settings() click to toggle source
# File lib/api_recipes/route.rb, line 132
def settings
  @api.configs
end
timeout() click to toggle source
# File lib/api_recipes/route.rb, line 88
def timeout
  attributes.fetch(:timeout, ApiRecipes::Settings::GLOBAL_TIMEOUT)
end
try_to_fill(object, data) click to toggle source
# File lib/api_recipes/route.rb, line 136
def try_to_fill(object, data)
  case data
  when Hash
    res = fill_object_with object, data
  when Array
    res = []
    data.each do |element|
      res << fill_object_with(object.new, element)
    end
  end

  res
end