Code refactor

This commit is contained in:
Guido Fioravantti 2015-11-05 11:12:10 +01:00
parent af5dc38361
commit 3552f27de7
3 changed files with 43 additions and 19 deletions

View File

@ -16,3 +16,7 @@ class NoGeocodingParams(Exception):
class EmptyGeocoderResponse(Exception): class EmptyGeocoderResponse(Exception):
def __str__(self): def __str__(self):
return repr('The request could not be geocoded') return repr('The request could not be geocoded')
class MalformedResult(Exception):
def __str__(self):
return repr('Result structure is malformed')

View File

@ -7,12 +7,14 @@ import urllib
from heremaps.heremapsexceptions import BadGeocodingParams from heremaps.heremapsexceptions import BadGeocodingParams
from heremaps.heremapsexceptions import EmptyGeocoderResponse from heremaps.heremapsexceptions import EmptyGeocoderResponse
from heremaps.heremapsexceptions import NoGeocodingParams from heremaps.heremapsexceptions import NoGeocodingParams
from heremaps.heremapsexceptions import MalformedResult
class Geocoder: class Geocoder:
'A Here Maps Geocoder wrapper for python' 'A Here Maps Geocoder wrapper for python'
URL_GEOCODE_JSON = 'http://geocoder.api.here.com/6.2/geocode.json' URL_GEOCODE_JSON = 'http://geocoder.api.here.com/6.2/geocode.json'
DEFAULT_MAXRESULTS = 1 DEFAULT_MAXRESULTS = 1
DEFAULT_GEN = 9
ADDRESS_PARAMS = [ ADDRESS_PARAMS = [
'city', 'city',
@ -50,16 +52,17 @@ class Geocoder:
app_code = '' app_code = ''
maxresults = '' maxresults = ''
def __init__(self, app_id, app_code, maxresults=DEFAULT_MAXRESULTS): def __init__(self, app_id, app_code, maxresults=DEFAULT_MAXRESULTS, gen=DEFAULT_GEN):
self.app_id = app_id self.app_id = app_id
self.app_code = app_code self.app_code = app_code
self.maxresults = maxresults self.maxresults = maxresults
self.gen = gen
def geocode(self, params): def geocode(self, params):
if not set(params.keys()).issubset(set(self.ADDRESS_PARAMS)): if not set(params.keys()).issubset(set(self.ADDRESS_PARAMS)):
raise BadGeocodingParams(params) raise BadGeocodingParams(params)
response = self.performRequest(params) response = self.perform_request(params)
try: try:
results = response['Response']['View'][0]['Result'] results = response['Response']['View'][0]['Result']
@ -68,12 +71,12 @@ class Geocoder:
return results return results
def performRequest(self, params): def perform_request(self, params):
request_params = { request_params = {
'app_id' : self.app_id, 'app_id' : self.app_id,
'app_code' : self.app_code, 'app_code' : self.app_code,
'maxresults' : self.maxresults, 'maxresults' : self.maxresults,
'gen' : '9' 'gen' : self.gen
} }
request_params.update(params) request_params.update(params)
@ -86,7 +89,7 @@ class Geocoder:
return response return response
def geocodeAddress(self, **kwargs): def geocode_address(self, **kwargs):
params = {} params = {}
for key, value in kwargs.iteritems(): for key, value in kwargs.iteritems():
if value: params[key] = value if value: params[key] = value
@ -95,8 +98,11 @@ class Geocoder:
return self.geocode(params) return self.geocode(params)
def extractLngLatFromResult(self, result): def extract_lng_lat_from_result(self, result):
try:
location = result['Location'] location = result['Location']
except KeyError:
raise MalformedResult()
longitude = location['DisplayPosition']['Longitude'] longitude = location['DisplayPosition']['Longitude']
latitude = location['DisplayPosition']['Latitude'] latitude = location['DisplayPosition']['Latitude']

View File

@ -7,6 +7,7 @@ from heremaps import heremapsgeocoder
from heremaps.heremapsexceptions import BadGeocodingParams from heremaps.heremapsexceptions import BadGeocodingParams
from heremaps.heremapsexceptions import EmptyGeocoderResponse from heremaps.heremapsexceptions import EmptyGeocoderResponse
from heremaps.heremapsexceptions import NoGeocodingParams from heremaps.heremapsexceptions import NoGeocodingParams
from heremaps.heremapsexceptions import MalformedResult
from secrets import * from secrets import *
@ -86,27 +87,40 @@ class GeocoderTestCase(unittest.TestCase):
def setUp(self): def setUp(self):
self.geocoder = heremapsgeocoder.Geocoder(None, None) self.geocoder = heremapsgeocoder.Geocoder(None, None)
def test_geocodeAddress_with_valid_params(self): def test_geocode_address_with_valid_params(self):
self.geocoder.performRequest = lambda x: self.GOOD_RESPONSE self.geocoder.perform_request = lambda x: self.GOOD_RESPONSE
response = self.geocoder.geocodeAddress( response = self.geocoder.geocode_address(
searchtext='Calle Eloy Gonzalo 27', searchtext='Calle Eloy Gonzalo 27',
city='Madrid', city='Madrid',
country='España') country='España')
def test_geocodeAddress_with_invalid_params(self): def test_geocode_address_with_invalid_params(self):
with self.assertRaises(BadGeocodingParams): with self.assertRaises(BadGeocodingParams):
self.geocoder.geocodeAddress( self.geocoder.geocode_address(
searchtext='Calle Eloy Gonzalo 27', searchtext='Calle Eloy Gonzalo 27',
manolo='escobar') manolo='escobar')
def test_geocodeAddress_with_no_params(self): def test_geocode_address_with_no_params(self):
with self.assertRaises(NoGeocodingParams): with self.assertRaises(NoGeocodingParams):
self.geocoder.geocodeAddress() self.geocoder.geocode_address()
def test_geocodeAddress_empty_response(self): def test_geocode_address_empty_response(self):
self.geocoder.performRequest = lambda x: self.EMPTY_RESPONSE self.geocoder.perform_request = lambda x: self.EMPTY_RESPONSE
with self.assertRaises(EmptyGeocoderResponse): with self.assertRaises(EmptyGeocoderResponse):
self.geocoder.geocodeAddress(searchtext='lkajfñlasjfñ') self.geocoder.geocode_address(searchtext='lkajfñlasjfñ')
def test_extract_lng_lat_from_result(self):
result = self.GOOD_RESPONSE['Response']['View'][0]['Result'][0]
coordinates = self.geocoder.extract_lng_lat_from_result(result)
self.assertEqual(coordinates[0], -3.70126)
self.assertEqual(coordinates[1], 40.43433)
def test_extract_lng_lat_from_result_with_malformed_result(self):
result = {'manolo':'escobar'}
with self.assertRaises(MalformedResult):
self.geocoder.extract_lng_lat_from_result(result)
if __name__ == '__main__': if __name__ == '__main__':
main() main()