diff --git a/lib/python/heremaps/heremapsexceptions.py b/lib/python/heremaps/heremapsexceptions.py index 5e89a1b..8763ce7 100644 --- a/lib/python/heremaps/heremapsexceptions.py +++ b/lib/python/heremaps/heremapsexceptions.py @@ -1,3 +1,6 @@ +#!/usr/local/bin/python +# -*- coding: utf-8 -*- + import json class BadGeocodingParams(Exception): diff --git a/lib/python/heremaps/heremapsgeocoder.py b/lib/python/heremaps/heremapsgeocoder.py index 96fcb98..754f97a 100644 --- a/lib/python/heremaps/heremapsgeocoder.py +++ b/lib/python/heremaps/heremapsgeocoder.py @@ -1,3 +1,6 @@ +#!/usr/local/bin/python +# -*- coding: utf-8 -*- + import json import urllib @@ -6,8 +9,8 @@ from heremapsexceptions import BadGeocodingParams, EmptyGeocoderResponse, NoGeoc class Geocoder: 'A Here Maps Geocoder wrapper for python' - URL_GEOCODE_JSON = 'http://geocoder.cit.api.here.com/6.2/geocode.json' - MAX_RESULTS = 1 + URL_GEOCODE_JSON = 'http://geocoder.api.here.com/6.2/geocode.json' + DEFAULT_MAXRESULTS = 1 ADDRESS_PARAMS = [ 'city', @@ -43,19 +46,31 @@ class Geocoder: app_id = '' app_code = '' + maxresults = '' - def __init__(self, app_id, app_code): + def __init__(self, app_id, app_code, maxresults=DEFAULT_MAXRESULTS): self.app_id = app_id self.app_code = app_code + self.maxresults = maxresults def geocode(self, params): if not set(params.keys()).issubset(set(self.ADDRESS_PARAMS)): raise BadGeocodingParams(params) + response = self.performRequest(params) + + try: + results = response['Response']['View'][0]['Result'] + except IndexError: + raise EmptyGeocoderResponse() + + return results + + def performRequest(self, params): request_params = { 'app_id' : self.app_id, 'app_code' : self.app_code, - 'maxresults' : self.MAX_RESULTS, + 'maxresults' : self.maxresults, 'gen' : '9' } request_params.update(params) @@ -78,12 +93,8 @@ class Geocoder: return self.geocode(params) - def extractLngLatFromResponse(self, response): - view = response['Response']['View'] - - if len(view) is 0: raise EmptyGeocoderResponse() - - location = view[0]['Result'][0]['Location'] + def extractLngLatFromResult(self, result): + location = result['Location'] longitude = location['DisplayPosition']['Longitude'] latitude = location['DisplayPosition']['Latitude'] diff --git a/lib/python/heremaps/tests/__init__.py b/lib/python/heremaps/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/python/heremaps/tests/heremapsgeocoder_tests.py b/lib/python/heremaps/tests/heremapsgeocoder_tests.py new file mode 100644 index 0000000..4819822 --- /dev/null +++ b/lib/python/heremaps/tests/heremapsgeocoder_tests.py @@ -0,0 +1,110 @@ +#!/usr/local/bin/python +# -*- coding: utf-8 -*- + +import unittest + +from heremaps import heremapsgeocoder +from heremaps.heremapsexceptions import BadGeocodingParams, EmptyGeocoderResponse, NoGeocodingParams + +from secrets import * + +class GeocoderTestCase(unittest.TestCase): + EMPTY_RESPONSE = { + "Response":{ + "MetaInfo":{ + "Timestamp":"2015-11-04T16:31:57.273+0000" + }, + "View":[] + } + } + + GOOD_RESPONSE = { + "Response": { + "MetaInfo": { + "Timestamp":"2015-11-04T16:30:32.187+0000" + }, + "View":[{ + "_type":"SearchResultsViewType", + "ViewId":0, + "Result":[{ + "Relevance":0.89, + "MatchLevel":"street", + "MatchQuality":{ + "City":1.0, + "Street":[1.0] + }, + "Location":{ + "LocationId":"NT_yyKB4r3mCWAX4voWgxPcuA", + "LocationType":"address", + "DisplayPosition":{ + "Latitude":40.43433, + "Longitude":-3.70126 + }, + "NavigationPosition":[{ + "Latitude":40.43433, + "Longitude":-3.70126 + }], + "MapView":{ + "TopLeft":{ + "Latitude":40.43493, + "Longitude":-3.70404 + }, + "BottomRight":{ + "Latitude":40.43373, + "Longitude":-3.69873 + } + }, + "Address":{ + "Label":"Calle de Eloy Gonzalo, Madrid (Madrid), España", + "Country":"ESP", + "State":"Comunidad de Madrid", + "County":"Madrid", + "City":"Madrid", + "District":"Trafalgar", + "Street":"Calle de Eloy Gonzalo", + "AdditionalData":[{ + "value":"España", + "key":"CountryName" + }, + { + "value":"Comunidad de Madrid", + "key":"StateName" + }, + { + "value":"Madrid", + "key":"CountyName" + }] + } + } + }] + }] + } + } + + def setUp(self): + self.geocoder = heremapsgeocoder.Geocoder(None, None) + + def test_geocodeAddress_with_valid_params(self): + self.geocoder.performRequest = lambda x: self.GOOD_RESPONSE + response = self.geocoder.geocodeAddress( + searchtext='Calle Eloy Gonzalo 27', + city='Madrid', + country='España') + + def test_geocodeAddress_with_invalid_params(self): + with self.assertRaises(BadGeocodingParams): + self.geocoder.geocodeAddress( + searchtext='Calle Eloy Gonzalo 27', + manolo='escobar') + + def test_geocodeAddress_with_no_params(self): + with self.assertRaises(NoGeocodingParams): + self.geocoder.geocodeAddress() + + def test_geocodeAddress_empty_response(self): + self.geocoder.performRequest = lambda x: self.EMPTY_RESPONSE + with self.assertRaises(EmptyGeocoderResponse): + self.geocoder.geocodeAddress(searchtext='lkajfñlasjfñ') + +if __name__ == '__main__': + main()