really-broken-geocoder 1.5.1

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.
Files changed (136) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +557 -0
  3. data/LICENSE +20 -0
  4. data/README.md +3 -0
  5. data/bin/geocode +5 -0
  6. data/examples/autoexpire_cache_dalli.rb +62 -0
  7. data/examples/autoexpire_cache_redis.rb +28 -0
  8. data/examples/cache_bypass.rb +48 -0
  9. data/examples/reverse_geocode_job.rb +40 -0
  10. data/lib/generators/geocoder/config/config_generator.rb +14 -0
  11. data/lib/generators/geocoder/config/templates/initializer.rb +22 -0
  12. data/lib/generators/geocoder/maxmind/geolite_city_generator.rb +30 -0
  13. data/lib/generators/geocoder/maxmind/geolite_country_generator.rb +30 -0
  14. data/lib/generators/geocoder/maxmind/templates/migration/geolite_city.rb +30 -0
  15. data/lib/generators/geocoder/maxmind/templates/migration/geolite_country.rb +17 -0
  16. data/lib/generators/geocoder/migration_version.rb +15 -0
  17. data/lib/geocoder.rb +48 -0
  18. data/lib/geocoder/cache.rb +94 -0
  19. data/lib/geocoder/calculations.rb +420 -0
  20. data/lib/geocoder/cli.rb +121 -0
  21. data/lib/geocoder/configuration.rb +137 -0
  22. data/lib/geocoder/configuration_hash.rb +11 -0
  23. data/lib/geocoder/esri_token.rb +38 -0
  24. data/lib/geocoder/exceptions.rb +40 -0
  25. data/lib/geocoder/ip_address.rb +26 -0
  26. data/lib/geocoder/kernel_logger.rb +25 -0
  27. data/lib/geocoder/logger.rb +47 -0
  28. data/lib/geocoder/lookup.rb +118 -0
  29. data/lib/geocoder/lookups/amap.rb +63 -0
  30. data/lib/geocoder/lookups/baidu.rb +63 -0
  31. data/lib/geocoder/lookups/baidu_ip.rb +30 -0
  32. data/lib/geocoder/lookups/ban_data_gouv_fr.rb +130 -0
  33. data/lib/geocoder/lookups/base.rb +348 -0
  34. data/lib/geocoder/lookups/bing.rb +82 -0
  35. data/lib/geocoder/lookups/db_ip_com.rb +52 -0
  36. data/lib/geocoder/lookups/dstk.rb +22 -0
  37. data/lib/geocoder/lookups/esri.rb +95 -0
  38. data/lib/geocoder/lookups/freegeoip.rb +60 -0
  39. data/lib/geocoder/lookups/geocoder_ca.rb +53 -0
  40. data/lib/geocoder/lookups/geocoder_us.rb +51 -0
  41. data/lib/geocoder/lookups/geocodio.rb +42 -0
  42. data/lib/geocoder/lookups/geoip2.rb +45 -0
  43. data/lib/geocoder/lookups/geoportail_lu.rb +65 -0
  44. data/lib/geocoder/lookups/google.rb +95 -0
  45. data/lib/geocoder/lookups/google_places_details.rb +50 -0
  46. data/lib/geocoder/lookups/google_places_search.rb +33 -0
  47. data/lib/geocoder/lookups/google_premier.rb +57 -0
  48. data/lib/geocoder/lookups/here.rb +77 -0
  49. data/lib/geocoder/lookups/ip2location.rb +75 -0
  50. data/lib/geocoder/lookups/ipapi_com.rb +82 -0
  51. data/lib/geocoder/lookups/ipdata_co.rb +62 -0
  52. data/lib/geocoder/lookups/ipinfo_io.rb +44 -0
  53. data/lib/geocoder/lookups/ipstack.rb +63 -0
  54. data/lib/geocoder/lookups/latlon.rb +59 -0
  55. data/lib/geocoder/lookups/location_iq.rb +50 -0
  56. data/lib/geocoder/lookups/mapbox.rb +59 -0
  57. data/lib/geocoder/lookups/mapquest.rb +58 -0
  58. data/lib/geocoder/lookups/maxmind.rb +90 -0
  59. data/lib/geocoder/lookups/maxmind_geoip2.rb +70 -0
  60. data/lib/geocoder/lookups/maxmind_local.rb +65 -0
  61. data/lib/geocoder/lookups/nominatim.rb +64 -0
  62. data/lib/geocoder/lookups/opencagedata.rb +65 -0
  63. data/lib/geocoder/lookups/pelias.rb +63 -0
  64. data/lib/geocoder/lookups/pickpoint.rb +41 -0
  65. data/lib/geocoder/lookups/pointpin.rb +69 -0
  66. data/lib/geocoder/lookups/postcode_anywhere_uk.rb +50 -0
  67. data/lib/geocoder/lookups/postcodes_io.rb +31 -0
  68. data/lib/geocoder/lookups/smarty_streets.rb +63 -0
  69. data/lib/geocoder/lookups/telize.rb +75 -0
  70. data/lib/geocoder/lookups/tencent.rb +59 -0
  71. data/lib/geocoder/lookups/test.rb +44 -0
  72. data/lib/geocoder/lookups/yandex.rb +62 -0
  73. data/lib/geocoder/models/active_record.rb +51 -0
  74. data/lib/geocoder/models/base.rb +39 -0
  75. data/lib/geocoder/models/mongo_base.rb +62 -0
  76. data/lib/geocoder/models/mongo_mapper.rb +26 -0
  77. data/lib/geocoder/models/mongoid.rb +32 -0
  78. data/lib/geocoder/query.rb +125 -0
  79. data/lib/geocoder/railtie.rb +26 -0
  80. data/lib/geocoder/request.rb +114 -0
  81. data/lib/geocoder/results/amap.rb +87 -0
  82. data/lib/geocoder/results/baidu.rb +79 -0
  83. data/lib/geocoder/results/baidu_ip.rb +62 -0
  84. data/lib/geocoder/results/ban_data_gouv_fr.rb +257 -0
  85. data/lib/geocoder/results/base.rb +79 -0
  86. data/lib/geocoder/results/bing.rb +52 -0
  87. data/lib/geocoder/results/db_ip_com.rb +58 -0
  88. data/lib/geocoder/results/dstk.rb +6 -0
  89. data/lib/geocoder/results/esri.rb +75 -0
  90. data/lib/geocoder/results/freegeoip.rb +40 -0
  91. data/lib/geocoder/results/geocoder_ca.rb +60 -0
  92. data/lib/geocoder/results/geocoder_us.rb +39 -0
  93. data/lib/geocoder/results/geocodio.rb +78 -0
  94. data/lib/geocoder/results/geoip2.rb +76 -0
  95. data/lib/geocoder/results/geoportail_lu.rb +71 -0
  96. data/lib/geocoder/results/google.rb +150 -0
  97. data/lib/geocoder/results/google_places_details.rb +39 -0
  98. data/lib/geocoder/results/google_places_search.rb +52 -0
  99. data/lib/geocoder/results/google_premier.rb +6 -0
  100. data/lib/geocoder/results/here.rb +79 -0
  101. data/lib/geocoder/results/ip2location.rb +22 -0
  102. data/lib/geocoder/results/ipapi_com.rb +45 -0
  103. data/lib/geocoder/results/ipdata_co.rb +40 -0
  104. data/lib/geocoder/results/ipinfo_io.rb +48 -0
  105. data/lib/geocoder/results/ipstack.rb +60 -0
  106. data/lib/geocoder/results/latlon.rb +71 -0
  107. data/lib/geocoder/results/location_iq.rb +6 -0
  108. data/lib/geocoder/results/mapbox.rb +57 -0
  109. data/lib/geocoder/results/mapquest.rb +48 -0
  110. data/lib/geocoder/results/maxmind.rb +130 -0
  111. data/lib/geocoder/results/maxmind_geoip2.rb +9 -0
  112. data/lib/geocoder/results/maxmind_local.rb +44 -0
  113. data/lib/geocoder/results/nominatim.rb +109 -0
  114. data/lib/geocoder/results/opencagedata.rb +100 -0
  115. data/lib/geocoder/results/pelias.rb +58 -0
  116. data/lib/geocoder/results/pickpoint.rb +6 -0
  117. data/lib/geocoder/results/pointpin.rb +40 -0
  118. data/lib/geocoder/results/postcode_anywhere_uk.rb +42 -0
  119. data/lib/geocoder/results/postcodes_io.rb +40 -0
  120. data/lib/geocoder/results/smarty_streets.rb +142 -0
  121. data/lib/geocoder/results/telize.rb +40 -0
  122. data/lib/geocoder/results/tencent.rb +72 -0
  123. data/lib/geocoder/results/test.rb +33 -0
  124. data/lib/geocoder/results/yandex.rb +134 -0
  125. data/lib/geocoder/sql.rb +110 -0
  126. data/lib/geocoder/stores/active_record.rb +328 -0
  127. data/lib/geocoder/stores/base.rb +115 -0
  128. data/lib/geocoder/stores/mongo_base.rb +58 -0
  129. data/lib/geocoder/stores/mongo_mapper.rb +13 -0
  130. data/lib/geocoder/stores/mongoid.rb +13 -0
  131. data/lib/geocoder/version.rb +3 -0
  132. data/lib/hash_recursive_merge.rb +74 -0
  133. data/lib/maxmind_database.rb +109 -0
  134. data/lib/tasks/geocoder.rake +54 -0
  135. data/lib/tasks/maxmind.rake +73 -0
  136. metadata +186 -0
