diff options
Diffstat (limited to 'pygithub3')
16 files changed, 278 insertions, 178 deletions
diff --git a/pygithub3/core/client.py b/pygithub3/core/client.py index 83d2d79..b4f276c 100644 --- a/pygithub3/core/client.py +++ b/pygithub3/core/client.py @@ -62,37 +62,37 @@ class Client(object): def __parse_kwargs(func): """ Decorator to put extra args into requests.params """ - def wrapper(self, verb, resource, **kwargs): + def wrapper(self, verb, request, **kwargs): diffs = kwargs.viewkeys() - VALID_REQUEST_ARGS new_params = kwargs.get('params', {}) for key in diffs: # Put each key in new_params and delete it new_params[key] = kwargs[key] del kwargs[key] kwargs['params'] = new_params - return func(self, verb, resource, **kwargs) + return func(self, verb, request, **kwargs) return wrapper @__parse_kwargs - def request(self, verb, resource, **kwargs): - resource = "%s%s" % (self.config['base_url'], resource) - response = self.requester.request(verb, resource, **kwargs) + def request(self, verb, request, **kwargs): + request = "%s%s" % (self.config['base_url'], request) + response = self.requester.request(verb, request, **kwargs) GithubError(response).process() return response - def get(self, resource, **kwargs): - return self.request('get', resource, **kwargs) + def get(self, request, **kwargs): + return self.request('get', request, **kwargs) - def post(self, resource, **kwargs): - return self.request('post', resource, **kwargs) + def post(self, request, **kwargs): + return self.request('post', request, **kwargs) - def patch(self, resource, **kwargs): - return self.request('patch', resource, **kwargs) + def patch(self, request, **kwargs): + return self.request('patch', request, **kwargs) - def put(self, resource, **kwargs): - return self.request('put', resource, **kwargs) + def put(self, request, **kwargs): + return self.request('put', request, **kwargs) - def delete(self, resource, **kwargs): - return self.request('delete', resource, **kwargs) + def delete(self, request, **kwargs): + return self.request('delete', request, **kwargs) - def head(self, resource, **kwargs): - return self.request('head', resource, **kwargs) + def head(self, request, **kwargs): + return self.request('head', request, **kwargs) diff --git a/pygithub3/core/ghrequests/__init__.py b/pygithub3/core/ghrequests/__init__.py new file mode 100644 index 0000000..b3b7c28 --- /dev/null +++ b/pygithub3/core/ghrequests/__init__.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +import re +from importlib import import_module +try: + import simplejson as json +except ImportError: + import json + +ABS_IMPORT_PREFIX = 'pygithub3.core.ghrequests' + + +class RequestNotFound(Exception): + pass + + +class RequestUriInvalid(Exception): + pass + + +class Request(object): + """ """ + + def __init__(self, args): + """ """ + self.args = args + self.validate() + self.uri = self.set_uri() + + def validate(self, args): + raise NotImplementedError + + def set_uri(self): + raise NotImplementedError + + def get_uri(self): + return str(self.uri).strip('/') + + def get_resource(self): + return getattr(self, 'resource', '') + + def __getattr__(self, name): + return self.args.get(name) + + def __str__(self): + return self.get_uri() + + +class Factory(object): + """ """ + + import_pattern = re.compile(r'^(\w+\.)+\w+$') + + def __init__(self): + """ """ + self.args = {} + + def config_with(self, **kwargs): + self.args = kwargs + + def clear_config(self): + self.args = {} + + def __validate(func): + """ """ + + def wrapper(self, request_uri): + if not Factory.import_pattern.match(request_uri): + raise RequestUriInvalid("'%s' isn't valid form" % request_uri) + return func(self, request_uri.lower()) + return wrapper + + def __dispatch(func): + """ """ + + def wrapper(self, request_uri): + 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 RequestNotFound("'%s' module does not exists" + % module_chunk) + except AttributeError: + raise RequestNotFound( + "'%s' request doesn't exists into '%s' module" + % (request_chunk.capitalize(), module_chunk)) + return func(self, request) + return wrapper + + @__validate + @__dispatch + def __call__(self, request=''): + request = request(self.args) + assert isinstance(request, Request) + return request diff --git a/pygithub3/core/resources/users/__init__.py b/pygithub3/core/ghrequests/users/__init__.py index 84759a2..08986f6 100644 --- a/pygithub3/core/resources/users/__init__.py +++ b/pygithub3/core/ghrequests/users/__init__.py @@ -1,4 +1,4 @@ # -*- encoding: utf-8 -*- -from pygithub3.core.resources import Resource +from pygithub3.core.ghrequests import Request from user import * diff --git a/pygithub3/core/ghrequests/users/emails.py b/pygithub3/core/ghrequests/users/emails.py new file mode 100644 index 0000000..991abc6 --- /dev/null +++ b/pygithub3/core/ghrequests/users/emails.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +from . import Request, json +from pygithub3.resources.base import Raw + + +class List(Request): + + resource = Raw + + def validate(self): + pass + + def set_uri(self): + return 'user/emails' + +class Add(Request): + + resource = Raw + + def validate(self): + pass + + def get_data(self): + return json.dumps(self.emails) + + def set_uri(self): + return 'user/emails' + +class Delete(Request): + + resource = Raw + + def validate(self): + pass + + def get_data(self): + return json.dumps(self.emails) + + def set_uri(self): + return 'user/emails' diff --git a/pygithub3/core/ghrequests/users/followers.py b/pygithub3/core/ghrequests/users/followers.py new file mode 100644 index 0000000..e71313d --- /dev/null +++ b/pygithub3/core/ghrequests/users/followers.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +from . import Request +from pygithub3.resources.users import User + +__all__ = ('List',) + + +class List(Request): + + resource = User + + def validate(self): + pass + + def set_uri(self): + if self.user: + return 'users/%s/followers' % self.user + else: + return 'user/followers' + + +class Listfollowing(Request): + + resource = User + + def validate(self): + pass + + def set_uri(self): + if self.user: + return 'users/%s/following' % self.user + else: + return 'user/following' + +class Unfollow(Request): + + resource = User + + def validate(self): + if not self.user: + raise Exception('unfollow ened user') # TODO: validate exception + + def set_uri(self): + return 'user/following/%s' % self.user diff --git a/pygithub3/core/resources/users/keys.py b/pygithub3/core/ghrequests/users/keys.py index e69de29..e69de29 100644 --- a/pygithub3/core/resources/users/keys.py +++ b/pygithub3/core/ghrequests/users/keys.py diff --git a/pygithub3/core/resources/users/user.py b/pygithub3/core/ghrequests/users/user.py index 1399ff8..18a356e 100644 --- a/pygithub3/core/resources/users/user.py +++ b/pygithub3/core/ghrequests/users/user.py @@ -1,15 +1,15 @@ #!/usr/bin/env python # -*- encoding: utf-8 -*- -from . import Resource -from pygithub3.models.users import User +from . import Request +from pygithub3.resources.users import User __all__ = ('Get', 'Update') -class Get(Resource): +class Get(Request): - model = User + resource = User def validate(self): pass @@ -21,5 +21,5 @@ class Get(Resource): return 'user' -class Update(Resource): +class Update(Request): pass diff --git a/pygithub3/core/resources/__init__.py b/pygithub3/core/resources/__init__.py deleted file mode 100644 index bca9607..0000000 --- a/pygithub3/core/resources/__init__.py +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/env python -# -*- encoding: utf-8 -*- - -import re - -ABS_IMPORT_PREFIX = 'pygithub3.core.resources' - - -class UriNotFound(Exception): - pass - - -class UriInvalid(Exception): - pass - - -class Resource(object): - """ """ - - def __init__(self, args): - """ """ - self.args = args - self.validate() - self.uri = self.set_uri() - - def validate(self, args): - raise NotImplementedError - - def set_uri(self): - raise NotImplementedError - - def get_uri(self): - return str(self.uri).strip('/') - - def get_model(self): - return getattr(self, 'model', '') - - def __getattr__(self, name): - return self.args.get(name) - - def __str__(self): - return self.get_uri() - - -class Factory(object): - """ """ - - import_pattern = re.compile(r'^(\w+\.)+\w+$') - - def __init__(self, **kwargs): - self.args = kwargs - - def __validate(func): - """ """ - - def wrapper(self, resource_path): - if not Factory.import_pattern.match(resource_path): - raise UriInvalid("'%s' isn't valid form" % resource_path) - return func(self, resource_path.lower()) - return wrapper - - def __dispatch(func): - """ """ - - from importlib import import_module - - def wrapper(self, resource_path): - module_chunk, s, uri_chunk = resource_path.rpartition('.') - try: - # TODO: CamelCase and under_score support, now only Class Name - module = import_module('%s.%s' - % (ABS_IMPORT_PREFIX, module_chunk)) - uri = getattr(module, uri_chunk.capitalize()) - except ImportError: - raise UriNotFound("'%s' module does not exists" % module_chunk) - except AttributeError: - raise UriNotFound("'%s' uri doesn't exists into '%s' module" - % (uri_chunk.capitalize(), module_chunk)) - return func(self, uri) - return wrapper - - @__validate - @__dispatch - def __call__(self, resource_class=''): - resource = resource_class(self.args) - assert isinstance(resource, Resource) - return resource diff --git a/pygithub3/core/resources/users/emails.py b/pygithub3/core/resources/users/emails.py deleted file mode 100644 index 9523977..0000000 --- a/pygithub3/core/resources/users/emails.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env python -# -*- encoding: utf-8 -*- - -from . import Resource -from pygithub3.models.base import Raw - - -class List(Resource): - - model = Raw - - def validate(self): - pass - - def set_uri(self): - return 'user/emails' diff --git a/pygithub3/core/resources/users/followers.py b/pygithub3/core/resources/users/followers.py deleted file mode 100644 index e69de29..0000000 --- a/pygithub3/core/resources/users/followers.py +++ /dev/null diff --git a/pygithub3/core/result.py b/pygithub3/core/result.py index 5c1466d..1c8181e 100644 --- a/pygithub3/core/result.py +++ b/pygithub3/core/result.py @@ -8,9 +8,9 @@ from .third_libs.link_header import parse_link_value class Method(object): - def __init__(self, method, resource, **method_args): + def __init__(self, method, request, **method_args): self.method = method - self.resource = resource + self.request = request self.args = method_args self.cache = {} @@ -47,10 +47,10 @@ class Method(object): def __call__(self, page=1): all_args = self.args.copy() all_args.update(page=page) - response = self.method(self.resource, **all_args) + response = self.method(self.request, **all_args) self.__set_last_page_from(response) - model = self.resource.get_model() - self.cache[str(page)] = model.loads(response.content) + resource = self.request.get_resource() + self.cache[str(page)] = resource.loads(response.content) return self.cache[str(page)] @property @@ -137,9 +137,9 @@ class Page(object): class Result(object): """ """ - def __init__(self, client, resource, **kwargs): + def __init__(self, client, request, **kwargs): """ """ - self.getter = Method(client.get, resource, **kwargs) + self.getter = Method(client.get, request, **kwargs) self.page = Page(self.getter) def __iter__(self): diff --git a/pygithub3/models/__init__.py b/pygithub3/resources/__init__.py index dae354a..dae354a 100644 --- a/pygithub3/models/__init__.py +++ b/pygithub3/resources/__init__.py diff --git a/pygithub3/models/base.py b/pygithub3/resources/base.py index 722d545..5a9418a 100644 --- a/pygithub3/models/base.py +++ b/pygithub3/resources/base.py @@ -7,7 +7,7 @@ except ImportError: import json -class Model(object): +class Resource(object): _dates = () _maps = {} @@ -41,37 +41,37 @@ class Model(object): date = None return date - def parse_map(model, raw_resource): + def parse_map(resource, raw_resource): if hasattr(raw_resource, 'items'): - return model.__load(raw_resource) + return resource.__load(raw_resource) - def parse_collection_map(model, raw_resources): + def parse_collection_map(resource, raw_resources): # Dict of resources (Ex: Gist file) if hasattr(raw_resources, 'items'): dict_map = {} for key, raw_resource in raw_resources.items(): - dict_map[key] = model.__load(raw_resource) + dict_map[key] = resource.__load(raw_resource) return dict_map # list of resources elif hasattr(raw_resources, '__iter__'): - return [model.__load(raw_resource) + return [resource.__load(raw_resource) for raw_resource in raw_resources] raw_resource.update( {attr: parse_date(raw_resource[attr]) for attr in self._dates if attr in raw_resource}) raw_resource.update( - {attr: parse_map(model, raw_resource[attr]) - for attr, model in self._maps.items() + {attr: parse_map(resource , raw_resource[attr]) + for attr, resource in self._maps.items() if attr in raw_resource}) raw_resource.update( - {attr: parse_collection_map(model, raw_resource[attr]) - for attr, model in self._collection_maps.items() + {attr: parse_collection_map(resource, raw_resource[attr]) + for attr, resource in self._collection_maps.items() if attr in raw_resource}) return self(raw_resource) -class Raw(Model): +class Raw(Resource): @classmethod def loads(self, json_content): diff --git a/pygithub3/models/users.py b/pygithub3/resources/users.py index c94a704..7e40025 100644 --- a/pygithub3/models/users.py +++ b/pygithub3/resources/users.py @@ -1,18 +1,18 @@ #!/usr/bin/env python # -*- encoding: utf-8 -*- -from .base import Model +from .base import Resource __all__ = ('Plan', 'User') -class Plan(Model): +class Plan(Resource): def __str__(self): return '<Plan (%s)>' % getattr(self, 'name', '') -class User(Model): +class User(Resource): """ """ _maps = {'plan': Plan} diff --git a/pygithub3/services/base.py b/pygithub3/services/base.py index 303b3a0..98969c6 100644 --- a/pygithub3/services/base.py +++ b/pygithub3/services/base.py @@ -2,12 +2,15 @@ # -*- encoding: utf-8 -*- from pygithub3.core.client import Client +from pygithub3.core.result import Result +from pygithub3.core.ghrequests import Factory class Base(object): def __init__(self, **config): self.client = Client(**config) + self.get_request = Factory() def get_user(self): return self.client.user @@ -21,23 +24,27 @@ class Base(object): def set_repo(self, repo): self.client.repo = repo - def _get_result(self, resource, **kwargs): - return Result(self.client.get, resource, **kwargs) - - -class Result(object): # move - - def __init__(self, method, resource, **kwargs): - self.method = method - self.resource = resource - self.args = kwargs - - def __repr__(self): - pass - - def process(self): - model = self.resource.get_model() - raw = self.method(self.resource, **self.args) - if model: - import json - return model.loads(json.loads(raw.content)) + def config_request(self, **kwargs): + self.get_request.config_with(**kwargs) + + def _delete(self, request_uri, **kwargs): + request = self.get_request(request_uri) + input_data = request.get_data() + self.client.delete(request, data=input_data) + + def _post(self, request_uri, **kwargs): + request = self.get_request(request_uri) + resource = request.get_resource() + input_data = request.get_data() + response = self.client.post(request, data=input_data) + return resource.loads(response.content) + + def _get(self, request_uri, **kwargs): + request = self.get_request(request_uri) + resource = request.get_resource() + response = self.client.get(request, **kwargs) + return resource.loads(response.content) + + def _get_result(self, request_uri, **kwargs): + request = self.get_request(request_uri) + return Result(self.client, request, **kwargs) diff --git a/pygithub3/services/users.py b/pygithub3/services/users.py index 70826f2..c4878dd 100644 --- a/pygithub3/services/users.py +++ b/pygithub3/services/users.py @@ -2,7 +2,6 @@ # -*- encoding: utf-8 -*- from .base import Base -from pygithub3.core.resources import Factory class Keys(Base): @@ -13,20 +12,30 @@ class Keys(Base): class Followers(Base): - def list(self, user): - pass + def list(self, user=None): + self.config_request(user=user or self.client.user) + return self._get_result('users.followers.list') + + def list_following(self, user=None): + self.config_request(user=user or self.client.user) + return self._get_result('users.followers.listfollowing') + def unfollow(self, user): + self.config_request(user=user) + self._delete('users.followers.unfollow') class Emails(Base): def list(self): - pass + return self._get_result('users.emails.list') - def add(self): - pass + def add(self, *args): + self.config_request(emails=args) + return self._post('users.emails.add') - def delete(self): - pass + def delete(self, *args): + self.config_request(emails=args) + self._delete('users.emails.delete') class User(Base): @@ -37,9 +46,9 @@ class User(Base): self.followers = Followers(**kwargs) super(User, self).__init__(**kwargs) - def get(self, user): - resource = Factory(user=user or self.client.user) - return self._get_result(resource('users.get')) + def get(self, user=None): + self.config_request(user=user or self.client.user) + return self._get('users.get') def update(self): pass |