Skip to content

Commit dd4f818

Browse files
Add ZIP tool
Assisted-by: Codex
1 parent ce5e2de commit dd4f818

2 files changed

Lines changed: 77 additions & 0 deletions

File tree

src/pdfrest/client.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
TiffPdfRestPayload,
105105
TranslatePdfTextPayload,
106106
UploadURLs,
107+
ZipPayload,
107108
)
108109
from .types import (
109110
ALL_PDF_INFO_QUERIES,
@@ -2554,6 +2555,32 @@ def merge_pdfs(
25542555
timeout=timeout,
25552556
)
25562557

2558+
def zip_files(
2559+
self,
2560+
files: PdfRestFile | Sequence[PdfRestFile],
2561+
*,
2562+
output: str | None = None,
2563+
extra_query: Query | None = None,
2564+
extra_headers: AnyMapping | None = None,
2565+
extra_body: Body | None = None,
2566+
timeout: TimeoutTypes | None = None,
2567+
) -> PdfRestFileBasedResponse:
2568+
"""Compress one or more files into a zip archive."""
2569+
2570+
payload: dict[str, Any] = {"files": files}
2571+
if output is not None:
2572+
payload["output"] = output
2573+
2574+
return self._post_file_operation(
2575+
endpoint="/zip",
2576+
payload=payload,
2577+
payload_model=ZipPayload,
2578+
extra_query=extra_query,
2579+
extra_headers=extra_headers,
2580+
extra_body=extra_body,
2581+
timeout=timeout,
2582+
)
2583+
25572584
def convert_to_excel(
25582585
self,
25592586
file: PdfRestFile | Sequence[PdfRestFile],
@@ -3596,6 +3623,32 @@ async def merge_pdfs(
35963623
timeout=timeout,
35973624
)
35983625

3626+
async def zip_files(
3627+
self,
3628+
files: PdfRestFile | Sequence[PdfRestFile],
3629+
*,
3630+
output: str | None = None,
3631+
extra_query: Query | None = None,
3632+
extra_headers: AnyMapping | None = None,
3633+
extra_body: Body | None = None,
3634+
timeout: TimeoutTypes | None = None,
3635+
) -> PdfRestFileBasedResponse:
3636+
"""Asynchronously compress one or more files into a zip archive."""
3637+
3638+
payload: dict[str, Any] = {"files": files}
3639+
if output is not None:
3640+
payload["output"] = output
3641+
3642+
return await self._post_file_operation(
3643+
endpoint="/zip",
3644+
payload=payload,
3645+
payload_model=ZipPayload,
3646+
extra_query=extra_query,
3647+
extra_headers=extra_headers,
3648+
extra_body=extra_body,
3649+
timeout=timeout,
3650+
)
3651+
35993652
async def convert_to_excel(
36003653
self,
36013654
file: PdfRestFile | Sequence[PdfRestFile],

src/pdfrest/models/_internal.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,10 @@ def _serialize_file_ids(value: list[PdfRestFile]) -> str:
122122
return ",".join(str(file.id) for file in value)
123123

124124

125+
def _serialize_file_id_list(value: list[PdfRestFile]) -> list[str]:
126+
return [str(file.id) for file in value]
127+
128+
125129
def _bool_to_on_off(value: Any) -> Any:
126130
if isinstance(value, bool):
127131
return "on" if value else "off"
@@ -239,6 +243,26 @@ class DeletePayload(BaseModel):
239243
]
240244

241245

246+
class ZipPayload(BaseModel):
247+
"""Adapt caller options into a pdfRest-ready zip request payload."""
248+
249+
files: Annotated[
250+
list[PdfRestFile],
251+
Field(
252+
min_length=1,
253+
validation_alias=AliasChoices("file", "files"),
254+
serialization_alias="id",
255+
),
256+
BeforeValidator(_ensure_list),
257+
PlainSerializer(_serialize_file_id_list),
258+
]
259+
output: Annotated[
260+
str | None,
261+
Field(serialization_alias="output", min_length=1, default=None),
262+
AfterValidator(_validate_output_prefix),
263+
] = None
264+
265+
242266
PageNumber = Annotated[int, Field(ge=1), PlainSerializer(lambda x: str(x))]
243267

244268

0 commit comments

Comments
 (0)