Skip to content

Commit 5bd3a9d

Browse files
committed
WIP on issues
Fix GET params Config precendence of user/repo TODO: milestones , fix tests and test it
1 parent 897671d commit 5bd3a9d

File tree

10 files changed

+238
-171
lines changed

10 files changed

+238
-171
lines changed
Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,20 @@
11
#!/usr/bin/env python
22
# -*- encoding: utf-8 -*-
33

4-
from pygithub3.requests.base import Request, ValidationError
4+
from pygithub3.requests.base import Request
55
from pygithub3.resources.issues import Issue
66

7+
78
class List(Request):
89

910
uri = 'issues'
1011
resource = Issue
11-
body_schema = {
12-
'schema': ('filter', 'state', 'labels', 'sort', 'direction', 'since'),
13-
'required': ()
14-
}
1512

1613

1714
class List_by_repo(Request):
1815

1916
uri = 'repos/{user}/{repo}/issues'
2017
resource = Issue
21-
body_schema = {
22-
'schema': ('milestone', 'state', 'assignee', 'mentioned', 'labels',
23-
'sort', 'direction', 'since'),
24-
'required': ()
25-
}
2618

2719

2820
class Get(Request):
@@ -41,11 +33,12 @@ class Create(Request):
4133
}
4234

4335

44-
class Edit(Request):
36+
class Update(Request):
4537

4638
uri = 'repos/{user}/{repo}/issues/{number}'
4739
resource = Issue
4840
body_schema = {
49-
'schema': ('title', 'body', 'assignee', 'state', 'milestone', 'lables'),
41+
'schema': ('title', 'body', 'assignee', 'state', 'milestone',
42+
'lables'),
5043
'required': ()
51-
}
44+
}

pygithub3/requests/issues/labels.py

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
from pygithub3.resources.issues import Label
55

66

7+
class List(Request):
8+
9+
uri = 'repos/{user}/{repo}/labels'
10+
resource = Label
11+
712

813
class Get(Request):
914
uri = 'repos/{user}/{repo}/labels/{name}'
@@ -27,34 +32,21 @@ def clean_body(self):
2732
return self.body
2833

2934

30-
class Update(Request):
35+
class Update(Create):
3136

3237
uri = 'repos/{user}/{repo}/labels/{name}'
3338
resource = Label
3439
body_schema = {
3540
'schema': ('name', 'color'),
3641
'required': ('name', 'color' )
3742
}
38-
def clean_body(self):
39-
color = self.body.get('color', '')
40-
if not Label.is_valid_color(color):
41-
raise ValidationError('colors must have 6 hexadecimal characters, '
42-
'without # in the beggining')
43-
else:
44-
return self.body
4543

4644

4745
class Delete(Request):
4846
uri = 'repos/{user}/{repo}/labels/{name}'
4947
resource = Label
5048

5149

52-
class List_by_repo(Request):
53-
uri = 'repos/{user}/{repo}/labels'
54-
resource = Label
55-
56-
57-
5850
class List_by_issue(Request):
5951
uri = 'repos/{user}/{repo}/issues/{number}/labels'
6052
resource = Label

pygithub3/requests/repos/__init__.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,6 @@ class List_branches(Request):
8181
uri = 'repos/{user}/{repo}/branches'
8282
resource = Branch
8383

84-
class List_labels(Request):
85-
86-
uri = 'repos/{user}/{repo}/labels'
87-
resource = Label
8884

8985
class List_milestones(Request):
9086

pygithub3/resources/base.py

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

4+
from datetime import datetime
5+
46
from pygithub3.core.utils import json
57

8+
GITHUB_DATE_FORMAT = '%Y-%m-%dT%H:%M:%SZ'
9+
610

711
class Resource(object):
812

@@ -44,9 +48,8 @@ def wrapper(resource, raw_resource):
4448
return wrapper
4549

4650
def parse_date(string_date):
47-
from datetime import datetime
4851
try:
49-
date = datetime.strptime(string_date, '%Y-%m-%dT%H:%M:%SZ')
52+
date = datetime.strptime(string_date, GITHUB_DATE_FORMAT)
5053
except TypeError:
5154
date = None
5255
return date

pygithub3/resources/issues.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,13 @@ class Issue(Resource):
3535

3636
_dates = ('created_at', 'updated_at', 'closed_at')
3737
_maps = {
38-
'assignee': User,
39-
'user': User,
38+
'assignee': User,
39+
'user': User,
4040
'milestone': Milestone,
4141
'pull_request': PullRequest
4242
}
4343

44-
_collection_maps = {'labels': Label}
44+
_collection_maps = {'labels': Label}
4545

4646
def __str__(self):
4747
return '<Issue (%s)>' % getattr(self, 'number', '')
Lines changed: 73 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
# -*- encoding: utf-8 -*-
22

3-
from pygithub3.services.base import Service
3+
from datetime import datetime
4+
5+
from pygithub3.services.base import Service, MimeTypeMixin
6+
from pygithub3.resources.base import GITHUB_DATE_FORMAT
47
from .comments import Comments
58
from .events import Events
69
from .labels import Labels
710
from .milestones import Milestones
811

