Skip to content

Commit dc01981

Browse files
Replace json.dumps
- Pydantic models get `model_dump_json` - Everything else gets `to_json` Assisted-by: Codex
1 parent 21902c6 commit dc01981

5 files changed

Lines changed: 55 additions & 46 deletions

File tree

src/pdfrest/models/_internal.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from __future__ import annotations
22

3-
import json
43
import re
54
from collections.abc import Callable, Sequence
65
from pathlib import PurePath
@@ -19,6 +18,7 @@
1918
model_serializer,
2019
model_validator,
2120
)
21+
from pydantic_core import to_json
2222

2323
from pdfrest.types.public import PdfRedactionPreset
2424

@@ -144,14 +144,17 @@ def _serialize_grouped_page_ranges(
144144

145145

146146
def _serialize_redactions(value: list[_PdfRedactionVariant]) -> str:
147-
payload = [entry.model_dump(mode="json", exclude_none=True) for entry in value]
148-
return json.dumps(payload, separators=(",", ":"))
147+
return (
148+
"["
149+
+ ",".join(entry.model_dump_json(exclude_none=True) for entry in value)
150+
+ "]"
151+
)
149152

150153

151154
def _serialize_text_object_value(value: Any) -> Any:
152155
if isinstance(value, str):
153156
return value
154-
return json.dumps(value, separators=(",", ":"))
157+
return to_json(value).decode()
155158

156159

157160
def _serialize_text_objects(value: list[BaseModel]) -> str:
@@ -164,7 +167,7 @@ def _serialize_text_objects(value: list[BaseModel]) -> str:
164167
}
165168
for entry in value
166169
]
167-
return json.dumps(payload, separators=(",", ":"))
170+
return to_json(payload).decode()
168171

169172

170173
def _allowed_mime_types(

tests/live/test_live_add_text_to_pdf.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
from __future__ import annotations
22

3-
import json
4-
53
import pytest
4+
from pydantic_core import to_json
65

76
from pdfrest import AsyncPdfRestClient, PdfRestApiError, PdfRestClient
87
from pdfrest.models import PdfRestFile
@@ -57,7 +56,7 @@ def _serialize_text_object_for_extra_body(
5756
# Match add-text wire format where each non-string value is JSON-quoted.
5857
for key, value in list(serialized.items()):
5958
if not isinstance(value, str):
60-
serialized[key] = json.dumps(value, separators=(",", ":"))
59+
serialized[key] = to_json(value).decode()
6160
return serialized
6261

6362

@@ -120,17 +119,16 @@ def test_live_add_text_to_pdf_invalid_page(
120119
uploaded_pdf_for_text,
121120
text_objects=[_default_text_object()],
122121
extra_body={
123-
"text_objects": json.dumps(
122+
"text_objects": to_json(
124123
[
125124
_serialize_text_object_for_extra_body(
126125
{
127126
**_default_text_object(),
128127
"page": 0,
129128
}
130129
)
131-
],
132-
separators=(",", ":"),
133-
)
130+
]
131+
).decode()
134132
},
135133
)
136134

@@ -150,16 +148,15 @@ async def test_live_async_add_text_to_pdf_invalid_page(
150148
uploaded_pdf_for_text,
151149
text_objects=[_default_text_object()],
152150
extra_body={
153-
"text_objects": json.dumps(
151+
"text_objects": to_json(
154152
[
155153
_serialize_text_object_for_extra_body(
156154
{
157155
**_default_text_object(),
158156
"page": 0,
159157
}
160158
)
161-
],
162-
separators=(",", ":"),
163-
)
159+
]
160+
).decode()
164161
},
165162
)

tests/test_add_text_to_pdf.py

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import httpx
77
import pytest
88
from pydantic import ValidationError
9+
from pydantic_core import to_json
910

