Add service configuration (URL, etc) for Here Geocoding

See #343
This commit is contained in:
Javier Goizueta 2017-03-02 17:15:14 +01:00
parent 457858a490
commit 677d2acead
4 changed files with 47 additions and 7 deletions

View File

@ -88,7 +88,7 @@ RETURNS Geometry AS $$
raise Exception('You have reached the limit of your quota') raise Exception('You have reached the limit of your quota')
try: try:
geocoder = HereMapsGeocoder(user_geocoder_config.heremaps_app_id, user_geocoder_config.heremaps_app_code, logger) geocoder = HereMapsGeocoder(user_geocoder_config.heremaps_app_id, user_geocoder_config.heremaps_app_code, logger, user_geocoder_config.heremaps_service_params)
coordinates = geocoder.geocode(searchtext=searchtext, city=city, state=state_province, country=country) coordinates = geocoder.geocode(searchtext=searchtext, city=city, state=state_province, country=country)
if coordinates: if coordinates:
quota_service.increment_success_service_use() quota_service.increment_success_service_use()

View File

@ -52,14 +52,17 @@ class HereMapsGeocoder(Traceable):
'strictlanguagemode' 'strictlanguagemode'
] + ADDRESS_PARAMS ] + ADDRESS_PARAMS
def __init__(self, app_id, app_code, logger, maxresults=DEFAULT_MAXRESULTS, def __init__(self, app_id, app_code, logger, service_params={}, maxresults=DEFAULT_MAXRESULTS):
gen=DEFAULT_GEN, host=PRODUCTION_GEOCODE_JSON_URL): service_params = service_params or {}
self.app_id = app_id self.app_id = app_id
self.app_code = app_code self.app_code = app_code
self._logger = logger self._logger = logger
self.maxresults = maxresults self.maxresults = maxresults
self.gen = gen self.gen = service_params.get('gen', self.DEFAULT_GEN)
self.host = host self.host = service_params.get('json_url', self.PRODUCTION_GEOCODE_JSON_URL)
self.connect_timeout = service_params.get('connect_timeout', self.CONNECT_TIMEOUT)
self.read_timeout = service_params.get('read_timeout', self.READ_TIMEOUT)
self.max_retries = service_params.get('max_retries', self.MAX_RETRIES)
def geocode(self, **kwargs): def geocode(self, **kwargs):
params = {} params = {}
@ -92,9 +95,9 @@ class HereMapsGeocoder(Traceable):
request_params.update(params) request_params.update(params)
# TODO Extract HTTP client wrapper # TODO Extract HTTP client wrapper
session = requests.Session() session = requests.Session()
session.mount(self.host, HTTPAdapter(max_retries=self.MAX_RETRIES)) session.mount(self.host, HTTPAdapter(max_retries=self.max_retries))
response = session.get(self.host, params=request_params, response = session.get(self.host, params=request_params,
timeout=(self.CONNECT_TIMEOUT, self.READ_TIMEOUT)) timeout=(self.connect_timeout, self.read_timeout))
self.add_response_data(response, self._logger) self.add_response_data(response, self._logger)
if response.status_code == requests.codes.ok: if response.status_code == requests.codes.ok:
return json.loads(response.text) return json.loads(response.text)

View File

