diff options
Diffstat (limited to 'github3')
-rw-r--r-- | github3/api.py | 28 | ||||
-rw-r--r-- | github3/exceptions.py | 8 | ||||
-rw-r--r-- | github3/handlers/__init__.py | 0 | ||||
-rw-r--r-- | github3/handlers/base.py | 26 | ||||
-rw-r--r-- | github3/handlers/user.py | 41 | ||||
-rw-r--r-- | github3/helpers.py | 2 | ||||
-rw-r--r-- | github3/models/__init__.py | 0 | ||||
-rw-r--r-- | github3/models/base.py (renamed from github3/models.py) | 68 | ||||
-rw-r--r-- | github3/models/user.py | 79 |
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) |