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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +557 -0
- data/LICENSE +20 -0
- data/README.md +3 -0
- data/bin/geocode +5 -0
- data/examples/autoexpire_cache_dalli.rb +62 -0
- data/examples/autoexpire_cache_redis.rb +28 -0
- data/examples/cache_bypass.rb +48 -0
- data/examples/reverse_geocode_job.rb +40 -0
- data/lib/generators/geocoder/config/config_generator.rb +14 -0
- data/lib/generators/geocoder/config/templates/initializer.rb +22 -0
- data/lib/generators/geocoder/maxmind/geolite_city_generator.rb +30 -0
- data/lib/generators/geocoder/maxmind/geolite_country_generator.rb +30 -0
- data/lib/generators/geocoder/maxmind/templates/migration/geolite_city.rb +30 -0
- data/lib/generators/geocoder/maxmind/templates/migration/geolite_country.rb +17 -0
- data/lib/generators/geocoder/migration_version.rb +15 -0
- data/lib/geocoder.rb +48 -0
- data/lib/geocoder/cache.rb +94 -0
- data/lib/geocoder/calculations.rb +420 -0
- data/lib/geocoder/cli.rb +121 -0
- data/lib/geocoder/configuration.rb +137 -0
- data/lib/geocoder/configuration_hash.rb +11 -0
- data/lib/geocoder/esri_token.rb +38 -0
- data/lib/geocoder/exceptions.rb +40 -0
- data/lib/geocoder/ip_address.rb +26 -0
- data/lib/geocoder/kernel_logger.rb +25 -0
- data/lib/geocoder/logger.rb +47 -0
- data/lib/geocoder/lookup.rb +118 -0
- data/lib/geocoder/lookups/amap.rb +63 -0
- data/lib/geocoder/lookups/baidu.rb +63 -0
- data/lib/geocoder/lookups/baidu_ip.rb +30 -0
- data/lib/geocoder/lookups/ban_data_gouv_fr.rb +130 -0
- data/lib/geocoder/lookups/base.rb +348 -0
- data/lib/geocoder/lookups/bing.rb +82 -0
- data/lib/geocoder/lookups/db_ip_com.rb +52 -0
- data/lib/geocoder/lookups/dstk.rb +22 -0
- data/lib/geocoder/lookups/esri.rb +95 -0
- data/lib/geocoder/lookups/freegeoip.rb +60 -0
- data/lib/geocoder/lookups/geocoder_ca.rb +53 -0
- data/lib/geocoder/lookups/geocoder_us.rb +51 -0
- data/lib/geocoder/lookups/geocodio.rb +42 -0
- data/lib/geocoder/lookups/geoip2.rb +45 -0
- data/lib/geocoder/lookups/geoportail_lu.rb +65 -0
- data/lib/geocoder/lookups/google.rb +95 -0
- data/lib/geocoder/lookups/google_places_details.rb +50 -0
- data/lib/geocoder/lookups/google_places_search.rb +33 -0
- data/lib/geocoder/lookups/google_premier.rb +57 -0
- data/lib/geocoder/lookups/here.rb +77 -0
- data/lib/geocoder/lookups/ip2location.rb +75 -0
- data/lib/geocoder/lookups/ipapi_com.rb +82 -0
- data/lib/geocoder/lookups/ipdata_co.rb +62 -0
- data/lib/geocoder/lookups/ipinfo_io.rb +44 -0
- data/lib/geocoder/lookups/ipstack.rb +63 -0
- data/lib/geocoder/lookups/latlon.rb +59 -0
- data/lib/geocoder/lookups/location_iq.rb +50 -0
- data/lib/geocoder/lookups/mapbox.rb +59 -0
- data/lib/geocoder/lookups/mapquest.rb +58 -0
- data/lib/geocoder/lookups/maxmind.rb +90 -0
- data/lib/geocoder/lookups/maxmind_geoip2.rb +70 -0
- data/lib/geocoder/lookups/maxmind_local.rb +65 -0
- data/lib/geocoder/lookups/nominatim.rb +64 -0
- data/lib/geocoder/lookups/opencagedata.rb +65 -0
- data/lib/geocoder/lookups/pelias.rb +63 -0
- data/lib/geocoder/lookups/pickpoint.rb +41 -0
- data/lib/geocoder/lookups/pointpin.rb +69 -0
- data/lib/geocoder/lookups/postcode_anywhere_uk.rb +50 -0
- data/lib/geocoder/lookups/postcodes_io.rb +31 -0
- data/lib/geocoder/lookups/smarty_streets.rb +63 -0
- data/lib/geocoder/lookups/telize.rb +75 -0
- data/lib/geocoder/lookups/tencent.rb +59 -0
- data/lib/geocoder/lookups/test.rb +44 -0
- data/lib/geocoder/lookups/yandex.rb +62 -0
- data/lib/geocoder/models/active_record.rb +51 -0
- data/lib/geocoder/models/base.rb +39 -0
- data/lib/geocoder/models/mongo_base.rb +62 -0
- data/lib/geocoder/models/mongo_mapper.rb +26 -0
- data/lib/geocoder/models/mongoid.rb +32 -0
- data/lib/geocoder/query.rb +125 -0
- data/lib/geocoder/railtie.rb +26 -0
- data/lib/geocoder/request.rb +114 -0
- data/lib/geocoder/results/amap.rb +87 -0
- data/lib/geocoder/results/baidu.rb +79 -0
- data/lib/geocoder/results/baidu_ip.rb +62 -0
- data/lib/geocoder/results/ban_data_gouv_fr.rb +257 -0
- data/lib/geocoder/results/base.rb +79 -0
- data/lib/geocoder/results/bing.rb +52 -0
- data/lib/geocoder/results/db_ip_com.rb +58 -0
- data/lib/geocoder/results/dstk.rb +6 -0
- data/lib/geocoder/results/esri.rb +75 -0
- data/lib/geocoder/results/freegeoip.rb +40 -0
- data/lib/geocoder/results/geocoder_ca.rb +60 -0
- data/lib/geocoder/results/geocoder_us.rb +39 -0
- data/lib/geocoder/results/geocodio.rb +78 -0
- data/lib/geocoder/results/geoip2.rb +76 -0
- data/lib/geocoder/results/geoportail_lu.rb +71 -0
- data/lib/geocoder/results/google.rb +150 -0
- data/lib/geocoder/results/google_places_details.rb +39 -0
- data/lib/geocoder/results/google_places_search.rb +52 -0
- data/lib/geocoder/results/google_premier.rb +6 -0
- data/lib/geocoder/results/here.rb +79 -0
- data/lib/geocoder/results/ip2location.rb +22 -0
- data/lib/geocoder/results/ipapi_com.rb +45 -0
- data/lib/geocoder/results/ipdata_co.rb +40 -0
- data/lib/geocoder/results/ipinfo_io.rb +48 -0
- data/lib/geocoder/results/ipstack.rb +60 -0
- data/lib/geocoder/results/latlon.rb +71 -0
- data/lib/geocoder/results/location_iq.rb +6 -0
- data/lib/geocoder/results/mapbox.rb +57 -0
- data/lib/geocoder/results/mapquest.rb +48 -0
- data/lib/geocoder/results/maxmind.rb +130 -0
- data/lib/geocoder/results/maxmind_geoip2.rb +9 -0
- data/lib/geocoder/results/maxmind_local.rb +44 -0
- data/lib/geocoder/results/nominatim.rb +109 -0
- data/lib/geocoder/results/opencagedata.rb +100 -0
- data/lib/geocoder/results/pelias.rb +58 -0
- data/lib/geocoder/results/pickpoint.rb +6 -0
- data/lib/geocoder/results/pointpin.rb +40 -0
- data/lib/geocoder/results/postcode_anywhere_uk.rb +42 -0
- data/lib/geocoder/results/postcodes_io.rb +40 -0
- data/lib/geocoder/results/smarty_streets.rb +142 -0
- data/lib/geocoder/results/telize.rb +40 -0
- data/lib/geocoder/results/tencent.rb +72 -0
- data/lib/geocoder/results/test.rb +33 -0
- data/lib/geocoder/results/yandex.rb +134 -0
- data/lib/geocoder/sql.rb +110 -0
- data/lib/geocoder/stores/active_record.rb +328 -0
- data/lib/geocoder/stores/base.rb +115 -0
- data/lib/geocoder/stores/mongo_base.rb +58 -0
- data/lib/geocoder/stores/mongo_mapper.rb +13 -0
- data/lib/geocoder/stores/mongoid.rb +13 -0
- data/lib/geocoder/version.rb +3 -0
- data/lib/hash_recursive_merge.rb +74 -0
- data/lib/maxmind_database.rb +109 -0
- data/lib/tasks/geocoder.rake +54 -0
- data/lib/tasks/maxmind.rake +73 -0
- metadata +186 -0
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class Ip2location < Base
|
5
|
+
|
6
|
+
def address(format = :full)
|
7
|
+
"#{city_name} #{zip_code}, #{country_name}".sub(/^[ ,]*/, '')
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.response_attributes
|
11
|
+
%w[country_code country_name region_name city_name latitude longitude
|
12
|
+
zip_code time_zone isp domain net_speed idd_code area_code usage_type
|
13
|
+
weather_station_code weather_station_name mcc mnc mobile_brand elevation]
|
14
|
+
end
|
15
|
+
|
16
|
+
response_attributes.each do |attr|
|
17
|
+
define_method attr do
|
18
|
+
@data[attr] || ""
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class IpapiCom < Base
|
5
|
+
|
6
|
+
def coordinates
|
7
|
+
[lat, lon]
|
8
|
+
end
|
9
|
+
|
10
|
+
def address
|
11
|
+
"#{city}, #{state_code} #{postal_code}, #{country}".sub(/^[ ,]*/, "")
|
12
|
+
end
|
13
|
+
|
14
|
+
def state
|
15
|
+
region_name
|
16
|
+
end
|
17
|
+
|
18
|
+
def state_code
|
19
|
+
region
|
20
|
+
end
|
21
|
+
|
22
|
+
def postal_code
|
23
|
+
zip
|
24
|
+
end
|
25
|
+
|
26
|
+
def country_code
|
27
|
+
@data['countryCode']
|
28
|
+
end
|
29
|
+
|
30
|
+
def region_name
|
31
|
+
@data['regionName']
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.response_attributes
|
35
|
+
%w[country region city zip timezone isp org as reverse query status message mobile proxy lat lon]
|
36
|
+
end
|
37
|
+
|
38
|
+
response_attributes.each do |attribute|
|
39
|
+
define_method attribute do
|
40
|
+
@data[attribute]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class IpdataCo < Base
|
5
|
+
|
6
|
+
def city
|
7
|
+
@data['city']
|
8
|
+
end
|
9
|
+
|
10
|
+
def state
|
11
|
+
@data['region']
|
12
|
+
end
|
13
|
+
|
14
|
+
def state_code
|
15
|
+
@data['region_code']
|
16
|
+
end
|
17
|
+
|
18
|
+
def country
|
19
|
+
@data['country_name']
|
20
|
+
end
|
21
|
+
|
22
|
+
def country_code
|
23
|
+
@data['country_code']
|
24
|
+
end
|
25
|
+
|
26
|
+
def postal_code
|
27
|
+
@data['postal']
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.response_attributes
|
31
|
+
%w[ip asn organisation currency currency_symbol calling_code flag time_zone is_eu]
|
32
|
+
end
|
33
|
+
|
34
|
+
response_attributes.each do |a|
|
35
|
+
define_method a do
|
36
|
+
@data[a]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class IpinfoIo < Base
|
5
|
+
|
6
|
+
def address(format = :full)
|
7
|
+
"#{city} #{postal_code}, #{country}".sub(/^[ ,]*/, "")
|
8
|
+
end
|
9
|
+
|
10
|
+
def coordinates
|
11
|
+
@data['loc'].to_s.split(",").map(&:to_f)
|
12
|
+
end
|
13
|
+
|
14
|
+
def city
|
15
|
+
@data['city']
|
16
|
+
end
|
17
|
+
|
18
|
+
def state
|
19
|
+
@data['region']
|
20
|
+
end
|
21
|
+
|
22
|
+
def country
|
23
|
+
@data['country']
|
24
|
+
end
|
25
|
+
|
26
|
+
def postal_code
|
27
|
+
@data['postal']
|
28
|
+
end
|
29
|
+
|
30
|
+
def country_code
|
31
|
+
@data.fetch('country', '')
|
32
|
+
end
|
33
|
+
|
34
|
+
def state_code
|
35
|
+
@data.fetch('region_code', '')
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.response_attributes
|
39
|
+
%w(ip region postal)
|
40
|
+
end
|
41
|
+
|
42
|
+
response_attributes.each do |a|
|
43
|
+
define_method a do
|
44
|
+
@data[a]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class Ipstack < Base
|
5
|
+
|
6
|
+
def address(format = :full)
|
7
|
+
s = region_code.empty? ? "" : ", #{region_code}"
|
8
|
+
"#{city}#{s} #{zip}, #{country_name}".sub(/^[ ,]*/, "")
|
9
|
+
end
|
10
|
+
|
11
|
+
def state
|
12
|
+
@data['region_name']
|
13
|
+
end
|
14
|
+
|
15
|
+
def state_code
|
16
|
+
@data['region_code']
|
17
|
+
end
|
18
|
+
|
19
|
+
def country
|
20
|
+
@data['country_name']
|
21
|
+
end
|
22
|
+
|
23
|
+
def postal_code
|
24
|
+
@data['zip'] || @data['zipcode'] || @data['zip_code']
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.response_attributes
|
28
|
+
[
|
29
|
+
['ip', ''],
|
30
|
+
['hostname', ''],
|
31
|
+
['continent_code', ''],
|
32
|
+
['continent_name', ''],
|
33
|
+
['country_code', ''],
|
34
|
+
['country_name', ''],
|
35
|
+
['region_code', ''],
|
36
|
+
['region_name', ''],
|
37
|
+
['city', ''],
|
38
|
+
['zip', ''],
|
39
|
+
['latitude', 0],
|
40
|
+
['longitude', 0],
|
41
|
+
['location', {}],
|
42
|
+
['time_zone', {}],
|
43
|
+
['currency', {}],
|
44
|
+
['connection', {}],
|
45
|
+
['security', {}],
|
46
|
+
]
|
47
|
+
end
|
48
|
+
|
49
|
+
response_attributes.each do |attr, default|
|
50
|
+
define_method attr do
|
51
|
+
@data[attr] || default
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def metro_code
|
56
|
+
Geocoder.log(:warn, "Ipstack does not implement `metro_code` in api results. Please discontinue use.")
|
57
|
+
0 # no longer implemented by ipstack
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class Latlon < Base
|
5
|
+
|
6
|
+
def city
|
7
|
+
address_components["city"]
|
8
|
+
end
|
9
|
+
|
10
|
+
def coordinates
|
11
|
+
[@data['lat'].to_f, @data['lon'].to_f]
|
12
|
+
end
|
13
|
+
|
14
|
+
def country
|
15
|
+
"United States" # LatLon.io only supports the US
|
16
|
+
end
|
17
|
+
|
18
|
+
def country_code
|
19
|
+
"US" # LatLon.io only supports the US
|
20
|
+
end
|
21
|
+
|
22
|
+
def formatted_address(format = :full)
|
23
|
+
address_components["address"]
|
24
|
+
end
|
25
|
+
alias_method :address, :formatted_address
|
26
|
+
|
27
|
+
def number
|
28
|
+
address_components["number"]
|
29
|
+
end
|
30
|
+
|
31
|
+
def prefix
|
32
|
+
address_components["prefix"]
|
33
|
+
end
|
34
|
+
|
35
|
+
def state
|
36
|
+
address_components["state"]
|
37
|
+
end
|
38
|
+
alias_method :state_code, :state
|
39
|
+
|
40
|
+
def street
|
41
|
+
[street_name, street_type].compact.join(' ')
|
42
|
+
end
|
43
|
+
|
44
|
+
def street_name
|
45
|
+
address_components["street_name"]
|
46
|
+
end
|
47
|
+
|
48
|
+
def street_type
|
49
|
+
address_components["street_type"]
|
50
|
+
end
|
51
|
+
|
52
|
+
def suffix
|
53
|
+
address_components["suffix"]
|
54
|
+
end
|
55
|
+
|
56
|
+
def unit
|
57
|
+
address_components["unit"]
|
58
|
+
end
|
59
|
+
|
60
|
+
def zip
|
61
|
+
address_components["zip"]
|
62
|
+
end
|
63
|
+
alias_method :postal_code, :zip
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def address_components
|
68
|
+
@data["address"] || {}
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class Mapbox < Base
|
5
|
+
|
6
|
+
def coordinates
|
7
|
+
data['geometry']['coordinates'].reverse.map(&:to_f)
|
8
|
+
end
|
9
|
+
|
10
|
+
def place_name
|
11
|
+
data['text']
|
12
|
+
end
|
13
|
+
|
14
|
+
def street
|
15
|
+
data['properties']['address']
|
16
|
+
end
|
17
|
+
|
18
|
+
def city
|
19
|
+
context_part('place')
|
20
|
+
end
|
21
|
+
|
22
|
+
def state
|
23
|
+
context_part('region')
|
24
|
+
end
|
25
|
+
|
26
|
+
alias_method :state_code, :state
|
27
|
+
|
28
|
+
def postal_code
|
29
|
+
context_part('postcode')
|
30
|
+
end
|
31
|
+
|
32
|
+
def country
|
33
|
+
context_part('country')
|
34
|
+
end
|
35
|
+
|
36
|
+
alias_method :country_code, :country
|
37
|
+
|
38
|
+
def neighborhood
|
39
|
+
context_part('neighborhood')
|
40
|
+
end
|
41
|
+
|
42
|
+
def address
|
43
|
+
[place_name, street, city, state, postal_code, country].compact.join(', ')
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def context_part(name)
|
49
|
+
context.map { |c| c['text'] if c['id'] =~ Regexp.new(name) }.compact.first
|
50
|
+
end
|
51
|
+
|
52
|
+
def context
|
53
|
+
Array(data['context'])
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class Mapquest < Base
|
5
|
+
|
6
|
+
def coordinates
|
7
|
+
%w[lat lng].map{ |l| @data["latLng"][l] }
|
8
|
+
end
|
9
|
+
|
10
|
+
def city
|
11
|
+
@data['adminArea5']
|
12
|
+
end
|
13
|
+
|
14
|
+
def street
|
15
|
+
@data['street']
|
16
|
+
end
|
17
|
+
|
18
|
+
def state
|
19
|
+
@data['adminArea3']
|
20
|
+
end
|
21
|
+
|
22
|
+
def county
|
23
|
+
@data['adminArea4']
|
24
|
+
end
|
25
|
+
|
26
|
+
alias_method :state_code, :state
|
27
|
+
|
28
|
+
#FIXME: these might not be right, unclear with MQ documentation
|
29
|
+
alias_method :province, :state
|
30
|
+
alias_method :province_code, :state
|
31
|
+
|
32
|
+
def postal_code
|
33
|
+
@data['postalCode'].to_s
|
34
|
+
end
|
35
|
+
|
36
|
+
def country
|
37
|
+
@data['adminArea1']
|
38
|
+
end
|
39
|
+
|
40
|
+
def country_code
|
41
|
+
country
|
42
|
+
end
|
43
|
+
|
44
|
+
def address
|
45
|
+
[street, city, state, postal_code, country].reject{|s| s.length == 0 }.join(", ")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class Maxmind < Base
|
5
|
+
|
6
|
+
##
|
7
|
+
# Hash mapping service names to names of returned fields.
|
8
|
+
#
|
9
|
+
def self.field_names
|
10
|
+
{
|
11
|
+
:country => [
|
12
|
+
:country_code,
|
13
|
+
:error
|
14
|
+
],
|
15
|
+
|
16
|
+
:city => [
|
17
|
+
:country_code,
|
18
|
+
:region_code,
|
19
|
+
:city_name,
|
20
|
+
:latitude,
|
21
|
+
:longitude,
|
22
|
+
:error
|
23
|
+
],
|
24
|
+
|
25
|
+
:city_isp_org => [
|
26
|
+
:country_code,
|
27
|
+
:region_code,
|
28
|
+
:city_name,
|
29
|
+
:postal_code,
|
30
|
+
:latitude,
|
31
|
+
:longitude,
|
32
|
+
:metro_code,
|
33
|
+
:area_code,
|
34
|
+
:isp_name,
|
35
|
+
:organization_name,
|
36
|
+
:error
|
37
|
+
],
|
38
|
+
|
39
|
+
:omni => [
|
40
|
+
:country_code,
|
41
|
+
:country_name,
|
42
|
+
:region_code,
|
43
|
+
:region_name,
|
44
|
+
:city_name,
|
45
|
+
:latitude,
|
46
|
+
:longitude,
|
47
|
+
:metro_code,
|
48
|
+
:area_code,
|
49
|
+
:time_zone,
|
50
|
+
:continent_code,
|
51
|
+
:postal_code,
|
52
|
+
:isp_name,
|
53
|
+
:organization_name,
|
54
|
+
:domain,
|
55
|
+
:as_number,
|
56
|
+
:netspeed,
|
57
|
+
:user_type,
|
58
|
+
:accuracy_radius,
|
59
|
+
:country_confidence_factor,
|
60
|
+
:city_confidence_factor,
|
61
|
+
:region_confidence_factor,
|
62
|
+
:postal_confidence_factor,
|
63
|
+
:error
|
64
|
+
]
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
68
|
+
##
|
69
|
+
# Name of the MaxMind service being used.
|
70
|
+
#
|
71
|
+
def service_name
|
72
|
+
# it would be much better to infer this from the length of the @data
|
73
|
+
# array, but MaxMind seems to send inconsistent and wide-ranging response
|
74
|
+
# lengths (see https://github.com/alexreisner/geocoder/issues/396)
|
75
|
+
Geocoder.config.maxmind[:service]
|
76
|
+
end
|
77
|
+
|
78
|
+
def field_names
|
79
|
+
self.class.field_names[service_name]
|
80
|
+
end
|
81
|
+
|
82
|
+
def data_hash
|
83
|
+
@data_hash ||= Hash[*field_names.zip(@data).flatten]
|
84
|
+
end
|
85
|
+
|
86
|
+
def coordinates
|
87
|
+
[data_hash[:latitude].to_f, data_hash[:longitude].to_f]
|
88
|
+
end
|
89
|
+
|
90
|
+
def city
|
91
|
+
data_hash[:city_name]
|
92
|
+
end
|
93
|
+
|
94
|
+
def state # not given by MaxMind
|
95
|
+
data_hash[:region_name] || data_hash[:region_code]
|
96
|
+
end
|
97
|
+
|
98
|
+
def state_code
|
99
|
+
data_hash[:region_code]
|
100
|
+
end
|
101
|
+
|
102
|
+
def country #not given by MaxMind
|
103
|
+
data_hash[:country_name] || data_hash[:country_code]
|
104
|
+
end
|
105
|
+
|
106
|
+
def country_code
|
107
|
+
data_hash[:country_code]
|
108
|
+
end
|
109
|
+
|
110
|
+
def postal_code
|
111
|
+
data_hash[:postal_code]
|
112
|
+
end
|
113
|
+
|
114
|
+
def method_missing(method, *args, &block)
|
115
|
+
if field_names.include?(method)
|
116
|
+
data_hash[method]
|
117
|
+
else
|
118
|
+
super
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def respond_to?(method)
|
123
|
+
if field_names.include?(method)
|
124
|
+
true
|
125
|
+
else
|
126
|
+
super
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|