geocoder 1.4.9 → 1.6.7
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 +5 -5
- data/CHANGELOG.md +60 -0
- data/LICENSE +1 -1
- data/README.md +350 -979
- data/bin/console +13 -0
- data/examples/autoexpire_cache_redis.rb +2 -0
- data/lib/easting_northing.rb +171 -0
- data/lib/generators/geocoder/config/templates/initializer.rb +1 -1
- data/lib/geocoder/cache.rb +4 -0
- data/lib/geocoder/calculations.rb +1 -1
- data/lib/geocoder/cli.rb +2 -2
- data/lib/geocoder/configuration.rb +3 -2
- data/lib/geocoder/configuration_hash.rb +4 -4
- data/lib/geocoder/exceptions.rb +1 -1
- data/lib/geocoder/ip_address.rb +16 -2
- data/lib/geocoder/lookup.rb +9 -5
- data/lib/geocoder/lookups/abstract_api.rb +46 -0
- data/lib/geocoder/lookups/amap.rb +7 -3
- data/lib/geocoder/lookups/baidu.rb +14 -10
- data/lib/geocoder/lookups/baidu_ip.rb +7 -36
- data/lib/geocoder/lookups/ban_data_gouv_fr.rb +18 -5
- data/lib/geocoder/lookups/base.rb +27 -4
- data/lib/geocoder/lookups/bing.rb +10 -13
- data/lib/geocoder/lookups/db_ip_com.rb +9 -6
- data/lib/geocoder/lookups/dstk.rb +4 -2
- data/lib/geocoder/lookups/esri.rb +44 -28
- data/lib/geocoder/lookups/freegeoip.rb +11 -7
- data/lib/geocoder/lookups/geocoder_ca.rb +4 -4
- data/lib/geocoder/lookups/geocodio.rb +5 -5
- data/lib/geocoder/lookups/geoportail_lu.rb +7 -7
- data/lib/geocoder/lookups/google.rb +15 -10
- data/lib/geocoder/lookups/google_places_details.rb +11 -17
- data/lib/geocoder/lookups/google_places_search.rb +30 -4
- data/lib/geocoder/lookups/google_premier.rb +14 -0
- data/lib/geocoder/lookups/here.rb +29 -23
- data/lib/geocoder/lookups/ip2location.rb +67 -0
- data/lib/geocoder/lookups/ipapi_com.rb +9 -13
- data/lib/geocoder/lookups/ipdata_co.rb +9 -4
- data/lib/geocoder/lookups/ipgeolocation.rb +51 -0
- data/lib/geocoder/lookups/ipinfo_io.rb +11 -29
- data/lib/geocoder/lookups/ipregistry.rb +68 -0
- data/lib/geocoder/lookups/ipstack.rb +11 -12
- data/lib/geocoder/lookups/latlon.rb +5 -6
- data/lib/geocoder/lookups/location_iq.rb +10 -4
- data/lib/geocoder/lookups/mapbox.rb +7 -6
- data/lib/geocoder/lookups/mapquest.rb +4 -5
- data/lib/geocoder/lookups/maxmind.rb +6 -6
- data/lib/geocoder/lookups/maxmind_geoip2.rb +8 -7
- data/lib/geocoder/lookups/maxmind_local.rb +7 -1
- data/lib/geocoder/lookups/nationaal_georegister_nl.rb +38 -0
- data/lib/geocoder/lookups/nominatim.rb +4 -4
- data/lib/geocoder/lookups/opencagedata.rb +6 -5
- data/lib/geocoder/lookups/osmnames.rb +57 -0
- data/lib/geocoder/lookups/pelias.rb +8 -9
- data/lib/geocoder/lookups/pickpoint.rb +9 -3
- data/lib/geocoder/lookups/pointpin.rb +10 -9
- data/lib/geocoder/lookups/postcode_anywhere_uk.rb +4 -5
- data/lib/geocoder/lookups/postcodes_io.rb +6 -3
- data/lib/geocoder/lookups/smarty_streets.rb +26 -11
- data/lib/geocoder/lookups/telize.rb +24 -4
- data/lib/geocoder/lookups/tencent.rb +59 -0
- data/lib/geocoder/lookups/test.rb +4 -0
- data/lib/geocoder/lookups/uk_ordnance_survey_names.rb +59 -0
- data/lib/geocoder/lookups/yandex.rb +7 -8
- data/lib/geocoder/query.rb +14 -0
- data/lib/geocoder/railtie.rb +1 -1
- data/lib/geocoder/results/abstract_api.rb +146 -0
- data/lib/geocoder/results/baidu.rb +10 -14
- data/lib/geocoder/results/ban_data_gouv_fr.rb +27 -2
- data/lib/geocoder/results/base.rb +13 -1
- data/lib/geocoder/results/bing.rb +1 -1
- data/lib/geocoder/results/db_ip_com.rb +1 -6
- data/lib/geocoder/results/freegeoip.rb +0 -5
- data/lib/geocoder/results/geocoder_ca.rb +3 -3
- data/lib/geocoder/results/geoip2.rb +0 -4
- data/lib/geocoder/results/geoportail_lu.rb +5 -3
- data/lib/geocoder/results/here.rb +4 -1
- data/lib/geocoder/results/ip2location.rb +22 -0
- data/lib/geocoder/results/ipdata_co.rb +0 -5
- data/lib/geocoder/results/ipgeolocation.rb +59 -0
- data/lib/geocoder/results/ipregistry.rb +304 -0
- data/lib/geocoder/results/maxmind.rb +0 -5
- data/lib/geocoder/results/maxmind_local.rb +0 -5
- data/lib/geocoder/results/nationaal_georegister_nl.rb +62 -0
- data/lib/geocoder/results/nominatim.rb +4 -0
- data/lib/geocoder/results/osmnames.rb +56 -0
- data/lib/geocoder/results/smarty_streets.rb +48 -18
- data/lib/geocoder/results/telize.rb +0 -5
- data/lib/geocoder/results/tencent.rb +72 -0
- data/lib/geocoder/results/test.rb +1 -1
- data/lib/geocoder/results/uk_ordnance_survey_names.rb +59 -0
- data/lib/geocoder/results/yandex.rb +217 -59
- data/lib/geocoder/sql.rb +4 -4
- data/lib/geocoder/stores/active_record.rb +1 -3
- data/lib/geocoder/util.rb +29 -0
- data/lib/geocoder/version.rb +1 -1
- data/lib/maxmind_database.rb +3 -3
- metadata +27 -23
- data/lib/geocoder/lookups/geocoder_us.rb +0 -43
- data/lib/geocoder/lookups/mapzen.rb +0 -15
- data/lib/geocoder/lookups/okf.rb +0 -44
- data/lib/geocoder/lookups/ovi.rb +0 -62
- data/lib/geocoder/results/geocoder_us.rb +0 -39
- data/lib/geocoder/results/mapzen.rb +0 -5
- data/lib/geocoder/results/okf.rb +0 -106
- data/lib/geocoder/results/ovi.rb +0 -71
- data/lib/hash_recursive_merge.rb +0 -74
data/lib/geocoder/railtie.rb
CHANGED
|
@@ -4,7 +4,7 @@ module Geocoder
|
|
|
4
4
|
if defined? Rails::Railtie
|
|
5
5
|
require 'rails'
|
|
6
6
|
class Railtie < Rails::Railtie
|
|
7
|
-
initializer 'geocoder.insert_into_active_record' do
|
|
7
|
+
initializer 'geocoder.insert_into_active_record', before: :load_config_initializers do
|
|
8
8
|
ActiveSupport.on_load :active_record do
|
|
9
9
|
Geocoder::Railtie.insert
|
|
10
10
|
end
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
require 'geocoder/results/base'
|
|
2
|
+
|
|
3
|
+
module Geocoder
|
|
4
|
+
module Result
|
|
5
|
+
class AbstractApi < Base
|
|
6
|
+
|
|
7
|
+
##
|
|
8
|
+
# Geolocation
|
|
9
|
+
|
|
10
|
+
def state
|
|
11
|
+
@data['region']
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def state_code
|
|
15
|
+
@data['region_iso_code']
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def city
|
|
19
|
+
@data["city"]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def city_geoname_id
|
|
23
|
+
@data["city_geoname_id"]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def region_geoname_id
|
|
27
|
+
@data["region_geoname_id"]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def postal_code
|
|
31
|
+
@data["postal_code"]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def country
|
|
35
|
+
@data["country"]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def country_code
|
|
39
|
+
@data["country_code"]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def country_geoname_id
|
|
43
|
+
@data["country_geoname_id"]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def country_is_eu
|
|
47
|
+
@data["country_is_eu"]
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def continent
|
|
51
|
+
@data["continent"]
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def continent_code
|
|
55
|
+
@data["continent_code"]
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def continent_geoname_id
|
|
59
|
+
@data["continent_geoname_id"]
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
##
|
|
63
|
+
# Security
|
|
64
|
+
|
|
65
|
+
def is_vpn?
|
|
66
|
+
@data.dig "security", "is_vpn"
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
##
|
|
70
|
+
# Timezone
|
|
71
|
+
|
|
72
|
+
def timezone_name
|
|
73
|
+
@data.dig "timezone", "name"
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def timezone_abbreviation
|
|
77
|
+
@data.dig "timezone", "abbreviation"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def timezone_gmt_offset
|
|
81
|
+
@data.dig "timezone", "gmt_offset"
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def timezone_current_time
|
|
85
|
+
@data.dig "timezone", "current_time"
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def timezone_is_dst
|
|
89
|
+
@data.dig "timezone", "is_dst"
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
##
|
|
93
|
+
# Flag
|
|
94
|
+
|
|
95
|
+
def flag_emoji
|
|
96
|
+
@data.dig "flag", "emoji"
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def flag_unicode
|
|
100
|
+
@data.dig "flag", "unicode"
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def flag_png
|
|
104
|
+
@data.dig "flag", "png"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def flag_svg
|
|
108
|
+
@data.dig "flag", "svg"
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
##
|
|
112
|
+
# Currency
|
|
113
|
+
|
|
114
|
+
def currency_currency_name
|
|
115
|
+
@data.dig "currency", "currency_name"
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def currency_currency_code
|
|
119
|
+
@data.dig "currency", "currency_code"
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
##
|
|
123
|
+
# Connection
|
|
124
|
+
|
|
125
|
+
def connection_autonomous_system_number
|
|
126
|
+
@data.dig "connection", "autonomous_system_number"
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def connection_autonomous_system_organization
|
|
130
|
+
@data.dig "connection", "autonomous_system_organization"
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def connection_connection_type
|
|
134
|
+
@data.dig "connection", "connection_type"
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def connection_isp_name
|
|
138
|
+
@data.dig "connection", "isp_name"
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def connection_organization_name
|
|
142
|
+
@data.dig "connection", "organization_name"
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
@@ -7,38 +7,34 @@ module Geocoder::Result
|
|
|
7
7
|
['lat', 'lng'].map{ |i| @data['location'][i] }
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
def address
|
|
11
|
-
@data['formatted_address']
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def state
|
|
15
|
-
province
|
|
16
|
-
end
|
|
17
|
-
|
|
18
10
|
def province
|
|
19
|
-
@data['addressComponent']['province']
|
|
11
|
+
@data['addressComponent'] and @data['addressComponent']['province'] or ""
|
|
20
12
|
end
|
|
21
13
|
|
|
14
|
+
alias_method :state, :province
|
|
15
|
+
|
|
22
16
|
def city
|
|
23
|
-
@data['addressComponent']['city']
|
|
17
|
+
@data['addressComponent'] and @data['addressComponent']['city'] or ""
|
|
24
18
|
end
|
|
25
19
|
|
|
26
20
|
def district
|
|
27
|
-
@data['addressComponent']['district']
|
|
21
|
+
@data['addressComponent'] and @data['addressComponent']['district'] or ""
|
|
28
22
|
end
|
|
29
23
|
|
|
30
24
|
def street
|
|
31
|
-
@data['addressComponent']['street']
|
|
25
|
+
@data['addressComponent'] and @data['addressComponent']['street'] or ""
|
|
32
26
|
end
|
|
33
27
|
|
|
34
28
|
def street_number
|
|
35
|
-
@data['addressComponent']['street_number']
|
|
29
|
+
@data['addressComponent'] and @data['addressComponent']['street_number']
|
|
36
30
|
end
|
|
37
31
|
|
|
38
32
|
def formatted_address
|
|
39
|
-
@data['formatted_address']
|
|
33
|
+
@data['formatted_address'] or ""
|
|
40
34
|
end
|
|
41
35
|
|
|
36
|
+
alias_method :address, :formatted_address
|
|
37
|
+
|
|
42
38
|
def address_components
|
|
43
39
|
@data['addressComponent']
|
|
44
40
|
end
|
|
@@ -4,10 +4,31 @@ require 'geocoder/results/base'
|
|
|
4
4
|
module Geocoder::Result
|
|
5
5
|
class BanDataGouvFr < Base
|
|
6
6
|
|
|
7
|
+
STATE_CODE_MAPPINGS = {
|
|
8
|
+
"Guadeloupe" => "01",
|
|
9
|
+
"Martinique" => "02",
|
|
10
|
+
"Guyane" => "03",
|
|
11
|
+
"La Réunion" => "04",
|
|
12
|
+
"Mayotte" => "06",
|
|
13
|
+
"Île-de-France" => "11",
|
|
14
|
+
"Centre-Val de Loire" => "24",
|
|
15
|
+
"Bourgogne-Franche-Comté" => "27",
|
|
16
|
+
"Normandie" => "28",
|
|
17
|
+
"Hauts-de-France" => "32",
|
|
18
|
+
"Grand Est" => "44",
|
|
19
|
+
"Pays de la Loire" => "52",
|
|
20
|
+
"Bretagne" => "53",
|
|
21
|
+
"Nouvelle-Aquitaine" => "75",
|
|
22
|
+
"Occitanie" => "76",
|
|
23
|
+
"Auvergne-Rhône-Alpes" => "84",
|
|
24
|
+
"Provence-Alpes-Côte d'Azur" => "93",
|
|
25
|
+
"Corse" => "94"
|
|
26
|
+
}.freeze
|
|
27
|
+
|
|
7
28
|
#### BASE METHODS ####
|
|
8
29
|
|
|
9
30
|
def self.response_attributes
|
|
10
|
-
%w[limit attribution version licence type features]
|
|
31
|
+
%w[limit attribution version licence type features center]
|
|
11
32
|
end
|
|
12
33
|
|
|
13
34
|
response_attributes.each do |a|
|
|
@@ -209,6 +230,10 @@ module Geocoder::Result
|
|
|
209
230
|
end
|
|
210
231
|
end
|
|
211
232
|
|
|
233
|
+
def region_code
|
|
234
|
+
STATE_CODE_MAPPINGS[region_name]
|
|
235
|
+
end
|
|
236
|
+
|
|
212
237
|
def country
|
|
213
238
|
"France"
|
|
214
239
|
end
|
|
@@ -235,7 +260,7 @@ module Geocoder::Result
|
|
|
235
260
|
alias_method :street, :street_name
|
|
236
261
|
alias_method :city, :city_name
|
|
237
262
|
alias_method :state, :region_name
|
|
238
|
-
alias_method :state_code, :
|
|
263
|
+
alias_method :state_code, :region_code
|
|
239
264
|
|
|
240
265
|
#### CITIES' METHODS ####
|
|
241
266
|
|
|
@@ -20,8 +20,20 @@ module Geocoder
|
|
|
20
20
|
##
|
|
21
21
|
# A string in the given format.
|
|
22
22
|
#
|
|
23
|
+
# This default implementation dumbly follows the United States address
|
|
24
|
+
# format and will return incorrect results for most countries. Some APIs
|
|
25
|
+
# return properly formatted addresses and those should be funneled
|
|
26
|
+
# through this method.
|
|
27
|
+
#
|
|
23
28
|
def address(format = :full)
|
|
24
|
-
|
|
29
|
+
if state_code.to_s != ""
|
|
30
|
+
s = ", #{state_code}"
|
|
31
|
+
elsif state.to_s != ""
|
|
32
|
+
s = ", #{state}"
|
|
33
|
+
else
|
|
34
|
+
s = ""
|
|
35
|
+
end
|
|
36
|
+
"#{city}#{s} #{postal_code}, #{country}".sub(/^[ ,]*/, '')
|
|
25
37
|
end
|
|
26
38
|
|
|
27
39
|
##
|
|
@@ -7,11 +7,6 @@ module Geocoder::Result
|
|
|
7
7
|
['latitude', 'longitude'].map{ |coordinate_name| @data[coordinate_name] }
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
def address(format = :full)
|
|
11
|
-
s = state_code.to_s == "" ? "" : ", #{state_code}"
|
|
12
|
-
"#{city}#{s} #{zip_code}, #{country_name}".sub(/^[ ,]*/, "")
|
|
13
|
-
end
|
|
14
|
-
|
|
15
10
|
def city
|
|
16
11
|
@data['city']
|
|
17
12
|
end
|
|
@@ -21,7 +16,7 @@ module Geocoder::Result
|
|
|
21
16
|
end
|
|
22
17
|
|
|
23
18
|
def state_code
|
|
24
|
-
@data['
|
|
19
|
+
@data['stateProvCode']
|
|
25
20
|
end
|
|
26
21
|
alias_method :state, :state_code
|
|
27
22
|
|
|
@@ -3,11 +3,6 @@ require 'geocoder/results/base'
|
|
|
3
3
|
module Geocoder::Result
|
|
4
4
|
class Freegeoip < Base
|
|
5
5
|
|
|
6
|
-
def address(format = :full)
|
|
7
|
-
s = state_code.to_s == "" ? "" : ", #{state_code}"
|
|
8
|
-
"#{city}#{s} #{postal_code}, #{country}".sub(/^[ ,]*/, "")
|
|
9
|
-
end
|
|
10
|
-
|
|
11
6
|
def city
|
|
12
7
|
@data['city']
|
|
13
8
|
end
|
|
@@ -16,17 +16,17 @@ module Geocoder::Result
|
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def city
|
|
19
|
-
@data['city']
|
|
19
|
+
@data['city'] or (@data['standard'] and @data['standard']['city']) or ""
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
def state
|
|
23
|
-
@data['prov']
|
|
23
|
+
@data['prov'] or (@data['standard'] and @data['standard']['prov']) or ""
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
alias_method :state_code, :state
|
|
27
27
|
|
|
28
28
|
def postal_code
|
|
29
|
-
@data['postal']
|
|
29
|
+
@data['postal'] or (@data['standard'] and @data['standard']['postal']) or ""
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
def country
|
|
@@ -3,10 +3,6 @@ require 'geocoder/results/base'
|
|
|
3
3
|
module Geocoder
|
|
4
4
|
module Result
|
|
5
5
|
class Geoip2 < Base
|
|
6
|
-
def address(format = :full)
|
|
7
|
-
s = state.to_s == '' ? '' : ", #{state_code}"
|
|
8
|
-
"#{city}#{s} #{postal_code}, #{country}".sub(/^[ ,]*/, '')
|
|
9
|
-
end
|
|
10
6
|
|
|
11
7
|
def coordinates
|
|
12
8
|
%w[latitude longitude].map do |l|
|
|
@@ -59,11 +59,13 @@ module Geocoder::Result
|
|
|
59
59
|
private
|
|
60
60
|
|
|
61
61
|
def geolocalized?
|
|
62
|
-
try_to_extract('coordinates', geomlonlat)
|
|
62
|
+
!!try_to_extract('coordinates', geomlonlat)
|
|
63
63
|
end
|
|
64
64
|
|
|
65
|
-
def try_to_extract(key,
|
|
66
|
-
|
|
65
|
+
def try_to_extract(key, hash)
|
|
66
|
+
if hash.is_a?(Hash) and hash.include?(key)
|
|
67
|
+
hash[key]
|
|
68
|
+
end
|
|
67
69
|
end
|
|
68
70
|
end
|
|
69
71
|
end
|
|
@@ -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
|
|
@@ -3,11 +3,6 @@ require 'geocoder/results/base'
|
|
|
3
3
|
module Geocoder::Result
|
|
4
4
|
class IpdataCo < Base
|
|
5
5
|
|
|
6
|
-
def address(format = :full)
|
|
7
|
-
s = state_code.to_s == "" ? "" : ", #{state_code}"
|
|
8
|
-
"#{city}#{s} #{postal_code}, #{country}".sub(/^[ ,]*/, "")
|
|
9
|
-
end
|
|
10
|
-
|
|
11
6
|
def city
|
|
12
7
|
@data['city']
|
|
13
8
|
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'geocoder/results/base'
|
|
2
|
+
|
|
3
|
+
module Geocoder::Result
|
|
4
|
+
class Ipgeolocation < Base
|
|
5
|
+
|
|
6
|
+
def coordinates
|
|
7
|
+
[@data['latitude'].to_f, @data['longitude'].to_f]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def address(format = :full)
|
|
11
|
+
"#{city}, #{state} #{postal_code}, #{country_name}".sub(/^[ ,]*/, "")
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def state
|
|
15
|
+
@data['state_prov']
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def state_code
|
|
19
|
+
@data['state_prov']
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def country
|
|
23
|
+
@data['country_name']
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def country_code
|
|
27
|
+
@data['country_code2']
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def postal_code
|
|
31
|
+
@data['zipcode']
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def self.response_attributes
|
|
35
|
+
[
|
|
36
|
+
['ip', ''],
|
|
37
|
+
['hostname', ''],
|
|
38
|
+
['continent_code', ''],
|
|
39
|
+
['continent_name', ''],
|
|
40
|
+
['country_code2', ''],
|
|
41
|
+
['country_code3', ''],
|
|
42
|
+
['country_name', ''],
|
|
43
|
+
['country_capital',''],
|
|
44
|
+
['district',''],
|
|
45
|
+
['state_prov',''],
|
|
46
|
+
['city', ''],
|
|
47
|
+
['zipcode', ''],
|
|
48
|
+
['time_zone', {}],
|
|
49
|
+
['currency', {}]
|
|
50
|
+
]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
response_attributes.each do |attr, default|
|
|
54
|
+
define_method attr do
|
|
55
|
+
@data[attr] || default
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|