Skip to content

Commit 8972834

Browse files
author
Alejandro Gómez
committed
Labels and Milestones services added
1 parent 3310bde commit 8972834

File tree

13 files changed

+578
-8
lines changed

13 files changed

+578
-8
lines changed

pygithub3/requests/issues/comments.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,4 @@ class Edit(Request):
3939
class Delete(Request):
4040

4141
uri = 'repos/{user}/{repo}/issues/comments/{id}'
42-
resource = Comment
42+
resource = Comment
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# -*- encoding: utf-8 -*-
2+
3+
from pygithub3.requests.base import Request, ValidationError
4+
from pygithub3.resources.issues import Label
5+
6+
7+
8+
class Get(Request):
9+
uri = 'repos/{user}/{repo}/labels/{name}'
10+
resource = Label
11+
12+
13+
class Create(Request):
14+
uri = 'repos/{user}/{repo}/labels'
15+
resource = Label
16+
body_schema = {
17+
'schema': ('name', 'color'),
18+
'required': ('name', 'color' )
19+
}
20+
21+
def validate_color(color):
22+
color = color.get('color', '')
23+
if not Label.is_valid_color(color):
24+
raise ValidationError('colors must have 6 hexadecimal characters, '
25+
'without # in the beggining')
26+
27+
28+
class Update(Request):
29+
30+
uri = 'repos/{user}/{repo}/labels/{name}'
31+
resource = Label
32+
body_schema = {
33+
'schema': ('name', 'color'),
34+
'required': ('name', 'color' )
35+
}
36+
37+
def validate_color(color):
38+
color = color.get('color', '')
39+
if not Label.is_valid_color(color):
40+
raise ValidationError('colors must have 6 hexadecimal characters, '
41+
'without # in the beggining')
42+
43+
44+
class Delete(Request):
45+
uri = 'repos/{user}/{repo}/labels/{name}'
46+
resource = Label
47+
48+
49+
class List_by_repo(Request):
50+
uri = 'repos/{user}/{repo}/labels'
51+
resource = Label
52+
53+
54+
55+
class List_by_issue(Request):
56+
uri = 'repos/{user}/{repo}/issues/{number}/labels'
57+
resource = Label
58+
59+
60+
class Add_to_issue(Request):
61+
uri = 'repos/{user}/{repo}/issues/{number}/labels'
62+
resource = Label
63+
64+
class Remove_from_issue(Request):
65+
uri = 'repos/{user}/{repo}/issues/{number}/labels/{name}'
66+
resource = Label
67+
68+
69+
class Replace_all(Request):
70+
uri = 'repos/{user}/{repo}/issues/{number}/labels'
71+
resource = Label
72+
73+
74+
class Remove_all(Request):
75+
uri = 'repos/{user}/{repo}/issues/{number}/labels'
76+
resource = Label
77+
78+
79+
class List_by_milestone(Request):
80+
uri = 'repos/{user}/{repo}/milestones/{number}/labels'
81+
resource = Label
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# -*- encoding: utf-8 -*-
2+
3+
from pygithub3.requests.base import Request
4+
from pygithub3.resources.issues import Milestone
5+
6+
7+
class List(Request):
8+
uri = 'repos/{user}/{repo}/milestones'
9+
resource = Milestone
10+
11+
12+
class Get(Request):
13+
uri = 'repos/{user}/{repo}/milestones/{number}'
14+
resource = Milestone
15+
16+
17+
class Create(Request):
18+
uri = 'repos/{user}/{repo}/milestones'
19+
resource = Milestone
20+
body_schema = {
21+
'schema': ('title', 'state', 'description', 'due_on'),
22+
'required': ('title',)
23+
}
24+
25+
26+
class Update(Request):
27+
28+
uri = 'repos/{user}/{repo}/milestones/{number}'
29+
resource = Milestone
30+
body_schema = {
31+
'schema': ('title', 'state', 'description', 'due_on'),
32+
'required': ('title',)
33+
}
34+
35+
36+
class Delete(Request):
37+
uri = 'repos/{user}/{repo}/milestones/{number}'
38+
resource = Milestone

