Class: INatGet::App::Server::API

Inherits:
INatGet::App::Server show all
Defined in:
lib/inat-get/app/core/api.rb,
lib/inat-get/app/core/api_cache.rb

Overview

require_relative 'api_cache'

Defined Under Namespace

Classes: Cache

Instance Attribute Summary

Attributes inherited from INatGet::App::Server

#config

Instance Method Summary collapse

Methods inherited from INatGet::App::Server

#after_loop, #before_loop, create, #on_error, #process_msg, #run, used?, wait_answer?

Constructor Details

#initialize(socket_path, **params) ⇒ API

Returns a new instance of API.



16
17
18
19
20
21
22
# File 'lib/inat-get/app/core/api.rb', line 16

def initialize socket_path, **params
  @console = params.delete :console
  @logger = ::INatGet::App::ConsoleLogger::new @console, progname: 'API'
  super(socket_path, **params)
  @config = INatGet::App::Setup::config
  @delay = IS::Duration::parse @config.dig(:api, :delay)
end

Instance Method Details

#faradayObject (private)



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/inat-get/app/core/api.rb', line 58

def faraday
  logger = ::Logger::new 'api.log', level: :debug
  # logger.info
  @faraday ||= Faraday::new do |f|
    f.request :retry,
              max: @config.dig(:api, :retry, :max),
              interval: IS::Duration::parse(@config.dig(:api, :retry, :interval)),
              interval_randomness: @config.dig(:api, :retry, :randomness),
              backoff_factor: @config.dig(:api, :retry, :backoff),
              retry_block: lambda { |env:, options:, retry_count:, exception:, will_retry_in:| @logger.warn "retry... : #{ retry_count } : #{ exception.class }" },
              exceptions: [Faraday::TimeoutError, Faraday::ConnectionFailed, Faraday::SSLError, Faraday::ClientError]
    f.request :url_encoded

    f.response :logger, logger, { bodies: false, headers: true }

    # f.response :gzip
    f.response :raise_error

    # f.adapter Faraday.default_adapter

    f.adapter :typhoeus 
    # do |typhoeus|
    #   typhoeus.options[:connecttimeout] = 5
    #   typhoeus.options[:timeout] = 10
    #   typhoeus.options[:nosignal] = 1
    #   typhoeus.options[:dns_cache_timeout] = 0
    # end
  end
end

#get(query, **opts) ⇒ Object (private)



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/inat-get/app/core/api.rb', line 26

def get query, **opts
  endpoint = @config.dig(:api, :root) + query[:endpoint].to_s
  @logger.info query[:endpoint].to_s
  timepoint = Time::now
  if @last_request
    delta = timepoint - @last_request
    sleep (@delay - delta) if delta < @delay
  end
  @last_request = timepoint
  response = faraday.get(endpoint) do |rq|
    rq.params[:per_page] = @config.dig(:api, :pager)
    rq.params.compact!
    rq.params.merge! query[:query]
    rq.headers["User-Agent"] = "iNatGet v#{INatGet::Info::VERSION} (#{ INatGet::Info::VERSION_ALIAS })"
  end
  @logger.clear
  if response.success?
    begin
      data = JSON.parse response.body, symbolize_names: true
      return data.freeze
    rescue => e
      @logger.error "Error while parsing: #{e.message}"
      return { status: :error, error: e.message }.freeze
    end
  else
    @logger.error "Error in response: #{response.status}"
    return { status: :error, error: response.status }.freeze
  end
rescue => e
  return { status: :error, error: e.message }.freeze
end