Skip to content

Commit e459248

Browse files
committed
Fix potentially incorrect ResponseTypeDef name clash resolution
1 parent a642ab7 commit e459248

File tree

10 files changed

+62
-60
lines changed

10 files changed

+62
-60
lines changed

mypy_boto3_builder/parsers/shape_parser.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,10 +1030,7 @@ def fix_typed_dict_names(self) -> None:
10301030
if typed_dict is None:
10311031
continue
10321032

1033-
for (
1034-
old_typed_dict_name,
1035-
output_typed_dict,
1036-
) in self._output_typed_dict_map.iterate_pairs(name):
1033+
for output_typed_dict in self._output_typed_dict_map.iterate_by_name(name):
10371034
if typed_dict.is_same(output_typed_dict):
10381035
continue
10391036

@@ -1065,13 +1062,11 @@ def fix_typed_dict_names(self) -> None:
10651062
if typed_dict is None:
10661063
continue
10671064

1068-
for (
1069-
old_typed_dict_name,
1070-
response_typed_dict,
1071-
) in self._response_typed_dict_map.iterate_pairs(name):
1065+
for response_typed_dict in self._response_typed_dict_map.iterate_by_name(name):
10721066
if typed_dict.is_same(response_typed_dict):
10731067
continue
10741068

1069+
old_typed_dict_name = response_typed_dict.name
10751070
new_typed_dict_name = self._get_non_clashing_typed_dict_name(
10761071
response_typed_dict, "Response"
10771072
)

mypy_boto3_builder/parsers/typed_dict_map.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,14 @@ def add(self, item: TypeTypedDict) -> None:
1919
"""
2020
self[item.name] = item
2121

22-
def iterate_pairs(self, name: str) -> Iterator[tuple[str, TypeTypedDict]]:
22+
def iterate_by_name(self, name: str) -> Iterator[TypeTypedDict]:
2323
"""
24-
Iterate over pairs mathed by real dict name.
24+
Iterate over items matched by real dict name.
2525
"""
26-
for key, value in list(self.items()):
27-
if value.name == name:
28-
yield key, value
26+
items = list(self.values())
27+
for item in items:
28+
if item.name == name:
29+
yield item
2930

3031
def rename(self, item: TypeTypedDict, new_name: str) -> None:
3132
"""

mypy_boto3_builder/type_annotations/type_union.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from collections.abc import Iterable, Iterator
66
from pathlib import Path
7-
from typing import Self
7+
from typing import Final, Self
88

99
from mypy_boto3_builder.enums.service_module_name import ServiceModuleName
1010
from mypy_boto3_builder.exceptions import TypeAnnotationError
@@ -23,6 +23,8 @@ class TypeUnion(TypeSubscript, TypeDefSortable):
2323
Wrapper for name Union type annotations, like `MyUnion = Union[str, int]`.
2424
"""
2525

26+
MIN_CHILDREN: Final[int] = 2
27+
2628
def __init__(
2729
self,
2830
children: Iterable[FakeAnnotation],
@@ -32,8 +34,8 @@ def __init__(
3234
self.name = name
3335
self.parent = Type.Union
3436
self.children: list[FakeAnnotation] = list(children)
35-
if len(self.children) < 2:
36-
raise TypeAnnotationError("Union must have at least 2 children")
37+
if len(self.children) < self.MIN_CHILDREN:
38+
raise TypeAnnotationError(f"Union must have at least {self.MIN_CHILDREN} children")
3739
self._stringify = stringify
3840

3941
def is_stringified(self) -> bool:

mypy_boto3_builder/type_maps/method_type_map.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,18 +115,18 @@ def _get_from_service_map(
115115
)
116116
class_type_map = service_type_map[service_name]
117117

118-
for class_name, method_name, argument_name in checks:
119-
if class_name not in class_type_map:
118+
for check_class_name, check_method_name, check_argument_name in checks:
119+
if check_class_name not in class_type_map:
120120
continue
121121

122-
method_type_map = class_type_map[class_name]
122+
method_type_map = class_type_map[check_class_name]
123123

124-
if method_name not in method_type_map:
124+
if check_method_name not in method_type_map:
125125
continue
126126

127-
operation_type_map = method_type_map[method_name]
128-
if argument_name in operation_type_map:
129-
return operation_type_map[argument_name]
127+
operation_type_map = method_type_map[check_method_name]
128+
if check_argument_name in operation_type_map:
129+
return operation_type_map[check_argument_name]
130130

131131
return None
132132

mypy_boto3_builder/utils/pypi_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def _get_versions(self) -> set[str]:
6868
return self._versions
6969

7070
response = requests.get(self.json_url, timeout=REQUEST_TIMEOUT)
71-
if response.status_code == 404:
71+
if response.status_code == requests.codes.not_found:
7272
return set()
7373
if not response.ok:
7474
raise BuildEnvError(

mypy_boto3_builder/utils/strings.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ def get_short_docstring(doc: str) -> str:
6767
result: list[str] = []
6868
if not doc:
6969
return ""
70-
for line in doc.splitlines():
71-
line = line.strip().removesuffix("::")
70+
for raw_line in doc.splitlines():
71+
line = raw_line.strip().removesuffix("::")
7272
if not line:
7373
continue
7474
if line.startswith(":") or line.lower().startswith("**request syntax**"):
@@ -114,11 +114,12 @@ def textwrap(text: str, width: int) -> str:
114114
Wrap text to `width` chars.
115115
"""
116116
result: list[str] = []
117-
for line in text.splitlines():
118-
if len(line) <= width:
119-
result.append(line)
117+
for raw_line in text.splitlines():
118+
if len(raw_line) <= width:
119+
result.append(raw_line)
120120
continue
121121