pygithub3/requests/repos/__init__.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from pygithub3.requests.base import Request, ValidationError
44
from pygithub3.resources.users import User
5+
from pygithub3.resources.issues import Label, Milestone
56
from pygithub3.resources.repos import Repo, Team, Tag, Branch
67

78
class List(Request):
@@ -78,3 +79,18 @@ class List_branches(Request):
7879

7980
uri = 'repos/{user}/{repo}/branches'
8081
resource = Branch
82+
83+
class List_labels(Request):
84+
85+
uri = 'repos/{user}/{repo}/labels'
86+
resource = Label
87+
88+
class List_milestones(Request):
89+
90+
uri = 'repos/{user}/{repo}/milestones'
91+
resource = Milestone
92+
# TODO: validate
93+
body_schema = {
94+
'schema': ('state', 'sort', 'direction'),
95+
'required': ()
96+
}

pygithub3/resources/issues.py

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

4+
import re
5+
46
from .base import Resource
57
from .users import User
68

9+
10+
class Label(Resource):
11+
@staticmethod
12+
def is_valid_color(color):
13+
valid_color = re.compile(r'[0-9abcdefABCDEF]{6}')
14+
match = valid_color(color)
15+
if match is None:
16+
return False
17+
return match.start() == 0 and match.end() == len(color)
18+
19+
def __str__(self):
20+
return '<Label (%s)>' % getattr(self, 'name', '')
21+
22+
23+
class Milestone(Resource):
24+
_dates = ('created_at', 'due_on')
25+
_maps = {'creator': User}
26+
27+
def __str__(self):
28+
return '<Milestone (%s)>' % getattr(self, 'title', '')
29+
30+
731
class Issue(Resource):
832

933
_dates = ('created_at', 'updated_at')
@@ -28,4 +52,4 @@ class Event(Resource):
2852
_maps = {'actor': User, 'issue': Issue}
2953

3054
def __str__(self):
31-
return '<Event (%s)>' % (getattr(self, 'commit_id', ''))
55+
return '<Event (%s)>' % (getattr(self, 'commit_id', ''))

pygithub3/services/issues/__init__.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
1-
#!/usr/bin/env python
21
# -*- encoding: utf-8 -*-
32

43
from pygithub3.services.base import Service
54
from .comments import Comments
65
from .events import Events
6+
from .labels import Labels
7+
from .milestones import Milestones
78

89
class Issue(Service):
910
""" Consume `Issues API <http://developer.github.com/v3/issues>`_ """
1011

1112
def __init__(self, **config):
1213
self.comments = Comments(**config)
1314
self.events = Events(**config)
15+
self.labels = Labels(**config)
16+
self.milestones = Milestones(**config)
1417
super(Issue, self).__init__(**config)
1518

1619
def list(self, data={}):
@@ -79,4 +82,4 @@ def update(self, user, repo, number, data):
7982
"""
8083
request = self.request_builder('issues.edit', user=user, repo=repo,
8184
number=number, body=data)
82-
return self._patch(request)
85+
return self._patch(request)

pygithub3/services/issues/comments.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,4 @@ def delete(self, user, repo, id):
7272
"""
7373
request = self.request_builder('issues.comments.delete', user=user,
7474
repo=repo, id=id)
75-
self._delete(request)
75+
self._delete(request)

