Skip to content

Commit aba80ae

Browse files
oracaloracal
authored andcommitted
Updated api in regards to recent changes to watching and stargazing
api's, (these are subject to change with github's current phased transition http://developer.github.com/changes/2012-9-5-watcher-api/) Also added rate limiting increase by supplying oauth client id and client secret due to http://developer.github.com/changes/2012-10-14-rate-limit-changes/
1 parent 3320973 commit aba80ae

File tree

11 files changed

+231
-19
lines changed

11 files changed

+231
-19
lines changed

AUTHORS.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,4 @@ Patches and Suggestions
3131
- Ralph Bean <[email protected]>
3232
- Jason A. Donenfeld <[email protected]>
3333
- Brad Montgomery <http://about.me/bkmontgomery>
34+
- Thomas Whitton <[email protected]>

docs/repos.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,14 @@ Watchers
128128
.. autoclass:: pygithub3.services.repos.Watchers
129129
:members:
130130

131+
.. _Stargazers service:
132+
133+
Stargazers
134+
---------
135+
136+
.. autoclass:: pygithub3.services.repos.Stargazers
137+
:members:
138+
131139
.. _Hooks service:
132140

133141
Hooks

pygithub3/core/client.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ def __init__(self, **kwargs):
2424
self.config.update(kwargs)
2525
self.set_credentials(self.config.get('login'),
2626
self.config.get('password'))
27+
self.set_oauth_credentials(self.config.get('client_id'),
28+
self.config.get('client_secret'))
2729
self.set_token(self.config.get('token'))
2830
self.__set_params(self.config)
2931

@@ -47,6 +49,11 @@ def set_credentials(self, login, password):
4749
if login and password:
4850
self.requester.auth = (login, password)
4951

52+
def set_oauth_credentials(self, client_id, client_secret):
53+
if client_id and client_secret:
54+
self.requester.params.append(('client_id', client_id))
55+
self.requester.params.append(('client_secret', client_secret))
56+
5057
def set_token(self, token):
5158
if token:
5259
self.requester.params.append(('access_token', token))
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
4+
from . import Request
5+
from pygithub3.resources.users import User
6+
from pygithub3.resources.repos import Repo
7+
8+
9+
class List(Request):
10+
11+
uri = 'repos/{user}/{repo}/stargazers'
12+
resource = User
13+
14+
15+
class List_repos(Request):
16+
17+
uri = 'users/{user}/starred'
18+
resource = Repo
19+
20+
def clean_uri(self):
21+
if not self.user:
22+
return 'user/starred'
23+
24+
25+
class Is_starring(Request):
26+
27+
uri = 'user/starred/{user}/{repo}'
28+
29+
30+
class Star(Request):
31+
32+
uri = 'user/starred/{user}/{repo}'
33+
34+
35+
class Unstar(Request):
36+
37+
uri = 'user/starred/{user}/{repo}'

pygithub3/requests/repos/watchers.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,30 @@
88

99
class List(Request):
1010

11-
uri = 'repos/{user}/{repo}/watchers'
11+
uri = 'repos/{user}/{repo}/subscribers'
1212
resource = User
1313

1414

1515
class List_repos(Request):
1616

17-
uri = 'users/{user}/watched'
17+
uri = 'users/{user}/subscriptions'
1818
resource = Repo
1919

2020
def clean_uri(self):
2121
if not self.user:
22-
return 'user/watched'
22+
return 'user/subscriptions'
2323

2424

2525
class Is_watching(Request):
2626

27-
uri = 'user/watched/{user}/{repo}'
27+
uri = 'user/subscriptions/{user}/{repo}'
2828

2929

3030
class Watch(Request):
3131

32-
uri = 'user/watched/{user}/{repo}'
32+
uri = 'user/subscriptions/{user}/{repo}'
3333

3434

3535
class Unwatch(Request):
3636

37-
uri = 'user/watched/{user}/{repo}'
37+
uri = 'user/subscriptions/{user}/{repo}'

pygithub3/services/base.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class Service(object):
1212
1313
:param str login: Username to authenticate
1414
:param str password: Username to authenticate
15+
:param str client_id: Client id to prevent rate limiting
16+
:param str client_key: Client key to prevent rate limiting
1517
:param str user: Default username in requests
1618
:param str repo: Default repository in requests
1719
:param str token: Token to OAuth
@@ -73,6 +75,14 @@ def set_credentials(self, login, password):
7375
"""
7476
self._client.set_credentials(login, password)
7577

78+
def set_oauth_credentials(self, client_id, client_key):
79+
""" Set Oauth Identification
80+
81+
:param str client_id: Client id to prevent rate limiting
82+
:param str client_key: Client key to prevent rate limiting
83+
"""
84+
self._client.set_oauth_credentials(client_id, client_key)
85+
7686
def set_token(self, token):
7787
""" Set OAuth token
7888

pygithub3/services/repos/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from .forks import Forks
99
from .keys import Keys
1010
from .watchers import Watchers
11+
from .stargazers import Stargazers
1112
from .hooks import Hooks
1213

1314

