Skip to content

Commit ff6e773

Browse files
authored
Merge pull request #4 from trustpilot/add-booleans
Add booleans
2 parents ed6fbc8 + 5a8f89d commit ff6e773

File tree

5 files changed

+48
-4
lines changed

5 files changed

+48
-4
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
__pycache__
2+
.python-version
3+
.cache
4+
.pytest_cache

HISTORY.rst

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,9 @@ History
1515
1.1.0(2018-03-01)
1616
------------------
1717

18-
* request can be renamed and even type-annotated
18+
* request can be renamed and even type-annotated
19+
20+
1.2.0 (2018-03-01)
21+
------------------
22+
23+
* added support for boolean parameters

sanicargs/__init__.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,34 @@ def __parse_datetime(str):
1515
# attempt full date time, but tolerate just a date
1616
try:
1717
return datetime.datetime.strptime(str, '%Y-%m-%dT%H:%M:%S')
18-
except:
18+
except Exception:
1919
pass
2020
return datetime.datetime.strptime(str, '%Y-%m-%d')
2121

22+
2223
def __parse_date(str):
2324
return datetime.datetime.strptime(str, '%Y-%m-%d').date()
2425

26+
27+
def __parse_bool(str):
28+
lower = str.lower()
29+
if lower == 'true':
30+
return True
31+
if lower == 'false':
32+
return False
33+
raise ValueError("Can't parse {} as boolean".format(str))
34+
35+
2536
__type_deserializers = {
37+
bool: __parse_bool,
2638
int: int,
2739
str: str,
2840
datetime.datetime: __parse_datetime,
2941
datetime.date: __parse_date,
3042
List[str]: lambda s: s.split(',')
3143
}
3244

45+
3346
def parse_query_args(func):
3447
'''parses query args and validates, deserializes them
3548
VERY IMPORTANT!:
@@ -82,4 +95,4 @@ async def inner(request, *old_args, **route_parameters):
8295
})
8396
return abort(400, 'Bad or missing value for %s' % name)
8497
return await func(request, **kwargs)
85-
return inner
98+
return inner

sanicargs/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '1.1.0'
1+
__version__ = '1.2.0'

tests/test_sanicargs.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ async def test_int(request, test: int):
2424
async def test_str(request, test: str):
2525
return response.json({'test': test})
2626

27+
@app.route("/bool", methods=['GET'])
28+
@parse_query_args
29+
async def test_bool(request, test: bool):
30+
return response.json({'test': test})
31+
2732
@app.route("/datetime", methods=['GET'])
2833
@parse_query_args
2934
async def test_datetime(request, test: datetime.datetime):
@@ -90,6 +95,23 @@ async def test_parse_int_fail(test_cli):
9095
assert resp.status == 400
9196

9297

98+
async def test_parse_bool_true_success(test_cli):
99+
resp = await test_cli.get('/bool?test=true')
100+
assert resp.status == 200
101+
resp_json = await resp.json()
102+
assert resp_json == {'test': True }
103+
104+
async def test_parse_bool_false_success(test_cli):
105+
resp = await test_cli.get('/bool?test=false')
106+
assert resp.status == 200
107+
resp_json = await resp.json()
108+
assert resp_json == {'test': False }
109+
110+
async def test_parse_bool_fail(test_cli):
111+
resp = await test_cli.get('/bool?test=not an bool')
112+
assert resp.status == 400
113+
114+
93115
async def test_parse_str_success(test_cli):
94116
resp = await test_cli.get('/str?test=hello')
95117
assert resp.status == 200

0 commit comments

Comments
 (0)