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,76 @@
1
+ require 'geocoder/results/base'
2
+
3
+ module Geocoder
4
+ module Result
5
+ class Geoip2 < Base
6
+
7
+ def coordinates
8
+ %w[latitude longitude].map do |l|
9
+ data.fetch('location', {}).fetch(l, 0.0)
10
+ end
11
+ end
12
+
13
+ def city
14
+ fetch_name(
15
+ data.fetch('city', {}).fetch('names', {})
16
+ )
17
+ end
18
+
19
+ def state
20
+ fetch_name(
21
+ data.fetch('subdivisions', []).fetch(0, {}).fetch('names', {})
22
+ )
23
+ end
24
+
25
+ def state_code
26
+ data.fetch('subdivisions', []).fetch(0, {}).fetch('iso_code', '')
27
+ end
28
+
29
+ def country
30
+ fetch_name(
31
+ data.fetch('country', {}).fetch('names', {})
32
+ )
33
+ end
34
+
35
+ def country_code
36
+ data.fetch('country', {}).fetch('iso_code', '')
37
+ end
38
+
39
+ def postal_code
40
+ data.fetch('postal', {}).fetch('code', '')
41
+ end
42
+
43
+ def self.response_attributes
44
+ %w[ip]
45
+ end
46
+
47
+ response_attributes.each do |a|
48
+ define_method a do
49
+ @data[a]
50
+ end
51
+ end
52
+
53
+ def language=(l)
54
+ @language = l.to_s
55
+ end
56
+
57
+ def language
58
+ @language ||= default_language
59
+ end
60
+
61
+ def data
62
+ @data.to_hash
63
+ end
64
+
65
+ private
66
+
67
+ def default_language
68
+ @default_language = Geocoder.config[:language].to_s
69
+ end
70
+
71
+ def fetch_name(names)
72
+ names[language] || names[default_language] || ''
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,71 @@
1
+ require 'geocoder/results/base'
2
+
3
+ module Geocoder::Result
4
+ class GeoportailLu < Base
5
+
6
+ def coordinates
7
+ geomlonlat['coordinates'].reverse if geolocalized?
8
+ end
9
+
10
+ def address
11
+ full_address
12
+ end
13
+
14
+ def city
15
+ try_to_extract 'locality', detailled_address
16
+ end
17
+
18
+ def state
19
+ 'Luxembourg'
20
+ end
21
+
22
+ def state_code
23
+ 'LU'
24
+ end
25
+
26
+ def postal_code
27
+ try_to_extract 'zip', detailled_address
28
+ end
29
+
30
+ def street_address
31
+ [street_number, street].compact.join(' ')
32
+ end
33
+
34
+ def street_number
35
+ try_to_extract 'postnumber', detailled_address
36
+ end
37
+
38
+ def street
39
+ try_to_extract 'street', detailled_address
40
+ end
41
+
42
+ def full_address
43
+ data['address']
44
+ end
45
+
46
+ def geomlonlat
47
+ data['geomlonlat']
48
+ end
49
+
50
+ def detailled_address
51
+ data['AddressDetails']
52
+ end
53
+
54
+ alias_method :country, :state
55
+ alias_method :province, :state
56
+ alias_method :country_code, :state_code
57
+ alias_method :province_code, :state_code
58
+
59
+ private
60
+
61
+ def geolocalized?
62
+ !!try_to_extract('coordinates', geomlonlat)
63
+ end
64
+
65
+ def try_to_extract(key, hash)
66
+ if hash.is_a?(Hash) and hash.include?(key)
67
+ hash[key]
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,150 @@
1
+ require 'geocoder/results/base'
2
+
3
+ module Geocoder::Result
4
+ class Google < Base
5
+
6
+ def coordinates
7
+ ['lat', 'lng'].map{ |i| geometry['location'][i] }
8
+ end
9
+
10
+ def address(format = :full)
11
+ formatted_address
12
+ end
13
+
14
+ def neighborhood
15
+ if neighborhood = address_components_of_type(:neighborhood).first
16
+ neighborhood['long_name']
17
+ end
18
+ end
19
+
20
+ def city
21
+ fields = [:locality, :sublocality,
22
+ :administrative_area_level_3,
23
+ :administrative_area_level_2]
24
+ fields.each do |f|
25
+ if entity = address_components_of_type(f).first
26
+ return entity['long_name']
27
+ end
28
+ end
29
+ return nil # no appropriate components found
30
+ end
31
+
32
+ def state
33
+ if state = address_components_of_type(:administrative_area_level_1).first
34
+ state['long_name']
35
+ end
36
+ end
37
+
38
+ def state_code
39
+ if state = address_components_of_type(:administrative_area_level_1).first
40
+ state['short_name']
41
+ end
42
+ end
43
+
44
+ def sub_state
45
+ if state = address_components_of_type(:administrative_area_level_2).first
46
+ state['long_name']
47
+ end
48
+ end
49
+
50
+ def sub_state_code
51
+ if state = address_components_of_type(:administrative_area_level_2).first
52
+ state['short_name']
53
+ end
54
+ end
55
+
56
+ def country
57
+ if country = address_components_of_type(:country).first
58
+ country['long_name']
59
+ end
60
+ end
61
+
62
+ def country_code
63
+ if country = address_components_of_type(:country).first
64
+ country['short_name']
65
+ end
66
+ end
67
+
68
+ def postal_code
69
+ if postal = address_components_of_type(:postal_code).first
70
+ postal['long_name']
71
+ end
72
+ end
73
+
74
+ def route
75
+ if route = address_components_of_type(:route).first
76
+ route['long_name']
77
+ end
78
+ end
79
+
80
+ def street_number
81
+ if street_number = address_components_of_type(:street_number).first
82
+ street_number['long_name']
83
+ end
84
+ end
85
+
86
+ def street_address
87
+ [street_number, route].compact.join(' ')
88
+ end
89
+
90
+ def types
91
+ @data['types']
92
+ end
93
+
94
+ def formatted_address
95
+ @data['formatted_address']
96
+ end
97
+
98
+ def address_components
99
+ @data['address_components']
100
+ end
101
+
102
+ ##
103
+ # Get address components of a given type. Valid types are defined in
104
+ # Google's Geocoding API documentation and include (among others):
105
+ #
106
+ # :street_number
107
+ # :locality
108
+ # :neighborhood
109
+ # :route
110
+ # :postal_code
111
+ #
112
+ def address_components_of_type(type)
113
+ address_components.select{ |c| c['types'].include?(type.to_s) }
114
+ end
115
+
116
+ def geometry
117
+ @data['geometry']
118
+ end
119
+
120
+ def precision
121
+ geometry['location_type'] if geometry
122
+ end
123
+
124
+ def partial_match
125
+ @data['partial_match']
126
+ end
127
+
128
+ def place_id
129
+ @data['place_id']
130
+ end
131
+
132
+ def viewport
133
+ viewport = geometry['viewport'] || fail
134
+ bounding_box_from viewport
135
+ end
136
+
137
+ def bounds
138
+ bounding_box_from geometry['bounds']
139
+ end
140
+
141
+ private
142
+
143
+ def bounding_box_from(box)
144
+ return nil unless box
145
+ south, west = %w(lat lng).map { |c| box['southwest'][c] }
146
+ north, east = %w(lat lng).map { |c| box['northeast'][c] }
147
+ [south, west, north, east]
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,39 @@
1
+ require "geocoder/results/google"
2
+
3
+ module Geocoder
4
+ module Result
5
+ class GooglePlacesDetails < Google
6
+ def place_id
7
+ @data["place_id"]
8
+ end
9
+
10
+ def types
11
+ @data["types"] || []
12
+ end
13
+
14
+ def reviews
15
+ @data["reviews"] || []
16
+ end
17
+
18
+ def rating
19
+ @data["rating"]
20
+ end
21
+
22
+ def rating_count
23
+ @data["user_ratings_total"]
24
+ end
25
+
26
+ def phone_number
27
+ @data["international_phone_number"]
28
+ end
29
+
30
+ def website
31
+ @data["website"]
32
+ end
33
+
34
+ def photos
35
+ @data["photos"]
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,52 @@
1
+ require "geocoder/results/google"
2
+
3
+ module Geocoder
4
+ module Result
5
+ class GooglePlacesSearch < Google
6
+
7
+ def types
8
+ @data["types"] || []
9
+ end
10
+
11
+ def rating
12
+ @data["rating"]
13
+ end
14
+
15
+ def photos
16
+ @data["photos"]
17
+ end
18
+
19
+ def city
20
+ ""
21
+ end
22
+
23
+ def state
24
+ ""
25
+ end
26
+
27
+ def state_code
28
+ ""
29
+ end
30
+
31
+ def province
32
+ ""
33
+ end
34
+
35
+ def province_code
36
+ ""
37
+ end
38
+
39
+ def postal_code
40
+ ""
41
+ end
42
+
43
+ def country
44
+ ""
45
+ end
46
+
47
+ def country_code
48
+ ""
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,6 @@
1
+ require 'geocoder/results/google'
2
+
3
+ module Geocoder::Result
4
+ class GooglePremier < Google
5
+ end
6
+ end
@@ -0,0 +1,79 @@
1
+ require 'geocoder/results/base'
2
+
3
+ module Geocoder::Result
4
+ class Here < Base
5
+
6
+ ##
7
+ # A string in the given format.
8
+ #
9
+ def address(format = :full)
10
+ address_data['Label']
11
+ end
12
+
13
+ ##
14
+ # A two-element array: [lat, lon].
15
+ #
16
+ def coordinates
17
+ fail unless d = @data['Location']['DisplayPosition']
18
+ [d['Latitude'].to_f, d['Longitude'].to_f]
19
+ end
20
+
21
+ def route
22
+ address_data['Street']
23
+ end
24
+
25
+ def street_number
26
+ address_data['HouseNumber']
27
+ end
28
+
29
+ def state
30
+ address_data['County']
31
+ end
32
+
33
+ def province
34
+ address_data['County']
35
+ end
36
+
37
+ def postal_code
38
+ address_data['PostalCode']
39
+ end
40
+
41
+ def city
42
+ address_data['City']
43
+ end
44
+
45
+ def state_code
46
+ address_data['State']
47
+ end
48
+
49
+ def province_code
50
+ address_data['State']
51
+ end
52
+
53
+ def country
54
+ fail unless d = address_data['AdditionalData']
55
+ if v = d.find{|ad| ad['key']=='CountryName'}
56
+ return v['value']
57
+ end
58
+ end
59
+
60
+ def country_code
61
+ address_data['Country']
62
+ end
63
+
64
+ def viewport
65
+ map_view = data['Location']['MapView'] || fail
66
+ south = map_view['BottomRight']['Latitude']
67
+ west = map_view['TopLeft']['Longitude']
68
+ north = map_view['TopLeft']['Latitude']
69
+ east = map_view['BottomRight']['Longitude']
70
+ [south, west, north, east]
71
+ end
72
+
73
+ private # ----------------------------------------------------------------
74
+
75
+ def address_data
76
+ @data['Location']['Address'] || fail
77
+ end
78
+ end
79
+ end