geocoder 1.7.2 → 1.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/README.md +9 -3
- data/examples/app_defined_lookup_services.rb +22 -0
- data/lib/geocoder/configuration.rb +4 -3
- data/lib/geocoder/lookup.rb +14 -2
- data/lib/geocoder/lookups/freegeoip.rb +8 -6
- data/lib/geocoder/lookups/location_iq.rb +5 -1
- data/lib/geocoder/results/nominatim.rb +24 -16
- data/lib/geocoder/version.rb +1 -1
- metadata +3 -4
- data/examples/autoexpire_cache_dalli.rb +0 -62
- data/examples/autoexpire_cache_redis.rb +0 -30
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 5063f6ec31c36d023439cdb255c76f62e9107da4d3bd42667a0f8a1df12919fd
         | 
| 4 | 
            +
              data.tar.gz: d260cd1d770947fa7415989c63404bb0f0e179eee7a0e0e09c3e5c56b019dec2
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: dd798ea9317b6cbdc51b521c60558002fc4263adb52fd2de8277e834a03a04561cedc070e2d08f4fe9ebd688771a8f6440a9c9288a83b6d3412d3d100714a99f
         | 
| 7 | 
            +
              data.tar.gz: d262213ca0f637847d571d81054365e969c6eb6b3444e6064a538928a0fb673c5e7c315bc0708758c33e107d46bf38a642f91bccb574273e0c784c77cf8562ad
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -3,6 +3,19 @@ Changelog | |
| 3 3 |  | 
| 4 4 | 
             
            Major changes to Geocoder for each release. Please see the Git log for complete list of changes.
         | 
| 5 5 |  | 
| 6 | 
            +
            1.7.5 (2022 Mar 14)
         | 
| 7 | 
            +
            -------------------
         | 
| 8 | 
            +
            * Avoid lookup naming collisions in some environments.
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            1.7.4 (2022 Mar 14)
         | 
| 11 | 
            +
            -------------------
         | 
| 12 | 
            +
            * Add ability to use app-defined lookups (thanks github.com/januszm).
         | 
| 13 | 
            +
            * Updates to LocationIQ and FreeGeoIP lookups.
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            1.7.3 (2022 Jan 17)
         | 
| 16 | 
            +
            -------------------
         | 
| 17 | 
            +
            * Get rid of unnecessary cache_prefix deprecation warnings.
         | 
| 18 | 
            +
             | 
| 6 19 | 
             
            1.7.2 (2022 Jan  2)
         | 
| 7 20 | 
             
            -------------------
         | 
| 8 21 | 
             
            * Fix uninitialized constant error (occurring on some systems with v1.7.1).
         | 
    
        data/README.md
    CHANGED
    
    | @@ -20,7 +20,7 @@ Compatibility: | |
| 20 20 |  | 
| 21 21 | 
             
            * Ruby versions: 2.1+, and JRuby.
         | 
| 22 22 | 
             
            * Databases: MySQL, PostgreSQL, SQLite, and MongoDB.
         | 
| 23 | 
            -
            * Rails: 5.x and  | 
| 23 | 
            +
            * Rails: 5.x, 6.x, and 7.x.
         | 
| 24 24 | 
             
            * Works outside of Rails with the `json` (for MRI) or `json_pure` (for JRuby) gem.
         | 
| 25 25 |  | 
| 26 26 |  | 
| @@ -78,7 +78,7 @@ results.first.address | |
| 78 78 | 
             
            # => "Hôtel de Ville, 75004 Paris, France"
         | 
| 79 79 | 
             
            ```
         | 
| 80 80 |  | 
| 81 | 
            -
            You can also look up the location of an IP  | 
| 81 | 
            +
            You can also look up the location of an IP address:
         | 
| 82 82 |  | 
| 83 83 | 
             
            ```ruby
         | 
| 84 84 | 
             
            results = Geocoder.search("172.56.21.89")
         | 
| @@ -350,10 +350,16 @@ This example uses Redis, but the cache store can be any object that supports the | |
| 350 350 |  | 
| 351 351 | 
             
            Even a plain Ruby hash will work, though it's not a great choice (cleared out when app is restarted, not shared between app instances, etc).
         | 
