require 'singleton' module Geocoder ## # Provides convenient access to the Configuration singleton. # def self.configure(&block) if block_given? block.call(Configuration.instance) else Configuration.instance end end ## # This class handles geocoder Geocoder configuration # (geocoding service provider, caching, units of measurement, etc). # Configuration can be done in two ways: # # 1) Using Geocoder.configure and passing a block # (useful for configuring multiple things at once): # # Geocoder.configure do |config| # config.timeout = 5 # config.lookup = :yandex # config.api_key = "2a9fsa983jaslfj982fjasd" # config.units = :km # end # # 2) Using the Geocoder::Configuration singleton directly: # # Geocoder::Configuration.language = 'pt-BR' # # Default values are defined in Configuration#set_defaults. # class Configuration include Singleton OPTIONS = [ :timeout, :lookup, :ip_lookup, :language, :http_headers, :use_https, :http_proxy, :https_proxy, :api_key, :cache, :cache_prefix, :always_raise, :units, :distances ] attr_accessor *OPTIONS def initialize # :nodoc set_defaults end def set_defaults @timeout = 3 # geocoding service timeout (secs) @lookup = :google # name of street address geocoding service (symbol) @ip_lookup = :freegeoip # name of IP address geocoding service (symbol) @language = :en # ISO-639 language code @http_headers = {} # HTTP headers for lookup @use_https = false # use HTTPS for lookup requests? (if supported) @http_proxy = nil # HTTP proxy server (user:pass@host:port) @https_proxy = nil # HTTPS proxy server (user:pass@host:port) @api_key = nil # API key for geocoding service @cache = nil # cache object (must respond to #[], #[]=, and #keys) @cache_prefix = "geocoder:" # prefix (string) to use for all cache keys # exceptions that should not be rescued by default # (if you want to implement custom error handling); # supports SocketError and TimeoutError @always_raise = [] # calculation options @units = :mi # :mi or :km @distances = :linear # :linear or :spherical end instance_eval(OPTIONS.map do |option| o = option.to_s <<-EOS def #{o} instance.#{o} end def #{o}=(value) instance.#{o} = value end EOS end.join("\n\n")) class << self def set_defaults instance.set_defaults end end end end