Skip to content

Commit c23698e

Browse files
committed
Wip on handlers
1 parent 1dfed8f commit c23698e

File tree

9 files changed

+163
-89
lines changed

9 files changed

+163
-89
lines changed

github3/api.py

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@
1818
from .models import *
1919
from .helpers import is_collection, to_python, to_api, get_scope
2020
from .config import settings
21-
22-
21+
import handlers
2322

2423

2524
PAGING_SIZE = 100
@@ -199,24 +198,13 @@ def __init__(self):
199198
super(Github, self).__init__()
200199
self.is_authenticated = False
201200

202-
203-
def get_user(self, username):
204-
"""Get a single user."""
205-
return self._get_resource(('users', username), User)
206-
207-
208-
def get_me(self):
209-
"""Get the authenticated user."""
210-
return self._get_resource(('user'), CurrentUser)
211-
212-
def get_repo(self, username, reponame):
213-
"""Get the given repo."""
214-
return self._get_resource(('repos', username, reponame), Repo)
215-
216-
def get_org(self, login):
217-
"""Get organization."""
218-
return self._get_resource(('orgs', login), Org)
219-
201+
def user_handler(self, username=None):
202+
if not getattr(self, '_user_handler'):
203+
if self.is_authenticated:
204+
self._user_handler = handlers.AuthUser(self)
205+
else:
206+
self._user_handler = handlers.User(self, username)
207+
return self._user_handler
220208

221209
class ResponseError(Exception):
222210
"""The API Response was unexpected."""

github3/exceptions.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
#
4+
# author: David Medina
5+
6+
class AnomUser(Exception):
7+
""" Exception for AnomUser handler """
8+
pass

github3/handlers/__init__.py

Whitespace-only changes.

github3/handlers/base.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
#
4+
# author: David Medina
5+
6+
import models
7+
8+
class Handler(object):
9+
""" Abstract handler, that inject github.api """
10+
11+
def __init__(self, gh):
12+
self._gh = gh
13+
super(Handler, self).__init__()
14+
15+
def _extend_url(self, *args):
16+
return self._url + args
17+
18+
def _get_resource(self, *args, **kwargs):
19+
url = self._extend_url(*args)
20+
map_model = kwargs.get('model', self._model)
21+
return self._gh._get_resource(url, map_model, **kwargs)
22+
23+
def _get_resources(self, *args, **kwargs):
24+
url = self._extend_url(*args)
25+
map_model = kwargs.get('model', self._model)
26+
return self._gh._get_resources(url, map_model, **kwargs)

github3/handlers/user.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
#
4+
# author: David Medina
5+
6+
from .base import Handler
7+
8+
class User(Handler):
9+
""" Handler to query public user api """
10+
11+
def __init__(self, gh, username):
12+
if not username:
13+
raise exceptions.AnomUser("%s need a username" % self.__class__)
14+
15+
self._url = ('users', username)
16+
self._model = models.AnomUser
17+
self.username = username
18+
super(User, self).__init__(gh)
19+
20+
def __repr__(self):
21+
return '<Handler.AnomUser> %s' % self.username
22+
23+
def get(self):
24+
return self._get_resource()
25+
26+
def get_followers(self, limit=None):
27+
return self._get_resources('followers')
28+
29+
def get_following(self, limit=None):
30+
return self._get_resources('following')
31+
32+
class AuthUser(AnomUser):
33+
""" Handler to query public/private api for authenticated user """
34+
35+
def __init__(self, gh):
36+
self._url = ('user',)
37+
self._model = models.User
38+
super(AnomUser, self).__init__(gh)
39+
40+
def __repr__(self):
41+
return '<Handler.User>'

github3/helpers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,4 +166,4 @@ def get_scope(f, args=None):
166166
# scrub readability.models namespace
167167
scope = scope.replace('readability.api.', '')
168168

169-
return scope
169+
return scope

github3/models/__init__.py

Whitespace-only changes.
Lines changed: 0 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -79,74 +79,6 @@ class Plan(BaseResource):
7979
def __repr__(self):
8080
return '<plan {0}>'.format(str(self.name))
8181

