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