lib/timezone/lookup.rb in timezone-0.6.0 vs lib/timezone/lookup.rb in timezone-0.99.0
- old
+ new
@@ -1,2 +1,70 @@
require 'timezone/lookup/geonames'
require 'timezone/lookup/google'
+require 'timezone/lookup/test'
+require 'timezone/net_http_client'
+
+module Timezone
+ # Configure timezone lookups.
+ module Lookup
+ class << self
+ MISSING_LOOKUP = 'No lookup configured'.freeze
+ private_constant :MISSING_LOOKUP
+
+ # Returns the lookup object
+ #
+ # @return [#lookup] the lookup object
+ # @raise [Timezone::Error::InvalidConfig] if the lookup has not
+ # been configured
+ def lookup
+ @lookup || raise(::Timezone::Error::InvalidConfig, MISSING_LOOKUP)
+ end
+
+ # Configure a lookup object
+ #
+ # @param lookup [:google, :geonames, :test] use a built-in lookup
+ # @param lookup [Class] a custom lookup class
+ # @yieldparam [OpenStruct] an object on which to set configuration
+ # options
+ #
+ # @return [#lookup] the lookup object
+ def config(lookup)
+ options = OptionSetter.new(lookup)
+ yield(options.config) if block_given?
+ @lookup = options.make_lookup
+ end
+
+ # Responsible for collecting options in the DSL and creating
+ # lookup objects using those options.
+ class OptionSetter
+ LOOKUPS = {
+ geonames: ::Timezone::Lookup::Geonames,
+ google: ::Timezone::Lookup::Google,
+ test: ::Timezone::Lookup::Test
+ }.freeze
+
+ INVALID_LOOKUP = 'Invalid lookup specified'.freeze
+
+ attr_reader :config
+
+ def initialize(lookup)
+ if lookup.is_a?(Symbol)
+ lookup = LOOKUPS.fetch(lookup) do
+ raise ::Timezone::Error::InvalidConfig, INVALID_LOOKUP
+ end
+ end
+
+ @lookup = lookup
+
+ @config = OpenStruct.new
+ end
+
+ def make_lookup
+ config.request_handler ||= ::Timezone::NetHTTPClient
+ @lookup.new(config)
+ end
+ end
+
+ private_constant :OptionSetter
+ end
+ end
+end