Skip to content

Commit df9a078

Browse files
committed
Update deprecated type annotations produced by AWS scaffold tool
As of Python 3.9, common type annotations have changed, and the old ones (e.g. List, Optional, Union) generate deprecation warnings in some tools (pyright in my case). This change updates the generation of scaffolded types to use the new names, and also adds default values in some cases, where further warnings were previously reported.
1 parent 3262ccd commit df9a078

File tree

1 file changed

+15
-17
lines changed

1 file changed

+15
-17
lines changed

localstack-core/localstack/aws/scaffold.py

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,7 @@ def _print_as_class(self, output, base: str, doc=True, quote_types=False):
188188
if member in self.shape.required_members:
189189
output.write(f" {member}: IO[{q}{to_valid_python_name(shape.name)}{q}]\n")
190190
else:
191-
output.write(
192-
f" {member}: Optional[IO[{q}{to_valid_python_name(shape.name)}{q}]]\n"
193-
)
191+
output.write(f" {member}: {q}IO[{to_valid_python_name(shape.name)}] | None{q}\n")
194192
del remaining_members[member]
195193
# render the streaming payload first
196194
if self.is_response and self.response_operation.has_streaming_output:
@@ -199,25 +197,26 @@ def _print_as_class(self, output, base: str, doc=True, quote_types=False):
199197
shape_name = to_valid_python_name(shape.name)
200198
if member in self.shape.required_members:
201199
output.write(
202-
f" {member}: Union[{q}{shape_name}{q}, IO[{q}{shape_name}{q}], Iterable[{q}{shape_name}{q}]]\n"
200+
f" {member}: {q}{shape_name} | IO[{shape_name}] | Iterable[{shape_name}]{q}\n"
203201
)
204202
else:
205203
output.write(
206-
f" {member}: Optional[Union[{q}{shape_name}{q}, IO[{q}{shape_name}{q}], Iterable[{q}{shape_name}{q}]]]\n"
204+
f" {member}: {q}{shape_name} | IO[{shape_name}] | Iterable[{shape_name}] | None{q}\n"
207205
)
208206
del remaining_members[member]
209207

210208
for k, v in remaining_members.items():
209+
shape_name = to_valid_python_name(v.name)
211210
if k in self.shape.required_members:
212211
if v.serialization.get("eventstream"):
213-
output.write(f" {k}: Iterator[{q}{to_valid_python_name(v.name)}{q}]\n")
212+
output.write(f" {k}: Iterator[{q}{shape_name}{q}]\n")
214213
else:
215-
output.write(f" {k}: {q}{to_valid_python_name(v.name)}{q}\n")
214+
output.write(f" {k}: {q}{shape_name}{q}\n")
216215
else:
217216
if v.serialization.get("eventstream"):
218-
output.write(f" {k}: Iterator[{q}{to_valid_python_name(v.name)}{q}]\n")
217+
output.write(f" {k}: Iterator[{q}{shape_name}{q}]\n")
219218
else:
220-
output.write(f" {k}: Optional[{q}{to_valid_python_name(v.name)}{q}]\n")
219+
output.write(f" {k}: {q}{shape_name} | None{q}\n")
221220

222221
def _print_as_typed_dict(self, output, doc=True, quote_types=False):
223222
name = to_valid_python_name(self.shape.name)
@@ -236,7 +235,7 @@ def _print_as_typed_dict(self, output, doc=True, quote_types=False):
236235
if v.serialization.get("eventstream"):
237236
output.write(f' "{k}": Iterator[{q}{member_name}{q}],\n')
238237
else:
239-
output.write(f' "{k}": Optional[{q}{member_name}{q}],\n')
238+
output.write(f' "{k}": {q}{member_name} | None{q},\n')
240239
output.write("}, total=False)")
241240

242241
def print_shape_doc(self, output, shape):
@@ -256,11 +255,11 @@ def print_declaration(self, output, doc=True, quote_types=False):
256255
self._print_structure_declaration(output, doc, quote_types)
257256
elif isinstance(shape, ListShape):
258257
output.write(
259-
f"{to_valid_python_name(shape.name)} = List[{q}{to_valid_python_name(shape.member.name)}{q}]"
258+
f"{to_valid_python_name(shape.name)} = list[{q}{to_valid_python_name(shape.member.name)}{q}]"
260259
)
261260
elif isinstance(shape, MapShape):
262261
output.write(
263-
f"{to_valid_python_name(shape.name)} = Dict[{q}{to_valid_python_name(shape.key.name)}{q}, {q}{to_valid_python_name(shape.value.name)}{q}]"
262+
f"{to_valid_python_name(shape.name)} = dict[{q}{to_valid_python_name(shape.key.name)}{q}, {q}{to_valid_python_name(shape.value.name)}{q}]"
264263
)
265264
elif isinstance(shape, StringShape):
266265
if shape.enum:
@@ -316,9 +315,8 @@ def get_order(self):
316315
def generate_service_types(output, service: ServiceModel, doc=True):
317316
output.write("from datetime import datetime\n")
318317
output.write("from enum import StrEnum\n")
319-
output.write(
320-
"from typing import Dict, List, Optional, Iterator, Iterable, IO, Union, TypedDict\n"
321-
)
318+
output.write("from typing import IO, TypedDict\n")
319+
output.write("from collections.abc import Iterable, Iterator\n")
322320
output.write("\n")
323321
output.write(
324322
"from localstack.aws.api import handler, RequestContext, ServiceException, ServiceRequest"
@@ -372,8 +370,8 @@ def generate_service_api(output, service: ServiceModel, doc=True):
372370

373371
output.write(f"class {class_name}:\n")
374372
output.write("\n")
375-
output.write(f' service = "{service.service_name}"\n')
376-
output.write(f' version = "{service.api_version}"\n')
373+
output.write(f' service: str = "{service.service_name}"\n')
374+
output.write(f' version: str = "{service.api_version}"\n')
377375
for op_name in service.operation_names:
378376
operation: OperationModel = service.operation_model(op_name)
379377

0 commit comments

Comments
 (0)