From d5580f16b83339a91e63b389aa76360626b0532d Mon Sep 17 00:00:00 2001 From: Nate Prewitt Date: Tue, 12 Aug 2025 15:04:02 -0600 Subject: [PATCH] Refactor core identity components to prevent circular imports --- .../src/smithy_aws_core/identity/__init__.py | 66 ++++++------------- .../src/smithy_aws_core/identity/chain.py | 8 ++- .../smithy_aws_core/identity/components.py | 48 ++++++++++++++ .../src/smithy_aws_core/identity/container.py | 5 +- .../smithy_aws_core/identity/environment.py | 2 +- .../src/smithy_aws_core/identity/imds.py | 2 +- .../src/smithy_aws_core/identity/static.py | 2 +- 7 files changed, 80 insertions(+), 53 deletions(-) create mode 100644 packages/smithy-aws-core/src/smithy_aws_core/identity/components.py diff --git a/packages/smithy-aws-core/src/smithy_aws_core/identity/__init__.py b/packages/smithy-aws-core/src/smithy_aws_core/identity/__init__.py index 94f6689a9..61fa5cc52 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/identity/__init__.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/identity/__init__.py @@ -1,52 +1,26 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -from dataclasses import dataclass -from datetime import datetime -from typing import Protocol, TypedDict - -from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.interfaces.identity import Identity from smithy_core.types import PropertyKey - -@dataclass(kw_only=True) -class AWSCredentialsIdentity(Identity): - access_key_id: str - """A unique identifier for an AWS user or role.""" - - secret_access_key: str - """A secret key used in conjunction with the access key ID to authenticate - programmatic access to AWS services.""" - - session_token: str | None = None - """A temporary token used to specify the current session for the supplied - credentials.""" - - expiration: datetime | None = None - """The expiration time of the identity. - - If time zone is provided, it is updated to UTC. The value must always be in UTC. - """ - - account_id: str | None = None - """The AWS account's ID.""" - - -class AWSIdentityProperties(TypedDict, total=False): - access_key_id: str | None - secret_access_key: str | None - session_token: str | None - - -type AWSCredentialsResolver = IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties -] - - -class AWSIdentityConfig(Protocol): - aws_access_key_id: str | None - aws_secret_access_key: str | None - aws_session_token: str | None = None - +from .components import ( + AWSCredentialsIdentity, + AWSCredentialsResolver, + AWSIdentityConfig, + AWSIdentityProperties, +) +from .container import ContainerCredentialResolver +from .environment import EnvironmentCredentialsResolver +from .imds import IMDSCredentialsResolver +from .static import StaticCredentialsResolver + +__all__ = ( + "AWSCredentialsIdentity", + "AWSCredentialsResolver", + "AWSIdentityProperties", + "ContainerCredentialResolver", + "EnvironmentCredentialsResolver", + "IMDSCredentialsResolver", + "StaticCredentialsResolver", +) AWS_IDENTITY_CONFIG = PropertyKey(key="config", value_type=AWSIdentityConfig) diff --git a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain.py b/packages/smithy-aws-core/src/smithy_aws_core/identity/chain.py index 6241f6ce7..68a70eda6 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/identity/chain.py @@ -3,9 +3,11 @@ from smithy_core.aio.identity import ChainedIdentityResolver from smithy_http.aio.interfaces import HTTPClient -from smithy_aws_core.identity import AWSCredentialsIdentity - -from . import AWSCredentialsResolver, AWSIdentityProperties +from .components import ( + AWSCredentialsIdentity, + AWSCredentialsResolver, + AWSIdentityProperties, +) from .environment import EnvironmentCredentialsResolver from .imds import IMDSCredentialsResolver from .static import StaticCredentialsResolver diff --git a/packages/smithy-aws-core/src/smithy_aws_core/identity/components.py b/packages/smithy-aws-core/src/smithy_aws_core/identity/components.py new file mode 100644 index 000000000..272875e32 --- /dev/null +++ b/packages/smithy-aws-core/src/smithy_aws_core/identity/components.py @@ -0,0 +1,48 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +from dataclasses import dataclass +from datetime import datetime +from typing import Protocol, TypedDict + +from smithy_core.aio.interfaces.identity import IdentityResolver +from smithy_core.interfaces.identity import Identity + + +@dataclass(kw_only=True) +class AWSCredentialsIdentity(Identity): + access_key_id: str + """A unique identifier for an AWS user or role.""" + + secret_access_key: str + """A secret key used in conjunction with the access key ID to authenticate + programmatic access to AWS services.""" + + session_token: str | None = None + """A temporary token used to specify the current session for the supplied + credentials.""" + + expiration: datetime | None = None + """The expiration time of the identity. + + If time zone is provided, it is updated to UTC. The value must always be in UTC. + """ + + account_id: str | None = None + """The AWS account's ID.""" + + +class AWSIdentityProperties(TypedDict, total=False): + access_key_id: str | None + secret_access_key: str | None + session_token: str | None + + +type AWSCredentialsResolver = IdentityResolver[ + AWSCredentialsIdentity, AWSIdentityProperties +] + + +class AWSIdentityConfig(Protocol): + aws_access_key_id: str | None + aws_secret_access_key: str | None + aws_session_token: str | None = None diff --git a/packages/smithy-aws-core/src/smithy_aws_core/identity/container.py b/packages/smithy-aws-core/src/smithy_aws_core/identity/container.py index a8725317f..6323fe09e 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/identity/container.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/identity/container.py @@ -15,7 +15,10 @@ from smithy_http.aio import HTTPRequest from smithy_http.aio.interfaces import HTTPClient, HTTPResponse -from smithy_aws_core.identity import AWSCredentialsIdentity, AWSIdentityProperties +from smithy_aws_core.identity.components import ( + AWSCredentialsIdentity, + AWSIdentityProperties, +) _CONTAINER_METADATA_IP = "169.254.170.2" _CONTAINER_METADATA_ALLOWED_HOSTS = { diff --git a/packages/smithy-aws-core/src/smithy_aws_core/identity/environment.py b/packages/smithy-aws-core/src/smithy_aws_core/identity/environment.py index 7a9436c73..6db7c72a3 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/identity/environment.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/identity/environment.py @@ -5,7 +5,7 @@ from smithy_core.aio.interfaces.identity import IdentityResolver from smithy_core.exceptions import SmithyIdentityError -from . import AWSCredentialsIdentity, AWSIdentityProperties +from .components import AWSCredentialsIdentity, AWSIdentityProperties class EnvironmentCredentialsResolver( diff --git a/packages/smithy-aws-core/src/smithy_aws_core/identity/imds.py b/packages/smithy-aws-core/src/smithy_aws_core/identity/imds.py index 6365656ad..c2b266e90 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/identity/imds.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/identity/imds.py @@ -17,7 +17,7 @@ from smithy_http.aio.interfaces import HTTPClient from .. import __version__ -from ..identity import AWSCredentialsIdentity, AWSIdentityProperties +from .components import AWSCredentialsIdentity, AWSIdentityProperties _USER_AGENT_FIELD = Field( name="User-Agent", diff --git a/packages/smithy-aws-core/src/smithy_aws_core/identity/static.py b/packages/smithy-aws-core/src/smithy_aws_core/identity/static.py index 988c95be9..39f00821c 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/identity/static.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/identity/static.py @@ -3,7 +3,7 @@ from smithy_core.aio.interfaces.identity import IdentityResolver from smithy_core.exceptions import SmithyIdentityError -from smithy_aws_core.identity import AWSCredentialsIdentity, AWSIdentityProperties +from .components import AWSCredentialsIdentity, AWSIdentityProperties class StaticCredentialsResolver(