geocoder 1.2.6 → 1.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +189 -1
- data/LICENSE +1 -1
- data/README.md +387 -755
- data/examples/autoexpire_cache_redis.rb +5 -3
- data/examples/reverse_geocode_job.rb +40 -0
- data/lib/generators/geocoder/config/templates/initializer.rb +17 -16
- data/lib/generators/geocoder/maxmind/geolite_city_generator.rb +2 -0
- data/lib/generators/geocoder/maxmind/geolite_country_generator.rb +2 -0
- data/lib/generators/geocoder/maxmind/templates/migration/geolite_city.rb +1 -1
- data/lib/generators/geocoder/maxmind/templates/migration/geolite_country.rb +1 -1
- data/lib/generators/geocoder/migration_version.rb +15 -0
- data/lib/geocoder/cache.rb +6 -2
- data/lib/geocoder/calculations.rb +30 -38
- data/lib/geocoder/cli.rb +2 -2
- data/lib/geocoder/configuration.rb +18 -5
- data/lib/geocoder/esri_token.rb +38 -0
- data/lib/geocoder/exceptions.rb +19 -0
- data/lib/geocoder/ip_address.rb +16 -11
- data/lib/geocoder/kernel_logger.rb +25 -0
- data/lib/geocoder/logger.rb +47 -0
- data/lib/geocoder/lookup.rb +31 -12
- data/lib/geocoder/lookups/amap.rb +63 -0
- data/lib/geocoder/lookups/baidu.rb +17 -9
- data/lib/geocoder/lookups/baidu_ip.rb +7 -31
- data/lib/geocoder/lookups/ban_data_gouv_fr.rb +143 -0
- data/lib/geocoder/lookups/base.rb +73 -25
- data/lib/geocoder/lookups/bing.rb +38 -15
- data/lib/geocoder/lookups/db_ip_com.rb +52 -0
- data/lib/geocoder/lookups/dstk.rb +4 -2
- data/lib/geocoder/lookups/esri.rb +55 -8
- data/lib/geocoder/lookups/freegeoip.rb +18 -5
- data/lib/geocoder/lookups/geocoder_ca.rb +5 -6
- data/lib/geocoder/lookups/geocodio.rb +8 -8
- data/lib/geocoder/lookups/geoip2.rb +10 -5
- data/lib/geocoder/lookups/geoportail_lu.rb +65 -0
- data/lib/geocoder/lookups/google.rb +37 -9
- data/lib/geocoder/lookups/google_places_details.rb +9 -9
- data/lib/geocoder/lookups/google_places_search.rb +33 -0
- data/lib/geocoder/lookups/google_premier.rb +11 -1
- data/lib/geocoder/lookups/here.rb +29 -23
- data/lib/geocoder/lookups/ip2location.rb +67 -0
- data/lib/geocoder/lookups/ipapi_com.rb +82 -0
- data/lib/geocoder/lookups/ipdata_co.rb +62 -0
- data/lib/geocoder/lookups/ipgeolocation.rb +51 -0
- data/lib/geocoder/lookups/ipinfo_io.rb +44 -0
- data/lib/geocoder/lookups/ipregistry.rb +68 -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 +7 -9
- data/lib/geocoder/lookups/maxmind.rb +7 -7
- data/lib/geocoder/lookups/maxmind_geoip2.rb +70 -0
- data/lib/geocoder/lookups/maxmind_local.rb +9 -2
- data/lib/geocoder/lookups/nominatim.rb +18 -6
- data/lib/geocoder/lookups/opencagedata.rb +16 -9
- data/lib/geocoder/lookups/osmnames.rb +57 -0
- data/lib/geocoder/lookups/pelias.rb +63 -0
- data/lib/geocoder/lookups/pickpoint.rb +41 -0
- data/lib/geocoder/lookups/pointpin.rb +14 -13
- data/lib/geocoder/lookups/postcode_anywhere_uk.rb +7 -8
- data/lib/geocoder/lookups/postcodes_io.rb +31 -0
- data/lib/geocoder/lookups/smarty_streets.rb +23 -5
- data/lib/geocoder/lookups/telize.rb +42 -7
- data/lib/geocoder/lookups/tencent.rb +59 -0
- data/lib/geocoder/lookups/yandex.rb +17 -9
- data/lib/geocoder/models/active_record.rb +4 -3
- data/lib/geocoder/models/mongo_base.rb +0 -2
- data/lib/geocoder/query.rb +15 -1
- data/lib/geocoder/railtie.rb +1 -1
- data/lib/geocoder/request.rb +103 -14
- data/lib/geocoder/results/amap.rb +87 -0
- data/lib/geocoder/results/baidu.rb +10 -14
- data/lib/geocoder/results/ban_data_gouv_fr.rb +257 -0
- data/lib/geocoder/results/base.rb +13 -1
- data/lib/geocoder/results/bing.rb +5 -1
- data/lib/geocoder/results/db_ip_com.rb +58 -0
- data/lib/geocoder/results/esri.rb +30 -6
- data/lib/geocoder/results/freegeoip.rb +2 -7
- data/lib/geocoder/results/geocoder_ca.rb +3 -3
- data/lib/geocoder/results/geocodio.rb +15 -3
- data/lib/geocoder/results/geoip2.rb +37 -25
- data/lib/geocoder/results/geoportail_lu.rb +71 -0
- data/lib/geocoder/results/google.rb +26 -0
- data/lib/geocoder/results/google_places_details.rb +4 -0
- data/lib/geocoder/results/google_places_search.rb +52 -0
- data/lib/geocoder/results/here.rb +21 -1
- 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/ipgeolocation.rb +59 -0
- data/lib/geocoder/results/ipinfo_io.rb +48 -0
- data/lib/geocoder/results/ipregistry.rb +308 -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 +5 -8
- data/lib/geocoder/results/maxmind.rb +0 -5
- data/lib/geocoder/results/maxmind_geoip2.rb +9 -0
- data/lib/geocoder/results/maxmind_local.rb +0 -5
- data/lib/geocoder/results/nominatim.rb +18 -3
- data/lib/geocoder/results/opencagedata.rb +20 -2
- data/lib/geocoder/results/osmnames.rb +56 -0
- data/lib/geocoder/results/pelias.rb +58 -0
- data/lib/geocoder/results/pickpoint.rb +6 -0
- data/lib/geocoder/results/pointpin.rb +0 -4
- data/lib/geocoder/results/postcodes_io.rb +40 -0
- data/lib/geocoder/results/smarty_streets.rb +55 -19
- 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/yandex.rb +57 -7
- data/lib/geocoder/sql.rb +9 -6
- data/lib/geocoder/stores/active_record.rb +49 -10
- data/lib/geocoder/stores/base.rb +2 -14
- data/lib/geocoder/stores/mongo_base.rb +0 -31
- data/lib/geocoder/version.rb +1 -1
- data/lib/geocoder.rb +2 -1
- data/lib/hash_recursive_merge.rb +1 -2
- data/lib/maxmind_database.rb +4 -4
- data/lib/tasks/geocoder.rake +29 -4
- metadata +56 -159
- data/.gitignore +0 -6
- data/.travis.yml +0 -31
- data/Rakefile +0 -25
- data/gemfiles/Gemfile.mongoid-2.4.x +0 -16
- data/lib/geocoder/lookups/geocoder_us.rb +0 -39
- data/lib/geocoder/lookups/okf.rb +0 -43
- data/lib/geocoder/lookups/ovi.rb +0 -62
- data/lib/geocoder/lookups/yahoo.rb +0 -88
- data/lib/geocoder/results/geocoder_us.rb +0 -39
- data/lib/geocoder/results/okf.rb +0 -106
- data/lib/geocoder/results/ovi.rb +0 -62
- data/lib/geocoder/results/yahoo.rb +0 -55
- data/lib/oauth_util.rb +0 -112
- data/test/fixtures/baidu_invalid_key +0 -1
- data/test/fixtures/baidu_ip_202_198_16_3 +0 -19
- data/test/fixtures/baidu_ip_invalid_key +0 -1
- data/test/fixtures/baidu_ip_no_results +0 -1
- data/test/fixtures/baidu_no_results +0 -1
- data/test/fixtures/baidu_reverse +0 -1
- data/test/fixtures/baidu_shanghai_pearl_tower +0 -12
- data/test/fixtures/bing_invalid_key +0 -1
- data/test/fixtures/bing_madison_square_garden +0 -40
- data/test/fixtures/bing_no_results +0 -16
- data/test/fixtures/bing_reverse +0 -42
- data/test/fixtures/cloudmade_invalid_key +0 -1
- data/test/fixtures/cloudmade_madison_square_garden +0 -1
- data/test/fixtures/cloudmade_no_results +0 -1
- data/test/fixtures/esri_madison_square_garden +0 -59
- data/test/fixtures/esri_no_results +0 -8
- data/test/fixtures/esri_reverse +0 -21
- data/test/fixtures/freegeoip_74_200_247_59 +0 -12
- data/test/fixtures/freegeoip_no_results +0 -1
- data/test/fixtures/geocoder_ca_madison_square_garden +0 -1
- data/test/fixtures/geocoder_ca_no_results +0 -1
- data/test/fixtures/geocoder_ca_reverse +0 -34
- data/test/fixtures/geocoder_us_madison_square_garden +0 -1
- data/test/fixtures/geocoder_us_no_results +0 -1
- data/test/fixtures/geocodio_1101_pennsylvania_ave +0 -1
- data/test/fixtures/geocodio_bad_api_key +0 -3
- data/test/fixtures/geocodio_invalid +0 -4
- data/test/fixtures/geocodio_no_results +0 -1
- data/test/fixtures/geocodio_over_query_limit +0 -4
- data/test/fixtures/google_garbage +0 -456
- data/test/fixtures/google_madison_square_garden +0 -57
- data/test/fixtures/google_no_city_data +0 -44
- data/test/fixtures/google_no_locality +0 -51
- data/test/fixtures/google_no_results +0 -4
- data/test/fixtures/google_over_limit +0 -4
- data/test/fixtures/google_places_details_invalid_request +0 -4
- data/test/fixtures/google_places_details_madison_square_garden +0 -120
- data/test/fixtures/google_places_details_no_results +0 -4
- data/test/fixtures/google_places_details_no_reviews +0 -60
- data/test/fixtures/google_places_details_no_types +0 -66
- data/test/fixtures/here_madison_square_garden +0 -72
- data/test/fixtures/here_no_results +0 -8
- data/test/fixtures/mapquest_error +0 -16
- data/test/fixtures/mapquest_invalid_api_key +0 -16
- data/test/fixtures/mapquest_invalid_request +0 -16
- data/test/fixtures/mapquest_madison_square_garden +0 -52
- data/test/fixtures/mapquest_no_results +0 -16
- data/test/fixtures/maxmind_24_24_24_21 +0 -1
- data/test/fixtures/maxmind_24_24_24_22 +0 -1
- data/test/fixtures/maxmind_24_24_24_23 +0 -1
- data/test/fixtures/maxmind_24_24_24_24 +0 -1
- data/test/fixtures/maxmind_74_200_247_59 +0 -1
- data/test/fixtures/maxmind_invalid_key +0 -1
- data/test/fixtures/maxmind_no_results +0 -1
- data/test/fixtures/nominatim_madison_square_garden +0 -150
- data/test/fixtures/nominatim_no_results +0 -1
- data/test/fixtures/nominatim_over_limit +0 -1
- data/test/fixtures/okf_kirstinmaki +0 -67
- data/test/fixtures/okf_no_results +0 -4
- data/test/fixtures/opencagedata_invalid_api_key +0 -25
- data/test/fixtures/opencagedata_invalid_request +0 -26
- data/test/fixtures/opencagedata_madison_square_garden +0 -73
- data/test/fixtures/opencagedata_no_results +0 -29
- data/test/fixtures/opencagedata_over_limit +0 -31
- data/test/fixtures/ovi_madison_square_garden +0 -72
- data/test/fixtures/ovi_no_results +0 -8
- data/test/fixtures/pointpin_10_10_10_10 +0 -1
- data/test/fixtures/pointpin_555_555_555_555 +0 -1
- data/test/fixtures/pointpin_80_111_555_555 +0 -1
- data/test/fixtures/pointpin_no_results +0 -1
- data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_WR26NJ +0 -1
- data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_generic_error +0 -1
- data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_hampshire +0 -1
- data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_key_limit_exceeded +0 -1
- data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_no_results +0 -1
- data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_romsey +0 -1
- data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_unknown_key +0 -1
- data/test/fixtures/smarty_streets_11211 +0 -1
- data/test/fixtures/smarty_streets_madison_square_garden +0 -47
- data/test/fixtures/smarty_streets_no_results +0 -1
- data/test/fixtures/telize_10_10_10_10 +0 -1
- data/test/fixtures/telize_555_555_555_555 +0 -4
- data/test/fixtures/telize_74_200_247_59 +0 -1
- data/test/fixtures/telize_no_results +0 -1
- data/test/fixtures/yahoo_error +0 -1
- data/test/fixtures/yahoo_invalid_key +0 -2
- data/test/fixtures/yahoo_madison_square_garden +0 -52
- data/test/fixtures/yahoo_no_results +0 -10
- data/test/fixtures/yahoo_over_limit +0 -2
- data/test/fixtures/yandex_canada_rue_dupuis_14 +0 -446
- data/test/fixtures/yandex_invalid_key +0 -1
- data/test/fixtures/yandex_kremlin +0 -48
- data/test/fixtures/yandex_new_york +0 -1
- data/test/fixtures/yandex_no_city_and_town +0 -112
- data/test/fixtures/yandex_no_results +0 -16
- data/test/integration/http_client_test.rb +0 -31
- data/test/mongoid_test_helper.rb +0 -43
- data/test/test_helper.rb +0 -416
- data/test/unit/active_record_test.rb +0 -16
- data/test/unit/cache_test.rb +0 -37
- data/test/unit/calculations_test.rb +0 -220
- data/test/unit/configuration_test.rb +0 -55
- data/test/unit/error_handling_test.rb +0 -56
- data/test/unit/geocoder_test.rb +0 -78
- data/test/unit/https_test.rb +0 -17
- data/test/unit/ip_address_test.rb +0 -27
- data/test/unit/lookup_test.rb +0 -153
- data/test/unit/lookups/bing_test.rb +0 -68
- data/test/unit/lookups/dstk_test.rb +0 -26
- data/test/unit/lookups/esri_test.rb +0 -48
- data/test/unit/lookups/freegeoip_test.rb +0 -27
- data/test/unit/lookups/geocoder_ca_test.rb +0 -17
- data/test/unit/lookups/geocodio_test.rb +0 -55
- data/test/unit/lookups/geoip2_test.rb +0 -27
- data/test/unit/lookups/google_places_details_test.rb +0 -122
- data/test/unit/lookups/google_premier_test.rb +0 -22
- data/test/unit/lookups/google_test.rb +0 -84
- data/test/unit/lookups/mapquest_test.rb +0 -60
- data/test/unit/lookups/maxmind_local_test.rb +0 -28
- data/test/unit/lookups/maxmind_test.rb +0 -63
- data/test/unit/lookups/nominatim_test.rb +0 -31
- data/test/unit/lookups/okf_test.rb +0 -38
- data/test/unit/lookups/opencagedata_test.rb +0 -64
- data/test/unit/lookups/pointpin_test.rb +0 -30
- data/test/unit/lookups/postcode_anywhere_uk_test.rb +0 -70
- data/test/unit/lookups/smarty_streets_test.rb +0 -71
- data/test/unit/lookups/telize_test.rb +0 -36
- data/test/unit/lookups/yahoo_test.rb +0 -35
- data/test/unit/method_aliases_test.rb +0 -26
- data/test/unit/model_test.rb +0 -38
- data/test/unit/mongoid_test.rb +0 -47
- data/test/unit/near_test.rb +0 -87
- data/test/unit/oauth_util_test.rb +0 -31
- data/test/unit/proxy_test.rb +0 -37
- data/test/unit/query_test.rb +0 -52
- data/test/unit/rake_task_test.rb +0 -21
- data/test/unit/request_test.rb +0 -35
- data/test/unit/result_test.rb +0 -72
- data/test/unit/test_mode_test.rb +0 -70
@@ -1,112 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"response":{
|
3
|
-
"GeoObjectCollection":{
|
4
|
-
"metaDataProperty":{
|
5
|
-
"GeocoderResponseMetaData":{
|
6
|
-
"request":"57.423359,55.892596",
|
7
|
-
"found":"3",
|
8
|
-
"results":"10",
|
9
|
-
"Point":{
|
10
|
-
"pos":"57.423359 55.892596"
|
11
|
-
}
|
12
|
-
}
|
13
|
-
},
|
14
|
-
"featureMember":[
|
15
|
-
{
|
16
|
-
"GeoObject":{
|
17
|
-
"metaDataProperty":{
|
18
|
-
"GeocoderMetaData":{
|
19
|
-
"kind":"area",
|
20
|
-
"text":"Россия, республика Башкортостан, Караидельский район",
|
21
|
-
"precision":"other",
|
22
|
-
"AddressDetails":{
|
23
|
-
"Country":{
|
24
|
-
"AddressLine":"республика Башкортостан, Караидельский район",
|
25
|
-
"CountryNameCode":"RU",
|
26
|
-
"CountryName":"Россия",
|
27
|
-
"AdministrativeArea":{
|
28
|
-
"AdministrativeAreaName":"республика Башкортостан",
|
29
|
-
"SubAdministrativeArea":{
|
30
|
-
"SubAdministrativeAreaName":"Караидельский район"
|
31
|
-
}
|
32
|
-
}
|
33
|
-
}
|
34
|
-
}
|
35
|
-
}
|
36
|
-
},
|
37
|
-
"description":"республика Башкортостан, Россия",
|
38
|
-
"name":"Караидельский район",
|
39
|
-
"boundedBy":{
|
40
|
-
"Envelope":{
|
41
|
-
"lowerCorner":"56.231384 55.462814",
|
42
|
-
"upperCorner":"57.705348 56.076117"
|
43
|
-
}
|
44
|
-
},
|
45
|
-
"Point":{
|
46
|
-
"pos":"57.423359 55.892596"
|
47
|
-
}
|
48
|
-
}
|
49
|
-
},
|
50
|
-
{
|
51
|
-
"GeoObject":{
|
52
|
-
"metaDataProperty":{
|
53
|
-
"GeocoderMetaData":{
|
54
|
-
"kind":"province",
|
55
|
-
"text":"Россия, республика Башкортостан",
|
56
|
-
"precision":"other",
|
57
|
-
"AddressDetails":{
|
58
|
-
"Country":{
|
59
|
-
"AddressLine":"республика Башкортостан",
|
60
|
-
"CountryNameCode":"RU",
|
61
|
-
"CountryName":"Россия",
|
62
|
-
"AdministrativeArea":{
|
63
|
-
"AdministrativeAreaName":"республика Башкортостан"
|
64
|
-
}
|
65
|
-
}
|
66
|
-
}
|
67
|
-
}
|
68
|
-
},
|
69
|
-
"description":"Россия",
|
70
|
-
"name":"республика Башкортостан",
|
71
|
-
"boundedBy":{
|
72
|
-
"Envelope":{
|
73
|
-
"lowerCorner":"53.157475 51.571991",
|
74
|
-
"upperCorner":"60.001577 56.533651"
|
75
|
-
}
|
76
|
-
},
|
77
|
-
"Point":{
|
78
|
-
"pos":"56.579526 54.127354"
|
79
|
-
}
|
80
|
-
}
|
81
|
-
},
|
82
|
-
{
|
83
|
-
"GeoObject":{
|
84
|
-
"metaDataProperty":{
|
85
|
-
"GeocoderMetaData":{
|
86
|
-
"kind":"country",
|
87
|
-
"text":"Россия",
|
88
|
-
"precision":"other",
|
89
|
-
"AddressDetails":{
|
90
|
-
"Country":{
|
91
|
-
"CountryNameCode":"RU",
|
92
|
-
"CountryName":"Россия"
|
93
|
-
}
|
94
|
-
}
|
95
|
-
}
|
96
|
-
},
|
97
|
-
"name":"Россия",
|
98
|
-
"boundedBy":{
|
99
|
-
"Envelope":{
|
100
|
-
"lowerCorner":"19.641673 36.84312",
|
101
|
-
"upperCorner":"179.999997 81.848739"
|
102
|
-
}
|
103
|
-
},
|
104
|
-
"Point":{
|
105
|
-
"pos":"37.617761 55.755773"
|
106
|
-
}
|
107
|
-
}
|
108
|
-
}
|
109
|
-
]
|
110
|
-
}
|
111
|
-
}
|
112
|
-
}
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
$: << File.join(File.dirname(__FILE__), "..", "..", "lib")
|
3
|
-
require 'pathname'
|
4
|
-
require 'rubygems'
|
5
|
-
require 'test/unit'
|
6
|
-
require 'geocoder'
|
7
|
-
require 'yaml'
|
8
|
-
|
9
|
-
class HttpClientTest < Test::Unit::TestCase
|
10
|
-
def setup
|
11
|
-
@api_keys = YAML.load_file("api_keys.yml")
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_http_basic_auth
|
15
|
-
Geocoder.configure(lookup: :geocoder_us, api_key: @api_keys["geocoder_us"])
|
16
|
-
results = Geocoder.search "27701"
|
17
|
-
assert_not_nil results.first
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_ssl
|
21
|
-
Geocoder.configure(lookup: :esri, use_https: true)
|
22
|
-
results = Geocoder.search "27701"
|
23
|
-
assert_not_nil results.first
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_ssl_opt_out
|
27
|
-
Geocoder.configure(ip_lookup: :telize, use_https: true)
|
28
|
-
results = Geocoder.search "74.200.247.59"
|
29
|
-
assert_not_nil results.first
|
30
|
-
end
|
31
|
-
end
|
data/test/mongoid_test_helper.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'test/unit'
|
3
|
-
require 'test_helper'
|
4
|
-
require 'mongoid'
|
5
|
-
require 'geocoder/models/mongoid'
|
6
|
-
|
7
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
8
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
9
|
-
|
10
|
-
if (::Mongoid::VERSION >= "3")
|
11
|
-
Mongoid.logger = Logger.new($stderr, :debug)
|
12
|
-
else
|
13
|
-
Mongoid.configure do |config|
|
14
|
-
config.logger = Logger.new($stderr, :debug)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
##
|
19
|
-
# Geocoded model.
|
20
|
-
#
|
21
|
-
class PlaceUsingMongoid
|
22
|
-
include Mongoid::Document
|
23
|
-
include Geocoder::Model::Mongoid
|
24
|
-
|
25
|
-
geocoded_by :address, :coordinates => :location
|
26
|
-
field :name
|
27
|
-
field :address
|
28
|
-
field :location, :type => Array
|
29
|
-
|
30
|
-
def initialize(name, address)
|
31
|
-
super()
|
32
|
-
write_attribute :name, name
|
33
|
-
write_attribute :address, address
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
class PlaceUsingMongoidWithoutIndex
|
38
|
-
include Mongoid::Document
|
39
|
-
include Geocoder::Model::Mongoid
|
40
|
-
|
41
|
-
field :location, :type => Array
|
42
|
-
geocoded_by :location, :skip_index => true
|
43
|
-
end
|
data/test/test_helper.rb
DELETED
@@ -1,416 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'test/unit'
|
3
|
-
|
4
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
5
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
6
|
-
|
7
|
-
class MysqlConnection
|
8
|
-
def adapter_name
|
9
|
-
"mysql"
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
##
|
14
|
-
# Simulate enough of ActiveRecord::Base that objects can be used for testing.
|
15
|
-
#
|
16
|
-
module ActiveRecord
|
17
|
-
class Base
|
18
|
-
|
19
|
-
def initialize
|
20
|
-
@attributes = {}
|
21
|
-
end
|
22
|
-
|
23
|
-
def read_attribute(attr_name)
|
24
|
-
@attributes[attr_name.to_sym]
|
25
|
-
end
|
26
|
-
|
27
|
-
def write_attribute(attr_name, value)
|
28
|
-
@attributes[attr_name.to_sym] = value
|
29
|
-
end
|
30
|
-
|
31
|
-
def update_attribute(attr_name, value)
|
32
|
-
write_attribute(attr_name.to_sym, value)
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.scope(*args); end
|
36
|
-
|
37
|
-
def self.connection
|
38
|
-
MysqlConnection.new
|
39
|
-
end
|
40
|
-
|
41
|
-
def method_missing(name, *args, &block)
|
42
|
-
if name.to_s[-1..-1] == "="
|
43
|
-
write_attribute name.to_s[0...-1], *args
|
44
|
-
else
|
45
|
-
read_attribute name
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
class << self
|
50
|
-
def table_name
|
51
|
-
'test_table_name'
|
52
|
-
end
|
53
|
-
|
54
|
-
def primary_key
|
55
|
-
:id
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
# simulate Rails module so Railtie gets loaded
|
63
|
-
module Rails
|
64
|
-
end
|
65
|
-
|
66
|
-
# Require Geocoder after ActiveRecord simulator.
|
67
|
-
require 'geocoder'
|
68
|
-
require "geocoder/lookups/base"
|
69
|
-
|
70
|
-
##
|
71
|
-
# Mock HTTP request to geocoding service.
|
72
|
-
#
|
73
|
-
module Geocoder
|
74
|
-
module Lookup
|
75
|
-
class Base
|
76
|
-
private
|
77
|
-
def fixture_exists?(filename)
|
78
|
-
File.exist?(File.join("test", "fixtures", filename))
|
79
|
-
end
|
80
|
-
|
81
|
-
def read_fixture(file)
|
82
|
-
filepath = File.join("test", "fixtures", file)
|
83
|
-
s = File.read(filepath).strip.gsub(/\n\s*/, "")
|
84
|
-
s.instance_eval do
|
85
|
-
def body; self; end
|
86
|
-
def code; "200"; end
|
87
|
-
end
|
88
|
-
s
|
89
|
-
end
|
90
|
-
|
91
|
-
##
|
92
|
-
# Fixture to use if none match the given query.
|
93
|
-
#
|
94
|
-
def default_fixture_filename
|
95
|
-
"#{fixture_prefix}_madison_square_garden"
|
96
|
-
end
|
97
|
-
|
98
|
-
def fixture_prefix
|
99
|
-
handle
|
100
|
-
end
|
101
|
-
|
102
|
-
def fixture_for_query(query)
|
103
|
-
label = query.reverse_geocode? ? "reverse" : query.text.gsub(/[ \.]/, "_")
|
104
|
-
filename = "#{fixture_prefix}_#{label}"
|
105
|
-
fixture_exists?(filename) ? filename : default_fixture_filename
|
106
|
-
end
|
107
|
-
|
108
|
-
remove_method(:make_api_request)
|
109
|
-
|
110
|
-
def make_api_request(query)
|
111
|
-
raise TimeoutError if query.text == "timeout"
|
112
|
-
raise SocketError if query.text == "socket_error"
|
113
|
-
raise Errno::ECONNREFUSED if query.text == "connection_refused"
|
114
|
-
read_fixture fixture_for_query(query)
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
class GooglePremier
|
119
|
-
private
|
120
|
-
def fixture_prefix
|
121
|
-
"google"
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
class GooglePlacesDetails
|
126
|
-
private
|
127
|
-
def fixture_prefix
|
128
|
-
"google_places_details"
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
class Dstk
|
133
|
-
private
|
134
|
-
def fixture_prefix
|
135
|
-
"google"
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
class Yandex
|
140
|
-
private
|
141
|
-
def default_fixture_filename
|
142
|
-
"yandex_kremlin"
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
class Freegeoip
|
147
|
-
private
|
148
|
-
def default_fixture_filename
|
149
|
-
"freegeoip_74_200_247_59"
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
class Geoip2
|
154
|
-
private
|
155
|
-
|
156
|
-
remove_method(:results)
|
157
|
-
|
158
|
-
def results(query)
|
159
|
-
return [] if query.to_s == 'no results'
|
160
|
-
return [] if query.to_s == '127.0.0.1'
|
161
|
-
[{'city'=>{'names'=>{'en'=>'Mountain View'}},'country'=>{'iso_code'=>'US','names'=>
|
162
|
-
{'en'=>'United States'}},'location'=>{'latitude'=>37.41919999999999,
|
163
|
-
'longitude'=>-122.0574},'postal'=>{'code'=>'94043'},'subdivisions'=>[{
|
164
|
-
'iso_code'=>'CA','names'=>{'en'=>'California'}}]}]
|
165
|
-
end
|
166
|
-
|
167
|
-
def default_fixture_filename
|
168
|
-
'geoip2_74_200_247_59'
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
class Telize
|
173
|
-
private
|
174
|
-
def default_fixture_filename
|
175
|
-
"telize_74_200_247_59"
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
class Pointpin
|
180
|
-
private
|
181
|
-
def default_fixture_filename
|
182
|
-
"pointpin_80_111_555_555"
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
class Maxmind
|
187
|
-
private
|
188
|
-
def default_fixture_filename
|
189
|
-
"maxmind_74_200_247_59"
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
class MaxmindLocal
|
194
|
-
private
|
195
|
-
|
196
|
-
remove_method(:results)
|
197
|
-
|
198
|
-
def results query
|
199
|
-
return [] if query.to_s == "no results"
|
200
|
-
|
201
|
-
if query.to_s == '127.0.0.1'
|
202
|
-
[]
|
203
|
-
else
|
204
|
-
[{:request=>"8.8.8.8", :ip=>"8.8.8.8", :country_code2=>"US", :country_code3=>"USA", :country_name=>"United States", :continent_code=>"NA", :region_name=>"CA", :city_name=>"Mountain View", :postal_code=>"94043", :latitude=>37.41919999999999, :longitude=>-122.0574, :dma_code=>807, :area_code=>650, :timezone=>"America/Los_Angeles"}]
|
205
|
-
end
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
class Baidu
|
210
|
-
private
|
211
|
-
def default_fixture_filename
|
212
|
-
"baidu_shanghai_pearl_tower"
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
class BaiduIp
|
217
|
-
private
|
218
|
-
def default_fixture_filename
|
219
|
-
"baidu_ip_202_198_16_3"
|
220
|
-
end
|
221
|
-
end
|
222
|
-
|
223
|
-
class Geocodio
|
224
|
-
private
|
225
|
-
def default_fixture_filename
|
226
|
-
"geocodio_1101_pennsylvania_ave"
|
227
|
-
end
|
228
|
-
end
|
229
|
-
|
230
|
-
class Okf
|
231
|
-
private
|
232
|
-
def default_fixture_filename
|
233
|
-
"okf_kirstinmaki"
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
class PostcodeAnywhereUk
|
238
|
-
private
|
239
|
-
def fixture_prefix
|
240
|
-
'postcode_anywhere_uk_geocode_v2_00'
|
241
|
-
end
|
242
|
-
|
243
|
-
def default_fixture_filename
|
244
|
-
"#{fixture_prefix}_romsey"
|
245
|
-
end
|
246
|
-
end
|
247
|
-
end
|
248
|
-
end
|
249
|
-
|
250
|
-
##
|
251
|
-
# Geocoded model.
|
252
|
-
#
|
253
|
-
class Place < ActiveRecord::Base
|
254
|
-
geocoded_by :address
|
255
|
-
|
256
|
-
def initialize(name, address)
|
257
|
-
super()
|
258
|
-
write_attribute :name, name
|
259
|
-
write_attribute :address, address
|
260
|
-
end
|
261
|
-
end
|
262
|
-
|
263
|
-
##
|
264
|
-
# Geocoded model.
|
265
|
-
# - Has user-defined primary key (not just 'id')
|
266
|
-
#
|
267
|
-
class PlaceWithCustomPrimaryKey < Place
|
268
|
-
|
269
|
-
class << self
|
270
|
-
def primary_key
|
271
|
-
:custom_primary_key_id
|
272
|
-
end
|
273
|
-
end
|
274
|
-
|
275
|
-
end
|
276
|
-
|
277
|
-
class PlaceReverseGeocoded < ActiveRecord::Base
|
278
|
-
reverse_geocoded_by :latitude, :longitude
|
279
|
-
|
280
|
-
def initialize(name, latitude, longitude)
|
281
|
-
super()
|
282
|
-
write_attribute :name, name
|
283
|
-
write_attribute :latitude, latitude
|
284
|
-
write_attribute :longitude, longitude
|
285
|
-
end
|
286
|
-
end
|
287
|
-
|
288
|
-
class PlaceWithCustomResultsHandling < ActiveRecord::Base
|
289
|
-
geocoded_by :address do |obj,results|
|
290
|
-
if result = results.first
|
291
|
-
obj.coords_string = "#{result.latitude},#{result.longitude}"
|
292
|
-
else
|
293
|
-
obj.coords_string = "NOT FOUND"
|
294
|
-
end
|
295
|
-
end
|
296
|
-
|
297
|
-
def initialize(name, address)
|
298
|
-
super()
|
299
|
-
write_attribute :name, name
|
300
|
-
write_attribute :address, address
|
301
|
-
end
|
302
|
-
end
|
303
|
-
|
304
|
-
class PlaceReverseGeocodedWithCustomResultsHandling < ActiveRecord::Base
|
305
|
-
reverse_geocoded_by :latitude, :longitude do |obj,results|
|
306
|
-
if result = results.first
|
307
|
-
obj.country = result.country_code
|
308
|
-
end
|
309
|
-
end
|
310
|
-
|
311
|
-
def initialize(name, latitude, longitude)
|
312
|
-
super()
|
313
|
-
write_attribute :name, name
|
314
|
-
write_attribute :latitude, latitude
|
315
|
-
write_attribute :longitude, longitude
|
316
|
-
end
|
317
|
-
end
|
318
|
-
|
319
|
-
class PlaceWithForwardAndReverseGeocoding < ActiveRecord::Base
|
320
|
-
geocoded_by :address, :latitude => :lat, :longitude => :lon
|
321
|
-
reverse_geocoded_by :lat, :lon, :address => :location
|
322
|
-
|
323
|
-
def initialize(name)
|
324
|
-
super()
|
325
|
-
write_attribute :name, name
|
326
|
-
end
|
327
|
-
end
|
328
|
-
|
329
|
-
class PlaceWithCustomLookup < ActiveRecord::Base
|
330
|
-
geocoded_by :address, :lookup => :nominatim do |obj,results|
|
331
|
-
if result = results.first
|
332
|
-
obj.result_class = result.class
|
333
|
-
end
|
334
|
-
end
|
335
|
-
|
336
|
-
def initialize(name, address)
|
337
|
-
super()
|
338
|
-
write_attribute :name, name
|
339
|
-
write_attribute :address, address
|
340
|
-
end
|
341
|
-
end
|
342
|
-
|
343
|
-
class PlaceWithCustomLookupProc < ActiveRecord::Base
|
344
|
-
geocoded_by :address, :lookup => lambda{|obj| obj.custom_lookup } do |obj,results|
|
345
|
-
if result = results.first
|
346
|
-
obj.result_class = result.class
|
347
|
-
end
|
348
|
-
end
|
349
|
-
|
350
|
-
def custom_lookup
|
351
|
-
:nominatim
|
352
|
-
end
|
353
|
-
|
354
|
-
def initialize(name, address)
|
355
|
-
super()
|
356
|
-
write_attribute :name, name
|
357
|
-
write_attribute :address, address
|
358
|
-
end
|
359
|
-
end
|
360
|
-
|
361
|
-
class PlaceReverseGeocodedWithCustomLookup < ActiveRecord::Base
|
362
|
-
reverse_geocoded_by :latitude, :longitude, :lookup => :nominatim do |obj,results|
|
363
|
-
if result = results.first
|
364
|
-
obj.result_class = result.class
|
365
|
-
end
|
366
|
-
end
|
367
|
-
|
368
|
-
def initialize(name, latitude, longitude)
|
369
|
-
super()
|
370
|
-
write_attribute :name, name
|
371
|
-
write_attribute :latitude, latitude
|
372
|
-
write_attribute :longitude, longitude
|
373
|
-
end
|
374
|
-
end
|
375
|
-
|
376
|
-
|
377
|
-
class GeocoderTestCase < Test::Unit::TestCase
|
378
|
-
|
379
|
-
def setup
|
380
|
-
super
|
381
|
-
Geocoder::Configuration.instance.set_defaults
|
382
|
-
Geocoder.configure(:maxmind => {:service => :city_isp_org})
|
383
|
-
end
|
384
|
-
|
385
|
-
def geocoded_object_params(abbrev)
|
386
|
-
{
|
387
|
-
:msg => ["Madison Square Garden", "4 Penn Plaza, New York, NY"]
|
388
|
-
}[abbrev]
|
389
|
-
end
|
390
|
-
|
391
|
-
def reverse_geocoded_object_params(abbrev)
|
392
|
-
{
|
393
|
-
:msg => ["Madison Square Garden", 40.750354, -73.993371]
|
394
|
-
}[abbrev]
|
395
|
-
end
|
396
|
-
|
397
|
-
def set_api_key!(lookup_name)
|
398
|
-
lookup = Geocoder::Lookup.get(lookup_name)
|
399
|
-
if lookup.required_api_key_parts.size == 1
|
400
|
-
key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
|
401
|
-
elsif lookup.required_api_key_parts.size > 1
|
402
|
-
key = lookup.required_api_key_parts
|
403
|
-
else
|
404
|
-
key = nil
|
405
|
-
end
|
406
|
-
Geocoder.configure(:api_key => key)
|
407
|
-
end
|
408
|
-
end
|
409
|
-
|
410
|
-
class MockHttpResponse
|
411
|
-
attr_reader :code, :body
|
412
|
-
def initialize(options = {})
|
413
|
-
@code = options[:code].to_s
|
414
|
-
@body = options[:body]
|
415
|
-
end
|
416
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
$: << File.join(File.dirname(__FILE__), "..")
|
3
|
-
require 'test_helper'
|
4
|
-
|
5
|
-
class ActiveRecordTest < GeocoderTestCase
|
6
|
-
|
7
|
-
def test_exclude_condition_when_model_has_a_custom_primary_key
|
8
|
-
venue = PlaceWithCustomPrimaryKey.new(*geocoded_object_params(:msg))
|
9
|
-
|
10
|
-
# just call private method directly so we don't have to stub .near scope
|
11
|
-
conditions = venue.class.send(:add_exclude_condition, ["fake_condition"], venue)
|
12
|
-
|
13
|
-
assert_match( /#{PlaceWithCustomPrimaryKey.primary_key}/, conditions.join)
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
data/test/unit/cache_test.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
$: << File.join(File.dirname(__FILE__), "..")
|
3
|
-
require 'test_helper'
|
4
|
-
|
5
|
-
class CacheTest < GeocoderTestCase
|
6
|
-
|
7
|
-
def test_second_occurrence_of_request_is_cache_hit
|
8
|
-
Geocoder.configure(:cache => {})
|
9
|
-
Geocoder::Lookup.all_services_except_test.each do |l|
|
10
|
-
next if l == :maxmind_local || l == :geoip2 # local, does not use cache
|
11
|
-
Geocoder.configure(:lookup => l)
|
12
|
-
set_api_key!(l)
|
13
|
-
results = Geocoder.search("Madison Square Garden")
|
14
|
-
assert !results.first.cache_hit,
|
15
|
-
"Lookup #{l} returned erroneously cached result."
|
16
|
-
results = Geocoder.search("Madison Square Garden")
|
17
|
-
assert results.first.cache_hit,
|
18
|
-
"Lookup #{l} did not return cached result."
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_google_over_query_limit_does_not_hit_cache
|
23
|
-
Geocoder.configure(:cache => {})
|
24
|
-
Geocoder.configure(:lookup => :google)
|
25
|
-
set_api_key!(:google)
|
26
|
-
Geocoder.configure(:always_raise => :all)
|
27
|
-
assert_raises Geocoder::OverQueryLimitError do
|
28
|
-
Geocoder.search("over limit")
|
29
|
-
end
|
30
|
-
lookup = Geocoder::Lookup.get(:google)
|
31
|
-
assert_equal false, lookup.instance_variable_get(:@cache_hit)
|
32
|
-
assert_raises Geocoder::OverQueryLimitError do
|
33
|
-
Geocoder.search("over limit")
|
34
|
-
end
|
35
|
-
assert_equal false, lookup.instance_variable_get(:@cache_hit)
|
36
|
-
end
|
37
|
-
end
|