geocoder 1.4.7 → 1.5.2

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 (86) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +31 -0
  3. data/README.md +352 -935
  4. data/examples/autoexpire_cache_redis.rb +3 -3
  5. data/lib/generators/geocoder/config/templates/initializer.rb +2 -2
  6. data/lib/geocoder/cache.rb +1 -1
  7. data/lib/geocoder/calculations.rb +1 -1
  8. data/lib/geocoder/cli.rb +2 -2
  9. data/lib/geocoder/configuration.rb +2 -2
  10. data/lib/geocoder/exceptions.rb +1 -1
  11. data/lib/geocoder/ip_address.rb +14 -1
  12. data/lib/geocoder/lookup.rb +6 -4
  13. data/lib/geocoder/lookups/amap.rb +7 -3
  14. data/lib/geocoder/lookups/baidu.rb +14 -10
  15. data/lib/geocoder/lookups/baidu_ip.rb +7 -36
  16. data/lib/geocoder/lookups/ban_data_gouv_fr.rb +4 -4
  17. data/lib/geocoder/lookups/base.rb +27 -4
  18. data/lib/geocoder/lookups/bing.rb +10 -13
  19. data/lib/geocoder/lookups/db_ip_com.rb +9 -6
  20. data/lib/geocoder/lookups/dstk.rb +4 -2
  21. data/lib/geocoder/lookups/esri.rb +39 -29
  22. data/lib/geocoder/lookups/freegeoip.rb +11 -7
  23. data/lib/geocoder/lookups/geocoder_ca.rb +4 -4
  24. data/lib/geocoder/lookups/geocoder_us.rb +17 -9
  25. data/lib/geocoder/lookups/geocodio.rb +5 -5
  26. data/lib/geocoder/lookups/geoportail_lu.rb +7 -7
  27. data/lib/geocoder/lookups/google.rb +8 -8
  28. data/lib/geocoder/lookups/google_places_details.rb +4 -4
  29. data/lib/geocoder/lookups/google_places_search.rb +4 -4
  30. data/lib/geocoder/lookups/google_premier.rb +10 -0
  31. data/lib/geocoder/lookups/here.rb +30 -15
  32. data/lib/geocoder/lookups/ip2location.rb +75 -0
  33. data/lib/geocoder/lookups/ipapi_com.rb +9 -13
  34. data/lib/geocoder/lookups/ipdata_co.rb +9 -4
  35. data/lib/geocoder/lookups/ipinfo_io.rb +11 -29
  36. data/lib/geocoder/lookups/ipregistry.rb +68 -0
  37. data/lib/geocoder/lookups/ipstack.rb +63 -0
  38. data/lib/geocoder/lookups/latlon.rb +4 -4
  39. data/lib/geocoder/lookups/location_iq.rb +10 -4
  40. data/lib/geocoder/lookups/mapbox.rb +7 -6
  41. data/lib/geocoder/lookups/mapquest.rb +4 -5
  42. data/lib/geocoder/lookups/maxmind.rb +6 -6
  43. data/lib/geocoder/lookups/maxmind_geoip2.rb +8 -7
  44. data/lib/geocoder/lookups/nominatim.rb +4 -4
  45. data/lib/geocoder/lookups/opencagedata.rb +6 -5
  46. data/lib/geocoder/lookups/pelias.rb +8 -9
  47. data/lib/geocoder/lookups/pickpoint.rb +9 -3
  48. data/lib/geocoder/lookups/pointpin.rb +10 -9
  49. data/lib/geocoder/lookups/postcode_anywhere_uk.rb +4 -5
  50. data/lib/geocoder/lookups/postcodes_io.rb +31 -0
  51. data/lib/geocoder/lookups/smarty_streets.rb +20 -10
  52. data/lib/geocoder/lookups/telize.rb +26 -6
  53. data/lib/geocoder/lookups/tencent.rb +59 -0
  54. data/lib/geocoder/lookups/yandex.rb +6 -6
  55. data/lib/geocoder/query.rb +14 -0
  56. data/lib/geocoder/railtie.rb +1 -1
  57. data/lib/geocoder/results/baidu.rb +10 -10
  58. data/lib/geocoder/results/base.rb +13 -1
  59. data/lib/geocoder/results/bing.rb +1 -1
  60. data/lib/geocoder/results/db_ip_com.rb +0 -5
  61. data/lib/geocoder/results/freegeoip.rb +0 -5
  62. data/lib/geocoder/results/geocoder_ca.rb +3 -3
  63. data/lib/geocoder/results/geoip2.rb +2 -6
  64. data/lib/geocoder/results/geoportail_lu.rb +5 -3
  65. data/lib/geocoder/results/here.rb +4 -1
  66. data/lib/geocoder/results/ip2location.rb +22 -0
  67. data/lib/geocoder/results/ipdata_co.rb +0 -5
  68. data/lib/geocoder/results/ipregistry.rb +308 -0
  69. data/lib/geocoder/results/ipstack.rb +60 -0
  70. data/lib/geocoder/results/maxmind.rb +0 -5
  71. data/lib/geocoder/results/maxmind_local.rb +0 -5
  72. data/lib/geocoder/results/postcodes_io.rb +40 -0
  73. data/lib/geocoder/results/smarty_streets.rb +48 -18
  74. data/lib/geocoder/results/telize.rb +0 -5
  75. data/lib/geocoder/results/tencent.rb +72 -0
  76. data/lib/geocoder/results/test.rb +1 -1
  77. data/lib/geocoder/stores/active_record.rb +1 -3
  78. data/lib/geocoder/stores/base.rb +1 -1
  79. data/lib/geocoder/version.rb +1 -1
  80. metadata +14 -10
  81. data/lib/geocoder/lookups/mapzen.rb +0 -15
  82. data/lib/geocoder/lookups/okf.rb +0 -44
  83. data/lib/geocoder/lookups/ovi.rb +0 -62
  84. data/lib/geocoder/results/mapzen.rb +0 -5
  85. data/lib/geocoder/results/okf.rb +0 -106
  86. data/lib/geocoder/results/ovi.rb +0 -71
