aboutsummaryrefslogtreecommitdiffstats
path: root/pygithub3/requests
diff options
context:
space:
mode:
Diffstat (limited to 'pygithub3/requests')
-rw-r--r--pygithub3/requests/base.py26
-rw-r--r--pygithub3/requests/pull_requests/__init__.py66
-rw-r--r--pygithub3/requests/pull_requests/comments.py43
3 files changed, 125 insertions, 10 deletions
diff --git a/pygithub3/requests/base.py b/pygithub3/requests/base.py
index 03b0f8a..d3e18a3 100644
--- a/pygithub3/requests/base.py
+++ b/pygithub3/requests/base.py
@@ -7,8 +7,8 @@ try:
except ImportError:
import json
-from pygithub3.exceptions import (DoesNotExists, UriInvalid, ValidationError,
- InvalidBodySchema)
+from pygithub3.exceptions import (RequestDoesNotExist, UriInvalid,
+ ValidationError, InvalidBodySchema)
from pygithub3.resources.base import Raw
from pygithub3.core.utils import import_module
@@ -17,10 +17,11 @@ ABS_IMPORT_PREFIX = 'pygithub3.requests'
class Body(object):
- def __init__(self, content, schema, required):
+ def __init__(self, content, valid_body, validate_body=None):
self.content = content
- self.schema = schema
- self.required = required
+ self.schema = valid_body['schema']
+ self.required = valid_body['required']
+ self.validate_body = validate_body or (lambda x: None)
def dumps(self):
if not self.schema:
@@ -33,6 +34,7 @@ class Body(object):
% self.__class__.__name__)
parsed = dict([(key, self.content[key]) for key in self.schema
if key in self.content])
+ self.validate_body(parsed)
for attr_required in self.required:
if attr_required not in parsed:
raise ValidationError("'%s' attribute is required" %
@@ -58,7 +60,8 @@ class Request(object):
def clean(self):
self.uri = self.clean_uri() or self.uri
- self.body = Body(self.clean_body(), **self.clean_valid_body())
+ self.body = Body(self.clean_body(), self.clean_valid_body(),
+ self.validate_body)
def clean_body(self):
return self.body
@@ -94,6 +97,9 @@ class Request(object):
def get_body(self):
return self.body.dumps()
+ def validate_body(self, *args):
+ pass
+
class Factory(object):
""" Request builder """
@@ -120,11 +126,11 @@ class Factory(object):
% (ABS_IMPORT_PREFIX, module_chunk))
request = getattr(module, request_chunk)
except ImportError:
- raise DoesNotExists("'%s' module does not exists"
- % module_chunk)
+ raise RequestDoesNotExist("'%s' module does not exist"
+ % module_chunk)
except AttributeError:
- raise DoesNotExists(
- "'%s' request doesn't exists into '%s' module"
+ raise RequestDoesNotExist(
+ "'%s' request does not exist in '%s' module"
% (request_chunk, module_chunk))
return func(self, request, **kwargs)
return wrapper
diff --git a/pygithub3/requests/pull_requests/__init__.py b/pygithub3/requests/pull_requests/__init__.py
new file mode 100644
index 0000000..bd03f3e
--- /dev/null
+++ b/pygithub3/requests/pull_requests/__init__.py
@@ -0,0 +1,66 @@
+from pygithub3.requests.base import Request, ValidationError
+from pygithub3.resources.base import Raw
+from pygithub3.resources.pull_requests import PullRequest, File
+from pygithub3.resources.repos import Commit
+
+
+class List(Request):
+ uri = 'repos/{user}/{repo}/pulls'
+ resource = PullRequest
+
+
+class Get(Request):
+ uri = 'repos/{user}/{repo}/pulls/{number}'
+ resource = PullRequest
+
+
+class Create(Request):
+ uri = 'repos/{user}/{repo}/pulls'
+ resource = PullRequest
+ body_schema = {
+ 'schema': ('title', 'body', 'base', 'head', 'issue'),
+ 'required': ('base', 'head'),
+ }
+
+ def validate_body(self, parsed):
+ if (not ('title' in parsed and 'body' in parsed) and
+ not 'issue' in parsed):
+ raise ValidationError('pull request creation requires either an '
+ 'issue number or a title and body')
+
+class Update(Request):
+ uri = 'repos/{user}/{repo}/pulls/{number}'
+ resource = PullRequest
+ body_schema = {
+ 'schema': ('title', 'body', 'state'),
+ 'required': (),
+ }
+
+ def validate_body(self, body):
+ if 'state' in body and body['state'] not in ['open', 'closed']:
+ raise ValidationError('If a state is specified, it must be one '
+ 'of "open" or "closed"')
+
+
+class List_commits(Request):
+ uri = 'repos/{user}/{repo}/pulls/{number}/commits'
+ resource = Commit
+
+
+class List_files(Request):
+ uri = 'repos/{user}/{repo}/pulls/{number}/files'
+ resource = File
+
+
+class Merge_status(Request):
+ uri = 'repos/{user}/{repo}/pulls/{number}/merge'
+ resource = Raw
+
+
+class Merge(Request):
+ uri = 'repos/{user}/{repo}/pulls/{number}/merge'
+ resource = Raw
+ body_schema = {
+ 'schema': ('commit_message',),
+ 'required': (),
+ }
diff --git a/pygithub3/requests/pull_requests/comments.py b/pygithub3/requests/pull_requests/comments.py
new file mode 100644
index 0000000..fa1e5b6
--- /dev/null
+++ b/pygithub3/requests/pull_requests/comments.py
@@ -0,0 +1,43 @@
+from pygithub3.requests.base import Request
+from pygithub3.resources.pull_requests import Comment
+
+
+class List(Request):
+ uri = 'repos/{user}/{repo}/pulls/{number}/comments'
+ resource = Comment
+
+
+class Get(Request):
+ uri = 'repos/{user}/{repo}/pulls/comments/{number}'
+ resource = Comment
+
+
+class Create(Request):
+ uri = 'repos/{user}/{repo}/pulls/{number}/comments'
+ resource = Comment
+ body_schema = {
+ 'schema': ('body', 'commit_id', 'path', 'position', 'in_reply_to'),
+ 'required': ('body',),
+ }
+
+ def validate_body(self, body):
+ if (not ('commit_id' in body and
+ 'path' in body and
+ 'position' in body) and
+ not 'in_reply_to' in body):
+ raise ValidationError('supply either in_reply_to or commit_id, '
+ 'path, and position')
+
+
+class Edit(Request):
+ uri = 'repos/{user}/{repo}/pulls/comments/{number}'
+ resource = Comment
+ body_schema = {
+ 'schema': ('body',),
+ 'required': ('body',),
+ }
+
+
+class Delete(Request):
+ uri = 'repos/{user}/{repo}/pulls/comments/{number}'
+ resource = Comment