| 352 352 |  | 
| 353 | 
            +
            When using Rails use the Generic cache store as an adapter around `Rails.cache`:
         | 
| 354 | 
            +
             | 
| 355 | 
            +
            ```ruby
         | 
| 356 | 
            +
            Geocoder.configure(cache: Geocoder::CacheStore::Generic.new(Rails.cache, {}))
         | 
| 357 | 
            +
            ```
         | 
| 358 | 
            +
             | 
| 353 359 | 
             
            You can also set a custom prefix to be used for cache keys:
         | 
| 354 360 |  | 
| 355 361 | 
             
            ```ruby
         | 
| 356 | 
            -
            Geocoder.configure( | 
| 362 | 
            +
            Geocoder.configure(cache_options: { prefix: "..." })
         | 
| 357 363 | 
             
            ```
         | 
| 358 364 |  | 
| 359 365 | 
             
            By default the prefix is `geocoder:`
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            # To extend the Geocoder with additional lookups that come from the application,
         | 
| 2 | 
            +
            # not shipped with the gem, define a "child" lookup in your application, based on existing one.
         | 
| 3 | 
            +
            # This is required because the Geocoder::Configuration is a Singleton and stores one api key per lookup.
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            # in app/libs/geocoder/lookup/my_preciousss.rb
         | 
| 6 | 
            +
            module Geocoder::Lookup
         | 
| 7 | 
            +
              class MyPreciousss < Google
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
            end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            # Update Geocoder's street_services on initialize:
         | 
| 12 | 
            +
            # config/initializers/geocoder.rb
         | 
| 13 | 
            +
            Geocoder::Lookup.street_services << :my_preciousss
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            # Override the configuration when necessary (e.g. provide separate Google API key for the account):
         | 
| 16 | 
            +
            Geocoder.configure(my_preciousss: { api_key: 'abcdef' })
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            # Lastly, search using your custom lookup service/api keys
         | 
| 19 | 
            +
            Geocoder.search("Paris", lookup: :my_preciousss)
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            # This is useful when we have groups of users in the application who use Google paid services
         | 
| 22 | 
            +
            # and we want to properly separate them and allow using individual API KEYS or timeouts.
         | 
| @@ -108,8 +108,8 @@ module Geocoder | |
| 108 108 | 
             
                  @data[:http_proxy]   = nil         # HTTP proxy server (user:pass@host:port)
         | 
| 109 109 | 
             
                  @data[:https_proxy]  = nil         # HTTPS proxy server (user:pass@host:port)
         | 
| 110 110 | 
             
                  @data[:api_key]      = nil         # API key for geocoding service
         | 
| 111 | 
            -
                  @data[:cache]        = nil         # cache object (must respond to #[], #[]=, and #keys)
         | 
| 112 | 
            -
                  @data[:cache_prefix] =  | 
| 111 | 
            +
                  @data[:cache]        = nil         # cache object (must respond to #[], #[]=, and optionally #keys)
         | 
| 112 | 
            +
                  @data[:cache_prefix] = nil         # - DEPRECATED - prefix (string) to use for all cache keys
         | 
| 113 113 | 
             
                  @data[:basic_auth]   = {}          # user and password for basic auth ({:user => "user", :password => "password"})
         | 
| 114 114 | 
             
                  @data[:logger]       = :kernel     # :kernel or Logger instance
         | 
| 115 115 | 
             
                  @data[:kernel_logger_level] = ::Logger::WARN # log level, if kernel logger is used
         | 
| @@ -124,7 +124,8 @@ module Geocoder | |
| 124 124 | 
             
                  @data[:distances] = :linear  # :linear or :spherical
         | 
| 125 125 |  | 
| 126 126 | 
             
                  # explicit cache service options
         | 
| 127 | 
            -
                  @data[:cache_options]  | 
| 127 | 
            +
                  @data[:cache_options] ||= {}
         | 
| 128 | 
            +
                  @data[:cache_options][:prefix] = "geocoder:"
         | 
