def check_reviews_repobee_4(allocations_file: pathlib.Path, title_regex: str, api: plug.PlatformAPI) -> None: """Preview version of the `reviews check` command for RepoBee 4.""" data = json.loads(allocations_file.read_text(sys.getdefaultencoding())) review_allocations = data["allocations"] num_reviews = int(data["num_reviews"]) expected_reviewers = { allocation["reviewed_repo"]["url"]: allocation["review_team"]["members"] for allocation in review_allocations } reviewed_repos = progresswrappers.get_repos(expected_reviewers.keys(), api) reviews = collections.defaultdict(list) for reviewed_repo in reviewed_repos: review_issue_authors = { issue.author for issue in api.get_repo_issues(reviewed_repo) if re.match(title_regex, issue.title) } for expected_reviewer in expected_reviewers[reviewed_repo.url]: reviews[expected_reviewer].append( plug.Review( repo=reviewed_repo.name, done=expected_reviewer in review_issue_authors, )) plug.echo( formatters.format_peer_review_progress_output( reviews, list(itertools.chain.from_iterable(expected_reviewers.values())), num_reviews, ))
def close_issue( title_regex: str, repos: Iterable[plug.StudentRepo], api: plug.PlatformAPI ) -> None: """Close issues whose titles match the title_regex in student repos. Args: title_regex: A regex to match against issue titles. assignment_names: Names of assignments. teams: Team objects specifying student groups. api: An implementation of :py:class:`repobee_plug.PlatformAPI` used to interface with the platform (e.g. GitHub or GitLab) instance. """ repo_urls = (repo.url for repo in repos) platform_repos = progresswrappers.get_repos(repo_urls, api) for repo in platform_repos: to_close = [ issue for issue in api.get_repo_issues(repo) if re.match(title_regex, issue.title) and issue.state == plug.IssueState.OPEN ] for issue in to_close: api.close_issue(issue) msg = f"Closed {repo.name}/#{issue.number}='{issue.title}'" platform_repos.write(msg) # type: ignore plug.log.info(msg)
def _open_issue_by_urls(repo_urls: Iterable[str], issue: plug.Issue, api: plug.PlatformAPI) -> None: """Open issues in the repos designated by the repo_urls. Args: repo_urls: URLs to repos in which to open an issue. issue: An issue to open. api: An implementation of :py:class:`repobee_plug.PlatformAPI` used to interface with the platform (e.g. GitHub or GitLab) instance. """ repos = progresswrappers.get_repos(repo_urls, api) for repo in repos: issue = api.create_issue(issue.title, issue.body, repo) msg = f"Opened issue {repo.name}/#{issue.number}-'{issue.title}'" repos.write(msg) # type: ignore plug.log.info(msg)
def open_issue( issue: plug.Issue, assignment_names: Iterable[str], teams: Iterable[plug.StudentTeam], api: plug.PlatformAPI, ) -> None: """Open an issue in student repos. Args: assignment_names: Names of assignments. teams: Team objects specifying student groups. issue: An issue to open. api: An implementation of :py:class:`repobee_plug.PlatformAPI` used to interface with the platform (e.g. GitHub or GitLab) instance. """ repo_urls = api.get_repo_urls(team_names=[t.name for t in teams], assignment_names=assignment_names) repos = progresswrappers.get_repos(repo_urls, api) for repo in repos: issue = api.create_issue(issue.title, issue.body, repo) msg = f"Opened issue {repo.name}/#{issue.number}-'{issue.title}'" repos.write(msg) # type: ignore plug.log.info(msg)