Completed
Push — refactor-and-polish ( 11ebae...b8600c )
by Michael
06:24
created

GitHub   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 104
Duplicated Lines 0 %

Test Coverage

Coverage 78.56%

Importance

Changes 4
Bugs 0 Features 0
Metric Value
c 4
b 0
f 0
dl 0
loc 104
ccs 22
cts 28
cp 0.7856
rs 10
wmc 10

8 Methods

Rating   Name   Duplication   Size   Complexity  
A repo() 0 3 1
A owner() 0 3 1
A auth_token() 0 3 1
A create_upload() 0 11 1
A labels() 0 12 1
A pull_request() 0 13 1
B create_release() 0 30 3
A headers() 0 5 1
1 3
import attr
2 3
import requests
3 3
import uritemplate
4 3
from pathlib import Path
5
6
7 3
EXT_TO_MIME_TYPE = {
8
    '.gz': 'application/x-gzip',
9
    '.whl': 'application/zip',
10
    '.zip': 'application/zip',
11
}
12
13
14 3
@attr.s
15 3
class GitHub(object):
16 3
    ISSUE_ENDPOINT = (
17
        'https://api.github.com/repos{/owner}{/repo}/issues{/number}'
18
    )
19 3
    LABELS_ENDPOINT = (
20
        'https://api.github.com/repos{/owner}{/repo}/labels'
21
    )
22 3
    RELEASES_ENDPOINT = (
23
        'https://api.github.com/repos{/owner}{/repo}/releases'
24
    )
25
26 3
    repository = attr.ib()
27
28 3
    @property
29
    def owner(self):
30 3
        return self.repository.owner
31
32 3
    @property
33
    def repo(self):
34 3
        return self.repository.repo
35
36 3
    @property
37
    def auth_token(self):
38 3
        return self.repository.auth_token
39
40 3
    @property
41 3
    def headers(self):
42
        # TODO: requests.Session
43
        return {
44
            'Authorization': 'token {}'.format(self.auth_token)
45
        }
46
47
    def pull_request(self, pr_num):
48
        pull_request_api_url = uritemplate.expand(
49
            self.ISSUE_ENDPOINT,
50 3
            dict(
51
                owner=self.owner,
52
                repo=self.repo,
53
                number=pr_num
54
            ),
55
        )
56
57 3
        return requests.get(
58 3
            pull_request_api_url,
59
            headers=self.headers,
60
        ).json()
61
62
    def labels(self):
63
        labels_api_url = uritemplate.expand(
64
            self.LABELS_ENDPOINT,
65
            dict(
66 3
                owner=self.owner,
67
                repo=self.repo,
68
            ),
69
        )
70
71
        return requests.get(
72
            labels_api_url,
73 3
            headers=self.headers,
74 3
        ).json()
75
76
    def create_release(self, release, uploads=None):
77
        params = {
78
            'tag_name': release.version,
79
            'name': release.name,
80
            'body': release.description,
81 3
            # 'prerelease': True,
82
        }
83
84
        releases_api_url = uritemplate.expand(
85
            self.RELEASES_ENDPOINT,
86
            dict(
87
                owner=self.owner,
88
                repo=self.repo,
89 3
            )
90
        )
91
92
        response = requests.post(
93
            releases_api_url,
94
            headers=self.headers,
95
            json=params,
96
        ).json()
97
98
        upload_url = response['upload_url']
99
        upload_responses = (
100
            [self.create_upload(upload_url, Path(upload)) for upload in uploads]
101
            if uploads
102
            else []
103
        )
104
105
        return response, upload_responses
106
107
    def create_upload(self, upload_url, upload_path):
108
        requests.post(
109
            uritemplate.expand(
110
                upload_url,
111
                {'name': upload_path.name},
112
            ),
113
            headers=dict(**self.headers, **{
114
                'content-type': EXT_TO_MIME_TYPE[upload_path.ext],
115
            }),
116
            data=upload_path.read_bytes(),
117
            verify=False,
118
        )
119