1011
from pdfrest import AsyncPdfRestClient, PdfRestClient
1112
from pdfrest.models import PdfRestFileBasedResponse, PdfRestFileID
@@ -56,7 +57,7 @@ def _serialize_text_object_for_request(
5657
# Add-text payloads now quote non-string values inside the text_objects JSON.
5758
for key, value in list(serialized.items()):
5859
if not isinstance(value, str):
59-
serialized[key] = json.dumps(value, separators=(",", ":"))
60+
serialized[key] = to_json(value).decode()
6061
return serialized
6162

6263

@@ -73,13 +74,15 @@ def handler(request: httpx.Request) -> httpx.Response:
7374
payload = json.loads(request.content.decode("utf-8"))
7475
assert payload["id"] == str(pdf_file.id)
7576
assert payload["output"] == "with-text"
76-
assert payload["text_objects"] == json.dumps(
77-
[
78-
_serialize_text_object_for_request(
79-
make_text_object(is_right_to_left=True)
80-
)
81-
],
82-
separators=(",", ":"),
77+
assert (
78+
payload["text_objects"]
79+
== to_json(
80+
[
81+
_serialize_text_object_for_request(
82+
make_text_object(is_right_to_left=True)
83+
)
84+
]
85+
).decode()
8386
)
8487
return httpx.Response(
8588
200,
@@ -132,9 +135,11 @@ def handler(request: httpx.Request) -> httpx.Response:
132135
assert request.headers["X-Debug"] == "1"
133136
payload = json.loads(request.content.decode("utf-8"))
134137
assert payload["rotation"] == 15
135-
assert payload["text_objects"] == json.dumps(
136-
[_serialize_text_object_for_request(overridden_text_object)],
137-
separators=(",", ":"),
138+
assert (
139+
payload["text_objects"]
140+
== to_json(
141+
[_serialize_text_object_for_request(overridden_text_object)],
142+
).decode()
138143
)
139144
captured_timeout["value"] = request.extensions.get("timeout")
140145
return httpx.Response(
@@ -167,10 +172,9 @@ def handler(request: httpx.Request) -> httpx.Response:
167172
extra_headers={"X-Debug": "1"},
168173
extra_body={
169174
"rotation": 15,
170-
"text_objects": json.dumps(
175+
"text_objects": to_json(
171176
[_serialize_text_object_for_request(overridden_text_object)],
172-
separators=(",", ":"),
173-
),
177+
).decode(),
174178
},
175179
timeout=0.25,
176180
)
@@ -288,13 +292,15 @@ def handler(request: httpx.Request) -> httpx.Response:
288292
seen["post"] += 1
289293
payload = json.loads(request.content.decode("utf-8"))
290294
assert payload["id"] == str(pdf_file.id)
291-
assert payload["text_objects"] == json.dumps(
292-
[
293-
_serialize_text_object_for_request(
294-
make_text_object(page="all", is_right_to_left=True)
295-
)
296-
],
297-
separators=(",", ":"),
295+
assert (
296+
payload["text_objects"]
297+
== to_json(
298+
[
299+
_serialize_text_object_for_request(
300+
make_text_object(page="all", is_right_to_left=True)
301+
)
302+
]
303+
).decode()
298304
)
299305
return httpx.Response(
300306
200,
@@ -343,9 +349,11 @@ def handler(request: httpx.Request) -> httpx.Response:
343349
assert request.headers["X-Test"] == "async"
344350
payload = json.loads(request.content.decode("utf-8"))
345351
assert payload["text_size"] == 18
346-
assert payload["text_objects"] == json.dumps(
347-
[_serialize_text_object_for_request(overridden_text_object)],
348-
separators=(",", ":"),
352+
assert (
353+
payload["text_objects"]
354+
== to_json(
355+
[_serialize_text_object_for_request(overridden_text_object)],
356+
).decode()
349357
)
350358
captured_timeout["value"] = request.extensions.get("timeout")
351359
return httpx.Response(
@@ -378,10 +386,9 @@ def handler(request: httpx.Request) -> httpx.Response:
378386
extra_headers={"X-Test": "async"},
379387
extra_body={
380388
"text_size": 18,
381-
"text_objects": json.dumps(
389+
"text_objects": to_json(
382390
[_serialize_text_object_for_request(overridden_text_object)],
383-
separators=(",", ":"),
384-
),
391+
).decode(),
385392
},
386393
timeout=1.0,
387394
)

tests/test_files.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import httpx
1313
import pytest
1414
import pytest_asyncio
15+
from pydantic_core import to_json
1516
from typing_extensions import override
1617

1718
from pdfrest import AsyncPdfRestClient, PdfRestClient
@@ -654,7 +655,7 @@ def handler(request: httpx.Request) -> httpx.Response:
654655
if request.method == "GET" and request.url.path == "/resource/file-id":
655656
return httpx.Response(200, stream=_StaticStream(binary_content))
656657
if request.method == "GET" and request.url.path == "/resource/file-id-json":
657-
payload = json.dumps(json_payload).encode("utf-8")
658+
payload = to_json(json_payload)
658659
return httpx.Response(200, stream=_StaticStream(payload))
659660
msg = f"Unexpected request: {request.method} {request.url}"
660661
raise AssertionError(msg)
@@ -739,7 +740,7 @@ def handler(request: httpx.Request) -> httpx.Response:
739740
if request.method == "GET" and request.url.path == "/resource/file-id":
740741
return httpx.Response(200, stream=_StaticAsyncStream(binary_content))
741742
if request.method == "GET" and request.url.path == "/resource/file-id-json":
742-
payload = json.dumps(json_payload).encode("utf-8")
743+
payload = to_json(json_payload)
743744
return httpx.Response(200, stream=_StaticAsyncStream(payload))
744745
msg = f"Unexpected request: {request.method} {request.url}"
745746
raise AssertionError(msg)

tests/test_pdf_redaction_preview.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import httpx
66
import pytest
77
from pydantic import ValidationError
8+
from pydantic_core import to_json
89

910
from pdfrest import PdfRestClient
1011
from pdfrest.models import PdfRestFileBasedResponse, PdfRestFileID
@@ -107,7 +108,7 @@ def test_preview_redactions_reject_json_string(monkeypatch: pytest.MonkeyPatch)
107108
):
108109
client.preview_redactions(
109110
input_file,
110-
redactions=json.dumps([{"type": "literal", "value": "secret"}]), # type: ignore[arg-type]
111+
redactions=to_json([{"type": "literal", "value": "secret"}]).decode(), # type: ignore[arg-type]
111112
)
112113

113114

0 commit comments

Comments
 (0)