Skip to content

Commit 2ca15bb

Browse files
author
Nat Williams
committed
let request objects specify custom body validations
1 parent 6dfa63b commit 2ca15bb

File tree

3 files changed

+37
-7
lines changed

3 files changed

+37
-7
lines changed

pygithub3/requests/base.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@
1717

1818
class Body(object):
1919

20-
def __init__(self, content, schema, required):
20+
def __init__(self, content, valid_body, validate_body=None):
2121
self.content = content
22-
self.schema = schema
23-
self.required = required
22+
self.schema = valid_body['schema']
23+
self.required = valid_body['required']
24+
self.validate_body = validate_body or (lambda x: None)
2425

2526
def dumps(self):
2627
if not self.schema:
@@ -33,6 +34,7 @@ def parse(self):
3334
% self.__class__.__name__)
3435
parsed = dict([(key, self.content[key]) for key in self.schema
3536
if key in self.content])
37+
self.validate_body(parsed)
3638
for attr_required in self.required:
3739
if attr_required not in parsed:
3840
raise ValidationError("'%s' attribute is required" %
@@ -58,7 +60,8 @@ def __init__(self, **kwargs):
5860

5961
def clean(self):
6062
self.uri = self.clean_uri() or self.uri
61-
self.body = Body(self.clean_body(), **self.clean_valid_body())
63+
self.body = Body(self.clean_body(), self.clean_valid_body(),
64+
self.validate_body)
6265

6366
def clean_body(self):
6467
return self.body
@@ -94,6 +97,9 @@ def populate_uri(self):
9497
def get_body(self):
9598
return self.body.dumps()
9699

100+
def validate_body(self, *args):
101+
pass
102+
97103

98104
class Factory(object):
99105
""" Request builder """

pygithub3/tests/requests/test_core.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22
# -*- encoding: utf-8 -*-
33

44
from mock import Mock
5+
from nose.tools import raises
56

67
from pygithub3.tests.utils.core import TestCase
78
from pygithub3.requests.base import Factory, Body, json, Request
89
from pygithub3.exceptions import (UriInvalid, DoesNotExists, ValidationError,
910
InvalidBodySchema)
10-
from pygithub3.tests.utils.base import mock_json, DummyRequest
11+
from pygithub3.tests.utils.base import (mock_json, DummyRequest,
12+
DummyRequestValidation)
1113
from pygithub3.tests.utils.requests import (
1214
RequestWithArgs, RequestCleanedUri, RequestBodyInvalidSchema,
1315
RequestCleanedBody)
@@ -74,7 +76,7 @@ class TestRequestBodyWithSchema(TestCase):
7476

7577
def setUp(self):
7678
valid_body = dict(schema=('arg1', 'arg2'), required=('arg1', ))
77-
self.b = Body({}, **valid_body)
79+
self.b = Body({}, valid_body)
7880

7981
def test_with_body_empty_and_schema_permissive(self):
8082
self.b.schema = ('arg1', 'arg2', '...')
@@ -100,3 +102,14 @@ def test_with_body_as_None(self):
100102
def test_only_valid_keys(self):
101103
self.b.content = dict(arg1='arg1', arg2='arg2', fake='test')
102104
self.assertEqual(self.b.dumps(), dict(arg1='arg1', arg2='arg2'))
105+
106+
107+
class TestBodyValidation(TestCase):
108+
@raises(ValidationError)
109+
def test_with_error(self):
110+
req = DummyRequestValidation(
111+
body={'foo': 'bar', 'error': 'yes'},
112+
)
113+
req.body_schema = {'schema': ('foo',),
114+
'required': ('foo',)}
115+
req.get_body()

pygithub3/tests/utils/base.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from mock import Mock
55

66
from pygithub3.resources.base import Resource
7-
from pygithub3.requests.base import Request
7+
from pygithub3.requests.base import Request, ValidationError
88

99

1010
def mock_json(content):
@@ -37,3 +37,14 @@ def loads_mock(content):
3737
class DummyRequest(Request):
3838
uri = 'dummyrequest'
3939
resource = DummyResource
40+
41+
42+
class DummyRequestValidation(DummyRequest):
43+
body_schema = {
44+
'schema': ('foo', 'error'),
45+
'required': ('foo',)
46+
}
47+
48+
def validate_body(self, body):
49+
if body.get('error') == 'yes':
50+
raise ValidationError('yes')

0 commit comments

Comments
 (0)