Skip to content

Commit

Permalink
Merge pull request #19 from googleartsculture/issue/13/500-error-scipy
Browse files Browse the repository at this point in the history
Catch QhullError
  • Loading branch information
justingrayston authored Aug 4, 2020
2 parents 9e61ddb + deffeac commit 9f37e02
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 0 deletions.
9 changes: 9 additions & 0 deletions src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
from PIL import Image
from PIL.PngImagePlugin import PngImageFile
from scipy.spatial import ConvexHull
from scipy.spatial.qhull import QhullError
from sklearn.cluster import DBSCAN
from werkzeug.exceptions import (BadRequest, Forbidden, HTTPException,
InternalServerError)
Expand All @@ -45,6 +46,10 @@
if DEBUG == 'False' or DEBUG == '0':
DEBUG = False

QHULL_ERROR_MESSAGE = 'Unable to process image do to pixel' + \
' dimensions or geometrical degeneracy. Please use the ' + \
'marquee tool to refine your selection.'

# Pixels limit
pixel_limit = 50000
# Threshold value for DBSCAN
Expand Down Expand Up @@ -757,8 +762,12 @@ def cluster_analysis(payload):
except BadRequest as e:
raise BadRequest(e.description)

except QhullError as e:
raise BadRequest(QHULL_ERROR_MESSAGE)

except Exception as e:
logging.error(e)
logging.traceback.extract_tb(e)
raise InternalServerError('Something went wrong!')


Expand Down
17 changes: 17 additions & 0 deletions src/test/main_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,23 @@ def test_valid_clusteranalysis_requests(self):
self.assertIn('height', cluster.get('bounds'))
self.assertIn('width', cluster.get('bounds'))

def test_scipy_error_is_handled(self):
"""
Asserts that a request with an image that causes
an error is handled (see Issue #13).
"""
json_path = os.path.join(os.path.dirname(__file__),
'scipy_error_request.json')
invalid = open(json_path)
payload = json.load(invalid)
response = self.client.post('/clusteranalysis', json=payload)
self.assertEqual('400 BAD REQUEST', response.status)
data = json.loads(response.data)
self.assertEqual(400, data.get('code'))
self.assertEqual(
main.QHULL_ERROR_MESSAGE,
data.get('message'))

def test_warmup_request_responds_200(self):
"""
Asserts that a reuqest to /_ah/warmup is handled.
Expand Down
5 changes: 5 additions & 0 deletions src/test/scipy_error_request.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"image": "data:image/png;base64,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",
"direction": "ltr",
"threshold": 200
}

0 comments on commit 9f37e02

Please sign in to comment.