From 17a46e31074304133daacfad4082c31577902d04 Mon Sep 17 00:00:00 2001 From: Claas Augner <495429+caugner@users.noreply.github.com> Date: Tue, 19 Sep 2023 18:20:13 +0200 Subject: [PATCH 1/6] fix(events): init EventUser only if actor is defined Prevents the following TypeError with events of deleted users (aka "ghost"): ``` File "/path/to/github3/models.py", line 52, in __init__ self._update_attributes(json) File "/path/to/github3/issues/event.py", line 63, in _update_attributes self.actor = users.ShortUser(event["actor"], self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/path/to/github3/models.py", line 52, in __init__ self._update_attributes(json) File "/path/to/github3/users.py", line 309, in _update_attributes self.avatar_url = user["avatar_url"] TypeError: 'NoneType' object is not subscriptable ``` --- src/github3/events.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/github3/events.py b/src/github3/events.py index d97d2faa..c8b39b2f 100644 --- a/src/github3/events.py +++ b/src/github3/events.py @@ -392,7 +392,7 @@ class Event(models.GitHubCore): .. attribute:: actor A :class:`~github3.events.EventUser` that represents the user whose - action generated this event. + action generated this event, or `None` if the user no longer exists. .. attribute:: created_at @@ -442,7 +442,8 @@ def _update_attributes(self, event): # If we don't copy this, then we end up altering _json_data which we do # not want to do: event = copy.deepcopy(event) - self.actor = EventUser(event["actor"], self) + if event["actor"]: + self.actor = EventUser(event["actor"], self) self.created_at = self._strptime(event["created_at"]) self.id = event["id"] self.org = event.get("org") From b3bb35f359e777c86871e75db5fda5dbaf04b101 Mon Sep 17 00:00:00 2001 From: Claas Augner <495429+caugner@users.noreply.github.com> Date: Tue, 19 Sep 2023 18:36:11 +0200 Subject: [PATCH 2/6] fix(issues/event): init ShortUser only if actor is defined --- src/github3/issues/event.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/github3/issues/event.py b/src/github3/issues/event.py index 356afb94..0c9d5cee 100644 --- a/src/github3/issues/event.py +++ b/src/github3/issues/event.py @@ -60,7 +60,8 @@ class IssueEvent(GitHubCore): def _update_attributes(self, event): self._api = event["url"] - self.actor = users.ShortUser(event["actor"], self) + if event["actor"]: + self.actor = users.ShortUser(event["actor"], self) self.commit_id = event["commit_id"] self.commit_url = event["commit_url"] self.created_at = self._strptime(event["created_at"]) From 9879aebf916f14f96e3bb74758970978a4800741 Mon Sep 17 00:00:00 2001 From: Claas Augner Date: Fri, 22 Sep 2023 11:28:05 +0200 Subject: [PATCH 3/6] fix(events): ensure actor attribute is set --- src/github3/events.py | 5 +++-- src/github3/issues/event.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/github3/events.py b/src/github3/events.py index c8b39b2f..f3d02272 100644 --- a/src/github3/events.py +++ b/src/github3/events.py @@ -442,8 +442,9 @@ def _update_attributes(self, event): # If we don't copy this, then we end up altering _json_data which we do # not want to do: event = copy.deepcopy(event) - if event["actor"]: - self.actor = EventUser(event["actor"], self) + self.actor = event["actor"] + if self.actor: + self.actor = EventUser(self.actor, self) self.created_at = self._strptime(event["created_at"]) self.id = event["id"] self.org = event.get("org") diff --git a/src/github3/issues/event.py b/src/github3/issues/event.py index 0c9d5cee..7fb5048c 100644 --- a/src/github3/issues/event.py +++ b/src/github3/issues/event.py @@ -60,8 +60,9 @@ class IssueEvent(GitHubCore): def _update_attributes(self, event): self._api = event["url"] - if event["actor"]: - self.actor = users.ShortUser(event["actor"], self) + self.actor = event["actor"] + if self.actor: + self.actor = users.ShortUser(self.actor, self) self.commit_id = event["commit_id"] self.commit_url = event["commit_url"] self.created_at = self._strptime(event["created_at"]) From 6d15a774ae9b9d653f080f5f98a4d2014fd19a52 Mon Sep 17 00:00:00 2001 From: Claas Augner <495429+caugner@users.noreply.github.com> Date: Fri, 29 Sep 2023 23:25:55 +0200 Subject: [PATCH 4/6] fix(pulls): handle repo["owner"] == None `owner` is null if the user who opened the PR no longer exists on GitHub. --- src/github3/pulls.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/github3/pulls.py b/src/github3/pulls.py index 8c6f91d5..a3e45b0e 100644 --- a/src/github3/pulls.py +++ b/src/github3/pulls.py @@ -71,7 +71,9 @@ def _update_attributes(self, dest): repo = dest.get("repo") if repo: self._repo_name = repo.get("name") - self._repo_owner = repo["owner"]["login"] + self._repo_owner = repo.get("owner") + if self._repo_owner: + self._repo_owner = self._repo_owner["login"] self.repository = ShortRepository(repo, self) self.repo = (self._repo_owner, self._repo_name) From 69414a0820f396012b090ae9557fbee761f23852 Mon Sep 17 00:00:00 2001 From: Claas Augner <495429+caugner@users.noreply.github.com> Date: Fri, 29 Sep 2023 23:31:12 +0200 Subject: [PATCH 5/6] fix(repo): handle repo["owner"] == None --- src/github3/repos/repo.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/github3/repos/repo.py b/src/github3/repos/repo.py index 12fa01cb..0d8baf7c 100644 --- a/src/github3/repos/repo.py +++ b/src/github3/repos/repo.py @@ -91,7 +91,9 @@ def _update_attributes(self, repo): self.milestones_urlt = urit.URITemplate(repo["milestones_url"]) self.name = repo["name"] self.notifications_urlt = urit.URITemplate(repo["notifications_url"]) - self.owner = users.ShortUser(repo["owner"], self) + self.owner = repo["owner"] + if self.owner: + self.owner = users.ShortUser(self.owner, self) self.private = repo["private"] self.pulls_urlt = urit.URITemplate(repo["pulls_url"]) self.releases_urlt = urit.URITemplate(repo["releases_url"]) From 35ce3541842812f3f7780e836c32327f5224ad0e Mon Sep 17 00:00:00 2001 From: Claas Augner <495429+caugner@users.noreply.github.com> Date: Sat, 30 Sep 2023 00:07:40 +0200 Subject: [PATCH 6/6] fix(pulls): handle review["user"] == None --- src/github3/pulls.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/github3/pulls.py b/src/github3/pulls.py index a3e45b0e..337f6c91 100644 --- a/src/github3/pulls.py +++ b/src/github3/pulls.py @@ -994,7 +994,9 @@ def _update_attributes(self, review): # PullReview. self.commit_id = review.get("commit_id", None) self.html_url = review["html_url"] - self.user = users.ShortUser(review["user"], self) + self.user = review["user"] + if self.user: + self.user = users.ShortUser(self.user, self) self.state = review["state"] self.submitted_at = self._strptime(review.get("submitted_at")) self.pull_request_url = review["pull_request_url"]