@@ -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
@@ -87,11 +87,6 @@ module Geocoder::Result
87
87
  [data_hash[:latitude].to_f, data_hash[:longitude].to_f]
88
88
  end
89
89
 
90
- def address(format = :full)
91
- s = state_code.to_s == "" ? "" : ", #{state_code}"
92
- "#{city}#{s} #{postal_code}, #{country_code}".sub(/^[ ,]*/, "")
93
- end
94
-
95
90
  def city
96
91
  data_hash[:city_name]
97
92
  end
@@ -3,11 +3,6 @@ require 'geocoder/results/base'
3
3
  module Geocoder::Result
4
4
  class MaxmindLocal < Base
5
5
 
6
- def address(format = :full)
7
- s = state.to_s == "" ? "" : ", #{state}"
8
- "#{city}#{s} #{postal_code}, #{country}".sub(/^[ ,]*/, "")
9
- end
10
-
11
6
  def coordinates
12
7
  [@data[:latitude], @data[:longitude]]
13
8
  end
@@ -0,0 +1,40 @@
1
+ require 'geocoder/results/base'
2
+
3
+ module Geocoder::Result
4
+ class PostcodesIo < Base
5
+
6
+ def coordinates
7
+ [@data['latitude'].to_f, @data['longitude'].to_f]
8
+ end
9
+
10
+ def quality
11
+ @data['quality']
12
+ end
13
+
14
+ def postal_code
15
+ @data['postcode']
16
+ end
17
+ alias address postal_code
18
+
19
+ def city
20
+ @data['admin_ward']
21
+ end
22
+
23
+ def county
24
+ @data['admin_county']
25
+ end
26
+ alias state county
27
+
28
+ def state_code
29
+ @data['codes']['admin_county']
30
+ end
31
+
32
+ def country
33
+ 'United Kingdom'
34
+ end
35
+
36
+ def country_code
37
+ 'UK'
38
+ end
39
+ end
40
+ end
@@ -15,51 +15,77 @@ module Geocoder::Result
15
15
  end
16
16
 