@@ -0,0 +1,13 @@
1
+ require 'geocoder/stores/base'
2
+ require 'geocoder/stores/mongo_base'
3
+
4
+ module Geocoder::Store
5
+ module MongoMapper
6
+ include Base
7
+ include MongoBase
8
+
9
+ def self.included(base)
10
+ MongoBase.included_by_model(base)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require 'geocoder/stores/base'
2
+ require 'geocoder/stores/mongo_base'
3
+
4
+ module Geocoder::Store
5
+ module Mongoid
6
+ include Base
7
+ include MongoBase
8
+
9
+ def self.included(base)
10
+ MongoBase.included_by_model(base)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ module Geocoder
2
+ VERSION = "1.5.1"
3
+ end
@@ -0,0 +1,74 @@
1
+ #
2
+ # = Hash Recursive Merge
3
+ #
4
+ # Merges a Ruby Hash recursively, Also known as deep merge.
5
+ # Recursive version of Hash#merge and Hash#merge!.
6
+ #
7
+ # Category:: Ruby
8
+ # Package:: Hash
9
+ # Author:: Simone Carletti <weppos@weppos.net>
10
+ # Copyright:: 2007-2008 The Authors
11
+ # License:: MIT License
12
+ # Link:: http://www.simonecarletti.com/
13
+ # Source:: http://gist.github.com/gists/6391/
14
+ #
15
+ module HashRecursiveMerge
16
+
17
+ #
18
+ # Recursive version of Hash#merge!
19
+ #
20
+ # Adds the contents of +other_hash+ to +hsh+,
21
+ # merging entries in +hsh+ with duplicate keys with those from +other_hash+.
22
+ #
23
+ # Compared with Hash#merge!, this method supports nested hashes.
24
+ # When both +hsh+ and +other_hash+ contains an entry with the same key,
25
+ # it merges and returns the values from both arrays.
26
+ #
27
+ # h1 = {"a" => 100, "b" => 200, "c" => {"c1" => 12, "c2" => 14}}
28
+ # h2 = {"b" => 254, "c" => {"c1" => 16, "c3" => 94}}
29
+ # h1.rmerge!(h2) #=> {"a" => 100, "b" => 254, "c" => {"c1" => 16, "c2" => 14, "c3" => 94}}
30
+ #
31
+ # Simply using Hash#merge! would return
32
+ #
33
+ # h1.merge!(h2) #=> {"a" => 100, "b" = >254, "c" => {"c1" => 16, "c3" => 94}}
34
+ #
35
+ def rmerge!(other_hash)
36
+ merge!(other_hash) do |key, oldval, newval|
37
+ oldval.class == self.class ? oldval.rmerge!(newval) : newval
38
+ end
39
+ end
40
+
41
+ #
42
+ # Recursive version of Hash#merge
43
+ #
44
+ # Compared with Hash#merge!, this method supports nested hashes.
45
+ # When both +hsh+ and +other_hash+ contains an entry with the same key,
46
+ # it merges and returns the values from both arrays.
47
+ #
48
+ # Compared with Hash#merge, this method provides a different approch
49
+ # for merging nasted hashes.
50
+ # If the value of a given key is an Hash and both +other_hash+ abd +hsh
51
+ # includes the same key, the value is merged instead replaced with
52
+ # +other_hash+ value.
53
+ #
54
+ # h1 = {"a" => 100, "b" => 200, "c" => {"c1" => 12, "c2" => 14}}
55
+ # h2 = {"b" => 254, "c" => {"c1" => 16, "c3" => 94}}
56
+ # h1.rmerge(h2) #=> {"a" => 100, "b" => 254, "c" => {"c1" => 16, "c2" => 14, "c3" => 94}}
57
+ #
58
+ # Simply using Hash#merge would return
59
+ #
60
+ # h1.merge(h2) #=> {"a" => 100, "b" = >254, "c" => {"c1" => 16, "c3" => 94}}
61
+ #
62
+ def rmerge(other_hash)
63
+ r = {}
64
+ merge(other_hash) do |key, oldval, newval|
65
+ r[key] = oldval.class == self.class ? oldval.rmerge(newval) : newval
66
+ end
67
+ end
68
+
69
+ end
70
+
71
+
72
+ class Hash
73
+ include HashRecursiveMerge
74
+ end
@@ -0,0 +1,109 @@
1
+ require 'csv'
2
+ require 'net/http'
3
+
4
+ module Geocoder
5
+ module MaxmindDatabase
6
+ extend self
7
+
8
+ def download(package, dir = "tmp")
9
+ filepath = File.expand_path(File.join(dir, archive_filename(package)))
10
+ open(filepath, 'wb') do |file|
11
+ uri = URI.parse(archive_url(package))
12
+ Net::HTTP.start(uri.host, uri.port) do |http|
13
+ http.request_get(uri.path) do |resp|
14
+ # TODO: show progress
15
+ resp.read_body do |segment|
16
+ file.write(segment)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ def insert(package, dir = "tmp")
24
+ data_files(package, dir).each do |filepath,table|
25
+ print "Resetting table #{table}..."
26
+ ActiveRecord::Base.connection.execute("DELETE FROM #{table}")
27
+ puts "done"
28
+ insert_into_table(table, filepath)
29
+ end
30
+ end
31
+
32
+ def archive_filename(package)
33
+ p = archive_url_path(package)
34
+ s = !(pos = p.rindex('/')).nil? && pos + 1 || 0
35
+ p[s..-1]
36
+ end
37
+
38
+ private # -------------------------------------------------------------
39
+
40
+ def table_columns(table_name)
41
+ {
42
+ maxmind_geolite_city_blocks: %w[start_ip_num end_ip_num loc_id],
43
+ maxmind_geolite_city_location: %w[loc_id country region city postal_code latitude longitude metro_code area_code],
44
+ maxmind_geolite_country: %w[start_ip end_ip start_ip_num end_ip_num country_code country]
45
+ }[table_name.to_sym]
46
+ end
47
+
48
+ def insert_into_table(table, filepath)
49
+ start_time = Time.now
50
+ print "Loading data for table #{table}"
51
+ rows = []
52
+ columns = table_columns(table)
53
+ CSV.foreach(filepath, encoding: "ISO-8859-1") do |line|
54
+ # Some files have header rows.
55
+ # skip if starts with "Copyright" or "locId" or "startIpNum"
56
+ next if line.first.match(/[A-z]/)
57
+ rows << line.to_a
58
+ if rows.size == 10000
59
+ insert_rows(table, columns, rows)
60
+ rows = []
61
+ print "."
62
+ end
63
+ end
64
+ insert_rows(table, columns, rows) if rows.size > 0
65
+ puts "done (#{Time.now - start_time} seconds)"
66
+ end
67
+
68
+ def insert_rows(table, headers, rows)
69
+ value_strings = rows.map do |row|
70
+ "(" + row.map{ |col| sql_escaped_value(col) }.join(',') + ")"
71
+ end
72
+ q = "INSERT INTO #{table} (#{headers.join(',')}) " +
73
+ "VALUES #{value_strings.join(',')}"
74
+ ActiveRecord::Base.connection.execute(q)
75
+ end
76
+
77
+ def sql_escaped_value(value)
78
+ value.to_i.to_s == value ? value :
79
+ ActiveRecord::Base.connection.quote(value)
80
+ end
81
+
82
+ def data_files(package, dir = "tmp")
83
+ case package
84
+ when :geolite_city_csv
85
+ # use the last two in case multiple versions exist
86
+ files = Dir.glob(File.join(dir, "GeoLiteCity_*/*.csv"))[-2..-1].sort
87
+ Hash[*files.zip(["maxmind_geolite_city_blocks", "maxmind_geolite_city_location"]).flatten]
88
+ when :geolite_country_csv
89
+ {File.join(dir, "GeoIPCountryWhois.csv") => "maxmind_geolite_country"}
90
+ end
91
+ end
92
+
93
+ def archive_url(package)
94
+ base_url + archive_url_path(package)
95
+ end
96
+
97
+ def archive_url_path(package)
98
+ {
99
+ geolite_country_csv: "GeoIPCountryCSV.zip",
100
+ geolite_city_csv: "GeoLiteCity_CSV/GeoLiteCity-latest.zip",
101
+ geolite_asn_csv: "asnum/GeoIPASNum2.zip"
102
+ }[package]
103
+ end
104
+
105
+ def base_url
106
+ "http://geolite.maxmind.com/download/geoip/database/"
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,54 @@
1
+ require "geocoder/models/mongoid"
2
+
3
+ namespace :geocode do
4
+ desc "Geocode all objects without coordinates."
5
+ task :all => :environment do
6
+ class_name = ENV['CLASS'] || ENV['class']
7
+ sleep_timer = ENV['SLEEP'] || ENV['sleep']
8
+ batch = ENV['BATCH'] || ENV['batch']
9
+ reverse = ENV['REVERSE'] || ENV['reverse']
10
+ limit = ENV['LIMIT'] || ENV['limit']
11
+ raise "Please specify a CLASS (model)" unless class_name
12
+ klass = class_from_string(class_name)
13
+ batch = (batch.to_i unless batch.nil?) || 1000
14
+ orm = (klass < Geocoder::Model::Mongoid) ? 'mongoid' : 'active_record'
15
+ reverse = false unless reverse.to_s.downcase == 'true'
16
+
17
+ geocode_record = lambda { |obj|
18
+ reverse ? obj.reverse_geocode : obj.geocode
19
+ obj.save
20
+ sleep(sleep_timer.to_f) unless sleep_timer.nil?
21
+ }
22
+
23
+ scope = reverse ? klass.not_reverse_geocoded : klass.not_geocoded
24
+ scope = scope.limit(limit) if limit
25
+ if orm == 'mongoid'
26
+ scope.each do |obj|
27
+ geocode_record.call(obj)
28
+ end
29
+ elsif orm == 'active_record'
30
+ if limit
31
+ scope.each do |obj|
32
+ geocode_record.call(obj)
33
+ end
34
+ else
35
+ scope.find_each(batch_size: batch) do |obj|
36
+ geocode_record.call(obj)
37
+ end
38
+ end
39
+ end
40
+
41
+ end
42
+ end
43
+ ##
44
+ # Get a class object from the string given in the shell environment.
45
+ # Similar to ActiveSupport's +constantize+ method.
46
+ #
47
+ def class_from_string(class_name)
48
+ parts = class_name.split("::")
49
+ constant = Object
50
+ parts.each do |part|
51
+ constant = constant.const_get(part)
52
+ end
53
+ constant
54
+ end
@@ -0,0 +1,73 @@
1
+ require 'maxmind_database'
2
+
3
+ namespace :geocoder do
4
+ namespace :maxmind do
5
+ namespace :geolite do
6
+
7
+ desc "Download and load/refresh MaxMind GeoLite City data"
8
+ task load: [:download, :extract, :insert]
9
+
10
+ desc "Download MaxMind GeoLite City data"
11
+ task :download do
12
+ p = MaxmindTask.check_for_package!
13
+ MaxmindTask.download!(p, dir: ENV['DIR'] || "tmp/")
14
+ end
15
+
16
+ desc "Extract (unzip) MaxMind GeoLite City data"
17
+ task :extract do
18
+ p = MaxmindTask.check_for_package!
19
+ MaxmindTask.extract!(p, dir: ENV['DIR'] || "tmp/")
20
+ end
21
+
22
+ desc "Load/refresh MaxMind GeoLite City data"
23
+ task insert: [:environment] do
24
+ p = MaxmindTask.check_for_package!
25
+ MaxmindTask.insert!(p, dir: ENV['DIR'] || "tmp/")
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ module MaxmindTask
32
+ extend self
33
+
34
+ def check_for_package!
35
+ if %w[city country].include?(p = ENV['PACKAGE'])
36
+ return p
37
+ else
38
+ puts "Please specify PACKAGE=city or PACKAGE=country"
39
+ exit
40
+ end
41
+ end
42
+
43
+ def download!(package, options = {})
44
+ p = "geolite_#{package}_csv".intern
45
+ Geocoder::MaxmindDatabase.download(p, options[:dir])
46
+ end
47
+
48
+ def extract!(package, options = {})
49
+ begin
50
+ require 'zip'
51
+ rescue LoadError
52
+ puts "Please install gem: rubyzip (>= 1.0.0)"
53
+ exit
54
+ end
55
+ require 'fileutils'
56
+ p = "geolite_#{package}_csv".intern
57
+ archive_filename = Geocoder::MaxmindDatabase.archive_filename(p)
58
+ Zip::File.open(File.join(options[:dir], archive_filename)).each do |entry|
59
+ filepath = File.join(options[:dir], entry.name)
60
+ if File.exist? filepath
61
+ warn "File already exists (#{entry.name}), skipping"
62
+ else
63
+ FileUtils.mkdir_p(File.dirname(filepath))
64
+ entry.extract(filepath)
65
+ end
66
+ end
67
+ end
68
+
69
+ def insert!(package, options = {})
70
+ p = "geolite_#{package}_csv".intern
71
+ Geocoder::MaxmindDatabase.insert(p, options[:dir])
72
+ end
73
+ end
metadata ADDED
@@ -0,0 +1,186 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: really-broken-geocoder
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.5.1
5
+ platform: ruby
6
+ authors:
7
+ - Alex Reisner
8
+ - Lindsey Dew
9
+ - Daniel Le Dosquet-Bergquist
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2019-02-05 00:00:00.000000000 Z
14
+ dependencies: []
15
+ description: Provides object geocoding (by street or IP address), reverse geocoding
16
+ (coordinates to street address), distance queries for ActiveRecord and Mongoid,
17
+ result caching, and more. Designed for Rails but works with Sinatra and other Rack
18
+ frameworks too.
19
+ email:
20
+ - dev@makersacademy.com
21
+ executables:
22
+ - geocode
23
+ extensions: []
24
+ extra_rdoc_files: []
25
+ files:
26
+ - CHANGELOG.md
27
+ - LICENSE
28
+ - README.md
29
+ - bin/geocode
30
+ - examples/autoexpire_cache_dalli.rb
31
+ - examples/autoexpire_cache_redis.rb
32
+ - examples/cache_bypass.rb
33
+ - examples/reverse_geocode_job.rb
34
+ - lib/generators/geocoder/config/config_generator.rb
35
+ - lib/generators/geocoder/config/templates/initializer.rb
36
+ - lib/generators/geocoder/maxmind/geolite_city_generator.rb
37
+ - lib/generators/geocoder/maxmind/geolite_country_generator.rb
38
+ - lib/generators/geocoder/maxmind/templates/migration/geolite_city.rb
39
+ - lib/generators/geocoder/maxmind/templates/migration/geolite_country.rb
40
+ - lib/generators/geocoder/migration_version.rb
41
+ - lib/geocoder.rb
42
+ - lib/geocoder/cache.rb
43
+ - lib/geocoder/calculations.rb
44
+ - lib/geocoder/cli.rb
45
+ - lib/geocoder/configuration.rb
46
+ - lib/geocoder/configuration_hash.rb
47
+ - lib/geocoder/esri_token.rb
48
+ - lib/geocoder/exceptions.rb
49
+ - lib/geocoder/ip_address.rb
50
+ - lib/geocoder/kernel_logger.rb
51
+ - lib/geocoder/logger.rb
52
+ - lib/geocoder/lookup.rb
53
+ - lib/geocoder/lookups/amap.rb
54
+ - lib/geocoder/lookups/baidu.rb
55
+ - lib/geocoder/lookups/baidu_ip.rb
56
+ - lib/geocoder/lookups/ban_data_gouv_fr.rb
57
+ - lib/geocoder/lookups/base.rb
58
+ - lib/geocoder/lookups/bing.rb
59
+ - lib/geocoder/lookups/db_ip_com.rb
60
+ - lib/geocoder/lookups/dstk.rb
61
+ - lib/geocoder/lookups/esri.rb
62
+ - lib/geocoder/lookups/freegeoip.rb
63
+ - lib/geocoder/lookups/geocoder_ca.rb
64
+ - lib/geocoder/lookups/geocoder_us.rb
65
+ - lib/geocoder/lookups/geocodio.rb
66
+ - lib/geocoder/lookups/geoip2.rb
67
+ - lib/geocoder/lookups/geoportail_lu.rb
68
+ - lib/geocoder/lookups/google.rb
69
+ - lib/geocoder/lookups/google_places_details.rb
70
+ - lib/geocoder/lookups/google_places_search.rb
71
+ - lib/geocoder/lookups/google_premier.rb
72
+ - lib/geocoder/lookups/here.rb
73
+ - lib/geocoder/lookups/ip2location.rb
74
+ - lib/geocoder/lookups/ipapi_com.rb
75
+ - lib/geocoder/lookups/ipdata_co.rb
76
+ - lib/geocoder/lookups/ipinfo_io.rb
77
+ - lib/geocoder/lookups/ipstack.rb
78
+ - lib/geocoder/lookups/latlon.rb
79
+ - lib/geocoder/lookups/location_iq.rb
80
+ - lib/geocoder/lookups/mapbox.rb
81
+ - lib/geocoder/lookups/mapquest.rb
82
+ - lib/geocoder/lookups/maxmind.rb
83
+ - lib/geocoder/lookups/maxmind_geoip2.rb
84
+ - lib/geocoder/lookups/maxmind_local.rb
85
+ - lib/geocoder/lookups/nominatim.rb
86
+ - lib/geocoder/lookups/opencagedata.rb
87
+ - lib/geocoder/lookups/pelias.rb
88
+ - lib/geocoder/lookups/pickpoint.rb
89
+ - lib/geocoder/lookups/pointpin.rb
90
+ - lib/geocoder/lookups/postcode_anywhere_uk.rb
91
+ - lib/geocoder/lookups/postcodes_io.rb
92
+ - lib/geocoder/lookups/smarty_streets.rb
93
+ - lib/geocoder/lookups/telize.rb
94
+ - lib/geocoder/lookups/tencent.rb
95
+ - lib/geocoder/lookups/test.rb
96
+ - lib/geocoder/lookups/yandex.rb
97
+ - lib/geocoder/models/active_record.rb
98
+ - lib/geocoder/models/base.rb
99
+ - lib/geocoder/models/mongo_base.rb
100
+ - lib/geocoder/models/mongo_mapper.rb
101
+ - lib/geocoder/models/mongoid.rb
102
+ - lib/geocoder/query.rb
103
+ - lib/geocoder/railtie.rb
104
+ - lib/geocoder/request.rb
105
+ - lib/geocoder/results/amap.rb
106
+ - lib/geocoder/results/baidu.rb
107
+ - lib/geocoder/results/baidu_ip.rb
108
+ - lib/geocoder/results/ban_data_gouv_fr.rb
109
+ - lib/geocoder/results/base.rb
110
+ - lib/geocoder/results/bing.rb
111
+ - lib/geocoder/results/db_ip_com.rb
112
+ - lib/geocoder/results/dstk.rb
113
+ - lib/geocoder/results/esri.rb
114
+ - lib/geocoder/results/freegeoip.rb
115
+ - lib/geocoder/results/geocoder_ca.rb
116
+ - lib/geocoder/results/geocoder_us.rb
117
+ - lib/geocoder/results/geocodio.rb
118
+ - lib/geocoder/results/geoip2.rb
119
+ - lib/geocoder/results/geoportail_lu.rb
120
+ - lib/geocoder/results/google.rb
121
+ - lib/geocoder/results/google_places_details.rb
122
+ - lib/geocoder/results/google_places_search.rb
123
+ - lib/geocoder/results/google_premier.rb
124
+ - lib/geocoder/results/here.rb
125
+ - lib/geocoder/results/ip2location.rb
126
+ - lib/geocoder/results/ipapi_com.rb
127
+ - lib/geocoder/results/ipdata_co.rb
128
+ - lib/geocoder/results/ipinfo_io.rb
129
+ - lib/geocoder/results/ipstack.rb
130
+ - lib/geocoder/results/latlon.rb
131
+ - lib/geocoder/results/location_iq.rb
132
+ - lib/geocoder/results/mapbox.rb
133
+ - lib/geocoder/results/mapquest.rb
134
+ - lib/geocoder/results/maxmind.rb
135
+ - lib/geocoder/results/maxmind_geoip2.rb
136
+ - lib/geocoder/results/maxmind_local.rb
137
+ - lib/geocoder/results/nominatim.rb
138
+ - lib/geocoder/results/opencagedata.rb
139
+ - lib/geocoder/results/pelias.rb
140
+ - lib/geocoder/results/pickpoint.rb
141
+ - lib/geocoder/results/pointpin.rb
142
+ - lib/geocoder/results/postcode_anywhere_uk.rb
143
+ - lib/geocoder/results/postcodes_io.rb
144
+ - lib/geocoder/results/smarty_streets.rb
145
+ - lib/geocoder/results/telize.rb
146
+ - lib/geocoder/results/tencent.rb
147
+ - lib/geocoder/results/test.rb
148
+ - lib/geocoder/results/yandex.rb
149
+ - lib/geocoder/sql.rb
150
+ - lib/geocoder/stores/active_record.rb
151
+ - lib/geocoder/stores/base.rb
152
+ - lib/geocoder/stores/mongo_base.rb
153
+ - lib/geocoder/stores/mongo_mapper.rb
154
+ - lib/geocoder/stores/mongoid.rb
155
+ - lib/geocoder/version.rb
156
+ - lib/hash_recursive_merge.rb
157
+ - lib/maxmind_database.rb
158
+ - lib/tasks/geocoder.rake
159
+ - lib/tasks/maxmind.rake
160
+ homepage: http://www.rubygeocoder.com
161
+ licenses:
162
+ - MIT
163
+ metadata:
164
+ source_code_uri: https://github.com/alexreisner/geocoder
165
+ changelog_uri: https://github.com/alexreisner/geocoder/blob/master/CHANGELOG.md
166
+ post_install_message:
167
+ rdoc_options: []
168
+ require_paths:
169
+ - lib
170
+ required_ruby_version: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: 2.0.0
175
+ required_rubygems_version: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ requirements: []
181
+ rubyforge_project:
182
+ rubygems_version: 2.7.6
183
+ signing_key:
184
+ specification_version: 4
185
+ summary: Complete geocoding solution for Ruby.
186
+ test_files: []