Skip to content

Commit ebfc086

Browse files
committed
improve errors handling in api/diff
1 parent 01864a9 commit ebfc086

File tree

2 files changed

+26
-17
lines changed

2 files changed

+26
-17
lines changed

api.py

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
from flask import Flask, Response, jsonify, render_template, request
2020

21-
from nested_diff import Differ, Patcher, TYPE_HANDLERS
21+
from nested_diff import Differ, Patcher
2222
from nested_diff.formatters import HtmlFormatter, TextFormatter, TermFormatter
2323
from nested_diff.handlers import TextHandler
2424

@@ -74,26 +74,23 @@ def health_check():
7474
@app.route('/api/v1/diff', methods=['POST'])
7575
def diff():
7676
try:
77-
diff_opts = request.json.get('diff_opts', {'U': False})
78-
except AttributeError:
79-
return Response('Object expected', status=400)
77+
old = request.json.get('a', None)
78+
new = request.json.get('b', None)
79+
except Exception:
80+
return Response('Bad request', status=400)
8081

81-
extra_handlers = []
82+
try:
83+
diff_opts = request.json.get('diff_opts', {'U': False})
84+
text_diff_ctx = diff_opts.pop('text_diff_ctx', -1)
8285

83-
text_diff_ctx = diff_opts.pop('text_diff_ctx', -1)
84-
if text_diff_ctx >= 0:
85-
extra_handlers.append(TextHandler(context=text_diff_ctx))
86+
differ = Differ(**diff_opts)
8687

87-
try:
88-
_, diff = Differ(
89-
handlers=TYPE_HANDLERS + tuple(extra_handlers),
90-
**diff_opts,
91-
).diff(
92-
request.json.get('a', None),
93-
request.json.get('b', None),
94-
)
88+
if text_diff_ctx >= 0:
89+
differ.set_handler(TextHandler(context=text_diff_ctx))
9590
except Exception:
96-
return Response('Incorrect options', status=400)
91+
return Response('Incorrect diff options', status=400)
92+
93+
_, diff = differ.diff(old, new)
9794

9895
ofmt = request.json.get('ofmt', 'json')
9996
if ofmt == 'json':

tests/test_api_diff.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@ def test_invalid_request(client):
22
rv = client.post('/api/v1/diff', json=['garbage'])
33

44
assert rv.status_code == 400
5+
assert rv.data == b'Bad request'
6+
7+
8+
def test_invalid_diff_opts(client):
9+
rv = client.post('/api/v1/diff', json={
10+
'a': 'a',
11+
'b': 'b',
12+
'diff_opts': {'__unsupported__': True},
13+
})
14+
15+
assert rv.status_code == 400
16+
assert rv.data == b'Incorrect diff options'
517

618

719
def test_default(client):

0 commit comments

Comments
 (0)