17
17
  def address
18
- [
19
- delivery_line_1,
20
- delivery_line_2,
21
- last_line
22
- ].select{ |i| i.to_s != "" }.join(" ")
18
+ parts =
19
+ if international_endpoint?
20
+ (1..12).map { |i| @data["address#{i}"] }
21
+ else
22
+ [
23
+ delivery_line_1,
24
+ delivery_line_2,
25
+ last_line
26
+ ]
27
+ end
28
+ parts.select{ |i| i.to_s != "" }.join(" ")
23
29
  end
24
30
 
25
31
  def state
26
- zipcode_endpoint? ?
27
- city_states.first['state'] :
32
+ if international_endpoint?
33
+ components['administrative_area']
34
+ elsif zipcode_endpoint?
35
+ city_states.first['state']
36
+ else
28
37
  components['state_abbreviation']
38
+ end
29
39
  end
30
40
 
31
41
  def state_code
32
- zipcode_endpoint? ?
33
- city_states.first['state_abbreviation'] :
42
+ if international_endpoint?
43
+ components['administrative_area']
44
+ elsif zipcode_endpoint?
45
+ city_states.first['state_abbreviation']
46
+ else
34
47
  components['state_abbreviation']
48
+ end
35
49
  end
36
50
 
37
51
  def country
38
- # SmartyStreets returns results for USA only
39
- "United States"
52
+ international_endpoint? ?
53
+ components['country_iso_3'] :
54
+ "United States"
40
55
  end
41
56
 
42
57
  def country_code
43
- # SmartyStreets returns results for USA only
44
- "US"
58
+ international_endpoint? ?
59
+ components['country_iso_3'] :
60
+ "US"
45
61
  end
46
62
 
47
63
  ## Extra methods not in base.rb ------------------------
48
64
 
49
65
  def street
50
- components['street_name']
66
+ international_endpoint? ?
67
+ components['thoroughfare_name'] :
68
+ components['street_name']
51
69
  end
52
70
 
53
71
  def city
54
- zipcode_endpoint? ?
55
- city_states.first['city'] :
72
+ if international_endpoint?
73
+ components['locality']
74
+ elsif zipcode_endpoint?
75
+ city_states.first['city']
76
+ else
56
77
  components['city_name']
78
+ end
57
79
  end
58
80
 
59
81
  def zipcode
60
- zipcode_endpoint? ?
61
- zipcodes.first['zipcode'] :
82
+ if international_endpoint?
83
+ components['postal_code']
84
+ elsif zipcode_endpoint?
85
+ zipcodes.first['zipcode']
86
+ else
62
87
  components['zipcode']
88
+ end
63
89
  end
64
90
  alias_method :postal_code, :zipcode
65
91
 
@@ -78,6 +104,10 @@ module Geocoder::Result
78
104
  zipcodes.any?
79
105
  end
80
106
 