122+
line = raw_line
122123
while line:
123124
space_index = line.rfind(" ", 0, width)
124125
if space_index < 0:

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ select = [
178178
"TRY", # tryceratops
179179
"PERF", # Perflint
180180
"FURB", # refurb
181+
"PL", # pylint
181182
]
182183
ignore = [
183184
"D107", # undocumented-public-init
@@ -196,6 +197,7 @@ ignore = [
196197
# "ANN401", # any-type
197198
"TRY003", # raise-vanilla-args
198199
"PERF203", # try-except-in-loop
200+
"PLR0913", # too-many-arguments
199201
]
200202
fixable = ["ALL"]
201203
unfixable = ["B"]

scripts/integration.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ def main() -> None:
327327
error = e
328328
if error:
329329
logger.error(error)
330-
exit(1)
330+
sys.exit(1)
331331

332332

333333
if __name__ == "__main__":

uv.lock

Lines changed: 27 additions & 27 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vulture_whitelist.txt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@ IS_CONDA_FORGE_SUPPORTED # unused variable (mypy_boto3_builder/package_data.py:
1313
PYPI_LITE_NAME # unused variable (mypy_boto3_builder/package_data.py:137)
1414
IS_CONDA_FORGE_SUPPORTED # unused variable (mypy_boto3_builder/package_data.py:148)
1515
PYPI_LITE_NAME # unused variable (mypy_boto3_builder/package_data.py:175)
16-
AIOBOTOCORE_NAME # unused variable (mypy_boto3_builder/package_data.py:179)
17-
PYPI_LITE_NAME # unused variable (mypy_boto3_builder/package_data.py:196)
18-
AIOBOTOCORE_NAME # unused variable (mypy_boto3_builder/package_data.py:197)
16+
PYPI_FULL_NAME # unused variable (mypy_boto3_builder/package_data.py:176)
17+
AIOBOTOCORE_NAME # unused variable (mypy_boto3_builder/package_data.py:180)
18+
PYPI_LITE_NAME # unused variable (mypy_boto3_builder/package_data.py:197)
19+
AIOBOTOCORE_NAME # unused variable (mypy_boto3_builder/package_data.py:198)
1920
limit_key # unused variable (mypy_boto3_builder/parsers/shape_parser_types.py:14)
2021
pagination # unused variable (mypy_boto3_builder/parsers/shape_parser_types.py:22)
2122
actions # unused variable (mypy_boto3_builder/parsers/shape_parser_types.py:104)

0 commit comments

Comments
 (0)