| 128 129 | 
             
                end
         | 
| 129 130 |  | 
| 130 131 | 
             
                instance_eval(OPTIONS.map do |option|
         | 
    
        data/lib/geocoder/lookup.rb
    CHANGED
    
    | @@ -117,8 +117,7 @@ module Geocoder | |
| 117 117 | 
             
                def spawn(name)
         | 
| 118 118 | 
             
                  if all_services.include?(name)
         | 
| 119 119 | 
             
                    name = name.to_s
         | 
| 120 | 
            -
                     | 
| 121 | 
            -
                    Geocoder::Lookup.const_get(classify_name(name)).new
         | 
| 120 | 
            +
                    instantiate_lookup(name)
         | 
| 122 121 | 
             
                  else
         | 
| 123 122 | 
             
                    valids = all_services.map(&:inspect).join(", ")
         | 
| 124 123 | 
             
                    raise ConfigurationError, "Please specify a valid lookup for Geocoder " +
         | 
| @@ -132,5 +131,18 @@ module Geocoder | |
| 132 131 | 
             
                def classify_name(filename)
         | 
| 133 132 | 
             
                  filename.to_s.split("_").map{ |i| i[0...1].upcase + i[1..-1] }.join
         | 
| 134 133 | 
             
                end
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                ##
         | 
| 136 | 
            +
                # Safely instantiate Lookup
         | 
| 137 | 
            +
                #
         | 
| 138 | 
            +
                def instantiate_lookup(name)
         | 
| 139 | 
            +
                  class_name = "Geocoder::Lookup::#{classify_name(name)}"
         | 
| 140 | 
            +
                  begin
         | 
| 141 | 
            +
                    Geocoder::Lookup.const_get(class_name)
         | 
| 142 | 
            +
                  rescue NameError
         | 
| 143 | 
            +
                    require "geocoder/lookups/#{name}"
         | 
| 144 | 
            +
                  end
         | 
| 145 | 
            +
                  Geocoder::Lookup.const_get(class_name).new
         | 
| 146 | 
            +
                end
         | 
| 135 147 | 
             
              end
         | 
| 136 148 | 
             
            end
         | 
| @@ -17,14 +17,16 @@ module Geocoder::Lookup | |
| 17 17 | 
             
                  end
         | 
| 18 18 | 
             
                end
         | 
| 19 19 |  | 
| 20 | 
            -
                def query_url(query)
         | 
| 21 | 
            -
                  "#{protocol}://#{host}/json/#{query.sanitized_text}"
         | 
| 22 | 
            -
                end
         | 
| 23 | 
            -
             | 
| 24 20 | 
             
                private # ---------------------------------------------------------------
         | 
| 25 21 |  | 
| 26 | 
            -
                def  | 
| 27 | 
            -
                   | 
| 22 | 
            +
                def base_query_url(query)
         | 
| 23 | 
            +
                  "#{protocol}://#{host}/json/#{query.sanitized_text}?"
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                def query_url_params(query)
         | 
| 27 | 
            +
                  {
         | 
| 28 | 
            +
                    :apikey => configuration.api_key
         | 
| 29 | 
            +
                  }.merge(super)
         | 
| 28 30 | 
             
                end
         | 
| 29 31 |  | 
| 30 32 | 
             
                def parse_raw_data(raw_data)
         | 
| @@ -11,6 +11,10 @@ module Geocoder::Lookup | |
| 11 11 | 
             
                  ["api_key"]
         | 
| 12 12 | 
             
                end
         | 
| 13 13 |  | 
| 14 | 
            +
                def supported_protocols
         | 
| 15 | 
            +
                  [:https]
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 14 18 | 
             
                private # ----------------------------------------------------------------
         | 
| 15 19 |  | 
| 16 20 | 
             
                def base_query_url(query)
         | 
| @@ -25,7 +29,7 @@ module Geocoder::Lookup | |
| 25 29 | 
             
                end
         | 
| 26 30 |  | 
| 27 31 | 
             
                def configured_host
         | 
| 28 | 
            -
                  configuration[:host] || "locationiq. | 
| 32 | 
            +
                  configuration[:host] || "us1.locationiq.com"
         | 
| 29 33 | 
             
                end
         | 
| 30 34 |  | 
| 31 35 | 
             
                def results(query)
         | 
| @@ -4,12 +4,12 @@ module Geocoder::Result | |
| 4 4 | 
             
              class Nominatim < Base
         | 
| 5 5 |  | 
| 6 6 | 
             
                def poi
         | 
| 7 | 
            -
                  return  | 
| 7 | 
            +
                  return address_data[place_type] if address_data.key?(place_type)
         | 
| 8 8 | 
             
                  return nil
         | 
| 9 9 | 
             
                end
         | 
| 10 10 |  | 
| 11 11 | 
             
                def house_number
         | 
| 12 | 
            -
                   | 
| 12 | 
            +
                  address_data['house_number']
         | 
| 13 13 | 
             
                end
         | 
| 14 14 |  | 
| 15 15 | 
             
                def address
         | 
| @@ -18,69 +18,71 @@ module Geocoder::Result | |
| 18 18 |  | 
| 19 19 | 
             
                def street
         | 
| 20 20 | 
             
                  %w[road pedestrian highway].each do |key|
         | 
| 21 | 
            -
                    return  | 
| 21 | 
            +
                    return address_data[key] if address_data.key?(key)
         | 
| 22 22 | 
             
                  end
         | 
| 23 23 | 
             
                  return nil
         | 
| 24 24 | 
             
                end
         | 
| 25 25 |  | 
| 26 26 | 
             
                def city
         | 
| 27 27 | 
             
                  %w[city town village hamlet].each do |key|
         | 
| 28 | 
            -
                    return  | 
| 28 | 
            +
                    return address_data[key] if address_data.key?(key)
         | 
| 29 29 | 
             
                  end
         | 
| 30 30 | 
             
                  return nil
         | 
| 31 31 | 
             
                end
         | 
| 32 32 |  | 
| 33 33 | 
             
                def village
         | 
| 34 | 
            -
                   | 
| 34 | 
            +
                  address_data['village']
         | 
| 35 35 | 
             
                end
         | 
| 36 36 |  | 
| 37 37 | 
             
                def town
         | 
| 38 | 
            -
                   | 
| 38 | 
            +
                  address_data['town']
         | 
| 39 39 | 
             
                end
         | 
| 40 40 |  | 
| 41 41 | 
             
                def state
         | 
| 42 | 
            -
                   | 
| 42 | 
            +
                  address_data['state']
         | 
| 43 43 | 
             
                end
         | 
| 44 44 |  | 
| 45 45 | 
             
                alias_method :state_code, :state
         | 
| 46 46 |  | 
| 47 47 | 
             
                def postal_code
         | 
| 48 | 
            -
                   | 
| 48 | 
            +
                  address_data['postcode']
         | 
| 49 49 | 
             
                end
         | 
| 50 50 |  | 
| 51 51 | 
             
                def county
         | 
| 52 | 
            -
                   | 
| 52 | 
            +
                  address_data['county']
         | 
| 53 53 | 
             
                end
         | 
| 54 54 |  | 
| 55 55 | 
             
                def country
         | 
| 56 | 
            -
                   | 
| 56 | 
            +
                  address_data['country']
         | 
| 57 57 | 
             
                end
         | 
| 58 58 |  | 
| 59 59 | 
             
                def country_code
         | 
| 60 | 
            -
                   | 
| 60 | 
            +
                  address_data['country_code']
         | 
| 61 61 | 
             
                end
         | 
| 62 62 |  | 
| 63 63 | 
             
                def suburb
         | 
| 64 | 
            -
                   | 
| 64 | 
            +
                  address_data['suburb']
         | 
| 65 65 | 
             
                end
         | 
| 66 66 |  | 
| 67 67 | 
             
                def city_district
         | 
| 68 | 
            -
                   | 
| 68 | 
            +
                  address_data['city_district']
         | 
| 69 69 | 
             
                end
         | 
| 70 70 |  | 
| 71 71 | 
             
                def state_district
         | 
| 72 | 
            -
                   | 
| 72 | 
            +
                  address_data['state_district']
         | 
| 73 73 | 
             
                end
         | 
| 74 74 |  | 
| 75 75 | 
             
                def neighbourhood
         | 
| 76 | 
            -
                   | 
| 76 | 
            +
                  address_data['neighbourhood']
         | 
| 77 77 | 
             
                end
         | 
| 78 78 |  | 
| 79 79 | 
             
                def municipality
         | 
| 80 | 
            -
                   | 
| 80 | 
            +
                  address_data['municipality']
         | 
| 81 81 | 
             
                end
         | 
| 82 82 |  | 
| 83 83 | 
             
                def coordinates
         | 
| 84 | 
            +
                  return [] unless @data['lat'] && @data['lon']
         | 
| 85 | 
            +
             | 
| 84 86 | 
             
                  [@data['lat'].to_f, @data['lon'].to_f]
         | 
| 85 87 | 
             
                end
         | 
| 86 88 |  | 
| @@ -109,5 +111,11 @@ module Geocoder::Result | |
| 109 111 | 
             
                    end
         | 
| 110 112 | 
             
                  end
         | 
| 111 113 | 
             
                end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                private
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                def address_data
         | 
| 118 | 
            +
                  @data['address'] || {}
         | 
| 119 | 
            +
                end
         | 
| 112 120 | 
             
              end
         | 
| 113 121 | 
             
            end
         | 
    
        data/lib/geocoder/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: geocoder
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.7. | 
| 4 | 
            +
              version: 1.7.5
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Alex Reisner
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2022- | 
| 11 | 
            +
            date: 2022-03-14 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies: []
         | 
| 13 13 | 
             
            description: Object geocoding (by street or IP address), reverse geocoding (coordinates
         | 
| 14 14 | 
             
              to street address), distance queries for ActiveRecord and Mongoid, result caching,
         | 
| @@ -25,8 +25,7 @@ files: | |
| 25 25 | 
             
            - README.md
         | 
| 26 26 | 
             
            - bin/console
         | 
| 27 27 | 
             
            - bin/geocode
         | 
| 28 | 
            -
            - examples/ | 
| 29 | 
            -
            - examples/autoexpire_cache_redis.rb
         | 
| 28 | 
            +
            - examples/app_defined_lookup_services.rb
         | 
| 30 29 | 
             
            - examples/cache_bypass.rb
         | 
| 31 30 | 
             
            - examples/reverse_geocode_job.rb
         | 
| 32 31 | 
             
            - lib/easting_northing.rb
         | 
| @@ -1,62 +0,0 @@ | |
| 1 | 
            -
            # This class implements a cache with simple delegation to the the Dalli Memcached client
         | 
| 2 | 
            -
            # https://github.com/mperham/dalli
         | 
| 3 | 
            -
            #
         | 
| 4 | 
            -
            # A TTL is set on initialization
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            class AutoexpireCacheDalli
         | 
| 7 | 
            -
              def initialize(store, ttl = 86400)
         | 
| 8 | 
            -
                @store = store
         | 
| 9 | 
            -
                @keys = 'GeocoderDalliClientKeys'
         | 
| 10 | 
            -
                @ttl = ttl
         | 
| 11 | 
            -
              end
         | 
| 12 | 
            -
             | 
| 13 | 
            -
              def [](url)
         | 
| 14 | 
            -
                res = @store.get(url)
         | 
| 15 | 
            -
                res = YAML::load(res) if res.present?
         | 
| 16 | 
            -
                res
         | 
| 17 | 
            -
              end
         | 
| 18 | 
            -
             | 
| 19 | 
            -
              def []=(url, value)
         | 
| 20 | 
            -
                if value.nil?
         | 
| 21 | 
            -
                  del(url)
         | 
| 22 | 
            -
                else
         | 
| 23 | 
            -
                  key_cache_add(url) if @store.add(url, YAML::dump(value), @ttl)
         | 
| 24 | 
            -
                end
         | 
| 25 | 
            -
                value
         | 
| 26 | 
            -
              end
         | 
| 27 | 
            -
             | 
| 28 | 
            -
              def keys
         | 
| 29 | 
            -
                key_cache
         | 
| 30 | 
            -
              end
         | 
| 31 | 
            -
             | 
| 32 | 
            -
              def del(url)
         | 
| 33 | 
            -
                key_cache_delete(url) if @store.delete(url)
         | 
| 34 | 
            -
              end
         | 
| 35 | 
            -
             | 
| 36 | 
            -
              private
         | 
| 37 | 
            -
             | 
| 38 | 
            -
              def key_cache
         | 
| 39 | 
            -
                the_keys = @store.get(@keys)
         | 
| 40 | 
            -
                if the_keys.nil?
         | 
| 41 | 
            -
                  @store.add(@keys, YAML::dump([]))
         | 
| 42 | 
            -
                  []
         | 
| 43 | 
            -
                else
         | 
| 44 | 
            -
                  YAML::load(the_keys)
         | 
| 45 | 
            -
                end
         | 
| 46 | 
            -
              end
         | 
| 47 | 
            -
             | 
| 48 | 
            -
              def key_cache_add(key)
         | 
| 49 | 
            -
                @store.replace(@keys, YAML::dump(key_cache << key))
         | 
| 50 | 
            -
              end
         | 
| 51 | 
            -
             | 
| 52 | 
            -
              def key_cache_delete(key)
         | 
| 53 | 
            -
                tmp = key_cache
         | 
| 54 | 
            -
                tmp.delete(key)
         | 
| 55 | 
            -
                @store.replace(@keys, YAML::dump(tmp))
         | 
| 56 | 
            -
              end
         | 
| 57 | 
            -
            end
         | 
| 58 | 
            -
             | 
| 59 | 
            -
            # Here Dalli is set up as on Heroku using the Memcachier gem.
         | 
| 60 | 
            -
            # https://devcenter.heroku.com/articles/memcachier#ruby
         | 
| 61 | 
            -
            # On other setups you might have to specify your Memcached server in Dalli::Client.new
         | 
| 62 | 
            -
            Geocoder.configure(:cache => AutoexpireCacheDalli.new(Dalli::Client.new))
         | 
| @@ -1,30 +0,0 @@ | |
| 1 | 
            -
            # This class implements a cache with simple delegation to the Redis store, but
         | 
| 2 | 
            -
            # when it creates a key/value pair, it also sends an EXPIRE command with a TTL.
         | 
| 3 | 
            -
            # It should be fairly simple to do the same thing with Memcached.
         | 
| 4 | 
            -
            # Alternatively, this class could inherit from Redis, which would make most
         | 
| 5 | 
            -
            # of the below methods unnecessary.
         | 
| 6 | 
            -
            class AutoexpireCacheRedis
         | 
| 7 | 
            -
              def initialize(store, ttl = 86400)
         | 
| 8 | 
            -
                @store = store
         | 
| 9 | 
            -
                @ttl = ttl
         | 
| 10 | 
            -
              end
         | 
| 11 | 
            -
             | 
| 12 | 
            -
              def [](url)
         | 
| 13 | 
            -
                @store.get(url)
         | 
| 14 | 
            -
              end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
              def []=(url, value)
         | 
| 17 | 
            -
                @store.set(url, value)
         | 
| 18 | 
            -
                @store.expire(url, @ttl)
         | 
| 19 | 
            -
              end
         | 
| 20 | 
            -
             | 
| 21 | 
            -
              def keys
         | 
| 22 | 
            -
                @store.keys
         | 
| 23 | 
            -
              end
         | 
| 24 | 
            -
             | 
| 25 | 
            -
              def del(url)
         | 
| 26 | 
            -
                @store.del(url)
         | 
| 27 | 
            -
              end
         | 
| 28 | 
            -
            end
         | 
| 29 | 
            -
             | 
| 30 | 
            -
            Geocoder.configure(:cache => AutoexpireCacheRedis.new(Redis.new))
         |