107
+ def international_endpoint?
108
+ !@data['address1'].nil?
109
+ end
110
+
81
111
  [
82
112
  :delivery_line_1,
83
113
  :delivery_line_2,
@@ -3,11 +3,6 @@ require 'geocoder/results/base'
3
3
  module Geocoder::Result
4
4
  class Telize < 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,72 @@
1
+ require 'geocoder/results/base'
2
+
3
+ module Geocoder::Result
4
+ class Tencent < Base
5
+
6
+ def coordinates
7
+ ['lat', 'lng'].map{ |i| @data['location'][i] }
8
+ end
9
+
10
+ def address
11
+ "#{province}#{city}#{district}#{street}#{street_number}"
12
+
13
+ #@data['title'] or @data['address']
14
+ end
15
+
16
+ # NOTE: The Tencent reverse geocoding API has the field named
17
+ # 'address_component' compared to 'address_components' in the
18
+ # regular geocoding API.
19
+ def province
20
+ @data['address_components'] and (@data['address_components']['province']) or
21
+ (@data['address_component'] and @data['address_component']['province']) or
22
+ ""
23
+ end
24
+
25
+ alias_method :state, :province
26
+
27
+ def city
28
+ @data['address_components'] and (@data['address_components']['city']) or
29
+ (@data['address_component'] and @data['address_component']['city']) or
30
+ ""
31
+ end
32
+
33
+ def district
34
+ @data['address_components'] and (@data['address_components']['district']) or
35
+ (@data['address_component'] and @data['address_component']['district']) or
36
+ ""
37
+ end
38
+
39
+ def street
40
+ @data['address_components'] and (@data['address_components']['street']) or
41
+ (@data['address_component'] and @data['address_component']['street']) or
42
+ ""
43
+ end
44
+
45
+ def street_number
46
+ @data['address_components'] and (@data['address_components']['street_number']) or
47
+ (@data['address_component'] and @data['address_component']['street_number']) or
48
+ ""
49
+ end
50
+
51
+ def address_components
52
+ @data['address_components'] or @data['address_component']
53
+ end
54
+
55
+ def state_code
56
+ ""
57
+ end
58
+
59
+ def postal_code
60
+ ""
61
+ end
62
+
63
+ def country
64
+ "China"
65
+ end
66
+
67
+ def country_code
68
+ "CN"
69
+ end
70
+
71
+ end
72
+ end
@@ -15,7 +15,7 @@ module Geocoder
15
15
  end
16
16
  end
17
17
 
18
- %w[latitude longitude neighborhood city state state_code sub_state
18
+ %w[coordinates neighborhood city state state_code sub_state
19
19
  sub_state_code province province_code postal_code country
20
20
  country_code address street_address street_number route geometry].each do |attr|
21
21
  add_result_attribute(attr)
@@ -60,7 +60,7 @@ module Geocoder::Store
60
60
  # corner followed by the northeast corner of the box
61
61
  # (<tt>[[sw_lat, sw_lon], [ne_lat, ne_lon]]</tt>).
62
62
  #
63
- scope :within_bounding_box, lambda{ |bounds|
63
+ scope :within_bounding_box, lambda{ |*bounds|
64
64
  sw_lat, sw_lng, ne_lat, ne_lng = bounds.flatten if bounds
65
65
  if sw_lat && sw_lng && ne_lat && ne_lng
66
66
  where(Geocoder::Sql.within_bounding_box(
@@ -166,8 +166,6 @@ module Geocoder::Store
166
166
  }
167
167
  end
168
168
 
169
- private # ----------------------------------------------------------------
170
-
171
169
  ##
172
170
  # SQL for calculating distance based on the current database's
173
171
  # capabilities (trig functions?).
@@ -90,7 +90,7 @@ module Geocoder
90
90
  return
91
91
  end
92
92
 
93
- query_options = [:lookup, :ip_lookup, :language].inject({}) do |hash, key|
93
+ query_options = [:lookup, :ip_lookup, :language, :params].inject({}) do |hash, key|
94
94
  if options.has_key?(key)
95
95
  val = options[key]
96
96
  hash[key] = val.respond_to?(:call) ? val.call(self) : val
@@ -1,3 +1,3 @@
1
1
  module Geocoder
2
- VERSION = "1.4.7"
2
+ VERSION = "1.5.2"
3
3
  end
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.4.7
4
+ version: 1.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Reisner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-13 00:00:00.000000000 Z
11
+ date: 2019-10-03 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Provides object geocoding (by street or IP address), reverse geocoding
14
14
  (coordinates to street address), distance queries for ActiveRecord and Mongoid,
@@ -68,27 +68,29 @@ files:
68
68
  - lib/geocoder/lookups/google_places_search.rb
69
69
  - lib/geocoder/lookups/google_premier.rb
70
70
  - lib/geocoder/lookups/here.rb
71
+ - lib/geocoder/lookups/ip2location.rb
71
72
  - lib/geocoder/lookups/ipapi_com.rb
72
73
  - lib/geocoder/lookups/ipdata_co.rb
73
74
  - lib/geocoder/lookups/ipinfo_io.rb
75
+ - lib/geocoder/lookups/ipregistry.rb
76
+ - lib/geocoder/lookups/ipstack.rb
74
77
  - lib/geocoder/lookups/latlon.rb
75
78
  - lib/geocoder/lookups/location_iq.rb
76
79
  - lib/geocoder/lookups/mapbox.rb
77
80
  - lib/geocoder/lookups/mapquest.rb
78
- - lib/geocoder/lookups/mapzen.rb
79
81
  - lib/geocoder/lookups/maxmind.rb
80
82
  - lib/geocoder/lookups/maxmind_geoip2.rb
81
83
  - lib/geocoder/lookups/maxmind_local.rb
82
84
  - lib/geocoder/lookups/nominatim.rb
83
- - lib/geocoder/lookups/okf.rb
84
85
  - lib/geocoder/lookups/opencagedata.rb
85
- - lib/geocoder/lookups/ovi.rb
86
86
  - lib/geocoder/lookups/pelias.rb
87
87
  - lib/geocoder/lookups/pickpoint.rb
88
88
  - lib/geocoder/lookups/pointpin.rb
89
89
  - lib/geocoder/lookups/postcode_anywhere_uk.rb
90
+ - lib/geocoder/lookups/postcodes_io.rb
90
91
  - lib/geocoder/lookups/smarty_streets.rb
91
92
  - lib/geocoder/lookups/telize.rb
93
+ - lib/geocoder/lookups/tencent.rb
92
94
  - lib/geocoder/lookups/test.rb
93
95
  - lib/geocoder/lookups/yandex.rb
94
96
  - lib/geocoder/models/active_record.rb
@@ -119,27 +121,29 @@ files:
119
121
  - lib/geocoder/results/google_places_search.rb
120
122
  - lib/geocoder/results/google_premier.rb
121
123
  - lib/geocoder/results/here.rb
124
+ - lib/geocoder/results/ip2location.rb
122
125
  - lib/geocoder/results/ipapi_com.rb
123
126
  - lib/geocoder/results/ipdata_co.rb
124
127
  - lib/geocoder/results/ipinfo_io.rb
128
+ - lib/geocoder/results/ipregistry.rb
129
+ - lib/geocoder/results/ipstack.rb
125
130
  - lib/geocoder/results/latlon.rb
126
131
  - lib/geocoder/results/location_iq.rb
127
132
  - lib/geocoder/results/mapbox.rb
128
133
  - lib/geocoder/results/mapquest.rb
129
- - lib/geocoder/results/mapzen.rb
130
134
  - lib/geocoder/results/maxmind.rb
131
135
  - lib/geocoder/results/maxmind_geoip2.rb
132
136
  - lib/geocoder/results/maxmind_local.rb
133
137
  - lib/geocoder/results/nominatim.rb
134
- - lib/geocoder/results/okf.rb
135
138
  - lib/geocoder/results/opencagedata.rb
136
- - lib/geocoder/results/ovi.rb
137
139
  - lib/geocoder/results/pelias.rb
138
140
  - lib/geocoder/results/pickpoint.rb
139
141
  - lib/geocoder/results/pointpin.rb
140
142
  - lib/geocoder/results/postcode_anywhere_uk.rb
143
+ - lib/geocoder/results/postcodes_io.rb
141
144
  - lib/geocoder/results/smarty_streets.rb
142
145
  - lib/geocoder/results/telize.rb
146
+ - lib/geocoder/results/tencent.rb
143
147
  - lib/geocoder/results/test.rb
144
148
  - lib/geocoder/results/yandex.rb
145
149
  - lib/geocoder/sql.rb
@@ -167,7 +171,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
167
171
  requirements:
168
172
  - - ">="
169
173
  - !ruby/object:Gem::Version
170
- version: 1.9.3
174
+ version: 2.0.0
171
175
  required_rubygems_version: !ruby/object:Gem::Requirement
172
176
  requirements:
173
177
  - - ">="
@@ -175,7 +179,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
175
179
  version: '0'
176
180
  requirements: []
177
181
  rubyforge_project:
178
- rubygems_version: 2.5.2
182
+ rubygems_version: 2.7.6
179
183
  signing_key:
180
184
  specification_version: 4
181
185
  summary: Complete geocoding solution for Ruby.