# frozen_string_literal: true module EvilMartiansAPI class Client extend Configurable include Configurable include API::Developers # ... ACCEPT_HEADER = "application/json" # Initializes the Evil Martians API Client. # # @return [Client] A new instance of the Client def initialize(**settings) inherit_config!(self.class.config) settings.each { |setting, value| config.public_send("#{setting}=", value) } validate_config end # Establishes a connection with the Evil Martians endpoint. # # Used in API calls. # # @return [Faraday::Connection] A Faraday connection object which can be used to send requests def connection @connection ||= Faraday.new(url: config.api_endpoint) do |connection| setup_access_token!(connection) setup_timeouts!(connection) setup_user_agent!(connection) setup_logger!(connection) setup_retries!(connection) setup_error_handling!(connection) setup_json!(connection) end end private def setup_access_token!(connection) connection.request(:authorization, :Bearer, config.access_token) end def setup_timeouts!(connection) connection.options.open_timeout = config.open_timeout connection.options.timeout = config.read_timeout end def setup_user_agent!(connection) connection.headers[:user_agent] = config.user_agent end def setup_logger!(connection) connection.response(:logger, config.logger) if config.logger end def setup_retries!(connection) return if config.max_retries <= 0 connection.request( :retry, max: config.max_retries, interval: config.retry_interval, backoff_factor: config.retry_backoff_factor, exceptions: config.retriable_errors, ) end def setup_error_handling!(connection) connection.use(:evil_martians_api_handle_connection_error) connection.use(:evil_martians_api_raise_http_error) end def setup_json!(connection) connection.headers[:accept] = ACCEPT_HEADER connection.request(:json) connection.response(:json) end end end