9-
class Issue(Service):
12+
13+
class Issue(Service, MimeTypeMixin):
1014
""" Consume `Issues API <http://developer.github.com/v3/issues>`_ """
1115

1216
def __init__(self, **config):
@@ -16,70 +20,115 @@ def __init__(self, **config):
1620
self.milestones = Milestones(**config)
1721
super(Issue, self).__init__(**config)
1822

19-
def list(self, data={}):
23+
def list(self, filter='assigned', state='open', labels='', sort='created',
24+
direction='desc', since=None):
2025
""" List your issues
2126
22-
:param dict data: Input. See `github issues doc`_
27+
:param str filter: 'assigned', 'created', 'mentioned' or 'subscribed'
28+
:param str state: 'open' or 'closed'
29+
:param str labels: List of comma separated Label names. e.g: bug,ui,
30+
@high
31+
:param str sort: 'created', 'updated' or 'comments'
32+
:param str direction: 'asc' or 'desc'
33+
:param datetime since: Date filter
2334
:returns: A :doc:`result`
2435
2536
.. warning::
2637
You must be authenticated
2738
"""
28-
request = self.request_builder('issues.list', body=data)
29-
return self._get_result(request)
30-
31-
def list_by_repo(self, user, repo, data={}):
39+
params = dict(filter=filter, state=state, labels=labels, sort=sort,
40+
direction=direction)
41+
try:
42+
date = datetime.strptime(since, GITHUB_DATE_FORMAT)
43+
params.update(since=date)
44+
except:
45+
pass
46+
47+
request = self.request_builder('issues.list')
48+
return self._get_result(request, **params)
49+
50+
def list_by_repo(self, user=None, repo=None, milestone='*', state='open',
51+
assignee='*', mentioned='', labels='', sort='created',
52+
direction='desc', since=None):
3253
""" List issues for a repo
3354
34-
:param dict data: Input. See `github issues doc`_
55+
:param str milestone: Milestone ID, 'none' or '*'
56+
:param str state: 'open' or 'closed'
57+
:param str assignee: Username, 'none' or '*'
58+
:param str mentioned: Username
59+
:param str labels: List of comma separated Label names. e.g: bug,ui,
60+
@high
61+
:param str sort: 'created', 'updated' or 'comments'
62+
:param str direction: 'asc' or 'desc'
63+
:param datetime since: Date filter
3564
:returns: A :doc:`result`
36-
"""
37-
request = self.request_builder('issues.list_by_repo', user=user,
38-
repo=repo, body=data)
39-
return self._get_result(request)
4065
41-
def get(self, user, repo, number):
66+
.. note::
67+
Remember :ref:`config precedence`
68+
"""
69+
params = dict(milestone=milestone, state=state, assignee=assignee,
70+
mentioned=mentioned, labels=labels, sort=sort, direction=direction)
71+
try:
72+
date = datetime.strptime(since, GITHUB_DATE_FORMAT)
73+
params.update(since=date)
74+
except:
75+
pass
76+
77+
request = self.make_request('issues.list_by_repo', user=user,
78+
repo=repo)
79+
return self._get_result(request, **params)
80+
81+
def get(self, number, user=None, repo=None):
4282
""" Get a single issue
4383
84+
:param int number: Issue number
4485
:param str user: Username
4586
:param str repo: Repo name
46-
:param int number: Issue number
87+
88+
.. note::
89+
Remember :ref:`config precedence`
4790
"""
48-
request = self.request_builder('issues.get', user=user, repo=repo,
91+
request = self.make_request('issues.get', user=user, repo=repo,
4992
number=number)
5093
return self._get(request)
5194

52-
def create(self, user, repo, data):
95+
def create(self, data, user=None, repo=None):
5396
""" Create an issue
5497
98+
:param dict data: Input. See `github issues doc`_
5599
:param str user: Username
56100
:param str repo: Repo name
57-
:param dict data: Input. See `github issues doc`_
58101
59102
.. warning::
60103
You must be authenticated
61104
105+
.. note::
106+
Remember :ref:`config precedence`
107+
62108
::
63109
64-
issues_service.create(dict(title='My test issue',
110+
issues_service.create(dict(title='My test issue',
65111
body='This needs to be fixed ASAP.',
66112
assignee='copitux'))
67113
"""
68-
request = self.request_builder('issues.create', user=user, repo=repo,
114+
request = self.make_request('issues.create', user=user, repo=repo,
69115
body=data)
70116
return self._post(request)
71117

72-
def update(self, user, repo, number, data):
118+
def update(self, number, data, user=None, repo=None):
73119
""" Update an issue
74120
75-
:param str user: Username
76-
:param str repo: Repo name
77121
:param int number: Issue number
78122
:param dict data: Input. See `github issues doc`_
123+
:param str user: Username
124+
:param str repo: Repo name
79125
80126
.. warning::
81127
You must be authenticated
128+
129+
.. note::
130+
Remember :ref:`config precedence`
82131
"""
83-
request = self.request_builder('issues.edit', user=user, repo=repo,
132+
request = self.make_request('issues.update', user=user, repo=repo,
84133
number=number, body=data)
85134
return self._patch(request)

0 commit comments

Comments
 (0)