From 4d4617343418d5032cea1eb8fd9720d1fd883528 Mon Sep 17 00:00:00 2001 From: Benjamin K <53038537+treee111@users.noreply.github.com> Date: Mon, 5 Feb 2024 16:26:00 +0100 Subject: [PATCH 1/4] Explicitly name the modules built in pyproject.toml (#2894) Fixes building PyGithub with extra directories in source root. --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 7e5c7733d4..6dd151b79d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,6 +46,9 @@ integrations = [] [tool.setuptools_scm] +[tool.setuptools] +packages = ["github"] + [tool.setuptools.package-data] github = ["py.typed", '*.pyi'] From ff079df2aab1964ec16315258f34de8f9d9350c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonathan=20Pich=C3=A9?= Date: Thu, 8 Feb 2024 10:26:31 -0500 Subject: [PATCH 2/4] implement method to obtain logs download link --- github/WorkflowRun.py | 36 ++++++++++++++++++++++++++++++++++++ tests/WorkflowRun.py | 14 ++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/github/WorkflowRun.py b/github/WorkflowRun.py index accd09f269..716c6e841a 100644 --- a/github/WorkflowRun.py +++ b/github/WorkflowRun.py @@ -190,6 +190,10 @@ def logs_url(self) -> str: self._completeIfNotSet(self._logs_url) return self._logs_url.value + @property + def run_attempt_logs_url(self) -> str: + return self.logs_url[:-4] + f"attempts/{self.run_attempt}/logs" + @property def check_suite_url(self) -> str: self._completeIfNotSet(self._check_suite_url) @@ -284,6 +288,38 @@ def jobs(self, _filter: Opt[str] = NotSet) -> PaginatedList[WorkflowJob]: list_item="jobs", ) + def get_logs_download_link_for_this_attempt(self) -> str: + """ + :calls "`GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt}/logs `_ + """ + return self._get_logs_download_link(self.run_attempt_logs_url) + + def get_logs_download_link_for_latest_attempt(self) -> str: + """ + :calls "`GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs `_ + """ + return self._get_logs_download_link(self.logs_url) + + def _get_logs_download_link(self, url: str) -> str: + """ + A download link will be returned. Here's one way of extracting its content in-memory: + + from io import BytesIO + from zipfile import ZipFile + + download_link = workflow_run.get_logs_for_this_run_attempt_download_link() + response = requests.get(download_link, allow_redirects=True) + assert response.headers['content-type'] == 'application/zip' + zip_file = ZipFile(BytesIO(response.content)) + return { + PurePosixPath(zip_info.filename): zip_file.read(zip_info.filename).decode() + for zip_info in zip_file.filelist + } + """ + headers, _ = self._requester.requestJsonAndCheck("GET", url) + assert "location" in headers + return headers["location"] + def _useAttributes(self, attributes: dict[str, Any]) -> None: if "id" in attributes: # pragma no branch self._id = self._makeIntAttribute(attributes["id"]) diff --git a/tests/WorkflowRun.py b/tests/WorkflowRun.py index 87a8f39ec8..ee408b7dc6 100644 --- a/tests/WorkflowRun.py +++ b/tests/WorkflowRun.py @@ -79,6 +79,10 @@ def testAttributes(self): self.workflow_run.logs_url, "https://api.github.com/repos/PyGithub/PyGithub/actions/runs/3881497935/logs", ) + self.assertEqual( + self.workflow_run.run_attempt_logs_url, + "https://api.github.com/repos/PyGithub/PyGithub/actions/runs/3881497935/attempt/1/logs", + ) self.assertEqual( self.workflow_run.check_suite_url, "https://api.github.com/repos/PyGithub/PyGithub/check-suites/10279069747", @@ -145,3 +149,13 @@ def test_jobs(self): lambda j: j.id, [10545727758, 10545727888, 10545728039, 10545728190, 10545728356], ) + + def test_logs_download_link_for_this_attempt(self): + download_link = self.workflow_run.get_logs_download_link_for_this_attempt() + self.assertIsInstance(download_link, str) + self.assertTrue(download_link, "download link was empty") + + def test_logs_download_link_for_latest_attempt(self): + download_link = self.workflow_run.get_logs_download_link_for_latest_attempt() + self.assertIsInstance(download_link, str) + self.assertTrue(download_link, "download link was empty") From ff3dfa1f36359111a1902f5c24e81e9f6a680a1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonathan=20Pich=C3=A9?= Date: Thu, 8 Feb 2024 10:35:44 -0500 Subject: [PATCH 3/4] remove test for now --- tests/WorkflowRun.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/tests/WorkflowRun.py b/tests/WorkflowRun.py index ee408b7dc6..0ca605ea0f 100644 --- a/tests/WorkflowRun.py +++ b/tests/WorkflowRun.py @@ -149,13 +149,3 @@ def test_jobs(self): lambda j: j.id, [10545727758, 10545727888, 10545728039, 10545728190, 10545728356], ) - - def test_logs_download_link_for_this_attempt(self): - download_link = self.workflow_run.get_logs_download_link_for_this_attempt() - self.assertIsInstance(download_link, str) - self.assertTrue(download_link, "download link was empty") - - def test_logs_download_link_for_latest_attempt(self): - download_link = self.workflow_run.get_logs_download_link_for_latest_attempt() - self.assertIsInstance(download_link, str) - self.assertTrue(download_link, "download link was empty") From c7b915f3f3dfa45cc8c0b547201899d94f896dae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonathan=20Pich=C3=A9?= Date: Thu, 8 Feb 2024 10:51:18 -0500 Subject: [PATCH 4/4] fix typo --- tests/WorkflowRun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/WorkflowRun.py b/tests/WorkflowRun.py index 0ca605ea0f..9829eb7892 100644 --- a/tests/WorkflowRun.py +++ b/tests/WorkflowRun.py @@ -81,7 +81,7 @@ def testAttributes(self): ) self.assertEqual( self.workflow_run.run_attempt_logs_url, - "https://api.github.com/repos/PyGithub/PyGithub/actions/runs/3881497935/attempt/1/logs", + "https://api.github.com/repos/PyGithub/PyGithub/actions/runs/3881497935/attempts/1/logs", ) self.assertEqual( self.workflow_run.check_suite_url,