Skip to content

Commit af6bdbb

Browse files
committed
Merge copitux#28 from oracal:master
2 parents f7abcfd + aba80ae commit af6bdbb

File tree

11 files changed

+234
-19
lines changed

11 files changed

+234
-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: 9 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))
@@ -56,6 +63,8 @@ def __set_params(self, config):
5663
self.requester.params.append(per_page)
5764
if config.get('verbose'):
5865
self.requester.config = {'verbose': config['verbose']}
66+
if config.get('timeout'):
67+
self.requester.timeout = config['timeout']
5968

6069
def __parse_kwargs(func):
6170
""" Decorator to put extra args into requests.params """
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: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,15 @@ 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
1820
:param int per_page: Items in each page of multiple returns
1921
:param str base_url: To support another github-related API (untested)
2022
:param stream verbose: Stream to write debug logs
23+
:param timeout float: Timeout for requests
2124
2225
You can configure the **authentication** with BasicAuthentication (login
2326
and password) and with `OAuth <http://developer.github.com/v3/oauth/>`_ (
@@ -72,6 +75,14 @@ def set_credentials(self, login, password):
7275
"""
7376
self._client.set_credentials(login, password)
7477

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+
7586
def set_token(self, token):
7687
""" Set OAuth token
7788

pygithub3/services/repos/__init__.py

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

1213

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

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)