#!/usr/bin/env python3 import json import math from commands.base import BaseCommand from submission import Submission class Comments(BaseCommand): width = 5 @staticmethod def sort_comments(comments): result = {} for comment in comments: author = comment["author"]["username"], comment["author"]["name"] if author not in result: result[author] = dict() file_path = ( comment["position"]["new_path"] if "position" in comment else None ) if file_path not in result[author]: result[author][file_path] = list() result[author][file_path].append(comment) # sort by lines for author in result: for file_path in result[author]: result[author][file_path].sort( key=lambda comment: comment["position"]["new_line"] if "position" in comment else math.inf ) return result @staticmethod def print_comments(comments): comments = Comments.sort_comments(comments) for author in comments: login, name = author header = f"***** {name} ({login}) *****".center(40, "*").center(80) print(header) for file_path in comments[author]: if file_path is not None: filename = file_path.split("/")[-1] print(f"\n`{filename}`\n{'-'*(len(filename) + 2)}") for comment in comments[author][file_path]: if comment["system"]: continue if comment["type"] == "DiffNote": body = comment["body"].replace( "\n", "\n" + " " * (len(str(comment["position"]["new_line"])) + 5), ) print(f"""- L{comment["position"]["new_line"]}: {body}""") else: print(f"""[{comment["created_at"]}]\n{comment["body"]}""") print(header) def exec(self, submission: Submission) -> None: mrs = self.gitlab.get_mrs_for_branch(submission.branch) if not mrs: return iid = mrs[0]["iid"] comments = self.gitlab.get_comments(iid) branch = f"### {submission.branch.center(20)} ###".upper().center(80, "#") print(branch) self.print_comments(comments) print(branch)