From 6d17b3521e02d26f7fd3deb441d27934cbb83fc8 Mon Sep 17 00:00:00 2001 From: david Date: Mon, 29 Dec 2025 16:41:47 +0100 Subject: [PATCH 1/2] Add direct bytes access in case of missing download_attachment file_name arg --- jmapc/client.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/jmapc/client.py b/jmapc/client.py index 6e13cab..94470ad 100644 --- a/jmapc/client.py +++ b/jmapc/client.py @@ -148,14 +148,23 @@ def upload_blob(self, file_name: Union[str, Path]) -> Blob: r.raise_for_status() return Blob.from_dict(r.json()) + @overload + def download_attachment( + self, attachment: EmailBodyPart, file_name: None + ) -> bytes: ... # pragma: no cover + + @overload def download_attachment( self, attachment: EmailBodyPart, file_name: Union[str, Path], - ) -> None: - if not file_name: - raise Exception("Destination file name is required") - file_name = Path(file_name) + ) -> None: ... # pragma: no cover + + def download_attachment( + self, + attachment: EmailBodyPart, + file_name: Union[str, Path, None], + ) -> Optional[bytes]: blob_url = self.jmap_session.download_url.format( accountId=self.account_id, blobId=attachment.blob_id, @@ -166,8 +175,12 @@ def download_attachment( blob_url, stream=True, timeout=REQUEST_TIMEOUT ) r.raise_for_status() - with open(file_name, "wb") as f: - f.write(r.raw.data) + if file_name: + with open(file_name, "wb") as f: + f.write(r.raw.data) + return None + else: + return r.raw.data @overload def request( From 1e38dad8e6cee3d2fb5485ca58e757a8086be646 Mon Sep 17 00:00:00 2001 From: david Date: Mon, 29 Dec 2025 16:45:59 +0100 Subject: [PATCH 2/2] Add test for changed behaviour of client.download_attachment in case of missing file_name arg --- tests/test_client.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/tests/test_client.py b/tests/test_client.py index 6042dc0..53ee1a0 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -451,15 +451,12 @@ def test_download_attachment( body=blob_content, ) dest_file = tempdir / "download.txt" - with pytest.raises(Exception) as e: - client.download_attachment( - EmailBodyPart( - name="download.txt", blob_id="C2187", type="text/plain" - ), - "", - ) - assert str(e.value) == "Destination file name is required" + data = client.download_attachment( + EmailBodyPart(name="download.txt", blob_id="C2187", type="text/plain"), + None, + ) assert not dest_file.exists() + assert data.decode("utf-8") == blob_content client.download_attachment( EmailBodyPart(name="download.txt", blob_id="C2187", type="text/plain"), dest_file,