blob: b3323fa64ffd5b96126d4acd2f7a94067f4d0d32 [file] [log] [blame]
Patrick Williamsd0269de2022-01-06 21:04:25 -06001#!/usr/bin/python3
2
3import argparse
4import json
5import os
6import re
Patrick Williamsd0269de2022-01-06 21:04:25 -06007from collections import defaultdict
Patrick Williamsd0269de2022-01-06 21:04:25 -06008from typing import Dict
9
Patrick Williamsa3db66b2022-12-04 16:27:08 -060010import libvoters.acceptable as acceptable
11from libvoters.time import TimeOfDay, timestamp
12
Patrick Williamsd0269de2022-01-06 21:04:25 -060013
14class subcmd:
15 def __init__(self, parser: argparse._SubParsersAction) -> None:
16 p = parser.add_parser(
17 "analyze-reviews", help="Determine points for reviews"
18 )
19
20 p.add_argument(
21 "--before",
22 "-b",
23 help="Before timestamp (YYYY-MM-DD)",
24 required=True,
25 )
26 p.add_argument(
27 "--after",
28 "-a",
29 help="After timestamp (YYYY-MM-DD)",
30 required=True,
31 )
32
33 p.set_defaults(cmd=self)
34
35 def run(self, args: argparse.Namespace) -> int:
36 before = timestamp(args.before, TimeOfDay.AM)
37 after = timestamp(args.after, TimeOfDay.PM)
38
39 changes_per_user: Dict[str, list[int]] = defaultdict(list)
40
41 for f in sorted(os.listdir(args.dir)):
42 path = os.path.join(args.dir, f)
43 if not os.path.isfile(path):
44 continue
45
Patrick Williamsa3db66b2022-12-04 16:27:08 -060046 if not re.match(r"[0-9]*\.json", f):
Patrick Williamsd0269de2022-01-06 21:04:25 -060047 continue
48
49 with open(path, "r") as file:
50 data = json.load(file)
51
52 project = data["project"]
53 id_number = data["number"]
54 author = data["owner"]["username"]
55
56 if not acceptable.project(project):
57 print("Rejected project:", project, id_number)
58
59 comments_per_user: Dict[str, int] = defaultdict(int)
60
61 for patch_set in data["patchSets"]:
62 created_on = data["createdOn"]
63
64 if created_on > before or created_on < after:
65 continue
66
67 if "comments" not in patch_set:
68 continue
69
70 for comment in patch_set["comments"]:
71 reviewer = comment["reviewer"]["username"]
72
73 if reviewer == author:
74 continue
75 if not acceptable.file(project, comment["file"]):
76 continue
77
78 comments_per_user[reviewer] += 1
79
80 print(project, id_number)
81 for (user, count) in comments_per_user.items():
82 if count < 3:
83 continue
84 print(" ", user, count)
85 changes_per_user[user].append(id_number)
86
87 with open(os.path.join(args.dir, "reviews.json"), "w") as outfile:
88 outfile.write(json.dumps(changes_per_user, indent=4))
89
90 return 0