aboutsummaryrefslogtreecommitdiffstats
path: root/github3
diff options
context:
space:
mode:
Diffstat (limited to 'github3')
-rw-r--r--github3/api.py28
-rw-r--r--github3/exceptions.py8
-rw-r--r--github3/handlers/__init__.py0
-rw-r--r--github3/handlers/base.py26
-rw-r--r--github3/handlers/user.py41
-rw-r--r--github3/helpers.py2
-rw-r--r--github3/models/__init__.py0
-rw-r--r--github3/models/base.py (renamed from github3/models.py)68
-rw-r--r--github3/models/user.py79
9 files changed, 163 insertions, 89 deletions
diff --git a/github3/api.py b/github3/api.py
index 81ae3e7..7b63b2d 100644
--- a/github3/api.py
+++ b/github3/api.py
@@ -18,8 +18,7 @@ from .packages.link_header import parse_link_value
from .models import *
from .helpers import is_collection, to_python, to_api, get_scope
from .config import settings
-
-
+import handlers
PAGING_SIZE = 100
@@ -199,24 +198,13 @@ class Github(GithubCore):
super(Github, self).__init__()
self.is_authenticated = False
-
- def get_user(self, username):
- """Get a single user."""
- return self._get_resource(('users', username), User)
-
-
- def get_me(self):
- """Get the authenticated user."""
- return self._get_resource(('user'), CurrentUser)
-
- def get_repo(self, username, reponame):
- """Get the given repo."""
- return self._get_resource(('repos', username, reponame), Repo)
-
- def get_org(self, login):
- """Get organization."""
- return self._get_resource(('orgs', login), Org)
-
+ def user_handler(self, username=None):
+ if not getattr(self, '_user_handler'):
+ if self.is_authenticated:
+ self._user_handler = handlers.AuthUser(self)
+ else:
+ self._user_handler = handlers.User(self, username)
+ return self._user_handler
class ResponseError(Exception):
"""The API Response was unexpected."""
diff --git a/github3/exceptions.py b/github3/exceptions.py
new file mode 100644
index 0000000..72da776
--- /dev/null
+++ b/github3/exceptions.py
@@ -0,0 +1,8 @@
+#!/usr/bin/env python
+# -*- encoding: utf-8 -*-
+#
+# author: David Medina
+
+class AnomUser(Exception):
+ """ Exception for AnomUser handler """
+ pass
diff --git a/github3/handlers/__init__.py b/github3/handlers/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/github3/handlers/__init__.py
diff --git a/github3/handlers/base.py b/github3/handlers/base.py
new file mode 100644
index 0000000..6a5ac65
--- /dev/null
+++ b/github3/handlers/base.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python
+# -*- encoding: utf-8 -*-
+#
+# author: David Medina
+
+import models
+
+class Handler(object):
+ """ Abstract handler, that inject github.api """
+
+ def __init__(self, gh):
+ self._gh = gh
+ super(Handler, self).__init__()
+
+ def _extend_url(self, *args):
+ return self._url + args
+
+ def _get_resource(self, *args, **kwargs):
+ url = self._extend_url(*args)
+ map_model = kwargs.get('model', self._model)
+ return self._gh._get_resource(url, map_model, **kwargs)
+
+ def _get_resources(self, *args, **kwargs):
+ url = self._extend_url(*args)
+ map_model = kwargs.get('model', self._model)
+ return self._gh._get_resources(url, map_model, **kwargs)
diff --git a/github3/handlers/user.py b/github3/handlers/user.py
new file mode 100644
index 0000000..16f8363
--- /dev/null
+++ b/github3/handlers/user.py
@@ -0,0 +1,41 @@
+#!/usr/bin/env python
+# -*- encoding: utf-8 -*-
+#
+# author: David Medina
+
+from .base import Handler
+
+class User(Handler):
+ """ Handler to query public user api """
+
+ def __init__(self, gh, username):
+ if not username:
+ raise exceptions.AnomUser("%s need a username" % self.__class__)
+
+ self._url = ('users', username)
+ self._model = models.AnomUser
+ self.username = username
+ super(User, self).__init__(gh)
+
+ def __repr__(self):
+ return '<Handler.AnomUser> %s' % self.username
+
+ def get(self):
+ return self._get_resource()
+
+ def get_followers(self, limit=None):
+ return self._get_resources('followers')
+
+ def get_following(self, limit=None):
+ return self._get_resources('following')
+
+class AuthUser(AnomUser):
+ """ Handler to query public/private api for authenticated user """
+
+ def __init__(self, gh):
+ self._url = ('user',)
+ self._model = models.User
+ super(AnomUser, self).__init__(gh)
+
+ def __repr__(self):
+ return '<Handler.User>'
diff --git a/github3/helpers.py b/github3/helpers.py
index abdeb4a..498a005 100644
--- a/github3/helpers.py
+++ b/github3/helpers.py
@@ -166,4 +166,4 @@ def get_scope(f, args=None):
# scrub readability.models namespace
scope = scope.replace('readability.api.', '')
- return scope \ No newline at end of file
+ return scope
diff --git a/github3/models/__init__.py b/github3/models/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/github3/models/__init__.py
diff --git a/github3/models.py b/github3/models/base.py
index 3c86687..618e57f 100644
--- a/github3/models.py
+++ b/github3/models/base.py
@@ -79,74 +79,6 @@ class Plan(BaseResource):
def __repr__(self):
return '<plan {0}>'.format(str(self.name))
-
-
-class User(BaseResource):
- """Github User object model."""
-
- _strs = [
- 'login','avatar_url', 'url', 'name', 'company', 'blog', 'location',
- 'email', 'bio', 'html_url']
-
- _ints = ['id', 'public_repos', 'public_gists', 'followers', 'following']
- _dates = ['created_at',]
- _bools = ['hireable', ]
- # _map = {}
- # _writeable = []
-
- @property
- def ri(self):
- return ('users', self.login)
-
- def __repr__(self):
- return '<user {0}>'.format(self.login)
-
- def repos(self, limit=None):
- return self._gh._get_resources(('users', self.login, 'repos'), Repo, limit=limit)
-
- def repo(self, reponame):
- return self._gh._get_resource(('repos', self.login, reponame), Repo)
-
- def orgs(self):
- return self._gh._get_resources(('users', self.login, 'orgs'), Org)
-
- def gists(self):
- return self._gh._get_resources(('users', self.login, 'gists'), Gist)
-
-class CurrentUser(User):
- """Github Current User object model."""
-
- _ints = [
- 'id', 'public_repos', 'public_gists', 'followers', 'following',
- 'total_private_repos', 'owned_private_repos', 'private_gists',
- 'disk_usage', 'collaborators']
- _map = {'plan': Plan}
- _writeable = ['name', 'email', 'blog', 'company', 'location', 'hireable', 'bio']
-
- @property
- def ri(self):
- return ('user',)
-
- def __repr__(self):
- return '<current-user {0}>'.format(self.login)
-
- def repos(self, limit=None):
- return self._gh._get_resources(('user', 'repos'), Repo, limit=limit)
-
- def repo(self, reponame):
- return self._gh._get_resource(('repos', self.login, reponame), Repo)
-
- def orgs(self, limit=None):
- return self._gh._get_resources(('user', 'orgs'), Org, limit=limit)
-
- def org(self, orgname):
- return self._gh._get_resource(('orgs', orgname), Org)
-
- def gists(self, limit=None):
- return self._gh._get_resources('gists', Gist, limit=limit)
-
-
-
class Org(BaseResource):
"""Github Organization object model."""
diff --git a/github3/models/user.py b/github3/models/user.py
new file mode 100644
index 0000000..cdbd04f
--- /dev/null
+++ b/github3/models/user.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+# -*- encoding: utf-8 -*-
+#
+# author: David Medina
+
+from .base import BaseResource
+
+class User(BaseResource):
+ """Github User object model."""
+
+ _strs = [
+ 'login','avatar_url', 'url', 'name', 'company', 'blog', 'location',
+ 'email', 'bio', 'html_url']
+
+ _ints = ['id', 'public_repos', 'public_gists', 'followers', 'following']
+ _dates = ['created_at',]
+ _bools = ['hireable', ]
+ # _map = {}
+ # _writeable = []
+
+ @property
+ def ri(self):
+ return ('users', self.login)
+
+ def __repr__(self):
+ return '<User {0}>'.format(self.login)
+
+ @property
+ def handler(self):
+ return self._gh.user_handler(self.login)
+
+ def get_followers(self, limit=None):
+ return self.handler.followers(limit)
+
+ def get_following(self, limit=None):
+ return self.handler.following(limit)
+
+ def repos(self, limit=None):
+ return self._gh._get_resources(('users', self.login, 'repos'), Repo, limit=limit)
+ def repo(self, reponame):
+ return self._gh._get_resource(('repos', self.login, reponame), Repo)
+
+ def orgs(self):
+ return self._gh._get_resources(('users', self.login, 'orgs'), Org)
+
+ def gists(self):
+ return self._gh._get_resources(('users', self.login, 'gists'), Gist)
+
+class AuthUser(User):
+ """Github Current User object model."""
+
+ _ints = [
+ 'id', 'public_repos', 'public_gists', 'followers', 'following',
+ 'total_private_repos', 'owned_private_repos', 'private_gists',
+ 'disk_usage', 'collaborators']
+ _map = {'plan': Plan}
+ _writeable = ['name', 'email', 'blog', 'company', 'location', 'hireable', 'bio']
+
+ @property
+ def ri(self):
+ return ('user',)
+
+ def __repr__(self):
+ return '<current-user {0}>'.format(self.login)
+
+ def repos(self, limit=None):
+ return self._gh._get_resources(('user', 'repos'), Repo, limit=limit)
+
+ def repo(self, reponame):
+ return self._gh._get_resource(('repos', self.login, reponame), Repo)
+
+ def orgs(self, limit=None):
+ return self._gh._get_resources(('user', 'orgs'), Org, limit=limit)
+
+ def org(self, orgname):
+ return self._gh._get_resource(('orgs', orgname), Org)
+
+ def gists(self, limit=None):
+ return self._gh._get_resources('gists', Gist, limit=limit)