From b187b19ece2e0bbbde119ec20e97df0f666f758a Mon Sep 17 00:00:00 2001 From: Gauravpadam Date: Tue, 1 Apr 2025 22:03:06 +0530 Subject: [PATCH 1/4] Misisng abstract methods implemeted --- ogr/abstract.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/ogr/abstract.py b/ogr/abstract.py index dea00865..8558b079 100644 --- a/ogr/abstract.py +++ b/ogr/abstract.py @@ -476,6 +476,13 @@ def get_comments( List of issue comments. """ raise NotImplementedError() + + def who_can_close() -> set[str]: + """ + Returns: + Set of usernames who can close the issue. + """ + raise NotImplementedError() def can_close(self, username: str) -> bool: """ @@ -888,6 +895,34 @@ def close(self) -> "PullRequest": Pull request itself. """ raise NotImplementedError() + + def who_can_close() -> set[str]: + """ + Returns: + Set of usernames who can close the pull request. + """ + raise NotImplementedError() + + def who_can_merge() -> set[str]: + """ + Returns: + Set of usernames who can merge the pull request. + """ + raise NotImplementedError() + + def can_close(self, username: str) -> bool: + """ + Returns: + `True` if user can close the pull request, `False` otherwise. + """ + raise NotImplementedError() + + def can_merge(self, username: str) -> bool: + """ + Returns: + `True` if user can merge the pull request, `False` otherwise. + """ + raise NotImplementedError def merge(self) -> "PullRequest": """ @@ -1535,6 +1570,16 @@ def who_can_close_issue(self) -> set[str]: Names of all users who have permission to modify an issue. """ raise NotImplementedError() + + def can_close_issue(username: str) -> bool: + """ + Args: + username: Login of the user. + + Returns: + `True` if user can close the issue, `False` otherwise. + """ + raise NotImplementedError() def who_can_merge_pr(self) -> set[str]: """ From 23ed7abbd594426dd466b56ccd3f03d61607bd78 Mon Sep 17 00:00:00 2001 From: Gauravpadam Date: Wed, 2 Apr 2025 02:34:34 +0530 Subject: [PATCH 2/4] Implementations for SubClasses --- ogr/services/base.py | 14 ++++++++++++-- ogr/services/github/issue.py | 6 ++++++ ogr/services/github/project.py | 3 +++ ogr/services/github/pull_request.py | 26 +++++++++++++++++++++++++- ogr/services/gitlab/issue.py | 3 +++ ogr/services/gitlab/project.py | 3 +++ ogr/services/gitlab/pull_request.py | 22 ++++++++++++++++++++++ ogr/services/pagure/issue.py | 6 ++++++ ogr/services/pagure/project.py | 5 ++++- ogr/services/pagure/pull_request.py | 17 +++++++++++++++++ 10 files changed, 101 insertions(+), 4 deletions(-) diff --git a/ogr/services/base.py b/ogr/services/base.py index 6c89637e..a5a2ea1a 100644 --- a/ogr/services/base.py +++ b/ogr/services/base.py @@ -45,6 +45,12 @@ class BaseGitProject(GitProject): @property def full_repo_name(self) -> str: return f"{self.namespace}/{self.repo}" + + def can_close_issue(self, username: str) -> bool: + return username in self.who_can_close_issue() + + def can_merge_pr(self, username: str) -> bool: + return username in self.who_can_merge_pr() class BasePullRequest(PullRequest): @@ -80,7 +86,11 @@ def search( def get_statuses(self) -> list[CommitFlag]: commit = self.get_all_commits()[-1] return self.target_project.get_commit_statuses(commit) - + + def can_close(self, username): + return self.status == "open" and username in self.who_can_close() + def can_merge(self, username) -> bool: + return self.status == "open" and username in self.who_can_merge() class BaseGitUser(GitUser): pass @@ -97,7 +107,7 @@ def get_comments( return filter_comments(all_comments, filter_regex, reverse, author) def can_close(self, username: str) -> bool: - return username == self.author or username in self.project.who_can_close_issue() + return username == self.author or username in self.who_can_close() class BaseCommitFlag(CommitFlag): diff --git a/ogr/services/github/issue.py b/ogr/services/github/issue.py index 00a452cc..522c794b 100644 --- a/ogr/services/github/issue.py +++ b/ogr/services/github/issue.py @@ -166,6 +166,12 @@ def comment(self, body: str) -> IssueComment: def close(self) -> "Issue": self._raw_issue.edit(state="closed") return self + + def who_can_close(self) -> set[str]: + return self.project.who_can_close_issue() + + def can_close(self, username): + return username == self.author or username in self.who_can_close() def add_label(self, *labels: str) -> None: for label in labels: diff --git a/ogr/services/github/project.py b/ogr/services/github/project.py index 9e263c28..d07d77c9 100644 --- a/ogr/services/github/project.py +++ b/ogr/services/github/project.py @@ -239,6 +239,9 @@ def who_can_close_issue(self) -> set[str]: def who_can_merge_pr(self) -> set[str]: return self.__get_collaborators() + + def can_close_issue(self, username: str) -> bool: + return username in self.who_can_close_issue() def can_merge_pr(self, username) -> bool: return ( diff --git a/ogr/services/github/pull_request.py b/ogr/services/github/pull_request.py index 80b43e87..9857a3ce 100644 --- a/ogr/services/github/pull_request.py +++ b/ogr/services/github/pull_request.py @@ -253,10 +253,34 @@ def close(self) -> "PullRequest": def merge(self) -> "PullRequest": self._raw_pr.merge() return self - + def add_label(self, *labels: str) -> None: for label in labels: self._raw_pr.add_to_labels(label) def get_comment(self, comment_id: int) -> PRComment: return GithubPRComment(self._raw_pr.get_issue_comment(comment_id)) + + def who_can_close(self) -> set[str]: + people_who_can_close: set[str] = set() + + people_who_can_close.add(self.author) + project = self._target_project + people_who_can_close.update(project.__get_collaborators()) + + return people_who_can_close + + def can_close(self, username): + return username == self.author or username in self.who_can_close() + + def who_can_merge(self) -> set[str]: + people_who_can_merge: set[str] = set() + project = self._target_project + people_who_can_merge.update(project.__get_collaborators()) + + return people_who_can_merge + + def can_merge(self, username): + return username in self.who_can_merge() + + diff --git a/ogr/services/gitlab/issue.py b/ogr/services/gitlab/issue.py index 3d2cd49d..152f130f 100644 --- a/ogr/services/gitlab/issue.py +++ b/ogr/services/gitlab/issue.py @@ -183,3 +183,6 @@ def add_assignee(self, *assignees: str) -> None: def get_comment(self, comment_id: int) -> IssueComment: return GitlabIssueComment(self._raw_issue.notes.get(comment_id)) + + def who_can_close(self) -> set[str]: + return self.project.who_can_close_issue() diff --git a/ogr/services/gitlab/project.py b/ogr/services/gitlab/project.py index 9cc08fb7..b72b07ad 100644 --- a/ogr/services/gitlab/project.py +++ b/ogr/services/gitlab/project.py @@ -184,6 +184,9 @@ def who_can_merge_pr(self) -> set[str]: ), ) + def can_close_issue(self, username): + return username in self.who_can_close_issue() + def can_merge_pr(self, username) -> bool: return username in self.who_can_merge_pr() diff --git a/ogr/services/gitlab/pull_request.py b/ogr/services/gitlab/pull_request.py index 0e5941e2..191c2f2f 100644 --- a/ogr/services/gitlab/pull_request.py +++ b/ogr/services/gitlab/pull_request.py @@ -299,3 +299,25 @@ def add_label(self, *labels: str) -> None: def get_comment(self, comment_id: int) -> PRComment: return GitlabPRComment(self._raw_pr.notes.get(comment_id)) + + def who_can_close(self) -> set[str]: + people_who_can_close: set[str] = set() + people_who_can_close.add(self.author) + + project = self._target_project + people_who_can_close.update(set(project.get_owners())) + + return people_who_can_close + + def can_close(self, username): + return username in self.who_can_close() + + def who_can_merge(self) -> set[str]: + people_who_can_merge: set[str] = set() + project = self._target_project + people_who_can_merge.update(set(project.get_owners())) + + return people_who_can_merge + + def can_merge(self, username): + return username in self.who_can_merge() \ No newline at end of file diff --git a/ogr/services/pagure/issue.py b/ogr/services/pagure/issue.py index 1fe6014e..6540cc73 100644 --- a/ogr/services/pagure/issue.py +++ b/ogr/services/pagure/issue.py @@ -241,3 +241,9 @@ def get_comment(self, comment_id: int) -> IssueComment: method="GET", ), ) + + def who_can_close_issue(self) -> set[str]: + return self.project.who_can_close_issue() + + + diff --git a/ogr/services/pagure/project.py b/ogr/services/pagure/project.py index 703bc57b..2bf436d3 100644 --- a/ogr/services/pagure/project.py +++ b/ogr/services/pagure/project.py @@ -235,7 +235,10 @@ def which_groups_can_merge_pr(self) -> set[str]: groups.update(project["access_groups"]["admin"]) groups.update(project["access_groups"]["commit"]) return groups - + + def can_close_issue(self, username): + return username in self.who_can_close_issue() + def can_merge_pr(self, username) -> bool: accounts_that_can_merge_pr = self.who_can_merge_pr() diff --git a/ogr/services/pagure/pull_request.py b/ogr/services/pagure/pull_request.py index 55a38125..42966b0f 100644 --- a/ogr/services/pagure/pull_request.py +++ b/ogr/services/pagure/pull_request.py @@ -394,3 +394,20 @@ def get_comment(self, comment_id: int) -> PRComment: f"No comment with id#{comment_id} in PR#{self.id} found.", response_code=404, ) + + def who_can_close(self) -> set[str]: + people_who_can_close: set[str] = set() + people_who_can_close.add(self.author) + + project: ogr_pagure.PagureProject = self.target_project + people_who_can_close.update(project.get_owners()) + return people_who_can_close + + def can_close(self, username): + return username in self.who_can_close() + + def who_can_merge(self) -> set[str]: + return self._target_project.who_can_merge_pr() + + def can_merge(self, username): + return username in self.who_can_merge() \ No newline at end of file From 829aa13235d1e2df79f72784653b33b97bfd8c88 Mon Sep 17 00:00:00 2001 From: Gauravpadam Date: Wed, 2 Apr 2025 02:48:23 +0530 Subject: [PATCH 3/4] Add missing parentheses --- ogr/abstract.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ogr/abstract.py b/ogr/abstract.py index 8558b079..372427f4 100644 --- a/ogr/abstract.py +++ b/ogr/abstract.py @@ -922,7 +922,7 @@ def can_merge(self, username: str) -> bool: Returns: `True` if user can merge the pull request, `False` otherwise. """ - raise NotImplementedError + raise NotImplementedError() def merge(self) -> "PullRequest": """ From 39a4379065bc2a544ed801088e6eaa519b66a3b6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 21:20:32 +0000 Subject: [PATCH 4/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- ogr/abstract.py | 12 ++++++------ ogr/services/base.py | 8 +++++--- ogr/services/github/issue.py | 4 ++-- ogr/services/github/project.py | 2 +- ogr/services/github/pull_request.py | 12 +++++------- ogr/services/gitlab/issue.py | 2 +- ogr/services/gitlab/pull_request.py | 10 +++++----- ogr/services/pagure/issue.py | 5 +---- ogr/services/pagure/project.py | 4 ++-- ogr/services/pagure/pull_request.py | 8 ++++---- 10 files changed, 32 insertions(+), 35 deletions(-) diff --git a/ogr/abstract.py b/ogr/abstract.py index 372427f4..3d379e5e 100644 --- a/ogr/abstract.py +++ b/ogr/abstract.py @@ -476,7 +476,7 @@ def get_comments( List of issue comments. """ raise NotImplementedError() - + def who_can_close() -> set[str]: """ Returns: @@ -895,28 +895,28 @@ def close(self) -> "PullRequest": Pull request itself. """ raise NotImplementedError() - + def who_can_close() -> set[str]: """ Returns: Set of usernames who can close the pull request. """ raise NotImplementedError() - + def who_can_merge() -> set[str]: """ Returns: Set of usernames who can merge the pull request. """ raise NotImplementedError() - + def can_close(self, username: str) -> bool: """ Returns: `True` if user can close the pull request, `False` otherwise. """ raise NotImplementedError() - + def can_merge(self, username: str) -> bool: """ Returns: @@ -1570,7 +1570,7 @@ def who_can_close_issue(self) -> set[str]: Names of all users who have permission to modify an issue. """ raise NotImplementedError() - + def can_close_issue(username: str) -> bool: """ Args: diff --git a/ogr/services/base.py b/ogr/services/base.py index a5a2ea1a..4cdfede5 100644 --- a/ogr/services/base.py +++ b/ogr/services/base.py @@ -45,10 +45,10 @@ class BaseGitProject(GitProject): @property def full_repo_name(self) -> str: return f"{self.namespace}/{self.repo}" - + def can_close_issue(self, username: str) -> bool: return username in self.who_can_close_issue() - + def can_merge_pr(self, username: str) -> bool: return username in self.who_can_merge_pr() @@ -86,12 +86,14 @@ def search( def get_statuses(self) -> list[CommitFlag]: commit = self.get_all_commits()[-1] return self.target_project.get_commit_statuses(commit) - + def can_close(self, username): return self.status == "open" and username in self.who_can_close() + def can_merge(self, username) -> bool: return self.status == "open" and username in self.who_can_merge() + class BaseGitUser(GitUser): pass diff --git a/ogr/services/github/issue.py b/ogr/services/github/issue.py index 522c794b..a6e37afa 100644 --- a/ogr/services/github/issue.py +++ b/ogr/services/github/issue.py @@ -166,10 +166,10 @@ def comment(self, body: str) -> IssueComment: def close(self) -> "Issue": self._raw_issue.edit(state="closed") return self - + def who_can_close(self) -> set[str]: return self.project.who_can_close_issue() - + def can_close(self, username): return username == self.author or username in self.who_can_close() diff --git a/ogr/services/github/project.py b/ogr/services/github/project.py index d07d77c9..32306475 100644 --- a/ogr/services/github/project.py +++ b/ogr/services/github/project.py @@ -239,7 +239,7 @@ def who_can_close_issue(self) -> set[str]: def who_can_merge_pr(self) -> set[str]: return self.__get_collaborators() - + def can_close_issue(self, username: str) -> bool: return username in self.who_can_close_issue() diff --git a/ogr/services/github/pull_request.py b/ogr/services/github/pull_request.py index 9857a3ce..d64d3c80 100644 --- a/ogr/services/github/pull_request.py +++ b/ogr/services/github/pull_request.py @@ -253,14 +253,14 @@ def close(self) -> "PullRequest": def merge(self) -> "PullRequest": self._raw_pr.merge() return self - + def add_label(self, *labels: str) -> None: for label in labels: self._raw_pr.add_to_labels(label) def get_comment(self, comment_id: int) -> PRComment: return GithubPRComment(self._raw_pr.get_issue_comment(comment_id)) - + def who_can_close(self) -> set[str]: people_who_can_close: set[str] = set() @@ -269,18 +269,16 @@ def who_can_close(self) -> set[str]: people_who_can_close.update(project.__get_collaborators()) return people_who_can_close - + def can_close(self, username): return username == self.author or username in self.who_can_close() - + def who_can_merge(self) -> set[str]: people_who_can_merge: set[str] = set() project = self._target_project people_who_can_merge.update(project.__get_collaborators()) return people_who_can_merge - + def can_merge(self, username): return username in self.who_can_merge() - - diff --git a/ogr/services/gitlab/issue.py b/ogr/services/gitlab/issue.py index 152f130f..43e784f7 100644 --- a/ogr/services/gitlab/issue.py +++ b/ogr/services/gitlab/issue.py @@ -183,6 +183,6 @@ def add_assignee(self, *assignees: str) -> None: def get_comment(self, comment_id: int) -> IssueComment: return GitlabIssueComment(self._raw_issue.notes.get(comment_id)) - + def who_can_close(self) -> set[str]: return self.project.who_can_close_issue() diff --git a/ogr/services/gitlab/pull_request.py b/ogr/services/gitlab/pull_request.py index 191c2f2f..6a98b653 100644 --- a/ogr/services/gitlab/pull_request.py +++ b/ogr/services/gitlab/pull_request.py @@ -299,7 +299,7 @@ def add_label(self, *labels: str) -> None: def get_comment(self, comment_id: int) -> PRComment: return GitlabPRComment(self._raw_pr.notes.get(comment_id)) - + def who_can_close(self) -> set[str]: people_who_can_close: set[str] = set() people_who_can_close.add(self.author) @@ -308,16 +308,16 @@ def who_can_close(self) -> set[str]: people_who_can_close.update(set(project.get_owners())) return people_who_can_close - + def can_close(self, username): return username in self.who_can_close() - + def who_can_merge(self) -> set[str]: people_who_can_merge: set[str] = set() project = self._target_project people_who_can_merge.update(set(project.get_owners())) return people_who_can_merge - + def can_merge(self, username): - return username in self.who_can_merge() \ No newline at end of file + return username in self.who_can_merge() diff --git a/ogr/services/pagure/issue.py b/ogr/services/pagure/issue.py index 6540cc73..c06d7e59 100644 --- a/ogr/services/pagure/issue.py +++ b/ogr/services/pagure/issue.py @@ -241,9 +241,6 @@ def get_comment(self, comment_id: int) -> IssueComment: method="GET", ), ) - + def who_can_close_issue(self) -> set[str]: return self.project.who_can_close_issue() - - - diff --git a/ogr/services/pagure/project.py b/ogr/services/pagure/project.py index 2bf436d3..095d2881 100644 --- a/ogr/services/pagure/project.py +++ b/ogr/services/pagure/project.py @@ -235,10 +235,10 @@ def which_groups_can_merge_pr(self) -> set[str]: groups.update(project["access_groups"]["admin"]) groups.update(project["access_groups"]["commit"]) return groups - + def can_close_issue(self, username): return username in self.who_can_close_issue() - + def can_merge_pr(self, username) -> bool: accounts_that_can_merge_pr = self.who_can_merge_pr() diff --git a/ogr/services/pagure/pull_request.py b/ogr/services/pagure/pull_request.py index 42966b0f..251e8322 100644 --- a/ogr/services/pagure/pull_request.py +++ b/ogr/services/pagure/pull_request.py @@ -394,7 +394,7 @@ def get_comment(self, comment_id: int) -> PRComment: f"No comment with id#{comment_id} in PR#{self.id} found.", response_code=404, ) - + def who_can_close(self) -> set[str]: people_who_can_close: set[str] = set() people_who_can_close.add(self.author) @@ -405,9 +405,9 @@ def who_can_close(self) -> set[str]: def can_close(self, username): return username in self.who_can_close() - + def who_can_merge(self) -> set[str]: return self._target_project.who_can_merge_pr() - + def can_merge(self, username): - return username in self.who_can_merge() \ No newline at end of file + return username in self.who_can_merge()