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