Skip to content

Commit aeedc04

Browse files
committed
Add size hits to list and map serializers
1 parent 4a10737 commit aeedc04

File tree

15 files changed

+56
-40
lines changed

15 files changed

+56
-40
lines changed

python-packages/smithy-core/smithy_core/documents.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -268,12 +268,18 @@ def serialize_contents(self, serializer: ShapeSerializer) -> None:
268268
with serializer.begin_struct(self._schema) as struct_serializer:
269269
self.serialize_members(struct_serializer)
270270
case ShapeType.LIST:
271-
with serializer.begin_list(self._schema) as list_serializer:
272-
for element in self.as_list():
271+
list_value = self.as_list()
272+
with serializer.begin_list(
273+
self._schema, len(list_value)
274+
) as list_serializer:
275+
for element in list_value:
273276
element.serialize(list_serializer)
274277
case ShapeType.MAP:
275-
with serializer.begin_map(self._schema) as map_serializer:
276-
for key, value in self.as_map().items():
278+
map_value = self.as_map()
279+
with serializer.begin_map(
280+
self._schema, len(map_value)
281+
) as map_serializer:
282+
for key, value in map_value.items():
277283
map_serializer.entry(key, lambda s: value.serialize(s))
278284
case ShapeType.STRING | ShapeType.ENUM:
279285
serializer.write_string(self._schema, self.as_string())
@@ -427,7 +433,7 @@ def begin_struct(self, schema: "Schema") -> Iterator[ShapeSerializer]:
427433

428434
@override
429435
@contextmanager
430-
def begin_list(self, schema: "Schema") -> Iterator[ShapeSerializer]:
436+
def begin_list(self, schema: "Schema", size: int) -> Iterator[ShapeSerializer]:
431437
delegate = _DocumentListSerializer(schema)
432438
try:
433439
yield delegate
@@ -438,7 +444,7 @@ def begin_list(self, schema: "Schema") -> Iterator[ShapeSerializer]:
438444

439445
@override
440446
@contextmanager
441-
def begin_map(self, schema: "Schema") -> Iterator[MapSerializer]:
447+
def begin_map(self, schema: "Schema", size: int) -> Iterator[MapSerializer]:
442448
delegate = _DocumentMapSerializer(schema)
443449
try:
444450
yield delegate

python-packages/smithy-core/smithy_core/serializers.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ def write_struct(self, schema: "Schema", struct: "SerializeableStruct") -> None:
5252
with self.begin_struct(schema=schema) as struct_serializer:
5353
struct.serialize_members(struct_serializer)
5454

55-
def begin_list(self, schema: "Schema") -> AbstractContextManager["ShapeSerializer"]:
55+
def begin_list(
56+
self, schema: "Schema", size: int
57+
) -> AbstractContextManager["ShapeSerializer"]:
5658
"""Open a list for writing.
5759
5860
The returned context manager is responsible for closing the list when the caller
@@ -62,11 +64,14 @@ def begin_list(self, schema: "Schema") -> AbstractContextManager["ShapeSerialize
6264
inserting any data needed between elements.
6365
6466
:param schema: The schema of the list.
67+
:param size: The size of the list.
6568
:returns: A context manager containing an element serializer.
6669
"""
6770
...
6871

69-
def begin_map(self, schema: "Schema") -> AbstractContextManager["MapSerializer"]:
72+
def begin_map(
73+
self, schema: "Schema", size: int
74+
) -> AbstractContextManager["MapSerializer"]:
7075
"""Open a map for writing.
7176
7277
The returned context manager is responsible for closing the map when the caller
@@ -77,6 +82,7 @@ def begin_map(self, schema: "Schema") -> AbstractContextManager["MapSerializer"]
7782
data needed between entries.
7883
7984
:param schema: The schema of the map.
85+
:param size: The size of the map.
8086
:returns: A context manager containing a map serializer.
8187
"""
8288
...
@@ -239,23 +245,23 @@ def begin_struct(self, schema: "Schema") -> Iterator[ShapeSerializer]:
239245
self.after(schema)
240246

241247
@contextmanager
242-
def begin_list(self, schema: "Schema") -> Iterator[ShapeSerializer]:
248+
def begin_list(self, schema: "Schema", size: int) -> Iterator[ShapeSerializer]:
243249
delegate = self.before(schema)
244250

245251
try:
246-
with delegate.begin_list(schema) as s:
252+
with delegate.begin_list(schema, size) as s:
247253
yield s
248254
except Exception:
249255
raise
250256
else:
251257
self.after(schema)
252258

253259
@contextmanager
254-
def begin_map(self, schema: "Schema") -> Iterator[MapSerializer]:
260+
def begin_map(self, schema: "Schema", size: int) -> Iterator[MapSerializer]:
255261
delegate = self.before(schema)
256262

257263
try:
258-
with delegate.begin_map(schema) as s:
264+
with delegate.begin_map(schema, size) as s:
259265
yield s
260266
except Exception:
261267
raise
@@ -335,10 +341,14 @@ def begin_struct(
335341
) -> AbstractContextManager["ShapeSerializer"]:
336342
self._invalid_state(schema)
337343

338-
def begin_list(self, schema: "Schema") -> AbstractContextManager["ShapeSerializer"]:
344+
def begin_list(
345+
self, schema: "Schema", size: int
346+
) -> AbstractContextManager["ShapeSerializer"]:
339347
self._invalid_state(schema)
340348

