From cb046ab695a0546d42c0a2e447ae4d2767a644d6 Mon Sep 17 00:00:00 2001 From: Spas Poptchev <spoptchev@x-rails.com> Date: Mon, 14 Jan 2013 15:47:02 +0100 Subject: [PATCH] cloudmade lookup --- lib/geocoder/lookup.rb | 1 + lib/geocoder/lookups/cloudmade.rb | 35 +++++++++++++++++ lib/geocoder/results/cloudmade.rb | 39 +++++++++++++++++++ test/fixtures/cloudmade_invalid_key | 1 + test/fixtures/cloudmade_madison_square_garden | 1 + test/fixtures/cloudmade_no_results | 1 + test/lookup_test.rb | 2 +- 7 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 lib/geocoder/lookups/cloudmade.rb create mode 100644 lib/geocoder/results/cloudmade.rb create mode 100644 test/fixtures/cloudmade_invalid_key create mode 100644 test/fixtures/cloudmade_madison_square_garden create mode 100644 test/fixtures/cloudmade_no_results diff --git a/lib/geocoder/lookup.rb b/lib/geocoder/lookup.rb index 472a164a..ed17e69c 100644 --- a/lib/geocoder/lookup.rb +++ b/lib/geocoder/lookup.rb @@ -29,6 +29,7 @@ module Geocoder :yandex, :nominatim, :mapquest, + :cloudmade, :test ] end diff --git a/lib/geocoder/lookups/cloudmade.rb b/lib/geocoder/lookups/cloudmade.rb new file mode 100644 index 00000000..a5d36177 --- /dev/null +++ b/lib/geocoder/lookups/cloudmade.rb @@ -0,0 +1,35 @@ +require 'geocoder/lookups/base' +require 'geocoder/results/cloudmade' + +module Geocoder::Lookup + class Cloudmade < Base + + def name + "Cloudmade" + end + + def query_url(query) + "http://geocoding.cloudmade.com/#{configuration.api_key}/geocoding/v2/find.js?#{url_query_string(query)}" + end + + def required_api_key_parts + ["key"] + end + + private + + def results(query) + data = fetch_data(query) + (data && data['features']) || [] + end + + def query_url_params(query) + params = { + :query => query.sanitized_text, + :return_location => true, + :return_geometry => false + }.merge(super) + end + + end +end diff --git a/lib/geocoder/results/cloudmade.rb b/lib/geocoder/results/cloudmade.rb new file mode 100644 index 00000000..ebd26bab --- /dev/null +++ b/lib/geocoder/results/cloudmade.rb @@ -0,0 +1,39 @@ +require 'geocoder/results/base' + +module Geocoder::Result + class Cloudmade < Base + + def coordinates + @data["centroid"]["coordinates"] + end + + def street + @data["location"]["road"] + end + + def city + @data["location"]["city"] + end + + def state + @data["location"]["county"] + end + alias_method :state_code, :state + + def country + @data["location"]["country"] + end + alias_method :country_code, :country + + def postal_code + @data["location"]["postcode"] + end + + def address + [street, city, state, postal_code, country].reject{|s| s.length == 0 }.join(", ") + end + + end +end + + diff --git a/test/fixtures/cloudmade_invalid_key b/test/fixtures/cloudmade_invalid_key new file mode 100644 index 00000000..0b133da5 --- /dev/null +++ b/test/fixtures/cloudmade_invalid_key @@ -0,0 +1 @@ +Forbidden request diff --git a/test/fixtures/cloudmade_madison_square_garden b/test/fixtures/cloudmade_madison_square_garden new file mode 100644 index 00000000..6fa280de --- /dev/null +++ b/test/fixtures/cloudmade_madison_square_garden @@ -0,0 +1 @@ +{"found": 2, "bounds": [[40.74983, -73.99433], [40.75116, -73.99266]], "features": [{"id": 32891803,"centroid": {"type":"POINT","coordinates":[40.75111, -73.99345]},"bounds": [[40.74983, -73.99433], [40.75116, -73.99266]],"properties": {"osm_element": "way", "sport": "hockey;basketball;lacrosse", "name": "Madison Square Garden", "leisure": "stadium", "osm_id": "24801588"},"location": {"county": "New York", "country": "United States of America", "postcode": "10119", "road": "West 31st Street", "city": "New York"},"type": "Feature"},{"id": 12977552,"centroid": {"type":"POINT","coordinates":[40.75066, -73.99347]},"bounds": [[40.75066, -73.99347], [40.75066, -73.99347]],"properties": {"building": "yes", "osm_element": "node", "name": "Madison Square Garden Center", "addr:state": "NY", "osm_id": "368045579"},"location": {"county": "New York", "country": "United States of America", "postcode": "10119", "road": "West 33rd Street", "city": "New York"},"type": "Feature"}], "type": "FeatureCollection", "crs": {"type": "EPSG", "properties": {"code": 4326, "coordinate_order": [0, 1]}}} diff --git a/test/fixtures/cloudmade_no_results b/test/fixtures/cloudmade_no_results new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/test/fixtures/cloudmade_no_results @@ -0,0 +1 @@ +{} diff --git a/test/lookup_test.rb b/test/lookup_test.rb index 51c2e0d6..530fff1b 100644 --- a/test/lookup_test.rb +++ b/test/lookup_test.rb @@ -69,7 +69,7 @@ class LookupTest < Test::Unit::TestCase # keep test output clean: suppress timeout warning orig = $VERBOSE; $VERBOSE = nil #Geocoder::Lookup.all_services_except_test.each do |l| - [:bing, :yahoo, :yandex, :maxmind].each do |l| + [:bing, :yahoo, :yandex, :maxmind, :cloudmade].each do |l| Geocoder.configure(:lookup => l) set_api_key!(l) assert_equal [], Geocoder.search("invalid key") -- GitLab