Skip to content

Commit 10fa2bb

Browse files
author
Chang She
committed
DOC: github issue scraper to generate release notes
1 parent 325afdf commit 10fa2bb

File tree

1 file changed

+88
-0
lines changed

1 file changed

+88
-0
lines changed

scripts/gen_release_notes.py

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import sys
2+
import urllib2
3+
import json
4+
from datetime import datetime
5+
6+
7+
class Milestone(object):
8+
9+
def __init__(self, title, number):
10+
self.title = title
11+
self.number = number
12+
13+
def __eq__(self, other):
14+
if isinstance(other, Milestone):
15+
return self.number == other.number
16+
return False
17+
18+
class Issue(object):
19+
20+
def __init__(self, title, labels, number, milestone, body, state):
21+
self.title = title
22+
self.labels = set([x['name'] for x in labels])
23+
self.number = number
24+
self.milestone = milestone
25+
self.body = body
26+
self.closed = state == 'closed'
27+
28+
def __eq__(self, other):
29+
if isinstance(other, Issue):
30+
return self.number == other.number
31+
return False
32+
33+
def get_issues():
34+
all_issues = []
35+
page_number = 1
36+
while True:
37+
iss = _get_page(page_number)
38+
if len(iss) == 0:
39+
break
40+
page_number += 1
41+
all_issues.extend(iss)
42+
return all_issues
43+
44+
def _get_page(page_number):
45+
gh_url = ('https://api.github.com/repos/pydata/pandas/issues?'
46+
'milestone=*&state=closed&assignee=*&page=%d') % page_number
47+
req = urllib2.Request(gh_url)
48+
rs = urllib2.urlopen(req).readlines()[0]
49+
jsondata = json.loads(rs)
50+
issues = [Issue(x['title'], x['labels'], x['number'],
51+
get_milestone(x['milestone']), x['body'], x['state'])
52+
for x in jsondata]
53+
return issues
54+
55+
def get_milestone(data):
56+
if data is None:
57+
return None
58+
return Milestone(data['title'], data['number'])
59+
60+
def collate_label(issues, label):
61+
lines = []
62+
for x in issues:
63+
if label in x.labels:
64+
lines.append('\t- %s(#%d)' % (x.title, x.number))
65+
66+
return '\n'.join(lines)
67+
68+
def release_notes(milestone):
69+
issues = get_issues()
70+
71+
headers = ['New Features', 'Improvements to existing features',
72+
'API Changes', 'Bug fixes']
73+
labels = ['New', 'Enhancement', 'API-Change', 'Bug']
74+
75+
rs = 'pandas %s' % milestone
76+
rs += '\n' + ('=' * len(rs))
77+
rs += '\n\n **Release date:** %s' % datetime.today().strftime('%B %d, %Y')
78+
for i, h in enumerate(headers):
79+
rs += '\n\n**%s**\n\n' % h
80+
l = labels[i]
81+
rs += collate_label(issues, l)
82+
83+
return rs
84+
85+
if __name__ == '__main__':
86+
87+
rs = release_notes(sys.argv[1])
88+
print rs

0 commit comments

Comments
 (0)