Skip to content

Commit 93235e1

Browse files
Better error handling
1 parent 0ff8589 commit 93235e1

File tree

3 files changed

+41
-20
lines changed

3 files changed

+41
-20
lines changed

mfr/extensions/tabular/libs/stdlib_tools.py

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import re
22
import csv
3+
from http import HTTPStatus
34

45
from mfr.extensions.tabular import utilities
5-
from mfr.extensions.tabular.exceptions import EmptyTableError, TabularRendererError
6+
from mfr.extensions.tabular.exceptions import (EmptyTableError,
7+
TabularRendererError)
68

79

810
def csv_stdlib(fp):
@@ -42,35 +44,48 @@ def parse_stdlib(reader):
4244
"""
4345
columns = []
4446
# update the reader field names to avoid duplicate column names when performing row extraction
45-
for idx, fieldname in enumerate(reader.fieldnames or []):
46-
column_count = sum(1 for column in columns if fieldname == column['name'])
47-
if column_count:
48-
unique_fieldname = '{}-{}'.format(fieldname, column_count + 1)
49-
reader.fieldnames[idx] = unique_fieldname
50-
else:
51-
unique_fieldname = fieldname
52-
columns.append({
53-
'id': unique_fieldname,
54-
'field': unique_fieldname,
55-
'name': fieldname,
56-
'sortable': True,
57-
})
58-
5947
try:
48+
for idx, fieldname in enumerate(reader.fieldnames or []):
49+
column_count = sum(1 for column in columns if fieldname == column['name'])
50+
if column_count:
51+
unique_fieldname = '{}-{}'.format(fieldname, column_count + 1)
52+
reader.fieldnames[idx] = unique_fieldname
53+
else:
54+
unique_fieldname = fieldname
55+
columns.append({
56+
'id': unique_fieldname,
57+
'field': unique_fieldname,
58+
'name': fieldname,
59+
'sortable': True,
60+
})
61+
6062
rows = [row for row in reader]
6163
except csv.Error as e:
6264
if any("field larger than field limit" in errorMsg for errorMsg in e.args):
6365
raise TabularRendererError(
6466
'This file contains a field too large to render. '
6567
'Please download and view it locally.',
66-
code=400,
68+
code=HTTPStatus.BAD_REQUEST,
6769
extension='csv',
6870
) from e
6971
else:
70-
raise TabularRendererError('csv.Error: {}'.format(e), extension='csv') from e
72+
raise TabularRendererError('Cannot render file as csv/tsv. '
73+
'The file may be empty or corrupt',
74+
code=HTTPStatus.BAD_REQUEST,
75+
extension='csv') from e
76+
77+
# Outside other except because the `if any` line causes more errors to be raised
78+
# on certain exceptions
79+
except Exception as e:
80+
raise TabularRendererError('Cannot render file as csv/tsv. '
81+
'The file may be empty or corrupt',
82+
code=HTTPStatus.BAD_REQUEST,
83+
extension='csv') from e
7184

7285
if not columns and not rows:
73-
raise EmptyTableError('Table empty or corrupt.', extension='csv')
86+
raise EmptyTableError('Cannot render file as csv/tsv. '
87+
'The file may be empty or corrupt',
88+
code=HTTPStatus.BAD_REQUEST, extension='csv')
7489

7590
return {'Sheet 1': (columns, rows)}
7691

9.76 KB
Binary file not shown.

tests/extensions/tabular/test_stdlib_tools.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
import pytest
55

66
from mfr.extensions.tabular.libs import stdlib_tools
7-
from mfr.extensions.tabular.exceptions import EmptyTableError
8-
7+
from mfr.extensions.tabular.exceptions import(EmptyTableError,
8+
TabularRendererError)
99

1010
BASE = os.path.dirname(os.path.abspath(__file__))
1111

@@ -49,3 +49,9 @@ def test_csv_stdlib_exception_raises(self):
4949
with pytest.raises(EmptyTableError) as e:
5050
stdlib_tools.tsv_stdlib(fp)
5151
assert e.value.code == 400
52+
53+
def test_csv_stdlib_other_exception_raises(self):
54+
with open(os.path.join(BASE, 'files', 'invalid_null.csv')) as fp:
55+
with pytest.raises(TabularRendererError) as e:
56+
stdlib_tools.tsv_stdlib(fp)
57+
assert e.value.code == 400

0 commit comments

Comments
 (0)