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