Skip to content

Commit ce95f90

Browse files
committed
Repos.downloads service done
1 parent 99a601f commit ce95f90

File tree

4 files changed

+116
-1
lines changed

4 files changed

+116
-1
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#!/usr/bin/env python
2+
# -*- encoding: utf-8 -*-
3+
4+
from . import Request
5+
6+
from pygithub3.resources.repos import Download
7+
8+
9+
class List(Request):
10+
11+
uri = '/repos/{user}/{repo}/downloads'
12+
resource = Download
13+
14+
15+
class Get(Request):
16+
17+
uri = '/repos/{user}/{repo}/downloads/{id}'
18+
resource = Download
19+
20+
21+
class Create(Request):
22+
23+
uri = '/repos/{user}/{repo}/downloads'
24+
resource = Download
25+
body_schema = {
26+
'schema': ('name', 'size', 'description', 'content_type'),
27+
'required': ('name', 'size')
28+
}
29+
30+
31+
class Delete(Request):
32+
33+
uri = '/repos/{user}/{repo}/downloads/{id}'
34+
resource = Download

pygithub3/resources/repos.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#!/usr/bin/env python
22
# -*- encoding: utf-8 -*-
33

4+
from collections import OrderedDict
5+
46
from .base import Resource
57
from .users import User
68
from .orgs import Org
@@ -100,3 +102,13 @@ class Branch(Resource):
100102

101103
def __str__(self):
102104
return '<Branch (%s)>' % getattr(self, 'name', '')
105+
106+
107+
class Download(Resource):
108+
109+
def ball_to_upload(self):
110+
return OrderedDict({
111+
'key': self.path, 'acl': self.acl, 'success_action_status': '201',
112+
'Filename': self.name, 'AWSAccessKeyId': self.accesskeyid,
113+
'Policy': self.policy, 'Signature': self.signature,
114+
'Content-Type': self.mime_type})

pygithub3/services/repos.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,43 @@
11
#!/usr/bin/env python
22
# -*- encoding: utf-8 -*-
33

4+
import requests
5+
46
from .base import Service, MimeTypeMixin
57

68

9+
class Downloads(Service):
10+
11+
def list(self, user=None, repo=None):
12+
request = self.make_request('repos.downloads.list',
13+
user=user, repo=repo)
14+
return self._get_result(request)
15+
16+
def get(self, id, user=None, repo=None):
17+
request = self.make_request('repos.downloads.get',
18+
id=id, user=user, repo=repo)
19+
return self._get(request)
20+
21+
def create(self, data, user=None, repo=None):
22+
request = self.make_request('repos.downloads.create',
23+
body=data, user=user, repo=repo)
24+
download = self._post(request)
25+
26+
# TODO: improve it. e.g Manage all with file desc
27+
def upload(file_path):
28+
body = download.ball_to_upload()
29+
body['file'] = (file_path, open(file_path, 'rb'))
30+
return requests.post(download.s3_url, files=body)
31+
32+
download.upload = upload
33+
return download
34+
35+
def delete(self, id=id, user=None, repo=None):
36+
request = self.make_request('repos.downloads.delete',
37+
id=id, user=user, repo=repo)
38+
self._delete(request)
39+
40+
741
class Commits(Service, MimeTypeMixin):
842

943
""" TODO: Pagination structure differs from usual
@@ -47,6 +81,7 @@ def delete_comment(self, cid, user=None, repo=None):
4781
comment_id=cid, user=user, repo=repo)
4882
self._delete(request)
4983

84+
5085
class Collaborator(Service):
5186

5287
def list(self, user=None, repo=None):
@@ -74,6 +109,8 @@ class Repo(Service):
74109

75110
def __init__(self, **config):
76111
self.collaborators = Collaborator(**config)
112+
self.commits = Commits(**config)
113+
self.downloads = Downloads(**config)
77114
super(Repo, self).__init__(**config)
78115

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

pygithub3/tests/services/test_repos.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import requests
77
from mock import patch, Mock
88

9-
from pygithub3.services.repos import Repo, Collaborator, Commits
9+
from pygithub3.services.repos import Repo, Collaborator, Commits, Downloads
1010
from pygithub3.resources.base import json
1111
from pygithub3.tests.utils.base import (mock_response, mock_response_result,
1212
mock_json)
@@ -236,3 +236,35 @@ def test_DELETE_comment(self, request_method):
236236
self.cs.delete_comment(1)
237237
self.assertEqual(request_method.call_args[0],
238238
('delete', _('repos/oct/re_oct/comments/1')))
239+
240+
241+
@patch.object(requests.sessions.Session, 'request')
242+
class TestDownloadsService(TestCase):
243+
244+
def setUp(self):
245+
self.ds = Downloads(user='oct', repo='re_oct')
246+
247+
def test_LIST(self, request_method):
248+
request_method.return_value = mock_response_result()
249+
self.ds.list().all()
250+
self.assertEqual(request_method.call_args[0],
251+
('get', _('repos/oct/re_oct/downloads')))
252+
253+
def test_GET(self, request_method):
254+
request_method.return_value = mock_response()
255+
self.ds.get(1)
256+
self.assertEqual(request_method.call_args[0],
257+
('get', _('repos/oct/re_oct/downloads/1')))
258+
259+
def test_DELETE(self, request_method):
260+
request_method.return_value = mock_response('delete')
261+
self.ds.delete(1)
262+
self.assertEqual(request_method.call_args[0],
263+
('delete', _('repos/oct/re_oct/downloads/1')))
264+
265+
def test_CREATE(self, request_method):
266+
request_method.return_value = mock_response('post')
267+
download = self.ds.create({'name': 'some', 'size': 100})
268+
self.assertEqual(request_method.call_args[0],
269+
('post', _('repos/oct/re_oct/downloads')))
270+
self.assertTrue(hasattr(download, 'upload'))

0 commit comments

Comments
 (0)