@ -222,6 +222,7 @@ class IsolinesRoutingConfig(ServiceConfig):
if self._isolines_provider == self.HEREMAPS_PROVIDER: if self._isolines_provider == self.HEREMAPS_PROVIDER:
self._heremaps_app_id = db_config.heremaps_isolines_app_id self._heremaps_app_id = db_config.heremaps_isolines_app_id
self._heremaps_app_code = db_config.heremaps_isolines_app_code self._heremaps_app_code = db_config.heremaps_isolines_app_code
self._heremaps_service_params = db_config.heremaps_isolines_service_params
elif self._isolines_provider == self.MAPZEN_PROVIDER: elif self._isolines_provider == self.MAPZEN_PROVIDER:
self._mapzen_matrix_api_key = self._db_config.mapzen_matrix_api_key self._mapzen_matrix_api_key = self._db_config.mapzen_matrix_api_key
@ -256,6 +257,10 @@ class IsolinesRoutingConfig(ServiceConfig):
def heremaps_app_code(self): def heremaps_app_code(self):
return self._heremaps_app_code return self._heremaps_app_code
@property
def heremaps_service_params(self):
return self._heremaps_service_params
@property @property
def mapzen_matrix_api_key(self): def mapzen_matrix_api_key(self):
return self._mapzen_matrix_api_key return self._mapzen_matrix_api_key
@ -368,6 +373,7 @@ class GeocoderConfig(ServiceConfig):
self._heremaps_app_id = db_config.heremaps_geocoder_app_id self._heremaps_app_id = db_config.heremaps_geocoder_app_id
self._heremaps_app_code = db_config.heremaps_geocoder_app_code self._heremaps_app_code = db_config.heremaps_geocoder_app_code
self._cost_per_hit = db_config.heremaps_geocoder_cost_per_hit self._cost_per_hit = db_config.heremaps_geocoder_cost_per_hit
self._heremaps_service_params = db_config.heremaps_geocoder_service_params
elif self._geocoder_provider == self.GOOGLE_GEOCODER: elif self._geocoder_provider == self.GOOGLE_GEOCODER:
self._google_maps_api_key = filtered_config[self.GOOGLE_GEOCODER_API_KEY] self._google_maps_api_key = filtered_config[self.GOOGLE_GEOCODER_API_KEY]
self._google_maps_client_id = filtered_config[self.GOOGLE_GEOCODER_CLIENT_ID] self._google_maps_client_id = filtered_config[self.GOOGLE_GEOCODER_CLIENT_ID]
@ -428,6 +434,10 @@ class GeocoderConfig(ServiceConfig):
def heremaps_app_code(self): def heremaps_app_code(self):
return self._heremaps_app_code return self._heremaps_app_code
@property
def heremaps_service_params(self):
return self._heremaps_service_params
@property @property
def mapzen_api_key(self): def mapzen_api_key(self):
return self._mapzen_api_key return self._mapzen_api_key
@ -444,6 +454,9 @@ class GeocoderConfig(ServiceConfig):
def provider(self): def provider(self):
return self._geocoder_provider return self._geocoder_provider
@property
def service(self):
return self._service
class ServicesDBConfig: class ServicesDBConfig:
@ -480,8 +493,10 @@ class ServicesDBConfig:
self._heremaps_geocoder_app_code = heremaps_conf['geocoder']['app_code'] self._heremaps_geocoder_app_code = heremaps_conf['geocoder']['app_code']
self._heremaps_geocoder_cost_per_hit = heremaps_conf['geocoder'][ self._heremaps_geocoder_cost_per_hit = heremaps_conf['geocoder'][
'geocoder_cost_per_hit'] 'geocoder_cost_per_hit']
self._heremaps_geocoder_service_params = heremaps_conf['geocoder'].get('service', {})
self._heremaps_isolines_app_id = heremaps_conf['isolines']['app_id'] self._heremaps_isolines_app_id = heremaps_conf['isolines']['app_id']
self._heremaps_isolines_app_code = heremaps_conf['isolines']['app_code'] self._heremaps_isolines_app_code = heremaps_conf['isolines']['app_code']
self._heremaps_isolines_service_params = heremaps_conf['isolines'].get('service', {})
def _get_mapzen_config(self): def _get_mapzen_config(self):
mapzen_conf_json = self._get_conf('mapzen_conf') mapzen_conf_json = self._get_conf('mapzen_conf')
@ -530,6 +545,10 @@ class ServicesDBConfig:
def heremaps_isolines_app_code(self): def heremaps_isolines_app_code(self):
return self._heremaps_isolines_app_code return self._heremaps_isolines_app_code
@property
def heremaps_isolines_service_params(self):
return self._heremaps_isolines_service_params
@property @property
def heremaps_geocoder_app_id(self): def heremaps_geocoder_app_id(self):
return self._heremaps_geocoder_app_id return self._heremaps_geocoder_app_id
@ -542,6 +561,10 @@ class ServicesDBConfig:
def heremaps_geocoder_cost_per_hit(self): def heremaps_geocoder_cost_per_hit(self):
return self._heremaps_geocoder_cost_per_hit return self._heremaps_geocoder_cost_per_hit
@property
def heremaps_geocoder_service_params(self):
return self._heremaps_geocoder_service_params
@property @property
def mapzen_matrix_api_key(self): def mapzen_matrix_api_key(self):
return self._mapzen_matrix_api_key return self._mapzen_matrix_api_key

View File

@ -145,3 +145,17 @@ class HereMapsGeocoderTestCase(unittest.TestCase):
searchtext='Calle amor de dios', searchtext='Calle amor de dios',
city='Cordoba', city='Cordoba',
country='España') country='España')
def test_geocode_with_nonstandard_url(self, req_mock):
geocoder = HereMapsGeocoder(None, None, Mock(), { 'json_url': 'http://nonstandard_here_url' })
req_mock.register_uri('GET', 'http://nonstandard_here_url', text=self.GOOD_RESPONSE)
response = geocoder.geocode(
searchtext='Calle amor de dios',
city='Cordoba',
country='España')
self.assertEqual(response[0], -5.2794)
self.assertEqual(response[1], 37.70246)