Skip to content

Commit a0748d2

Browse files
GeekyShackleboltCuriousLearner
authored andcommitted
feat(*): Show PR title on hover over PR number (#3)
1 parent 8f4be4c commit a0748d2

File tree

6 files changed

+63
-29
lines changed

6 files changed

+63
-29
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,6 @@ dictionaries returned by `pull_request_files.py
1414
`views.py` Aside from the flask code, it also contains code for APScheduler. It updates the `files` variable in the background
1515
at specific intervals.
1616

17+
![Pulls-Screenshot](static/images/pulls-front.png)
18+
1719
:-)

process_pulls.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
11
from collections import defaultdict
22

33

4-
def pr_by_file(pull_requests):
4+
def get_files(pull_requests):
55
files = defaultdict(set)
66
for pr in pull_requests:
77
for file in pr['files']['nodes']:
88
filename = file['path']
99
files[filename].add(pr['number'])
10-
return files
11-
12-
13-
def change_values_to_list(pull_requests):
14-
files = pr_by_file(pull_requests)
1510
for filename, pr in files.items():
1611
files[filename] = list(pr)
12+
files[filename].sort()
1713
files = dict(sorted(files.items()))
18-
return files
14+
results = dict()
15+
for file_name in files.keys():
16+
if not file_name.startswith('Misc'):
17+
results[file_name] = files[file_name]
18+
return results
1919

2020

21-
def main(pull_requests):
22-
return change_values_to_list(pull_requests)
21+
def get_titles(pull_requests):
22+
pr_titles = dict()
23+
for pr in pull_requests:
24+
pr_titles.update({pr['number']: pr['title']})
25+
return pr_titles

pull_request_files.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@
1313
headers = {'Authorization': f'bearer {oauth_token}'}
1414

1515

16+
class PullRequests:
17+
def __init__(self, data):
18+
self.pr_data = data
19+
self.files = process_pulls.get_files(self.pr_data)
20+
self.titles = process_pulls.get_titles(self.pr_data)
21+
22+
1623
def get_pull_request_details(endCursor=None):
1724
graphql_query = '''query($previousEndCursor:String) {
1825
repository(owner:"python", name:"cpython") {
@@ -57,14 +64,15 @@ def get_pull_request_details(endCursor=None):
5764
def main():
5865
page = 1
5966
response = get_pull_request_details()
60-
pull_requests = response['data']['repository']['pullRequests']['nodes']
67+
results = response['data']['repository']['pullRequests']['nodes']
6168
while response['data']['repository']['pullRequests']['pageInfo']['hasNextPage']:
6269
page = page + 1
63-
response = get_pull_request_details(response['data']['repository']['pullRequests']['pageInfo']['endCursor'])
64-
pull_requests = pull_requests + response['data']['repository']['pullRequests']['nodes']
65-
66-
files = process_pulls.main(pull_requests)
67-
return files
70+
response = get_pull_request_details(
71+
response['data']['repository']['pullRequests']['pageInfo']['endCursor']
72+
)
73+
results = results + response['data']['repository']['pullRequests']['nodes']
74+
pr_data = PullRequests(results)
75+
return pr_data
6876

6977

7078
if __name__ == "__main__":

static/images/pulls-front.png

30.8 KB
Loading

templates/index.html

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,30 @@
1515
padding-top: 100px;
1616
padding-bottom: 100px;
1717
}
18+
19+
.pr-number {
20+
position: relative;
21+
display: inline-block;
22+
}
23+
24+
/* Tooltip text */
25+
.pr-number .pr-title {
26+
visibility: hidden;
27+
width: 200px;
28+
background-color: black;
29+
color: #fff;
30+
text-align: center;
31+
padding: 3px 3px 3px 3px;
32+
margin-left: 5px;
33+
border-radius: 7px;
34+
position: absolute;
35+
z-index: 1;
36+
}
37+
38+
/* Show the tooltip text when you mouse over the tooltip container */
39+
.pr-number:hover .pr-title {
40+
visibility: visible;
41+
}
1842
</style>
1943
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
2044
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
@@ -49,11 +73,14 @@
4973
</thead>
5074

5175
<tbody>
52-
{% for file_name in results %}
76+
{% for file_name in results.files %}
5377
<tr>
5478
<td><a href="https://github.com/python/cpython/blob/master/{{file_name}}">{{ file_name }}</a></td>
55-
{% for pr in results[file_name] %}
56-
<td><a href="https://github.com/python/cpython/pull/{{pr}}" target="_blank">{{ pr }}</a></td>
79+
{% for pr in results.files[file_name] %}
80+
<td class="pr-number">
81+
<a href="https://github.com/python/cpython/pull/{{pr}}" target="_blank">{{ pr }}</a>
82+
<span class="pr-title">{{ results.titles[pr] }}</span>
83+
</td>
5784
{% endfor %}
5885
</tr>
5986
{% endfor %}

views.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22
import pull_request_files
33
from apscheduler.schedulers.background import BackgroundScheduler
44

5-
files = pull_request_files.main()
5+
pr_data = pull_request_files.main()
66

77

88
def timed_job():
9-
global files
10-
files = pull_request_files.main()
9+
global pr_data
10+
pr_data = pull_request_files.main()
1111

1212

1313
scheduler = BackgroundScheduler()
14-
scheduler.add_job(timed_job, 'interval', minutes=1)
14+
scheduler.add_job(timed_job, 'interval', minutes=5)
1515
scheduler.start()
1616

1717

@@ -22,13 +22,7 @@ def timed_job():
2222
@app.route("/")
2323
@app.route("/index")
2424
def index():
25-
results = files
26-
27-
final_results = dict()
28-
for file_name in results.keys():
29-
if not file_name.startswith('Misc'):
30-
final_results[file_name] = results[file_name]
31-
return render_template('index.html', results=final_results)
25+
return render_template('index.html', results=pr_data)
3226

3327

3428
if __name__ == '__main__':

0 commit comments

Comments
 (0)