Code refactor
This commit is contained in:
parent
af5dc38361
commit
3552f27de7
@ -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')
|
||||||
|
@ -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']
|
||||||
|
@ -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()
|
||||||
|
Loading…
Reference in New Issue
Block a user