Compare commits

..

9 Commits

Author SHA1 Message Date
Javier Goizueta
dc0b3191f6 Merge pull request #549 from CartoDB/development
Release python-0.21.3
2019-03-05 11:59:21 +01:00
Javier Goizueta
6a57a85e72 Release new python lib version 0.21.3 2019-03-05 11:55:40 +01:00
Javier Goizueta
08a50c14bb Merge pull request #548 from CartoDB/tomtom-qps
Pass the response through the exception object
2019-03-05 11:51:25 +01:00
Javier Goizueta
ec2fe14ed3 Pass http response to ServiceException 2019-03-05 11:33:25 +01:00
Javier Goizueta
305b010225 Pass the response through the exception object 2019-03-05 11:12:58 +01:00
Javier Goizueta
885c7c50fb Merge pull request #547 from CartoDB/development
Release python-0.21.2
2019-03-04 18:48:55 +01:00
Javier Goizueta
a38c5b275d Merge pull request #546 from CartoDB/545-tomtom-qps
Detect alternative TomTom rate limit header
2019-03-04 18:26:43 +01:00
Javier Goizueta
45542b2f28 Release new python lib version 2019-03-04 18:25:25 +01:00
Javier Goizueta
f0a9779a8d Detect alternative TomTom rate limit header
Also flexibilizes detection by making it case-insensitive and allowing for text around the message
Fixes 545
2019-03-04 15:43:22 +01:00
4 changed files with 29 additions and 13 deletions

10
NEWS.md
View File

@@ -1,3 +1,13 @@
Mar 5th, 2019
==============
* Version `0.21.3` of the python library
* Fixed TomTom Qps respondes part 2 (#546)
Mar 4th, 2019
==============
* Version `0.21.2` of the python library
* Fixed TomTom Qps responses (#546)
Feb 25th, 2019
==============
* Version `0.26.2` of the client extension

View File

@@ -73,12 +73,12 @@ class TomTomGeocoder(Traceable):
@qps_retry(qps=5, provider='tomtom')
def geocode(self, searchtext, city=None, state_province=None,
country=None):
response = self.geocode_meta(searchtext, city, state_province, country)
error_message = response[1].get('error', None)
geocoder_response, http_response = self.geocode_meta(searchtext, city, state_province, country)
error_message = geocoder_response[1].get('error', None)
if error_message:
raise ServiceException(error_message, None)
raise ServiceException(error_message, http_response)
else:
return response[0]
return geocoder_response[0]
@qps_retry(qps=5, provider='tomtom')
def geocode_meta(self, searchtext, city=None, state_province=None,
@@ -93,7 +93,7 @@ class TomTomGeocoder(Traceable):
country = country.decode('utf-8')
if not self._validate_input(searchtext, city, state_province, country):
return EMPTY_RESPONSE
return (EMPTY_RESPONSE, None)
address = []
if searchtext and searchtext.strip():
@@ -107,18 +107,18 @@ class TomTomGeocoder(Traceable):
try:
response = requests.get(uri)
return self._parse_response(response.status_code, response.text)
return (self._parse_response(response.status_code, response.text), response)
except requests.Timeout as te:
# In case of timeout we want to stop the job because the server
# could be down
msg = 'Timeout connecting to TomTom geocoding server'
self._logger.error(msg, te)
return geocoder_error_response(msg)
return (geocoder_error_response(msg), None)
except requests.ConnectionError as ce:
# Don't raise the exception to continue with the geocoding job
self._logger.error('Error connecting to TomTom geocoding server',
exception=ce)
return EMPTY_RESPONSE
return (EMPTY_RESPONSE, None)
def _parse_response(self, status_code, text):
if status_code == requests.codes.ok:

View File

@@ -2,13 +2,17 @@ import time
import random
from datetime import datetime
from exceptions import TimeoutException
import re
DEFAULT_RETRY_TIMEOUT = 60
DEFAULT_QUERIES_PER_SECOND = 10
TOMTOM_403_RATE_LIMIT_HEADER = 'Account Over Queries Per Second Limit'
TOMTOM_403_RATE_LIMIT_HEADERS = [
'Account Over Queries Per Second Limit',
'Developer Over Qps'
]
TOMTOM_DETAIL_HEADER = 'X-Error-Detail-Header'
TOMTOM_403_RATE_LIMIT_HEADER_PATTERN = re.compile('|'.join(TOMTOM_403_RATE_LIMIT_HEADERS), re.IGNORECASE)
def qps_retry(original_function=None, **options):
""" Query Per Second retry decorator
@@ -49,9 +53,11 @@ class QPSService:
response = getattr(e, 'response', None)
if response is not None:
if self._provider is not None and self._provider == 'tomtom' and (response.status_code == 403):
if response.headers.get(TOMTOM_DETAIL_HEADER) != TOMTOM_403_RATE_LIMIT_HEADER:
detail_header = response.headers.get(TOMTOM_DETAIL_HEADER)
if detail_header and TOMTOM_403_RATE_LIMIT_HEADER_PATTERN.search(detail_header):
self.retry(start_time, attempt_number)
else:
raise e
self.retry(start_time, attempt_number)
elif response.status_code == 429:
self.retry(start_time, attempt_number)
else:

View File

@@ -10,7 +10,7 @@ from setuptools import setup, find_packages
setup(
name='cartodb_services',
version='0.21.1',
version='0.21.3',
description='CartoDB Services API Python Library',