From aeedc043d8af42628ebfdc8bf385b87153bda523 Mon Sep 17 00:00:00 2001 From: jonathan343 Date: Sat, 22 Feb 2025 19:28:51 -0500 Subject: [PATCH 1/3] Add size hits to list and map serializers --- .../smithy-core/smithy_core/documents.py | 18 ++++++++----- .../smithy-core/smithy_core/serializers.py | 26 +++++++++++++------ .../smithy-core/tests/unit/aio/test_types.py | 1 - .../smithy-core/tests/unit/test_documents.py | 17 +++++++----- .../smithy-core/tests/unit/test_identity.py | 1 - .../smithy-core/tests/unit/test_retries.py | 1 - .../smithy-core/tests/unit/test_schemas.py | 1 - .../smithy-core/tests/unit/test_shapes.py | 1 - .../smithy-core/tests/unit/test_types.py | 1 - .../smithy-core/tests/unit/test_uri.py | 1 - .../smithy-core/tests/unit/test_utils.py | 1 - .../smithy_json/_private/serializers.py | 8 ++++-- .../smithy-json/tests/unit/__init__.py | 9 +++---- .../tests/unit/test_deserializers.py | 1 - .../tests/unit/test_serializers.py | 9 ++++--- 15 files changed, 56 insertions(+), 40 deletions(-) diff --git a/python-packages/smithy-core/smithy_core/documents.py b/python-packages/smithy-core/smithy_core/documents.py index 1a29d2128..89328a7a7 100644 --- a/python-packages/smithy-core/smithy_core/documents.py +++ b/python-packages/smithy-core/smithy_core/documents.py @@ -268,12 +268,18 @@ def serialize_contents(self, serializer: ShapeSerializer) -> None: with serializer.begin_struct(self._schema) as struct_serializer: self.serialize_members(struct_serializer) case ShapeType.LIST: - with serializer.begin_list(self._schema) as list_serializer: - for element in self.as_list(): + list_value = self.as_list() + with serializer.begin_list( + self._schema, len(list_value) + ) as list_serializer: + for element in list_value: element.serialize(list_serializer) case ShapeType.MAP: - with serializer.begin_map(self._schema) as map_serializer: - for key, value in self.as_map().items(): + map_value = self.as_map() + with serializer.begin_map( + self._schema, len(map_value) + ) as map_serializer: + for key, value in map_value.items(): map_serializer.entry(key, lambda s: value.serialize(s)) case ShapeType.STRING | ShapeType.ENUM: serializer.write_string(self._schema, self.as_string()) @@ -427,7 +433,7 @@ def begin_struct(self, schema: "Schema") -> Iterator[ShapeSerializer]: @override @contextmanager - def begin_list(self, schema: "Schema") -> Iterator[ShapeSerializer]: + def begin_list(self, schema: "Schema", size: int) -> Iterator[ShapeSerializer]: delegate = _DocumentListSerializer(schema) try: yield delegate @@ -438,7 +444,7 @@ def begin_list(self, schema: "Schema") -> Iterator[ShapeSerializer]: @override @contextmanager - def begin_map(self, schema: "Schema") -> Iterator[MapSerializer]: + def begin_map(self, schema: "Schema", size: int) -> Iterator[MapSerializer]: delegate = _DocumentMapSerializer(schema) try: yield delegate diff --git a/python-packages/smithy-core/smithy_core/serializers.py b/python-packages/smithy-core/smithy_core/serializers.py index 6a4648927..2da8eab99 100644 --- a/python-packages/smithy-core/smithy_core/serializers.py +++ b/python-packages/smithy-core/smithy_core/serializers.py @@ -52,7 +52,9 @@ def write_struct(self, schema: "Schema", struct: "SerializeableStruct") -> None: with self.begin_struct(schema=schema) as struct_serializer: struct.serialize_members(struct_serializer) - def begin_list(self, schema: "Schema") -> AbstractContextManager["ShapeSerializer"]: + def begin_list( + self, schema: "Schema", size: int + ) -> AbstractContextManager["ShapeSerializer"]: """Open a list for writing. 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 inserting any data needed between elements. :param schema: The schema of the list. + :param size: The size of the list. :returns: A context manager containing an element serializer. """ ... - def begin_map(self, schema: "Schema") -> AbstractContextManager["MapSerializer"]: + def begin_map( + self, schema: "Schema", size: int + ) -> AbstractContextManager["MapSerializer"]: """Open a map for writing. 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"] data needed between entries. :param schema: The schema of the map. + :param size: The size of the map. :returns: A context manager containing a map serializer. """ ... @@ -239,11 +245,11 @@ def begin_struct(self, schema: "Schema") -> Iterator[ShapeSerializer]: self.after(schema) @contextmanager - def begin_list(self, schema: "Schema") -> Iterator[ShapeSerializer]: + def begin_list(self, schema: "Schema", size: int) -> Iterator[ShapeSerializer]: delegate = self.before(schema) try: - with delegate.begin_list(schema) as s: + with delegate.begin_list(schema, size) as s: yield s except Exception: raise @@ -251,11 +257,11 @@ def begin_list(self, schema: "Schema") -> Iterator[ShapeSerializer]: self.after(schema) @contextmanager - def begin_map(self, schema: "Schema") -> Iterator[MapSerializer]: + def begin_map(self, schema: "Schema", size: int) -> Iterator[MapSerializer]: delegate = self.before(schema) try: - with delegate.begin_map(schema) as s: + with delegate.begin_map(schema, size) as s: yield s except Exception: raise @@ -335,10 +341,14 @@ def begin_struct( ) -> AbstractContextManager["ShapeSerializer"]: self._invalid_state(schema) - def begin_list(self, schema: "Schema") -> AbstractContextManager["ShapeSerializer"]: + def begin_list( + self, schema: "Schema", size: int + ) -> AbstractContextManager["ShapeSerializer"]: self._invalid_state(schema) - def begin_map(self, schema: "Schema") -> AbstractContextManager["MapSerializer"]: + def begin_map( + self, schema: "Schema", size: int + ) -> AbstractContextManager["MapSerializer"]: self._invalid_state(schema) def write_null(self, schema: "Schema") -> None: diff --git a/python-packages/smithy-core/tests/unit/aio/test_types.py b/python-packages/smithy-core/tests/unit/aio/test_types.py index 85b987660..512f6a554 100644 --- a/python-packages/smithy-core/tests/unit/aio/test_types.py +++ b/python-packages/smithy-core/tests/unit/aio/test_types.py @@ -5,7 +5,6 @@ from typing import Self import pytest - from smithy_core.aio.types import ( AsyncBytesProvider, AsyncBytesReader, diff --git a/python-packages/smithy-core/tests/unit/test_documents.py b/python-packages/smithy-core/tests/unit/test_documents.py index 5733f17d1..276548816 100644 --- a/python-packages/smithy-core/tests/unit/test_documents.py +++ b/python-packages/smithy-core/tests/unit/test_documents.py @@ -5,7 +5,6 @@ from typing import Any, Self, cast import pytest - from smithy_core.deserializers import ShapeDeserializer from smithy_core.documents import ( Document, @@ -623,13 +622,13 @@ def serialize_members(self, serializer: ShapeSerializer) -> None: if self.list_member is not None: schema = SCHEMA.members["listMember"] target_schema = schema.expect_member_target().members["member"] - with serializer.begin_list(schema) as ls: + with serializer.begin_list(schema, len(self.list_member)) as ls: for element in self.list_member: ls.write_string(target_schema, element) if self.map_member is not None: schema = SCHEMA.members["mapMember"] target_schema = schema.expect_member_target().members["value"] - with serializer.begin_map(schema) as ms: + with serializer.begin_map(schema, len(self.map_member)) as ms: for key, value in self.map_member.items(): ms.entry(key, lambda vs: vs.write_string(target_schema, value)) # type: ignore if self.struct_member is not None: @@ -637,7 +636,7 @@ def serialize_members(self, serializer: ShapeSerializer) -> None: if self.sparse_list_member is not None: schema = SCHEMA.members["sparseListMember"] target_schema = schema.expect_member_target().members["member"] - with serializer.begin_list(schema) as ls: + with serializer.begin_list(schema, len(self.sparse_list_member)) as ls: for element in self.sparse_list_member: if element is None: ls.write_null(target_schema) @@ -646,7 +645,7 @@ def serialize_members(self, serializer: ShapeSerializer) -> None: if self.sparse_map_member is not None: schema = SCHEMA.members["sparseMapMember"] target_schema = schema.expect_member_target().members["value"] - with serializer.begin_map(schema) as ms: + with serializer.begin_map(schema, len(self.sparse_map_member)) as ms: for key, value in self.sparse_map_member.items(): if value is None: ms.entry(key, lambda vs: vs.write_null(target_schema)) @@ -840,7 +839,9 @@ def test_document_serializer(given: Any, expected: Document): serializer.write_document(DOCUMENT, given) case list(): given = cast(list[str], given) - with serializer.begin_list(SPARSE_STRING_LIST_SCHEMA) as list_serializer: + with serializer.begin_list( + SPARSE_STRING_LIST_SCHEMA, len(given) + ) as list_serializer: member_schema = SPARSE_STRING_LIST_SCHEMA.members["member"] for e in given: if e is None: @@ -849,7 +850,9 @@ def test_document_serializer(given: Any, expected: Document): list_serializer.write_string(member_schema, e) case dict(): given = cast(dict[str, str], given) - with serializer.begin_map(SPARSE_STRING_MAP_SCHEMA) as map_serializer: + with serializer.begin_map( + SPARSE_STRING_MAP_SCHEMA, len(given) + ) as map_serializer: member_schema = SPARSE_STRING_MAP_SCHEMA.members["value"] for k, v in given.items(): if v is None: diff --git a/python-packages/smithy-core/tests/unit/test_identity.py b/python-packages/smithy-core/tests/unit/test_identity.py index dc0698ecd..020961a4f 100644 --- a/python-packages/smithy-core/tests/unit/test_identity.py +++ b/python-packages/smithy-core/tests/unit/test_identity.py @@ -4,7 +4,6 @@ import pytest from freezegun import freeze_time - from smithy_core.identity import Identity diff --git a/python-packages/smithy-core/tests/unit/test_retries.py b/python-packages/smithy-core/tests/unit/test_retries.py index 2d68da67a..82b6f7d09 100644 --- a/python-packages/smithy-core/tests/unit/test_retries.py +++ b/python-packages/smithy-core/tests/unit/test_retries.py @@ -2,7 +2,6 @@ # SPDX-License-Identifier: Apache-2.0 import pytest - from smithy_core.exceptions import SmithyRetryException from smithy_core.interfaces.retries import RetryErrorInfo, RetryErrorType from smithy_core.retries import ExponentialBackoffJitterType as EBJT diff --git a/python-packages/smithy-core/tests/unit/test_schemas.py b/python-packages/smithy-core/tests/unit/test_schemas.py index d06c44f78..258782078 100644 --- a/python-packages/smithy-core/tests/unit/test_schemas.py +++ b/python-packages/smithy-core/tests/unit/test_schemas.py @@ -1,7 +1,6 @@ from dataclasses import replace import pytest - from smithy_core.exceptions import ExpectationNotMetException from smithy_core.schemas import Schema from smithy_core.shapes import ShapeID, ShapeType diff --git a/python-packages/smithy-core/tests/unit/test_shapes.py b/python-packages/smithy-core/tests/unit/test_shapes.py index 26c00715d..80170f1f9 100644 --- a/python-packages/smithy-core/tests/unit/test_shapes.py +++ b/python-packages/smithy-core/tests/unit/test_shapes.py @@ -1,5 +1,4 @@ import pytest - from smithy_core.exceptions import ExpectationNotMetException, SmithyException from smithy_core.shapes import ShapeID diff --git a/python-packages/smithy-core/tests/unit/test_types.py b/python-packages/smithy-core/tests/unit/test_types.py index a478aad31..0ff54fb3c 100644 --- a/python-packages/smithy-core/tests/unit/test_types.py +++ b/python-packages/smithy-core/tests/unit/test_types.py @@ -5,7 +5,6 @@ from datetime import datetime, timezone import pytest - from smithy_core.exceptions import ExpectationNotMetException from smithy_core.types import JsonBlob, JsonString, TimestampFormat diff --git a/python-packages/smithy-core/tests/unit/test_uri.py b/python-packages/smithy-core/tests/unit/test_uri.py index e5bcf457d..96d0434e6 100644 --- a/python-packages/smithy-core/tests/unit/test_uri.py +++ b/python-packages/smithy-core/tests/unit/test_uri.py @@ -1,7 +1,6 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 import pytest - from smithy_core import URI, HostType from smithy_core.exceptions import SmithyException diff --git a/python-packages/smithy-core/tests/unit/test_utils.py b/python-packages/smithy-core/tests/unit/test_utils.py index 31d243d6b..6147c8d36 100644 --- a/python-packages/smithy-core/tests/unit/test_utils.py +++ b/python-packages/smithy-core/tests/unit/test_utils.py @@ -11,7 +11,6 @@ from unittest.mock import Mock import pytest - from smithy_core.exceptions import ExpectationNotMetException from smithy_core.utils import ( ensure_utc, diff --git a/python-packages/smithy-json/smithy_json/_private/serializers.py b/python-packages/smithy-json/smithy_json/_private/serializers.py index 217ca67ad..91f8eb50f 100644 --- a/python-packages/smithy-json/smithy_json/_private/serializers.py +++ b/python-packages/smithy-json/smithy_json/_private/serializers.py @@ -50,10 +50,14 @@ def begin_struct( ) -> AbstractContextManager["ShapeSerializer"]: return JSONStructSerializer(self._stream, self, self._use_json_name) - def begin_list(self, schema: "Schema") -> AbstractContextManager["ShapeSerializer"]: + def begin_list( + self, schema: "Schema", size: int + ) -> AbstractContextManager["ShapeSerializer"]: return JSONListSerializer(self._stream, self) - def begin_map(self, schema: "Schema") -> AbstractContextManager["MapSerializer"]: + def begin_map( + self, schema: "Schema", size: int + ) -> AbstractContextManager["MapSerializer"]: return JSONMapSerializer(self._stream, self) def write_null(self, schema: "Schema") -> None: diff --git a/python-packages/smithy-json/tests/unit/__init__.py b/python-packages/smithy-json/tests/unit/__init__.py index c61d173c6..8592c7087 100644 --- a/python-packages/smithy-json/tests/unit/__init__.py +++ b/python-packages/smithy-json/tests/unit/__init__.py @@ -19,7 +19,6 @@ from smithy_core.serializers import ShapeSerializer from smithy_core.shapes import ShapeID, ShapeType from smithy_core.traits import Trait - from smithy_json._private.traits import JSON_NAME, TIMESTAMP_FORMAT SPARSE_TRAIT = Trait(id=ShapeID("smithy.api#sparse")) @@ -170,13 +169,13 @@ def serialize_members(self, serializer: ShapeSerializer) -> None: if self.list_member is not None: schema = SCHEMA.members["listMember"] target_schema = schema.expect_member_target().members["member"] - with serializer.begin_list(schema) as ls: + with serializer.begin_list(schema, len(self.list_member)) as ls: for element in self.list_member: ls.write_string(target_schema, element) if self.map_member is not None: schema = SCHEMA.members["mapMember"] target_schema = schema.expect_member_target().members["value"] - with serializer.begin_map(schema) as ms: + with serializer.begin_map(schema, len(self.map_member)) as ms: for key, value in self.map_member.items(): ms.entry(key, lambda vs: vs.write_string(target_schema, value)) # type: ignore if self.struct_member is not None: @@ -184,7 +183,7 @@ def serialize_members(self, serializer: ShapeSerializer) -> None: if self.sparse_list_member is not None: schema = SCHEMA.members["sparseListMember"] target_schema = schema.expect_member_target().members["member"] - with serializer.begin_list(schema) as ls: + with serializer.begin_list(schema, len(self.sparse_list_member)) as ls: for element in self.sparse_list_member: if element is None: ls.write_null(target_schema) @@ -193,7 +192,7 @@ def serialize_members(self, serializer: ShapeSerializer) -> None: if self.sparse_map_member is not None: schema = SCHEMA.members["sparseMapMember"] target_schema = schema.expect_member_target().members["value"] - with serializer.begin_map(schema) as ms: + with serializer.begin_map(schema, len(self.sparse_map_member)) as ms: for key, value in self.sparse_map_member.items(): if value is None: ms.entry(key, lambda vs: vs.write_null(target_schema)) diff --git a/python-packages/smithy-json/tests/unit/test_deserializers.py b/python-packages/smithy-json/tests/unit/test_deserializers.py index 264bc04c6..cee2fcd27 100644 --- a/python-packages/smithy-json/tests/unit/test_deserializers.py +++ b/python-packages/smithy-json/tests/unit/test_deserializers.py @@ -14,7 +14,6 @@ STRING, TIMESTAMP, ) - from smithy_json import JSONCodec from . import ( diff --git a/python-packages/smithy-json/tests/unit/test_serializers.py b/python-packages/smithy-json/tests/unit/test_serializers.py index 4c2ebccc2..c32d9d53f 100644 --- a/python-packages/smithy-json/tests/unit/test_serializers.py +++ b/python-packages/smithy-json/tests/unit/test_serializers.py @@ -14,7 +14,6 @@ STRING, TIMESTAMP, ) - from smithy_json import JSONCodec from . import ( @@ -50,7 +49,9 @@ def test_json_serializer(given: Any, expected: bytes) -> None: serializer.write_document(given._schema, given) # type: ignore case list(): given = cast(list[str], given) - with serializer.begin_list(SPARSE_STRING_LIST_SCHEMA) as list_serializer: + with serializer.begin_list( + SPARSE_STRING_LIST_SCHEMA, len(given) + ) as list_serializer: member_schema = SPARSE_STRING_LIST_SCHEMA.members["member"] for e in given: if e is None: @@ -59,7 +60,9 @@ def test_json_serializer(given: Any, expected: bytes) -> None: list_serializer.write_string(member_schema, e) case dict(): given = cast(dict[str, str], given) - with serializer.begin_map(SPARSE_STRING_MAP_SCHEMA) as map_serializer: + with serializer.begin_map( + SPARSE_STRING_MAP_SCHEMA, len(given) + ) as map_serializer: member_schema = SPARSE_STRING_MAP_SCHEMA.members["value"] for k, v in given.items(): if v is None: From 3310a8578fb9ef2fabf52af043ae3858e1c91afc Mon Sep 17 00:00:00 2001 From: jonathan343 Date: Sat, 22 Feb 2025 19:49:04 -0500 Subject: [PATCH 2/3] run 'make lint-py' --- python-packages/smithy-core/tests/unit/aio/test_types.py | 1 + python-packages/smithy-core/tests/unit/test_documents.py | 1 + python-packages/smithy-core/tests/unit/test_identity.py | 1 + python-packages/smithy-core/tests/unit/test_retries.py | 1 + python-packages/smithy-core/tests/unit/test_schemas.py | 1 + python-packages/smithy-core/tests/unit/test_shapes.py | 1 + python-packages/smithy-core/tests/unit/test_types.py | 1 + python-packages/smithy-core/tests/unit/test_uri.py | 1 + python-packages/smithy-core/tests/unit/test_utils.py | 1 + python-packages/smithy-json/tests/unit/__init__.py | 1 + python-packages/smithy-json/tests/unit/test_deserializers.py | 1 + python-packages/smithy-json/tests/unit/test_serializers.py | 1 + 12 files changed, 12 insertions(+) diff --git a/python-packages/smithy-core/tests/unit/aio/test_types.py b/python-packages/smithy-core/tests/unit/aio/test_types.py index 512f6a554..85b987660 100644 --- a/python-packages/smithy-core/tests/unit/aio/test_types.py +++ b/python-packages/smithy-core/tests/unit/aio/test_types.py @@ -5,6 +5,7 @@ from typing import Self import pytest + from smithy_core.aio.types import ( AsyncBytesProvider, AsyncBytesReader, diff --git a/python-packages/smithy-core/tests/unit/test_documents.py b/python-packages/smithy-core/tests/unit/test_documents.py index 276548816..87b20b546 100644 --- a/python-packages/smithy-core/tests/unit/test_documents.py +++ b/python-packages/smithy-core/tests/unit/test_documents.py @@ -5,6 +5,7 @@ from typing import Any, Self, cast import pytest + from smithy_core.deserializers import ShapeDeserializer from smithy_core.documents import ( Document, diff --git a/python-packages/smithy-core/tests/unit/test_identity.py b/python-packages/smithy-core/tests/unit/test_identity.py index 020961a4f..dc0698ecd 100644 --- a/python-packages/smithy-core/tests/unit/test_identity.py +++ b/python-packages/smithy-core/tests/unit/test_identity.py @@ -4,6 +4,7 @@ import pytest from freezegun import freeze_time + from smithy_core.identity import Identity diff --git a/python-packages/smithy-core/tests/unit/test_retries.py b/python-packages/smithy-core/tests/unit/test_retries.py index 82b6f7d09..2d68da67a 100644 --- a/python-packages/smithy-core/tests/unit/test_retries.py +++ b/python-packages/smithy-core/tests/unit/test_retries.py @@ -2,6 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 import pytest + from smithy_core.exceptions import SmithyRetryException from smithy_core.interfaces.retries import RetryErrorInfo, RetryErrorType from smithy_core.retries import ExponentialBackoffJitterType as EBJT diff --git a/python-packages/smithy-core/tests/unit/test_schemas.py b/python-packages/smithy-core/tests/unit/test_schemas.py index 258782078..d06c44f78 100644 --- a/python-packages/smithy-core/tests/unit/test_schemas.py +++ b/python-packages/smithy-core/tests/unit/test_schemas.py @@ -1,6 +1,7 @@ from dataclasses import replace import pytest + from smithy_core.exceptions import ExpectationNotMetException from smithy_core.schemas import Schema from smithy_core.shapes import ShapeID, ShapeType diff --git a/python-packages/smithy-core/tests/unit/test_shapes.py b/python-packages/smithy-core/tests/unit/test_shapes.py index 80170f1f9..26c00715d 100644 --- a/python-packages/smithy-core/tests/unit/test_shapes.py +++ b/python-packages/smithy-core/tests/unit/test_shapes.py @@ -1,4 +1,5 @@ import pytest + from smithy_core.exceptions import ExpectationNotMetException, SmithyException from smithy_core.shapes import ShapeID diff --git a/python-packages/smithy-core/tests/unit/test_types.py b/python-packages/smithy-core/tests/unit/test_types.py index 0ff54fb3c..a478aad31 100644 --- a/python-packages/smithy-core/tests/unit/test_types.py +++ b/python-packages/smithy-core/tests/unit/test_types.py @@ -5,6 +5,7 @@ from datetime import datetime, timezone import pytest + from smithy_core.exceptions import ExpectationNotMetException from smithy_core.types import JsonBlob, JsonString, TimestampFormat diff --git a/python-packages/smithy-core/tests/unit/test_uri.py b/python-packages/smithy-core/tests/unit/test_uri.py index 96d0434e6..e5bcf457d 100644 --- a/python-packages/smithy-core/tests/unit/test_uri.py +++ b/python-packages/smithy-core/tests/unit/test_uri.py @@ -1,6 +1,7 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 import pytest + from smithy_core import URI, HostType from smithy_core.exceptions import SmithyException diff --git a/python-packages/smithy-core/tests/unit/test_utils.py b/python-packages/smithy-core/tests/unit/test_utils.py index 6147c8d36..31d243d6b 100644 --- a/python-packages/smithy-core/tests/unit/test_utils.py +++ b/python-packages/smithy-core/tests/unit/test_utils.py @@ -11,6 +11,7 @@ from unittest.mock import Mock import pytest + from smithy_core.exceptions import ExpectationNotMetException from smithy_core.utils import ( ensure_utc, diff --git a/python-packages/smithy-json/tests/unit/__init__.py b/python-packages/smithy-json/tests/unit/__init__.py index 8592c7087..d82feb010 100644 --- a/python-packages/smithy-json/tests/unit/__init__.py +++ b/python-packages/smithy-json/tests/unit/__init__.py @@ -19,6 +19,7 @@ from smithy_core.serializers import ShapeSerializer from smithy_core.shapes import ShapeID, ShapeType from smithy_core.traits import Trait + from smithy_json._private.traits import JSON_NAME, TIMESTAMP_FORMAT SPARSE_TRAIT = Trait(id=ShapeID("smithy.api#sparse")) diff --git a/python-packages/smithy-json/tests/unit/test_deserializers.py b/python-packages/smithy-json/tests/unit/test_deserializers.py index cee2fcd27..264bc04c6 100644 --- a/python-packages/smithy-json/tests/unit/test_deserializers.py +++ b/python-packages/smithy-json/tests/unit/test_deserializers.py @@ -14,6 +14,7 @@ STRING, TIMESTAMP, ) + from smithy_json import JSONCodec from . import ( diff --git a/python-packages/smithy-json/tests/unit/test_serializers.py b/python-packages/smithy-json/tests/unit/test_serializers.py index c32d9d53f..c06b8ab51 100644 --- a/python-packages/smithy-json/tests/unit/test_serializers.py +++ b/python-packages/smithy-json/tests/unit/test_serializers.py @@ -14,6 +14,7 @@ STRING, TIMESTAMP, ) + from smithy_json import JSONCodec from . import ( From 970b0b9ac71fd85511edff5cb32fabd08542032e Mon Sep 17 00:00:00 2001 From: jonathan343 Date: Sat, 22 Feb 2025 19:54:35 -0500 Subject: [PATCH 3/3] Update list and map generators --- .../amazon/smithy/python/codegen/generators/ListGenerator.java | 2 +- .../amazon/smithy/python/codegen/generators/MapGenerator.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/codegen/smithy-python-codegen/src/main/java/software/amazon/smithy/python/codegen/generators/ListGenerator.java b/codegen/smithy-python-codegen/src/main/java/software/amazon/smithy/python/codegen/generators/ListGenerator.java index 5630be77c..39315c434 100644 --- a/codegen/smithy-python-codegen/src/main/java/software/amazon/smithy/python/codegen/generators/ListGenerator.java +++ b/codegen/smithy-python-codegen/src/main/java/software/amazon/smithy/python/codegen/generators/ListGenerator.java @@ -45,7 +45,7 @@ private void generateSerializer() { writer.write(""" def $1L(serializer: ShapeSerializer, schema: Schema, value: $2T) -> None: member_schema = schema.members["member"] - with serializer.begin_list(schema) as ls: + with serializer.begin_list(schema, len(value)) as ls: for e in value: ${?sparse} if e is None: diff --git a/codegen/smithy-python-codegen/src/main/java/software/amazon/smithy/python/codegen/generators/MapGenerator.java b/codegen/smithy-python-codegen/src/main/java/software/amazon/smithy/python/codegen/generators/MapGenerator.java index 13111b783..825de5f68 100644 --- a/codegen/smithy-python-codegen/src/main/java/software/amazon/smithy/python/codegen/generators/MapGenerator.java +++ b/codegen/smithy-python-codegen/src/main/java/software/amazon/smithy/python/codegen/generators/MapGenerator.java @@ -47,7 +47,7 @@ private void generateSerializer() { // narrowing out the None even though there's an explicit is None check. writer.write(""" def $1L(serializer: ShapeSerializer, schema: Schema, value: $2T) -> None: - with serializer.begin_map(schema) as m: + with serializer.begin_map(schema, len(value)) as m: value_schema = schema.members["value"] for k, v in value.items(): ${?sparse}