aboutsummaryrefslogtreecommitdiffstats
path: root/pygithub3/requests
diff options
context:
space:
mode:
Diffstat (limited to 'pygithub3/requests')
-rw-r--r--pygithub3/requests/__init__.py34
-rw-r--r--pygithub3/requests/users/keys.py10
-rw-r--r--pygithub3/requests/users/user.py7
3 files changed, 39 insertions, 12 deletions
diff --git a/pygithub3/requests/__init__.py b/pygithub3/requests/__init__.py
index 2209fc5..a734895 100644
--- a/pygithub3/requests/__init__.py
+++ b/pygithub3/requests/__init__.py
@@ -8,7 +8,8 @@ try:
except ImportError:
import json
-from pygithub3.exceptions import DoesNotExists, UriInvalid, ValidationError
+from pygithub3.exceptions import (DoesNotExists, UriInvalid, ValidationError,
+ InvalidBodySchema)
from pygithub3.resources.base import Raw
ABS_IMPORT_PREFIX = 'pygithub3.requests'
@@ -16,9 +17,10 @@ ABS_IMPORT_PREFIX = 'pygithub3.requests'
class Body(object):
- def __init__(self, content, schema):
+ def __init__(self, content, schema, required):
self.content = content
self.schema = schema
+ self.required = required
def dumps(self):
if not self.content:
@@ -26,13 +28,19 @@ class Body(object):
return json.dumps(self.parse())
def parse(self):
- if not self.schema:
- return self.content
- if not hasattr(self.content, 'items'):
+ if self.schema and not hasattr(self.content, 'items'):
raise ValidationError("'%s' needs a content dictionary"
% self.__class__.__name__)
- return {key: self.content[key] for key in self.schema
+ parsed = {key: self.content[key] for key in self.schema
if key in self.content}
+ for attr_required in self.required:
+ if attr_required not in parsed:
+ raise ValidationError("'%s' attribute is required" %
+ attr_required)
+ if not parsed[attr_required]:
+ raise ValidationError("'%s' attribute can't be empty" %
+ attr_required)
+ return parsed or self.content
class Request(object):
@@ -40,7 +48,7 @@ class Request(object):
uri = ''
resource = Raw
- body_schema = ()
+ body_schema = {}
def __init__(self, **kwargs):
""" """
@@ -50,7 +58,7 @@ class Request(object):
def clean(self):
self.uri = self.clean_uri() or self.uri
- self.body = Body(self.clean_body(), self.body_schema)
+ self.body = Body(self.clean_body(), **self.clean_valid_body())
def clean_body(self):
return self.body
@@ -58,6 +66,16 @@ class Request(object):
def clean_uri(self):
return None
+ def clean_valid_body(self):
+ schema = set(self.body_schema.get('schema', ()))
+ required = set(self.body_schema.get('required', ()))
+ if not required.issubset(schema):
+ raise InvalidBodySchema(
+ "'%s:valid_body' attribute is invalid. "
+ "'%s required' isn't a subset of '%s schema'" % (
+ self.__class__.__name__, required, schema))
+ return dict(schema=schema, required=required)
+
def __getattr__(self, name):
return self.args.get(name)
diff --git a/pygithub3/requests/users/keys.py b/pygithub3/requests/users/keys.py
index 9afa3cd..23a30d9 100644
--- a/pygithub3/requests/users/keys.py
+++ b/pygithub3/requests/users/keys.py
@@ -21,13 +21,19 @@ class Add(Request):
resource = Key
uri = 'user/keys'
- body_schema = ('title', 'key')
+ body_schema = {
+ 'schema': ('title', 'key'),
+ 'required': ('title', 'key')
+ }
class Update(Request):
resource = Key
- body_schema = ('title', 'key')
+ body_schema = {
+ 'schema': ('title', 'key'),
+ 'required': ('title', 'key')
+ }
uri = 'user/keys/{key_id}'
diff --git a/pygithub3/requests/users/user.py b/pygithub3/requests/users/user.py
index 740b3dd..3267f76 100644
--- a/pygithub3/requests/users/user.py
+++ b/pygithub3/requests/users/user.py
@@ -21,8 +21,11 @@ class Update(Request):
resource = User
uri = 'user'
- body_schema = (
- 'name', 'email', 'blog', 'company', 'location', 'hireable', 'bio')
+ body_schema = {
+ 'schema': ('name', 'email', 'blog', 'company', 'location', 'hireable',
+ 'bio'),
+ 'required': (),
+ }
def clean_body(self):
if not self.body: