| #!/usr/bin/python3 |
| |
| import argparse |
| import json |
| import os |
| import re |
| from collections import defaultdict |
| from typing import Dict |
| |
| import libvoters.acceptable as acceptable |
| from libvoters.time import TimeOfDay, timestamp |
| |
| |
| class subcmd: |
| def __init__(self, parser: argparse._SubParsersAction) -> None: |
| p = parser.add_parser( |
| "analyze-reviews", help="Determine points for reviews" |
| ) |
| |
| p.add_argument( |
| "--before", |
| "-b", |
| help="Before timestamp (YYYY-MM-DD)", |
| required=True, |
| ) |
| p.add_argument( |
| "--after", |
| "-a", |
| help="After timestamp (YYYY-MM-DD)", |
| required=True, |
| ) |
| |
| p.set_defaults(cmd=self) |
| |
| def run(self, args: argparse.Namespace) -> int: |
| before = timestamp(args.before, TimeOfDay.AM) |
| after = timestamp(args.after, TimeOfDay.PM) |
| |
| changes_per_user: Dict[str, list[int]] = defaultdict(list) |
| |
| for f in sorted(os.listdir(args.dir)): |
| path = os.path.join(args.dir, f) |
| if not os.path.isfile(path): |
| continue |
| |
| if not re.match(r"[0-9]*\.json", f): |
| continue |
| |
| with open(path, "r") as file: |
| data = json.load(file) |
| |
| project = data["project"] |
| id_number = data["number"] |
| author = data["owner"]["username"] |
| |
| if not acceptable.project(project): |
| print("Rejected project:", project, id_number) |
| |
| comments_per_user: Dict[str, int] = defaultdict(int) |
| |
| for patch_set in data["patchSets"]: |
| created_on = data["createdOn"] |
| |
| if created_on > before or created_on < after: |
| continue |
| |
| if "comments" not in patch_set: |
| continue |
| |
| for comment in patch_set["comments"]: |
| reviewer = comment["reviewer"]["username"] |
| |
| if reviewer == author: |
| continue |
| if not acceptable.file(project, comment["file"]): |
| continue |
| |
| comments_per_user[reviewer] += 1 |
| |
| print(project, id_number) |
| for user, count in comments_per_user.items(): |
| if count < 3: |
| continue |
| print(" ", user, count) |
| changes_per_user[user].append(id_number) |
| |
| with open(os.path.join(args.dir, "reviews.json"), "w") as outfile: |
| outfile.write(json.dumps(changes_per_user, indent=4)) |
| |
| return 0 |