Skip to content

Commit 221aae6

Browse files
committed
Service repos done
+repos.hooks
1 parent c525087 commit 221aae6

File tree

9 files changed

+225
-3
lines changed

9 files changed

+225
-3
lines changed

docs/repos.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,9 @@ Watchers
133133
Hooks
134134
---------
135135

136+
.. autoclass:: pygithub3.services.repos.Hooks
137+
:members:
138+
136139
.. _github repos doc: http://developer.github.com/v3/repos
137140
.. _github collaborators doc: http://developer.github.com/v3/repos/collaborators
138141
.. _github commits doc: http://developer.github.com/v3/repos/commits

pygithub3/requests/repos/hooks.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
4+
from . import Request
5+
from pygithub3.resources.repos import Hook
6+
7+
8+
class List(Request):
9+
10+
uri = 'repos/{user}/{repo}/hooks'
11+
resource = Hook
12+
13+
14+
class Get(Request):
15+
16+
uri = 'repos/{user}/{repo}/hooks/{id}'
17+
resource = Hook
18+
19+
20+
class Create(Request):
21+
22+
uri = 'repos/{user}/{repo}/hooks'
23+
resource = Hook
24+
body_schema = {
25+
'schema': ('name', 'config', 'events', 'active'),
26+
'required': ('name', 'config'),
27+
}
28+
29+
30+
class Update(Request):
31+
32+
uri = 'repos/{user}/{repo}/hooks/{id}'
33+
resource = Hook
34+
body_schema = {
35+
'schema': ('name', 'config', 'events', 'add_events', 'remove_events',
36+
'active'),
37+
'required': (),
38+
}
39+
40+
41+
class Test(Request):
42+
43+
uri = 'repos/{user}/{repo}/hooks/{id}/test'
44+
45+
46+
class Delete(Request):
47+
48+
uri = 'repos/{user}/{repo}/hooks/{id}'

pygithub3/resources/repos.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,10 @@ def ball_to_upload(self):
115115
'Filename': self.name, 'AWSAccessKeyId': self.accesskeyid,
116116
'Policy': self.policy, 'Signature': self.signature,
117117
'Content-Type': self.mime_type})
118+
119+
class Hook(Resource):
120+
121+
_dates = ('created_at', 'pushed_at')
122+
123+
def __str__(self):
124+
return '<Hook (%s)>' % getattr(self, 'name', '')

pygithub3/services/base.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ def make_request(self, request, **kwargs):
8383
kwargs['repo'] = kwargs['repo'] or self.get_repo()
8484
return self.request_builder(request, **kwargs)
8585

86+
def _request(self, verb, request, **kwargs):
87+
self._client.request(verb, request, **kwargs)
88+
8689
def _bool(self, request, **kwargs):
8790
try:
8891
self._client.head(request, **kwargs)

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 .hooks import Hooks
1112

1213

1314
class Repos(Service):
@@ -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.hooks = Hooks(**config)
2325
super(Repos, self).__init__(**config)
2426

2527
def list(self, user=None, type='all'):

