-
Notifications
You must be signed in to change notification settings - Fork 0
/
list_milestones.py
145 lines (123 loc) · 4.07 KB
/
list_milestones.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/usr/bin/env python
import pickle
import requests
import simplejson
import sys
import config as c
import markdown as fmt
import vars as v
### WRITER
def write_issue(issue):
fmt.list_item(issue['title'])
fmt.newline()
def write_issues(issues):
for issue in issues:
write_issue(issue)
def write_milestone(milestone):
due = milestone['due']
due = due.split('T')[0] if due else 'LATER'
title = milestone['title'] + ' ' + '<span style="float: right; font-size: 75%">(Due: ' + due + ')</span>'
description = milestone['description']
fmt.h2(title)
fmt.paragraph(description)
write_issues(milestone['issues'])
fmt.rule()
def write_milestones(milestones):
for k, issues in milestones:
_, title, description, due = k
write_milestone({'title': title,
'description': description,
'due': due,
'issues': issues})
def get_milestone_tuple(issue):
ms = issue['milestone']
if ms is None:
return (None, 'MISCELLANEOUS', '', None)
else:
return (ms['number'], ms['title'], ms['description'], ms['due_on'])
def into_milestones(issues):
milestones = {}
for issue in issues:
milestones.setdefault(get_milestone_tuple(issue), []).append(issue)
return milestones
def add_milestones_with_no_issues(milestones):
output = milestones.copy()
resp = requests.get(c.get_milestone_url(v._CONFIG_), auth=c.get_basic_auth_credentials(v._CONFIG_))
if resp.status_code == 200:
empty_milestones = [m for m in simplejson.loads(resp.content) if m['open_issues'] == 0]
for ms in empty_milestones:
output[(ms['number'], ms['title'], ms['description'], ms['due_on'])] = []
else:
print 'Unexpected reponse'
return output
def cmp_due_dates(a, b):
ka, va = a
kb, vb = b
_, _, _, a_due = ka
_, _, _, b_due = kb
if a_due == b_due:
return 0
if a_due is None:
return 1
if b_due is None:
return -1
if a_due < b_due:
return -1
if b_due < a_due:
return 1
else:
raise RuntimeError()
def fetch_issues():
def error():
print 'Unexpected reponse'
print 'Status: %s' % resp.status_code
sys.exit(1)
resp = requests.get(c.get_issues_url(v._CONFIG_), auth=c.get_basic_auth_credentials(v._CONFIG_))
if resp.status_code == 200:
issues = simplejson.loads(resp.content)
resp = requests.get(c.get_issues_url(v._CONFIG_),
auth=c.get_basic_auth_credentials(v._CONFIG_),
params={'state': 'closed'})
if resp.status_code == 200:
issues = issues + simplejson.loads(resp.content)
else:
error()
else:
error()
return issues
### MAIN
def main(use_cache):
try:
c.setup('roadmap.md')
if use_cache:
with open('milestones.pickle') as f:
milestones = pickle.load(f)
else:
issues = fetch_issues()
milestones = add_milestones_with_no_issues(into_milestones(issues))
milestones = sorted(milestones.iteritems(), cmp_due_dates)
with open('milestones.pickle', 'w') as f:
pickle.dump(milestones, f)
fmt.h1('Technology Roadmap')
write_milestones(milestones)
print 'Done.'
finally:
c.teardown()
def main2():
try:
c.setup('roadmap.md')
resp = requests.get(c.get_milestone_url(v._CONFIG_), auth=c.get_basic_auth_credentials(v._CONFIG_))
if resp.status_code == 200:
fmt.h1('Technology Roadmap')
milestones = simplejson.loads(resp.content)
for milestone in milestones:
write_milestone(milestone)
print 'Done.'
else:
print 'Unexpected reponse'
print 'Status: %s' % resp.status_code
finally:
c.teardown()
if __name__ == '__main__':
use_cache = len(sys.argv) > 1 and sys.argv[1] == 'cached'
main(use_cache)