diff --git a/aws_lambda_powertools/event_handler/middlewares/base.py b/aws_lambda_powertools/event_handler/middlewares/base.py index 32a4486bb31..fb4bf37cc74 100644 --- a/aws_lambda_powertools/event_handler/middlewares/base.py +++ b/aws_lambda_powertools/event_handler/middlewares/base.py @@ -1,10 +1,9 @@ from abc import ABC, abstractmethod from typing import Generic -from typing_extensions import Protocol - from aws_lambda_powertools.event_handler.api_gateway import Response from aws_lambda_powertools.event_handler.types import EventHandlerInstance +from aws_lambda_powertools.shared.types import Protocol class NextMiddleware(Protocol): diff --git a/aws_lambda_powertools/logging/types.py b/aws_lambda_powertools/logging/types.py index ede369491f1..d166b2e023c 100644 --- a/aws_lambda_powertools/logging/types.py +++ b/aws_lambda_powertools/logging/types.py @@ -1,24 +1,9 @@ from __future__ import annotations -import sys - -if sys.version_info >= (3, 11): - from typing import NotRequired -else: - from typing_extensions import NotRequired - -if sys.version_info >= (3, 8): - from typing import TypedDict -else: - from typing_extensions import TypedDict - -if sys.version_info >= (3, 10): - from typing import TypeAlias -else: - from typing_extensions import TypeAlias - from typing import Any, Dict, List, Union +from aws_lambda_powertools.shared.types import NotRequired, TypeAlias, TypedDict + LogRecord: TypeAlias = Union[Dict[str, Any], "PowertoolsLogRecord"] diff --git a/aws_lambda_powertools/metrics/functions.py b/aws_lambda_powertools/metrics/functions.py index d951c0749a3..e259826f1a7 100644 --- a/aws_lambda_powertools/metrics/functions.py +++ b/aws_lambda_powertools/metrics/functions.py @@ -1,12 +1,11 @@ from __future__ import annotations -from typing import List - from aws_lambda_powertools.metrics.provider.cloudwatch_emf.exceptions import ( MetricResolutionError, MetricUnitError, ) from aws_lambda_powertools.metrics.provider.cloudwatch_emf.metric_properties import MetricResolution, MetricUnit +from aws_lambda_powertools.shared.types import List def extract_cloudwatch_metric_resolution_value(metric_resolutions: List, resolution: int | MetricResolution) -> int: diff --git a/aws_lambda_powertools/metrics/provider/cloudwatch_emf/types.py b/aws_lambda_powertools/metrics/provider/cloudwatch_emf/types.py index bf3a48ea13f..359fdc4ee6c 100644 --- a/aws_lambda_powertools/metrics/provider/cloudwatch_emf/types.py +++ b/aws_lambda_powertools/metrics/provider/cloudwatch_emf/types.py @@ -1,6 +1,4 @@ -from typing import List - -from typing_extensions import NotRequired, TypedDict +from aws_lambda_powertools.shared.types import List, NotRequired, TypedDict class CloudWatchEMFMetric(TypedDict): diff --git a/aws_lambda_powertools/metrics/types.py b/aws_lambda_powertools/metrics/types.py index 76fcf7bd18a..d9eea6fe51e 100644 --- a/aws_lambda_powertools/metrics/types.py +++ b/aws_lambda_powertools/metrics/types.py @@ -1,4 +1,4 @@ -from typing_extensions import NotRequired, TypedDict +from aws_lambda_powertools.shared.types import NotRequired, TypedDict class MetricNameUnitResolution(TypedDict): diff --git a/aws_lambda_powertools/shared/cookies.py b/aws_lambda_powertools/shared/cookies.py index 944bcb5dc9f..1b57d860201 100644 --- a/aws_lambda_powertools/shared/cookies.py +++ b/aws_lambda_powertools/shared/cookies.py @@ -1,7 +1,9 @@ from datetime import datetime from enum import Enum from io import StringIO -from typing import List, Optional +from typing import Optional + +from aws_lambda_powertools.shared.types import List class SameSite(Enum): diff --git a/aws_lambda_powertools/shared/types.py b/aws_lambda_powertools/shared/types.py index b29c04cbe6b..633db46c587 100644 --- a/aws_lambda_powertools/shared/types.py +++ b/aws_lambda_powertools/shared/types.py @@ -1,14 +1,25 @@ import sys from typing import Any, Callable, Dict, List, TypeVar, Union -AnyCallableT = TypeVar("AnyCallableT", bound=Callable[..., Any]) # noqa: VNE001 -# JSON primitives only, mypy doesn't support recursive tho -JSONType = Union[str, int, float, bool, None, Dict[str, Any], List[Any]] +if sys.version_info >= (3, 8): + from typing import Literal, Protocol, TypedDict +else: + from typing_extensions import Literal, Protocol, TypedDict -if sys.version_info >= (3, 8): - from typing import Protocol +if sys.version_info >= (3, 11): + from typing import NotRequired else: - from typing_extensions import Protocol + from typing_extensions import NotRequired + + +if sys.version_info >= (3, 10): + from typing import TypeAlias +else: + from typing_extensions import TypeAlias + +AnyCallableT = TypeVar("AnyCallableT", bound=Callable[..., Any]) # noqa: VNE001 +# JSON primitives only, mypy doesn't support recursive tho +JSONType = Union[str, int, float, bool, None, Dict[str, Any], List[Any]] -__all__ = ["Protocol"] +__all__ = ["Protocol", "TypedDict", "Literal", "NotRequired", "TypeAlias"] diff --git a/aws_lambda_powertools/utilities/batch/types.py b/aws_lambda_powertools/utilities/batch/types.py index 4b07dab51a5..40083537e04 100644 --- a/aws_lambda_powertools/utilities/batch/types.py +++ b/aws_lambda_powertools/utilities/batch/types.py @@ -1,10 +1,7 @@ -# -# type specifics -# import sys -from typing import List, Optional, Type, Union +from typing import Optional, Type, Union -from typing_extensions import TypedDict +from aws_lambda_powertools.shared.types import List, TypedDict has_pydantic = "pydantic" in sys.modules diff --git a/aws_lambda_powertools/utilities/data_classes/secrets_manager_event.py b/aws_lambda_powertools/utilities/data_classes/secrets_manager_event.py index b5fa41211ef..1a3a1c5b7f4 100644 --- a/aws_lambda_powertools/utilities/data_classes/secrets_manager_event.py +++ b/aws_lambda_powertools/utilities/data_classes/secrets_manager_event.py @@ -1,5 +1,4 @@ -from typing_extensions import Literal - +from aws_lambda_powertools.shared.types import Literal from aws_lambda_powertools.utilities.data_classes.common import DictWrapper diff --git a/aws_lambda_powertools/utilities/parameters/ssm.py b/aws_lambda_powertools/utilities/parameters/ssm.py index dec785b97a8..e27fedb5027 100644 --- a/aws_lambda_powertools/utilities/parameters/ssm.py +++ b/aws_lambda_powertools/utilities/parameters/ssm.py @@ -8,7 +8,6 @@ import boto3 from botocore.config import Config -from typing_extensions import Literal from aws_lambda_powertools.shared import constants from aws_lambda_powertools.shared.functions import ( @@ -16,6 +15,7 @@ resolve_truthy_env_var_choice, slice_dictionary, ) +from aws_lambda_powertools.shared.types import Literal from .base import DEFAULT_MAX_AGE_SECS, DEFAULT_PROVIDERS, BaseProvider, transform_value from .exceptions import GetParameterError diff --git a/aws_lambda_powertools/utilities/parameters/types.py b/aws_lambda_powertools/utilities/parameters/types.py index 6a15873c496..faa06cee89e 100644 --- a/aws_lambda_powertools/utilities/parameters/types.py +++ b/aws_lambda_powertools/utilities/parameters/types.py @@ -1,3 +1,3 @@ -from typing_extensions import Literal +from aws_lambda_powertools.shared.types import Literal TransformOptions = Literal["json", "binary", "auto", None] diff --git a/aws_lambda_powertools/utilities/parser/models/cloudwatch.py b/aws_lambda_powertools/utilities/parser/models/cloudwatch.py index 71e560276a4..d236f4652ed 100644 --- a/aws_lambda_powertools/utilities/parser/models/cloudwatch.py +++ b/aws_lambda_powertools/utilities/parser/models/cloudwatch.py @@ -3,10 +3,12 @@ import logging import zlib from datetime import datetime -from typing import List, Type, Union +from typing import Type, Union from pydantic import BaseModel, Field, validator +from aws_lambda_powertools.shared.types import List + logger = logging.getLogger(__name__) diff --git a/aws_lambda_powertools/utilities/parser/types.py b/aws_lambda_powertools/utilities/parser/types.py index d3f00646d52..5282ccee373 100644 --- a/aws_lambda_powertools/utilities/parser/types.py +++ b/aws_lambda_powertools/utilities/parser/types.py @@ -1,15 +1,10 @@ """Generics and other shared types used across parser""" -import sys from typing import Any, Dict, Type, TypeVar, Union from pydantic import BaseModel, Json -# We only need typing_extensions for python versions <3.8 -if sys.version_info >= (3, 8): - from typing import Literal -else: - from typing_extensions import Literal +from aws_lambda_powertools.shared.types import Literal Model = TypeVar("Model", bound=BaseModel) EnvelopeModel = TypeVar("EnvelopeModel") diff --git a/aws_lambda_powertools/utilities/streaming/s3_object.py b/aws_lambda_powertools/utilities/streaming/s3_object.py index 7f0ce17b4ae..f7d17f7726e 100644 --- a/aws_lambda_powertools/utilities/streaming/s3_object.py +++ b/aws_lambda_powertools/utilities/streaming/s3_object.py @@ -15,8 +15,7 @@ overload, ) -from typing_extensions import Literal - +from aws_lambda_powertools.shared.types import Literal from aws_lambda_powertools.utilities.streaming._s3_seekable_io import _S3SeekableIO from aws_lambda_powertools.utilities.streaming.transformations import ( CsvTransform, diff --git a/ruff.toml b/ruff.toml index 83910e44ebf..a0f8e4fe74f 100644 --- a/ruff.toml +++ b/ruff.toml @@ -1,46 +1,59 @@ # Enable rules. select = [ - "A", # flake8-builtins - https://beta.ruff.rs/docs/rules/#flake8-builtins-a - "B", # flake8-bugbear-b - https://beta.ruff.rs/docs/rules/#flake8-bugbear-b - "C4", # flake8-comprehensions - https://beta.ruff.rs/docs/rules/#flake8-comprehensions-c4 + "A", # flake8-builtins - https://beta.ruff.rs/docs/rules/#flake8-builtins-a + "B", # flake8-bugbear-b - https://beta.ruff.rs/docs/rules/#flake8-bugbear-b + "C4", # flake8-comprehensions - https://beta.ruff.rs/docs/rules/#flake8-comprehensions-c4 "C90", # mccabe - https://beta.ruff.rs/docs/rules/#mccabe-c90 "COM", # flak8-commas - https://beta.ruff.rs/docs/rules/#flake8-commas-com #"D", # pydocstyle - not enabled temporarily - "E", # pycodestyle error - https://beta.ruff.rs/docs/rules/#error-e + "E", # pycodestyle error - https://beta.ruff.rs/docs/rules/#error-e "ERA", # flake8-eradicate - https://beta.ruff.rs/docs/rules/#eradicate-era - "FA", # flake8-future-annotations - https://beta.ruff.rs/docs/rules/#flake8-future-annotations-fa + "FA", # flake8-future-annotations - https://beta.ruff.rs/docs/rules/#flake8-future-annotations-fa "FIX", # flake8-fixme - https://beta.ruff.rs/docs/rules/#flake8-fixme-fix - "F", # pyflakes - https://beta.ruff.rs/docs/rules/#pyflakes-f - "I", # isort - https://beta.ruff.rs/docs/rules/#isort-i + "F", # pyflakes - https://beta.ruff.rs/docs/rules/#pyflakes-f + "I", # isort - https://beta.ruff.rs/docs/rules/#isort-i "ICN", # flake8-import-conventions - https://beta.ruff.rs/docs/rules/#flake8-import-conventions-icn "ISC", # flake8-implicit-str-concat - https://beta.ruff.rs/docs/rules/#flake8-implicit-str-concat-isc "PLE", # pylint error - https://beta.ruff.rs/docs/rules/#error-ple "PLC", # pylint convention - https://beta.ruff.rs/docs/rules/#convention-plc "PLR", # pylint refactoring - https://beta.ruff.rs/docs/rules/#refactor-plr "PLW", # pylint warning - https://beta.ruff.rs/docs/rules/#warning-plw - "PL", # pylint - https://beta.ruff.rs/docs/rules/#pylint-pl + "PL", # pylint - https://beta.ruff.rs/docs/rules/#pylint-pl "PYI", # flake8-pyi - https://beta.ruff.rs/docs/rules/#flake8-pyi-pyi - "Q", # flake8-quotes - https://beta.ruff.rs/docs/rules/#flake8-quotes-q + "Q", # flake8-quotes - https://beta.ruff.rs/docs/rules/#flake8-quotes-q "PTH", # flake8-use-pathlib - https://beta.ruff.rs/docs/rules/#flake8-use-pathlib-pth "T10", # flake8-debugger https://beta.ruff.rs/docs/rules/#flake8-debugger-t10 - "TD", # flake8-todo - https://beta.ruff.rs/docs/rules/#flake8-todos-td - "W" # pycodestyle warning - https://beta.ruff.rs/docs/rules/#warning-w + "TD", # flake8-todo - https://beta.ruff.rs/docs/rules/#flake8-todos-td + "W", # pycodestyle warning - https://beta.ruff.rs/docs/rules/#warning-w ] # Ignore specific rules ignore = [ - "W291", # https://beta.ruff.rs/docs/rules/trailing-whitespace/ + "W291", # https://beta.ruff.rs/docs/rules/trailing-whitespace/ "PLR0913", # https://beta.ruff.rs/docs/rules/too-many-arguments/ "PLR2004", #https://beta.ruff.rs/docs/rules/magic-value-comparison/ "PLW0603", #https://beta.ruff.rs/docs/rules/global-statement/ - "B904", # raise-without-from-inside-except - disabled temporarily + "B904", # raise-without-from-inside-except - disabled temporarily "PLC1901", # Compare-to-empty-string - disabled temporarily "PYI024", - "FA100" # Enable this rule when drop support to Python 3.7 - ] + "FA100", # Enable this rule when drop support to Python 3.7 +] # Exclude files and directories -exclude = ["docs", ".eggs", "setup.py", "example", ".aws-sam", ".git", "dist", ".md", ".yaml", "example/samconfig.toml", ".txt", ".ini"] +exclude = [ + "docs", + ".eggs", + "setup.py", + "example", + ".aws-sam", + ".git", + "dist", + ".md", + ".yaml", + "example/samconfig.toml", + ".txt", + ".ini", +] # Maximum line length line-length = 120 @@ -50,7 +63,10 @@ fix = true fixable = ["I", "COM812", "W"] # See: https://github.com/astral-sh/ruff/issues/128 -typing-modules = ["aws_lambda_powertools.utilities.parser.types"] +typing-modules = [ + "aws_lambda_powertools.utilities.parser.types", + "aws_lambda_powertools.shared.types", +] [mccabe] # Maximum cyclomatic complexity