diff options
Diffstat (limited to 'pygithub3/requests')
-rw-r--r-- | pygithub3/requests/__init__.py | 136 | ||||
-rw-r--r-- | pygithub3/requests/base.py | 137 | ||||
-rw-r--r-- | pygithub3/requests/repos/__init__.py | 80 | ||||
-rw-r--r-- | pygithub3/requests/repos/collaborators.py | 1 | ||||
-rw-r--r-- | pygithub3/requests/repos/repo.py | 86 | ||||
-rw-r--r-- | pygithub3/requests/users/__init__.py | 32 | ||||
-rw-r--r-- | pygithub3/requests/users/emails.py | 2 | ||||
-rw-r--r-- | pygithub3/requests/users/user.py | 35 |
8 files changed, 247 insertions, 262 deletions
diff --git a/pygithub3/requests/__init__.py b/pygithub3/requests/__init__.py index b369565..dae354a 100644 --- a/pygithub3/requests/__init__.py +++ b/pygithub3/requests/__init__.py @@ -1,137 +1 @@ -#!/usr/bin/env python # -*- encoding: utf-8 -*- - -import re -from importlib import import_module -try: - import simplejson as json -except ImportError: - import json - -from pygithub3.exceptions import (DoesNotExists, UriInvalid, ValidationError, - InvalidBodySchema) -from pygithub3.resources.base import Raw - -ABS_IMPORT_PREFIX = 'pygithub3.requests' - - -class Body(object): - - def __init__(self, content, schema, required): - self.content = content - self.schema = schema - self.required = required - - def dumps(self): - if not self.schema: - return self.content or None - return json.dumps(self.parse()) - - def parse(self): - if not hasattr(self.content, 'items'): - raise ValidationError("'%s' needs a content dictionary" - % self.__class__.__name__) - 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 - - -class Request(object): - """ """ - - uri = '' - resource = Raw - body_schema = {} - - def __init__(self, **kwargs): - """ """ - self.body = kwargs.pop('body', None) - self.args = kwargs - self.clean() - - def clean(self): - self.uri = self.clean_uri() or self.uri - self.body = Body(self.clean_body(), **self.clean_valid_body()) - - def clean_body(self): - return self.body - - 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) - - def __str__(self): - return self.populate_uri() - - def populate_uri(self): - try: - populated_uri = self.uri.format(**self.args) - except KeyError: - raise ValidationError( - "'%s' request wasn't be able to populate the uri '%s' with " - "'%s' args" % (self.__class__.__name__, self.uri, self.args)) - return str(populated_uri).strip('/') - - def get_body(self): - return self.body.dumps() - - -class Factory(object): - """ """ - - import_pattern = re.compile(r'^(\w+\.)+\w+$') - - def __validate(func): - """ """ - - def wrapper(self, request_uri, **kwargs): - if not Factory.import_pattern.match(request_uri): - raise UriInvalid("'%s' isn't valid form" % request_uri) - return func(self, request_uri.lower(), **kwargs) - return wrapper - - def __dispatch(func): - """ """ - - def wrapper(self, request_uri, **kwargs): - module_chunk, s, request_chunk = request_uri.rpartition('.') - try: - # TODO: CamelCase and under_score support, now only Class Name - module = import_module('%s.%s' - % (ABS_IMPORT_PREFIX, module_chunk)) - request = getattr(module, request_chunk.capitalize()) - except ImportError: - raise DoesNotExists("'%s' module does not exists" - % module_chunk) - except AttributeError: - raise DoesNotExists( - "'%s' request doesn't exists into '%s' module" - % (request_chunk.capitalize(), module_chunk)) - return func(self, request, **kwargs) - return wrapper - - @__validate - @__dispatch - def __call__(self, request='', **kwargs): - request = request(**kwargs) - assert isinstance(request, Request) - return request diff --git a/pygithub3/requests/base.py b/pygithub3/requests/base.py new file mode 100644 index 0000000..4b1aa9b --- /dev/null +++ b/pygithub3/requests/base.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +import re +from importlib import import_module +try: + import simplejson as json +except ImportError: + import json + +from pygithub3.exceptions import (DoesNotExists, UriInvalid, ValidationError, + InvalidBodySchema) +from pygithub3.resources.base import Raw + +ABS_IMPORT_PREFIX = 'pygithub3.requests' + + +class Body(object): + + def __init__(self, content, schema, required): + self.content = content + self.schema = schema + self.required = required + + def dumps(self): + if not self.schema: + return self.content or None + return json.dumps(self.parse()) + + def parse(self): + if not hasattr(self.content, 'items'): + raise ValidationError("'%s' needs a content dictionary" + % self.__class__.__name__) + 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 + + +class Request(object): + """ """ + + uri = '' + resource = Raw + body_schema = {} + + def __init__(self, **kwargs): + """ """ + self.body = kwargs.pop('body', None) + self.args = kwargs + self.clean() + + def clean(self): + self.uri = self.clean_uri() or self.uri + self.body = Body(self.clean_body(), **self.clean_valid_body()) + + def clean_body(self): + return self.body + + 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) + + def __str__(self): + return self.populate_uri() + + def populate_uri(self): + try: + populated_uri = self.uri.format(**self.args) + except KeyError: + raise ValidationError( + "'%s' request wasn't be able to populate the uri '%s' with " + "'%s' args" % (self.__class__.__name__, self.uri, self.args)) + return str(populated_uri).strip('/') + + def get_body(self): + return self.body.dumps() + + +class Factory(object): + """ """ + + import_pattern = re.compile(r'^(\w+\.)+\w+$') + + def validate(func): + """ """ + + def wrapper(self, request_uri, **kwargs): + if not Factory.import_pattern.match(request_uri): + raise UriInvalid("'%s' isn't valid form" % request_uri) + return func(self, request_uri.lower(), **kwargs) + return wrapper + + def dispatch(func): + """ """ + + def wrapper(self, request_uri, **kwargs): + module_chunk, s, request_chunk = request_uri.rpartition('.') + try: + # TODO: CamelCase and under_score support, now only Class Name + module = import_module('%s.%s' + % (ABS_IMPORT_PREFIX, module_chunk)) + request = getattr(module, request_chunk.capitalize()) + except ImportError: + raise DoesNotExists("'%s' module does not exists" + % module_chunk) + except AttributeError: + raise DoesNotExists( + "'%s' request doesn't exists into '%s' module" + % (request_chunk.capitalize(), module_chunk)) + return func(self, request, **kwargs) + return wrapper + + @validate + @dispatch + def __call__(self, request='', **kwargs): + request = request(**kwargs) + assert isinstance(request, Request) + return request diff --git a/pygithub3/requests/repos/__init__.py b/pygithub3/requests/repos/__init__.py index bb86dac..5c7785a 100644 --- a/pygithub3/requests/repos/__init__.py +++ b/pygithub3/requests/repos/__init__.py @@ -1,4 +1,80 @@ # -*- encoding: utf-8 -*- -from pygithub3.requests import Request, ValidationError -from repo import * +from ..base import Request, ValidationError +from pygithub3.resources.users import User +from pygithub3.resources.repos import Repo, Team, Tag, Branch + +class List(Request): + + uri = 'users/{user}/repos' + resource = Repo + + def clean_uri(self): + if not self.user: + return 'user/repos' + + +class List_by_org(Request): + + uri = 'orgs/{org}/repos' + resource = Repo + + +class Create(Request): + + uri = 'orgs/{org}/repos' + resource = Repo + body_schema = { + 'schema': ('name', 'description', 'homepage', 'private', 'has_issues', + 'has_wiki', 'has_downloads', 'team_id'), + 'required': ('name', ) + } + + def clean_uri(self): + if not self.org: + return 'user/repos' + + +class Get(Request): + + uri = 'repos/{user}/{repo}' + resource = Repo + + +class Update(Request): + + uri = 'repos/{user}/{repo}' + resource = Repo + body_schema = { + 'schema': ('name', 'description', 'homepage', 'private', 'has_issues', + 'has_wiki', 'has_downloads', 'team_id'), + 'required': ('name', ) + } + + +class List_contributors(Request): + + uri = 'repos/{user}/{repo}/contributors' + resource = User + + +class List_languages(Request): + + uri = 'repos/{user}/{repo}/languages' + + +class List_teams(Request): + + uri = 'repos/{user}/{repo}/teams' + resource = Team + + +class List_tags(Request): + + uri = 'repos/{user}/{repo}/tags' + resource = Tag + +class List_branches(Request): + + uri = 'repos/{user}/{repo}/branches' + resource = Branch diff --git a/pygithub3/requests/repos/collaborators.py b/pygithub3/requests/repos/collaborators.py index c4b5f79..068a9dc 100644 --- a/pygithub3/requests/repos/collaborators.py +++ b/pygithub3/requests/repos/collaborators.py @@ -4,6 +4,7 @@ from . import Request from pygithub3.resources.users import User + class List(Request): uri = 'repos/{user}/{repo}/collaborators' diff --git a/pygithub3/requests/repos/repo.py b/pygithub3/requests/repos/repo.py deleted file mode 100644 index 45375a9..0000000 --- a/pygithub3/requests/repos/repo.py +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env python -# -*- encoding: utf-8 -*- - -from . import Request -from pygithub3.resources.repos import Repo, Team, Tag, Branch -from pygithub3.resources.users import User - -__all__ = ('List', 'List_by_org', 'Create', 'Get', 'Update', - 'List_contributors', 'List_languages', 'List_teams', 'List_tags', - 'List_branches') - - -class List(Request): - - uri = 'users/{user}/repos' - resource = Repo - - def clean_uri(self): - if not self.user: - return 'user/repos' - - -class List_by_org(Request): - - uri = 'orgs/{org}/repos' - resource = Repo - - -class Create(Request): - - uri = 'orgs/{org}/repos' - resource = Repo - body_schema = { - 'schema': ('name', 'description', 'homepage', 'private', 'has_issues', - 'has_wiki', 'has_downloads', 'team_id'), - 'required': ('name', ) - } - - def clean_uri(self): - if not self.org: - return 'user/repos' - - -class Get(Request): - - uri = 'repos/{user}/{repo}' - resource = Repo - - -class Update(Request): - - uri = 'repos/{user}/{repo}' - resource = Repo - body_schema = { - 'schema': ('name', 'description', 'homepage', 'private', 'has_issues', - 'has_wiki', 'has_downloads', 'team_id'), - 'required': ('name', ) - } - - -class List_contributors(Request): - - uri = 'repos/{user}/{repo}/contributors' - resource = User - - -class List_languages(Request): - - uri = 'repos/{user}/{repo}/languages' - - -class List_teams(Request): - - uri = 'repos/{user}/{repo}/teams' - resource = Team - - -class List_tags(Request): - - uri = 'repos/{user}/{repo}/tags' - resource = Tag - -class List_branches(Request): - - uri = 'repos/{user}/{repo}/branches' - resource = Branch diff --git a/pygithub3/requests/users/__init__.py b/pygithub3/requests/users/__init__.py index 11e6a39..d8df00d 100644 --- a/pygithub3/requests/users/__init__.py +++ b/pygithub3/requests/users/__init__.py @@ -1,4 +1,32 @@ # -*- encoding: utf-8 -*- -from pygithub3.requests import Request, ValidationError -from user import * +from ..base import Request, ValidationError +from pygithub3.resources.users import User + + +class Get(Request): + + resource = User + uri = 'users/{user}' + + def clean_uri(self): + if not self.user: + return 'user' + + +class Update(Request): + + resource = User + uri = 'user' + body_schema = { + 'schema': ('name', 'email', 'blog', 'company', 'location', 'hireable', + 'bio'), + 'required': (), + } + + def clean_body(self): + if not self.body: + raise ValidationError("'%s' request needs data. You can use " + "'%s' keys" % (self.__class__.__name__, + self.body_schema)) + return self.body diff --git a/pygithub3/requests/users/emails.py b/pygithub3/requests/users/emails.py index ae4d8b8..ff89b62 100644 --- a/pygithub3/requests/users/emails.py +++ b/pygithub3/requests/users/emails.py @@ -25,7 +25,7 @@ class Add(Request): def clean_body(self): def is_email(email): - return bool(email_re.match(email)) # TODO: email regex ;) + return bool(email_re.match(email)) if not self.body: raise ValidationError("'%s' request needs emails" % (self.__class__.__name__)) diff --git a/pygithub3/requests/users/user.py b/pygithub3/requests/users/user.py deleted file mode 100644 index 3267f76..0000000 --- a/pygithub3/requests/users/user.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python -# -*- encoding: utf-8 -*- - -from . import Request, ValidationError -from pygithub3.resources.users import User - -__all__ = ('Get', 'Update') - - -class Get(Request): - - resource = User - uri = 'users/{user}' - - def clean_uri(self): - if not self.user: - return 'user' - - -class Update(Request): - - resource = User - uri = 'user' - body_schema = { - 'schema': ('name', 'email', 'blog', 'company', 'location', 'hireable', - 'bio'), - 'required': (), - } - - def clean_body(self): - if not self.body: - raise ValidationError("'%s' request needs data. You can use " - "'%s' keys" % (self.__class__.__name__, - self.body_schema)) - return self.body |