module Geoloco::Adapters::Tomtom

Tomtom geocoding adapter

Constants

GEOCODE_URL

Public Class Methods

geocode(address, key:, qps_limit: 5) click to toggle source
# File lib/geoloco/adapters/tomtom.rb, line 10
def geocode(address, key:, qps_limit: 5)
  wait_qps_limit_time(qps_limit) unless qps_limit&.zero?
  response = Geoloco.http.get(geocode_url(address), query: { key: key })
  handle_errors(response)
  map_results(response.parsed_response)
end

Private Class Methods

geocode_url(address) click to toggle source
# File lib/geoloco/adapters/tomtom.rb, line 19
def geocode_url(address)
  escaped_address = CGI.escape(address)
  format(GEOCODE_URL, escaped_address)
end
handle_errors(response) click to toggle source
# File lib/geoloco/adapters/tomtom.rb, line 24
def handle_errors(response)
  raise Geoloco::Forbidden, response if response.code == 403
end
map_result(result) click to toggle source

rubocop:disable Metrics/AbcSize, Metrics/MethodLength

# File lib/geoloco/adapters/tomtom.rb, line 34
def map_result(result)
  address = result['address']
  geometry = Geoloco::Geometry.new(
    lat: result.dig('position', 'lat').to_f,
    lng: result.dig('position', 'lon').to_f
  )
  Geoloco::Location.new(
    geometry: geometry,
    full_address: address['freeformAddress'],
    street: address['streetName'], number: address['streetNumber'],
    city: address['municipality'], zipcode: address['postalCode'],
    district: address['countrySecondarySubdivision'],
    municipality: address['countryTertiarySubdivision'],
    state: address['countrySubdivisionName'],
    state_code: address['countrySubdivision'],
    country: address['country'], country_code: address['countryCode']
  )
end
map_results(parsed) click to toggle source
# File lib/geoloco/adapters/tomtom.rb, line 28
def map_results(parsed)
  parsed.fetch('results', [])
        .map(&method(:map_result))
end
wait_qps_limit_time(qps_limit) click to toggle source

rubocop:enable Metrics/AbcSize, Metrics/MethodLength

# File lib/geoloco/adapters/tomtom.rb, line 54
def wait_qps_limit_time(qps_limit)
  time_since_last_call = @last_api_call ? Time.now - @last_api_call : 2
  wait_time = 1.0 / qps_limit.to_f - time_since_last_call
  sleep wait_time if wait_time.positive?
  @last_api_call = Time.now
end