diff --git a/github/Commit.py b/github/Commit.py index 71a44993..4f944e8b 100644 --- a/github/Commit.py +++ b/github/Commit.py @@ -29,8 +29,9 @@ # along with PyGithub. If not, see . # # # ################################################################################ +from __future__ import annotations -from typing import Any, Dict +from typing import TYPE_CHECKING, Any import github.CheckRun import github.CheckSuite @@ -40,158 +41,136 @@ import github.CommitStats import github.CommitStatus import github.File import github.GitCommit -import github.GithubObject import github.NamedUser import github.PaginatedList +from github.GithubObject import Attribute, CompletableGithubObject, NotSet, Opt, is_optional +from github.PaginatedList import PaginatedList + +if TYPE_CHECKING: + from github.CheckRun import CheckRun + from github.CheckSuite import CheckSuite + from github.CommitCombinedStatus import CommitCombinedStatus + from github.CommitComment import CommitComment + from github.CommitStats import CommitStats + from github.CommitStatus import CommitStatus + from github.File import File + from github.GitCommit import GitCommit + from github.NamedUser import NamedUser + from github.PullRequest import PullRequest -class Commit(github.GithubObject.CompletableGithubObject): +class Commit(CompletableGithubObject): """ This class represents Commits. The reference can be found here https://docs.github.com/en/rest/reference/git#commits """ + def _initAttributes(self) -> None: + self._author: Attribute[NamedUser] = NotSet + self._comments_url: Attribute[str] = NotSet + self._commit: Attribute[GitCommit] = NotSet + self._committer: Attribute[NamedUser] = NotSet + self._files: Attribute[list[File]] = NotSet + self._html_url: Attribute[str] = NotSet + self._parents: Attribute[list[Commit]] = NotSet + self._sha: Attribute[str] = NotSet + self._stats: Attribute[CommitStats] = NotSet + self._url: Attribute[str] = NotSet + def __repr__(self) -> str: return self.get__repr__({"sha": self._sha.value}) @property - def author(self): - """ - :type: :class:`github.NamedUser.NamedUser` - """ + def author(self) -> NamedUser: self._completeIfNotSet(self._author) return self._author.value @property - def comments_url(self): - """ - :type: string - """ + def comments_url(self) -> str: self._completeIfNotSet(self._comments_url) return self._comments_url.value @property - def commit(self): - """ - :type: :class:`github.GitCommit.GitCommit` - """ + def commit(self) -> GitCommit: self._completeIfNotSet(self._commit) return self._commit.value @property - def committer(self): - """ - :type: :class:`github.NamedUser.NamedUser` - """ + def committer(self) -> NamedUser: self._completeIfNotSet(self._committer) return self._committer.value @property - def files(self): - """ - :type: list of :class:`github.File.File` - """ + def files(self) -> list[File]: self._completeIfNotSet(self._files) return self._files.value @property - def html_url(self): - """ - :type: string - """ + def html_url(self) -> str: self._completeIfNotSet(self._html_url) return self._html_url.value @property - def parents(self): - """ - :type: list of :class:`github.Commit.Commit` - """ + def parents(self) -> list[Commit]: self._completeIfNotSet(self._parents) return self._parents.value @property - def sha(self): - """ - :type: string - """ + def sha(self) -> str: self._completeIfNotSet(self._sha) return self._sha.value @property - def stats(self): - """ - :type: :class:`github.CommitStats.CommitStats` - """ + def stats(self) -> CommitStats: self._completeIfNotSet(self._stats) return self._stats.value @property - def url(self): - """ - :type: string - """ + def url(self) -> str: self._completeIfNotSet(self._url) return self._url.value def create_comment( self, - body, - line=github.GithubObject.NotSet, - path=github.GithubObject.NotSet, - position=github.GithubObject.NotSet, - ): + body: str, + line: Opt[int] = NotSet, + path: Opt[str] = NotSet, + position: Opt[int] = NotSet, + ) -> CommitComment: """ :calls: `POST /repos/{owner}/{repo}/commits/{sha}/comments `_ - :param body: string - :param line: integer - :param path: string - :param position: integer - :rtype: :class:`github.CommitComment.CommitComment` """ assert isinstance(body, str), body - assert line is github.GithubObject.NotSet or isinstance(line, int), line - assert path is github.GithubObject.NotSet or isinstance(path, str), path - assert position is github.GithubObject.NotSet or isinstance(position, int), position - post_parameters = { - "body": body, - } - if line is not github.GithubObject.NotSet: - post_parameters["line"] = line - if path is not github.GithubObject.NotSet: - post_parameters["path"] = path - if position is not github.GithubObject.NotSet: - post_parameters["position"] = position + assert is_optional(line, int), line + assert is_optional(path, str), path + assert is_optional(position, int), position + post_parameters = NotSet.remove_unset_items({"body": body, "line": line, "path": path, "position": position}) + headers, data = self._requester.requestJsonAndCheck("POST", f"{self.url}/comments", input=post_parameters) return github.CommitComment.CommitComment(self._requester, headers, data, completed=True) def create_status( self, - state, - target_url=github.GithubObject.NotSet, - description=github.GithubObject.NotSet, - context=github.GithubObject.NotSet, - ): + state: str, + target_url: Opt[str] = NotSet, + description: Opt[str] = NotSet, + context: Opt[str] = NotSet, + ) -> CommitStatus: """ :calls: `POST /repos/{owner}/{repo}/statuses/{sha} `_ - :param state: string - :param target_url: string - :param description: string - :param context: string - :rtype: :class:`github.CommitStatus.CommitStatus` """ assert isinstance(state, str), state - assert target_url is github.GithubObject.NotSet or isinstance(target_url, str), target_url - assert description is github.GithubObject.NotSet or isinstance(description, str), description - assert context is github.GithubObject.NotSet or isinstance(context, str), context - post_parameters = { - "state": state, - } - if target_url is not github.GithubObject.NotSet: - post_parameters["target_url"] = target_url - if description is not github.GithubObject.NotSet: - post_parameters["description"] = description - if context is not github.GithubObject.NotSet: - post_parameters["context"] = context + assert is_optional(target_url, str), target_url + assert is_optional(description, str), description + assert is_optional(context, str), context + post_parameters = NotSet.remove_unset_items( + { + "state": state, + "target_url": target_url, + "description": description, + "context": context, + } + ) + headers, data = self._requester.requestJsonAndCheck( "POST", f"{self._parentUrl(self._parentUrl(self.url))}/statuses/{self.sha}", @@ -199,44 +178,40 @@ class Commit(github.GithubObject.CompletableGithubObject): ) return github.CommitStatus.CommitStatus(self._requester, headers, data, completed=True) - def get_comments(self): + def get_comments(self) -> PaginatedList[CommitComment]: """ :calls: `GET /repos/{owner}/{repo}/commits/{sha}/comments `_ - :rtype: :class:`github.PaginatedList.PaginatedList` of :class:`github.CommitComment.CommitComment` """ - return github.PaginatedList.PaginatedList( + return PaginatedList( github.CommitComment.CommitComment, self._requester, f"{self.url}/comments", None, ) - def get_statuses(self): + def get_statuses(self) -> PaginatedList[CommitStatus]: """ :calls: `GET /repos/{owner}/{repo}/statuses/{ref} `_ - :rtype: :class:`github.PaginatedList.PaginatedList` of :class:`github.CommitStatus.CommitStatus` """ - return github.PaginatedList.PaginatedList( + return PaginatedList( github.CommitStatus.CommitStatus, self._requester, f"{self._parentUrl(self._parentUrl(self.url))}/statuses/{self.sha}", None, ) - def get_combined_status(self): + def get_combined_status(self) -> CommitCombinedStatus: """ :calls: `GET /repos/{owner}/{repo}/commits/{ref}/status/ `_ - :rtype: :class:`github.CommitCombinedStatus.CommitCombinedStatus` """ headers, data = self._requester.requestJsonAndCheck("GET", f"{self.url}/status") return github.CommitCombinedStatus.CommitCombinedStatus(self._requester, headers, data, completed=True) - def get_pulls(self): + def get_pulls(self) -> PaginatedList[PullRequest]: """ :calls: `GET /repos/{owner}/{repo}/commits/{sha}/pulls `_ - :rtype: :class:`github.PaginatedList.PaginatedList` of :class:`github.PullRequest.PullRequest` """ - return github.PaginatedList.PaginatedList( + return PaginatedList( github.PullRequest.PullRequest, self._requester, f"{self.url}/pulls", @@ -246,28 +221,19 @@ class Commit(github.GithubObject.CompletableGithubObject): def get_check_runs( self, - check_name=github.GithubObject.NotSet, - status=github.GithubObject.NotSet, - filter=github.GithubObject.NotSet, - ): + check_name: Opt[str] = NotSet, + status: Opt[str] = NotSet, + filter: Opt[str] = NotSet, + ) -> PaginatedList[CheckRun]: """ :calls: `GET /repos/{owner}/{repo}/commits/{sha}/check-runs `_ - :param check_name: string - :param status: string - :param filter: string - :rtype: :class:`github.PaginatedList.PaginatedList` of :class:`github.CheckRun.CheckRun` """ - assert check_name is github.GithubObject.NotSet or isinstance(check_name, str), check_name - assert status is github.GithubObject.NotSet or isinstance(status, str), status - assert filter is github.GithubObject.NotSet or isinstance(filter, str), filter - url_parameters = dict() - if check_name is not github.GithubObject.NotSet: - url_parameters["check_name"] = check_name - if status is not github.GithubObject.NotSet: - url_parameters["status"] = status - if filter is not github.GithubObject.NotSet: - url_parameters["filter"] = filter - return github.PaginatedList.PaginatedList( + assert is_optional(check_name, str), check_name + assert is_optional(status, str), status + assert is_optional(filter, str), filter + url_parameters = NotSet.remove_unset_items({"check_name": check_name, "status": status, "filter": filter}) + + return PaginatedList( github.CheckRun.CheckRun, self._requester, f"{self.url}/check-runs", @@ -276,22 +242,16 @@ class Commit(github.GithubObject.CompletableGithubObject): list_item="check_runs", ) - def get_check_suites(self, app_id=github.GithubObject.NotSet, check_name=github.GithubObject.NotSet): + def get_check_suites(self, app_id: Opt[int] = NotSet, check_name: Opt[str] = NotSet) -> PaginatedList[CheckSuite]: """ :class: `GET /repos/{owner}/{repo}/commits/{ref}/check-suites `_ - :param app_id: int - :param check_name: string - :rtype: :class:`github.PaginatedList.PaginatedList` of :class:`github.CheckSuite.CheckSuite` """ - assert app_id is github.GithubObject.NotSet or isinstance(app_id, int), app_id - assert check_name is github.GithubObject.NotSet or isinstance(check_name, str), check_name - parameters = dict() - if app_id is not github.GithubObject.NotSet: - parameters["app_id"] = app_id - if check_name is not github.GithubObject.NotSet: - parameters["check_name"] = check_name + assert is_optional(app_id, int), app_id + assert is_optional(check_name, str), check_name + parameters = NotSet.remove_unset_items({"app_id": app_id, "check_name": check_name}) + request_headers = {"Accept": "application/vnd.github.v3+json"} - return github.PaginatedList.PaginatedList( + return PaginatedList( github.CheckSuite.CheckSuite, self._requester, f"{self.url}/check-suites", @@ -301,22 +261,10 @@ class Commit(github.GithubObject.CompletableGithubObject): ) @property - def _identity(self): + def _identity(self) -> str: return self.sha - def _initAttributes(self) -> None: - self._author = github.GithubObject.NotSet - self._comments_url = github.GithubObject.NotSet - self._commit = github.GithubObject.NotSet - self._committer = github.GithubObject.NotSet - self._files = github.GithubObject.NotSet - self._html_url = github.GithubObject.NotSet - self._parents = github.GithubObject.NotSet - self._sha = github.GithubObject.NotSet - self._stats = github.GithubObject.NotSet - self._url = github.GithubObject.NotSet - - def _useAttributes(self, attributes: Dict[str, Any]) -> None: + def _useAttributes(self, attributes: dict[str, Any]) -> None: if "author" in attributes: # pragma no branch self._author = self._makeClassAttribute(github.NamedUser.NamedUser, attributes["author"]) if "comments_url" in attributes: # pragma no branch diff --git a/github/Commit.pyi b/github/Commit.pyi deleted file mode 100644 index 0c2df938..00000000 --- a/github/Commit.pyi +++ /dev/null @@ -1,70 +0,0 @@ -from typing import Any, Dict, List, Union - -from github.CheckRun import CheckRun -from github.CheckSuite import CheckSuite -from github.CommitCombinedStatus import CommitCombinedStatus -from github.CommitComment import CommitComment -from github.CommitStats import CommitStats -from github.CommitStatus import CommitStatus -from github.File import File -from github.GitCommit import GitCommit -from github.GithubObject import CompletableGithubObject, _NotSetType -from github.NamedUser import NamedUser -from github.PaginatedList import PaginatedList -from github.PullRequest import PullRequest - -class Commit(CompletableGithubObject): - def __repr__(self) -> str: ... - @property - def _identity(self) -> str: ... - def _initAttributes(self) -> None: ... - def _useAttributes(self, attributes: Dict[str, Any]) -> None: ... - @property - def author(self) -> NamedUser: ... - @property - def comments_url(self) -> str: ... - @property - def commit(self) -> GitCommit: ... - @property - def committer(self) -> NamedUser: ... - def create_comment( - self, - body: str, - line: Union[int, _NotSetType] = ..., - path: Union[_NotSetType, str] = ..., - position: Union[int, _NotSetType] = ..., - ) -> CommitComment: ... - def create_status( - self, - state: str, - target_url: Union[_NotSetType, str] = ..., - description: Union[_NotSetType, str] = ..., - context: Union[_NotSetType, str] = ..., - ) -> CommitStatus: ... - @property - def files(self) -> List[File]: ... - def get_check_suites( - self, - app_id: Union[_NotSetType, int], - check_name: Union[_NotSetType, str], - ) -> PaginatedList[CheckSuite]: ... - def get_combined_status(self) -> CommitCombinedStatus: ... - def get_comments(self) -> PaginatedList[CommitComment]: ... - def get_statuses(self) -> PaginatedList[CommitStatus]: ... - def get_pulls(self) -> PaginatedList[PullRequest]: ... - def get_check_runs( - self, - check_name: Union[_NotSetType, str] = ..., - status: Union[_NotSetType, str] = ..., - filter: Union[_NotSetType, str] = ..., - ) -> PaginatedList[CheckRun]: ... - @property - def html_url(self) -> str: ... - @property - def parents(self) -> List[Commit]: ... - @property - def sha(self) -> str: ... - @property - def stats(self) -> CommitStats: ... - @property - def url(self) -> str: ...