341-
def begin_map(self, schema: "Schema") -> AbstractContextManager["MapSerializer"]:
349+
def begin_map(
350+
self, schema: "Schema", size: int
351+
) -> AbstractContextManager["MapSerializer"]:
342352
self._invalid_state(schema)
343353

344354
def write_null(self, schema: "Schema") -> None:

python-packages/smithy-core/tests/unit/aio/test_types.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from typing import Self
66

77
import pytest
8-
98
from smithy_core.aio.types import (
109
AsyncBytesProvider,
1110
AsyncBytesReader,

python-packages/smithy-core/tests/unit/test_documents.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from typing import Any, Self, cast
66

77
import pytest
8-
98
from smithy_core.deserializers import ShapeDeserializer
109
from smithy_core.documents import (
1110
Document,
@@ -623,21 +622,21 @@ def serialize_members(self, serializer: ShapeSerializer) -> None:
623622
if self.list_member is not None:
624623
schema = SCHEMA.members["listMember"]
625624
target_schema = schema.expect_member_target().members["member"]
626-
with serializer.begin_list(schema) as ls:
625+
with serializer.begin_list(schema, len(self.list_member)) as ls:
627626
for element in self.list_member:
628627
ls.write_string(target_schema, element)
629628
if self.map_member is not None:
630629
schema = SCHEMA.members["mapMember"]
631630
target_schema = schema.expect_member_target().members["value"]
632-
with serializer.begin_map(schema) as ms:
631+
with serializer.begin_map(schema, len(self.map_member)) as ms:
633632
for key, value in self.map_member.items():
634633
ms.entry(key, lambda vs: vs.write_string(target_schema, value)) # type: ignore
635634
if self.struct_member is not None:
636635
serializer.write_struct(SCHEMA.members["structMember"], self.struct_member)
637636
if self.sparse_list_member is not None:
638637
schema = SCHEMA.members["sparseListMember"]
639638
target_schema = schema.expect_member_target().members["member"]
640-
with serializer.begin_list(schema) as ls:
639+
with serializer.begin_list(schema, len(self.sparse_list_member)) as ls:
641640
for element in self.sparse_list_member:
642641
if element is None:
643642
ls.write_null(target_schema)
@@ -646,7 +645,7 @@ def serialize_members(self, serializer: ShapeSerializer) -> None:
646645
if self.sparse_map_member is not None:
647646
schema = SCHEMA.members["sparseMapMember"]
648647
target_schema = schema.expect_member_target().members["value"]
649-
with serializer.begin_map(schema) as ms:
648+
with serializer.begin_map(schema, len(self.sparse_map_member)) as ms:
650649
for key, value in self.sparse_map_member.items():
651650
if value is None:
652651
ms.entry(key, lambda vs: vs.write_null(target_schema))
@@ -840,7 +839,9 @@ def test_document_serializer(given: Any, expected: Document):
840839
serializer.write_document(DOCUMENT, given)
841840
case list():
842841
given = cast(list[str], given)
843-
with serializer.begin_list(SPARSE_STRING_LIST_SCHEMA) as list_serializer:
842+
with serializer.begin_list(
843+
SPARSE_STRING_LIST_SCHEMA, len(given)
844+
) as list_serializer:
844845
member_schema = SPARSE_STRING_LIST_SCHEMA.members["member"]
845846
for e in given:
846847
if e is None:
@@ -849,7 +850,9 @@ def test_document_serializer(given: Any, expected: Document):
849850
list_serializer.write_string(member_schema, e)
850851
case dict():
851852
given = cast(dict[str, str], given)
852-
with serializer.begin_map(SPARSE_STRING_MAP_SCHEMA) as map_serializer:
853+
with serializer.begin_map(
854+
SPARSE_STRING_MAP_SCHEMA, len(given)
855+
) as map_serializer:
853856
member_schema = SPARSE_STRING_MAP_SCHEMA.members["value"]
854857
for k, v in given.items():
855858
if v is None:

python-packages/smithy-core/tests/unit/test_identity.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import pytest
66
from freezegun import freeze_time
7-
87
from smithy_core.identity import Identity
98

109

python-packages/smithy-core/tests/unit/test_retries.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
# SPDX-License-Identifier: Apache-2.0
33

44
import pytest
5-
65
from smithy_core.exceptions import SmithyRetryException
76
from smithy_core.interfaces.retries import RetryErrorInfo, RetryErrorType
87
from smithy_core.retries import ExponentialBackoffJitterType as EBJT

python-packages/smithy-core/tests/unit/test_schemas.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from dataclasses import replace
22

33
import pytest
4-
54
from smithy_core.exceptions import ExpectationNotMetException
65
from smithy_core.schemas import Schema
76
from smithy_core.shapes import ShapeID, ShapeType

python-packages/smithy-core/tests/unit/test_shapes.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import pytest
2-
32
from smithy_core.exceptions import ExpectationNotMetException, SmithyException
43
from smithy_core.shapes import ShapeID
54

python-packages/smithy-core/tests/unit/test_types.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from datetime import datetime, timezone
66

77
import pytest
8-
98
from smithy_core.exceptions import ExpectationNotMetException
109
from smithy_core.types import JsonBlob, JsonString, TimestampFormat
1110

python-packages/smithy-core/tests/unit/test_uri.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
# SPDX-License-Identifier: Apache-2.0
33
import pytest
4-
54
from smithy_core import URI, HostType
65
from smithy_core.exceptions import SmithyException
76

0 commit comments

Comments
 (0)