-
Notifications
You must be signed in to change notification settings - Fork 459
Expand file tree
/
Copy pathquality.py
More file actions
113 lines (94 loc) · 3.48 KB
/
quality.py
File metadata and controls
113 lines (94 loc) · 3.48 KB
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
"""Validating PR quality for Netcode PRs"""
#!/usr/bin/env python3
import sys
import json
import lib
def diff_check(diff):
r"""
>>> diff_check('com.unity.netcode.gameobjects/Tests')
True
>>> diff_check('com.unity.netcode.gameobjects/Tests/MyPath')
True
>>> diff_check('com.unity.netcode.gameobjects/Documentation~')
True
>>> diff_check('Packages/com.unity.netcode/Documentation~\nPackages/com.unity.netcode/change')
False
>>> diff_check('Projects/NetcodeSamples/Assets/Tests/PlayMode/SceneLoadingTests.cs')
True
"""
splitlines = diff.splitlines()
has_netcode_changes = False
has_doc_changes = False
for line in splitlines:
if 'com.unity.netcode.gameobjects/Tests' in line:
return True
if 'com.unity.netcode.gameobjects/Documentation~' in line:
has_doc_changes = True
continue
if 'com.unity.netcode.gameobjects/' in line:
has_netcode_changes = True
continue
return (not has_netcode_changes or (not has_netcode_changes and has_doc_changes))
def check_for_tests():
"""Invoke git diff against main then validate against criteria."""
diff = lib.git_diff_main()
if diff_check(diff):
print('Success')
sys.exit(0)
def qa_added(draft, reviews, reviewers):
"""
>>> qa_added(True, [], [])
True
>>> qa_added(False, [], [])
False
>>> qa_added(False, [{'author' : {'login' : 'michalChrobot'}}], [])
True
>>> qa_added(False, [{'author' : {'login' : 'michalChrobota'}}], [])
False
>>> qa_added(False, [], [{'node' : {'requestedReviewer' : 'michalChrobot'}}])
True
>>> qa_added(False, [], [{'node' : {'requestedReviewer' : 'michalChrobota'}}])
False
>>> qa_added(False, [{'author' : {'login' : 'Unity-Technologies/netcode-qa'}}], [])
True
>>> qa_added(False, [{'author' : {'login' : 'Unity-Technologies/netcode-qaa'}}], [])
False
>>> qa_added(False, [], [{'node' : {'requestedReviewer' : 'Unity-Technologies/netcode-qa'}}])
True
>>> qa_added(False, [], [{'node' : {'requestedReviewer' : 'Unity-Technologies/netcode-qaa'}}])
False
"""
if draft:
return True
for review in reviews:
if review['author']['login'] == 'michalChrobot':
return True
if review['author']['login'] == 'Unity-Technologies/netcode-qa':
return True
for review in reviewers:
reviewRequests = json.dumps(review['node']['requestedReviewer'])
if 'michalChrobot' in reviewRequests:
return True
if 'Unity-Technologies/netcode-qa' in reviewRequests:
return True
return False
def check_for_qa():
"""Check PR for having QA assigned."""
repo_owner = 'Unity-Technologies'
repo_name = 'com.unity.netcode.gameobjects'
pr_number = lib.get_env('YAMATO_PR_ID')
github = lib.GitHubGraphql()
pr_reviewers = github.list_pr_reviewers(repo_owner, repo_name, pr_number)
draft = pr_reviewers['isDraft']
reviews = list(pr_reviewers['reviews']['nodes'])
review_requests = list(pr_reviewers['reviewRequests']['edges'])
if qa_added(draft, reviews, review_requests):
print('Success')
sys.exit(0)
if __name__ == '__main__':
check_for_tests()
check_for_qa()
print('##yamato[result [title=Missing tests; summary=No tests or QA was detected. \
Please add test coverage for the changes or @netcode-qa as a reviewer; \
conclusion=failure]]')
sys.exit(-1)