pygithub3/services/repos/commits.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class Commits(Service, MimeTypeMixin):
99
<http://developer.github.com/v3/repos/commits>`_
1010
1111
.. note::
12-
This service support :ref:`mimetypes` configuration
12+
This service support :ref:`mimetypes-section` configuration
1313
"""
1414

1515
#TODO: Pagination structure differs from usual

pygithub3/services/repos/hooks.py

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
4+
from . import Service
5+
6+
7+
class Hooks(Service):
8+
""" Consume `Hooks API
9+
<http://developer.github.com/v3/repos/hooks>`_
10+
11+
.. warning::
12+
You must be authenticated and have repository's admin-permission
13+
"""
14+
15+
def list(self, user=None, repo=None):
16+
""" Get repository's hooks
17+
18+
:param str user: Username
19+
:param str repo: Repository
20+
:returns: A :doc:`result`
21+
22+
.. note::
23+
Remember :ref:`config precedence`
24+
"""
25+
request = self.make_request('repos.hooks.list', user=user, repo=repo)
26+
return self._get_result(request)
27+
28+
def get(self, hook_id, user=None, repo=None):
29+
""" Get a single hook
30+
31+
:param int hook_id: Hook id
32+
:param str user: Username
33+
:param str repo: Repository
34+
35+
.. note::
36+
Remember :ref:`config precedence`
37+
"""
38+
request = self.make_request('repos.hooks.get',
39+
id=hook_id, user=user, repo=repo)
40+
return self._get(request)
41+
42+
def create(self, data, user=None, repo=None):
43+
""" Create a hook
44+
45+
:param dict data: Input. See `github hooks doc`_
46+
:param str user: Username
47+
:param str repo: Repository
48+
49+
.. note::
50+
Remember :ref:`config precedence`
51+
52+
::
53+
54+
data = {
55+
"name": "acunote",
56+
"active": True,
57+
"config": {
58+
'token': 'AAA...',
59+
},
60+
"events": ['push', 'issues'],
61+
}
62+
hooks_service.create(data, user='octocat', repo='oct_repo')
63+
"""
64+
request = self.make_request('repos.hooks.create',
65+
user=user, repo=repo, body=data)
66+
return self._post(request)
67+
68+
def update(self, hook_id, data, user=None, repo=None):
69+
""" Update a single hook
70+
71+
:param int hook_id: Hook id
72+
:param dict data: Input. See `github hooks doc`_
73+
:param str user: Username
74+
:param str repo: Repository
75+
76+
.. note::
77+
Remember :ref:`config precedence`
78+
79+
::
80+
81+
hooks_service.update(42, dict(active=False), user='octocat',
82+
repo='oct_repo')
83+
"""
84+
request = self.make_request('repos.hooks.update',
85+
id=hook_id, user=user, repo=repo, body=data)
86+
return self._patch(request)
87+
88+
def test(self, hook_id, user=None, repo=None):
89+
""" Test a hook
90+
91+
:param str user: Username
92+
:param str repo: Repository
93+
94+
.. note::
95+
Remember :ref:`config precedence`
96+
97+
This will trigger the hook with the latest push to the current
98+
repository.
99+
"""
100+
request = self.make_request('repos.hooks.test',
101+
id=hook_id, user=user, repo=repo)
102+
self._request('post', request)
103+
104+
def delete(self, hook_id, user=None, repo=None):
105+
""" Delete a single hook
106+
107+
:param int hook_id: Hook id
108+
:param str user: Username
109+
:param str repo: Repository
110+
111+
.. note::
112+
Remember :ref:`config precedence`
113+
"""
114+
request = self.make_request('repos.hooks.delete',
115+
id=hook_id, user=user, repo=repo)
116+
self._delete(request)

pygithub3/tests/services/test_repos.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from pygithub3.tests.utils.core import TestCase
88
from pygithub3.services.repos import (Repos, Collaborators, Commits, Downloads,
9-
Forks, Keys, Watchers)
9+
Forks, Keys, Watchers, Hooks)
1010
from pygithub3.resources.base import json
1111
from pygithub3.tests.utils.base import (mock_response, mock_response_result,
1212
mock_json)
@@ -367,3 +367,46 @@ def test_UNWATCH(self, request_method):
367367
self.ws.unwatch()
368368
self.assertEqual(request_method.call_args[0],
369369
('delete', _('user/watched/oct/re_oct')))
370+
371+
372+
@patch.object(requests.sessions.Session, 'request')
373+
class TestHooksService(TestCase):
374+
375+
def setUp(self):
376+
self.hs = Hooks(user='oct', repo='re_oct')
377+
378+
def test_LIST(self, request_method):
379+
request_method.return_value = mock_response_result()
380+
self.hs.list().all()
381+
self.assertEqual(request_method.call_args[0],
382+
('get', _('repos/oct/re_oct/hooks')))
383+
384+
def test_GET(self, request_method):
385+
request_method.return_value = mock_response()
386+
self.hs.get(1)
387+
self.assertEqual(request_method.call_args[0],
388+
('get', _('repos/oct/re_oct/hooks/1')))
389+
390+
def test_CREATE(self, request_method):
391+
request_method.return_value = mock_response('post')
392+
self.hs.create(dict(name='acunote', config={'usr': 'http...'}))
393+
self.assertEqual(request_method.call_args[0],
394+
('post', _('repos/oct/re_oct/hooks')))
395+
396+
def test_UPDATE(self, request_method):
397+
request_method.return_value = mock_response('patch')
398+
self.hs.update(1, dict(events=['push']))
399+
self.assertEqual(request_method.call_args[0],
400+
('patch', _('repos/oct/re_oct/hooks/1')))
401+
402+
def test_TEST(self, request_method):
403+
request_method.return_value = mock_response('post')
404+
self.hs.test(1)
405+
self.assertEqual(request_method.call_args[0],
406+
('post', _('repos/oct/re_oct/hooks/1/test')))
407+
408+
def test_DELETE(self, request_method):
409+
request_method.return_value = mock_response('delete')
410+
self.hs.delete(1)
411+
self.assertEqual(request_method.call_args[0],
412+
('delete', _('repos/oct/re_oct/hooks/1')))

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
license='ISC',
1616
packages=find_packages(exclude=['*tests*']),
1717
install_requires=map(str.strip, open('requirements.txt')),
18-
include_package_data = True,
18+
include_package_data=True,
1919
classifiers=(
2020
'Programming Language :: Python',
2121
'Programming Language :: Python :: 2.6',

0 commit comments

Comments
 (0)