82-
83-
84-
class User(BaseResource):
85-
"""Github User object model."""
86-
87-
_strs = [
88-
'login','avatar_url', 'url', 'name', 'company', 'blog', 'location',
89-
'email', 'bio', 'html_url']
90-
91-
_ints = ['id', 'public_repos', 'public_gists', 'followers', 'following']
92-
_dates = ['created_at',]
93-
_bools = ['hireable', ]
94-
# _map = {}
95-
# _writeable = []
96-
97-
@property
98-
def ri(self):
99-
return ('users', self.login)
100-
101-
def __repr__(self):
102-
return '<user {0}>'.format(self.login)
103-
104-
def repos(self, limit=None):
105-
return self._gh._get_resources(('users', self.login, 'repos'), Repo, limit=limit)
106-
107-
def repo(self, reponame):
108-
return self._gh._get_resource(('repos', self.login, reponame), Repo)
109-
110-
def orgs(self):
111-
return self._gh._get_resources(('users', self.login, 'orgs'), Org)
112-
113-
def gists(self):
114-
return self._gh._get_resources(('users', self.login, 'gists'), Gist)
115-
116-
class CurrentUser(User):
117-
"""Github Current User object model."""
118-
119-
_ints = [
120-
'id', 'public_repos', 'public_gists', 'followers', 'following',
121-
'total_private_repos', 'owned_private_repos', 'private_gists',
122-
'disk_usage', 'collaborators']
123-
_map = {'plan': Plan}
124-
_writeable = ['name', 'email', 'blog', 'company', 'location', 'hireable', 'bio']
125-
126-
@property
127-
def ri(self):
128-
return ('user',)
129-
130-
def __repr__(self):
131-
return '<current-user {0}>'.format(self.login)
132-
133-
def repos(self, limit=None):
134-
return self._gh._get_resources(('user', 'repos'), Repo, limit=limit)
135-
136-
def repo(self, reponame):
137-
return self._gh._get_resource(('repos', self.login, reponame), Repo)
138-
139-
def orgs(self, limit=None):
140-
return self._gh._get_resources(('user', 'orgs'), Org, limit=limit)
141-
142-
def org(self, orgname):
143-
return self._gh._get_resource(('orgs', orgname), Org)
144-
145-
def gists(self, limit=None):
146-
return self._gh._get_resources('gists', Gist, limit=limit)
147-
148-
149-
15082
class Org(BaseResource):
15183
"""Github Organization object model."""
15284

github3/models/user.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
#
4+
# author: David Medina
5+
6+
from .base import BaseResource
7+
8+
class User(BaseResource):
9+
"""Github User object model."""
10+
11+
_strs = [
12+
'login','avatar_url', 'url', 'name', 'company', 'blog', 'location',
13+
'email', 'bio', 'html_url']
14+
15+
_ints = ['id', 'public_repos', 'public_gists', 'followers', 'following']
16+
_dates = ['created_at',]
17+
_bools = ['hireable', ]
18+
# _map = {}
19+
# _writeable = []
20+
21+
@property
22+
def ri(self):
23+
return ('users', self.login)
24+
25+
def __repr__(self):
26+
return '<User {0}>'.format(self.login)
27+
28+
@property
29+
def handler(self):
30+
return self._gh.user_handler(self.login)
31+
32+
def get_followers(self, limit=None):
33+
return self.handler.followers(limit)
34+
35+
def get_following(self, limit=None):
36+
return self.handler.following(limit)
37+
38+
def repos(self, limit=None):
39+
return self._gh._get_resources(('users', self.login, 'repos'), Repo, limit=limit)
40+
def repo(self, reponame):
41+
return self._gh._get_resource(('repos', self.login, reponame), Repo)
42+
43+
def orgs(self):
44+
return self._gh._get_resources(('users', self.login, 'orgs'), Org)
45+
46+
def gists(self):
47+
return self._gh._get_resources(('users', self.login, 'gists'), Gist)
48+
49+
class AuthUser(User):
50+
"""Github Current User object model."""
51+
52+
_ints = [
53+
'id', 'public_repos', 'public_gists', 'followers', 'following',
54+
'total_private_repos', 'owned_private_repos', 'private_gists',
55+
'disk_usage', 'collaborators']
56+
_map = {'plan': Plan}
57+
_writeable = ['name', 'email', 'blog', 'company', 'location', 'hireable', 'bio']
58+
59+
@property
60+
def ri(self):
61+
return ('user',)
62+
63+
def __repr__(self):
64+
return '<current-user {0}>'.format(self.login)
65+
66+
def repos(self, limit=None):
67+
return self._gh._get_resources(('user', 'repos'), Repo, limit=limit)
68+
69+
def repo(self, reponame):
70+
return self._gh._get_resource(('repos', self.login, reponame), Repo)
71+
72+
def orgs(self, limit=None):
73+
return self._gh._get_resources(('user', 'orgs'), Org, limit=limit)
74+
75+
def org(self, orgname):
76+
return self._gh._get_resource(('orgs', orgname), Org)
77+
78+
def gists(self, limit=None):
79+
return self._gh._get_resources('gists', Gist, limit=limit)

0 commit comments

Comments
 (0)