pygithub3/services/issues/events.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,4 @@ def get(self, user, repo, id):
3939
"""
4040
request = self.request_builder('issues.events.get', user=user,
4141
repo=repo, id=id)
42-
return self._get(request)
42+
return self._get(request)
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
# -*- encoding: utf-8 -*-
2+
3+
from pygithub3.services.base import Service
4+
5+
6+
class Labels(Service):
7+
""" Consume `Labels API
8+
<http://developer.github.com/v3/issues/labels>`_ """
9+
10+
def get(self, user, repo, name):
11+
""" Get a single label
12+
13+
:param str user: Username
14+
:param str repo: Repo name
15+
:param str name: Label name
16+
"""
17+
request = self.request_builder('issues.labels.get', user=user,
18+
repo=repo, name=name)
19+
return self._get(request)
20+
21+
def create(self, user, repo, name, color):
22+
""" Create a label on an repo
23+
24+
:param str user: Username
25+
:param str repo: Repo name
26+
:param str name: Label name
27+
:param str color: Label color
28+
29+
.. warning::
30+
You must be authenticated
31+
"""
32+
request = self.request_builder('issues.labels.create',
33+
user=user,
34+
repo=repo,
35+
body={'name': name,
36+
'color': color,})
37+
return self._post(request)
38+
39+
def update(self, user, repo, name, new_name, color):
40+
""" Update a label on an repo
41+
42+
:param str user: Username
43+
:param str repo: Repo name
44+
:param str name: Label name
45+
:param str name: Label new name
46+
:param str color: Label color
47+
48+
.. warning::
49+
You must be authenticated
50+
"""
51+
request = self.request_builder('issues.labels.update',
52+
user=user,
53+
repo=repo,
54+
name=name,
55+
body={'name': new_name,
56+
'color': color,})
57+
return self._patch(request)
58+
59+
def delete(self, user, repo, name):
60+
""" Delete a label on an repo
61+
62+
:param str user: Username
63+
:param str repo: Repo name
64+
:param str name: Label name
65+
66+
.. warning::
67+
You must be authenticated
68+
"""
69+
request = self.request_builder('issues.labels.delete',
70+
user=user,
71+
repo=repo,
72+
name=name)
73+
return self._delete(request)
74+
75+
def list_by_repo(self, user, repo):
76+
""" List all labels for a repo
77+
78+
:param str user: Username
79+
:param str repo: Repo name
80+
:returns: A :doc:`result`
81+
"""
82+
request = self.request_builder('issues.labels.list_by_repo',
83+
user=user,
84+
repo=repo,)
85+
return self._get(request)
86+
87+
def list_by_issue(self, user, repo, number):
88+
""" List labels for an issue
89+
90+
:param str user: Username
91+
:param str repo: Repo name
92+
:param int number: Issue number
93+
:returns: A :doc:`result`
94+
"""
95+
request = self.request_builder('issues.labels.list_by_issue', user=user,
96+
repo=repo, number=number)
97+
return self._get(request)
98+
99+
def add_to_issue(self, user, repo, number, labels):
100+
""" Add labels to issue
101+
102+
:param str user: Username
103+
:param str repo: Repo name
104+
:param int number: Issue number
105+
:param list labels: List of label names
106+
:returns: A :doc:`result`
107+
"""
108+
request = self.request_builder('issues.labels.add_to_issue',
109+
user=user,
110+
repo=repo,
111+
number=number,
112+
body=labels)
113+
return self._post(request)
114+
115+
def remove_from_issue(self, user, repo, number, label):
116+
""" Remove a label from an issue
117+
118+
:param str user: Username
119+
:param str repo: Repo name
120+
:param int number: Issue number
121+
:param str label: Label name
122+
:returns: A :doc:`result`
123+
"""
124+
request = self.request_builder('issues.labels.remove_from_issue',
125+
user=user,
126+
repo=repo,
127+
number=number,
128+
name=label)
129+
return self._delete(request)
130+
131+
def replace_all(self, user, repo, number, labels):
132+
""" Replace all labels of a issue
133+
134+
:param str user: Username
135+
:param str repo: Repo name
136+
:param int number: Issue number
137+
:param list labels: New labels
138+
:returns: A :doc:`result`
139+
"""
140+
request = self.request_builder('issues.labels.replace_all',
141+
user=user,
142+
repo=repo,
143+
number=number,
144+
body=labels,)
145+
return self._put(request)
146+
147+
def remove_all(self, user, repo, number):
148+
""" Remove all labels from a issue
149+
150+
:param str user: Username
151+
:param str repo: Repo name
152+
:param int number: Issue number
153+
:returns: A :doc:`result`
154+
"""
155+
request = self.request_builder('issues.labels.remove_all',
156+
user=user,
157+
repo=repo,
158+
number=number,)
159+
return self._delete(request)

0 commit comments

Comments
 (0)