@@ -21,6 +22,7 @@ def __init__(self, **config):
2122
self.forks = Forks(**config)
2223
self.keys = Keys(**config)
2324
self.watchers = Watchers(**config)
25+
self.stargazers = Stargazers(**config)
2426
self.hooks = Hooks(**config)
2527
super(Repo, self).__init__(**config)
2628

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
4+
from . import Service
5+
6+
7+
class Stargazers(Service):
8+
""" Consume `starring API
9+
<http://developer.github.com/v3/repos/starring>`_ """
10+
11+
def list(self, user=None, repo=None):
12+
""" Get repository's stargazers
13+
14+
:param str user: Username
15+
:param str repo: Repository
16+
:returns: A :doc:`result`
17+
18+
.. note::
19+
Remember :ref:`config precedence`
20+
"""
21+
request = self.make_request('repos.stargazers.list',
22+
user=user, repo=repo)
23+
return self._get_result(request)
24+
25+
def list_repos(self, user=None):
26+
""" Get repositories being starred by a user
27+
28+
:param str user: Username
29+
:returns: A :doc:`result`
30+
31+
If you call it without user and you are authenticated, get the
32+
repositories being starred by the authenticated user.
33+
34+
.. warning::
35+
If you aren't authenticated and call without user, it returns 403
36+
37+
::
38+
39+
stargazers_service.list_repos('copitux')
40+
stargazers_service.list_repos()
41+
"""
42+
request = self.request_builder('repos.stargazers.list_repos',
43+
user=user)
44+
return self._get_result(request)
45+
46+
def is_starring(self, user=None, repo=None):
47+
""" Check if authenticated user is starring a repository
48+
49+
:param str user: Username
50+
:param str repo: Repository
51+
52+
.. note::
53+
Remember :ref:`config precedence`
54+
55+
.. warning::
56+
You must be authenticated
57+
"""
58+
request = self.make_request('repos.stargazers.is_starring',
59+
user=user, repo=repo)
60+
return self._bool(request)
61+
62+
def star(self, user=None, repo=None):
63+
""" Star a repository
64+
65+
:param str user: Username
66+
:param str repo: Repository
67+
68+
.. note::
69+
Remember :ref:`config precedence`
70+
71+
.. warning::
72+
You must be authenticated
73+
"""
74+
request = self.make_request('repos.stargazers.star',
75+
user=user, repo=repo)
76+
self._put(request)
77+
78+
def unstar(self, user=None, repo=None):
79+
""" Stop starring a repository
80+
81+
:param str user: Username
82+
:param str repo: Repository
83+
84+
.. note::
85+
Remember :ref:`config precedence`
86+
87+
.. warning::
88+
You must be authenticated
89+
"""
90+
request = self.make_request('repos.stargazers.unstar',
91+
user=user, repo=repo)
92+
self._delete(request)

pygithub3/services/repos/watchers.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
class Watchers(Service):
88
""" Consume `Watching API
9-
<http://developer.github.com/v3/repos/watching>`_ """
9+
<http://developer.github.com/v3/repos/subscribers>`_ """
1010

1111
def list(self, user=None, repo=None):
1212
""" Get repository's watchers
@@ -19,7 +19,7 @@ def list(self, user=None, repo=None):
1919
Remember :ref:`config precedence`
2020
"""
2121
request = self.make_request('repos.watchers.list',
22-
user=user, repo=repo)
22+
user=user, repo=repo)
2323
return self._get_result(request)
2424

2525
def list_repos(self, user=None):
@@ -55,7 +55,7 @@ def is_watching(self, user=None, repo=None):
5555
You must be authenticated
5656
"""
5757
request = self.make_request('repos.watchers.is_watching',
58-
user=user, repo=repo)
58+
user=user, repo=repo)
5959
return self._bool(request)
6060

6161
def watch(self, user=None, repo=None):
@@ -71,7 +71,7 @@ def watch(self, user=None, repo=None):
7171
You must be authenticated
7272
"""
7373
request = self.make_request('repos.watchers.watch',
74-
user=user, repo=repo)
74+
user=user, repo=repo)
7575
self._put(request)
7676

7777
def unwatch(self, user=None, repo=None):
@@ -87,5 +87,5 @@ def unwatch(self, user=None, repo=None):
8787
You must be authenticated
8888
"""
8989
request = self.make_request('repos.watchers.unwatch',
90-
user=user, repo=repo)
90+
user=user, repo=repo)
9191
self._delete(request)

pygithub3/tests/core/test_client.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,22 @@ def test_set_credentials_with_invalid(self):
2424
self.c.set_credentials('', '')
2525
self.assertIsNone(self.c.requester.auth)
2626

27+
def test_set_oauth_credentials_with_valid(self):
28+
self.c.set_oauth_credentials('id', 'secret')
29+
self.assertEqual(dict(self.c.requester.params)['client_id'],
30+
'id')
31+
self.assertEqual(dict(self.c.requester.params)['client_secret'],
32+
'secret')
33+
34+
def test_set_credentials_with_invalid(self):
35+
self.c.set_oauth_credentials('', '')
36+
self.assertIsNone(dict(self.c.requester.params).get('client_id'))
37+
self.assertIsNone(dict(self.c.requester.params).get('client_secret'))
38+
2739
def test_set_token_with_valid(self):
2840
self.c.set_token('tokenize')
2941
self.assertEqual(dict(self.c.requester.params)['access_token'],
30-
'tokenize')
42+
'tokenize')
3143

3244
def test_set_token_with_invalid(self):
3345
self.c.set_token('')

0 commit comments

Comments
 (0)