Skip to content

Commit 1a8818d

Browse files
refactor(typing): reduce aws_lambda_powertools.shared.types usage (#4896)
* refactor(typing): reduce aws_lambda_powertools.shared.types usage As discussed in #4607. This simplifies linting and refactoring so we can introduce from __future__ import annotations to all files, which is the plan as the next step. * Docmentation fix + small changes --------- Co-authored-by: Leandro Damascena <[email protected]>
1 parent 08f2b53 commit 1a8818d

File tree

56 files changed

+98
-131
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+98
-131
lines changed

Diff for: aws_lambda_powertools/event_handler/api_gateway.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
Dict,
1818
Generic,
1919
List,
20+
Literal,
2021
Mapping,
2122
Match,
2223
Optional,
@@ -47,7 +48,6 @@
4748
from aws_lambda_powertools.shared.cookies import Cookie
4849
from aws_lambda_powertools.shared.functions import powertools_dev_is_set
4950
from aws_lambda_powertools.shared.json_encoder import Encoder
50-
from aws_lambda_powertools.shared.types import Literal
5151
from aws_lambda_powertools.utilities.data_classes import (
5252
ALBEvent,
5353
APIGatewayProxyEvent,

Diff for: aws_lambda_powertools/event_handler/middlewares/base.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
from abc import ABC, abstractmethod
2-
from typing import Generic
2+
from typing import Generic, Protocol
33

44
from aws_lambda_powertools.event_handler.api_gateway import Response
55
from aws_lambda_powertools.event_handler.types import EventHandlerInstance
6-
from aws_lambda_powertools.shared.types import Protocol
76

87

98
class NextMiddleware(Protocol):

Diff for: aws_lambda_powertools/event_handler/openapi/models.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
from enum import Enum
2-
from typing import Any, Dict, List, Optional, Set, Union
2+
from typing import Any, Dict, List, Literal, Optional, Set, Union
33

44
from pydantic import AnyUrl, BaseModel, Field
5+
from typing_extensions import Annotated
56

67
from aws_lambda_powertools.event_handler.openapi.compat import model_rebuild
78
from aws_lambda_powertools.event_handler.openapi.constants import (
89
MODEL_CONFIG_ALLOW,
910
MODEL_CONFIG_IGNORE,
1011
)
11-
from aws_lambda_powertools.shared.types import Annotated, Literal
1212

1313
"""
1414
The code defines Pydantic models for the various OpenAPI objects like OpenAPI, PathItem, Operation, Parameter etc.

Diff for: aws_lambda_powertools/event_handler/openapi/params.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import inspect
22
from enum import Enum
3-
from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union
3+
from typing import Any, Callable, Dict, List, Literal, Optional, Tuple, Type, Union
44

55
from pydantic import BaseConfig
66
from pydantic.fields import FieldInfo
7+
from typing_extensions import Annotated, get_args, get_origin
78

89
from aws_lambda_powertools.event_handler import Response
910
from aws_lambda_powertools.event_handler.openapi.compat import (
@@ -16,7 +17,6 @@
1617
get_annotation_from_field_info,
1718
)
1819
from aws_lambda_powertools.event_handler.openapi.types import CacheKey
19-
from aws_lambda_powertools.shared.types import Annotated, Literal, get_args, get_origin
2020

2121
"""
2222
This turns the low-level function signature into typed, validated Pydantic models for consumption.

Diff for: aws_lambda_powertools/event_handler/openapi/types.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import types
22
from enum import Enum
3-
from typing import TYPE_CHECKING, Any, Callable, Dict, Optional, Set, Type, Union
3+
from typing import TYPE_CHECKING, Any, Callable, Dict, Optional, Set, Type, TypedDict, Union
44

5-
from aws_lambda_powertools.shared.types import NotRequired, TypedDict
5+
from typing_extensions import NotRequired
66

77
if TYPE_CHECKING:
88
from pydantic import BaseModel # noqa: F401

Diff for: aws_lambda_powertools/logging/types.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from __future__ import annotations
22

3-
from typing import Any, Dict, List, Union
3+
from typing import Any, Dict, List, TypedDict, Union
44

5-
from aws_lambda_powertools.shared.types import NotRequired, TypeAlias, TypedDict
5+
from typing_extensions import NotRequired, TypeAlias
66

77
LogRecord: TypeAlias = Union[Dict[str, Any], "PowertoolsLogRecord"]
88
LogStackTrace: TypeAlias = Union[Dict[str, Any], "PowertoolsStackTrace"]

Diff for: aws_lambda_powertools/metrics/functions.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
from __future__ import annotations
22

33
from datetime import datetime
4+
from typing import List
45

56
from aws_lambda_powertools.metrics.provider.cloudwatch_emf.exceptions import (
67
MetricResolutionError,
78
MetricUnitError,
89
)
910
from aws_lambda_powertools.metrics.provider.cloudwatch_emf.metric_properties import MetricResolution, MetricUnit
1011
from aws_lambda_powertools.shared import constants
11-
from aws_lambda_powertools.shared.types import List
1212

1313

1414
def extract_cloudwatch_metric_resolution_value(metric_resolutions: List, resolution: int | MetricResolution) -> int:

Diff for: aws_lambda_powertools/metrics/provider/cloudwatch_emf/types.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
from aws_lambda_powertools.shared.types import List, NotRequired, TypedDict
1+
from typing import List, TypedDict
2+
3+
from typing_extensions import NotRequired
24

35

46
class CloudWatchEMFMetric(TypedDict):

Diff for: aws_lambda_powertools/metrics/types.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
from aws_lambda_powertools.shared.types import NotRequired, TypedDict
1+
from typing import TypedDict
2+
3+
from typing_extensions import NotRequired
24

35

46
class MetricNameUnitResolution(TypedDict):

Diff for: aws_lambda_powertools/shared/cookies.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
from datetime import datetime
22
from enum import Enum
33
from io import StringIO
4-
from typing import Optional
5-
6-
from aws_lambda_powertools.shared.types import List
4+
from typing import List, Optional
75

86

97
class SameSite(Enum):

Diff for: aws_lambda_powertools/shared/types.py

+1-23
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,3 @@
1-
import sys
2-
from typing import Any, Callable, Dict, List, Literal, Protocol, TypedDict, TypeVar, Union
3-
4-
if sys.version_info >= (3, 9):
5-
from typing import Annotated
6-
else:
7-
from typing_extensions import Annotated
8-
9-
if sys.version_info >= (3, 11):
10-
from typing import NotRequired
11-
else:
12-
from typing_extensions import NotRequired
13-
14-
# Even though `get_args` and `get_origin` were added in Python 3.8, they only handle Annotated correctly on 3.10.
15-
# So for python < 3.10 we use the backport from typing_extensions.
16-
if sys.version_info >= (3, 10):
17-
from typing import TypeAlias, get_args, get_origin
18-
else:
19-
from typing_extensions import TypeAlias, get_args, get_origin
1+
from typing import Any, Callable, TypeVar
202

213
AnyCallableT = TypeVar("AnyCallableT", bound=Callable[..., Any]) # noqa: VNE001
22-
# JSON primitives only, mypy doesn't support recursive tho
23-
JSONType = Union[str, int, float, bool, None, Dict[str, Any], List[Any]]
24-
25-
__all__ = ["get_args", "get_origin", "Annotated", "Protocol", "TypedDict", "Literal", "NotRequired", "TypeAlias"]

Diff for: aws_lambda_powertools/utilities/batch/types.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import sys
2-
from typing import Optional, Type, Union
3-
4-
from aws_lambda_powertools.shared.types import List, TypedDict
2+
from typing import List, Optional, Type, TypedDict, Union
53

64
has_pydantic = "pydantic" in sys.modules
75

Diff for: aws_lambda_powertools/utilities/data_classes/s3_batch_operation_event.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import warnings
22
from dataclasses import dataclass, field
3-
from typing import Any, Dict, Iterator, List, Optional, Tuple
3+
from typing import Any, Dict, Iterator, List, Literal, Optional, Tuple
44
from urllib.parse import unquote_plus
55

6-
from aws_lambda_powertools.shared.types import Literal
76
from aws_lambda_powertools.utilities.data_classes.common import DictWrapper
87

98
# list of valid result code. Used both in S3BatchOperationResponse and S3BatchOperationResponseRecord

Diff for: aws_lambda_powertools/utilities/data_classes/secrets_manager_event.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from aws_lambda_powertools.shared.types import Literal
1+
from typing import Literal
2+
23
from aws_lambda_powertools.utilities.data_classes.common import DictWrapper
34

45

Diff for: aws_lambda_powertools/utilities/feature_flags/__init__.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
"""Advanced feature flags utility"""
22

3-
from .appconfig import AppConfigStore
4-
from .base import StoreProvider
5-
from .exceptions import ConfigurationStoreError
6-
from .feature_flags import FeatureFlags
7-
from .schema import RuleAction, SchemaValidator
3+
from aws_lambda_powertools.utilities.feature_flags.appconfig import AppConfigStore
4+
from aws_lambda_powertools.utilities.feature_flags.base import StoreProvider
5+
from aws_lambda_powertools.utilities.feature_flags.exceptions import ConfigurationStoreError
6+
from aws_lambda_powertools.utilities.feature_flags.feature_flags import FeatureFlags
7+
from aws_lambda_powertools.utilities.feature_flags.schema import RuleAction, SchemaValidator
88

99
__all__ = [
1010
"ConfigurationStoreError",

Diff for: aws_lambda_powertools/utilities/feature_flags/appconfig.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,16 @@
44

55
from botocore.config import Config
66

7+
from aws_lambda_powertools.logging import Logger
78
from aws_lambda_powertools.utilities import jmespath_utils
9+
from aws_lambda_powertools.utilities.feature_flags.base import StoreProvider
10+
from aws_lambda_powertools.utilities.feature_flags.exceptions import ConfigurationStoreError, StoreClientError
811
from aws_lambda_powertools.utilities.parameters import (
912
AppConfigProvider,
1013
GetParameterError,
1114
TransformParameterError,
1215
)
1316

14-
from ... import Logger
15-
from .base import StoreProvider
16-
from .exceptions import ConfigurationStoreError, StoreClientError
17-
1817

1918
class AppConfigStore(StoreProvider):
2019
def __init__(

Diff for: aws_lambda_powertools/utilities/feature_flags/comparators.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from dateutil.tz import gettz
77

8-
from .schema import HOUR_MIN_SEPARATOR, ModuloRangeValues, TimeValues
8+
from aws_lambda_powertools.utilities.feature_flags.schema import HOUR_MIN_SEPARATOR, ModuloRangeValues, TimeValues
99

1010

1111
def _get_now_from_timezone(timezone: Optional[tzinfo]) -> datetime:

Diff for: aws_lambda_powertools/utilities/feature_flags/feature_flags.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@
55

66
from typing_extensions import ParamSpec
77

8-
from ... import Logger
9-
from ...shared.types import JSONType
10-
from . import schema
11-
from .base import StoreProvider
12-
from .comparators import (
8+
from aws_lambda_powertools.logging import Logger
9+
from aws_lambda_powertools.utilities.feature_flags import schema
10+
from aws_lambda_powertools.utilities.feature_flags.base import StoreProvider
11+
from aws_lambda_powertools.utilities.feature_flags.comparators import (
1312
compare_all_in_list,
1413
compare_any_in_list,
1514
compare_datetime_range,
@@ -18,7 +17,8 @@
1817
compare_none_in_list,
1918
compare_time_range,
2019
)
21-
from .exceptions import ConfigurationStoreError
20+
from aws_lambda_powertools.utilities.feature_flags.exceptions import ConfigurationStoreError
21+
from aws_lambda_powertools.utilities.feature_flags.types import JSONType
2222

2323
T = TypeVar("T")
2424
P = ParamSpec("P")

Diff for: aws_lambda_powertools/utilities/feature_flags/schema.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99

1010
from dateutil import tz
1111

12-
from ... import Logger
13-
from .base import BaseValidator
14-
from .exceptions import SchemaValidationError
12+
from aws_lambda_powertools.logging import Logger
13+
from aws_lambda_powertools.utilities.feature_flags.base import BaseValidator
14+
from aws_lambda_powertools.utilities.feature_flags.exceptions import SchemaValidationError
1515

1616
RULES_KEY = "rules"
1717
FEATURE_DEFAULT_VAL_KEY = "default"
+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from typing import Any, Dict, List, Union
2+
3+
# JSON primitives only, mypy doesn't support recursive tho
4+
JSONType = Union[str, int, float, bool, None, Dict[str, Any], List[Any]]

Diff for: aws_lambda_powertools/utilities/idempotency/hook.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
from typing import Any
1+
from typing import Any, Protocol
22

3-
from aws_lambda_powertools.shared.types import Protocol
43
from aws_lambda_powertools.utilities.idempotency.persistence.datarecord import DataRecord
54

65

Diff for: aws_lambda_powertools/utilities/idempotency/persistence/redis.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@
55
import logging
66
from contextlib import contextmanager
77
from datetime import timedelta
8-
from typing import Any, Dict
8+
from typing import Any, Dict, Literal, Protocol
99

1010
import redis
1111

12-
from aws_lambda_powertools.shared.types import Literal, Protocol
1312
from aws_lambda_powertools.utilities.idempotency import BasePersistenceLayer
1413
from aws_lambda_powertools.utilities.idempotency.exceptions import (
1514
IdempotencyItemAlreadyExistsError,

Diff for: aws_lambda_powertools/utilities/parameters/ssm.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import logging
88
import os
99
import warnings
10-
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union, overload
10+
from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional, Tuple, Union, overload
1111

1212
import boto3
1313
from botocore.config import Config
@@ -18,7 +18,6 @@
1818
resolve_truthy_env_var_choice,
1919
slice_dictionary,
2020
)
21-
from aws_lambda_powertools.shared.types import Literal
2221
from aws_lambda_powertools.utilities.parameters.base import (
2322
DEFAULT_MAX_AGE_SECS,
2423
DEFAULT_PROVIDERS,

Diff for: aws_lambda_powertools/utilities/parameters/types.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
from aws_lambda_powertools.shared.types import Literal
1+
from typing import Literal
22

33
TransformOptions = Literal["json", "binary", "auto", None]

Diff for: aws_lambda_powertools/utilities/parser/models/cloudwatch.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,10 @@
33
import logging
44
import zlib
55
from datetime import datetime
6-
from typing import Optional, Type, Union
6+
from typing import List, Optional, Type, Union
77

88
from pydantic import BaseModel, Field, field_validator
99

10-
from aws_lambda_powertools.shared.types import List
11-
1210
logger = logging.getLogger(__name__)
1311

1412

Diff for: aws_lambda_powertools/utilities/parser/types.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
"""Generics and other shared types used across parser"""
22

3-
from typing import Any, Dict, Type, TypeVar, Union
3+
from typing import Any, Dict, Literal, Type, TypeVar, Union
44

55
from pydantic import BaseModel, Json
66

7-
from aws_lambda_powertools.shared.types import Literal
8-
97
Model = TypeVar("Model", bound=BaseModel)
108
EnvelopeModel = TypeVar("EnvelopeModel")
119
EventParserReturnType = TypeVar("EventParserReturnType")

Diff for: aws_lambda_powertools/utilities/streaming/s3_object.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
Any,
88
Iterable,
99
List,
10+
Literal,
1011
Optional,
1112
Sequence,
1213
TypeVar,
@@ -15,7 +16,6 @@
1516
overload,
1617
)
1718

18-
from aws_lambda_powertools.shared.types import Literal
1919
from aws_lambda_powertools.utilities.streaming._s3_seekable_io import _S3SeekableIO
2020
from aws_lambda_powertools.utilities.streaming.transformations import (
2121
CsvTransform,

Diff for: docs/core/event_handler/api_gateway.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ In the following example, we use a new `Query` OpenAPI type to add [one out of m
380380

381381
=== "validating_query_strings.py"
382382

383-
```python hl_lines="8 10 27"
383+
```python hl_lines="8 9 27"
384384
--8<-- "examples/event_handler_rest/src/validating_query_strings.py"
385385
```
386386

@@ -418,7 +418,7 @@ Just like we learned in [query string validation](#validating-query-strings), we
418418

419419
For example, we could validate that `<todo_id>` dynamic path should be no greater than three digits.
420420

421-
```python hl_lines="8 10 27" title="validating_path.py"
421+
```python hl_lines="8 9 27" title="validating_path.py"
422422
--8<-- "examples/event_handler_rest/src/validating_path.py"
423423
```
424424

@@ -440,7 +440,7 @@ In the following example, we use a new `Header` OpenAPI type to add [one out of
440440

441441
=== "validating_headers.py"
442442

443-
```python hl_lines="8 10 27"
443+
```python hl_lines="5 9 27"
444444
--8<-- "examples/event_handler_rest/src/validating_headers.py"
445445
```
446446

0 commit comments

Comments
 (0)