Skip to content

Commit 57b70e6

Browse files
Split Translate PDF methods by output type
Assisted-by: Codex
1 parent c2d50a2 commit 57b70e6

6 files changed

Lines changed: 117 additions & 23 deletions

File tree

src/pdfrest/client.py

Lines changed: 82 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@
109109
SummaryOutputFormat,
110110
SummaryOutputType,
111111
TranslateOutputFormat,
112-
TranslateOutputType,
113112
)
114113

115114
DEFAULT_BASE_URL = "https://api.pdfrest.com"
@@ -2166,20 +2165,19 @@ def translate_pdf_text(
21662165
source_language: str | None = None,
21672166
pages: PdfPageSelection | None = None,
21682167
output_format: TranslateOutputFormat = "markdown",
2169-
output_type: TranslateOutputType = "json",
21702168
output: str | None = None,
21712169
extra_query: Query | None = None,
21722170
extra_headers: AnyMapping | None = None,
21732171
extra_body: Body | None = None,
21742172
timeout: TimeoutTypes | None = None,
21752173
) -> TranslatePdfTextResponse:
2176-
"""Translate the textual content of a PDF, Markdown, or text document."""
2174+
"""Translate the textual content of a PDF, Markdown, or text document (JSON)."""
21772175

21782176
payload: dict[str, Any] = {
21792177
"files": file,
21802178
"target_language": target_language,
21812179
"output_format": output_format,
2182-
"output_type": output_type,
2180+
"output_type": "json",
21832181
}
21842182
if source_language is not None:
21852183
payload["source_language"] = source_language
@@ -2203,6 +2201,45 @@ def translate_pdf_text(
22032201
raw_payload = self._send_request(request)
22042202
return TranslatePdfTextResponse.model_validate(raw_payload)
22052203

2204+
def translate_pdf_text_to_file(
2205+
self,
2206+
file: PdfRestFile | Sequence[PdfRestFile],
2207+
*,
2208+
target_language: str,
2209+
source_language: str | None = None,
2210+
pages: PdfPageSelection | None = None,
2211+
output_format: TranslateOutputFormat = "markdown",
2212+
output: str | None = None,
2213+
extra_query: Query | None = None,
2214+
extra_headers: AnyMapping | None = None,
2215+
extra_body: Body | None = None,
2216+
timeout: TimeoutTypes | None = None,
2217+
) -> PdfRestFileBasedResponse:
2218+
"""Translate textual content and receive a file-based response."""
2219+
2220+
payload: dict[str, Any] = {
2221+
"files": file,
2222+
"target_language": target_language,
2223+
"output_format": output_format,
2224+
"output_type": "file",
2225+
}
2226+
if source_language is not None:
2227+
payload["source_language"] = source_language
2228+
if pages is not None:
2229+
payload["pages"] = pages
2230+
if output is not None:
2231+
payload["output"] = output
2232+
2233+
return self._post_file_operation(
2234+
endpoint="/translated-pdf-text",
2235+
payload=payload,
2236+
payload_model=TranslatePdfTextPayload,
2237+
extra_query=extra_query,
2238+
extra_headers=extra_headers,
2239+
extra_body=extra_body,
2240+
timeout=timeout,
2241+
)
2242+
22062243
def extract_images(
22072244
self,
22082245
file: PdfRestFile | Sequence[PdfRestFile],
@@ -2881,20 +2918,19 @@ async def translate_pdf_text(
28812918
source_language: str | None = None,
28822919
pages: PdfPageSelection | None = None,
28832920
output_format: TranslateOutputFormat = "markdown",
2884-
output_type: TranslateOutputType = "json",
28852921
output: str | None = None,
28862922
extra_query: Query | None = None,
28872923
extra_headers: AnyMapping | None = None,
28882924
extra_body: Body | None = None,
28892925
timeout: TimeoutTypes | None = None,
28902926
) -> TranslatePdfTextResponse:
2891-
"""Translate the textual content of a PDF, Markdown, or text document."""
2927+
"""Translate the textual content of a PDF, Markdown, or text document (JSON)."""
28922928

28932929
payload: dict[str, Any] = {
28942930
"files": file,
28952931
"target_language": target_language,
28962932
"output_format": output_format,
2897-
"output_type": output_type,
2933+
"output_type": "json",
28982934
}
28992935
if source_language is not None:
29002936
payload["source_language"] = source_language
@@ -2918,6 +2954,45 @@ async def translate_pdf_text(
29182954
raw_payload = await self._send_request(request)
29192955
return TranslatePdfTextResponse.model_validate(raw_payload)
29202956

2957+
async def translate_pdf_text_to_file(
2958+
self,
2959+
file: PdfRestFile | Sequence[PdfRestFile],
2960+
*,
2961+
target_language: str,
2962+
source_language: str | None = None,
2963+
pages: PdfPageSelection | None = None,
2964+
output_format: TranslateOutputFormat = "markdown",
2965+
output: str | None = None,
2966+
extra_query: Query | None = None,
2967+
extra_headers: AnyMapping | None = None,
2968+
extra_body: Body | None = None,
2969+
timeout: TimeoutTypes | None = None,
2970+
) -> PdfRestFileBasedResponse:
2971+
"""Translate textual content and receive a file-based response."""
2972+
2973+
payload: dict[str, Any] = {
2974+
"files": file,
2975+
"target_language": target_language,
2976+
"output_format": output_format,
2977+
"output_type": "file",
2978+
}
2979+
if source_language is not None:
2980+
payload["source_language"] = source_language
2981+
if pages is not None:
2982+
payload["pages"] = pages
2983+
if output is not None:
2984+
payload["output"] = output
2985+
2986+
return await self._post_file_operation(
2987+
endpoint="/translated-pdf-text",
2988+
payload=payload,
2989+
payload_model=TranslatePdfTextPayload,
2990+
extra_query=extra_query,
2991+
extra_headers=extra_headers,
2992+
extra_body=extra_body,
2993+
timeout=timeout,
2994+
)
2995+
29212996
async def extract_images(
29222997
self,
29232998
file: PdfRestFile | Sequence[PdfRestFile],

src/pdfrest/models/_internal.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
SummaryOutputFormat,
2929
SummaryOutputType,
3030
TranslateOutputFormat,
31-
TranslateOutputType,
3231
)
3332
from . import PdfRestFile
3433
from .public import PdfRestFileID
@@ -432,7 +431,8 @@ class TranslatePdfTextPayload(BaseModel):
432431
Field(serialization_alias="output_format", default="markdown"),
433432
] = "markdown"
434433
output_type: Annotated[
435-
TranslateOutputType, Field(serialization_alias="output_type", default="json")
434+
Literal["json", "file"],
435+
Field(serialization_alias="output_type", default="json"),
436436
] = "json"
437437
output: Annotated[
438438
str | None,

src/pdfrest/types/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
SummaryOutputFormat,
1616
SummaryOutputType,
1717
TranslateOutputFormat,
18-
TranslateOutputType,
1918
)
2019

2120
__all__ = [
@@ -33,5 +32,4 @@
3332
"SummaryOutputFormat",
3433
"SummaryOutputType",
3534
"TranslateOutputFormat",
36-
"TranslateOutputType",
3735
]

src/pdfrest/types/public.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
"SummaryOutputFormat",
2828
"SummaryOutputType",
2929
"TranslateOutputFormat",
30-
"TranslateOutputType",
3130
)
3231

3332
PdfInfoQuery = Literal[
@@ -121,4 +120,3 @@ class PdfMergeSource(TypedDict, total=False):
121120
SummaryOutputType = Literal["json", "file"]
122121

123122
TranslateOutputFormat = Literal["plaintext", "markdown"]
124-
TranslateOutputType = Literal["json", "file"]

tests/live/test_live_translate_pdf_text.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import pytest
44

55
from pdfrest import PdfRestApiError, PdfRestClient
6-
from pdfrest.models import TranslatePdfTextResponse
6+
from pdfrest.models import PdfRestFileBasedResponse, TranslatePdfTextResponse
77

88
from ..resources import get_test_resource_path
99

@@ -21,7 +21,6 @@ def test_live_translate_pdf_text_success(
2121
response = client.translate_pdf_text(
2222
uploaded,
2323
target_language="fr",
24-
output_type="json",
2524
output_format="plaintext",
2625
)
2726

@@ -46,3 +45,24 @@ def test_live_translate_pdf_text_invalid_output_format(
4645
target_language="es",
4746
extra_body={"output_format": "invalid-format"},
4847
)
48+
49+
50+
def test_live_translate_pdf_text_file_success(
51+
pdfrest_api_key: str,
52+
pdfrest_live_base_url: str,
53+
) -> None:
54+
resource = get_test_resource_path("report.pdf")
55+
with PdfRestClient(
56+
api_key=pdfrest_api_key,
57+
base_url=pdfrest_live_base_url,
58+
) as client:
59+
uploaded = client.files.create_from_paths([resource])[0]
60+
response = client.translate_pdf_text_to_file(
61+
uploaded,
62+
target_language="fr",
63+
output_format="plaintext",
64+
)
65+
66+
assert isinstance(response, PdfRestFileBasedResponse)
67+
assert response.output_files
68+
assert response.input_id == uploaded.id

tests/test_translate_pdf_text.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@
77
from pydantic import ValidationError
88

99
from pdfrest import AsyncPdfRestClient, PdfRestClient
10-
from pdfrest.models import PdfRestFile, PdfRestFileID, TranslatePdfTextResponse
10+
from pdfrest.models import (
11+
PdfRestFile,
12+
PdfRestFileBasedResponse,
13+
PdfRestFileID,
14+
TranslatePdfTextResponse,
15+
)
1116
from pdfrest.models._internal import TranslatePdfTextPayload
1217

1318
from .graphics_test_helpers import ASYNC_API_KEY, VALID_API_KEY, make_pdf_file
@@ -95,7 +100,6 @@ def handler(request: httpx.Request) -> httpx.Response:
95100
source_language="en",
96101
pages=["1-2"],
97102
output_format="plaintext",
98-
output_type="json",
99103
output="translation",
100104
)
101105

@@ -145,19 +149,17 @@ def handler(request: httpx.Request) -> httpx.Response:
145149

146150
transport = httpx.MockTransport(handler)
147151
with PdfRestClient(api_key=VALID_API_KEY, transport=transport) as client:
148-
response = client.translate_pdf_text(
152+
response = client.translate_pdf_text_to_file(
149153
input_file,
150154
target_language="es",
151-
output_type="file",
152155
extra_query={"trace": "true"},
153156
extra_headers={"X-Debug": "sync"},
154157
extra_body={"debug": True},
155158
timeout=0.3,
156159
)
157160

158-
assert isinstance(response, TranslatePdfTextResponse)
159-
assert response.output_id == output_id
160-
assert response.output_url
161+
assert isinstance(response, PdfRestFileBasedResponse)
162+
assert response.output_file.id == output_id
161163
timeout_value = captured_timeout["value"]
162164
assert timeout_value is not None
163165
if isinstance(timeout_value, dict):
@@ -199,7 +201,8 @@ def handler(request: httpx.Request) -> httpx.Response:
199201
transport = httpx.MockTransport(handler)
200202
async with AsyncPdfRestClient(api_key=ASYNC_API_KEY, transport=transport) as client:
201203
response = await client.translate_pdf_text(
202-
input_file, target_language="de", output_type="json"
204+
input_file,
205+
target_language="de",
203206
)
204207

205208
assert seen == {"post": 1}

0 commit comments

Comments
 (0)