From b331ef4ca1917ce7aad5353526843fbc2a407403 Mon Sep 17 00:00:00 2001 From: Rob Murray Date: Wed, 21 May 2014 14:00:26 +0100 Subject: [PATCH 01/14] Add PostcodeAnywhere api error responses --- test/fixtures/postcode_anywhere_uk_key_limit_exceeded | 1 + test/fixtures/postcode_anywhere_uk_no_results | 1 + test/fixtures/postcode_anywhere_uk_unknown_key | 1 + 3 files changed, 3 insertions(+) create mode 100644 test/fixtures/postcode_anywhere_uk_key_limit_exceeded create mode 100644 test/fixtures/postcode_anywhere_uk_no_results create mode 100644 test/fixtures/postcode_anywhere_uk_unknown_key diff --git a/test/fixtures/postcode_anywhere_uk_key_limit_exceeded b/test/fixtures/postcode_anywhere_uk_key_limit_exceeded new file mode 100644 index 000000000..479b8697f --- /dev/null +++ b/test/fixtures/postcode_anywhere_uk_key_limit_exceeded @@ -0,0 +1 @@ +[{"Error":"8","Description":"Key daily limit exceeded","Cause":"The daily limit on the key has been exceeded.","Resolution":"Alter the daily limit on the key. Check the usage details first to see if usage is normal."}] \ No newline at end of file diff --git a/test/fixtures/postcode_anywhere_uk_no_results b/test/fixtures/postcode_anywhere_uk_no_results new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/test/fixtures/postcode_anywhere_uk_no_results @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/test/fixtures/postcode_anywhere_uk_unknown_key b/test/fixtures/postcode_anywhere_uk_unknown_key new file mode 100644 index 000000000..091c3a634 --- /dev/null +++ b/test/fixtures/postcode_anywhere_uk_unknown_key @@ -0,0 +1 @@ +[{"Error":"2","Description":"Unknown key","Cause":"The key you are using to access the service was not found.","Resolution":"Please check that the key is correct. It should be in the form AA11-AA11-AA11-AA11."}] \ No newline at end of file From 01c98dfdea9d72ccaa0b6d47740215911fda3505 Mon Sep 17 00:00:00 2001 From: Rob Murray Date: Wed, 21 May 2014 17:12:01 +0100 Subject: [PATCH 02/14] Rename fixtures with Postcode Anywhere API version prefixed --- test/fixtures/postcode_anywhere_uk_geocode_v200_WR26NJ | 1 + ...eded => postcode_anywhere_uk_geocode_v200_key_limit_exceeded} | 0 .../postcode_anywhere_uk_geocode_v200_madison_square_garden | 1 + ...k_no_results => postcode_anywhere_uk_geocode_v200_no_results} | 0 4 files changed, 2 insertions(+) create mode 100644 test/fixtures/postcode_anywhere_uk_geocode_v200_WR26NJ rename test/fixtures/{postcode_anywhere_uk_key_limit_exceeded => postcode_anywhere_uk_geocode_v200_key_limit_exceeded} (100%) create mode 100644 test/fixtures/postcode_anywhere_uk_geocode_v200_madison_square_garden rename test/fixtures/{postcode_anywhere_uk_no_results => postcode_anywhere_uk_geocode_v200_no_results} (100%) diff --git a/test/fixtures/postcode_anywhere_uk_geocode_v200_WR26NJ b/test/fixtures/postcode_anywhere_uk_geocode_v200_WR26NJ new file mode 100644 index 000000000..322346816 --- /dev/null +++ b/test/fixtures/postcode_anywhere_uk_geocode_v200_WR26NJ @@ -0,0 +1 @@ +[{"Location":"Moseley Road, Hallow, Worcester","Easting":"381676","Northing":"259425","Latitude":"52.2327","Longitude":"-2.2697","OsGrid":"SO 81676 59425","Accuracy":"Standard"}] \ No newline at end of file diff --git a/test/fixtures/postcode_anywhere_uk_key_limit_exceeded b/test/fixtures/postcode_anywhere_uk_geocode_v200_key_limit_exceeded similarity index 100% rename from test/fixtures/postcode_anywhere_uk_key_limit_exceeded rename to test/fixtures/postcode_anywhere_uk_geocode_v200_key_limit_exceeded diff --git a/test/fixtures/postcode_anywhere_uk_geocode_v200_madison_square_garden b/test/fixtures/postcode_anywhere_uk_geocode_v200_madison_square_garden new file mode 100644 index 000000000..56798feed --- /dev/null +++ b/test/fixtures/postcode_anywhere_uk_geocode_v200_madison_square_garden @@ -0,0 +1 @@ +[{"Location":"Maidstone, Kent","Easting":"576153","Northing":"155386","Latitude":"51.2703","Longitude":"0.5238","OsGrid":"TQ 76153 55386","Accuracy":"Standard"}] \ No newline at end of file diff --git a/test/fixtures/postcode_anywhere_uk_no_results b/test/fixtures/postcode_anywhere_uk_geocode_v200_no_results similarity index 100% rename from test/fixtures/postcode_anywhere_uk_no_results rename to test/fixtures/postcode_anywhere_uk_geocode_v200_no_results From 509ab4f3f84b7a1c75c9ac0cb5d38ce5c1dbbaad Mon Sep 17 00:00:00 2001 From: Rob Murray Date: Wed, 21 May 2014 17:13:47 +0100 Subject: [PATCH 03/14] Add minimal PostcodeAnywhere UK geocoding provider --- lib/geocoder/lookups/postcode_anywhere_uk.rb | 37 ++++++++++++++++++++ lib/geocoder/results/postcode_anywhere_uk.rb | 29 +++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 lib/geocoder/lookups/postcode_anywhere_uk.rb create mode 100644 lib/geocoder/results/postcode_anywhere_uk.rb diff --git a/lib/geocoder/lookups/postcode_anywhere_uk.rb b/lib/geocoder/lookups/postcode_anywhere_uk.rb new file mode 100644 index 000000000..2b4a835ec --- /dev/null +++ b/lib/geocoder/lookups/postcode_anywhere_uk.rb @@ -0,0 +1,37 @@ +require 'geocoder/lookups/base' +require 'geocoder/results/postcode_anywhere_uk' + +module Geocoder::Lookup + class PostcodeAnywhereUk < Base + + BASE_URL_GEOCODE_V200 = 'services.postcodeanywhere.co.uk/Geocoding/UK/Geocode/v2.00/json.ws' + + def name + 'PostcodeAnywhereUk' + end + + def required_api_key_parts + %w(key) + end + + def query_url(query) + format('%s://%s?%s', protocol, BASE_URL_GEOCODE_V200, url_query_string(query)) + end + + private + + def results(query) + response = fetch_data(query) + return [] if response.nil? || !response.is_a?(Array) || response.empty? + + return response + end + + def query_url_params(query) + { + :location => query.sanitized_text, + :key => configuration.api_key + }.merge(super) + end + end +end diff --git a/lib/geocoder/results/postcode_anywhere_uk.rb b/lib/geocoder/results/postcode_anywhere_uk.rb new file mode 100644 index 000000000..b31949590 --- /dev/null +++ b/lib/geocoder/results/postcode_anywhere_uk.rb @@ -0,0 +1,29 @@ +require 'geocoder/results/base' + +module Geocoder::Result + class PostcodeAnywhereUk < Base + + def coordinates + [@data['Latitude'].to_f, @data['Longitude'].to_f] + end + + def blank_result + '' + end + alias_method :state, :blank_result + alias_method :state_code, :blank_result + alias_method :postal_code, :blank_result + + def country + 'United Kingdom' + end + + def country_code + 'UK' + end + + def address + [@data['Location'], @data['OsGrid']].join(', ') + end + end +end \ No newline at end of file From 8d7e72f4a275ca6e10c464c4d96e68b75eae47f7 Mon Sep 17 00:00:00 2001 From: Rob Murray Date: Wed, 21 May 2014 17:14:37 +0100 Subject: [PATCH 04/14] Test PostcodeAnywhere Uk geocoding provider tests --- test/test_helper.rb | 7 ++++ .../unit/lookups/postcode_anywhere_uk_test.rb | 33 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 test/unit/lookups/postcode_anywhere_uk_test.rb diff --git a/test/test_helper.rb b/test/test_helper.rb index e57c779ac..c4d018b8c 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -214,6 +214,13 @@ def default_fixture_filename "okf_kirstinmaki" end end + + class PostcodeAnywhereUk + private + def fixture_prefix + 'postcode_anywhere_uk_geocode_v200' + end + end end end diff --git a/test/unit/lookups/postcode_anywhere_uk_test.rb b/test/unit/lookups/postcode_anywhere_uk_test.rb new file mode 100644 index 000000000..77c481d5e --- /dev/null +++ b/test/unit/lookups/postcode_anywhere_uk_test.rb @@ -0,0 +1,33 @@ +# encoding: utf-8 +$: << File.join(File.dirname(__FILE__), '..', '..') +require 'test_helper' + +class PostcodeAnywhereUkTest < GeocoderTestCase + + def setup + Geocoder.configure(lookup: :postcode_anywhere_uk) + set_api_key!(:postcode_anywhere_uk) + end + + def test_result_components + results = Geocoder.search('Madison Square Garden') + + assert_equal 1, results.size + result = results.first + assert_equal 'Maidstone, Kent, TQ 76153 55386', result.address + assert_equal [51.2703, 0.5238], result.coordinates + end + + def test_WR26NJ + results = Geocoder.search('WR26NJ') + + assert_equal 1, results.size + result = results.first + assert_equal 'Moseley Road, Hallow, Worcester, SO 81676 59425', result.address + assert_equal [52.2327, -2.2697], result.coordinates + end + + def test_no_results + assert_equal [], Geocoder.search('no results') + end +end From 963ba724e2c20911ec624f8823297acc56d43d9a Mon Sep 17 00:00:00 2001 From: Rob Murray Date: Wed, 21 May 2014 17:36:18 +0100 Subject: [PATCH 05/14] It appears that we have to implement the 'city' method on the 'Results' object too --- lib/geocoder/results/postcode_anywhere_uk.rb | 17 ++++++++++++----- test/unit/lookups/postcode_anywhere_uk_test.rb | 12 ++++++------ 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/lib/geocoder/results/postcode_anywhere_uk.rb b/lib/geocoder/results/postcode_anywhere_uk.rb index b31949590..9b402d8d6 100644 --- a/lib/geocoder/results/postcode_anywhere_uk.rb +++ b/lib/geocoder/results/postcode_anywhere_uk.rb @@ -14,6 +14,17 @@ def blank_result alias_method :state_code, :blank_result alias_method :postal_code, :blank_result + def address + [@data['Location'], @data['OsGrid']].join(', ') + end + + def city + # is this too big a jump to assume that the API always + # returns a City, County as the last elements? + city = @data['Location'].split(',')[-2] + city.strip + end + def country 'United Kingdom' end @@ -21,9 +32,5 @@ def country def country_code 'UK' end - - def address - [@data['Location'], @data['OsGrid']].join(', ') - end end -end \ No newline at end of file +end diff --git a/test/unit/lookups/postcode_anywhere_uk_test.rb b/test/unit/lookups/postcode_anywhere_uk_test.rb index 77c481d5e..c9ce93606 100644 --- a/test/unit/lookups/postcode_anywhere_uk_test.rb +++ b/test/unit/lookups/postcode_anywhere_uk_test.rb @@ -13,18 +13,18 @@ def test_result_components results = Geocoder.search('Madison Square Garden') assert_equal 1, results.size - result = results.first - assert_equal 'Maidstone, Kent, TQ 76153 55386', result.address - assert_equal [51.2703, 0.5238], result.coordinates + assert_equal 'Maidstone, Kent, TQ 76153 55386', results.first.address + assert_equal [51.2703, 0.5238], results.first.coordinates + assert_equal 'Maidstone', results.first.city end def test_WR26NJ results = Geocoder.search('WR26NJ') assert_equal 1, results.size - result = results.first - assert_equal 'Moseley Road, Hallow, Worcester, SO 81676 59425', result.address - assert_equal [52.2327, -2.2697], result.coordinates + assert_equal 'Moseley Road, Hallow, Worcester, SO 81676 59425', results.first.address + assert_equal [52.2327, -2.2697], results.first.coordinates + assert_equal 'Hallow', results.first.city end def test_no_results From 9458ea5a1d8fefef57343c1e929d47f4f4756674 Mon Sep 17 00:00:00 2001 From: Rob Murray Date: Thu, 22 May 2014 12:16:58 +0100 Subject: [PATCH 06/14] Rename PostcodeAnywhere UK fixtures --- test/fixtures/postcode_anywhere_uk_geocode_v200_generic_error | 1 + .../postcode_anywhere_uk_geocode_v200_madison_square_garden | 1 - test/fixtures/postcode_anywhere_uk_geocode_v200_romsey | 1 + ...unknown_key => postcode_anywhere_uk_geocode_v200_unknown_key} | 0 4 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/postcode_anywhere_uk_geocode_v200_generic_error delete mode 100644 test/fixtures/postcode_anywhere_uk_geocode_v200_madison_square_garden create mode 100644 test/fixtures/postcode_anywhere_uk_geocode_v200_romsey rename test/fixtures/{postcode_anywhere_uk_unknown_key => postcode_anywhere_uk_geocode_v200_unknown_key} (100%) diff --git a/test/fixtures/postcode_anywhere_uk_geocode_v200_generic_error b/test/fixtures/postcode_anywhere_uk_geocode_v200_generic_error new file mode 100644 index 000000000..4dd3044b3 --- /dev/null +++ b/test/fixtures/postcode_anywhere_uk_geocode_v200_generic_error @@ -0,0 +1 @@ +[{"Error":"9999","Description":"A generic error","Cause":"A generic error occured.","Resolution":"Fix the unknown error."}] \ No newline at end of file diff --git a/test/fixtures/postcode_anywhere_uk_geocode_v200_madison_square_garden b/test/fixtures/postcode_anywhere_uk_geocode_v200_madison_square_garden deleted file mode 100644 index 56798feed..000000000 --- a/test/fixtures/postcode_anywhere_uk_geocode_v200_madison_square_garden +++ /dev/null @@ -1 +0,0 @@ -[{"Location":"Maidstone, Kent","Easting":"576153","Northing":"155386","Latitude":"51.2703","Longitude":"0.5238","OsGrid":"TQ 76153 55386","Accuracy":"Standard"}] \ No newline at end of file diff --git a/test/fixtures/postcode_anywhere_uk_geocode_v200_romsey b/test/fixtures/postcode_anywhere_uk_geocode_v200_romsey new file mode 100644 index 000000000..340b18a5b --- /dev/null +++ b/test/fixtures/postcode_anywhere_uk_geocode_v200_romsey @@ -0,0 +1 @@ +[{"Location":"Romsey, Hampshire","Easting":"435270","Northing":"121182","Latitude":"50.9889","Longitude":"-1.4989","OsGrid":"SU 35270 21182","Accuracy":"Standard"}] \ No newline at end of file diff --git a/test/fixtures/postcode_anywhere_uk_unknown_key b/test/fixtures/postcode_anywhere_uk_geocode_v200_unknown_key similarity index 100% rename from test/fixtures/postcode_anywhere_uk_unknown_key rename to test/fixtures/postcode_anywhere_uk_geocode_v200_unknown_key From e9bd604216bc009a010138b9347d0d86301e80e7 Mon Sep 17 00:00:00 2001 From: Rob Murray Date: Thu, 22 May 2014 12:17:34 +0100 Subject: [PATCH 07/14] Specify the PostcodeAnywhere Uk default fixture --- test/test_helper.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/test_helper.rb b/test/test_helper.rb index c4d018b8c..a022a58b3 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -220,6 +220,10 @@ class PostcodeAnywhereUk def fixture_prefix 'postcode_anywhere_uk_geocode_v200' end + + def default_fixture_filename + "#{fixture_prefix}_romsey" + end end end end From abca18fb533539ea66122918ae7925116ef3b2af Mon Sep 17 00:00:00 2001 From: Rob Murray Date: Thu, 22 May 2014 12:23:46 +0100 Subject: [PATCH 08/14] Add underscore to separate PostcodeAnywhere version identifier on fixtures --- ...de_v200_WR26NJ => postcode_anywhere_uk_geocode_v2_00_WR26NJ} | 0 ...c_error => postcode_anywhere_uk_geocode_v2_00_generic_error} | 0 ...ed => postcode_anywhere_uk_geocode_v2_00_key_limit_exceeded} | 0 ...no_results => postcode_anywhere_uk_geocode_v2_00_no_results} | 0 ...de_v200_romsey => postcode_anywhere_uk_geocode_v2_00_romsey} | 0 ...known_key => postcode_anywhere_uk_geocode_v2_00_unknown_key} | 0 test/test_helper.rb | 2 +- 7 files changed, 1 insertion(+), 1 deletion(-) rename test/fixtures/{postcode_anywhere_uk_geocode_v200_WR26NJ => postcode_anywhere_uk_geocode_v2_00_WR26NJ} (100%) rename test/fixtures/{postcode_anywhere_uk_geocode_v200_generic_error => postcode_anywhere_uk_geocode_v2_00_generic_error} (100%) rename test/fixtures/{postcode_anywhere_uk_geocode_v200_key_limit_exceeded => postcode_anywhere_uk_geocode_v2_00_key_limit_exceeded} (100%) rename test/fixtures/{postcode_anywhere_uk_geocode_v200_no_results => postcode_anywhere_uk_geocode_v2_00_no_results} (100%) rename test/fixtures/{postcode_anywhere_uk_geocode_v200_romsey => postcode_anywhere_uk_geocode_v2_00_romsey} (100%) rename test/fixtures/{postcode_anywhere_uk_geocode_v200_unknown_key => postcode_anywhere_uk_geocode_v2_00_unknown_key} (100%) diff --git a/test/fixtures/postcode_anywhere_uk_geocode_v200_WR26NJ b/test/fixtures/postcode_anywhere_uk_geocode_v2_00_WR26NJ similarity index 100% rename from test/fixtures/postcode_anywhere_uk_geocode_v200_WR26NJ rename to test/fixtures/postcode_anywhere_uk_geocode_v2_00_WR26NJ diff --git a/test/fixtures/postcode_anywhere_uk_geocode_v200_generic_error b/test/fixtures/postcode_anywhere_uk_geocode_v2_00_generic_error similarity index 100% rename from test/fixtures/postcode_anywhere_uk_geocode_v200_generic_error rename to test/fixtures/postcode_anywhere_uk_geocode_v2_00_generic_error diff --git a/test/fixtures/postcode_anywhere_uk_geocode_v200_key_limit_exceeded b/test/fixtures/postcode_anywhere_uk_geocode_v2_00_key_limit_exceeded similarity index 100% rename from test/fixtures/postcode_anywhere_uk_geocode_v200_key_limit_exceeded rename to test/fixtures/postcode_anywhere_uk_geocode_v2_00_key_limit_exceeded diff --git a/test/fixtures/postcode_anywhere_uk_geocode_v200_no_results b/test/fixtures/postcode_anywhere_uk_geocode_v2_00_no_results similarity index 100% rename from test/fixtures/postcode_anywhere_uk_geocode_v200_no_results rename to test/fixtures/postcode_anywhere_uk_geocode_v2_00_no_results diff --git a/test/fixtures/postcode_anywhere_uk_geocode_v200_romsey b/test/fixtures/postcode_anywhere_uk_geocode_v2_00_romsey similarity index 100% rename from test/fixtures/postcode_anywhere_uk_geocode_v200_romsey rename to test/fixtures/postcode_anywhere_uk_geocode_v2_00_romsey diff --git a/test/fixtures/postcode_anywhere_uk_geocode_v200_unknown_key b/test/fixtures/postcode_anywhere_uk_geocode_v2_00_unknown_key similarity index 100% rename from test/fixtures/postcode_anywhere_uk_geocode_v200_unknown_key rename to test/fixtures/postcode_anywhere_uk_geocode_v2_00_unknown_key diff --git a/test/test_helper.rb b/test/test_helper.rb index a022a58b3..b6a68f76e 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -218,7 +218,7 @@ def default_fixture_filename class PostcodeAnywhereUk private def fixture_prefix - 'postcode_anywhere_uk_geocode_v200' + 'postcode_anywhere_uk_geocode_v2_00' end def default_fixture_filename From 0d93d6c541f6699c8787825979d6a7112572c67f Mon Sep 17 00:00:00 2001 From: Rob Murray Date: Thu, 22 May 2014 12:25:10 +0100 Subject: [PATCH 09/14] Add PostcodeAnywhere API error handling; Map key limit exceeded, invalid key to Geocode errors and call all others as just Error --- lib/geocoder/lookups/postcode_anywhere_uk.rb | 18 +++++++-- .../unit/lookups/postcode_anywhere_uk_test.rb | 37 ++++++++++++++++--- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/lib/geocoder/lookups/postcode_anywhere_uk.rb b/lib/geocoder/lookups/postcode_anywhere_uk.rb index 2b4a835ec..40b425c56 100644 --- a/lib/geocoder/lookups/postcode_anywhere_uk.rb +++ b/lib/geocoder/lookups/postcode_anywhere_uk.rb @@ -4,7 +4,7 @@ module Geocoder::Lookup class PostcodeAnywhereUk < Base - BASE_URL_GEOCODE_V200 = 'services.postcodeanywhere.co.uk/Geocoding/UK/Geocode/v2.00/json.ws' + BASE_URL_GEOCODE_V2_00 = 'services.postcodeanywhere.co.uk/Geocoding/UK/Geocode/v2.00/json.ws' def name 'PostcodeAnywhereUk' @@ -15,7 +15,7 @@ def required_api_key_parts end def query_url(query) - format('%s://%s?%s', protocol, BASE_URL_GEOCODE_V200, url_query_string(query)) + format('%s://%s?%s', protocol, BASE_URL_GEOCODE_V2_00, url_query_string(query)) end private @@ -24,7 +24,19 @@ def results(query) response = fetch_data(query) return [] if response.nil? || !response.is_a?(Array) || response.empty? - return response + raise_exception_for_response(response[0]) if response[0]['Error'] + response + end + + def raise_exception_for_response(response) + case response['Error'] + when '8', '17' # api docs say these two codes are the same error + raise_error(Geocoder::OverQueryLimitError, response['Cause']) || warn(response['Cause']) + when '2' + raise_error(Geocoder::InvalidApiKey, response['Cause']) || warn(response['Cause']) + else # anything else just raise general error with the api cause + raise_error(Geocoder::Error, response['Cause']) || warn(response['Cause']) + end end def query_url_params(query) diff --git a/test/unit/lookups/postcode_anywhere_uk_test.rb b/test/unit/lookups/postcode_anywhere_uk_test.rb index c9ce93606..b49c5cd3b 100644 --- a/test/unit/lookups/postcode_anywhere_uk_test.rb +++ b/test/unit/lookups/postcode_anywhere_uk_test.rb @@ -9,16 +9,16 @@ def setup set_api_key!(:postcode_anywhere_uk) end - def test_result_components - results = Geocoder.search('Madison Square Garden') + def test_result_components_with_placename_search + results = Geocoder.search('Romsey') assert_equal 1, results.size - assert_equal 'Maidstone, Kent, TQ 76153 55386', results.first.address - assert_equal [51.2703, 0.5238], results.first.coordinates - assert_equal 'Maidstone', results.first.city + assert_equal 'Romsey, Hampshire, SU 35270 21182', results.first.address + assert_equal [50.9889, -1.4989], results.first.coordinates + assert_equal 'Romsey', results.first.city end - def test_WR26NJ + def test_result_components_with_postcode results = Geocoder.search('WR26NJ') assert_equal 1, results.size @@ -30,4 +30,29 @@ def test_WR26NJ def test_no_results assert_equal [], Geocoder.search('no results') end + + def test_key_limit_exceeded_error + Geocoder.configure(always_raise: [Geocoder::OverQueryLimitError]) + + assert_raises Geocoder::OverQueryLimitError do + Geocoder.search('key limit exceeded') + end + end + + def test_unknown_key_error + Geocoder.configure(always_raise: [Geocoder::InvalidApiKey]) + + assert_raises Geocoder::InvalidApiKey do + Geocoder.search('unknown key') + end + end + + def test_generic_error + Geocoder.configure(always_raise: [Geocoder::Error]) + + exception = assert_raises(Geocoder::Error) do + Geocoder.search('generic error') + end + assert_equal 'A generic error occured.', exception.message + end end From c439bdf4e8bb031c4624dac2a04cb0ef569b9bd7 Mon Sep 17 00:00:00 2001 From: Rob Murray Date: Thu, 22 May 2014 15:23:57 +0100 Subject: [PATCH 10/14] Handle responses that only have one component in the Location field, assume this is a county and so return blank city --- lib/geocoder/results/postcode_anywhere_uk.rb | 2 +- .../postcode_anywhere_uk_geocode_v2_00_hampshire | 1 + test/unit/lookups/postcode_anywhere_uk_test.rb | 9 +++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/postcode_anywhere_uk_geocode_v2_00_hampshire diff --git a/lib/geocoder/results/postcode_anywhere_uk.rb b/lib/geocoder/results/postcode_anywhere_uk.rb index 9b402d8d6..abf13f719 100644 --- a/lib/geocoder/results/postcode_anywhere_uk.rb +++ b/lib/geocoder/results/postcode_anywhere_uk.rb @@ -21,7 +21,7 @@ def address def city # is this too big a jump to assume that the API always # returns a City, County as the last elements? - city = @data['Location'].split(',')[-2] + city = @data['Location'].split(',')[-2] || blank_result city.strip end diff --git a/test/fixtures/postcode_anywhere_uk_geocode_v2_00_hampshire b/test/fixtures/postcode_anywhere_uk_geocode_v2_00_hampshire new file mode 100644 index 000000000..6eb2a4a60 --- /dev/null +++ b/test/fixtures/postcode_anywhere_uk_geocode_v2_00_hampshire @@ -0,0 +1 @@ +[{"Location":"Hampshire","Easting":"448701","Northing":"126642","Latitude":"51.037","Longitude":"-1.3068","OsGrid":"SU 48701 26642","Accuracy":"Standard"}] \ No newline at end of file diff --git a/test/unit/lookups/postcode_anywhere_uk_test.rb b/test/unit/lookups/postcode_anywhere_uk_test.rb index b49c5cd3b..83f526ec2 100644 --- a/test/unit/lookups/postcode_anywhere_uk_test.rb +++ b/test/unit/lookups/postcode_anywhere_uk_test.rb @@ -27,6 +27,15 @@ def test_result_components_with_postcode assert_equal 'Hallow', results.first.city end + def test_result_components_with_county + results = Geocoder.search('hampshire') + + assert_equal 1, results.size + assert_equal 'Hampshire, SU 48701 26642', results.first.address + assert_equal [51.037, -1.3068], results.first.coordinates + assert_equal '', results.first.city + end + def test_no_results assert_equal [], Geocoder.search('no results') end From 6a14e443b539e566e527c828c7c55b60adc76278 Mon Sep 17 00:00:00 2001 From: Rob Murray Date: Fri, 30 May 2014 14:39:37 +0100 Subject: [PATCH 11/14] Add some PostcodeAnywhere API documentation to lookup and result impl --- lib/geocoder/lookups/postcode_anywhere_uk.rb | 8 +++++--- lib/geocoder/results/postcode_anywhere_uk.rb | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/geocoder/lookups/postcode_anywhere_uk.rb b/lib/geocoder/lookups/postcode_anywhere_uk.rb index 40b425c56..be8fe93df 100644 --- a/lib/geocoder/lookups/postcode_anywhere_uk.rb +++ b/lib/geocoder/lookups/postcode_anywhere_uk.rb @@ -3,8 +3,10 @@ module Geocoder::Lookup class PostcodeAnywhereUk < Base - + # API documentation: http://www.postcodeanywhere.co.uk/Support/WebService/Geocoding/UK/Geocode/2/ BASE_URL_GEOCODE_V2_00 = 'services.postcodeanywhere.co.uk/Geocoding/UK/Geocode/v2.00/json.ws' + DAILY_LIMIT_EXEEDED_ERROR_CODES = ['8', '17'] # api docs say these two codes are the same error + INVALID_API_KEY_ERROR_CODE = '2' def name 'PostcodeAnywhereUk' @@ -30,9 +32,9 @@ def results(query) def raise_exception_for_response(response) case response['Error'] - when '8', '17' # api docs say these two codes are the same error + when *DAILY_LIMIT_EXEEDED_ERROR_CODES raise_error(Geocoder::OverQueryLimitError, response['Cause']) || warn(response['Cause']) - when '2' + when INVALID_API_KEY_ERROR_CODE raise_error(Geocoder::InvalidApiKey, response['Cause']) || warn(response['Cause']) else # anything else just raise general error with the api cause raise_error(Geocoder::Error, response['Cause']) || warn(response['Cause']) diff --git a/lib/geocoder/results/postcode_anywhere_uk.rb b/lib/geocoder/results/postcode_anywhere_uk.rb index abf13f719..3f51fbba6 100644 --- a/lib/geocoder/results/postcode_anywhere_uk.rb +++ b/lib/geocoder/results/postcode_anywhere_uk.rb @@ -25,6 +25,8 @@ def city city.strip end + # This is a UK only API; all results are UK specific and + # so ommitted from API response. def country 'United Kingdom' end From d7702511bcb9053bafac504dc6749723f898ab14 Mon Sep 17 00:00:00 2001 From: Rob Murray Date: Sat, 11 Oct 2014 08:03:16 +0100 Subject: [PATCH 12/14] Add postcode_anywhere_uk lookup --- lib/geocoder/lookup.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/geocoder/lookup.rb b/lib/geocoder/lookup.rb index 1002f40c0..1ec886065 100644 --- a/lib/geocoder/lookup.rb +++ b/lib/geocoder/lookup.rb @@ -40,6 +40,7 @@ def street_services :geocodio, :smarty_streets, :okf, + :postcode_anywhere_uk, :test ] end From 7ce351344d2fdbaf64d5fb918205047f9a400965 Mon Sep 17 00:00:00 2001 From: Rob Murray Date: Sat, 11 Oct 2014 08:15:35 +0100 Subject: [PATCH 13/14] Add README lookup section for postcode_anywhere_uk --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index cf6b03d0c..131076883 100644 --- a/README.md +++ b/README.md @@ -607,6 +607,22 @@ Data Science Toolkit provides an API whose reponse format is like Google's but w * **Terms of Service**: http://www.itella.fi/liitteet/palvelutjatuotteet/yhteystietopalvelut/Postinumeropalvelut-Palvelukuvausjakayttoehdot.pdf * **Limitations**: ? + +#### PostcodeAnywhere Uk (`:postcode_anywhere_uk`) + +This uses the PostcodeAnywhere UK Geocode service, this will geocode any string from UK postcode, placename, point of interest or location. + +* **API key**: required +* **Quota**: Dependant on service plan? +* **Region**: UK +* **SSL support**: yes +* **Languages**: English +* **Documentation**: [http://www.postcodeanywhere.co.uk/Support/WebService/Geocoding/UK/Geocode/2/](http://www.postcodeanywhere.co.uk/Support/WebService/Geocoding/UK/Geocode/2/) +* **Terms of Service**: ? +* **Limitations**: ? +* **Notes**: To use PostcodeAnywhere you must include an API key: `Geocoder.configure(:lookup => :postcode_anywhere_uk, :api_key => 'your_api_key')`. + + ### IP Address Services #### FreeGeoIP (`:freegeoip`) From 4bb41db88238628e31dd9ec27971bfb3e995c55a Mon Sep 17 00:00:00 2001 From: Rob Murray Date: Sat, 11 Oct 2014 08:48:47 +0100 Subject: [PATCH 14/14] return OS GridReference as explicit method rather than part of address --- lib/geocoder/results/postcode_anywhere_uk.rb | 6 +++++- test/unit/lookups/postcode_anywhere_uk_test.rb | 9 ++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/geocoder/results/postcode_anywhere_uk.rb b/lib/geocoder/results/postcode_anywhere_uk.rb index 3f51fbba6..0ebd65db7 100644 --- a/lib/geocoder/results/postcode_anywhere_uk.rb +++ b/lib/geocoder/results/postcode_anywhere_uk.rb @@ -15,7 +15,7 @@ def blank_result alias_method :postal_code, :blank_result def address - [@data['Location'], @data['OsGrid']].join(', ') + @data['Location'] end def city @@ -25,6 +25,10 @@ def city city.strip end + def os_grid + @data['OsGrid'] + end + # This is a UK only API; all results are UK specific and # so ommitted from API response. def country diff --git a/test/unit/lookups/postcode_anywhere_uk_test.rb b/test/unit/lookups/postcode_anywhere_uk_test.rb index 83f526ec2..06000239d 100644 --- a/test/unit/lookups/postcode_anywhere_uk_test.rb +++ b/test/unit/lookups/postcode_anywhere_uk_test.rb @@ -13,7 +13,8 @@ def test_result_components_with_placename_search results = Geocoder.search('Romsey') assert_equal 1, results.size - assert_equal 'Romsey, Hampshire, SU 35270 21182', results.first.address + assert_equal 'Romsey, Hampshire', results.first.address + assert_equal 'SU 35270 21182', results.first.os_grid assert_equal [50.9889, -1.4989], results.first.coordinates assert_equal 'Romsey', results.first.city end @@ -22,7 +23,8 @@ def test_result_components_with_postcode results = Geocoder.search('WR26NJ') assert_equal 1, results.size - assert_equal 'Moseley Road, Hallow, Worcester, SO 81676 59425', results.first.address + assert_equal 'Moseley Road, Hallow, Worcester', results.first.address + assert_equal 'SO 81676 59425', results.first.os_grid assert_equal [52.2327, -2.2697], results.first.coordinates assert_equal 'Hallow', results.first.city end @@ -31,7 +33,8 @@ def test_result_components_with_county results = Geocoder.search('hampshire') assert_equal 1, results.size - assert_equal 'Hampshire, SU 48701 26642', results.first.address + assert_equal 'Hampshire', results.first.address + assert_equal 'SU 48701 26642', results.first.os_grid assert_equal [51.037, -1.3068], results.first.coordinates assert_equal '', results.first.city end