diff --git a/lib/geocoder/lookup.rb b/lib/geocoder/lookup.rb index d439c7d231ef20d5c2044b6171c8c6a4ed5cef7f..91482a918a55c86b02c5cf4383bcb9eba27841cd 100644 --- a/lib/geocoder/lookup.rb +++ b/lib/geocoder/lookup.rb @@ -48,6 +48,7 @@ module Geocoder :smarty_streets, :okf, :postcode_anywhere_uk, + :postcodes_io, :geoportail_lu, :ban_data_gouv_fr, :test, diff --git a/lib/geocoder/lookups/postcodes_io.rb b/lib/geocoder/lookups/postcodes_io.rb new file mode 100644 index 0000000000000000000000000000000000000000..169571327611b9591e40fa0a1d34d3cce1136cd6 --- /dev/null +++ b/lib/geocoder/lookups/postcodes_io.rb @@ -0,0 +1,28 @@ +require 'geocoder/lookups/base' +require 'geocoder/results/postcodes_io' + +module Geocoder::Lookup + class PostcodesIo < Base + def name + 'Postcodes.io' + end + + def query_url(query) + str = query.sanitized_text.gsub(/\s/, '') + format('%s://%s/%s', protocol, 'api.postcodes.io/postcodes', str) + end + + def supported_protocols + [:https] + end + + private + + def results(query) + response = fetch_data(query) + return [] if response.nil? || response['status'] != 200 || response.empty? + + [response['result']] + end + end +end diff --git a/lib/geocoder/results/postcodes_io.rb b/lib/geocoder/results/postcodes_io.rb new file mode 100644 index 0000000000000000000000000000000000000000..82c97d62664f2f6f8a9f98405d6fc31c7f83444f --- /dev/null +++ b/lib/geocoder/results/postcodes_io.rb @@ -0,0 +1,47 @@ +require 'geocoder/results/base' + +module Geocoder::Result + class PostcodesIo < Base + def coordinates + [latitude, longitude] + end + + def latitude + @data['latitude'].to_f + end + + def longitude + @data['longitude'].to_f + end + + def quality + @data['quality'] + end + + def postal_code + @data['postcode'] + end + alias address postal_code + + def city + @data['admin_ward'] + end + + def county + @data['admin_county'] + end + alias state county + + def state_code + @data['codes']['admin_county'] + end + + def country + 'United Kingdom' + end + + def country_code + 'UK' + end + end +end diff --git a/test/fixtures/postcodes_io_malvern_hills b/test/fixtures/postcodes_io_malvern_hills new file mode 100644 index 0000000000000000000000000000000000000000..7a43cfc101e610da83f44ad82d80a9b7c645ed7a --- /dev/null +++ b/test/fixtures/postcodes_io_malvern_hills @@ -0,0 +1,36 @@ +{ + "status": 200, + "result": { + "postcode": "WR2 6NJ", + "quality": 1, + "eastings": 381676, + "northings": 259425, + "country": "England", + "nhs_ha": "West Midlands", + "longitude": -2.26972239639173, + "latitude": 52.2327158260535, + "european_electoral_region": "West Midlands", + "primary_care_trust": "Worcestershire", + "region": "West Midlands", + "lsoa": "Malvern Hills 002B", + "msoa": "Malvern Hills 002", + "incode": "6NJ", + "outcode": "WR2", + "parliamentary_constituency": "West Worcestershire", + "admin_district": "Malvern Hills", + "parish": "Hallow", + "admin_county": "Worcestershire", + "admin_ward": "Hallow", + "ccg": "NHS South Worcestershire", + "nuts": "Worcestershire", + "codes": { + "admin_district": "E07000235", + "admin_county": "E10000034", + "admin_ward": "E05007851", + "parish": "E04010305", + "parliamentary_constituency": "E14001035", + "ccg": "E38000166", + "nuts": "UKG12" + } + } +} diff --git a/test/fixtures/postcodes_io_no_results b/test/fixtures/postcodes_io_no_results new file mode 100644 index 0000000000000000000000000000000000000000..0c929cda78eb5e9a79022cd25b5fa05b6322061e --- /dev/null +++ b/test/fixtures/postcodes_io_no_results @@ -0,0 +1,4 @@ +{ + "status": 404, + "error": "Postcode not found" +} diff --git a/test/test_helper.rb b/test/test_helper.rb index 5698e49ef6841651f924dde2dcc11e2b7bba14ef..1f67af1bbc5b5cb14b397fc5f23a8b1244618785 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -338,6 +338,18 @@ module Geocoder end end + require 'geocoder/lookups/postcodes_io' + class PostcodesIo + private + def fixture_prefix + 'postcodes_io' + end + + def default_fixture_filename + "#{fixture_prefix}_malvern_hills" + end + end + require 'geocoder/lookups/geoportail_lu' class GeoportailLu private diff --git a/test/unit/lookup_test.rb b/test/unit/lookup_test.rb index 2afa95474ed44afe0aec22653f5742afc444b4be..e98f883cbfc7afa18f32404a11954b9f978e6bfb 100644 --- a/test/unit/lookup_test.rb +++ b/test/unit/lookup_test.rb @@ -24,7 +24,7 @@ class LookupTest < GeocoderTestCase def test_query_url_contains_values_in_params_hash Geocoder::Lookup.all_services_except_test.each do |l| - next if [:freegeoip, :maxmind_local, :telize, :pointpin, :geoip2, :maxmind_geoip2, :mapbox, :ipdata_co, :ipinfo_io, :ipapi_com, :ipstack].include? l # does not use query string + next if [:freegeoip, :maxmind_local, :telize, :pointpin, :geoip2, :maxmind_geoip2, :mapbox, :ipdata_co, :ipinfo_io, :ipapi_com, :ipstack, :postcodes_io].include? l # does not use query string set_api_key!(l) url = Geocoder::Lookup.get(l).query_url(Geocoder::Query.new( "test", :params => {:one_in_the_hand => "two in the bush"} diff --git a/test/unit/lookups/postcodes_io_test.rb b/test/unit/lookups/postcodes_io_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..30fd73785f17cabff7b0c1d463a56ceabe138dbf --- /dev/null +++ b/test/unit/lookups/postcodes_io_test.rb @@ -0,0 +1,21 @@ +# encoding: utf-8 +require 'test_helper' + +class PostcodesIoTest < GeocoderTestCase + + def setup + Geocoder.configure(lookup: :postcodes_io) + end + + def test_result_on_postcode_search + results = Geocoder.search('WR26NJ') + + assert_equal 1, results.size + assert_equal 'Worcestershire', results.first.county + assert_equal [52.2327158260535, -2.26972239639173], results.first.coordinates + end + + def test_no_results + assert_equal [], Geocoder.search('no results') + end +end