aboutsummaryrefslogtreecommitdiffstats
path: root/pygithub3
diff options
context:
space:
mode:
Diffstat (limited to 'pygithub3')
-rw-r--r--pygithub3/core/client.py34
-rw-r--r--pygithub3/core/ghrequests/__init__.py99
-rw-r--r--pygithub3/core/ghrequests/users/__init__.py (renamed from pygithub3/core/resources/users/__init__.py)2
-rw-r--r--pygithub3/core/ghrequests/users/emails.py42
-rw-r--r--pygithub3/core/ghrequests/users/followers.py46
-rw-r--r--pygithub3/core/ghrequests/users/keys.py (renamed from pygithub3/core/resources/users/keys.py)0
-rw-r--r--pygithub3/core/ghrequests/users/user.py (renamed from pygithub3/core/resources/users/user.py)10
-rw-r--r--pygithub3/core/resources/__init__.py87
-rw-r--r--pygithub3/core/resources/users/emails.py16
-rw-r--r--pygithub3/core/resources/users/followers.py0
-rw-r--r--pygithub3/core/result.py14
-rw-r--r--pygithub3/resources/__init__.py (renamed from pygithub3/models/__init__.py)0
-rw-r--r--pygithub3/resources/base.py (renamed from pygithub3/models/base.py)22
-rw-r--r--pygithub3/resources/users.py (renamed from pygithub3/models/users.py)6
-rw-r--r--pygithub3/services/base.py47
-rw-r--r--pygithub3/services/users.py31
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