diff --git a/codegen-output/aws-json-1-0/src/awsjson10/client.py b/codegen-output/aws-json-1-0/src/awsjson10/client.py index 82ca65f44..18ffda0bf 100644 --- a/codegen-output/aws-json-1-0/src/awsjson10/client.py +++ b/codegen-output/aws-json-1-0/src/awsjson10/client.py @@ -6,15 +6,15 @@ import logging from typing import Any, cast +from smithy_aws_core.aio.identity.chain import AsyncIdentityChain from smithy_aws_core.config import ConfigSource from smithy_aws_core.identity import AWSCredentialsIdentity -from smithy_aws_core.identity.chain import IdentityChain -from smithy_core.aio.client import AsyncClient, ClientCall, RequestPipeline +from smithy_core.aio.client import AsyncClient, AsyncClientCall, AsyncRequestPipeline from smithy_core.deserializers import DeserializeableShape from smithy_core.exceptions import ExpectationNotMetError from smithy_core.schemas import APIOperation from smithy_core.serializers import SerializeableShape -from smithy_http.aio.interfaces import HTTPClient +from smithy_http.aio.interfaces import AsyncHTTPClient from smithy_http.plugins import user_agent_plugin from .config import AsyncJSONRPC10Config, Plugin @@ -141,12 +141,12 @@ async def _post_setup(self, config: AsyncJSONRPC10Config) -> None: config_file = await config_context.parsed_profiles() if config_context.profile_source is ConfigSource.OVERRIDE: profile_name = config_context.profile_name - config.aws_credentials_identity_resolver = await IdentityChain.create( + config.aws_credentials_identity_resolver = await AsyncIdentityChain.create( AWSCredentialsIdentity, config_file=config_file, profile_name=profile_name, region_override=config.region, - http_client=cast(HTTPClient | None, config.transport), + http_client=cast(AsyncHTTPClient | None, config.transport), ) async def _prepare_call[I: SerializeableShape, O: DeserializeableShape]( @@ -155,7 +155,7 @@ async def _prepare_call[I: SerializeableShape, O: DeserializeableShape]( operation: APIOperation[I, O], default_plugins: list[Plugin], plugins: list[Plugin] | None, - ) -> tuple[RequestPipeline[Any, Any], ClientCall[I, O]]: + ) -> tuple[AsyncRequestPipeline[Any, Any], AsyncClientCall[I, O]]: if self._closed: raise RuntimeError( "Cannot invoke an operation on a client that has been closed." diff --git a/codegen-output/aws-json-1-0/src/awsjson10/config.py b/codegen-output/aws-json-1-0/src/awsjson10/config.py index 00a483f1b..7f3fb48d6 100644 --- a/codegen-output/aws-json-1-0/src/awsjson10/config.py +++ b/codegen-output/aws-json-1-0/src/awsjson10/config.py @@ -12,24 +12,20 @@ Unpack, ) -from smithy_aws_core.aio.protocols import AwsJson10ClientProtocol -from smithy_aws_core.auth import SigV4AuthScheme -from smithy_aws_core.config import AwsConfigOverrides, FileSystem -from smithy_aws_core.config.aws_config import AsyncAwsConfig -from smithy_aws_core.config.resolvers import EndpointUriResolver -from smithy_aws_core.config.types import FieldSpec -from smithy_aws_core.endpoints.standard_regional import ( - StandardRegionalEndpointsResolver, +from smithy_aws_core.aio.auth.sigv4 import AsyncSigV4AuthScheme +from smithy_aws_core.aio.config import AsyncFileSystem +from smithy_aws_core.aio.config.aws_config import AsyncAwsConfig, AwsConfigOverrides +from smithy_aws_core.aio.config.resolvers import EndpointUriResolver +from smithy_aws_core.aio.endpoints.standard_regional import ( + AsyncStandardRegionalEndpointsResolver, ) +from smithy_aws_core.aio.protocols import AsyncAwsJson10ClientProtocol +from smithy_aws_core.config.types import FieldSpec from smithy_aws_core.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ( - ClientProtocol, - EndpointResolver, - ProtocolConstructor, - ProtocolSettings, -) -from smithy_core.aio.interfaces.auth import AuthScheme -from smithy_core.aio.interfaces.identity import IdentityResolver +from smithy_core.aio.interfaces import AsyncClientProtocol, AsyncEndpointResolver +from smithy_core.aio.interfaces.auth import AsyncAuthScheme +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver +from smithy_core.interfaces import ProtocolConstructor, ProtocolSettings from smithy_core.interfaces.auth import AuthSchemeResolver from smithy_core.shapes import ShapeID from smithy_http.aio.aiohttp import AIOHTTPClient @@ -132,11 +128,13 @@ class _AsyncJSONRPC10ConfigOverrides(AwsConfigOverrides, total=False): - endpoint_resolver: EndpointResolver | None + endpoint_resolver: AsyncEndpointResolver | None protocol: ( - ClientProtocol[Any, Any] | ProtocolConstructor[ClientProtocol[Any, Any]] | None + AsyncClientProtocol[Any, Any] + | ProtocolConstructor[AsyncClientProtocol[Any, Any]] + | None ) - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] | None auth_scheme_resolver: AuthSchemeResolver | None @@ -144,17 +142,17 @@ class _AsyncJSONRPC10ConfigOverrides(AwsConfigOverrides, total=False): class AsyncJSONRPC10Config(AsyncAwsConfig): """JSON RPC 10 configuration (async-resolved).""" - endpoint_resolver: EndpointResolver | None = None + endpoint_resolver: AsyncEndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - protocol: ClientProtocol[Any, Any] | None = None + protocol: AsyncClientProtocol[Any, Any] | None = None """ Pass a protocol class reference from smithy_aws_core.aio.protocols to - select the protocol, e.g. protocol=AwsJson10ClientProtocol. For custom - protocols a protocol instance may also be passed. + select the protocol, e.g. protocol=AsyncAwsJson10ClientProtocol. For + custom protocols a protocol instance may also be passed. """ interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) @@ -163,7 +161,7 @@ class AsyncJSONRPC10Config(AsyncAwsConfig): execution of a request. """ - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] | None = None """A map of auth scheme ids to auth schemes.""" auth_scheme_resolver: AuthSchemeResolver | None = None @@ -173,7 +171,7 @@ class AsyncJSONRPC10Config(AsyncAwsConfig): """ aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None ) = None """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" @@ -214,24 +212,24 @@ class AsyncJSONRPC10Config(AsyncAwsConfig): default=None, resolver=EndpointUriResolver("json_rpc_10") ), "endpoint_resolver": FieldSpec( - default_factory=lambda: StandardRegionalEndpointsResolver( + default_factory=lambda: AsyncStandardRegionalEndpointsResolver( endpoint_prefix="jsonrpc10" ) ), "protocol": FieldSpec( - default_factory=lambda: AwsJson10ClientProtocol(_PROTOCOL_SETTINGS), + default_factory=lambda: AsyncAwsJson10ClientProtocol(_PROTOCOL_SETTINGS), converter=lambda p: p(_PROTOCOL_SETTINGS) if isinstance(p, type) else p, ), "auth_schemes": FieldSpec( default_factory=lambda: { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="jsonrpc10") + ShapeID("aws.auth#sigv4"): AsyncSigV4AuthScheme(service="jsonrpc10") } ), "auth_scheme_resolver": FieldSpec(default_factory=HTTPAuthSchemeResolver), "transport": FieldSpec(default_factory=lambda: AIOHTTPClient()), } - def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None: + def set_auth_scheme(self, scheme: AsyncAuthScheme[Any, Any, Any, Any]) -> None: """ Set an auth scheme implementation using its scheme ID. :param scheme: The auth scheme to add or replace. @@ -245,7 +243,7 @@ async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] cls, *, profile: str | None = None, - fs: FileSystem | None = None, + fs: AsyncFileSystem | None = None, config_file_path: str | None = None, credentials_file_path: str | None = None, **overrides: Unpack[_AsyncJSONRPC10ConfigOverrides], diff --git a/codegen-output/aws-json-1-0/tests/test_awsjson10_protocol.py b/codegen-output/aws-json-1-0/tests/test_awsjson10_protocol.py index 6a4c1103a..9a8b473c8 100644 --- a/codegen-output/aws-json-1-0/tests/test_awsjson10_protocol.py +++ b/codegen-output/aws-json-1-0/tests/test_awsjson10_protocol.py @@ -5,8 +5,8 @@ from urllib.parse import parse_qsl from pytest import fail, mark, raises -from smithy_aws_core.identity import StaticCredentialsResolver -from smithy_core.aio.retries import SimpleRetryStrategy +from smithy_aws_core.aio.identity.static import AsyncStaticCredentialsResolver +from smithy_core.aio.retries import AsyncSimpleRetryStrategy from smithy_core.aio.types import AsyncBytesReader from smithy_core.aio.utils import async_list from smithy_core.documents import Document @@ -74,11 +74,11 @@ async def test_aws_json10_empty_input_and_empty_output_request_empty_input_and_e config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -161,7 +161,7 @@ async def test_aws_json10_empty_input_and_empty_output_send_json_object_response region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -187,11 +187,11 @@ async def test_aws_json10_endpoint_trait_request_endpoint_operation() -> None: config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -264,11 +264,11 @@ async def test_aws_json10_endpoint_trait_with_host_label_request_endpoint_with_h config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -343,7 +343,7 @@ async def test_aws_json10_invalid_greeting_error_error_greeting_with_errors() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -372,7 +372,7 @@ async def test_aws_json10_complex_error_error_greeting_with_errors() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -401,7 +401,7 @@ async def test_aws_json10_empty_complex_error_error_greeting_with_errors() -> No region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -433,7 +433,7 @@ async def test_aws_json10_foo_error_using_x_amzn_error_type_error_greeting_with_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -475,7 +475,7 @@ async def test_aws_json10_foo_error_using_x_amzn_error_type_with_uri_error_greet region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -515,7 +515,7 @@ async def test_aws_json10_foo_error_using_x_amzn_error_type_with_uri_and_namespa region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -550,7 +550,7 @@ async def test_aws_json10_foo_error_using_code_error_greeting_with_errors() -> N region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -585,7 +585,7 @@ async def test_aws_json10_foo_error_using_code_and_namespace_error_greeting_with region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -621,7 +621,7 @@ async def test_aws_json10_foo_error_using_code_uri_and_namespace_error_greeting_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -652,7 +652,7 @@ async def test_aws_json10_foo_error_with_dunder_type_error_greeting_with_errors( region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -687,7 +687,7 @@ async def test_aws_json10_foo_error_with_dunder_type_and_namespace_error_greetin region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -721,7 +721,7 @@ async def test_aws_json10_foo_error_with_dunder_type_and_different_namespace_err region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -757,7 +757,7 @@ async def test_aws_json10_foo_error_with_dunder_type_uri_and_namespace_error_gre region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -794,7 +794,7 @@ async def test_aws_json10_foo_error_with_nested_type_property_error_greeting_wit region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -816,11 +816,11 @@ async def test_aws_json10_host_with_path_request_host_with_path_operation() -> N config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/custom", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -886,11 +886,11 @@ async def test_aws_json10_serialize_string_union_value_request_json_unions() -> config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -963,11 +963,11 @@ async def test_aws_json10_serialize_boolean_union_value_request_json_unions() -> config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1040,11 +1040,11 @@ async def test_aws_json10_serialize_number_union_value_request_json_unions() -> config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1117,11 +1117,11 @@ async def test_aws_json10_serialize_blob_union_value_request_json_unions() -> No config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1194,11 +1194,11 @@ async def test_aws_json10_serialize_timestamp_union_value_request_json_unions() config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1275,11 +1275,11 @@ async def test_aws_json10_serialize_enum_union_value_request_json_unions() -> No config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1352,11 +1352,11 @@ async def test_aws_json10_serialize_int_enum_union_value_request_json_unions() - config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1429,11 +1429,11 @@ async def test_aws_json10_serialize_list_union_value_request_json_unions() -> No config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1506,11 +1506,11 @@ async def test_aws_json10_serialize_map_union_value_request_json_unions() -> Non config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1583,11 +1583,11 @@ async def test_aws_json10_serialize_structure_union_value_request_json_unions() config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1667,7 +1667,7 @@ async def test_aws_json10_deserialize_string_union_value_response_json_unions() region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1698,7 +1698,7 @@ async def test_aws_json10_deserialize_boolean_union_value_response_json_unions() region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1727,7 +1727,7 @@ async def test_aws_json10_deserialize_number_union_value_response_json_unions() region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1756,7 +1756,7 @@ async def test_aws_json10_deserialize_blob_union_value_response_json_unions() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1787,7 +1787,7 @@ async def test_aws_json10_deserialize_timestamp_union_value_response_json_unions region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1820,7 +1820,7 @@ async def test_aws_json10_deserialize_enum_union_value_response_json_unions() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1851,7 +1851,7 @@ async def test_aws_json10_deserialize_int_enum_union_value_response_json_unions( region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1880,7 +1880,7 @@ async def test_aws_json10_deserialize_list_union_value_response_json_unions() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1909,7 +1909,7 @@ async def test_aws_json10_deserialize_map_union_value_response_json_unions() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1942,7 +1942,7 @@ async def test_aws_json10_deserialize_structure_union_value_response_json_unions region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1973,7 +1973,7 @@ async def test_aws_json10_deserialize_ignore_type_response_json_unions() -> None region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2004,7 +2004,7 @@ async def test_aws_json10_deserialize_allow_nulls_response_json_unions() -> None region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2036,11 +2036,11 @@ async def test_aws_json10_must_always_send_empty_json_payload_request_no_input_a config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2125,7 +2125,7 @@ async def test_aws_json10_handles_empty_output_shape_response_no_input_and_no_ou region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2160,7 +2160,7 @@ async def test_aws_json10_handles_unexpected_json_output_response_no_input_and_n region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2197,7 +2197,7 @@ async def test_aws_json10_service_responds_with_no_payload_response_no_input_and region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2219,11 +2219,11 @@ async def test_aws_json10_no_input_and_output_request_no_input_and_output() -> N config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2301,7 +2301,7 @@ async def test_aws_json10_no_input_and_output_response_no_input_and_output() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2326,11 +2326,11 @@ async def test_aws_json10_client_populates_default_values_in_input_request_opera config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2403,11 +2403,11 @@ async def test_aws_json10_client_skips_top_level_default_values_in_input_request config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2480,11 +2480,11 @@ async def test_aws_json10_client_uses_explicitly_provided_member_values_over_def config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2590,11 +2590,11 @@ async def test_aws_json10_client_uses_explicitly_provided_values_in_top_level_re config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2674,11 +2674,11 @@ async def test_aws_json10_client_ignores_non_top_level_defaults_on_members_with_ config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2759,7 +2759,7 @@ async def test_aws_json10_client_populates_defaults_values_when_missing_in_respo region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2821,7 +2821,7 @@ async def test_aws_json10_client_ignores_default_values_if_member_values_are_pre region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2874,11 +2874,11 @@ async def test_aws_json10_client_populates_nested_default_values_when_missing_re config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2977,7 +2977,7 @@ async def test_aws_json10_client_populates_nested_defaults_when_missing_in_respo region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3028,7 +3028,7 @@ async def test_aws_json10_client_error_corrects_when_server_fails_to_serialize_r region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3075,7 +3075,7 @@ async def test_aws_json10_client_error_corrects_with_default_values_when_server_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3118,11 +3118,11 @@ async def test_sdk_applied_content_encoding_aws_json1_0_request_put_with_content config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3194,11 +3194,11 @@ async def test_sdk_appends_gzip_and_ignores_http_provided_encoding_aws_json1_0_r config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3265,11 +3265,11 @@ async def test_non_query_compatible_aws_json10_forbids_query_mode_header_request config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3342,11 +3342,11 @@ async def test_aws_json10_supports_na_n_float_inputs_request_simple_scalar_prope config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3423,11 +3423,11 @@ async def test_aws_json10_supports_infinity_float_inputs_request_simple_scalar_p config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3504,11 +3504,11 @@ async def test_aws_json10_supports_negative_infinity_float_inputs_request_simple config=await AsyncJSONRPC10Config.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3592,7 +3592,7 @@ async def test_aws_json10_supports_na_n_float_inputs_response_simple_scalar_prop region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3625,7 +3625,7 @@ async def test_aws_json10_supports_infinity_float_inputs_response_simple_scalar_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3658,7 +3658,7 @@ async def test_aws_json10_supports_negative_infinity_float_inputs_response_simpl region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) diff --git a/codegen-output/aws-json-1-1/src/awsjson11/client.py b/codegen-output/aws-json-1-1/src/awsjson11/client.py index e81bca09d..2ae88bfe9 100644 --- a/codegen-output/aws-json-1-1/src/awsjson11/client.py +++ b/codegen-output/aws-json-1-1/src/awsjson11/client.py @@ -6,15 +6,15 @@ import logging from typing import Any, cast +from smithy_aws_core.aio.identity.chain import AsyncIdentityChain from smithy_aws_core.config import ConfigSource from smithy_aws_core.identity import AWSCredentialsIdentity -from smithy_aws_core.identity.chain import IdentityChain -from smithy_core.aio.client import AsyncClient, ClientCall, RequestPipeline +from smithy_core.aio.client import AsyncClient, AsyncClientCall, AsyncRequestPipeline from smithy_core.deserializers import DeserializeableShape from smithy_core.exceptions import ExpectationNotMetError from smithy_core.schemas import APIOperation from smithy_core.serializers import SerializeableShape -from smithy_http.aio.interfaces import HTTPClient +from smithy_http.aio.interfaces import AsyncHTTPClient from smithy_http.plugins import user_agent_plugin from .config import AsyncJsonProtocolConfig, Plugin @@ -147,12 +147,12 @@ async def _post_setup(self, config: AsyncJsonProtocolConfig) -> None: config_file = await config_context.parsed_profiles() if config_context.profile_source is ConfigSource.OVERRIDE: profile_name = config_context.profile_name - config.aws_credentials_identity_resolver = await IdentityChain.create( + config.aws_credentials_identity_resolver = await AsyncIdentityChain.create( AWSCredentialsIdentity, config_file=config_file, profile_name=profile_name, region_override=config.region, - http_client=cast(HTTPClient | None, config.transport), + http_client=cast(AsyncHTTPClient | None, config.transport), ) async def _prepare_call[I: SerializeableShape, O: DeserializeableShape]( @@ -161,7 +161,7 @@ async def _prepare_call[I: SerializeableShape, O: DeserializeableShape]( operation: APIOperation[I, O], default_plugins: list[Plugin], plugins: list[Plugin] | None, - ) -> tuple[RequestPipeline[Any, Any], ClientCall[I, O]]: + ) -> tuple[AsyncRequestPipeline[Any, Any], AsyncClientCall[I, O]]: if self._closed: raise RuntimeError( "Cannot invoke an operation on a client that has been closed." diff --git a/codegen-output/aws-json-1-1/src/awsjson11/config.py b/codegen-output/aws-json-1-1/src/awsjson11/config.py index 28a03ab97..6c7352e1c 100644 --- a/codegen-output/aws-json-1-1/src/awsjson11/config.py +++ b/codegen-output/aws-json-1-1/src/awsjson11/config.py @@ -12,24 +12,20 @@ Unpack, ) -from smithy_aws_core.aio.protocols import AwsJson11ClientProtocol -from smithy_aws_core.auth import SigV4AuthScheme -from smithy_aws_core.config import AwsConfigOverrides, FileSystem -from smithy_aws_core.config.aws_config import AsyncAwsConfig -from smithy_aws_core.config.resolvers import EndpointUriResolver -from smithy_aws_core.config.types import FieldSpec -from smithy_aws_core.endpoints.standard_regional import ( - StandardRegionalEndpointsResolver, +from smithy_aws_core.aio.auth.sigv4 import AsyncSigV4AuthScheme +from smithy_aws_core.aio.config import AsyncFileSystem +from smithy_aws_core.aio.config.aws_config import AsyncAwsConfig, AwsConfigOverrides +from smithy_aws_core.aio.config.resolvers import EndpointUriResolver +from smithy_aws_core.aio.endpoints.standard_regional import ( + AsyncStandardRegionalEndpointsResolver, ) +from smithy_aws_core.aio.protocols import AsyncAwsJson11ClientProtocol +from smithy_aws_core.config.types import FieldSpec from smithy_aws_core.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ( - ClientProtocol, - EndpointResolver, - ProtocolConstructor, - ProtocolSettings, -) -from smithy_core.aio.interfaces.auth import AuthScheme -from smithy_core.aio.interfaces.identity import IdentityResolver +from smithy_core.aio.interfaces import AsyncClientProtocol, AsyncEndpointResolver +from smithy_core.aio.interfaces.auth import AsyncAuthScheme +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver +from smithy_core.interfaces import ProtocolConstructor, ProtocolSettings from smithy_core.interfaces.auth import AuthSchemeResolver from smithy_core.shapes import ShapeID from smithy_http.aio.aiohttp import AIOHTTPClient @@ -126,11 +122,13 @@ class _AsyncJsonProtocolConfigOverrides(AwsConfigOverrides, total=False): - endpoint_resolver: EndpointResolver | None + endpoint_resolver: AsyncEndpointResolver | None protocol: ( - ClientProtocol[Any, Any] | ProtocolConstructor[ClientProtocol[Any, Any]] | None + AsyncClientProtocol[Any, Any] + | ProtocolConstructor[AsyncClientProtocol[Any, Any]] + | None ) - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] | None auth_scheme_resolver: AuthSchemeResolver | None @@ -138,17 +136,17 @@ class _AsyncJsonProtocolConfigOverrides(AwsConfigOverrides, total=False): class AsyncJsonProtocolConfig(AsyncAwsConfig): """Json Protocol configuration (async-resolved).""" - endpoint_resolver: EndpointResolver | None = None + endpoint_resolver: AsyncEndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - protocol: ClientProtocol[Any, Any] | None = None + protocol: AsyncClientProtocol[Any, Any] | None = None """ Pass a protocol class reference from smithy_aws_core.aio.protocols to - select the protocol, e.g. protocol=AwsJson10ClientProtocol. For custom - protocols a protocol instance may also be passed. + select the protocol, e.g. protocol=AsyncAwsJson10ClientProtocol. For + custom protocols a protocol instance may also be passed. """ interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) @@ -157,7 +155,7 @@ class AsyncJsonProtocolConfig(AsyncAwsConfig): execution of a request. """ - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] | None = None """A map of auth scheme ids to auth schemes.""" auth_scheme_resolver: AuthSchemeResolver | None = None @@ -167,7 +165,7 @@ class AsyncJsonProtocolConfig(AsyncAwsConfig): """ aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None ) = None """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" @@ -208,24 +206,24 @@ class AsyncJsonProtocolConfig(AsyncAwsConfig): default=None, resolver=EndpointUriResolver("json_protocol") ), "endpoint_resolver": FieldSpec( - default_factory=lambda: StandardRegionalEndpointsResolver( + default_factory=lambda: AsyncStandardRegionalEndpointsResolver( endpoint_prefix="jsonprotocol" ) ), "protocol": FieldSpec( - default_factory=lambda: AwsJson11ClientProtocol(_PROTOCOL_SETTINGS), + default_factory=lambda: AsyncAwsJson11ClientProtocol(_PROTOCOL_SETTINGS), converter=lambda p: p(_PROTOCOL_SETTINGS) if isinstance(p, type) else p, ), "auth_schemes": FieldSpec( default_factory=lambda: { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="jsonprotocol") + ShapeID("aws.auth#sigv4"): AsyncSigV4AuthScheme(service="jsonprotocol") } ), "auth_scheme_resolver": FieldSpec(default_factory=HTTPAuthSchemeResolver), "transport": FieldSpec(default_factory=lambda: AIOHTTPClient()), } - def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None: + def set_auth_scheme(self, scheme: AsyncAuthScheme[Any, Any, Any, Any]) -> None: """ Set an auth scheme implementation using its scheme ID. :param scheme: The auth scheme to add or replace. @@ -239,7 +237,7 @@ async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] cls, *, profile: str | None = None, - fs: FileSystem | None = None, + fs: AsyncFileSystem | None = None, config_file_path: str | None = None, credentials_file_path: str | None = None, **overrides: Unpack[_AsyncJsonProtocolConfigOverrides], diff --git a/codegen-output/aws-json-1-1/tests/test_awsjson11_protocol.py b/codegen-output/aws-json-1-1/tests/test_awsjson11_protocol.py index c544df3fa..a4c7ba4a6 100644 --- a/codegen-output/aws-json-1-1/tests/test_awsjson11_protocol.py +++ b/codegen-output/aws-json-1-1/tests/test_awsjson11_protocol.py @@ -5,8 +5,8 @@ from urllib.parse import parse_qsl from pytest import fail, mark, raises -from smithy_aws_core.identity import StaticCredentialsResolver -from smithy_core.aio.retries import SimpleRetryStrategy +from smithy_aws_core.aio.identity.static import AsyncStaticCredentialsResolver +from smithy_core.aio.retries import AsyncSimpleRetryStrategy from smithy_core.aio.types import AsyncBytesReader from smithy_core.aio.utils import async_list from smithy_core.documents import Document @@ -86,7 +86,7 @@ async def test_aws_json11_date_time_with_negative_offset_response_datetime_offse region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -122,7 +122,7 @@ async def test_aws_json11_date_time_with_positive_offset_response_datetime_offse region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -146,11 +146,11 @@ async def test_sends_requests_to_slash_request_empty_operation() -> None: config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -215,11 +215,11 @@ async def test_includes_x_amz_target_and_content_type_request_empty_operation() config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -292,11 +292,11 @@ async def test_json_1_1_client_sends_empty_payload_for_no_input_shape_request_em config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -379,7 +379,7 @@ async def test_handles_empty_output_shape_response_empty_operation() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -412,7 +412,7 @@ async def test_handles_unexpected_json_output_response_empty_operation() -> None region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -449,7 +449,7 @@ async def test_json_1_1_service_responds_with_no_payload_response_empty_operatio region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -475,11 +475,11 @@ async def test_aws_json11_endpoint_trait_request_endpoint_operation() -> None: config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -555,11 +555,11 @@ async def test_aws_json11_endpoint_trait_with_host_label_request_endpoint_with_h config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -642,7 +642,7 @@ async def test_aws_json11_date_time_with_fractional_seconds_response_fractional_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -673,7 +673,7 @@ async def test_aws_json11_invalid_greeting_error_error_greeting_with_errors() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -702,7 +702,7 @@ async def test_aws_json11_complex_error_error_greeting_with_errors() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -730,7 +730,7 @@ async def test_aws_json11_empty_complex_error_error_greeting_with_errors() -> No region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -762,7 +762,7 @@ async def test_aws_json11_foo_error_using_x_amzn_error_type_error_greeting_with_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -804,7 +804,7 @@ async def test_aws_json11_foo_error_using_x_amzn_error_type_with_uri_error_greet region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -844,7 +844,7 @@ async def test_aws_json11_foo_error_using_x_amzn_error_type_with_uri_and_namespa region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -879,7 +879,7 @@ async def test_aws_json11_foo_error_using_code_error_greeting_with_errors() -> N region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -914,7 +914,7 @@ async def test_aws_json11_foo_error_using_code_and_namespace_error_greeting_with region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -950,7 +950,7 @@ async def test_aws_json11_foo_error_using_code_uri_and_namespace_error_greeting_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -981,7 +981,7 @@ async def test_aws_json11_foo_error_with_dunder_type_error_greeting_with_errors( region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1016,7 +1016,7 @@ async def test_aws_json11_foo_error_with_dunder_type_and_namespace_error_greetin region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1050,7 +1050,7 @@ async def test_aws_json11_foo_error_with_dunder_type_and_different_namespace_err region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1086,7 +1086,7 @@ async def test_aws_json11_foo_error_with_dunder_type_uri_and_namespace_error_gre region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1123,7 +1123,7 @@ async def test_aws_json11_foo_error_with_nested_type_property_error_greeting_wit region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1145,11 +1145,11 @@ async def test_aws_json11_host_with_path_request_host_with_path_operation() -> N config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/custom", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1218,11 +1218,11 @@ async def test_aws_json11_enums_request_json_enums() -> None: config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1307,7 +1307,7 @@ async def test_aws_json11_enums_response_json_enums() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1336,11 +1336,11 @@ async def test_aws_json11_int_enums_request_json_int_enums() -> None: config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1428,7 +1428,7 @@ async def test_aws_json11_int_enums_response_json_int_enums() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1457,11 +1457,11 @@ async def test_aws_json11_serialize_string_union_value_request_json_unions() -> config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1534,11 +1534,11 @@ async def test_aws_json11_serialize_boolean_union_value_request_json_unions() -> config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1611,11 +1611,11 @@ async def test_aws_json11_serialize_number_union_value_request_json_unions() -> config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1688,11 +1688,11 @@ async def test_aws_json11_serialize_blob_union_value_request_json_unions() -> No config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1765,11 +1765,11 @@ async def test_aws_json11_serialize_timestamp_union_value_request_json_unions() config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1846,11 +1846,11 @@ async def test_aws_json11_serialize_enum_union_value_request_json_unions() -> No config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1923,11 +1923,11 @@ async def test_aws_json11_serialize_list_union_value_request_json_unions() -> No config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2000,11 +2000,11 @@ async def test_aws_json11_serialize_map_union_value_request_json_unions() -> Non config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2077,11 +2077,11 @@ async def test_aws_json11_serialize_structure_union_value_request_json_unions() config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2161,7 +2161,7 @@ async def test_aws_json11_deserialize_string_union_value_response_json_unions() region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2192,7 +2192,7 @@ async def test_aws_json11_deserialize_boolean_union_value_response_json_unions() region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2221,7 +2221,7 @@ async def test_aws_json11_deserialize_number_union_value_response_json_unions() region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2250,7 +2250,7 @@ async def test_aws_json11_deserialize_blob_union_value_response_json_unions() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2281,7 +2281,7 @@ async def test_aws_json11_deserialize_timestamp_union_value_response_json_unions region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2314,7 +2314,7 @@ async def test_aws_json11_deserialize_enum_union_value_response_json_unions() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2343,7 +2343,7 @@ async def test_aws_json11_deserialize_list_union_value_response_json_unions() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2372,7 +2372,7 @@ async def test_aws_json11_deserialize_map_union_value_response_json_unions() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2405,7 +2405,7 @@ async def test_aws_json11_deserialize_structure_union_value_response_json_unions region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2436,7 +2436,7 @@ async def test_aws_json11_deserialize_ignore_type_response_json_unions() -> None region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2460,11 +2460,11 @@ async def test_serializes_string_shapes_request_kitchen_sink_operation() -> None config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2537,11 +2537,11 @@ async def test_serializes_string_shapes_with_jsonvalue_trait_request_kitchen_sin config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2614,11 +2614,11 @@ async def test_serializes_integer_shapes_request_kitchen_sink_operation() -> Non config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2689,11 +2689,11 @@ async def test_serializes_long_shapes_request_kitchen_sink_operation() -> None: config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2764,11 +2764,11 @@ async def test_serializes_float_shapes_request_kitchen_sink_operation() -> None: config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2839,11 +2839,11 @@ async def test_serializes_double_shapes_request_kitchen_sink_operation() -> None config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2914,11 +2914,11 @@ async def test_serializes_blob_shapes_request_kitchen_sink_operation() -> None: config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2989,11 +2989,11 @@ async def test_serializes_boolean_shapes_true_request_kitchen_sink_operation() - config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3064,11 +3064,11 @@ async def test_serializes_boolean_shapes_false_request_kitchen_sink_operation() config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3139,11 +3139,11 @@ async def test_serializes_timestamp_shapes_request_kitchen_sink_operation() -> N config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3218,11 +3218,11 @@ async def test_serializes_timestamp_shapes_with_iso8601_timestampformat_request_ config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3297,11 +3297,11 @@ async def test_serializes_timestamp_shapes_with_httpdate_timestampformat_request config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3376,11 +3376,11 @@ async def test_serializes_timestamp_shapes_with_unixtimestamp_timestampformat_re config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3453,11 +3453,11 @@ async def test_serializes_list_shapes_request_kitchen_sink_operation() -> None: config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3528,11 +3528,11 @@ async def test_serializes_empty_list_shapes_request_kitchen_sink_operation() -> config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3603,11 +3603,11 @@ async def test_serializes_list_of_map_shapes_request_kitchen_sink_operation() -> config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3684,11 +3684,11 @@ async def test_serializes_list_of_structure_shapes_request_kitchen_sink_operatio config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3769,11 +3769,11 @@ async def test_serializes_list_of_recursive_structure_shapes_request_kitchen_sin config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3850,11 +3850,11 @@ async def test_serializes_map_shapes_request_kitchen_sink_operation() -> None: config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3925,11 +3925,11 @@ async def test_serializes_empty_map_shapes_request_kitchen_sink_operation() -> N config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4000,11 +4000,11 @@ async def test_serializes_map_of_list_shapes_request_kitchen_sink_operation() -> config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4081,11 +4081,11 @@ async def test_serializes_map_of_structure_shapes_request_kitchen_sink_operation config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4165,11 +4165,11 @@ async def test_serializes_map_of_recursive_structure_shapes_request_kitchen_sink config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4250,11 +4250,11 @@ async def test_serializes_structure_shapes_request_kitchen_sink_operation() -> N config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4327,11 +4327,11 @@ async def test_serializes_structure_members_with_locationname_traits_request_kit config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4406,11 +4406,11 @@ async def test_serializes_empty_structure_shapes_request_kitchen_sink_operation( config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4483,11 +4483,11 @@ async def test_serializes_structure_which_have_no_members_request_kitchen_sink_o config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4560,11 +4560,11 @@ async def test_serializes_recursive_structure_shapes_request_kitchen_sink_operat config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4659,7 +4659,7 @@ async def test_parses_operations_with_empty_json_bodies_response_kitchen_sink_op region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4688,7 +4688,7 @@ async def test_parses_string_shapes_response_kitchen_sink_operation() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4717,7 +4717,7 @@ async def test_parses_integer_shapes_response_kitchen_sink_operation() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4746,7 +4746,7 @@ async def test_parses_long_shapes_response_kitchen_sink_operation() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4775,7 +4775,7 @@ async def test_parses_float_shapes_response_kitchen_sink_operation() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4804,7 +4804,7 @@ async def test_parses_double_shapes_response_kitchen_sink_operation() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4833,7 +4833,7 @@ async def test_parses_boolean_shapes_true_response_kitchen_sink_operation() -> N region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4862,7 +4862,7 @@ async def test_parses_boolean_false_response_kitchen_sink_operation() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4891,7 +4891,7 @@ async def test_parses_blob_shapes_response_kitchen_sink_operation() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4920,7 +4920,7 @@ async def test_parses_timestamp_shapes_response_kitchen_sink_operation() -> None region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4951,7 +4951,7 @@ async def test_parses_iso8601_timestamps_response_kitchen_sink_operation() -> No region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4982,7 +4982,7 @@ async def test_parses_httpdate_timestamps_response_kitchen_sink_operation() -> N region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5013,7 +5013,7 @@ async def test_parses_list_shapes_response_kitchen_sink_operation() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5042,7 +5042,7 @@ async def test_parses_list_of_map_shapes_response_kitchen_sink_operation() -> No region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5073,7 +5073,7 @@ async def test_parses_list_of_list_shapes_response_kitchen_sink_operation() -> N region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5106,7 +5106,7 @@ async def test_parses_list_of_structure_shapes_response_kitchen_sink_operation() region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5142,7 +5142,7 @@ async def test_parses_list_of_recursive_structure_shapes_response_kitchen_sink_o region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5179,7 +5179,7 @@ async def test_parses_map_shapes_response_kitchen_sink_operation() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5210,7 +5210,7 @@ async def test_parses_map_of_list_shapes_response_kitchen_sink_operation() -> No region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5244,7 +5244,7 @@ async def test_parses_map_of_map_shapes_response_kitchen_sink_operation() -> Non region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5278,7 +5278,7 @@ async def test_parses_map_of_structure_shapes_response_kitchen_sink_operation() region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5314,7 +5314,7 @@ async def test_parses_map_of_recursive_structure_shapes_response_kitchen_sink_op region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5358,7 +5358,7 @@ async def test_parses_the_request_id_from_the_response_response_kitchen_sink_ope region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5382,11 +5382,11 @@ async def test_aws_json11_structures_dont_serialize_null_values_request_null_ope config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5466,7 +5466,7 @@ async def test_aws_json11_structures_dont_deserialize_null_values_response_null_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5490,11 +5490,11 @@ async def test_can_call_operation_with_no_input_or_output_request_operation_with config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5567,11 +5567,11 @@ async def test_can_call_operation_with_optional_input_request_operation_with_opt config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5644,11 +5644,11 @@ async def test_put_and_get_inline_documents_input_request_put_and_get_inline_doc config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5728,7 +5728,7 @@ async def test_put_and_get_inline_documents_input_response_put_and_get_inline_do region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5758,11 +5758,11 @@ async def test_sdk_applied_content_encoding_aws_json1_1_request_put_with_content config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5834,11 +5834,11 @@ async def test_sdk_appends_gzip_and_ignores_http_provided_encoding_aws_json1_1_r config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5905,11 +5905,11 @@ async def test_aws_json11_supports_na_n_float_inputs_request_simple_scalar_prope config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5986,11 +5986,11 @@ async def test_aws_json11_supports_infinity_float_inputs_request_simple_scalar_p config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6067,11 +6067,11 @@ async def test_aws_json11_supports_negative_infinity_float_inputs_request_simple config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6155,7 +6155,7 @@ async def test_aws_json11_supports_na_n_float_inputs_response_simple_scalar_prop region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6188,7 +6188,7 @@ async def test_aws_json11_supports_infinity_float_inputs_response_simple_scalar_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6221,7 +6221,7 @@ async def test_aws_json11_supports_negative_infinity_float_inputs_response_simpl region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6247,11 +6247,11 @@ async def test_aws_json11_sparse_maps_serialize_null_values_request_sparse_nulls config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6326,11 +6326,11 @@ async def test_aws_json11_sparse_lists_serialize_null_request_sparse_nulls_opera config=await AsyncJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6410,7 +6410,7 @@ async def test_aws_json11_sparse_maps_deserialize_null_values_response_sparse_nu region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6441,7 +6441,7 @@ async def test_aws_json11_sparse_lists_deserialize_null_response_sparse_nulls_op region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) diff --git a/codegen-output/aws-query/src/awsquery/client.py b/codegen-output/aws-query/src/awsquery/client.py index df9864036..9aecb9534 100644 --- a/codegen-output/aws-query/src/awsquery/client.py +++ b/codegen-output/aws-query/src/awsquery/client.py @@ -6,15 +6,15 @@ import logging from typing import Any, cast +from smithy_aws_core.aio.identity.chain import AsyncIdentityChain from smithy_aws_core.config import ConfigSource from smithy_aws_core.identity import AWSCredentialsIdentity -from smithy_aws_core.identity.chain import IdentityChain -from smithy_core.aio.client import AsyncClient, ClientCall, RequestPipeline +from smithy_core.aio.client import AsyncClient, AsyncClientCall, AsyncRequestPipeline from smithy_core.deserializers import DeserializeableShape from smithy_core.exceptions import ExpectationNotMetError from smithy_core.schemas import APIOperation from smithy_core.serializers import SerializeableShape -from smithy_http.aio.interfaces import HTTPClient +from smithy_http.aio.interfaces import AsyncHTTPClient from smithy_http.plugins import user_agent_plugin from .config import AsyncQueryProtocolConfig, Plugin @@ -192,12 +192,12 @@ async def _post_setup(self, config: AsyncQueryProtocolConfig) -> None: config_file = await config_context.parsed_profiles() if config_context.profile_source is ConfigSource.OVERRIDE: profile_name = config_context.profile_name - config.aws_credentials_identity_resolver = await IdentityChain.create( + config.aws_credentials_identity_resolver = await AsyncIdentityChain.create( AWSCredentialsIdentity, config_file=config_file, profile_name=profile_name, region_override=config.region, - http_client=cast(HTTPClient | None, config.transport), + http_client=cast(AsyncHTTPClient | None, config.transport), ) async def _prepare_call[I: SerializeableShape, O: DeserializeableShape]( @@ -206,7 +206,7 @@ async def _prepare_call[I: SerializeableShape, O: DeserializeableShape]( operation: APIOperation[I, O], default_plugins: list[Plugin], plugins: list[Plugin] | None, - ) -> tuple[RequestPipeline[Any, Any], ClientCall[I, O]]: + ) -> tuple[AsyncRequestPipeline[Any, Any], AsyncClientCall[I, O]]: if self._closed: raise RuntimeError( "Cannot invoke an operation on a client that has been closed." diff --git a/codegen-output/aws-query/src/awsquery/config.py b/codegen-output/aws-query/src/awsquery/config.py index 813939d49..14c3f17b7 100644 --- a/codegen-output/aws-query/src/awsquery/config.py +++ b/codegen-output/aws-query/src/awsquery/config.py @@ -12,24 +12,20 @@ Unpack, ) -from smithy_aws_core.aio.protocols import AwsQueryClientProtocol -from smithy_aws_core.auth import SigV4AuthScheme -from smithy_aws_core.config import AwsConfigOverrides, FileSystem -from smithy_aws_core.config.aws_config import AsyncAwsConfig -from smithy_aws_core.config.resolvers import EndpointUriResolver -from smithy_aws_core.config.types import FieldSpec -from smithy_aws_core.endpoints.standard_regional import ( - StandardRegionalEndpointsResolver, +from smithy_aws_core.aio.auth.sigv4 import AsyncSigV4AuthScheme +from smithy_aws_core.aio.config import AsyncFileSystem +from smithy_aws_core.aio.config.aws_config import AsyncAwsConfig, AwsConfigOverrides +from smithy_aws_core.aio.config.resolvers import EndpointUriResolver +from smithy_aws_core.aio.endpoints.standard_regional import ( + AsyncStandardRegionalEndpointsResolver, ) +from smithy_aws_core.aio.protocols import AsyncAwsQueryClientProtocol +from smithy_aws_core.config.types import FieldSpec from smithy_aws_core.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ( - ClientProtocol, - EndpointResolver, - ProtocolConstructor, - ProtocolSettings, -) -from smithy_core.aio.interfaces.auth import AuthScheme -from smithy_core.aio.interfaces.identity import IdentityResolver +from smithy_core.aio.interfaces import AsyncClientProtocol, AsyncEndpointResolver +from smithy_core.aio.interfaces.auth import AsyncAuthScheme +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver +from smithy_core.interfaces import ProtocolConstructor, ProtocolSettings from smithy_core.interfaces.auth import AuthSchemeResolver from smithy_core.shapes import ShapeID from smithy_http.aio.aiohttp import AIOHTTPClient @@ -181,11 +177,13 @@ class _AsyncQueryProtocolConfigOverrides(AwsConfigOverrides, total=False): - endpoint_resolver: EndpointResolver | None + endpoint_resolver: AsyncEndpointResolver | None protocol: ( - ClientProtocol[Any, Any] | ProtocolConstructor[ClientProtocol[Any, Any]] | None + AsyncClientProtocol[Any, Any] + | ProtocolConstructor[AsyncClientProtocol[Any, Any]] + | None ) - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] | None auth_scheme_resolver: AuthSchemeResolver | None @@ -193,17 +191,17 @@ class _AsyncQueryProtocolConfigOverrides(AwsConfigOverrides, total=False): class AsyncQueryProtocolConfig(AsyncAwsConfig): """Query Protocol configuration (async-resolved).""" - endpoint_resolver: EndpointResolver | None = None + endpoint_resolver: AsyncEndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - protocol: ClientProtocol[Any, Any] | None = None + protocol: AsyncClientProtocol[Any, Any] | None = None """ Pass a protocol class reference from smithy_aws_core.aio.protocols to - select the protocol, e.g. protocol=AwsJson10ClientProtocol. For custom - protocols a protocol instance may also be passed. + select the protocol, e.g. protocol=AsyncAwsJson10ClientProtocol. For + custom protocols a protocol instance may also be passed. """ interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) @@ -212,7 +210,7 @@ class AsyncQueryProtocolConfig(AsyncAwsConfig): execution of a request. """ - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] | None = None """A map of auth scheme ids to auth schemes.""" auth_scheme_resolver: AuthSchemeResolver | None = None @@ -222,7 +220,7 @@ class AsyncQueryProtocolConfig(AsyncAwsConfig): """ aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None ) = None """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" @@ -263,24 +261,24 @@ class AsyncQueryProtocolConfig(AsyncAwsConfig): default=None, resolver=EndpointUriResolver("query_protocol") ), "endpoint_resolver": FieldSpec( - default_factory=lambda: StandardRegionalEndpointsResolver( + default_factory=lambda: AsyncStandardRegionalEndpointsResolver( endpoint_prefix="awsquery" ) ), "protocol": FieldSpec( - default_factory=lambda: AwsQueryClientProtocol(_PROTOCOL_SETTINGS), + default_factory=lambda: AsyncAwsQueryClientProtocol(_PROTOCOL_SETTINGS), converter=lambda p: p(_PROTOCOL_SETTINGS) if isinstance(p, type) else p, ), "auth_schemes": FieldSpec( default_factory=lambda: { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="awsquery") + ShapeID("aws.auth#sigv4"): AsyncSigV4AuthScheme(service="awsquery") } ), "auth_scheme_resolver": FieldSpec(default_factory=HTTPAuthSchemeResolver), "transport": FieldSpec(default_factory=lambda: AIOHTTPClient()), } - def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None: + def set_auth_scheme(self, scheme: AsyncAuthScheme[Any, Any, Any, Any]) -> None: """ Set an auth scheme implementation using its scheme ID. :param scheme: The auth scheme to add or replace. @@ -294,7 +292,7 @@ async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] cls, *, profile: str | None = None, - fs: FileSystem | None = None, + fs: AsyncFileSystem | None = None, config_file_path: str | None = None, credentials_file_path: str | None = None, **overrides: Unpack[_AsyncQueryProtocolConfigOverrides], diff --git a/codegen-output/aws-query/tests/test_awsquery_protocol.py b/codegen-output/aws-query/tests/test_awsquery_protocol.py index 963b63e3e..09bf167f2 100644 --- a/codegen-output/aws-query/tests/test_awsquery_protocol.py +++ b/codegen-output/aws-query/tests/test_awsquery_protocol.py @@ -4,8 +4,8 @@ from urllib.parse import parse_qsl from pytest import fail, mark, raises -from smithy_aws_core.identity import StaticCredentialsResolver -from smithy_core.aio.retries import SimpleRetryStrategy +from smithy_aws_core.aio.identity.static import AsyncStaticCredentialsResolver +from smithy_core.aio.retries import AsyncSimpleRetryStrategy from smithy_core.aio.types import AsyncBytesReader from smithy_core.aio.utils import async_list from smithy_http import tuples_to_fields @@ -106,7 +106,7 @@ async def test_aws_query_date_time_with_negative_offset_response_datetime_offset region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -142,7 +142,7 @@ async def test_aws_query_date_time_with_positive_offset_response_datetime_offset region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -168,11 +168,11 @@ async def test_query_empty_input_and_empty_output_request_empty_input_and_empty_ config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -251,7 +251,7 @@ async def test_query_empty_input_and_empty_output_response_empty_input_and_empty region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -277,11 +277,11 @@ async def test_aws_query_endpoint_trait_request_endpoint_operation() -> None: config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -362,11 +362,11 @@ async def test_aws_query_endpoint_trait_with_host_label_request_endpoint_with_ho config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -449,7 +449,7 @@ async def test_query_query_flattened_xml_map_response_flattened_xml_map() -> Non region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -480,7 +480,7 @@ async def test_query_query_flattened_xml_map_with_xml_name_response_flattened_xm region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -514,7 +514,7 @@ async def test_query_query_flattened_xml_map_with_xml_namespace_response_flatten region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -548,7 +548,7 @@ async def test_aws_query_date_time_with_fractional_seconds_response_fractional_s region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -582,7 +582,7 @@ async def test_query_greeting_with_errors_response_greeting_with_errors() -> Non region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -611,7 +611,7 @@ async def test_query_invalid_greeting_error_error_greeting_with_errors() -> None region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -639,7 +639,7 @@ async def test_query_complex_error_error_greeting_with_errors() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -668,7 +668,7 @@ async def test_query_customized_error_error_greeting_with_errors() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -690,11 +690,11 @@ async def test_query_host_with_path_request_host_with_path_operation() -> None: config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/custom", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -769,7 +769,7 @@ async def test_query_ignores_wrapping_xml_name_response_ignores_wrapping_xml_nam region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -791,11 +791,11 @@ async def test_nested_structures_request_nested_structures() -> None: config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -873,11 +873,11 @@ async def test_query_no_input_and_no_output_request_no_input_and_no_output() -> config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -954,7 +954,7 @@ async def test_query_no_input_and_no_output_response_no_input_and_no_output() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -985,7 +985,7 @@ async def test_query_no_input_and_no_output_with_response_metadata_response_no_i region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1007,11 +1007,11 @@ async def test_query_no_input_and_output_request_no_input_and_output() -> None: config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1088,7 +1088,7 @@ async def test_query_no_input_and_output_response_no_input_and_output() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1116,11 +1116,11 @@ async def test_sdk_applied_content_encoding_aws_query_request_put_with_content_e config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1192,11 +1192,11 @@ async def test_sdk_appends_gzip_and_ignores_http_provided_encoding_aws_query_req config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1264,11 +1264,11 @@ async def test_query_protocol_idempotency_token_auto_fill_request_query_idempote config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1344,11 +1344,11 @@ async def test_query_protocol_idempotency_token_auto_fill_is_set_request_query_i config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1424,11 +1424,11 @@ async def test_query_lists_request_query_lists() -> None: config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1505,11 +1505,11 @@ async def test_empty_query_lists_request_query_lists() -> None: config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1586,11 +1586,11 @@ async def test_flattened_query_lists_request_query_lists() -> None: config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1664,11 +1664,11 @@ async def test_query_list_arg_with_xml_name_member_request_query_lists() -> None config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1745,11 +1745,11 @@ async def test_query_flattened_list_arg_with_xml_name_request_query_lists() -> N config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1823,11 +1823,11 @@ async def test_query_nested_struct_with_list_request_query_lists() -> None: config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1901,11 +1901,11 @@ async def test_query_simple_query_maps_request_query_maps() -> None: config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1979,11 +1979,11 @@ async def test_query_simple_query_maps_with_xml_name_request_query_maps() -> Non config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2057,11 +2057,11 @@ async def test_query_complex_query_maps_request_query_maps() -> None: config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2140,11 +2140,11 @@ async def test_query_empty_query_maps_request_query_maps() -> None: config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2218,11 +2218,11 @@ async def test_query_query_map_with_member_xml_name_request_query_maps() -> None config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2296,11 +2296,11 @@ async def test_query_flattened_query_maps_request_query_maps() -> None: config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2374,11 +2374,11 @@ async def test_query_flattened_query_maps_with_xml_name_request_query_maps() -> config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2452,11 +2452,11 @@ async def test_query_query_map_of_lists_request_query_maps() -> None: config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2530,11 +2530,11 @@ async def test_query_nested_struct_with_map_request_query_maps() -> None: config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2610,11 +2610,11 @@ async def test_query_timestamps_input_request_query_timestamps() -> None: config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2699,7 +2699,7 @@ async def test_query_recursive_shapes_response_recursive_xml_shapes() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2731,11 +2731,11 @@ async def test_query_simple_input_params_strings_request_simple_input_params() - config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2813,11 +2813,11 @@ async def test_query_simple_input_params_string_and_boolean_true_request_simple_ config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2895,11 +2895,11 @@ async def test_query_simple_input_params_strings_and_boolean_false_request_simpl config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2973,11 +2973,11 @@ async def test_query_simple_input_params_integer_request_simple_input_params() - config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3051,11 +3051,11 @@ async def test_query_simple_input_params_float_request_simple_input_params() -> config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3129,11 +3129,11 @@ async def test_query_simple_input_params_blob_request_simple_input_params() -> N config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3209,11 +3209,11 @@ async def test_query_enums_request_simple_input_params() -> None: config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3289,11 +3289,11 @@ async def test_query_int_enums_request_simple_input_params() -> None: config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3371,11 +3371,11 @@ async def test_aws_query_supports_na_n_float_inputs_request_simple_input_params( config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3453,11 +3453,11 @@ async def test_aws_query_supports_infinity_float_inputs_request_simple_input_par config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3533,11 +3533,11 @@ async def test_aws_query_supports_negative_infinity_float_inputs_request_simple_ config=await AsyncQueryProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3620,7 +3620,7 @@ async def test_query_simple_scalar_properties_response_simple_scalar_xml_propert region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3662,7 +3662,7 @@ async def test_aws_query_supports_na_n_float_outputs_response_simple_scalar_xml_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3695,7 +3695,7 @@ async def test_aws_query_supports_infinity_float_outputs_response_simple_scalar_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3728,7 +3728,7 @@ async def test_aws_query_supports_negative_infinity_float_outputs_response_simpl region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3759,7 +3759,7 @@ async def test_query_xml_blobs_response_xml_blobs() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3788,7 +3788,7 @@ async def test_query_xml_empty_blobs_response_xml_empty_blobs() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3817,7 +3817,7 @@ async def test_query_xml_empty_self_closed_blobs_response_xml_empty_blobs() -> N region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3846,7 +3846,7 @@ async def test_query_xml_empty_lists_response_xml_empty_lists() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3875,7 +3875,7 @@ async def test_query_xml_empty_maps_response_xml_empty_maps() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3904,7 +3904,7 @@ async def test_query_xml_empty_self_closed_maps_response_xml_empty_maps() -> Non region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3933,7 +3933,7 @@ async def test_query_xml_enums_response_xml_enums() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3969,7 +3969,7 @@ async def test_query_xml_int_enums_response_xml_int_enums() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4005,7 +4005,7 @@ async def test_query_xml_lists_response_xml_lists() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4055,7 +4055,7 @@ async def test_query_xml_maps_response_xml_maps() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4086,7 +4086,7 @@ async def test_query_query_xml_maps_xml_name_response_xml_maps_xml_name() -> Non region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4117,7 +4117,7 @@ async def test_query_xml_namespaces_response_xml_namespaces() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4148,7 +4148,7 @@ async def test_query_xml_timestamps_response_xml_timestamps() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4184,7 +4184,7 @@ async def test_query_xml_timestamps_with_date_time_format_response_xml_timestamp region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4220,7 +4220,7 @@ async def test_query_xml_timestamps_with_date_time_on_target_format_response_xml region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4253,7 +4253,7 @@ async def test_query_xml_timestamps_with_epoch_seconds_format_response_xml_times region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4289,7 +4289,7 @@ async def test_query_xml_timestamps_with_epoch_seconds_on_target_format_response region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4322,7 +4322,7 @@ async def test_query_xml_timestamps_with_http_date_format_response_xml_timestamp region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4355,7 +4355,7 @@ async def test_query_xml_timestamps_with_http_date_on_target_format_response_xml region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) diff --git a/codegen-output/ec2-query/src/ec2query/client.py b/codegen-output/ec2-query/src/ec2query/client.py index 8de0c5b67..5b836b7d3 100644 --- a/codegen-output/ec2-query/src/ec2query/client.py +++ b/codegen-output/ec2-query/src/ec2query/client.py @@ -6,15 +6,15 @@ import logging from typing import Any, cast +from smithy_aws_core.aio.identity.chain import AsyncIdentityChain from smithy_aws_core.config import ConfigSource from smithy_aws_core.identity import AWSCredentialsIdentity -from smithy_aws_core.identity.chain import IdentityChain -from smithy_core.aio.client import AsyncClient, ClientCall, RequestPipeline +from smithy_core.aio.client import AsyncClient, AsyncClientCall, AsyncRequestPipeline from smithy_core.deserializers import DeserializeableShape from smithy_core.exceptions import ExpectationNotMetError from smithy_core.schemas import APIOperation from smithy_core.serializers import SerializeableShape -from smithy_http.aio.interfaces import HTTPClient +from smithy_http.aio.interfaces import AsyncHTTPClient from smithy_http.plugins import user_agent_plugin from .config import AsyncEC2ProtocolConfig, Plugin @@ -168,12 +168,12 @@ async def _post_setup(self, config: AsyncEC2ProtocolConfig) -> None: config_file = await config_context.parsed_profiles() if config_context.profile_source is ConfigSource.OVERRIDE: profile_name = config_context.profile_name - config.aws_credentials_identity_resolver = await IdentityChain.create( + config.aws_credentials_identity_resolver = await AsyncIdentityChain.create( AWSCredentialsIdentity, config_file=config_file, profile_name=profile_name, region_override=config.region, - http_client=cast(HTTPClient | None, config.transport), + http_client=cast(AsyncHTTPClient | None, config.transport), ) async def _prepare_call[I: SerializeableShape, O: DeserializeableShape]( @@ -182,7 +182,7 @@ async def _prepare_call[I: SerializeableShape, O: DeserializeableShape]( operation: APIOperation[I, O], default_plugins: list[Plugin], plugins: list[Plugin] | None, - ) -> tuple[RequestPipeline[Any, Any], ClientCall[I, O]]: + ) -> tuple[AsyncRequestPipeline[Any, Any], AsyncClientCall[I, O]]: if self._closed: raise RuntimeError( "Cannot invoke an operation on a client that has been closed." diff --git a/codegen-output/ec2-query/src/ec2query/config.py b/codegen-output/ec2-query/src/ec2query/config.py index 032738972..b3d75e3b2 100644 --- a/codegen-output/ec2-query/src/ec2query/config.py +++ b/codegen-output/ec2-query/src/ec2query/config.py @@ -12,24 +12,20 @@ Unpack, ) -from smithy_aws_core.aio.protocols import Ec2QueryClientProtocol -from smithy_aws_core.auth import SigV4AuthScheme -from smithy_aws_core.config import AwsConfigOverrides, FileSystem -from smithy_aws_core.config.aws_config import AsyncAwsConfig -from smithy_aws_core.config.resolvers import EndpointUriResolver -from smithy_aws_core.config.types import FieldSpec -from smithy_aws_core.endpoints.standard_regional import ( - StandardRegionalEndpointsResolver, +from smithy_aws_core.aio.auth.sigv4 import AsyncSigV4AuthScheme +from smithy_aws_core.aio.config import AsyncFileSystem +from smithy_aws_core.aio.config.aws_config import AsyncAwsConfig, AwsConfigOverrides +from smithy_aws_core.aio.config.resolvers import EndpointUriResolver +from smithy_aws_core.aio.endpoints.standard_regional import ( + AsyncStandardRegionalEndpointsResolver, ) +from smithy_aws_core.aio.protocols import AsyncEc2QueryClientProtocol +from smithy_aws_core.config.types import FieldSpec from smithy_aws_core.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ( - ClientProtocol, - EndpointResolver, - ProtocolConstructor, - ProtocolSettings, -) -from smithy_core.aio.interfaces.auth import AuthScheme -from smithy_core.aio.interfaces.identity import IdentityResolver +from smithy_core.aio.interfaces import AsyncClientProtocol, AsyncEndpointResolver +from smithy_core.aio.interfaces.auth import AsyncAuthScheme +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver +from smithy_core.interfaces import ProtocolConstructor, ProtocolSettings from smithy_core.interfaces.auth import AuthSchemeResolver from smithy_core.shapes import ShapeID from smithy_http.aio.aiohttp import AIOHTTPClient @@ -150,11 +146,13 @@ class _AsyncEC2ProtocolConfigOverrides(AwsConfigOverrides, total=False): - endpoint_resolver: EndpointResolver | None + endpoint_resolver: AsyncEndpointResolver | None protocol: ( - ClientProtocol[Any, Any] | ProtocolConstructor[ClientProtocol[Any, Any]] | None + AsyncClientProtocol[Any, Any] + | ProtocolConstructor[AsyncClientProtocol[Any, Any]] + | None ) - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] | None auth_scheme_resolver: AuthSchemeResolver | None @@ -162,17 +160,17 @@ class _AsyncEC2ProtocolConfigOverrides(AwsConfigOverrides, total=False): class AsyncEC2ProtocolConfig(AsyncAwsConfig): """EC2 Protocol configuration (async-resolved).""" - endpoint_resolver: EndpointResolver | None = None + endpoint_resolver: AsyncEndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - protocol: ClientProtocol[Any, Any] | None = None + protocol: AsyncClientProtocol[Any, Any] | None = None """ Pass a protocol class reference from smithy_aws_core.aio.protocols to - select the protocol, e.g. protocol=AwsJson10ClientProtocol. For custom - protocols a protocol instance may also be passed. + select the protocol, e.g. protocol=AsyncAwsJson10ClientProtocol. For + custom protocols a protocol instance may also be passed. """ interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) @@ -181,7 +179,7 @@ class AsyncEC2ProtocolConfig(AsyncAwsConfig): execution of a request. """ - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] | None = None """A map of auth scheme ids to auth schemes.""" auth_scheme_resolver: AuthSchemeResolver | None = None @@ -191,7 +189,7 @@ class AsyncEC2ProtocolConfig(AsyncAwsConfig): """ aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None ) = None """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" @@ -232,24 +230,24 @@ class AsyncEC2ProtocolConfig(AsyncAwsConfig): default=None, resolver=EndpointUriResolver("ec2_protocol") ), "endpoint_resolver": FieldSpec( - default_factory=lambda: StandardRegionalEndpointsResolver( + default_factory=lambda: AsyncStandardRegionalEndpointsResolver( endpoint_prefix="awsec2" ) ), "protocol": FieldSpec( - default_factory=lambda: Ec2QueryClientProtocol(_PROTOCOL_SETTINGS), + default_factory=lambda: AsyncEc2QueryClientProtocol(_PROTOCOL_SETTINGS), converter=lambda p: p(_PROTOCOL_SETTINGS) if isinstance(p, type) else p, ), "auth_schemes": FieldSpec( default_factory=lambda: { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="ec2query") + ShapeID("aws.auth#sigv4"): AsyncSigV4AuthScheme(service="ec2query") } ), "auth_scheme_resolver": FieldSpec(default_factory=HTTPAuthSchemeResolver), "transport": FieldSpec(default_factory=lambda: AIOHTTPClient()), } - def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None: + def set_auth_scheme(self, scheme: AsyncAuthScheme[Any, Any, Any, Any]) -> None: """ Set an auth scheme implementation using its scheme ID. :param scheme: The auth scheme to add or replace. @@ -263,7 +261,7 @@ async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] cls, *, profile: str | None = None, - fs: FileSystem | None = None, + fs: AsyncFileSystem | None = None, config_file_path: str | None = None, credentials_file_path: str | None = None, **overrides: Unpack[_AsyncEC2ProtocolConfigOverrides], diff --git a/codegen-output/ec2-query/tests/test_ec2query_protocol.py b/codegen-output/ec2-query/tests/test_ec2query_protocol.py index 2a5b75531..cb12d373e 100644 --- a/codegen-output/ec2-query/tests/test_ec2query_protocol.py +++ b/codegen-output/ec2-query/tests/test_ec2query_protocol.py @@ -4,8 +4,8 @@ from urllib.parse import parse_qsl from pytest import fail, mark, raises -from smithy_aws_core.identity import StaticCredentialsResolver -from smithy_core.aio.retries import SimpleRetryStrategy +from smithy_aws_core.aio.identity.static import AsyncStaticCredentialsResolver +from smithy_core.aio.retries import AsyncSimpleRetryStrategy from smithy_core.aio.types import AsyncBytesReader from smithy_core.aio.utils import async_list from smithy_http import tuples_to_fields @@ -90,7 +90,7 @@ async def test_ec2_query_date_time_with_negative_offset_response_datetime_offset region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -126,7 +126,7 @@ async def test_ec2_query_date_time_with_positive_offset_response_datetime_offset region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -152,11 +152,11 @@ async def test_ec2_query_empty_input_and_empty_output_request_empty_input_and_em config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -239,7 +239,7 @@ async def test_ec2_query_empty_input_and_empty_output_response_empty_input_and_e region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -265,11 +265,11 @@ async def test_ec2_query_endpoint_trait_request_endpoint_operation() -> None: config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -350,11 +350,11 @@ async def test_ec2_query_endpoint_trait_with_host_label_request_endpoint_with_ho config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -442,7 +442,7 @@ async def test_ec2_query_date_time_with_fractional_seconds_response_fractional_s region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -476,7 +476,7 @@ async def test_ec2_greeting_with_errors_response_greeting_with_errors() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -505,7 +505,7 @@ async def test_ec2_invalid_greeting_error_error_greeting_with_errors() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -533,7 +533,7 @@ async def test_ec2_complex_error_error_greeting_with_errors() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -555,11 +555,11 @@ async def test_ec2_query_host_with_path_request_host_with_path_operation() -> No config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/custom", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -634,7 +634,7 @@ async def test_ec2_ignores_wrapping_xml_name_response_ignores_wrapping_xml_name( region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -656,11 +656,11 @@ async def test_ec2_nested_structures_request_nested_structures() -> None: config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -738,11 +738,11 @@ async def test_ec2_query_no_input_and_output_request_no_input_and_output() -> No config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -823,7 +823,7 @@ async def test_ec2_query_no_input_and_output_response_no_input_and_output() -> N region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -851,11 +851,11 @@ async def test_sdk_applied_content_encoding_ec2_query_request_put_with_content_e config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -927,11 +927,11 @@ async def test_sdk_appends_gzip_and_ignores_http_provided_encoding_ec2_query_req config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -999,11 +999,11 @@ async def test_ec2_protocol_idempotency_token_auto_fill_request_query_idempotenc config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1079,11 +1079,11 @@ async def test_ec2_protocol_idempotency_token_auto_fill_is_set_request_query_ide config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1159,11 +1159,11 @@ async def test_ec2_lists_request_query_lists() -> None: config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1240,11 +1240,11 @@ async def test_ec2_empty_query_lists_request_query_lists() -> None: config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1321,11 +1321,11 @@ async def test_ec2_list_arg_with_xml_name_member_request_query_lists() -> None: config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1399,11 +1399,11 @@ async def test_ec2_list_member_with_xml_name_request_query_lists() -> None: config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1477,11 +1477,11 @@ async def test_ec2_list_nested_struct_with_list_request_query_lists() -> None: config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1555,11 +1555,11 @@ async def test_ec2_timestamps_input_request_query_timestamps() -> None: config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1644,7 +1644,7 @@ async def test_ec2_recursive_shapes_response_recursive_xml_shapes() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1676,11 +1676,11 @@ async def test_ec2_simple_input_params_strings_request_simple_input_params() -> config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1758,11 +1758,11 @@ async def test_ec2_simple_input_params_string_and_boolean_true_request_simple_in config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1840,11 +1840,11 @@ async def test_ec2_simple_input_params_strings_and_boolean_false_request_simple_ config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1918,11 +1918,11 @@ async def test_ec2_simple_input_params_integer_request_simple_input_params() -> config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1996,11 +1996,11 @@ async def test_ec2_simple_input_params_float_request_simple_input_params() -> No config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2074,11 +2074,11 @@ async def test_ec2_simple_input_params_blob_request_simple_input_params() -> Non config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2154,11 +2154,11 @@ async def test_ec2_enums_request_simple_input_params() -> None: config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2234,11 +2234,11 @@ async def test_ec2_query_request_simple_input_params() -> None: config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2314,11 +2314,11 @@ async def test_ec2_query_is_preferred_request_simple_input_params() -> None: config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2397,11 +2397,11 @@ async def test_ec2_xml_name_is_uppercased_request_simple_input_params() -> None: config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2482,11 +2482,11 @@ async def test_ec2_query_name_distinct_from_xml_name_and_member_name_request_sim config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2566,11 +2566,11 @@ async def test_ec2_query_supports_na_n_float_inputs_request_simple_input_params( config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2648,11 +2648,11 @@ async def test_ec2_query_supports_infinity_float_inputs_request_simple_input_par config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2728,11 +2728,11 @@ async def test_ec2_query_supports_negative_infinity_float_inputs_request_simple_ config=await AsyncEC2ProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2815,7 +2815,7 @@ async def test_ec2_simple_scalar_properties_response_simple_scalar_xml_propertie region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2857,7 +2857,7 @@ async def test_ec2_query_supports_na_n_float_outputs_response_simple_scalar_xml_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2890,7 +2890,7 @@ async def test_ec2_query_supports_infinity_float_outputs_response_simple_scalar_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2923,7 +2923,7 @@ async def test_ec2_query_supports_negative_infinity_float_outputs_response_simpl region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2954,7 +2954,7 @@ async def test_ec2_xml_blobs_response_xml_blobs() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2983,7 +2983,7 @@ async def test_ec2_xml_empty_blobs_response_xml_empty_blobs() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3012,7 +3012,7 @@ async def test_ec2_xml_empty_self_closed_blobs_response_xml_empty_blobs() -> Non region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3041,7 +3041,7 @@ async def test_ec2_xml_empty_lists_response_xml_empty_lists() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3070,7 +3070,7 @@ async def test_ec2_xml_enums_response_xml_enums() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3106,7 +3106,7 @@ async def test_ec2_xml_int_enums_response_xml_int_enums() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3142,7 +3142,7 @@ async def test_ec2_xml_lists_response_xml_lists() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3192,7 +3192,7 @@ async def test_ec2_xml_namespaces_response_xml_namespaces() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3223,7 +3223,7 @@ async def test_ec2_xml_timestamps_response_xml_timestamps() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3259,7 +3259,7 @@ async def test_ec2_xml_timestamps_with_date_time_format_response_xml_timestamps( region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3295,7 +3295,7 @@ async def test_ec2_xml_timestamps_with_date_time_on_target_format_response_xml_t region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3328,7 +3328,7 @@ async def test_ec2_xml_timestamps_with_epoch_seconds_format_response_xml_timesta region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3364,7 +3364,7 @@ async def test_ec2_xml_timestamps_with_epoch_seconds_on_target_format_response_x region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3397,7 +3397,7 @@ async def test_ec2_xml_timestamps_with_http_date_format_response_xml_timestamps( region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3430,7 +3430,7 @@ async def test_ec2_xml_timestamps_with_http_date_on_target_format_response_xml_t region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) diff --git a/codegen-output/my-handwritten-model/src/my_handwritten_model/client.py b/codegen-output/my-handwritten-model/src/my_handwritten_model/client.py index 789367846..488b24f3b 100644 --- a/codegen-output/my-handwritten-model/src/my_handwritten_model/client.py +++ b/codegen-output/my-handwritten-model/src/my_handwritten_model/client.py @@ -4,11 +4,11 @@ import logging from typing import Any -from smithy_core.aio.client import AsyncClient, ClientCall, RequestPipeline +from smithy_core.aio.client import AsyncClient, AsyncClientCall, AsyncRequestPipeline from smithy_core.aio.eventstream import ( - DuplexEventStream, - InputEventStream, - OutputEventStream, + AsyncDuplexEventStream, + AsyncInputEventStream, + AsyncOutputEventStream, ) from smithy_core.deserializers import DeserializeableShape from smithy_core.exceptions import ExpectationNotMetError @@ -98,7 +98,7 @@ async def _prepare_call[I: SerializeableShape, O: DeserializeableShape]( operation: APIOperation[I, O], default_plugins: list[Plugin], plugins: list[Plugin] | None, - ) -> tuple[RequestPipeline[Any, Any], ClientCall[I, O]]: + ) -> tuple[AsyncRequestPipeline[Any, Any], AsyncClientCall[I, O]]: if self._closed: raise RuntimeError( "Cannot invoke an operation on a client that has been closed." @@ -132,7 +132,7 @@ async def _prepare_call[I: SerializeableShape, O: DeserializeableShape]( async def publish_events( self, input: PublishEventsInput, plugins: list[Plugin] | None = None - ) -> InputEventStream[PublishEventStream, PublishEventsOutput]: + ) -> AsyncInputEventStream[PublishEventStream, PublishEventsOutput]: """ Input-only stream: the client sends events, the server returns a summary. @@ -154,7 +154,7 @@ async def publish_events( async def subscribe_to_events( self, input: SubscribeToEventsInput, plugins: list[Plugin] | None = None - ) -> OutputEventStream[SubscribeEventStream, SubscribeToEventsOutput]: + ) -> AsyncOutputEventStream[SubscribeEventStream, SubscribeToEventsOutput]: """ Output-only stream: the client subscribes, the server streams events. @@ -179,7 +179,7 @@ async def subscribe_to_events( async def trade_event_stream( self, input: TradeEventStreamInput, plugins: list[Plugin] | None = None - ) -> DuplexEventStream[TradeEvents, TradeEvents, TradeEventStreamOutput]: + ) -> AsyncDuplexEventStream[TradeEvents, TradeEvents, TradeEventStreamOutput]: """ Bidirectional (duplex) stream. The non-stream members (sessionId, greeting) are carried as the initial-request and initial-response diff --git a/codegen-output/my-handwritten-model/src/my_handwritten_model/config.py b/codegen-output/my-handwritten-model/src/my_handwritten_model/config.py index bcc398f3e..7e5faf843 100644 --- a/codegen-output/my-handwritten-model/src/my_handwritten_model/config.py +++ b/codegen-output/my-handwritten-model/src/my_handwritten_model/config.py @@ -3,25 +3,23 @@ from dataclasses import dataclass from typing import Any, Callable, TYPE_CHECKING, TypeAlias, Union, cast -from smithy_aws_core.endpoints.standard_regional import ( - StandardRegionalEndpointsResolver, +from smithy_aws_core.aio.endpoints.standard_regional import ( + AsyncStandardRegionalEndpointsResolver, ) from smithy_core.aio.interfaces import ( - ClientProtocol, - ClientTransport, - EndpointResolver, - ProtocolConstructor, - ProtocolSettings, + AsyncClientProtocol, + AsyncClientTransport, + AsyncEndpointResolver, ) -from smithy_core.aio.interfaces.auth import AuthScheme -from smithy_core.aio.interfaces.retries import RetryStrategy +from smithy_core.aio.interfaces.auth import AsyncAuthScheme +from smithy_core.aio.interfaces.retries import AsyncRetryStrategy from smithy_core.auth import DefaultAuthResolver -from smithy_core.interfaces import URI +from smithy_core.interfaces import ProtocolConstructor, ProtocolSettings, URI from smithy_core.interfaces.auth import AuthSchemeResolver from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.aiohttp import AIOHTTPClient -from smithy_http.aio.protocols import RpcV2CborClientProtocol +from smithy_http.aio.protocols import AsyncRpcV2CborClientProtocol from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import MY_HANDWRITTEN_MODEL @@ -63,10 +61,10 @@ class Config: operation. """ - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] + auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] """A map of auth scheme ids to auth schemes.""" - endpoint_resolver: EndpointResolver + endpoint_resolver: AsyncEndpointResolver """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. @@ -84,11 +82,11 @@ class Config: execution of a request. """ - protocol: ClientProtocol[Any, Any] | None + protocol: AsyncClientProtocol[Any, Any] | None """ Pass a protocol class reference from smithy_aws_core.aio.protocols to - select the protocol, e.g. protocol=AwsJson10ClientProtocol. For custom - protocols a protocol instance may also be passed. + select the protocol, e.g. protocol=AsyncAwsJson10ClientProtocol. For + custom protocols a protocol instance may also be passed. """ region: str | None @@ -97,7 +95,7 @@ class Config: the service endpoint. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + retry_strategy: AsyncRetryStrategy | RetryStrategyOptions | None """ The retry strategy or options for configuring retry behavior. Can be either a configured RetryStrategy or RetryStrategyOptions to create one. @@ -109,11 +107,11 @@ class Config: header. """ - transport: ClientTransport[Any, Any] | None + transport: AsyncClientTransport[Any, Any] | None """ The transport to use to send requests (e.g. an HTTP client). Operations - with bidirectional event streams require a DuplexClientTransport, such - as AWSCRTHTTPClient. Transports are assumed not to support duplex + with bidirectional event streams require a AsyncDuplexClientTransport, + such as AWSCRTHTTPClient. Transports are assumed not to support duplex streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. """ @@ -124,24 +122,27 @@ def __init__( self, *, auth_scheme_resolver: AuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - endpoint_resolver: EndpointResolver | None = None, + auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] | None = None, + endpoint_resolver: AsyncEndpointResolver | None = None, endpoint_uri: str | URI | None = None, http_request_config: HTTPRequestConfiguration | None = None, interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] - | ProtocolConstructor[ClientProtocol[Any, Any]] + protocol: AsyncClientProtocol[Any, Any] + | ProtocolConstructor[AsyncClientProtocol[Any, Any]] | None = None, region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, + retry_strategy: AsyncRetryStrategy | RetryStrategyOptions | None = None, sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, + transport: AsyncClientTransport[Any, Any] | None = None, user_agent_extra: str | None = None, ): self.auth_scheme_resolver = auth_scheme_resolver or DefaultAuthResolver() self.auth_schemes = auth_schemes or {} - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="MyHandwrittenModel" + self.endpoint_resolver = ( + endpoint_resolver + or AsyncStandardRegionalEndpointsResolver( + endpoint_prefix="MyHandwrittenModel" + ) ) self.endpoint_uri = endpoint_uri self.http_request_config = http_request_config @@ -149,8 +150,8 @@ def __init__( if isinstance(protocol, type): protocol = protocol(_PROTOCOL_SETTINGS) self.protocol = cast( - "ClientProtocol[Any, Any]", protocol - ) or RpcV2CborClientProtocol(_PROTOCOL_SETTINGS) + "AsyncClientProtocol[Any, Any]", protocol + ) or AsyncRpcV2CborClientProtocol(_PROTOCOL_SETTINGS) self.region = region self.retry_strategy = retry_strategy self.sdk_ua_app_id = sdk_ua_app_id diff --git a/codegen-output/rest-json-1/src/restjson/client.py b/codegen-output/rest-json-1/src/restjson/client.py index feb06f211..2f96fe9e8 100644 --- a/codegen-output/rest-json-1/src/restjson/client.py +++ b/codegen-output/rest-json-1/src/restjson/client.py @@ -6,20 +6,20 @@ import logging from typing import Any, cast +from smithy_aws_core.aio.identity.chain import AsyncIdentityChain from smithy_aws_core.config import ConfigSource from smithy_aws_core.identity import AWSCredentialsIdentity -from smithy_aws_core.identity.chain import IdentityChain -from smithy_core.aio.client import AsyncClient, ClientCall, RequestPipeline +from smithy_core.aio.client import AsyncClient, AsyncClientCall, AsyncRequestPipeline from smithy_core.aio.eventstream import ( - DuplexEventStream, - InputEventStream, - OutputEventStream, + AsyncDuplexEventStream, + AsyncInputEventStream, + AsyncOutputEventStream, ) from smithy_core.deserializers import DeserializeableShape from smithy_core.exceptions import ExpectationNotMetError from smithy_core.schemas import APIOperation from smithy_core.serializers import SerializeableShape -from smithy_http.aio.interfaces import HTTPClient +from smithy_http.aio.interfaces import AsyncHTTPClient from smithy_http.plugins import user_agent_plugin from .config import AsyncRestJsonProtocolConfig, Plugin @@ -439,12 +439,12 @@ async def _post_setup(self, config: AsyncRestJsonProtocolConfig) -> None: config_file = await config_context.parsed_profiles() if config_context.profile_source is ConfigSource.OVERRIDE: profile_name = config_context.profile_name - config.aws_credentials_identity_resolver = await IdentityChain.create( + config.aws_credentials_identity_resolver = await AsyncIdentityChain.create( AWSCredentialsIdentity, config_file=config_file, profile_name=profile_name, region_override=config.region, - http_client=cast(HTTPClient | None, config.transport), + http_client=cast(AsyncHTTPClient | None, config.transport), ) async def _prepare_call[I: SerializeableShape, O: DeserializeableShape]( @@ -453,7 +453,7 @@ async def _prepare_call[I: SerializeableShape, O: DeserializeableShape]( operation: APIOperation[I, O], default_plugins: list[Plugin], plugins: list[Plugin] | None, - ) -> tuple[RequestPipeline[Any, Any], ClientCall[I, O]]: + ) -> tuple[AsyncRequestPipeline[Any, Any], AsyncClientCall[I, O]]: if self._closed: raise RuntimeError( "Cannot invoke an operation on a client that has been closed." @@ -677,7 +677,7 @@ async def document_type_as_payload( async def duplex_stream( self, input: DuplexStreamInput, plugins: list[Plugin] | None = None - ) -> DuplexEventStream[EventStream, EventStream, DuplexStreamOutput]: + ) -> AsyncDuplexEventStream[EventStream, EventStream, DuplexStreamOutput]: """ Invokes the DuplexStream operation. @@ -702,7 +702,7 @@ async def duplex_stream_with_distinct_streams( self, input: DuplexStreamWithDistinctStreamsInput, plugins: list[Plugin] | None = None, - ) -> InputEventStream[EventStream, DuplexStreamWithDistinctStreamsOutput]: + ) -> AsyncInputEventStream[EventStream, DuplexStreamWithDistinctStreamsOutput]: """ Invokes the DuplexStreamWithDistinctStreams operation. @@ -727,7 +727,7 @@ async def duplex_stream_with_initial_messages( self, input: DuplexStreamWithInitialMessagesInput, plugins: list[Plugin] | None = None, - ) -> DuplexEventStream[ + ) -> AsyncDuplexEventStream[ EventStream, EventStream, DuplexStreamWithInitialMessagesOutput ]: """ @@ -1363,7 +1363,7 @@ async def input_and_output_with_headers( async def input_stream( self, input: InputStreamInput, plugins: list[Plugin] | None = None - ) -> InputEventStream[EventStream, InputStreamOutput]: + ) -> AsyncInputEventStream[EventStream, InputStreamOutput]: """ Invokes the InputStream operation. @@ -1386,7 +1386,7 @@ async def input_stream_with_initial_request( self, input: InputStreamWithInitialRequestInput, plugins: list[Plugin] | None = None, - ) -> InputEventStream[EventStream, InputStreamWithInitialRequestOutput]: + ) -> AsyncInputEventStream[EventStream, InputStreamWithInitialRequestOutput]: """ Invokes the InputStreamWithInitialRequest operation. @@ -2556,7 +2556,7 @@ async def operation_with_nested_structure( async def output_stream( self, input: OutputStreamInput, plugins: list[Plugin] | None = None - ) -> OutputEventStream[EventStream, OutputStreamOutput]: + ) -> AsyncOutputEventStream[EventStream, OutputStreamOutput]: """ Invokes the OutputStream operation. @@ -2581,7 +2581,7 @@ async def output_stream_with_initial_response( self, input: OutputStreamWithInitialResponseInput, plugins: list[Plugin] | None = None, - ) -> OutputEventStream[EventStream, OutputStreamWithInitialResponseOutput]: + ) -> AsyncOutputEventStream[EventStream, OutputStreamWithInitialResponseOutput]: """ Invokes the OutputStreamWithInitialResponse operation. diff --git a/codegen-output/rest-json-1/src/restjson/config.py b/codegen-output/rest-json-1/src/restjson/config.py index d5508b341..2ca59effa 100644 --- a/codegen-output/rest-json-1/src/restjson/config.py +++ b/codegen-output/rest-json-1/src/restjson/config.py @@ -12,24 +12,20 @@ Unpack, ) -from smithy_aws_core.aio.protocols import RestJsonClientProtocol -from smithy_aws_core.auth import SigV4AuthScheme -from smithy_aws_core.config import AwsConfigOverrides, FileSystem -from smithy_aws_core.config.aws_config import AsyncAwsConfig -from smithy_aws_core.config.resolvers import EndpointUriResolver -from smithy_aws_core.config.types import FieldSpec -from smithy_aws_core.endpoints.standard_regional import ( - StandardRegionalEndpointsResolver, +from smithy_aws_core.aio.auth.sigv4 import AsyncSigV4AuthScheme +from smithy_aws_core.aio.config import AsyncFileSystem +from smithy_aws_core.aio.config.aws_config import AsyncAwsConfig, AwsConfigOverrides +from smithy_aws_core.aio.config.resolvers import EndpointUriResolver +from smithy_aws_core.aio.endpoints.standard_regional import ( + AsyncStandardRegionalEndpointsResolver, ) +from smithy_aws_core.aio.protocols import AsyncRestJsonClientProtocol +from smithy_aws_core.config.types import FieldSpec from smithy_aws_core.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ( - ClientProtocol, - EndpointResolver, - ProtocolConstructor, - ProtocolSettings, -) -from smithy_core.aio.interfaces.auth import AuthScheme -from smithy_core.aio.interfaces.identity import IdentityResolver +from smithy_core.aio.interfaces import AsyncClientProtocol, AsyncEndpointResolver +from smithy_core.aio.interfaces.auth import AsyncAuthScheme +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver +from smithy_core.interfaces import ProtocolConstructor, ProtocolSettings from smithy_core.interfaces.auth import AuthSchemeResolver from smithy_core.shapes import ShapeID from smithy_http.aio.aiohttp import AIOHTTPClient @@ -611,11 +607,13 @@ class _AsyncRestJsonProtocolConfigOverrides(AwsConfigOverrides, total=False): - endpoint_resolver: EndpointResolver | None + endpoint_resolver: AsyncEndpointResolver | None protocol: ( - ClientProtocol[Any, Any] | ProtocolConstructor[ClientProtocol[Any, Any]] | None + AsyncClientProtocol[Any, Any] + | ProtocolConstructor[AsyncClientProtocol[Any, Any]] + | None ) - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] | None auth_scheme_resolver: AuthSchemeResolver | None @@ -623,17 +621,17 @@ class _AsyncRestJsonProtocolConfigOverrides(AwsConfigOverrides, total=False): class AsyncRestJsonProtocolConfig(AsyncAwsConfig): """Rest Json Protocol configuration (async-resolved).""" - endpoint_resolver: EndpointResolver | None = None + endpoint_resolver: AsyncEndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - protocol: ClientProtocol[Any, Any] | None = None + protocol: AsyncClientProtocol[Any, Any] | None = None """ Pass a protocol class reference from smithy_aws_core.aio.protocols to - select the protocol, e.g. protocol=AwsJson10ClientProtocol. For custom - protocols a protocol instance may also be passed. + select the protocol, e.g. protocol=AsyncAwsJson10ClientProtocol. For + custom protocols a protocol instance may also be passed. """ interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) @@ -642,7 +640,7 @@ class AsyncRestJsonProtocolConfig(AsyncAwsConfig): execution of a request. """ - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] | None = None """A map of auth scheme ids to auth schemes.""" auth_scheme_resolver: AuthSchemeResolver | None = None @@ -652,7 +650,7 @@ class AsyncRestJsonProtocolConfig(AsyncAwsConfig): """ aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None ) = None """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" @@ -693,24 +691,24 @@ class AsyncRestJsonProtocolConfig(AsyncAwsConfig): default=None, resolver=EndpointUriResolver("rest_json_protocol") ), "endpoint_resolver": FieldSpec( - default_factory=lambda: StandardRegionalEndpointsResolver( + default_factory=lambda: AsyncStandardRegionalEndpointsResolver( endpoint_prefix="restjson" ) ), "protocol": FieldSpec( - default_factory=lambda: RestJsonClientProtocol(_PROTOCOL_SETTINGS), + default_factory=lambda: AsyncRestJsonClientProtocol(_PROTOCOL_SETTINGS), converter=lambda p: p(_PROTOCOL_SETTINGS) if isinstance(p, type) else p, ), "auth_schemes": FieldSpec( default_factory=lambda: { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="restjson") + ShapeID("aws.auth#sigv4"): AsyncSigV4AuthScheme(service="restjson") } ), "auth_scheme_resolver": FieldSpec(default_factory=HTTPAuthSchemeResolver), "transport": FieldSpec(default_factory=lambda: AIOHTTPClient()), } - def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None: + def set_auth_scheme(self, scheme: AsyncAuthScheme[Any, Any, Any, Any]) -> None: """ Set an auth scheme implementation using its scheme ID. :param scheme: The auth scheme to add or replace. @@ -724,7 +722,7 @@ async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] cls, *, profile: str | None = None, - fs: FileSystem | None = None, + fs: AsyncFileSystem | None = None, config_file_path: str | None = None, credentials_file_path: str | None = None, **overrides: Unpack[_AsyncRestJsonProtocolConfigOverrides], diff --git a/codegen-output/rest-json-1/tests/test_restjson_protocol.py b/codegen-output/rest-json-1/tests/test_restjson_protocol.py index 1f8c76139..3ae991c22 100644 --- a/codegen-output/rest-json-1/tests/test_restjson_protocol.py +++ b/codegen-output/rest-json-1/tests/test_restjson_protocol.py @@ -5,9 +5,9 @@ from urllib.parse import parse_qsl from pytest import fail, mark, raises -from smithy_aws_core.identity import StaticCredentialsResolver +from smithy_aws_core.aio.identity.static import AsyncStaticCredentialsResolver from smithy_core.aio.interfaces import AsyncByteStream -from smithy_core.aio.retries import SimpleRetryStrategy +from smithy_core.aio.retries import AsyncSimpleRetryStrategy from smithy_core.aio.types import AsyncBytesReader from smithy_core.aio.utils import async_list from smithy_core.documents import Document @@ -176,11 +176,11 @@ async def test_rest_json_all_query_string_types_request_all_query_string_types() config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -336,11 +336,11 @@ async def test_rest_json_query_string_map_request_all_query_string_types() -> No config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -414,11 +414,11 @@ async def test_rest_json_query_string_escaping_request_all_query_string_types() config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -491,11 +491,11 @@ async def test_rest_json_supports_na_n_float_query_values_request_all_query_stri config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -567,11 +567,11 @@ async def test_rest_json_supports_infinity_float_query_values_request_all_query_ config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -643,11 +643,11 @@ async def test_rest_json_supports_negative_infinity_float_query_values_request_a config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -722,11 +722,11 @@ async def test_rest_json_zero_and_false_query_values_request_all_query_string_ty config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -798,11 +798,11 @@ async def test_rest_json_constant_and_variable_query_string_missing_one_value_re config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -870,11 +870,11 @@ async def test_rest_json_constant_and_variable_query_string_all_values_request_c config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -940,11 +940,11 @@ async def test_rest_json_constant_query_string_request_constant_query_string() - config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1022,7 +1022,7 @@ async def test_rest_json_date_time_with_negative_offset_response_datetime_offset region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1058,7 +1058,7 @@ async def test_rest_json_date_time_with_positive_offset_response_datetime_offset region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1085,11 +1085,11 @@ async def test_document_type_input_with_object_request_document_type() -> None: config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1159,11 +1159,11 @@ async def test_document_input_with_string_request_document_type() -> None: config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1233,11 +1233,11 @@ async def test_document_input_with_number_request_document_type() -> None: config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1307,11 +1307,11 @@ async def test_document_input_with_boolean_request_document_type() -> None: config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1381,11 +1381,11 @@ async def test_document_input_with_list_request_document_type() -> None: config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1466,7 +1466,7 @@ async def test_document_output_response_document_type() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1497,7 +1497,7 @@ async def test_document_output_string_response_document_type() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1528,7 +1528,7 @@ async def test_document_output_number_response_document_type() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1559,7 +1559,7 @@ async def test_document_output_boolean_response_document_type() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1590,7 +1590,7 @@ async def test_document_output_array_response_document_type() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1616,11 +1616,11 @@ async def test_document_type_as_map_value_input_request_document_type_as_map_val config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1703,7 +1703,7 @@ async def test_document_type_as_map_value_output_response_document_type_as_map_v region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1733,11 +1733,11 @@ async def test_document_type_as_payload_input_request_document_type_as_payload() config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1810,11 +1810,11 @@ async def test_document_type_as_payload_input_string_request_document_type_as_pa config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1891,7 +1891,7 @@ async def test_document_type_as_payload_output_response_document_type_as_payload region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1922,7 +1922,7 @@ async def test_document_type_as_payload_output_string_response_document_type_as_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1950,11 +1950,11 @@ async def test_rest_json_empty_input_and_empty_output_request_empty_input_and_em config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2030,7 +2030,7 @@ async def test_rest_json_empty_input_and_empty_output_response_empty_input_and_e region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2060,7 +2060,7 @@ async def test_rest_json_empty_input_and_empty_output_json_object_output_respons region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2086,11 +2086,11 @@ async def test_rest_json_endpoint_trait_request_endpoint_operation() -> None: config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2163,11 +2163,11 @@ async def test_rest_json_endpoint_trait_with_host_label_request_endpoint_with_ho config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2247,7 +2247,7 @@ async def test_rest_json_date_time_with_fractional_seconds_response_fractional_s region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2281,7 +2281,7 @@ async def test_rest_json_greeting_with_errors_response_greeting_with_errors() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2313,7 +2313,7 @@ async def test_rest_json_greeting_with_errors_no_payload_response_greeting_with_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2345,7 +2345,7 @@ async def test_rest_json_invalid_greeting_error_error_greeting_with_errors() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2380,7 +2380,7 @@ async def test_rest_json_complex_error_with_no_message_error_greeting_with_error region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2413,7 +2413,7 @@ async def test_rest_json_empty_complex_error_with_no_message_error_greeting_with region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2445,7 +2445,7 @@ async def test_rest_json_foo_error_using_x_amzn_error_type_error_greeting_with_e region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2487,7 +2487,7 @@ async def test_rest_json_foo_error_using_x_amzn_error_type_with_uri_error_greeti region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2527,7 +2527,7 @@ async def test_rest_json_foo_error_using_x_amzn_error_type_with_uri_and_namespac region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2566,7 +2566,7 @@ async def test_rest_json_foo_error_using_x_amzn_error_type_with_uri_and_differen region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2601,7 +2601,7 @@ async def test_rest_json_foo_error_using_code_error_greeting_with_errors() -> No region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2636,7 +2636,7 @@ async def test_rest_json_foo_error_using_code_and_namespace_error_greeting_with_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2672,7 +2672,7 @@ async def test_rest_json_foo_error_using_code_uri_and_namespace_error_greeting_w region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2703,7 +2703,7 @@ async def test_rest_json_foo_error_with_dunder_type_error_greeting_with_errors() region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2738,7 +2738,7 @@ async def test_rest_json_foo_error_with_dunder_type_and_namespace_error_greeting region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2774,7 +2774,7 @@ async def test_rest_json_foo_error_with_dunder_type_uri_and_namespace_error_gree region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2811,7 +2811,7 @@ async def test_rest_json_foo_error_with_nested_type_property_error_greeting_with region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2833,11 +2833,11 @@ async def test_rest_json_host_with_path_request_host_with_path_operation() -> No config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/custom", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2906,11 +2906,11 @@ async def test_rest_json_http_checksum_required_request_http_checksum_required() config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2983,11 +2983,11 @@ async def test_rest_json_http_empty_prefix_headers_request_client_request_http_e config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3062,7 +3062,7 @@ async def test_rest_json_http_empty_prefix_headers_response_client_response_http region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3085,11 +3085,11 @@ async def test_rest_json_enum_payload_request_request_http_enum_payload() -> Non config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3159,7 +3159,7 @@ async def test_rest_json_enum_payload_response_response_http_enum_payload() -> N region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3183,11 +3183,11 @@ async def test_rest_json_http_payload_traits_with_blob_request_http_payload_trai config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3258,11 +3258,11 @@ async def test_rest_json_http_payload_traits_with_no_blob_body_request_http_payl config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3335,7 +3335,7 @@ async def test_rest_json_http_payload_traits_with_blob_response_http_payload_tra region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3364,7 +3364,7 @@ async def test_rest_json_http_payload_traits_with_no_blob_body_response_http_pay region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3388,11 +3388,11 @@ async def test_rest_json_http_payload_traits_with_media_type_with_blob_request_h config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3470,7 +3470,7 @@ async def test_rest_json_http_payload_traits_with_media_type_with_blob_response_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3496,11 +3496,11 @@ async def test_rest_json_http_payload_with_structure_request_http_payload_with_s config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3579,7 +3579,7 @@ async def test_rest_json_http_payload_with_structure_response_http_payload_with_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3608,7 +3608,7 @@ async def test_rest_json_http_payload_with_structure_and_empty_response_body_res region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3632,11 +3632,11 @@ async def test_rest_json_http_payload_with_union_request_http_payload_with_union config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3706,11 +3706,11 @@ async def test_rest_json_http_payload_with_unset_union_request_http_payload_with config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3785,7 +3785,7 @@ async def test_rest_json_http_payload_with_union_response_http_payload_with_unio region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3816,7 +3816,7 @@ async def test_rest_json_http_payload_with_unset_union_response_http_payload_wit region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3840,11 +3840,11 @@ async def test_rest_json_http_prefix_headers_are_present_request_http_prefix_hea config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3918,11 +3918,11 @@ async def test_rest_json_http_prefix_headers_are_not_present_request_http_prefix config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3990,11 +3990,11 @@ async def test_rest_json_http_prefix_empty_headers_request_http_prefix_headers() config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4073,7 +4073,7 @@ async def test_rest_json_http_prefix_headers_are_present_response_http_prefix_he region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4104,7 +4104,7 @@ async def test_http_prefix_headers_response_response_http_prefix_headers_in_resp region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4133,11 +4133,11 @@ async def test_http_query_params_only_request_request_http_query_params_only_ope config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4201,11 +4201,11 @@ async def test_http_query_params_only_empty_request_request_http_query_params_on config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4269,11 +4269,11 @@ async def test_rest_json_supports_na_n_float_labels_request_http_request_with_fl config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4341,11 +4341,11 @@ async def test_rest_json_supports_infinity_float_labels_request_http_request_wit config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4413,11 +4413,11 @@ async def test_rest_json_supports_negative_infinity_float_labels_request_http_re config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4485,11 +4485,11 @@ async def test_rest_json_http_request_with_greedy_label_in_path_request_http_req config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4560,11 +4560,11 @@ async def test_rest_json_input_with_headers_and_all_params_request_http_request_ config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4644,11 +4644,11 @@ async def test_rest_json_http_request_label_escaping_request_http_request_with_l config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4728,11 +4728,11 @@ async def test_rest_json_http_request_with_labels_and_timestamp_format_request_h config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4811,11 +4811,11 @@ async def test_rest_json_tolerates_regex_chars_in_segments_request_http_request_ config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4892,7 +4892,7 @@ async def test_rest_json_http_response_code_response_http_response_code() -> Non region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4922,7 +4922,7 @@ async def test_rest_json_http_response_code_with_no_payload_response_http_respon region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4943,11 +4943,11 @@ async def test_rest_json_string_payload_request_request_http_string_payload() -> config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5017,7 +5017,7 @@ async def test_rest_json_string_payload_response_response_http_string_payload() region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5053,7 +5053,7 @@ async def test_rest_json_ignore_query_params_in_response_response_ignore_query_p region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5077,11 +5077,11 @@ async def test_rest_json_input_and_output_with_string_headers_request_input_and_ config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5161,11 +5161,11 @@ async def test_rest_json_input_and_output_with_quoted_string_headers_request_inp config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5237,11 +5237,11 @@ async def test_rest_json_input_and_output_with_numeric_headers_request_input_and config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5327,11 +5327,11 @@ async def test_rest_json_input_and_output_with_boolean_headers_request_input_and config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5409,11 +5409,11 @@ async def test_rest_json_input_and_output_with_timestamp_headers_request_input_a config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5489,11 +5489,11 @@ async def test_rest_json_input_and_output_with_enum_headers_request_input_and_ou config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5568,11 +5568,11 @@ async def test_rest_json_input_and_output_with_int_enum_headers_request_input_an config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5647,11 +5647,11 @@ async def test_rest_json_supports_na_n_float_header_inputs_request_input_and_out config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5724,11 +5724,11 @@ async def test_rest_json_supports_infinity_float_header_inputs_request_input_and config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5801,11 +5801,11 @@ async def test_rest_json_supports_negative_infinity_float_header_inputs_request_ config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5889,7 +5889,7 @@ async def test_rest_json_input_and_output_with_string_headers_response_input_and region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5924,7 +5924,7 @@ async def test_rest_json_input_and_output_with_quoted_string_headers_response_in region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5965,7 +5965,7 @@ async def test_rest_json_input_and_output_with_numeric_headers_response_input_an region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6008,7 +6008,7 @@ async def test_rest_json_input_and_output_with_boolean_headers_response_input_an region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6048,7 +6048,7 @@ async def test_rest_json_input_and_output_with_timestamp_headers_response_input_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6084,7 +6084,7 @@ async def test_rest_json_input_and_output_with_enum_headers_response_input_and_o region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6117,7 +6117,7 @@ async def test_rest_json_input_and_output_with_int_enum_headers_response_input_a region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6148,7 +6148,7 @@ async def test_rest_json_supports_na_n_float_header_outputs_response_input_and_o region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6181,7 +6181,7 @@ async def test_rest_json_supports_infinity_float_header_outputs_response_input_a region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6214,7 +6214,7 @@ async def test_rest_json_supports_negative_infinity_float_header_outputs_respons region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6238,11 +6238,11 @@ async def test_rest_json_json_blobs_request_json_blobs() -> None: config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6317,7 +6317,7 @@ async def test_rest_json_json_blobs_response_json_blobs() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6339,11 +6339,11 @@ async def test_rest_json_json_enums_request_json_enums() -> None: config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6425,7 +6425,7 @@ async def test_rest_json_json_enums_response_json_enums() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6454,11 +6454,11 @@ async def test_rest_json_json_int_enums_request_json_int_enums() -> None: config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6540,7 +6540,7 @@ async def test_rest_json_json_int_enums_response_json_int_enums() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6569,11 +6569,11 @@ async def test_rest_json_lists_request_json_lists() -> None: config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6657,11 +6657,11 @@ async def test_rest_json_lists_empty_request_json_lists() -> None: config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6736,7 +6736,7 @@ async def test_rest_json_lists_response_json_lists() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6781,7 +6781,7 @@ async def test_rest_json_lists_empty_response_json_lists() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6803,11 +6803,11 @@ async def test_rest_json_json_maps_request_json_maps() -> None: config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6880,11 +6880,11 @@ async def test_rest_json_serializes_zero_values_in_maps_request_json_maps() -> N config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6952,11 +6952,11 @@ async def test_rest_json_serializes_dense_set_map_request_json_maps() -> None: config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7031,7 +7031,7 @@ async def test_rest_json_json_maps_response_json_maps() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7065,7 +7065,7 @@ async def test_rest_json_deserializes_zero_values_in_maps_response_json_maps() - region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7096,7 +7096,7 @@ async def test_rest_json_deserializes_dense_set_map_response_json_maps() -> None region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7118,11 +7118,11 @@ async def test_rest_json_json_timestamps_request_json_timestamps() -> None: config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7197,11 +7197,11 @@ async def test_rest_json_json_timestamps_with_date_time_format_request_json_time config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7276,11 +7276,11 @@ async def test_rest_json_json_timestamps_with_date_time_on_target_format_request config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7352,11 +7352,11 @@ async def test_rest_json_json_timestamps_with_epoch_seconds_format_request_json_ config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7431,11 +7431,11 @@ async def test_rest_json_json_timestamps_with_epoch_seconds_on_target_format_req config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7507,11 +7507,11 @@ async def test_rest_json_json_timestamps_with_http_date_format_request_json_time config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7583,11 +7583,11 @@ async def test_rest_json_json_timestamps_with_http_date_on_target_format_request config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7666,7 +7666,7 @@ async def test_rest_json_json_timestamps_response_json_timestamps() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7702,7 +7702,7 @@ async def test_rest_json_json_timestamps_with_date_time_format_response_json_tim region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7738,7 +7738,7 @@ async def test_rest_json_json_timestamps_with_date_time_on_target_format_respons region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7771,7 +7771,7 @@ async def test_rest_json_json_timestamps_with_epoch_seconds_format_response_json region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7807,7 +7807,7 @@ async def test_rest_json_json_timestamps_with_epoch_seconds_on_target_format_res region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7840,7 +7840,7 @@ async def test_rest_json_json_timestamps_with_http_date_format_response_json_tim region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7873,7 +7873,7 @@ async def test_rest_json_json_timestamps_with_http_date_on_target_format_respons region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7897,11 +7897,11 @@ async def test_rest_json_serialize_string_union_value_request_json_unions() -> N config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7971,11 +7971,11 @@ async def test_rest_json_serialize_boolean_union_value_request_json_unions() -> config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8045,11 +8045,11 @@ async def test_rest_json_serialize_number_union_value_request_json_unions() -> N config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8119,11 +8119,11 @@ async def test_rest_json_serialize_blob_union_value_request_json_unions() -> Non config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8193,11 +8193,11 @@ async def test_rest_json_serialize_timestamp_union_value_request_json_unions() - config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8271,11 +8271,11 @@ async def test_rest_json_serialize_enum_union_value_request_json_unions() -> Non config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8345,11 +8345,11 @@ async def test_rest_json_serialize_list_union_value_request_json_unions() -> Non config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8419,11 +8419,11 @@ async def test_rest_json_serialize_map_union_value_request_json_unions() -> None config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8493,11 +8493,11 @@ async def test_rest_json_serialize_structure_union_value_request_json_unions() - config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8569,11 +8569,11 @@ async def test_rest_json_serialize_renamed_structure_union_value_request_json_un config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8645,11 +8645,11 @@ async def test_rest_json_serialize_nested_union_value_request_json_unions() -> N config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8726,7 +8726,7 @@ async def test_rest_json_deserialize_string_union_value_response_json_unions() - region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8755,7 +8755,7 @@ async def test_rest_json_deserialize_boolean_union_value_response_json_unions() region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8784,7 +8784,7 @@ async def test_rest_json_deserialize_number_union_value_response_json_unions() - region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8813,7 +8813,7 @@ async def test_rest_json_deserialize_blob_union_value_response_json_unions() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8844,7 +8844,7 @@ async def test_rest_json_deserialize_timestamp_union_value_response_json_unions( region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8877,7 +8877,7 @@ async def test_rest_json_deserialize_enum_union_value_response_json_unions() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8906,7 +8906,7 @@ async def test_rest_json_deserialize_list_union_value_response_json_unions() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8935,7 +8935,7 @@ async def test_rest_json_deserialize_map_union_value_response_json_unions() -> N region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8968,7 +8968,7 @@ async def test_rest_json_deserialize_structure_union_value_response_json_unions( region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8999,7 +8999,7 @@ async def test_rest_json_deserialize_nested_union_value_response_json_unions() - region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9030,7 +9030,7 @@ async def test_rest_json_deserialize_ignore_type_response_json_unions() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9054,11 +9054,11 @@ async def test_media_type_header_input_base64_request_media_type_header() -> Non config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9129,7 +9129,7 @@ async def test_media_type_header_output_base64_response_media_type_header() -> N region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9156,11 +9156,11 @@ async def test_rest_json_no_input_and_no_output_request_no_input_and_no_output() config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9234,7 +9234,7 @@ async def test_rest_json_no_input_and_no_output_response_no_input_and_no_output( region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9259,11 +9259,11 @@ async def test_rest_json_no_input_and_output_request_no_input_and_output() -> No config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9339,7 +9339,7 @@ async def test_rest_json_no_input_and_output_with_json_response_no_input_and_out region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9369,7 +9369,7 @@ async def test_rest_json_no_input_and_output_no_payload_response_no_input_and_ou region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9396,11 +9396,11 @@ async def test_rest_json_null_and_empty_headers_request_null_and_empty_headers_c config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9468,11 +9468,11 @@ async def test_rest_json_omits_null_query_request_omits_null_serializes_empty_st config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9540,11 +9540,11 @@ async def test_rest_json_serializes_empty_query_value_request_omits_null_seriali config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9612,11 +9612,11 @@ async def test_rest_json_omits_empty_list_query_values_request_omits_serializing config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9693,11 +9693,11 @@ async def test_rest_json_client_populates_default_values_in_input_request_operat config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9768,11 +9768,11 @@ async def test_rest_json_client_skips_top_level_default_values_in_input_request_ config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9843,11 +9843,11 @@ async def test_rest_json_client_uses_explicitly_provided_member_values_over_defa config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9951,11 +9951,11 @@ async def test_rest_json_client_uses_explicitly_provided_values_in_top_level_req config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10033,11 +10033,11 @@ async def test_rest_json_client_ignores_non_top_level_defaults_on_members_with_c config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10114,7 +10114,7 @@ async def test_rest_json_client_populates_defaults_values_when_missing_in_respon region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10176,7 +10176,7 @@ async def test_rest_json_client_ignores_default_values_if_member_values_are_pres region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10229,11 +10229,11 @@ async def test_rest_json_client_populates_nested_default_values_when_missing_req config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10330,7 +10330,7 @@ async def test_rest_json_client_populates_nested_defaults_when_missing_in_respon region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10374,11 +10374,11 @@ async def test_rest_json_input_union_with_unit_member_request_post_player_action config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10455,7 +10455,7 @@ async def test_rest_json_output_union_with_unit_member_response_post_player_acti region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10479,11 +10479,11 @@ async def test_post_union_with_json_name_request1_request_post_union_with_json_n config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10553,11 +10553,11 @@ async def test_post_union_with_json_name_request2_request_post_union_with_json_n config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10627,11 +10627,11 @@ async def test_post_union_with_json_name_request3_request_post_union_with_json_n config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10708,7 +10708,7 @@ async def test_post_union_with_json_name_response1_response_post_union_with_json region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10739,7 +10739,7 @@ async def test_post_union_with_json_name_response2_response_post_union_with_json region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10770,7 +10770,7 @@ async def test_post_union_with_json_name_response3_response_post_union_with_json region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10798,11 +10798,11 @@ async def test_sdk_applied_content_encoding_rest_json1_request_put_with_content_ config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10874,11 +10874,11 @@ async def test_sdk_appended_gzip_after_provided_encoding_rest_json1_request_put_ config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10946,11 +10946,11 @@ async def test_rest_json_query_idempotency_token_auto_fill_request_query_idempot config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -11020,11 +11020,11 @@ async def test_rest_json_query_idempotency_token_auto_fill_is_set_request_query_ config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -11096,11 +11096,11 @@ async def test_rest_json_query_params_string_list_map_request_query_params_as_st config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -11166,11 +11166,11 @@ async def test_rest_json_query_precedence_request_query_precedence() -> None: config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -11238,11 +11238,11 @@ async def test_rest_json_recursive_shapes_request_recursive_shapes() -> None: config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -11327,7 +11327,7 @@ async def test_rest_json_recursive_shapes_response_recursive_shapes() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -11361,11 +11361,11 @@ async def test_rest_json_simple_scalar_properties_request_simple_scalar_properti config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -11449,11 +11449,11 @@ async def test_rest_json_doesnt_serialize_null_structure_values_request_simple_s config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -11523,11 +11523,11 @@ async def test_rest_json_supports_na_n_float_inputs_request_simple_scalar_proper config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -11601,11 +11601,11 @@ async def test_rest_json_supports_infinity_float_inputs_request_simple_scalar_pr config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -11679,11 +11679,11 @@ async def test_rest_json_supports_negative_infinity_float_inputs_request_simple_ config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -11764,7 +11764,7 @@ async def test_rest_json_simple_scalar_properties_response_simple_scalar_propert region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -11806,7 +11806,7 @@ async def test_rest_json_doesnt_deserialize_null_structure_values_response_simpl region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -11837,7 +11837,7 @@ async def test_rest_json_supports_na_n_float_inputs_response_simple_scalar_prope region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -11870,7 +11870,7 @@ async def test_rest_json_supports_infinity_float_inputs_response_simple_scalar_p region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -11903,7 +11903,7 @@ async def test_rest_json_supports_negative_infinity_float_inputs_response_simple region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -11929,11 +11929,11 @@ async def test_rest_json_sparse_lists_serialize_null_request_sparse_json_lists() config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -12012,7 +12012,7 @@ async def test_rest_json_sparse_lists_serialize_null_response_sparse_json_lists( region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -12036,11 +12036,11 @@ async def test_rest_json_sparse_json_maps_request_sparse_json_maps() -> None: config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -12115,11 +12115,11 @@ async def test_rest_json_serializes_sparse_null_map_values_request_sparse_json_m config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -12194,11 +12194,11 @@ async def test_rest_json_serializes_zero_values_in_sparse_maps_request_sparse_js config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -12268,11 +12268,11 @@ async def test_rest_json_serializes_sparse_set_map_request_sparse_json_maps() -> config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -12342,11 +12342,11 @@ async def test_rest_json_serializes_sparse_set_map_and_retains_null_request_spar config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -12421,7 +12421,7 @@ async def test_rest_json_sparse_json_maps_response_sparse_json_maps() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -12457,7 +12457,7 @@ async def test_rest_json_deserializes_sparse_null_map_values_response_sparse_jso region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -12493,7 +12493,7 @@ async def test_rest_json_deserializes_zero_values_in_sparse_maps_response_sparse region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -12526,7 +12526,7 @@ async def test_rest_json_deserializes_sparse_set_map_response_sparse_json_maps() region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -12557,7 +12557,7 @@ async def test_rest_json_deserializes_sparse_set_map_and_retains_null_response_s region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -12581,11 +12581,11 @@ async def test_rest_json_streaming_traits_with_blob_request_streaming_traits() - config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -12656,11 +12656,11 @@ async def test_rest_json_streaming_traits_with_no_blob_body_request_streaming_tr config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -12736,7 +12736,7 @@ async def test_rest_json_streaming_traits_with_blob_response_streaming_traits() region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -12770,7 +12770,7 @@ async def test_rest_json_streaming_traits_with_no_blob_body_response_streaming_t region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -12799,11 +12799,11 @@ async def test_rest_json_streaming_traits_require_length_with_blob_request_strea config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -12874,11 +12874,11 @@ async def test_rest_json_streaming_traits_require_length_with_no_blob_body_reque config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -12946,11 +12946,11 @@ async def test_rest_json_streaming_traits_with_media_type_with_blob_request_stre config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -13028,7 +13028,7 @@ async def test_rest_json_streaming_traits_with_media_type_with_blob_response_str region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -13057,11 +13057,11 @@ async def test_rest_json_test_body_structure_request_test_body_structure() -> No config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -13129,11 +13129,11 @@ async def test_rest_json_http_with_empty_body_request_test_body_structure() -> N config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -13206,11 +13206,11 @@ async def test_rest_json_http_get_with_no_input_request_test_get_no_input_no_pay config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -13278,11 +13278,11 @@ async def test_rest_json_http_get_with_no_modeled_body_request_test_get_no_paylo config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -13350,11 +13350,11 @@ async def test_rest_json_http_get_with_header_member_no_modeled_body_request_tes config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -13422,11 +13422,11 @@ async def test_rest_json_http_with_empty_blob_payload_request_test_payload_blob( config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -13492,11 +13492,11 @@ async def test_rest_json_test_payload_blob_request_test_payload_blob() -> None: config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -13565,11 +13565,11 @@ async def test_rest_json_http_with_empty_structure_payload_request_test_payload_ config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -13639,11 +13639,11 @@ async def test_rest_json_test_payload_structure_request_test_payload_structure() config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -13714,11 +13714,11 @@ async def test_rest_json_http_with_headers_but_no_payload_request_test_payload_s config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -13794,11 +13794,11 @@ async def test_rest_json_http_post_with_no_input_request_test_post_no_input_no_p config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -13866,11 +13866,11 @@ async def test_rest_json_http_post_with_no_modeled_body_request_test_post_no_pay config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -13938,11 +13938,11 @@ async def test_rest_json_http_with_post_header_member_no_modeled_body_request_te config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -14010,11 +14010,11 @@ async def test_rest_json_timestamp_format_headers_request_timestamp_format_heade config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -14113,7 +14113,7 @@ async def test_rest_json_timestamp_format_headers_response_timestamp_format_head region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -14147,11 +14147,11 @@ async def test_rest_json_unit_input_and_output_request_unit_input_and_output() - config=await AsyncRestJsonProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -14225,7 +14225,7 @@ async def test_rest_json_unit_input_and_output_no_output_response_unit_input_and region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) diff --git a/codegen-output/rest-xml-with-namespace/src/restxmlwithnamespace/client.py b/codegen-output/rest-xml-with-namespace/src/restxmlwithnamespace/client.py index 2ad08d019..371f83fb7 100644 --- a/codegen-output/rest-xml-with-namespace/src/restxmlwithnamespace/client.py +++ b/codegen-output/rest-xml-with-namespace/src/restxmlwithnamespace/client.py @@ -6,15 +6,15 @@ import logging from typing import Any, cast +from smithy_aws_core.aio.identity.chain import AsyncIdentityChain from smithy_aws_core.config import ConfigSource from smithy_aws_core.identity import AWSCredentialsIdentity -from smithy_aws_core.identity.chain import IdentityChain -from smithy_core.aio.client import AsyncClient, ClientCall, RequestPipeline +from smithy_core.aio.client import AsyncClient, AsyncClientCall, AsyncRequestPipeline from smithy_core.deserializers import DeserializeableShape from smithy_core.exceptions import ExpectationNotMetError from smithy_core.schemas import APIOperation from smithy_core.serializers import SerializeableShape -from smithy_http.aio.interfaces import HTTPClient +from smithy_http.aio.interfaces import AsyncHTTPClient from smithy_http.plugins import user_agent_plugin from .config import AsyncRestXmlProtocolNamespaceConfig, Plugin @@ -97,12 +97,12 @@ async def _post_setup(self, config: AsyncRestXmlProtocolNamespaceConfig) -> None config_file = await config_context.parsed_profiles() if config_context.profile_source is ConfigSource.OVERRIDE: profile_name = config_context.profile_name - config.aws_credentials_identity_resolver = await IdentityChain.create( + config.aws_credentials_identity_resolver = await AsyncIdentityChain.create( AWSCredentialsIdentity, config_file=config_file, profile_name=profile_name, region_override=config.region, - http_client=cast(HTTPClient | None, config.transport), + http_client=cast(AsyncHTTPClient | None, config.transport), ) async def _prepare_call[I: SerializeableShape, O: DeserializeableShape]( @@ -111,7 +111,7 @@ async def _prepare_call[I: SerializeableShape, O: DeserializeableShape]( operation: APIOperation[I, O], default_plugins: list[Plugin], plugins: list[Plugin] | None, - ) -> tuple[RequestPipeline[Any, Any], ClientCall[I, O]]: + ) -> tuple[AsyncRequestPipeline[Any, Any], AsyncClientCall[I, O]]: if self._closed: raise RuntimeError( "Cannot invoke an operation on a client that has been closed." diff --git a/codegen-output/rest-xml-with-namespace/src/restxmlwithnamespace/config.py b/codegen-output/rest-xml-with-namespace/src/restxmlwithnamespace/config.py index 50b8ed4a2..a4dade1d9 100644 --- a/codegen-output/rest-xml-with-namespace/src/restxmlwithnamespace/config.py +++ b/codegen-output/rest-xml-with-namespace/src/restxmlwithnamespace/config.py @@ -12,24 +12,20 @@ Unpack, ) -from smithy_aws_core.aio.protocols import RestXmlClientProtocol -from smithy_aws_core.auth import SigV4AuthScheme -from smithy_aws_core.config import AwsConfigOverrides, FileSystem -from smithy_aws_core.config.aws_config import AsyncAwsConfig -from smithy_aws_core.config.resolvers import EndpointUriResolver -from smithy_aws_core.config.types import FieldSpec -from smithy_aws_core.endpoints.standard_regional import ( - StandardRegionalEndpointsResolver, +from smithy_aws_core.aio.auth.sigv4 import AsyncSigV4AuthScheme +from smithy_aws_core.aio.config import AsyncFileSystem +from smithy_aws_core.aio.config.aws_config import AsyncAwsConfig, AwsConfigOverrides +from smithy_aws_core.aio.config.resolvers import EndpointUriResolver +from smithy_aws_core.aio.endpoints.standard_regional import ( + AsyncStandardRegionalEndpointsResolver, ) +from smithy_aws_core.aio.protocols import AsyncRestXmlClientProtocol +from smithy_aws_core.config.types import FieldSpec from smithy_aws_core.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ( - ClientProtocol, - EndpointResolver, - ProtocolConstructor, - ProtocolSettings, -) -from smithy_core.aio.interfaces.auth import AuthScheme -from smithy_core.aio.interfaces.identity import IdentityResolver +from smithy_core.aio.interfaces import AsyncClientProtocol, AsyncEndpointResolver +from smithy_core.aio.interfaces.auth import AsyncAuthScheme +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver +from smithy_core.interfaces import ProtocolConstructor, ProtocolSettings from smithy_core.interfaces.auth import AuthSchemeResolver from smithy_core.shapes import ShapeID from smithy_http.aio.aiohttp import AIOHTTPClient @@ -59,11 +55,13 @@ class _AsyncRestXmlProtocolNamespaceConfigOverrides(AwsConfigOverrides, total=False): - endpoint_resolver: EndpointResolver | None + endpoint_resolver: AsyncEndpointResolver | None protocol: ( - ClientProtocol[Any, Any] | ProtocolConstructor[ClientProtocol[Any, Any]] | None + AsyncClientProtocol[Any, Any] + | ProtocolConstructor[AsyncClientProtocol[Any, Any]] + | None ) - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] | None auth_scheme_resolver: AuthSchemeResolver | None @@ -71,17 +69,17 @@ class _AsyncRestXmlProtocolNamespaceConfigOverrides(AwsConfigOverrides, total=Fa class AsyncRestXmlProtocolNamespaceConfig(AsyncAwsConfig): """Rest Xml Protocol Namespace configuration (async-resolved).""" - endpoint_resolver: EndpointResolver | None = None + endpoint_resolver: AsyncEndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - protocol: ClientProtocol[Any, Any] | None = None + protocol: AsyncClientProtocol[Any, Any] | None = None """ Pass a protocol class reference from smithy_aws_core.aio.protocols to - select the protocol, e.g. protocol=AwsJson10ClientProtocol. For custom - protocols a protocol instance may also be passed. + select the protocol, e.g. protocol=AsyncAwsJson10ClientProtocol. For + custom protocols a protocol instance may also be passed. """ interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) @@ -90,7 +88,7 @@ class AsyncRestXmlProtocolNamespaceConfig(AsyncAwsConfig): execution of a request. """ - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] | None = None """A map of auth scheme ids to auth schemes.""" auth_scheme_resolver: AuthSchemeResolver | None = None @@ -100,7 +98,7 @@ class AsyncRestXmlProtocolNamespaceConfig(AsyncAwsConfig): """ aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None ) = None """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" @@ -141,17 +139,17 @@ class AsyncRestXmlProtocolNamespaceConfig(AsyncAwsConfig): default=None, resolver=EndpointUriResolver("rest_xml_protocol_namespace") ), "endpoint_resolver": FieldSpec( - default_factory=lambda: StandardRegionalEndpointsResolver( + default_factory=lambda: AsyncStandardRegionalEndpointsResolver( endpoint_prefix="restxmlwithnamespace" ) ), "protocol": FieldSpec( - default_factory=lambda: RestXmlClientProtocol(_PROTOCOL_SETTINGS), + default_factory=lambda: AsyncRestXmlClientProtocol(_PROTOCOL_SETTINGS), converter=lambda p: p(_PROTOCOL_SETTINGS) if isinstance(p, type) else p, ), "auth_schemes": FieldSpec( default_factory=lambda: { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme( + ShapeID("aws.auth#sigv4"): AsyncSigV4AuthScheme( service="restxmlwithnamespace" ) } @@ -160,7 +158,7 @@ class AsyncRestXmlProtocolNamespaceConfig(AsyncAwsConfig): "transport": FieldSpec(default_factory=lambda: AIOHTTPClient()), } - def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None: + def set_auth_scheme(self, scheme: AsyncAuthScheme[Any, Any, Any, Any]) -> None: """ Set an auth scheme implementation using its scheme ID. :param scheme: The auth scheme to add or replace. @@ -174,7 +172,7 @@ async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] cls, *, profile: str | None = None, - fs: FileSystem | None = None, + fs: AsyncFileSystem | None = None, config_file_path: str | None = None, credentials_file_path: str | None = None, **overrides: Unpack[_AsyncRestXmlProtocolNamespaceConfigOverrides], diff --git a/codegen-output/rest-xml-with-namespace/tests/test_restxml_protocol.py b/codegen-output/rest-xml-with-namespace/tests/test_restxml_protocol.py index 942d8432b..37f76f51f 100644 --- a/codegen-output/rest-xml-with-namespace/tests/test_restxml_protocol.py +++ b/codegen-output/rest-xml-with-namespace/tests/test_restxml_protocol.py @@ -3,8 +3,8 @@ from urllib.parse import parse_qsl from pytest import fail, raises -from smithy_aws_core.identity import StaticCredentialsResolver -from smithy_core.aio.retries import SimpleRetryStrategy +from smithy_aws_core.aio.identity.static import AsyncStaticCredentialsResolver +from smithy_core.aio.retries import AsyncSimpleRetryStrategy from smithy_core.aio.types import AsyncBytesReader from smithy_core.aio.utils import async_list from smithy_http import tuples_to_fields @@ -34,11 +34,11 @@ async def test_xml_namespace_simple_scalar_properties_request_simple_scalar_prop config=await AsyncRestXmlProtocolNamespaceConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -128,7 +128,7 @@ async def test_xml_namespace_simple_scalar_properties_response_simple_scalar_pro region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) diff --git a/codegen-output/rest-xml/src/restxml/client.py b/codegen-output/rest-xml/src/restxml/client.py index 18c18b8e0..df9f05d54 100644 --- a/codegen-output/rest-xml/src/restxml/client.py +++ b/codegen-output/rest-xml/src/restxml/client.py @@ -6,15 +6,15 @@ import logging from typing import Any, cast +from smithy_aws_core.aio.identity.chain import AsyncIdentityChain from smithy_aws_core.config import ConfigSource from smithy_aws_core.identity import AWSCredentialsIdentity -from smithy_aws_core.identity.chain import IdentityChain -from smithy_core.aio.client import AsyncClient, ClientCall, RequestPipeline +from smithy_core.aio.client import AsyncClient, AsyncClientCall, AsyncRequestPipeline from smithy_core.deserializers import DeserializeableShape from smithy_core.exceptions import ExpectationNotMetError from smithy_core.schemas import APIOperation from smithy_core.serializers import SerializeableShape -from smithy_http.aio.interfaces import HTTPClient +from smithy_http.aio.interfaces import AsyncHTTPClient from smithy_http.plugins import user_agent_plugin from .config import AsyncRestXmlProtocolConfig, Plugin @@ -288,12 +288,12 @@ async def _post_setup(self, config: AsyncRestXmlProtocolConfig) -> None: config_file = await config_context.parsed_profiles() if config_context.profile_source is ConfigSource.OVERRIDE: profile_name = config_context.profile_name - config.aws_credentials_identity_resolver = await IdentityChain.create( + config.aws_credentials_identity_resolver = await AsyncIdentityChain.create( AWSCredentialsIdentity, config_file=config_file, profile_name=profile_name, region_override=config.region, - http_client=cast(HTTPClient | None, config.transport), + http_client=cast(AsyncHTTPClient | None, config.transport), ) async def _prepare_call[I: SerializeableShape, O: DeserializeableShape]( @@ -302,7 +302,7 @@ async def _prepare_call[I: SerializeableShape, O: DeserializeableShape]( operation: APIOperation[I, O], default_plugins: list[Plugin], plugins: list[Plugin] | None, - ) -> tuple[RequestPipeline[Any, Any], ClientCall[I, O]]: + ) -> tuple[AsyncRequestPipeline[Any, Any], AsyncClientCall[I, O]]: if self._closed: raise RuntimeError( "Cannot invoke an operation on a client that has been closed." diff --git a/codegen-output/rest-xml/src/restxml/config.py b/codegen-output/rest-xml/src/restxml/config.py index da84db427..217db9cf5 100644 --- a/codegen-output/rest-xml/src/restxml/config.py +++ b/codegen-output/rest-xml/src/restxml/config.py @@ -12,24 +12,20 @@ Unpack, ) -from smithy_aws_core.aio.protocols import RestXmlClientProtocol -from smithy_aws_core.auth import SigV4AuthScheme -from smithy_aws_core.config import AwsConfigOverrides, FileSystem -from smithy_aws_core.config.aws_config import AsyncAwsConfig -from smithy_aws_core.config.resolvers import EndpointUriResolver -from smithy_aws_core.config.types import FieldSpec -from smithy_aws_core.endpoints.standard_regional import ( - StandardRegionalEndpointsResolver, +from smithy_aws_core.aio.auth.sigv4 import AsyncSigV4AuthScheme +from smithy_aws_core.aio.config import AsyncFileSystem +from smithy_aws_core.aio.config.aws_config import AsyncAwsConfig, AwsConfigOverrides +from smithy_aws_core.aio.config.resolvers import EndpointUriResolver +from smithy_aws_core.aio.endpoints.standard_regional import ( + AsyncStandardRegionalEndpointsResolver, ) +from smithy_aws_core.aio.protocols import AsyncRestXmlClientProtocol +from smithy_aws_core.config.types import FieldSpec from smithy_aws_core.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ( - ClientProtocol, - EndpointResolver, - ProtocolConstructor, - ProtocolSettings, -) -from smithy_core.aio.interfaces.auth import AuthScheme -from smithy_core.aio.interfaces.identity import IdentityResolver +from smithy_core.aio.interfaces import AsyncClientProtocol, AsyncEndpointResolver +from smithy_core.aio.interfaces.auth import AsyncAuthScheme +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver +from smithy_core.interfaces import ProtocolConstructor, ProtocolSettings from smithy_core.interfaces.auth import AuthSchemeResolver from smithy_core.shapes import ShapeID from smithy_http.aio.aiohttp import AIOHTTPClient @@ -348,11 +344,13 @@ class _AsyncRestXmlProtocolConfigOverrides(AwsConfigOverrides, total=False): - endpoint_resolver: EndpointResolver | None + endpoint_resolver: AsyncEndpointResolver | None protocol: ( - ClientProtocol[Any, Any] | ProtocolConstructor[ClientProtocol[Any, Any]] | None + AsyncClientProtocol[Any, Any] + | ProtocolConstructor[AsyncClientProtocol[Any, Any]] + | None ) - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] | None auth_scheme_resolver: AuthSchemeResolver | None @@ -360,17 +358,17 @@ class _AsyncRestXmlProtocolConfigOverrides(AwsConfigOverrides, total=False): class AsyncRestXmlProtocolConfig(AsyncAwsConfig): """Rest Xml Protocol configuration (async-resolved).""" - endpoint_resolver: EndpointResolver | None = None + endpoint_resolver: AsyncEndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - protocol: ClientProtocol[Any, Any] | None = None + protocol: AsyncClientProtocol[Any, Any] | None = None """ Pass a protocol class reference from smithy_aws_core.aio.protocols to - select the protocol, e.g. protocol=AwsJson10ClientProtocol. For custom - protocols a protocol instance may also be passed. + select the protocol, e.g. protocol=AsyncAwsJson10ClientProtocol. For + custom protocols a protocol instance may also be passed. """ interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) @@ -379,7 +377,7 @@ class AsyncRestXmlProtocolConfig(AsyncAwsConfig): execution of a request. """ - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] | None = None """A map of auth scheme ids to auth schemes.""" auth_scheme_resolver: AuthSchemeResolver | None = None @@ -389,7 +387,7 @@ class AsyncRestXmlProtocolConfig(AsyncAwsConfig): """ aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None ) = None """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" @@ -430,24 +428,24 @@ class AsyncRestXmlProtocolConfig(AsyncAwsConfig): default=None, resolver=EndpointUriResolver("rest_xml_protocol") ), "endpoint_resolver": FieldSpec( - default_factory=lambda: StandardRegionalEndpointsResolver( + default_factory=lambda: AsyncStandardRegionalEndpointsResolver( endpoint_prefix="restxml" ) ), "protocol": FieldSpec( - default_factory=lambda: RestXmlClientProtocol(_PROTOCOL_SETTINGS), + default_factory=lambda: AsyncRestXmlClientProtocol(_PROTOCOL_SETTINGS), converter=lambda p: p(_PROTOCOL_SETTINGS) if isinstance(p, type) else p, ), "auth_schemes": FieldSpec( default_factory=lambda: { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="restxml") + ShapeID("aws.auth#sigv4"): AsyncSigV4AuthScheme(service="restxml") } ), "auth_scheme_resolver": FieldSpec(default_factory=HTTPAuthSchemeResolver), "transport": FieldSpec(default_factory=lambda: AIOHTTPClient()), } - def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None: + def set_auth_scheme(self, scheme: AsyncAuthScheme[Any, Any, Any, Any]) -> None: """ Set an auth scheme implementation using its scheme ID. :param scheme: The auth scheme to add or replace. @@ -461,7 +459,7 @@ async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] cls, *, profile: str | None = None, - fs: FileSystem | None = None, + fs: AsyncFileSystem | None = None, config_file_path: str | None = None, credentials_file_path: str | None = None, **overrides: Unpack[_AsyncRestXmlProtocolConfigOverrides], diff --git a/codegen-output/rest-xml/tests/test_restxml_protocol.py b/codegen-output/rest-xml/tests/test_restxml_protocol.py index fbc3216d3..121930dfc 100644 --- a/codegen-output/rest-xml/tests/test_restxml_protocol.py +++ b/codegen-output/rest-xml/tests/test_restxml_protocol.py @@ -4,8 +4,8 @@ from urllib.parse import parse_qsl from pytest import fail, mark, raises -from smithy_aws_core.identity import StaticCredentialsResolver -from smithy_core.aio.retries import SimpleRetryStrategy +from smithy_aws_core.aio.identity.static import AsyncStaticCredentialsResolver +from smithy_core.aio.retries import AsyncSimpleRetryStrategy from smithy_core.aio.types import AsyncBytesReader from smithy_core.aio.utils import async_list from smithy_http import tuples_to_fields @@ -159,11 +159,11 @@ async def test_all_query_string_types_request_all_query_string_types() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -292,11 +292,11 @@ async def test_rest_xml_query_string_map_request_all_query_string_types() -> Non config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -370,11 +370,11 @@ async def test_rest_xml_query_string_escaping_request_all_query_string_types() - config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -444,11 +444,11 @@ async def test_rest_xml_supports_na_n_float_query_values_request_all_query_strin config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -518,11 +518,11 @@ async def test_rest_xml_supports_infinity_float_query_values_request_all_query_s config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -592,11 +592,11 @@ async def test_rest_xml_supports_negative_infinity_float_query_values_request_al config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -666,11 +666,11 @@ async def test_rest_xml_zero_and_false_query_values_request_all_query_string_typ config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -736,11 +736,11 @@ async def test_body_with_xml_name_request_body_with_xml_name() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -813,7 +813,7 @@ async def test_body_with_xml_name_response_body_with_xml_name() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -837,11 +837,11 @@ async def test_constant_and_variable_query_string_missing_one_value_request_cons config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -909,11 +909,11 @@ async def test_constant_and_variable_query_string_all_values_request_constant_an config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -979,11 +979,11 @@ async def test_constant_query_string_request_constant_query_string() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1061,7 +1061,7 @@ async def test_rest_xml_date_time_with_negative_offset_response_datetime_offsets region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1097,7 +1097,7 @@ async def test_rest_xml_date_time_with_positive_offset_response_datetime_offsets region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1123,11 +1123,11 @@ async def test_empty_input_and_empty_output_request_empty_input_and_empty_output config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1198,7 +1198,7 @@ async def test_empty_input_and_empty_output_response_empty_input_and_empty_outpu region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1224,11 +1224,11 @@ async def test_rest_xml_endpoint_trait_request_endpoint_operation() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1303,11 +1303,11 @@ async def test_rest_xml_endpoint_trait_with_host_label_and_http_binding_request_ config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1380,11 +1380,11 @@ async def test_rest_xml_endpoint_trait_with_host_label_request_endpoint_with_hos config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1450,11 +1450,11 @@ async def test_flattened_xml_map_request_flattened_xml_map() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1527,7 +1527,7 @@ async def test_flattened_xml_map_response_flattened_xml_map() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1551,11 +1551,11 @@ async def test_flattened_xml_map_with_xml_name_request_flattened_xml_map_with_xm config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1630,7 +1630,7 @@ async def test_flattened_xml_map_with_xml_name_response_flattened_xml_map_with_x region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1664,7 +1664,7 @@ async def test_rest_xml_flattened_xml_map_with_xml_namespace_response_flattened_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1698,7 +1698,7 @@ async def test_rest_xml_date_time_with_fractional_seconds_response_fractional_se region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1730,7 +1730,7 @@ async def test_greeting_with_errors_response_greeting_with_errors() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1759,7 +1759,7 @@ async def test_invalid_greeting_error_error_greeting_with_errors() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1787,7 +1787,7 @@ async def test_complex_error_error_greeting_with_errors() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1811,11 +1811,11 @@ async def test_http_empty_prefix_headers_request_client_request_http_empty_prefi config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1890,7 +1890,7 @@ async def test_http_empty_prefix_headers_response_client_response_http_empty_pre region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1913,11 +1913,11 @@ async def test_rest_xml_enum_payload_request_request_http_enum_payload() -> None config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -1987,7 +1987,7 @@ async def test_rest_xml_enum_payload_response_response_http_enum_payload() -> No region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2009,11 +2009,11 @@ async def test_http_payload_traits_with_blob_request_http_payload_traits() -> No config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2081,11 +2081,11 @@ async def test_http_payload_traits_with_no_blob_body_request_http_payload_traits config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2156,7 +2156,7 @@ async def test_http_payload_traits_with_blob_response_http_payload_traits() -> N region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2185,7 +2185,7 @@ async def test_http_payload_traits_with_no_blob_body_response_http_payload_trait region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2209,11 +2209,11 @@ async def test_http_payload_traits_with_media_type_with_blob_request_http_payloa config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2291,7 +2291,7 @@ async def test_http_payload_traits_with_media_type_with_blob_response_http_paylo region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2320,11 +2320,11 @@ async def test_http_payload_with_member_xml_name_request_http_payload_with_membe config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2404,7 +2404,7 @@ async def test_http_payload_with_member_xml_name_response_http_payload_with_memb region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2430,11 +2430,11 @@ async def test_http_payload_with_structure_request_http_payload_with_structure() config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2511,7 +2511,7 @@ async def test_http_payload_with_structure_response_http_payload_with_structure( region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2537,11 +2537,11 @@ async def test_rest_xml_http_payload_with_union_request_http_payload_with_union( config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2611,11 +2611,11 @@ async def test_rest_xml_http_payload_with_unset_union_request_http_payload_with_ config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2690,7 +2690,7 @@ async def test_rest_xml_http_payload_with_union_response_http_payload_with_union region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2721,7 +2721,7 @@ async def test_rest_xml_http_payload_with_unset_union_response_http_payload_with region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2746,11 +2746,11 @@ async def test_http_payload_with_xml_name_request_http_payload_with_xml_name() - config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2826,7 +2826,7 @@ async def test_http_payload_with_xml_name_response_http_payload_with_xml_name() region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2855,11 +2855,11 @@ async def test_http_payload_with_xml_namespace_request_http_payload_with_xml_nam config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2939,7 +2939,7 @@ async def test_http_payload_with_xml_namespace_response_http_payload_with_xml_na region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -2968,11 +2968,11 @@ async def test_http_payload_with_xml_namespace_and_prefix_request_http_payload_w config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3052,7 +3052,7 @@ async def test_http_payload_with_xml_namespace_and_prefix_response_http_payload_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3076,11 +3076,11 @@ async def test_http_prefix_headers_are_present_request_http_prefix_headers() -> config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3154,11 +3154,11 @@ async def test_http_prefix_headers_are_not_present_request_http_prefix_headers() config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3224,11 +3224,11 @@ async def test_http_prefix_empty_headers_request_http_prefix_headers() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3305,7 +3305,7 @@ async def test_http_prefix_headers_are_present_response_http_prefix_headers() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3336,7 +3336,7 @@ async def test_http_prefix_headers_are_not_present_response_http_prefix_headers( region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3360,11 +3360,11 @@ async def test_rest_xml_supports_na_n_float_labels_request_http_request_with_flo config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3432,11 +3432,11 @@ async def test_rest_xml_supports_infinity_float_labels_request_http_request_with config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3504,11 +3504,11 @@ async def test_rest_xml_supports_negative_infinity_float_labels_request_http_req config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3576,11 +3576,11 @@ async def test_http_request_with_greedy_label_in_path_request_http_request_with_ config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3651,11 +3651,11 @@ async def test_input_with_headers_and_all_params_request_http_request_with_label config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3733,11 +3733,11 @@ async def test_http_request_label_escaping_request_http_request_with_labels() -> config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3817,11 +3817,11 @@ async def test_http_request_with_labels_and_timestamp_format_request_http_reques config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3903,7 +3903,7 @@ async def test_rest_xml_http_response_code_response_http_response_code() -> None region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3924,11 +3924,11 @@ async def test_rest_xml_string_payload_request_request_http_string_payload() -> config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -3998,7 +3998,7 @@ async def test_rest_xml_string_payload_response_response_http_string_payload() - region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4032,7 +4032,7 @@ async def test_ignore_query_params_in_response_response_ignore_query_params_in_r region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4056,11 +4056,11 @@ async def test_input_and_output_with_string_headers_request_input_and_output_wit config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4140,11 +4140,11 @@ async def test_input_and_output_with_numeric_headers_request_input_and_output_wi config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4230,11 +4230,11 @@ async def test_input_and_output_with_boolean_headers_request_input_and_output_wi config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4312,11 +4312,11 @@ async def test_input_and_output_with_timestamp_headers_request_input_and_output_ config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4392,11 +4392,11 @@ async def test_input_and_output_with_enum_headers_request_input_and_output_with_ config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4471,11 +4471,11 @@ async def test_rest_xml_supports_na_n_float_header_inputs_request_input_and_outp config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4548,11 +4548,11 @@ async def test_rest_xml_supports_infinity_float_header_inputs_request_input_and_ config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4625,11 +4625,11 @@ async def test_rest_xml_supports_negative_infinity_float_header_inputs_request_i config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4713,7 +4713,7 @@ async def test_input_and_output_with_string_headers_response_input_and_output_wi region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4756,7 +4756,7 @@ async def test_input_and_output_with_numeric_headers_response_input_and_output_w region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4799,7 +4799,7 @@ async def test_input_and_output_with_boolean_headers_response_input_and_output_w region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4839,7 +4839,7 @@ async def test_input_and_output_with_timestamp_headers_response_input_and_output region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4875,7 +4875,7 @@ async def test_input_and_output_with_enum_headers_response_input_and_output_with region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4906,7 +4906,7 @@ async def test_rest_xml_supports_na_n_float_header_outputs_response_input_and_ou region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4939,7 +4939,7 @@ async def test_rest_xml_supports_infinity_float_header_outputs_response_input_an region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4972,7 +4972,7 @@ async def test_rest_xml_supports_negative_infinity_float_header_outputs_response region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -4996,11 +4996,11 @@ async def test_nested_xml_map_request_request_nested_xml_maps() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5069,11 +5069,11 @@ async def test_flat_nested_xml_map_request_request_nested_xml_maps() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5146,7 +5146,7 @@ async def test_nested_xml_map_response_response_nested_xml_maps() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5178,7 +5178,7 @@ async def test_flat_nested_xml_map_response_response_nested_xml_maps() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5202,11 +5202,11 @@ async def test_nested_xml_map_with_xml_name_serializes_request_nested_xml_map_wi config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5286,7 +5286,7 @@ async def test_nested_xml_map_with_xml_name_deserializes_response_nested_xml_map region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5313,11 +5313,11 @@ async def test_no_input_and_no_output_request_no_input_and_no_output() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5386,7 +5386,7 @@ async def test_no_input_and_no_output_response_no_input_and_no_output() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5408,11 +5408,11 @@ async def test_no_input_and_output_request_no_input_and_output() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5481,7 +5481,7 @@ async def test_no_input_and_output_response_no_input_and_output() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5506,11 +5506,11 @@ async def test_null_and_empty_headers_request_null_and_empty_headers_client() -> config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5578,11 +5578,11 @@ async def test_rest_xml_omits_null_query_request_omits_null_serializes_empty_str config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5650,11 +5650,11 @@ async def test_rest_xml_serializes_empty_string_request_omits_null_serializes_em config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5726,11 +5726,11 @@ async def test_sdk_applied_content_encoding_rest_xml_request_put_with_content_en config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5802,11 +5802,11 @@ async def test_sdk_appended_gzip_after_provided_encoding_rest_xml_request_put_wi config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5874,11 +5874,11 @@ async def test_query_idempotency_token_auto_fill_request_query_idempotency_token config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -5948,11 +5948,11 @@ async def test_query_idempotency_token_auto_fill_is_set_request_query_idempotenc config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6024,11 +6024,11 @@ async def test_rest_xml_query_params_string_list_map_request_query_params_as_str config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6094,11 +6094,11 @@ async def test_rest_xml_query_precedence_request_query_precedence() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6166,11 +6166,11 @@ async def test_recursive_shapes_request_recursive_shapes() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6253,7 +6253,7 @@ async def test_recursive_shapes_response_recursive_shapes() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6285,11 +6285,11 @@ async def test_simple_scalar_properties_request_simple_scalar_properties() -> No config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6371,11 +6371,11 @@ async def test_simple_scalar_properties_with_escaped_character_request_simple_sc config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6446,11 +6446,11 @@ async def test_simple_scalar_properties_with_white_space_request_simple_scalar_p config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6523,11 +6523,11 @@ async def test_simple_scalar_properties_pure_white_space_request_simple_scalar_p config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6598,11 +6598,11 @@ async def test_rest_xml_supports_na_n_float_inputs_request_simple_scalar_propert config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6672,11 +6672,11 @@ async def test_rest_xml_supports_infinity_float_inputs_request_simple_scalar_pro config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6746,11 +6746,11 @@ async def test_rest_xml_supports_negative_infinity_float_inputs_request_simple_s config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6825,7 +6825,7 @@ async def test_simple_scalar_properties_response_simple_scalar_properties() -> N region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6874,7 +6874,7 @@ async def test_simple_scalar_properties_complex_escapes_response_simple_scalar_p region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6907,7 +6907,7 @@ async def test_simple_scalar_properties_with_escaped_character_response_simple_s region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6941,7 +6941,7 @@ async def test_simple_scalar_properties_with_xml_preamble_response_simple_scalar region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -6972,7 +6972,7 @@ async def test_simple_scalar_properties_with_white_space_response_simple_scalar_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7005,7 +7005,7 @@ async def test_simple_scalar_properties_pure_white_space_response_simple_scalar_ region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7036,7 +7036,7 @@ async def test_rest_xml_supports_na_n_float_outputs_response_simple_scalar_prope region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7069,7 +7069,7 @@ async def test_rest_xml_supports_infinity_float_outputs_response_simple_scalar_p region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7102,7 +7102,7 @@ async def test_rest_xml_supports_negative_infinity_float_outputs_response_simple region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7126,11 +7126,11 @@ async def test_timestamp_format_headers_request_timestamp_format_headers() -> No config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7227,7 +7227,7 @@ async def test_timestamp_format_headers_response_timestamp_format_headers() -> N region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7257,11 +7257,11 @@ async def test_xml_attributes_request_xml_attributes() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7330,11 +7330,11 @@ async def test_xml_attributes_with_escaping_request_xml_attributes() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7407,7 +7407,7 @@ async def test_xml_attributes_response_xml_attributes() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7432,11 +7432,11 @@ async def test_xml_attributes_in_middle_request_xml_attributes_in_middle() -> No config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7516,7 +7516,7 @@ async def test_xml_attributes_in_middle_response_xml_attributes_in_middle() -> N region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7542,11 +7542,11 @@ async def test_xml_attributes_on_payload_request_xml_attributes_on_payload() -> config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7621,7 +7621,7 @@ async def test_xml_attributes_on_payload_response_xml_attributes_on_payload() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7645,11 +7645,11 @@ async def test_xml_blobs_request_xml_blobs() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7724,7 +7724,7 @@ async def test_xml_blobs_response_xml_blobs() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7753,7 +7753,7 @@ async def test_xml_empty_blobs_response_xml_empty_blobs() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7782,7 +7782,7 @@ async def test_xml_empty_self_closed_blobs_response_xml_empty_blobs() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7804,11 +7804,11 @@ async def test_xml_empty_lists_request_xml_empty_lists() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7881,7 +7881,7 @@ async def test_xml_empty_lists_response_xml_empty_lists() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7903,11 +7903,11 @@ async def test_xml_empty_maps_request_xml_empty_maps() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -7982,7 +7982,7 @@ async def test_xml_empty_maps_response_xml_empty_maps() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8011,7 +8011,7 @@ async def test_xml_empty_self_closed_maps_response_xml_empty_maps() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8033,11 +8033,11 @@ async def test_xml_empty_strings_request_xml_empty_strings() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8110,7 +8110,7 @@ async def test_xml_empty_strings_response_xml_empty_strings() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8139,7 +8139,7 @@ async def test_xml_empty_self_closed_strings_response_xml_empty_strings() -> Non region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8161,11 +8161,11 @@ async def test_xml_enums_request_xml_enums() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8245,7 +8245,7 @@ async def test_xml_enums_response_xml_enums() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8274,11 +8274,11 @@ async def test_xml_int_enums_request_xml_int_enums() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8358,7 +8358,7 @@ async def test_xml_int_enums_response_xml_int_enums() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8387,11 +8387,11 @@ async def test_xml_lists_request_xml_lists() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8487,7 +8487,7 @@ async def test_xml_lists_response_xml_lists() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8534,11 +8534,11 @@ async def test_xml_maps_request_xml_maps() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8613,7 +8613,7 @@ async def test_xml_maps_response_xml_maps() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8637,11 +8637,11 @@ async def test_xml_maps_xml_name_request_xml_maps_xml_name() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8716,7 +8716,7 @@ async def test_xml_maps_xml_name_response_xml_maps_xml_name() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8745,11 +8745,11 @@ async def test_rest_xml_xml_map_with_xml_namespace_request_xml_map_with_xml_name config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8827,7 +8827,7 @@ async def test_rest_xml_xml_map_with_xml_namespace_response_xml_map_with_xml_nam region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8849,11 +8849,11 @@ async def test_xml_namespaces_request_xml_namespaces() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8928,7 +8928,7 @@ async def test_xml_namespaces_response_xml_namespaces() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -8952,11 +8952,11 @@ async def test_xml_timestamps_request_xml_timestamps() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9027,11 +9027,11 @@ async def test_xml_timestamps_with_date_time_format_request_xml_timestamps() -> config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9104,11 +9104,11 @@ async def test_xml_timestamps_with_date_time_on_target_format_request_xml_timest config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9178,11 +9178,11 @@ async def test_xml_timestamps_with_epoch_seconds_format_request_xml_timestamps() config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9255,11 +9255,11 @@ async def test_xml_timestamps_with_epoch_seconds_on_target_format_request_xml_ti config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9327,11 +9327,11 @@ async def test_xml_timestamps_with_http_date_format_request_xml_timestamps() -> config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9401,11 +9401,11 @@ async def test_xml_timestamps_with_http_date_on_target_format_request_xml_timest config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9480,7 +9480,7 @@ async def test_xml_timestamps_response_xml_timestamps() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9514,7 +9514,7 @@ async def test_xml_timestamps_with_date_time_format_response_xml_timestamps() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9550,7 +9550,7 @@ async def test_xml_timestamps_with_date_time_on_target_format_response_xml_times region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9583,7 +9583,7 @@ async def test_xml_timestamps_with_epoch_seconds_format_response_xml_timestamps( region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9619,7 +9619,7 @@ async def test_xml_timestamps_with_epoch_seconds_on_target_format_response_xml_t region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9650,7 +9650,7 @@ async def test_xml_timestamps_with_http_date_format_response_xml_timestamps() -> region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9683,7 +9683,7 @@ async def test_xml_timestamps_with_http_date_on_target_format_response_xml_times region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9707,11 +9707,11 @@ async def test_xml_unions_with_struct_member_request_xml_unions() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9790,11 +9790,11 @@ async def test_xml_unions_with_string_member_request_xml_unions() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9860,11 +9860,11 @@ async def test_xml_unions_with_boolean_member_request_xml_unions() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -9930,11 +9930,11 @@ async def test_xml_unions_with_union_member_request_xml_unions() -> None: config=await AsyncRestXmlProtocolConfig.resolve( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10009,7 +10009,7 @@ async def test_xml_unions_with_struct_member_response_xml_unions() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10051,7 +10051,7 @@ async def test_xml_unions_with_string_member_response_xml_unions() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10082,7 +10082,7 @@ async def test_xml_unions_with_boolean_member_response_xml_unions() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) @@ -10111,7 +10111,7 @@ async def test_xml_unions_with_union_member_response_xml_unions() -> None: region="us-east-1", aws_access_key_id="test-access-key-id", aws_secret_access_key="test-secret-access-key", - aws_credentials_identity_resolver=StaticCredentialsResolver(), + aws_credentials_identity_resolver=AsyncStaticCredentialsResolver(), ) ) diff --git a/codegen-output/rpcv2-cbor/src/rpcv2cbor/client.py b/codegen-output/rpcv2-cbor/src/rpcv2cbor/client.py index a2a187ceb..0afc2b410 100644 --- a/codegen-output/rpcv2-cbor/src/rpcv2cbor/client.py +++ b/codegen-output/rpcv2-cbor/src/rpcv2cbor/client.py @@ -6,7 +6,7 @@ import logging from typing import Any -from smithy_core.aio.client import AsyncClient, ClientCall, RequestPipeline +from smithy_core.aio.client import AsyncClient, AsyncClientCall, AsyncRequestPipeline from smithy_core.deserializers import DeserializeableShape from smithy_core.exceptions import ExpectationNotMetError from smithy_core.schemas import APIOperation @@ -129,7 +129,7 @@ async def _prepare_call[I: SerializeableShape, O: DeserializeableShape]( operation: APIOperation[I, O], default_plugins: list[Plugin], plugins: list[Plugin] | None, - ) -> tuple[RequestPipeline[Any, Any], ClientCall[I, O]]: + ) -> tuple[AsyncRequestPipeline[Any, Any], AsyncClientCall[I, O]]: if self._closed: raise RuntimeError( "Cannot invoke an operation on a client that has been closed." diff --git a/codegen-output/rpcv2-cbor/src/rpcv2cbor/config.py b/codegen-output/rpcv2-cbor/src/rpcv2cbor/config.py index 7347dab38..5cf736f42 100644 --- a/codegen-output/rpcv2-cbor/src/rpcv2cbor/config.py +++ b/codegen-output/rpcv2-cbor/src/rpcv2cbor/config.py @@ -3,25 +3,23 @@ from dataclasses import dataclass from typing import Any, Callable, TYPE_CHECKING, TypeAlias, Union, cast -from smithy_aws_core.endpoints.standard_regional import ( - StandardRegionalEndpointsResolver, +from smithy_aws_core.aio.endpoints.standard_regional import ( + AsyncStandardRegionalEndpointsResolver, ) from smithy_core.aio.interfaces import ( - ClientProtocol, - ClientTransport, - EndpointResolver, - ProtocolConstructor, - ProtocolSettings, + AsyncClientProtocol, + AsyncClientTransport, + AsyncEndpointResolver, ) -from smithy_core.aio.interfaces.auth import AuthScheme -from smithy_core.aio.interfaces.retries import RetryStrategy +from smithy_core.aio.interfaces.auth import AsyncAuthScheme +from smithy_core.aio.interfaces.retries import AsyncRetryStrategy from smithy_core.auth import DefaultAuthResolver -from smithy_core.interfaces import URI +from smithy_core.interfaces import ProtocolConstructor, ProtocolSettings, URI from smithy_core.interfaces.auth import AuthSchemeResolver from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.aiohttp import AIOHTTPClient -from smithy_http.aio.protocols import RpcV2CborClientProtocol +from smithy_http.aio.protocols import AsyncRpcV2CborClientProtocol from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import RPC_V2_PROTOCOL @@ -98,10 +96,10 @@ class Config: operation. """ - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] + auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] """A map of auth scheme ids to auth schemes.""" - endpoint_resolver: EndpointResolver + endpoint_resolver: AsyncEndpointResolver """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. @@ -119,11 +117,11 @@ class Config: execution of a request. """ - protocol: ClientProtocol[Any, Any] | None + protocol: AsyncClientProtocol[Any, Any] | None """ Pass a protocol class reference from smithy_aws_core.aio.protocols to - select the protocol, e.g. protocol=AwsJson10ClientProtocol. For custom - protocols a protocol instance may also be passed. + select the protocol, e.g. protocol=AsyncAwsJson10ClientProtocol. For + custom protocols a protocol instance may also be passed. """ region: str | None @@ -132,7 +130,7 @@ class Config: the service endpoint. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + retry_strategy: AsyncRetryStrategy | RetryStrategyOptions | None """ The retry strategy or options for configuring retry behavior. Can be either a configured RetryStrategy or RetryStrategyOptions to create one. @@ -144,11 +142,11 @@ class Config: header. """ - transport: ClientTransport[Any, Any] | None + transport: AsyncClientTransport[Any, Any] | None """ The transport to use to send requests (e.g. an HTTP client). Operations - with bidirectional event streams require a DuplexClientTransport, such - as AWSCRTHTTPClient. Transports are assumed not to support duplex + with bidirectional event streams require a AsyncDuplexClientTransport, + such as AWSCRTHTTPClient. Transports are assumed not to support duplex streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. """ @@ -159,24 +157,25 @@ def __init__( self, *, auth_scheme_resolver: AuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - endpoint_resolver: EndpointResolver | None = None, + auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] | None = None, + endpoint_resolver: AsyncEndpointResolver | None = None, endpoint_uri: str | URI | None = None, http_request_config: HTTPRequestConfiguration | None = None, interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] - | ProtocolConstructor[ClientProtocol[Any, Any]] + protocol: AsyncClientProtocol[Any, Any] + | ProtocolConstructor[AsyncClientProtocol[Any, Any]] | None = None, region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, + retry_strategy: AsyncRetryStrategy | RetryStrategyOptions | None = None, sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, + transport: AsyncClientTransport[Any, Any] | None = None, user_agent_extra: str | None = None, ): self.auth_scheme_resolver = auth_scheme_resolver or DefaultAuthResolver() self.auth_schemes = auth_schemes or {} - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="RpcV2Protocol" + self.endpoint_resolver = ( + endpoint_resolver + or AsyncStandardRegionalEndpointsResolver(endpoint_prefix="RpcV2Protocol") ) self.endpoint_uri = endpoint_uri self.http_request_config = http_request_config @@ -184,8 +183,8 @@ def __init__( if isinstance(protocol, type): protocol = protocol(_PROTOCOL_SETTINGS) self.protocol = cast( - "ClientProtocol[Any, Any]", protocol - ) or RpcV2CborClientProtocol(_PROTOCOL_SETTINGS) + "AsyncClientProtocol[Any, Any]", protocol + ) or AsyncRpcV2CborClientProtocol(_PROTOCOL_SETTINGS) self.region = region self.retry_strategy = retry_strategy self.sdk_ua_app_id = sdk_ua_app_id diff --git a/codegen-output/rpcv2-cbor/tests/test_rpcv2cbor_protocol.py b/codegen-output/rpcv2-cbor/tests/test_rpcv2cbor_protocol.py index 4441920fa..b0bbd17f3 100644 --- a/codegen-output/rpcv2-cbor/tests/test_rpcv2cbor_protocol.py +++ b/codegen-output/rpcv2-cbor/tests/test_rpcv2cbor_protocol.py @@ -7,7 +7,7 @@ from pytest import fail, mark, raises from smithy_cbor import loads as _cbor_loads -from smithy_core.aio.retries import SimpleRetryStrategy +from smithy_core.aio.retries import AsyncSimpleRetryStrategy from smithy_core.aio.types import AsyncBytesReader from smithy_core.aio.utils import async_list from smithy_http import tuples_to_fields @@ -68,7 +68,7 @@ async def test_empty_input_request_empty_input_output() -> None: config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -467,7 +467,7 @@ async def test_no_input_request_no_input_output() -> None: config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -625,7 +625,7 @@ async def test_rpc_v2_cbor_client_populates_default_values_in_input_request_oper config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -709,7 +709,7 @@ async def test_rpc_v2_cbor_client_skips_top_level_default_values_in_input_reques config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -791,7 +791,7 @@ async def test_rpc_v2_cbor_client_uses_explicitly_provided_member_values_over_de config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -903,7 +903,7 @@ async def test_rpc_v2_cbor_client_uses_explicitly_provided_values_in_top_level_r config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -992,7 +992,7 @@ async def test_rpc_v2_cbor_client_ignores_non_top_level_defaults_on_members_with config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -1188,7 +1188,7 @@ async def test_optional_input_request_optional_input_output() -> None: config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -1295,7 +1295,7 @@ async def test_rpc_v2_cbor_recursive_shapes_request_recursive_shapes() -> None: config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -1471,7 +1471,7 @@ async def test_rpc_v2_cbor_maps_request_rpc_v2_cbor_dense_maps() -> None: config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -1559,7 +1559,7 @@ async def test_rpc_v2_cbor_serializes_zero_values_in_maps_request_rpc_v2_cbor_de config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -1644,7 +1644,7 @@ async def test_rpc_v2_cbor_serializes_dense_set_map_request_rpc_v2_cbor_dense_ma config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -1822,7 +1822,7 @@ async def test_rpc_v2_cbor_lists_request_rpc_v2_cbor_lists() -> None: config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -1919,7 +1919,7 @@ async def test_rpc_v2_cbor_lists_empty_request_rpc_v2_cbor_lists() -> None: config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -1999,7 +1999,7 @@ async def test_rpc_v2_cbor_lists_empty_using_definite_length_request_rpc_v2_cbor config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -2234,7 +2234,7 @@ async def test_rpc_v2_cbor_sparse_maps_request_rpc_v2_cbor_sparse_maps() -> None config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -2322,7 +2322,7 @@ async def test_rpc_v2_cbor_serializes_null_map_values_request_rpc_v2_cbor_sparse config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -2410,7 +2410,7 @@ async def test_rpc_v2_cbor_serializes_sparse_set_map_request_rpc_v2_cbor_sparse_ config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -2493,7 +2493,7 @@ async def test_rpc_v2_cbor_serializes_sparse_set_map_and_retains_null_request_rp config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -2578,7 +2578,7 @@ async def test_rpc_v2_cbor_serializes_zero_values_in_sparse_maps_request_rpc_v2_ config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -2829,7 +2829,7 @@ async def test_rpc_v2_cbor_serializes_union_value_request_rpc_v2_cbor_unions() - config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -2914,7 +2914,7 @@ async def test_rpc_v2_cbor_serializes_nested_union_value_request_rpc_v2_cbor_uni config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -3073,7 +3073,7 @@ async def test_rpc_v2_cbor_simple_scalar_properties_request_simple_scalar_proper config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -3167,7 +3167,7 @@ async def test_rpc_v2_cbor_client_doesnt_serialize_null_structure_values_request config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -3248,7 +3248,7 @@ async def test_rpc_v2_cbor_supports_na_n_float_inputs_request_simple_scalar_prop config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -3333,7 +3333,7 @@ async def test_rpc_v2_cbor_supports_infinity_float_inputs_request_simple_scalar_ config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -3418,7 +3418,7 @@ async def test_rpc_v2_cbor_supports_negative_infinity_float_inputs_request_simpl config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -3811,7 +3811,7 @@ async def test_rpc_v2_cbor_sparse_maps_serialize_null_values_request_sparse_null config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) @@ -3894,7 +3894,7 @@ async def test_rpc_v2_cbor_sparse_lists_serialize_null_request_sparse_nulls_oper config=Config( endpoint_uri="https://example.com/", transport=RequestTestHTTPClient(), - retry_strategy=SimpleRetryStrategy(max_attempts=1), + retry_strategy=AsyncSimpleRetryStrategy(max_attempts=1), ) ) diff --git a/codegen/aws/core/src/it/java/software/amazon/smithy/python/codegen/test/AwsCodegenTest.java b/codegen/aws/core/src/it/java/software/amazon/smithy/python/codegen/test/AwsCodegenTest.java index b5519b0d2..e447fa3d0 100644 --- a/codegen/aws/core/src/it/java/software/amazon/smithy/python/codegen/test/AwsCodegenTest.java +++ b/codegen/aws/core/src/it/java/software/amazon/smithy/python/codegen/test/AwsCodegenTest.java @@ -50,7 +50,7 @@ public void testCodegen(@TempDir Path tempDir) throws IOException { assertTrue(config.contains( "interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: [])")); assertTrue(config.contains( - "def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None:")); + "def set_auth_scheme(self, scheme: AsyncAuthScheme[Any, Any, Any, Any]) -> None:")); assertTrue(config.contains("auth_schemes = dict(self.auth_schemes or {})")); assertTrue(config.contains("auth_schemes[scheme.scheme_id] = scheme")); assertTrue(config.contains("self.auth_schemes = auth_schemes")); diff --git a/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsAsyncConfigIntegration.java b/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsAsyncConfigIntegration.java index a2dcb8234..6fc34c56a 100644 --- a/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsAsyncConfigIntegration.java +++ b/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsAsyncConfigIntegration.java @@ -109,17 +109,17 @@ public void write(PythonWriter writer, String previousText, AsyncConfigSection s var asyncAwsConfigSymbol = Symbol.builder() .name("AsyncAwsConfig") - .namespace("smithy_aws_core.config.aws_config", ".") + .namespace("smithy_aws_core.aio.config.aws_config", ".") .addDependency(AwsPythonDependency.SMITHY_AWS_CORE) .build(); var awsConfigOverridesSymbol = Symbol.builder() .name("AwsConfigOverrides") - .namespace("smithy_aws_core.config", ".") + .namespace("smithy_aws_core.aio.config.aws_config", ".") .addDependency(AwsPythonDependency.SMITHY_AWS_CORE) .build(); var fileSystemSymbol = Symbol.builder() - .name("FileSystem") - .namespace("smithy_aws_core.config", ".") + .name("AsyncFileSystem") + .namespace("smithy_aws_core.aio.config", ".") .addDependency(AwsPythonDependency.SMITHY_AWS_CORE) .build(); var fieldSpecSymbol = Symbol.builder() @@ -128,9 +128,9 @@ public void write(PythonWriter writer, String previousText, AsyncConfigSection s .addDependency(AwsPythonDependency.SMITHY_AWS_CORE) .build(); var protocolSymbol = Symbol.builder() - .name("ClientProtocol[Any, Any]") + .name("AsyncClientProtocol[Any, Any]") .addReference(Symbol.builder() - .name("ClientProtocol") + .name("AsyncClientProtocol") .namespace("smithy_core.aio.interfaces", ".") .addDependency(SmithyPythonDependency.SMITHY_CORE) .build()) @@ -138,22 +138,22 @@ public void write(PythonWriter writer, String previousText, AsyncConfigSection s // The override accepts a protocol class in addition to an instance; the // resolved dataclass field is always an instance, so it uses protocolSymbol. var protocolInputSymbol = Symbol.builder() - .name("ClientProtocol[Any, Any] | ProtocolConstructor[ClientProtocol[Any, Any]]") + .name("AsyncClientProtocol[Any, Any] | ProtocolConstructor[AsyncClientProtocol[Any, Any]]") .addReference(Symbol.builder() - .name("ClientProtocol") + .name("AsyncClientProtocol") .namespace("smithy_core.aio.interfaces", ".") .addDependency(SmithyPythonDependency.SMITHY_CORE) .build()) .addReference(Symbol.builder() .name("ProtocolConstructor") - .namespace("smithy_core.aio.interfaces", ".") + .namespace("smithy_core.interfaces", ".") .addDependency(SmithyPythonDependency.SMITHY_CORE) .build()) .build(); var authSchemeSymbol = Symbol.builder() - .name("AuthScheme[Any, Any, Any, Any]") + .name("AsyncAuthScheme[Any, Any, Any, Any]") .addReference(Symbol.builder() - .name("AuthScheme") + .name("AsyncAuthScheme") .namespace("smithy_core.aio.interfaces.auth", ".") .addDependency(SmithyPythonDependency.SMITHY_CORE) .build()) @@ -210,7 +210,7 @@ public void write(PythonWriter writer, String previousText, AsyncConfigSection s writer.write("protocol: $T | None = None", protocolSymbol); writer.writeDocs("Pass a protocol class reference from smithy_aws_core.aio.protocols " - + "to select the protocol, e.g. protocol=AwsJson10ClientProtocol. For custom " + + "to select the protocol, e.g. protocol=AsyncAwsJson10ClientProtocol. For custom " + "protocols a protocol instance may also be passed.", context); writer.write(""); @@ -260,7 +260,7 @@ public void write(PythonWriter writer, String previousText, AsyncConfigSection s // endpoint_uri FieldSpec — overrides base class with service-aware resolver var endpointUriResolverSymbol = Symbol.builder() .name("EndpointUriResolver") - .namespace("smithy_aws_core.config.resolvers", ".") + .namespace("smithy_aws_core.aio.config.resolvers", ".") .addDependency(AwsPythonDependency.SMITHY_AWS_CORE) .build(); var snakeCaseServiceId = serviceId.replace(" ", "_").toLowerCase(); diff --git a/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsAuthIntegration.java b/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsAuthIntegration.java index 71f3d31cf..57cf90e3f 100644 --- a/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsAuthIntegration.java +++ b/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsAuthIntegration.java @@ -45,10 +45,10 @@ public List getClientPlugins(GenerationContext context) { .name("aws_credentials_identity_resolver") .documentation("Resolves AWS Credentials. Required for operations that use Sigv4 Auth.") .type(Symbol.builder() - .name("IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties]") + .name("AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties]") .addReference(Symbol.builder() .addDependency(SmithyPythonDependency.SMITHY_CORE) - .name("IdentityResolver") + .name("AsyncIdentityResolver") .namespace("smithy_core.aio.interfaces.identity", ".") .build()) .addReference(Symbol.builder() @@ -176,8 +176,8 @@ public Symbol getAuthOptionGenerator(GenerationContext context) { @Override public Symbol getAuthSchemeSymbol(GenerationContext context) { return Symbol.builder() - .name("SigV4AuthScheme") - .namespace("smithy_aws_core.auth", ".") + .name("AsyncSigV4AuthScheme") + .namespace("smithy_aws_core.aio.auth.sigv4", ".") .addDependency(AwsPythonDependency.SMITHY_AWS_CORE) .build(); } diff --git a/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsIdentityIntegration.java b/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsIdentityIntegration.java index cf6ec2ad3..0e2170a9b 100644 --- a/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsIdentityIntegration.java +++ b/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsIdentityIntegration.java @@ -69,8 +69,8 @@ public void write(PythonWriter writer, String previousText, ClientSetupSection s http_client=cast($3T | None, config.transport), )""", Symbol.builder() - .name("IdentityChain") - .namespace("smithy_aws_core.identity.chain", ".") + .name("AsyncIdentityChain") + .namespace("smithy_aws_core.aio.identity.chain", ".") .addDependency(AwsPythonDependency.SMITHY_AWS_CORE) .build(), Symbol.builder() @@ -79,7 +79,7 @@ public void write(PythonWriter writer, String previousText, ClientSetupSection s .addDependency(AwsPythonDependency.SMITHY_AWS_CORE) .build(), Symbol.builder() - .name("HTTPClient") + .name("AsyncHTTPClient") .namespace("smithy_http.aio.interfaces", ".") .addDependency(SmithyPythonDependency.SMITHY_HTTP) .build(), diff --git a/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsJson10ProtocolGenerator.java b/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsJson10ProtocolGenerator.java index 2e601574d..f91e1b1d6 100644 --- a/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsJson10ProtocolGenerator.java +++ b/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsJson10ProtocolGenerator.java @@ -53,8 +53,8 @@ public ApplicationProtocol getApplicationProtocol(GenerationContext context) { @Override public void initializeProtocol(GenerationContext context, PythonWriter writer) { writer.addDependency(AwsPythonDependency.SMITHY_AWS_CORE.withOptionalDependencies("json")); - writer.addImport("smithy_aws_core.aio.protocols", "AwsJson10ClientProtocol"); - writer.write("AwsJson10ClientProtocol(_PROTOCOL_SETTINGS)"); + writer.addImport("smithy_aws_core.aio.protocols", "AsyncAwsJson10ClientProtocol"); + writer.write("AsyncAwsJson10ClientProtocol(_PROTOCOL_SETTINGS)"); } @Override diff --git a/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsJson11ProtocolGenerator.java b/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsJson11ProtocolGenerator.java index f7793aacc..8453d5252 100644 --- a/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsJson11ProtocolGenerator.java +++ b/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsJson11ProtocolGenerator.java @@ -47,8 +47,8 @@ public ApplicationProtocol getApplicationProtocol(GenerationContext context) { @Override public void initializeProtocol(GenerationContext context, PythonWriter writer) { writer.addDependency(AwsPythonDependency.SMITHY_AWS_CORE.withOptionalDependencies("json")); - writer.addImport("smithy_aws_core.aio.protocols", "AwsJson11ClientProtocol"); - writer.write("AwsJson11ClientProtocol(_PROTOCOL_SETTINGS)"); + writer.addImport("smithy_aws_core.aio.protocols", "AsyncAwsJson11ClientProtocol"); + writer.write("AsyncAwsJson11ClientProtocol(_PROTOCOL_SETTINGS)"); } @Override diff --git a/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsRuntimeTypes.java b/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsRuntimeTypes.java index 6cdc8e90d..b226c8337 100644 --- a/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsRuntimeTypes.java +++ b/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/AwsRuntimeTypes.java @@ -19,22 +19,22 @@ public final class AwsRuntimeTypes { // smithy_aws_core.aio.protocols public static final Symbol AWS_QUERY_CLIENT_PROTOCOL = createSymbol( "aio.protocols", - "AwsQueryClientProtocol"); + "AsyncAwsQueryClientProtocol"); // smithy_aws_core.aio.protocols public static final Symbol EC2_QUERY_CLIENT_PROTOCOL = createSymbol( "aio.protocols", - "Ec2QueryClientProtocol"); + "AsyncEc2QueryClientProtocol"); // smithy_aws_core.aio.protocols public static final Symbol REST_XML_CLIENT_PROTOCOL = createSymbol( "aio.protocols", - "RestXmlClientProtocol"); + "AsyncRestXmlClientProtocol"); - // smithy_aws_core.endpoints.standard_regional + // smithy_aws_core.aio.endpoints.standard_regional public static final Symbol STANDARD_REGIONAL_ENDPOINTS_RESOLVER = createSymbol( - "endpoints.standard_regional", - "StandardRegionalEndpointsResolver"); + "aio.endpoints.standard_regional", + "AsyncStandardRegionalEndpointsResolver"); private AwsRuntimeTypes() {} diff --git a/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/customizations/dynamodb/AwsDynamoDbRetryIntegration.java b/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/customizations/dynamodb/AwsDynamoDbRetryIntegration.java index 6b225a4c0..4459b3e0a 100644 --- a/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/customizations/dynamodb/AwsDynamoDbRetryIntegration.java +++ b/codegen/aws/core/src/main/java/software/amazon/smithy/python/aws/codegen/customizations/dynamodb/AwsDynamoDbRetryIntegration.java @@ -85,11 +85,11 @@ public List getClientPlugins(GenerationContext context) { .build(); final Symbol standardRetryStrategy = Symbol.builder() .namespace("smithy_core.aio.retries", ".") - .name("StandardRetryStrategy") + .name("AsyncStandardRetryStrategy") .build(); final Symbol adaptiveRetryStrategy = Symbol.builder() .namespace("smithy_core.aio.retries", ".") - .name("AdaptiveRetryStrategy") + .name("AsyncAdaptiveRetryStrategy") .build(); final Symbol configSource = Symbol.builder() .namespace("smithy_aws_core.config", ".") diff --git a/codegen/core/src/main/java/software/amazon/smithy/python/codegen/RuntimeTypes.java b/codegen/core/src/main/java/software/amazon/smithy/python/codegen/RuntimeTypes.java index 6d476eb91..89eded9fd 100644 --- a/codegen/core/src/main/java/software/amazon/smithy/python/codegen/RuntimeTypes.java +++ b/codegen/core/src/main/java/software/amazon/smithy/python/codegen/RuntimeTypes.java @@ -85,11 +85,11 @@ public final class RuntimeTypes { public static final Symbol RETRY_STRATEGY_OPTIONS = createSymbol("retries", "RetryStrategyOptions", SmithyPythonDependency.SMITHY_CORE); public static final Symbol SIMPLE_RETRY_STRATEGY = - createSymbol("aio.retries", "SimpleRetryStrategy", SmithyPythonDependency.SMITHY_CORE); + createSymbol("aio.retries", "AsyncSimpleRetryStrategy", SmithyPythonDependency.SMITHY_CORE); // smithy_core.aio.interfaces.retries public static final Symbol RETRY_STRATEGY = - createSymbol("aio.interfaces.retries", "RetryStrategy", SmithyPythonDependency.SMITHY_CORE); + createSymbol("aio.interfaces.retries", "AsyncRetryStrategy", SmithyPythonDependency.SMITHY_CORE); // smithy_core.types public static final Symbol UNKNOWN_ENUM_MIXIN = @@ -101,29 +101,29 @@ public final class RuntimeTypes { // smithy_core.aio.client public static final Symbol CLIENT_CALL = - createSymbol("aio.client", "ClientCall", SmithyPythonDependency.SMITHY_CORE); + createSymbol("aio.client", "AsyncClientCall", SmithyPythonDependency.SMITHY_CORE); public static final Symbol REQUEST_PIPELINE = - createSymbol("aio.client", "RequestPipeline", SmithyPythonDependency.SMITHY_CORE); + createSymbol("aio.client", "AsyncRequestPipeline", SmithyPythonDependency.SMITHY_CORE); public static final Symbol ASYNC_CLIENT = createSymbol("aio.client", "AsyncClient", SmithyPythonDependency.SMITHY_CORE); // smithy_core.aio.eventstream public static final Symbol DUPLEX_EVENT_STREAM = - createSymbol("aio.eventstream", "DuplexEventStream", SmithyPythonDependency.SMITHY_CORE); + createSymbol("aio.eventstream", "AsyncDuplexEventStream", SmithyPythonDependency.SMITHY_CORE); public static final Symbol INPUT_EVENT_STREAM = - createSymbol("aio.eventstream", "InputEventStream", SmithyPythonDependency.SMITHY_CORE); + createSymbol("aio.eventstream", "AsyncInputEventStream", SmithyPythonDependency.SMITHY_CORE); public static final Symbol OUTPUT_EVENT_STREAM = - createSymbol("aio.eventstream", "OutputEventStream", SmithyPythonDependency.SMITHY_CORE); + createSymbol("aio.eventstream", "AsyncOutputEventStream", SmithyPythonDependency.SMITHY_CORE); // smithy_core.aio.interfaces public static final Symbol ASYNC_BYTE_STREAM = createSymbol("aio.interfaces", "AsyncByteStream", SmithyPythonDependency.SMITHY_CORE); public static final Symbol ENDPOINT_RESOLVER = - createSymbol("aio.interfaces", "EndpointResolver", SmithyPythonDependency.SMITHY_CORE); + createSymbol("aio.interfaces", "AsyncEndpointResolver", SmithyPythonDependency.SMITHY_CORE); // smithy_core.aio.endpoints public static final Symbol STATIC_ENDPOINT_RESOLVER = - createSymbol("aio.endpoints", "StaticEndpointResolver", SmithyPythonDependency.SMITHY_CORE); + createSymbol("aio.endpoints", "AsyncStaticEndpointResolver", SmithyPythonDependency.SMITHY_CORE); // smithy_core.aio.types public static final Symbol ASYNC_BYTES_READER = @@ -164,30 +164,30 @@ public final class RuntimeTypes { // smithy_http.aio.identity.apikey public static final Symbol API_KEY_IDENTITY_RESOLVER = - createSymbol("aio.identity.apikey", "APIKeyIdentityResolver", SmithyPythonDependency.SMITHY_HTTP); + createSymbol("aio.identity.apikey", "AsyncAPIKeyIdentityResolver", SmithyPythonDependency.SMITHY_HTTP); // smithy_aws_core.aio.protocols public static final Symbol REST_JSON_CLIENT_PROTOCOL = createSymbol( "aio.protocols", - "RestJsonClientProtocol", + "AsyncRestJsonClientProtocol", SmithyPythonDependency.SMITHY_AWS_CORE); - // smithy_core.aio.interfaces + // smithy_core.interfaces public static final Symbol PROTOCOL_SETTINGS = createSymbol( - "aio.interfaces", + "interfaces", "ProtocolSettings", SmithyPythonDependency.SMITHY_CORE); // smithy_http.aio.protocols public static final Symbol RPC_V2_CBOR_CLIENT_PROTOCOL = createSymbol( "aio.protocols", - "RpcV2CborClientProtocol", + "AsyncRpcV2CborClientProtocol", SmithyPythonDependency.SMITHY_HTTP); - // smithy_aws_core.identity + // smithy_aws_core.aio.identity.static public static final Symbol STATIC_CREDENTIALS_RESOLVER = createSymbol( - "identity", - "StaticCredentialsResolver", + "aio.identity.static", + "AsyncStaticCredentialsResolver", SmithyPythonDependency.SMITHY_AWS_CORE); private RuntimeTypes() {} diff --git a/codegen/core/src/main/java/software/amazon/smithy/python/codegen/generators/ConfigGenerator.java b/codegen/core/src/main/java/software/amazon/smithy/python/codegen/generators/ConfigGenerator.java index e6a2b51d6..2a388c7f8 100644 --- a/codegen/core/src/main/java/software/amazon/smithy/python/codegen/generators/ConfigGenerator.java +++ b/codegen/core/src/main/java/software/amazon/smithy/python/codegen/generators/ConfigGenerator.java @@ -55,9 +55,9 @@ public final class ConfigGenerator implements Runnable { ConfigProperty.builder() .name("retry_strategy") .type(Symbol.builder() - .name("RetryStrategy | RetryStrategyOptions") + .name("AsyncRetryStrategy | RetryStrategyOptions") .addReference(Symbol.builder() - .name("RetryStrategy") + .name("AsyncRetryStrategy") .namespace("smithy_core.aio.interfaces.retries", ".") .addDependency(SmithyPythonDependency.SMITHY_CORE) .build()) @@ -123,48 +123,48 @@ private static List getProtocolProperties(GenerationContext cont var protocolBuilder = ConfigProperty.builder() .name("protocol") .type(Symbol.builder() - .name("ClientProtocol[Any, Any]") + .name("AsyncClientProtocol[Any, Any]") .addReference(Symbol.builder() - .name("ClientProtocol") + .name("AsyncClientProtocol") .namespace("smithy_core.aio.interfaces", ".") .build()) .build()) .inputType(Symbol.builder() - .name("ClientProtocol[Any, Any] | ProtocolConstructor[ClientProtocol[Any, Any]]") + .name("AsyncClientProtocol[Any, Any] | ProtocolConstructor[AsyncClientProtocol[Any, Any]]") .addReference(Symbol.builder() - .name("ClientProtocol") + .name("AsyncClientProtocol") .namespace("smithy_core.aio.interfaces", ".") .build()) .addReference(Symbol.builder() .name("ProtocolConstructor") - .namespace("smithy_core.aio.interfaces", ".") + .namespace("smithy_core.interfaces", ".") .addDependency(SmithyPythonDependency.SMITHY_CORE) .build()) .build()) .documentation("Pass a protocol class reference from smithy_aws_core.aio.protocols " - + "to select the protocol, e.g. protocol=AwsJson10ClientProtocol. For custom " + + "to select the protocol, e.g. protocol=AsyncAwsJson10ClientProtocol. For custom " + "protocols a protocol instance may also be passed.") .initialize(w -> { w.addStdlibImport("typing", "cast"); w.write(""" if isinstance(protocol, type): protocol = protocol(_PROTOCOL_SETTINGS) - self.protocol = cast("ClientProtocol[Any, Any]", protocol) or ${C|}""", + self.protocol = cast("AsyncClientProtocol[Any, Any]", protocol) or ${C|}""", w.consumer(writer -> context.protocolGenerator().initializeProtocol(context, writer))); }); var transportBuilder = ConfigProperty.builder() .name("transport") .type(Symbol.builder() - .name("ClientTransport[Any, Any]") + .name("AsyncClientTransport[Any, Any]") .addReference(Symbol.builder() - .name("ClientTransport") + .name("AsyncClientTransport") .namespace("smithy_core.aio.interfaces", ".") .build()) .build()) .documentation("The transport to use to send requests (e.g. an HTTP client). " + "Operations with bidirectional event streams require a " - + "DuplexClientTransport, such as AWSCRTHTTPClient. Transports are " + + "AsyncDuplexClientTransport, such as AWSCRTHTTPClient. Transports are " + "assumed not to support duplex streaming unless they explicitly set " + "SUPPORTS_DUPLEX_STREAMING to True."); @@ -209,14 +209,14 @@ private static List getAuthProperties(GenerationContext context, ConfigProperty.builder() .name("auth_schemes") .type(Symbol.builder() - .name("dict[ShapeID, AuthScheme[Any, Any, Any, Any]]") + .name("dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]]") .addReference(Symbol.builder() .name("ShapeID") .namespace("smithy_core.shapes", ".") .addDependency(SmithyPythonDependency.SMITHY_CORE) .build()) .addReference(Symbol.builder() - .name("AuthScheme") + .name("AsyncAuthScheme") .namespace("smithy_core.aio.interfaces.auth", ".") .addDependency(SmithyPythonDependency.SMITHY_CORE) .build()) @@ -506,7 +506,7 @@ public void write(PythonWriter writer, String previousText, ConfigSection sectio // Note that this is indented to keep it at the proper indentation level. writer.write(""" - def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None: + def set_auth_scheme(self, scheme: AsyncAuthScheme[Any, Any, Any, Any]) -> None: \""" Sets the implementation of an auth scheme. diff --git a/codegen/core/src/main/java/software/amazon/smithy/python/codegen/integrations/HttpApiKeyAuth.java b/codegen/core/src/main/java/software/amazon/smithy/python/codegen/integrations/HttpApiKeyAuth.java index a3d796d9c..82a45f4c8 100644 --- a/codegen/core/src/main/java/software/amazon/smithy/python/codegen/integrations/HttpApiKeyAuth.java +++ b/codegen/core/src/main/java/software/amazon/smithy/python/codegen/integrations/HttpApiKeyAuth.java @@ -43,21 +43,21 @@ public List getClientPlugins(GenerationContext context) { .name("api_key_identity_resolver") .documentation("Resolves the API key.") .type(Symbol.builder() - .name("IdentityResolver[APIKeyIdentity, APIKeyIdentityProperties]") + .name("AsyncIdentityResolver[APIKeyIdentity, APIKeyIdentityProperties]") .addReference(Symbol.builder() .addDependency(SmithyPythonDependency.SMITHY_CORE) - .name("IdentityResolver") + .name("AsyncIdentityResolver") .namespace("smithy_core.aio.interfaces.identity", ".") .build()) .addReference(Symbol.builder() .addDependency(SmithyPythonDependency.SMITHY_HTTP) .name("APIKeyIdentity") - .namespace("smithy_http.aio.identity.apikey", ".") + .namespace("smithy_http.identity", ".") .build()) .addReference(Symbol.builder() .addDependency(SmithyPythonDependency.SMITHY_HTTP) .name("APIKeyIdentityProperties") - .namespace("smithy_http.aio.identity.apikey", ".") + .namespace("smithy_http.identity", ".") .build()) .build()) .initialize(writer -> { @@ -141,7 +141,7 @@ public Symbol getAuthOptionGenerator(GenerationContext context) { @Override public Symbol getAuthSchemeSymbol(GenerationContext context) { return Symbol.builder() - .name("APIKeyAuthScheme") + .name("AsyncAPIKeyAuthScheme") .namespace("smithy_http.aio.auth.apikey", ".") .addDependency(SmithyPythonDependency.SMITHY_HTTP) .build(); diff --git a/packages/smithy-aws-core/.changes/next-release/smithy-aws-core-breaking-39a8d215b72348559b3c198d28a490de.json b/packages/smithy-aws-core/.changes/next-release/smithy-aws-core-breaking-39a8d215b72348559b3c198d28a490de.json new file mode 100644 index 000000000..ea4f0c737 --- /dev/null +++ b/packages/smithy-aws-core/.changes/next-release/smithy-aws-core-breaking-39a8d215b72348559b3c198d28a490de.json @@ -0,0 +1,4 @@ +{ + "type": "breaking", + "description": "Moved async implementations to `smithy_aws_core.aio` and added the `Async` prefix to their names, for example `AsyncAwsJson10ClientProtocol`, `AsyncSigV4AuthScheme`, `AsyncIdentityChain`, `AsyncAwsConfig` and the credential resolvers (`AsyncContainerCredentialsResolver`, `AsyncIMDSCredentialsResolver`, `AsyncProcessCredentialsResolver`). The unprefixed names are reserved for sync implementations, and some, like `StaticCredentialsResolver`, are already sync. Update imports to the `aio` paths." +} \ No newline at end of file diff --git a/packages/smithy-aws-core/pyproject.toml b/packages/smithy-aws-core/pyproject.toml index b4683ca95..b3952f5a7 100644 --- a/packages/smithy-aws-core/pyproject.toml +++ b/packages/smithy-aws-core/pyproject.toml @@ -38,12 +38,12 @@ dependencies = [ "Code" = "https://github.com/smithy-lang/smithy-python/blob/develop/packages/smithy-aws-core/" "Issue tracker" = "https://github.com/smithy-lang/smithy-python/issues" -[project.entry-points."smithy_aws_core.identity.chain_providers"] -Environment = "smithy_aws_core.identity.chain.providers.environment:EnvironmentCredentialsProvider" -SharedConfig = "smithy_aws_core.identity.chain.providers.shared_config:SharedConfigProvider" -ProfileSessionKeys = "smithy_aws_core.identity.chain.providers.profile:ProfileSessionCredentialsProvider" -ProfileStaticKeys = "smithy_aws_core.identity.chain.providers.profile:ProfileStaticCredentialsProvider" -ProfileCredentialProcess = "smithy_aws_core.identity.chain.providers.process:ProfileCredentialProcessProvider" +[project.entry-points."smithy_aws_core.aio.identity.chain_providers"] +Environment = "smithy_aws_core.aio.identity.chain.providers.environment:AsyncEnvironmentCredentialsProvider" +SharedConfig = "smithy_aws_core.aio.identity.chain.providers.shared_config:AsyncSharedConfigProvider" +ProfileSessionKeys = "smithy_aws_core.aio.identity.chain.providers.profile:AsyncProfileSessionCredentialsProvider" +ProfileStaticKeys = "smithy_aws_core.aio.identity.chain.providers.profile:AsyncProfileStaticCredentialsProvider" +ProfileCredentialProcess = "smithy_aws_core.aio.identity.chain.providers.process:AsyncProfileCredentialProcessProvider" [build-system] requires = ["hatchling"] diff --git a/packages/smithy-aws-core/src/smithy_aws_core/aio/auth/__init__.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/auth/__init__.py new file mode 100644 index 000000000..33cbe867a --- /dev/null +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/auth/__init__.py @@ -0,0 +1,2 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 diff --git a/packages/smithy-aws-core/src/smithy_aws_core/aio/auth/sigv4.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/auth/sigv4.py new file mode 100644 index 000000000..0905bb639 --- /dev/null +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/auth/sigv4.py @@ -0,0 +1,132 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +import re +from typing import TYPE_CHECKING, Protocol, Self + +from aws_sdk_signers import AsyncEventSigner, AsyncSigV4Signer, SigV4SigningProperties +from smithy_core.aio.interfaces.auth import ( + AsyncAuthScheme, + AsyncSigner, +) +from smithy_core.aio.interfaces.auth import ( + AsyncEventSigner as AsyncEventSignerProtocol, +) +from smithy_core.exceptions import SmithyIdentityError +from smithy_core.interfaces import TypedProperties as _TypedProperties +from smithy_core.types import PropertyKey +from smithy_http.aio.interfaces import HTTPRequest + +from ...identity import ( + AWS_IDENTITY_CONFIG, + AWSCredentialsIdentity, + AWSIdentityProperties, +) +from ...traits import SigV4Trait +from ..identity import AsyncAWSCredentialsResolver + +if TYPE_CHECKING: + from smithy_aws_event_stream.events import EventHeaderEncoder + +try: + from smithy_aws_event_stream.events import EventHeaderEncoder + + HAS_EVENT_STREAM = True +except ImportError: + HAS_EVENT_STREAM = False # type: ignore + + +class SigV4Config(Protocol): + region: str | None + aws_credentials_identity_resolver: AsyncAWSCredentialsResolver | None + + +SIGV4_CONFIG = PropertyKey(key="config", value_type=SigV4Config) + +type SigV4Signer = AsyncSigner[ + HTTPRequest, AWSCredentialsIdentity, SigV4SigningProperties +] + + +class AsyncSigV4AuthScheme( + AsyncAuthScheme[ + HTTPRequest, + AWSCredentialsIdentity, + AWSIdentityProperties, + SigV4SigningProperties, + ] +): + """SigV4 AsyncAuthScheme.""" + + scheme_id = SigV4Trait.id + _signer: SigV4Signer + + def __init__( + self, + *, + service: str, + signer: SigV4Signer | None = None, + ) -> None: + """Constructor. + + :param identity_resolver: The identity resolver to extract the api key identity. + :param signer: The signer used to sign the request. + """ + # TODO: There are type mismatches in the signature of the "sign" method. + # The issues seems to be that it's not using protocols in its signature + self._signer = signer or AsyncSigV4Signer() # type: ignore + self._service = service + + def identity_properties( + self, *, context: _TypedProperties + ) -> AWSIdentityProperties: + config = context[AWS_IDENTITY_CONFIG] + return { + "access_key_id": config.aws_access_key_id, + "secret_access_key": config.aws_secret_access_key, + "session_token": config.aws_session_token, + } + + def identity_resolver( + self, *, context: _TypedProperties + ) -> AsyncAWSCredentialsResolver: + config = context.get(SIGV4_CONFIG) + if config is None or config.aws_credentials_identity_resolver is None: + raise SmithyIdentityError( + "Attempted to use SigV4 auth, but aws_credentials_identity_resolver was not " + "set on the config." + ) + return config.aws_credentials_identity_resolver + + def signer_properties(self, *, context: _TypedProperties) -> SigV4SigningProperties: + config = context.get(SIGV4_CONFIG) + if config is None or config.region is None: + raise SmithyIdentityError( + "Attempted to use SigV4 auth, but region was not set on the config." + ) + return { + "region": config.region, + "service": self._service, + } + + def signer(self) -> SigV4Signer: + return self._signer + + def event_signer( + self, *, request: HTTPRequest + ) -> ( + AsyncEventSignerProtocol[AWSCredentialsIdentity, SigV4SigningProperties] | None + ): + if not HAS_EVENT_STREAM: + return None + + auth_value = request.fields["Authorization"].as_string() + signature: str = re.split("Signature=", auth_value)[-1] + + return AsyncEventSigner( + initial_signature=signature.encode("utf-8"), + event_encoder_cls=EventHeaderEncoder, + ) + + @classmethod + def from_trait(cls, trait: SigV4Trait, /) -> Self: + return cls(service=trait.name) diff --git a/packages/smithy-aws-core/src/smithy_aws_core/aio/config/__init__.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/config/__init__.py new file mode 100644 index 000000000..bcc9eb007 --- /dev/null +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/config/__init__.py @@ -0,0 +1,15 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +from .aws_config import AsyncAwsConfig, AwsConfigOverrides +from .context import AsyncSharedConfigContext, load_config_async +from .filesystem import AsyncDefaultFileSystem, AsyncFileSystem + +__all__ = [ + "AsyncAwsConfig", + "AsyncDefaultFileSystem", + "AsyncFileSystem", + "AsyncSharedConfigContext", + "AwsConfigOverrides", + "load_config_async", +] diff --git a/packages/smithy-aws-core/src/smithy_aws_core/aio/config/aws_config.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/config/aws_config.py new file mode 100644 index 000000000..17b246183 --- /dev/null +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/config/aws_config.py @@ -0,0 +1,464 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +from collections.abc import Mapping +from copy import deepcopy +from dataclasses import dataclass, field, fields +from typing import TYPE_CHECKING, Any, ClassVar, Self, TypedDict, Unpack + +from smithy_core.retries import RetryStrategyOptions, RetryStrategyType + +if TYPE_CHECKING: + from smithy_core.aio.interfaces import AsyncClientTransport + from smithy_core.aio.interfaces.identity import AsyncIdentityResolver + from smithy_core.aio.interfaces.retries import AsyncRetryStrategy + from smithy_core.interfaces import URI + from smithy_http.interfaces import HTTPRequestConfiguration + + from smithy_aws_core.identity.components import ( + AWSCredentialsIdentity, + AWSIdentityProperties, + ) + +from ...config.exceptions import ConfigError, ConfigValidationError +from ...config.types import UNSET, ConfigSource, FieldSpec, Resolved +from ...config.validators import ( + validate_max_attempts, + validate_profile, + validate_region, + validate_retry_mode, +) +from .context import AsyncSharedConfigContext +from .filesystem import AsyncFileSystem +from .resolvers import ( + resolve_endpoint_uri, + resolve_max_attempts, + resolve_region, + resolve_retry_mode, + resolve_sdk_ua_app_id, +) + +_CREDENTIAL_FIELDS = ("aws_access_key_id", "aws_secret_access_key", "aws_session_token") + + +class AwsConfigOverrides(TypedDict, total=False): + """Common keyword overrides accepted by AWS config resolution.""" + + region: str | None + retry_mode: RetryStrategyType | None + max_attempts: int | None + endpoint_uri: "str | URI | None" + aws_access_key_id: str | None + aws_secret_access_key: str | None + aws_session_token: str | None + aws_credentials_identity_resolver: ( + "AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None" + ) + sdk_ua_app_id: str | None + user_agent_extra: str | None + interceptors: list[Any] + http_request_config: "HTTPRequestConfiguration | None" + transport: "AsyncClientTransport[Any, Any] | None" + retry_strategy: "AsyncRetryStrategy | RetryStrategyOptions | None" + + +@dataclass(kw_only=True, init=False) +class AsyncAwsConfig: + """Base configuration class for all AWS services. + + Fields are resolved asynchronously from multiple sources (env vars, + config files, defaults) through the resolve() classmethod. + + Do not instantiate directly — use: + config = await AsyncAwsConfig.resolve() + """ + + region: str | None = None + """The AWS region to connect to. + """ + + retry_mode: RetryStrategyType | None = None + """The retry mode to use. Accepted overrides are ``standard`` and ``adaptive``. + + ``legacy`` is rejected when set here; when it comes from the environment or a + config file it warns and falls back to ``standard``. + """ + + max_attempts: int | None = None + """The maximum number of attempts to make per request, including the initial + attempt. Must be an integer of at least 1.""" + + endpoint_uri: "str | URI | None" = None + """A static URI to route requests to.""" + + aws_access_key_id: str | None = field(default=None, repr=False) + """The identifier for a secret access key. + + Set this together with ``aws_secret_access_key`` to supply credentials in + code. Cannot be modified after resolution; see + ``aws_credentials_identity_resolver`` to supply credentials dynamically. + """ + + aws_secret_access_key: str | None = field(default=None, repr=False) + """A secret access key that can be used to sign requests. + + Must be set together with ``aws_access_key_id``. + """ + + aws_session_token: str | None = field(default=None, repr=False) + """The session token used with temporary AWS credentials. + + Set this together with ``aws_access_key_id`` and ``aws_secret_access_key`` + when supplying temporary credentials in code. + """ + + aws_credentials_identity_resolver: "AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None" = None + """Resolves AWS Credentials. + + Set automatically to a ``StaticCredentialsResolver`` when + ``aws_access_key_id`` and ``aws_secret_access_key`` are supplied in code. + """ + + sdk_ua_app_id: str | None = None + """A unique and opaque application ID that is appended to the User-Agent + header.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + interceptors: list[Any] = field(default_factory=list) # type: ignore + """The list of interceptors, which are hooks that are called during the + execution of a request.""" + + http_request_config: "HTTPRequestConfiguration | None" = None + """Configuration for individual HTTP requests.""" + + transport: "AsyncClientTransport[Any, Any] | None" = None + """The transport to use to send requests""" + + retry_strategy: Any | None = None + """The retry strategy or options for configuring retry behavior. + """ + + _ctx: AsyncSharedConfigContext | None = field( + default=None, repr=False, compare=False + ) + _sources: dict[str, ConfigSource] = field( # type: ignore[assignment] + default_factory=dict, + repr=False, + compare=False, + ) + + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "region": FieldSpec( + default=None, + resolver=resolve_region, + validator=validate_region, + ), + "retry_mode": FieldSpec( + default=RetryStrategyOptions.retry_mode, + resolver=resolve_retry_mode, + validator=validate_retry_mode, + ), + "max_attempts": FieldSpec( + default=RetryStrategyOptions.max_attempts, + resolver=resolve_max_attempts, + validator=validate_max_attempts, + ), + "endpoint_uri": FieldSpec( + default=None, + resolver=resolve_endpoint_uri, + ), + "aws_access_key_id": FieldSpec( + default=None, + ), + "aws_secret_access_key": FieldSpec( + default=None, + ), + "aws_session_token": FieldSpec( + default=None, + ), + "aws_credentials_identity_resolver": FieldSpec( + default=None, + ), + "sdk_ua_app_id": FieldSpec( + default=None, + resolver=resolve_sdk_ua_app_id, + ), + "user_agent_extra": FieldSpec( + default=None, + ), + "interceptors": FieldSpec( + default_factory=list, + ), + "http_request_config": FieldSpec( + default=None, + ), + "transport": FieldSpec( + default=None, + ), + "retry_strategy": FieldSpec( + default=None, + ), + } + + def __repr__(self) -> str: + """Render the config without exposing credential material. + + Defined on the base class so that every subclass inherits the + filtering, rather than relying on each subclass to mark its own + credential fields ``repr=False``. Subclasses must be declared with + ``@dataclass(repr=False)`` so they inherit this instead of generating + their own ``__repr__``. + """ + rendered = ", ".join( + f"{f.name}={getattr(self, f.name)!r}" + for f in fields(self) + if f.repr and f.name not in _CREDENTIAL_FIELDS + ) + return f"{type(self).__name__}({rendered})" + + def __init__(self, *args: object, **kwargs: object) -> None: + """Block direct construction without advertising config fields as parameters.""" + raise ConfigError( + f"{type(self).__name__} cannot be constructed directly. " + f"Use `await {type(self).__name__}.resolve(...)` instead." + ) + + @classmethod + async def resolve( + cls, + *, + profile: str | None = None, + fs: AsyncFileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[AwsConfigOverrides], + ) -> Self: + """Resolve a config object from environment, config files, and defaults. + + This is the only supported way to create a config instance. + + :param profile: Override the active profile name. + :param fs: Override the filesystem abstraction. + :param config_file_path: Override path for config file. + :param credentials_file_path: Override path for credentials file. + :param overrides: Explicit field values that skip resolution. + :returns: A fully-resolved config instance. + :raises ProfileNotFoundError: If a profile is requested via ``profile`` or + the ``AWS_PROFILE`` environment variable but is not defined in the + config files. + """ + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) + + @classmethod + async def _resolve( + cls, + *, + profile: str | None, + fs: AsyncFileSystem | None, + config_file_path: str | None, + credentials_file_path: str | None, + overrides: Mapping[str, object], + ) -> Self: + """Internal resolution entry point for generated typed config factories.""" + ctx = AsyncSharedConfigContext( + profile_name=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + ) + + # Fail fast on a bad profile when one was provided (not the default) + profile_source = ctx.profile_source + if profile_source is not ConfigSource.DEFAULT: + config_file = await ctx.parsed_profiles() + validate_profile(ctx.profile_name, config_file.profiles, profile_source) + + # Create the instance without calling the blocked constructor + instance = cls._create_instance() + instance._ctx = ctx + + # Resolve each field + await instance._resolve_fields(dict(overrides)) + + return instance + + def source_of(self, field_name: str) -> ConfigSource | None: + """Get the source that provided a field's value. + + :param field_name: The config field name. + :returns: The ConfigSource, or None if not tracked. + """ + return self._sources.get(field_name) + + def resolution_context(self) -> AsyncSharedConfigContext | None: + """Get the resolution context used to create this config. + + :returns: The AsyncSharedConfigContext, or None if not available. + """ + return self._ctx + + @classmethod + def _create_instance(cls) -> Self: + """Create an instance that bypasses construction blocking.""" + instance = object.__new__(cls) + object.__setattr__(instance, "_sources", {}) + object.__setattr__(instance, "_ctx", None) + for field_name in cls._FIELDS: + object.__setattr__(instance, field_name, UNSET) + return instance + + async def _resolve_fields(self, overrides: dict[str, Any]) -> None: + """Run the resolution pipeline for all fields.""" + unknown = set(overrides) - set(self._FIELDS) + if unknown: + raise ConfigValidationError( + f"Unknown config field(s): {sorted(unknown)}. " + f"Valid fields are: {sorted(self._FIELDS)}" + ) + + # Validate credential overrides and auto-wire the identity resolver + # before the field loop, so the loop sees the resolver as an override. + self._resolve_credentials(overrides) + + for field_name, spec in self._FIELDS.items(): + # check for overrides first + if field_name in overrides: + value = overrides[field_name] + if spec.converter is not None: + value = spec.converter(value) + setattr(self, field_name, value) + self._sources[field_name] = ConfigSource.OVERRIDE + # check in resolver + elif spec.resolver is not None: + result: Resolved[Any] = await spec.resolver(self._ctx) + if result.value is not UNSET: + setattr(self, field_name, result.value) + self._sources[field_name] = result.source + else: + # If resolver returned UNSET, fall back to default + self._apply_default(field_name, spec) + + else: + # No resolver, use default directly + self._apply_default(field_name, spec) + + # Run validator for all sources + if spec.validator is not None: + spec.validator(getattr(self, field_name)) + + def _apply_default(self, field_name: str, spec: FieldSpec) -> None: + """Apply the default value for a field.""" + if spec.default_factory is not None: + value = spec.default_factory() + else: + value = spec.default + setattr(self, field_name, value) + self._sources[field_name] = ConfigSource.DEFAULT + + def _resolve_credentials(self, overrides: dict[str, Any]) -> None: + """Validate in-code credentials and auto-wire StaticCredentialsResolver. + + Rules: + - If both aws_access_key_id and aws_secret_access_key are overridden, + auto-set aws_credentials_identity_resolver to a + StaticCredentialsResolver (unless the caller already provided one). + Only the overridden values are used, so a session token present in a + profile is not picked up here. + - If credentials are overridden but the key/secret pair is incomplete, + raise ConfigValidationError. + - If no credential is overridden, credentials are resolved from the + remaining sources. + """ + + required = {"aws_access_key_id", "aws_secret_access_key"} + + cred_overrides = {f for f in _CREDENTIAL_FIELDS if f in overrides} + + if not cred_overrides: + return + + if not required <= cred_overrides: + raise ConfigValidationError( + f"Partial credential override: {sorted(cred_overrides)}. " + "Both 'aws_access_key_id' and 'aws_secret_access_key' must be " + "provided together when overriding credentials." + ) + + # Auto-wire StaticCredentialsResolver if user didn't provide one + if overrides.get("aws_credentials_identity_resolver") is None: + # Lazy import to avoid circular dependency + from smithy_aws_core.aio.identity.static import ( + AsyncStaticCredentialsResolver, + ) + from smithy_aws_core.identity.components import AWSCredentialsIdentity + + identity = AWSCredentialsIdentity( + access_key_id=overrides["aws_access_key_id"], + secret_access_key=overrides["aws_secret_access_key"], + session_token=overrides.get("aws_session_token"), + ) + overrides["aws_credentials_identity_resolver"] = ( + AsyncStaticCredentialsResolver(identity=identity) + ) + + def __setattr__(self, name: str, value: Any) -> None: + """Guard and track config fields set after resolution. + + Rejects unknown field names, blocks credential mutation, validates the + new value, and records the field as an override so ``source_of()`` + stays accurate when plugins customize a config per request. + """ + # Reject unknown fields + if not name.startswith("_") and name not in self.__class__._FIELDS: + raise AttributeError( + f"'{type(self).__name__}' has no config field '{name}'" + ) + + # Apply the field's converter so a post-resolution assignment coerces + # the same way an override passed to resolve() does. + spec = self.__class__._FIELDS.get(name) + if spec is not None and spec.converter is not None and value is not UNSET: + value = spec.converter(value) + + # Block override for credentials after resolution + if ( + name in _CREDENTIAL_FIELDS + and hasattr(self, "_sources") + and name in self._sources + ): + raise AttributeError( + f"'{name}' cannot be modified after resolution. Pass credentials " + f"to `await {type(self).__name__}.resolve(...)`, or set " + "'aws_credentials_identity_resolver' to supply credentials " + "dynamically." + ) + + # Mark as override only if the field is in _FIELDS and was already resolved + if spec is not None and hasattr(self, "_sources") and name in self._sources: + if spec.validator is not None: + spec.validator(value) + self._sources[name] = ConfigSource.OVERRIDE + super().__setattr__(name, value) + + def __deepcopy__(self, memo: dict[int, Any]) -> Self: + """Deep-copy the config while sharing resources that must not be duplicated.""" + for shared in ( + self.aws_credentials_identity_resolver, + self.transport, + self.retry_strategy, + ): + if shared is not None: + memo[id(shared)] = shared + new = self._create_instance() + memo[id(self)] = new + for f in fields(self): + object.__setattr__(new, f.name, deepcopy(getattr(self, f.name), memo)) + return new diff --git a/packages/smithy-aws-core/src/smithy_aws_core/aio/config/context.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/config/context.py new file mode 100644 index 000000000..90b3c6ffd --- /dev/null +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/config/context.py @@ -0,0 +1,163 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +import logging +import os +from pathlib import Path +from typing import Any + +from ...config.context import _resolve_config_paths # type: ignore[reportPrivateUsage] +from ...config.file_parser import ( + FileType, + standardize, +) +from ...config.merged_config import MergedConfig +from ...config.types import ConfigSource +from .file_parser import parse_config_file_async +from .filesystem import AsyncDefaultFileSystem, AsyncFileSystem + +logger = logging.getLogger(__name__) + +_PROFILE_ENV_VAR = "AWS_PROFILE" +_DEFAULT_PROFILE = "default" + + +async def load_config_async( + config_file_path: Path | None = None, + credentials_file_path: Path | None = None, + fs: AsyncFileSystem | None = None, +) -> MergedConfig: + """Load and merge AWS config and credentials files. + + Parses both files, standardizes them, and returns a merged + MergedConfig ready for querying. + + :param config_file_path: Override path for config file. + Defaults to AWS_CONFIG_FILE env var or ~/.aws/config. + :param credentials_file_path: Override path for credentials file. + Defaults to AWS_SHARED_CREDENTIALS_FILE env var or ~/.aws/credentials. + :param fs: AsyncFileSystem to use for reading files. + Defaults to AsyncDefaultFileSystem (real disk I/O). + :returns: A MergedConfig with merged profiles from both files. + """ + filesystem = fs or AsyncDefaultFileSystem() + config_path, credentials_path = _resolve_config_paths( + config_file_path, credentials_file_path + ) + + raw_config = await parse_config_file_async(str(config_path), filesystem) + raw_credentials = await parse_config_file_async(str(credentials_path), filesystem) + + std_config = standardize(raw_config, FileType.CONFIG) + std_credentials = standardize(raw_credentials, FileType.CREDENTIALS) + + return MergedConfig(std_config, std_credentials) + + +class AsyncSharedConfigContext: + """Resolution context shared across resolvers during config construction. + + Holds environment state and cached file data that resolvers use to + look up values. Created once per resolve() call. + """ + + def __init__( + self, + *, + profile_name: str | None = None, + fs: AsyncFileSystem | None = None, + http_client: Any | None = None, + config_file_path: str | Path | None = None, + credentials_file_path: str | Path | None = None, + ) -> None: + """Initialize the resolution context. + + :param profile_name: The active profile to use. Defaults to + AWS_PROFILE env var, then "default". + :param fs: Filesystem abstraction for reading config files. + Defaults to real disk I/O. + :param http_client: HTTP client for network-based resolvers + (e.g., IMDS). + :param config_file_path: Override path for config file. + :param credentials_file_path: Override path for credentials file. + """ + self._fs: AsyncFileSystem = fs if fs is not None else AsyncDefaultFileSystem() + self._http_client: Any | None = http_client + self._profile_name, self._profile_source = self._resolve_profile_name( + profile_name + ) + self._config_file_path: Path | None = ( + Path(config_file_path) if config_file_path is not None else None + ) + self._credentials_file_path: Path | None = ( + Path(credentials_file_path) if credentials_file_path is not None else None + ) + self._cached_config_file: MergedConfig | None = None + + @property + def profile_name(self) -> str: + """The active profile name.""" + return self._profile_name + + @property + def profile_source(self) -> ConfigSource: + """The source of the active profile name.""" + return self._profile_source + + @property + def fs(self) -> AsyncFileSystem: + """The filesystem abstraction.""" + return self._fs + + @property + def http_client(self) -> Any | None: + """HTTP client for network-based resolvers.""" + return self._http_client + + def __deepcopy__(self, memo: Any) -> "AsyncSharedConfigContext": + """Return self rather than a copy. + + The context is read-only once resolution finishes: resolvers have + already pulled their values onto the config's fields, and nothing on + the request path reads it again. Generated clients deep-copy the + config on every operation call to keep plugin mutations scoped to + that call, which would otherwise rebuild the whole parsed profile + tree per request — work proportional to the size of the caller's + shared config files. Sharing this instead keeps that cost flat + without weakening the isolation of the fields plugins actually write. + """ + return self + + async def parsed_profiles(self) -> MergedConfig: + """Get the parsed and merged config/credentials file data. + + The result is cached after the first call so files are only + read from disk once per context. + """ + if self._cached_config_file is None: + self._cached_config_file = await load_config_async( + config_file_path=self._config_file_path, + credentials_file_path=self._credentials_file_path, + fs=self._fs, + ) + return self._cached_config_file + + def _resolve_profile_name( + self, explicit_profile: str | None + ) -> tuple[str, ConfigSource]: + """Determine the active profile name and where it came from. + + Priority: explicit argument > AWS_PROFILE env var > "default" + + :returns: Tuple of (profile_name, source), where source is the + provenance of the name: ``OVERRIDE`` for the explicit argument, + ``ENV`` for ``AWS_PROFILE``, and ``DEFAULT`` for the fallback. + """ + if explicit_profile is not None: + return explicit_profile, ConfigSource.OVERRIDE + + env_profile = os.environ.get(_PROFILE_ENV_VAR) + if env_profile: + return env_profile, ConfigSource.ENV + + return _DEFAULT_PROFILE, ConfigSource.DEFAULT diff --git a/packages/smithy-aws-core/src/smithy_aws_core/aio/config/file_parser.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/config/file_parser.py new file mode 100644 index 000000000..c26ec9b2d --- /dev/null +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/config/file_parser.py @@ -0,0 +1,29 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +from ...config.exceptions import ConfigParseError +from ...config.file_parser import ( + RawParsedSections, + _parse_content, # type: ignore[reportPrivateUsage] +) +from .filesystem import AsyncFileSystem + + +async def parse_config_file_async( + file_path: str, filesystem: AsyncFileSystem +) -> RawParsedSections: + """Parse an AWS config or credentials file. + + Reads the file asynchronously and parses it into raw sections. + + :param file_path: Resolved path to the file. + :param filesystem: AsyncFileSystem object to use. + :returns: Raw sections dict {section_name: {key: value}}. + :raises ConfigParseError: If the file has invalid syntax. + """ + content = await filesystem.read_file(file_path) + if content is None: + return {} + try: + return _parse_content(content) + except ConfigParseError as e: + raise ConfigParseError(f"Unable to parse config file '{file_path}': {e}") from e diff --git a/packages/smithy-aws-core/src/smithy_aws_core/config/filesystem.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/config/filesystem.py similarity index 92% rename from packages/smithy-aws-core/src/smithy_aws_core/config/filesystem.py rename to packages/smithy-aws-core/src/smithy_aws_core/aio/config/filesystem.py index 3e680594b..0a02d148f 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/config/filesystem.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/config/filesystem.py @@ -7,15 +7,15 @@ from typing import Protocol, runtime_checkable __all__ = [ - "DefaultFileSystem", - "FileSystem", + "AsyncDefaultFileSystem", + "AsyncFileSystem", ] logger = logging.getLogger(__name__) @runtime_checkable -class FileSystem(Protocol): +class AsyncFileSystem(Protocol): """Protocol for filesystem operations. Abstraction over file I/O so tests can provide mock implementations @@ -31,7 +31,7 @@ async def read_file(self, path: str) -> str | None: ... -class DefaultFileSystem: +class AsyncDefaultFileSystem: """Default filesystem implementation using real disk I/O.""" async def read_file(self, path: str) -> str | None: diff --git a/packages/smithy-aws-core/src/smithy_aws_core/config/resolvers.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/config/resolvers.py similarity index 89% rename from packages/smithy-aws-core/src/smithy_aws_core/config/resolvers.py rename to packages/smithy-aws-core/src/smithy_aws_core/aio/config/resolvers.py index 9562563ff..70573b675 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/config/resolvers.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/config/resolvers.py @@ -5,9 +5,9 @@ import warnings from collections.abc import Sequence -from .context import SharedConfigContext -from .exceptions import ConfigValidationError -from .types import UNSET, ConfigSource, Resolved +from ...config.exceptions import ConfigValidationError +from ...config.types import UNSET, ConfigSource, Resolved +from .context import AsyncSharedConfigContext __all__ = [ "EndpointUriResolver", @@ -20,7 +20,7 @@ async def _resolve_str( - ctx: SharedConfigContext, + ctx: AsyncSharedConfigContext, *, env_vars: Sequence[str] = (), profile_keys: Sequence[str] = (), @@ -52,7 +52,7 @@ async def _resolve_str( async def _resolve_int( - ctx: SharedConfigContext, + ctx: AsyncSharedConfigContext, *, env_vars: Sequence[str] = (), profile_keys: Sequence[str] = (), @@ -76,7 +76,7 @@ async def _resolve_int( ) from e -async def resolve_region(ctx: SharedConfigContext) -> Resolved[str | None]: +async def resolve_region(ctx: AsyncSharedConfigContext) -> Resolved[str | None]: """Resolve the AWS region from environment or config file. :param ctx: The shared resolution context. @@ -89,7 +89,7 @@ async def resolve_region(ctx: SharedConfigContext) -> Resolved[str | None]: ) -async def resolve_retry_mode(ctx: SharedConfigContext) -> Resolved[str | None]: +async def resolve_retry_mode(ctx: AsyncSharedConfigContext) -> Resolved[str | None]: """ Resolve the AWS retry mode from environment or config file. @@ -112,7 +112,7 @@ async def resolve_retry_mode(ctx: SharedConfigContext) -> Resolved[str | None]: return result -async def resolve_max_attempts(ctx: SharedConfigContext) -> Resolved[int | None]: +async def resolve_max_attempts(ctx: AsyncSharedConfigContext) -> Resolved[int | None]: """Resolve the maximum number of retry attempts from environment or config file. :param ctx: The shared resolution context. @@ -125,7 +125,7 @@ async def resolve_max_attempts(ctx: SharedConfigContext) -> Resolved[int | None] ) -async def resolve_endpoint_uri(ctx: SharedConfigContext) -> Resolved[str | None]: +async def resolve_endpoint_uri(ctx: AsyncSharedConfigContext) -> Resolved[str | None]: """Resolve the endpoint URI from global environment or config file. This is the base resolver that only checks global sources. @@ -141,7 +141,7 @@ async def resolve_endpoint_uri(ctx: SharedConfigContext) -> Resolved[str | None] ) -async def resolve_sdk_ua_app_id(ctx: SharedConfigContext) -> Resolved[str | None]: +async def resolve_sdk_ua_app_id(ctx: AsyncSharedConfigContext) -> Resolved[str | None]: """Resolve the SDK user-agent app ID from environment or config file. :param ctx: The shared resolution context. @@ -176,7 +176,7 @@ def __init__(self, service_id: str): self._service_key = service_id.replace(" ", "_").replace("-", "_").lower() - async def __call__(self, ctx: SharedConfigContext) -> Resolved[str | None]: + async def __call__(self, ctx: AsyncSharedConfigContext) -> Resolved[str | None]: """Resolve the endpoint URI from all sources. :param ctx: The shared resolution context. diff --git a/packages/smithy-aws-core/src/smithy_aws_core/aio/endpoints/__init__.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/endpoints/__init__.py new file mode 100644 index 000000000..33cbe867a --- /dev/null +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/endpoints/__init__.py @@ -0,0 +1,2 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 diff --git a/packages/smithy-aws-core/src/smithy_aws_core/endpoints/standard_regional.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/endpoints/standard_regional.py similarity index 84% rename from packages/smithy-aws-core/src/smithy_aws_core/endpoints/standard_regional.py rename to packages/smithy-aws-core/src/smithy_aws_core/aio/endpoints/standard_regional.py index 661349ba2..f575810f2 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/endpoints/standard_regional.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/endpoints/standard_regional.py @@ -3,16 +3,16 @@ from typing import Any from smithy_core import URI -from smithy_core.aio.interfaces import EndpointResolver +from smithy_core.aio.interfaces import AsyncEndpointResolver from smithy_core.endpoints import Endpoint, EndpointResolverParams, resolve_static_uri from smithy_core.exceptions import EndpointResolutionError -from . import REGIONAL_ENDPOINT_CONFIG +from ...endpoints import REGIONAL_ENDPOINT_CONFIG -__all__ = ["StandardRegionalEndpointsResolver"] +__all__ = ["AsyncStandardRegionalEndpointsResolver"] -class StandardRegionalEndpointsResolver(EndpointResolver): +class AsyncStandardRegionalEndpointsResolver(AsyncEndpointResolver): """Resolves endpoints for services with standard regional endpoints.""" def __init__(self, endpoint_prefix: str = "bedrock-runtime"): diff --git a/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/__init__.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/__init__.py new file mode 100644 index 000000000..3a2d2bb7c --- /dev/null +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/__init__.py @@ -0,0 +1,37 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver + +from ...identity.components import AWSCredentialsIdentity, AWSIdentityProperties +from .chain import AsyncIdentityChain +from .chain.providers.environment import AsyncEnvironmentCredentialsProvider +from .chain.providers.process import AsyncProfileCredentialProcessProvider +from .chain.providers.profile import ( + AsyncProfileSessionCredentialsProvider, + AsyncProfileStaticCredentialsProvider, +) +from .chain.providers.shared_config import AsyncSharedConfigProvider +from .container import AsyncContainerCredentialsResolver +from .environment import AsyncEnvironmentCredentialsResolver +from .imds import AsyncIMDSCredentialsResolver +from .process import AsyncProcessCredentialsResolver +from .static import AsyncStaticCredentialsResolver + +type AsyncAWSCredentialsResolver = AsyncIdentityResolver[ + AWSCredentialsIdentity, AWSIdentityProperties +] + +__all__ = ( + "AsyncAWSCredentialsResolver", + "AsyncContainerCredentialsResolver", + "AsyncEnvironmentCredentialsProvider", + "AsyncEnvironmentCredentialsResolver", + "AsyncIMDSCredentialsResolver", + "AsyncIdentityChain", + "AsyncProcessCredentialsResolver", + "AsyncProfileCredentialProcessProvider", + "AsyncProfileSessionCredentialsProvider", + "AsyncProfileStaticCredentialsProvider", + "AsyncSharedConfigProvider", + "AsyncStaticCredentialsResolver", +) diff --git a/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/__init__.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/__init__.py new file mode 100644 index 000000000..d2f510205 --- /dev/null +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/__init__.py @@ -0,0 +1,229 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +import logging +from collections.abc import Callable, Mapping, Sequence +from importlib import metadata +from typing import Any, cast + +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver +from smithy_core.exceptions import SmithyIdentityError +from smithy_core.interfaces.identity import Identity +from smithy_http.aio.interfaces import AsyncHTTPClient + +from ....config.merged_config import MergedConfig +from ....identity.chain.exceptions import ( + IdentityChainConfigurationError, + IdentityChainError, + IdentityResolverFailure, + UnclaimedSource, +) +from ....identity.chain.ordering import ( + After, + Before, + Standard, + StandardProvider, +) +from .provider import ChainIdentityProvider, ChainSetup, NamedResolver + +__all__ = ("AsyncIdentityChain",) + +_CHAIN_PROVIDER_ENTRY_POINT_GROUP = "smithy_aws_core.aio.identity.chain_providers" +logger = logging.getLogger(__name__) + + +class AsyncIdentityChain[I: Identity](AsyncIdentityResolver[I, Mapping[str, Any]]): + """Resolves identities from an assembled sequence of resolvers.""" + + _resolvers: tuple[AsyncIdentityResolver[I, Any], ...] + _identity_type: type[I] | None + _unclaimed_sources: tuple[UnclaimedSource, ...] + + def __init__( + self, + resolvers: Sequence[AsyncIdentityResolver[I, Any]], + *, + identity_type: type[I] | None = None, + unclaimed_sources: Sequence[UnclaimedSource] = (), + ) -> None: + """Initialize the chain with resolvers in precedence order. + + :param resolvers: Identity resolvers to iterate in precedence order. + :param identity_type: The identity type this chain resolves, or None when + constructing a chain directly without declaring one. + :param unclaimed_sources: Detected-but-unclaimed sources discovered during + chain assembly. This parameter is used by :meth:`create`; omit it when + constructing a chain directly. + """ + self._resolvers = tuple(resolvers) + self._identity_type = identity_type + self._unclaimed_sources = tuple(unclaimed_sources) + + @property + def identity_type(self) -> type[I] | None: + """The identity type this chain resolves, or None if not declared.""" + return self._identity_type + + @staticmethod + async def create[ChainIdentity: Identity]( + identity_type: type[ChainIdentity], + *, + config_file: MergedConfig | None = None, + profile_name: str | None = None, + region_override: str | None = None, + http_client: AsyncHTTPClient | None = None, + ) -> "AsyncIdentityChain[ChainIdentity]": + """Create an identity chain from discovered providers. + + :param identity_type: The identity type to resolve. + :param config_file: Parsed config/credentials file. Loaded from disk + when not set. + :param profile_name: Explicit profile name to use. When set, top-level + environment credential resolution is suppressed. If omitted, the shared + config provider uses ``AWS_PROFILE`` when set, otherwise ``default``. + :param region_override: Region to use for providers whose resolvers + fetch credentials through a service call. + :param http_client: HTTP client to use for providers whose resolvers make + network calls. + """ + discovered_providers = _discover_chain_identity_providers() + _validate_providers(discovered_providers) + providers = _sort_by_ordering(discovered_providers) + setup = ChainSetup( + config_file=config_file, + profile_name=profile_name, + region_override=region_override, + http_client=http_client, + ) + unclaimed_sources = _find_unclaimed_sources(discovered_providers) + + for provider in providers: + setup.set_current_provider(provider) + await provider.setup(identity_type, setup) + if setup.terminal: + break + + for source in unclaimed_sources: + logger.warning(str(source)) + return AsyncIdentityChain( + setup.resolvers, + identity_type=identity_type, + unclaimed_sources=unclaimed_sources, + ) + + async def get_identity(self, *, properties: Mapping[str, Any]) -> I: + """Return the first identity resolved by the chain.""" + failures: list[IdentityResolverFailure] = [] + for resolver in self._resolvers: + try: + return await resolver.get_identity(properties=properties) + except SmithyIdentityError as error: + if isinstance(resolver, NamedResolver): + provider_name = resolver.provider_name + else: + provider_name = type(resolver).__name__ + failures.append( + IdentityResolverFailure( + provider_name=provider_name, + error=error, + ) + ) + + raise IdentityChainError( + failures=tuple(failures), + unclaimed_sources=self._unclaimed_sources, + ) + + async def invalidate(self) -> None: + """Invalidate every resolver in the chain.""" + for resolver in self._resolvers: + await resolver.invalidate() + + +def _discover_chain_identity_providers() -> tuple[ChainIdentityProvider, ...]: + discovered: list[ChainIdentityProvider] = [] + for entry_point in metadata.entry_points(group=_CHAIN_PROVIDER_ENTRY_POINT_GROUP): + provider_factory = cast( + Callable[[], ChainIdentityProvider], + entry_point.load(), + ) + discovered.append(provider_factory()) + return tuple(discovered) + + +def _sort_by_ordering( + providers: Sequence[ChainIdentityProvider], +) -> tuple[ChainIdentityProvider, ...]: + if not providers: + return () + slot_indexes = {slot: index for index, slot in enumerate(StandardProvider)} + + def sort_key( + indexed_provider: tuple[int, ChainIdentityProvider], + ) -> tuple[int, int, int]: + discovery_index, provider = indexed_provider + ordering = provider.ordering + + match ordering: + case Before(): + constraint_precedence = 0 + case Standard(): + constraint_precedence = 1 + case After(): + constraint_precedence = 2 + case _: + raise IdentityChainConfigurationError( + f"Provider {type(provider).__name__} returned an unsupported " + f"ordering constraint: {ordering!r}." + ) + + return (slot_indexes[ordering.slot], constraint_precedence, discovery_index) + + indexed_providers = enumerate(providers) + ordered_providers = sorted(indexed_providers, key=sort_key) + return tuple(provider for _, provider in ordered_providers) + + +def _validate_providers(providers: Sequence[ChainIdentityProvider]) -> None: + discovered_names: dict[str, ChainIdentityProvider] = {} + discovered_standard_slots: dict[StandardProvider, ChainIdentityProvider] = {} + + for provider in providers: + normalized_name = provider.name.casefold() + if (previous := discovered_names.get(normalized_name)) is not None: + raise IdentityChainConfigurationError( + f"Credential providers {type(previous).__name__} and " + f"{type(provider).__name__} use the same name: {provider.name}." + ) + discovered_names[normalized_name] = provider + + ordering = provider.ordering + if isinstance(ordering, Standard): + if (previous := discovered_standard_slots.get(ordering.slot)) is not None: + raise IdentityChainConfigurationError( + f"Credential providers {type(previous).__name__} and " + f"{type(provider).__name__} both claim standard slot: " + f"{ordering.slot.name}." + ) + discovered_standard_slots[ordering.slot] = provider + + +def _find_unclaimed_sources( + providers: Sequence[ChainIdentityProvider], +) -> tuple[UnclaimedSource, ...]: + claimed_slots = { + provider.ordering.slot + for provider in providers + if isinstance(provider.ordering, Standard) + } + unclaimed_sources: list[UnclaimedSource] = [] + + for slot in StandardProvider: + if slot in claimed_slots or not slot.is_detected(): + continue + package = slot.module_suggestion + if package: + unclaimed_sources.append( + UnclaimedSource(source_name=slot.canonical_name, package=package) + ) + + return tuple(unclaimed_sources) diff --git a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/provider.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/provider.py similarity index 89% rename from packages/smithy-aws-core/src/smithy_aws_core/identity/chain/provider.py rename to packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/provider.py index 59cc0e27b..c8e8b8514 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/provider.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/provider.py @@ -6,12 +6,12 @@ from dataclasses import dataclass from typing import Any, Protocol -from smithy_core.aio.interfaces.identity import IdentityResolver +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver from smithy_core.interfaces.identity import Identity -from smithy_http.aio.interfaces import HTTPClient +from smithy_http.aio.interfaces import AsyncHTTPClient -from ...config.merged_config import MergedConfig -from .ordering import OrderingConstraint +from ....config.merged_config import MergedConfig +from ....identity.chain.ordering import OrderingConstraint __all__ = [ "ChainIdentityProvider", @@ -25,7 +25,7 @@ class NamedResolver: """Associates an identity resolver with its provider's metadata.""" provider_name: str - resolver: IdentityResolver[Any, Any] + resolver: AsyncIdentityResolver[Any, Any] async def get_identity(self, *, properties: Mapping[str, Any]) -> Any: """Resolve an identity using the underlying resolver.""" @@ -45,7 +45,7 @@ def __init__( config_file: MergedConfig | None = None, profile_name: str | None = None, region_override: str | None = None, - http_client: HTTPClient | None = None, + http_client: AsyncHTTPClient | None = None, properties: MutableMapping[str, Any] | None = None, ) -> None: self._config_file = config_file @@ -75,7 +75,7 @@ def region_override(self) -> str | None: return self._region_override @property - def http_client(self) -> HTTPClient | None: + def http_client(self) -> AsyncHTTPClient | None: """Return the HTTP client to use for network calls, if provided.""" return self._http_client @@ -110,7 +110,7 @@ def set_profile_name(self, profile_name: str) -> None: """Set the resolved name of the active profile.""" self._profile_name = profile_name - def add_resolver(self, resolver: IdentityResolver[Any, Any]) -> None: + def add_resolver(self, resolver: AsyncIdentityResolver[Any, Any]) -> None: """Add a named resolver and continue assembly.""" if self._terminal: raise RuntimeError("Cannot add a resolver after a terminal resolver.") @@ -123,7 +123,7 @@ def add_resolver(self, resolver: IdentityResolver[Any, Any]) -> None: ) ) - def add_terminal_resolver(self, resolver: IdentityResolver[Any, Any]) -> None: + def add_terminal_resolver(self, resolver: AsyncIdentityResolver[Any, Any]) -> None: """Add a named resolver and stop assembly.""" self.add_resolver(resolver) self._terminal = True diff --git a/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/providers/__init__.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/providers/__init__.py new file mode 100644 index 000000000..33cbe867a --- /dev/null +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/providers/__init__.py @@ -0,0 +1,2 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 diff --git a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/providers/environment.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/providers/environment.py similarity index 76% rename from packages/smithy-aws-core/src/smithy_aws_core/identity/chain/providers/environment.py rename to packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/providers/environment.py index 3d9ce2845..02a1f671e 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/providers/environment.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/providers/environment.py @@ -4,18 +4,18 @@ from smithy_core.interfaces.identity import Identity -from ...components import AWSCredentialsIdentity -from ...environment import EnvironmentCredentialsResolver -from ..ordering import Standard, StandardProvider +from .....identity.chain.ordering import Standard, StandardProvider +from .....identity.components import AWSCredentialsIdentity +from ...environment import AsyncEnvironmentCredentialsResolver from ..provider import ChainSetup -__all__ = ["EnvironmentCredentialsProvider"] +__all__ = ["AsyncEnvironmentCredentialsProvider"] _ACCESS_KEY_ID = "AWS_ACCESS_KEY_ID" _SECRET_ACCESS_KEY = "AWS_SECRET_ACCESS_KEY" # noqa: S105 -class EnvironmentCredentialsProvider: +class AsyncEnvironmentCredentialsProvider: """Adds an environment resolver unless an explicit profile is selected.""" @property @@ -43,4 +43,4 @@ async def setup( if not os.getenv(_ACCESS_KEY_ID) or not os.getenv(_SECRET_ACCESS_KEY): return - setup.add_terminal_resolver(EnvironmentCredentialsResolver()) + setup.add_terminal_resolver(AsyncEnvironmentCredentialsResolver()) diff --git a/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/providers/process.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/providers/process.py new file mode 100644 index 000000000..bf2b9c036 --- /dev/null +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/providers/process.py @@ -0,0 +1,51 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +from smithy_core.interfaces.identity import Identity + +from .....identity.chain.ordering import Standard, StandardProvider +from .....identity.chain.providers.process import ( + _split_process_command, # type: ignore[reportPrivateUsage] +) +from .....identity.components import AWSCredentialsIdentity +from ....identity.process import AsyncProcessCredentialsResolver +from ..provider import ChainSetup + +_CREDENTIAL_PROCESS = "credential_process" +_ACCOUNT_ID = "aws_account_id" + + +class AsyncProfileCredentialProcessProvider: + """Adds a process credential resolver configured by the active profile.""" + + @property + def name(self) -> str: + """Return the canonical provider name.""" + return StandardProvider.PROFILE_CREDENTIAL_PROCESS.canonical_name + + @property + def ordering(self) -> Standard: + """Return the provider's standard chain position.""" + return Standard(slot=StandardProvider.PROFILE_CREDENTIAL_PROCESS) + + async def setup(self, identity_type: type[Identity], setup: ChainSetup) -> None: + """Add a resolver when the active profile configures a credential process.""" + if identity_type is not AWSCredentialsIdentity: + return + + config_file = setup.config_file + profile_name = setup.profile_name + if config_file is None or profile_name is None: + return + + command = config_file.get(profile_name, _CREDENTIAL_PROCESS) + if not command: + return + + # The process output's AccountId takes precedence; the profile's + # aws_account_id is only used as a fallback. + setup.add_terminal_resolver( + AsyncProcessCredentialsResolver( + _split_process_command(command), + account_id=config_file.get(profile_name, _ACCOUNT_ID), + ) + ) diff --git a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/providers/profile.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/providers/profile.py similarity index 86% rename from packages/smithy-aws-core/src/smithy_aws_core/identity/chain/providers/profile.py rename to packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/providers/profile.py index 86215a04d..22f7901d5 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/providers/profile.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/providers/profile.py @@ -2,14 +2,14 @@ # SPDX-License-Identifier: Apache-2.0 from smithy_core.interfaces.identity import Identity -from ...components import AWSCredentialsIdentity -from ...static import StaticCredentialsResolver -from ..ordering import Standard, StandardProvider +from .....identity.chain.ordering import Standard, StandardProvider +from .....identity.components import AWSCredentialsIdentity +from ...static import AsyncStaticCredentialsResolver from ..provider import ChainSetup __all__ = [ - "ProfileSessionCredentialsProvider", - "ProfileStaticCredentialsProvider", + "AsyncProfileSessionCredentialsProvider", + "AsyncProfileStaticCredentialsProvider", ] _ACCESS_KEY_ID = "aws_access_key_id" @@ -19,7 +19,7 @@ _ROLE_ARN = "role_arn" -class ProfileSessionCredentialsProvider: +class AsyncProfileSessionCredentialsProvider: """Adds a resolver for session credentials from the active profile.""" @property @@ -57,10 +57,10 @@ async def setup(self, identity_type: type[Identity], setup: ChainSetup) -> None: session_token=session_token, account_id=config_file.get(profile_name, _ACCOUNT_ID), ) - setup.add_terminal_resolver(StaticCredentialsResolver(identity)) + setup.add_terminal_resolver(AsyncStaticCredentialsResolver(identity)) -class ProfileStaticCredentialsProvider: +class AsyncProfileStaticCredentialsProvider: """Adds a resolver for static credentials from the active profile.""" @property @@ -96,4 +96,4 @@ async def setup(self, identity_type: type[Identity], setup: ChainSetup) -> None: secret_access_key=secret_access_key, account_id=config_file.get(profile_name, _ACCOUNT_ID), ) - setup.add_terminal_resolver(StaticCredentialsResolver(identity)) + setup.add_terminal_resolver(AsyncStaticCredentialsResolver(identity)) diff --git a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/providers/shared_config.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/providers/shared_config.py similarity index 78% rename from packages/smithy-aws-core/src/smithy_aws_core/identity/chain/providers/shared_config.py rename to packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/providers/shared_config.py index 22399c0e5..0396ed928 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/providers/shared_config.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/chain/providers/shared_config.py @@ -4,15 +4,15 @@ from smithy_core.interfaces.identity import Identity -from ....config import load_config -from ...components import AWSCredentialsIdentity -from ..ordering import Standard, StandardProvider +from .....identity.chain.ordering import Standard, StandardProvider +from .....identity.components import AWSCredentialsIdentity +from ....config import load_config_async from ..provider import ChainSetup -__all__ = ["SharedConfigProvider"] +__all__ = ["AsyncSharedConfigProvider"] -class SharedConfigProvider: +class AsyncSharedConfigProvider: """Loads and selects the active AWS profile for downstream providers.""" @property @@ -32,7 +32,7 @@ async def setup(self, identity_type: type[Identity], setup: ChainSetup) -> None: config_file = setup.config_file if config_file is None: - config_file = await load_config() + config_file = await load_config_async() setup.set_config_file(config_file) profile_name = setup.profile_name or os.getenv("AWS_PROFILE") or "default" diff --git a/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/container.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/container.py new file mode 100644 index 000000000..bf7cf488b --- /dev/null +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/container.py @@ -0,0 +1,217 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +import asyncio +import ipaddress +import json +import os +import warnings +from datetime import UTC, datetime +from urllib.parse import urlparse + +from smithy_core import URI +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver +from smithy_core.exceptions import SmithyIdentityError +from smithy_http import Field, Fields +from smithy_http.aio import HTTPRequest +from smithy_http.aio.interfaces import AsyncHTTPClient, HTTPResponse + +from smithy_aws_core.identity.components import ( + AWSCredentialsIdentity, + AWSIdentityProperties, +) +from smithy_aws_core.identity.container import ContainerCredentialsConfig + +_CONTAINER_METADATA_IP = "169.254.170.2" +_CONTAINER_METADATA_ALLOWED_HOSTS = { + _CONTAINER_METADATA_IP, + "169.254.170.23", + "fd00:ec2::23", + "localhost", +} +_SLEEP_SECONDS = 1 + + +class ContainerMetadataClient: + """Client for remote credential retrieval in Container environments like ECS/EKS.""" + + def __init__( + self, http_client: AsyncHTTPClient, config: ContainerCredentialsConfig + ): + self._http_client = http_client + self._config = config + + def _validate_allowed_url(self, uri: URI) -> None: + if self._is_loopback(uri.host): + return + + if not self._is_allowed_container_metadata_host(uri.host): + raise SmithyIdentityError( + f"Unsupported host '{uri.host}'. " + f"Can only retrieve metadata from a loopback address or " + f"one of: {', '.join(_CONTAINER_METADATA_ALLOWED_HOSTS)}" + ) + + async def get_credentials(self, uri: URI, fields: Fields) -> dict[str, str]: + self._validate_allowed_url(uri) + fields.set_field(Field(name="Accept", values=["application/json"])) + + attempts = 0 + last_exc = None + while attempts < self._config.retries: + try: + request = HTTPRequest( + method="GET", + destination=uri, + fields=fields, + ) + response: HTTPResponse = await self._http_client.send(request) + body = await response.consume_body_async() + if response.status != 200: + raise SmithyIdentityError( + f"Container metadata service returned {response.status}: " + f"{body.decode('utf-8')}" + ) + try: + return json.loads(body.decode("utf-8")) + except Exception as e: + raise SmithyIdentityError( + f"Unable to parse JSON from container metadata: {body.decode('utf-8')}" + ) from e + except Exception as e: + last_exc = e + await asyncio.sleep(_SLEEP_SECONDS) + attempts += 1 + + raise SmithyIdentityError( + f"Failed to retrieve container metadata after {self._config.retries} attempt(s)" + ) from last_exc + + def _is_loopback(self, hostname: str) -> bool: + try: + return ipaddress.ip_address(hostname).is_loopback + except ValueError: + return False + + def _is_allowed_container_metadata_host(self, hostname: str) -> bool: + return hostname in _CONTAINER_METADATA_ALLOWED_HOSTS + + +class AsyncContainerCredentialsResolver( + AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] +): + """Resolves AWS Credentials from container credential sources. + + .. warning:: + This resolver is deprecated. Use the resolver provided by the + ``aws-credentials-http`` package instead. + """ + + ENV_VAR = "AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" + ENV_VAR_FULL = "AWS_CONTAINER_CREDENTIALS_FULL_URI" + ENV_VAR_AUTH_TOKEN = "AWS_CONTAINER_AUTHORIZATION_TOKEN" # noqa: S105 + ENV_VAR_AUTH_TOKEN_FILE = "AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE" # noqa: S105 + + def __init__( + self, + http_client: AsyncHTTPClient, + config: ContainerCredentialsConfig | None = None, + ): + warnings.warn( + "`AsyncContainerCredentialsResolver` is deprecated; install " + "`aws-credentials-http` and use its resolver instead.", + DeprecationWarning, + stacklevel=2, + ) + self._http_client = http_client + self._config = config or ContainerCredentialsConfig() + self._client = ContainerMetadataClient(http_client, self._config) + self._credentials = None + + async def _resolve_uri_from_env(self) -> URI: + if self.ENV_VAR in os.environ: + return URI( + scheme="http", + host=_CONTAINER_METADATA_IP, + path=os.environ[self.ENV_VAR], + ) + elif self.ENV_VAR_FULL in os.environ: + parsed = urlparse(os.environ[self.ENV_VAR_FULL]) + return URI( + scheme=parsed.scheme, + host=parsed.hostname or "", + port=parsed.port, + path=parsed.path, + ) + else: + raise SmithyIdentityError( + f"Neither {self.ENV_VAR} or {self.ENV_VAR_FULL} environment " + "variables are set. Unable to resolve credentials." + ) + + async def _resolve_fields_from_env(self) -> Fields: + fields = Fields() + if self.ENV_VAR_AUTH_TOKEN_FILE in os.environ: + try: + filename = os.environ[self.ENV_VAR_AUTH_TOKEN_FILE] + auth_token = await asyncio.to_thread(self._read_file, filename) + except (FileNotFoundError, PermissionError) as e: + raise SmithyIdentityError( + f"Unable to open {os.environ[self.ENV_VAR_AUTH_TOKEN_FILE]}." + ) from e + + fields.set_field(Field(name="Authorization", values=[auth_token])) + elif self.ENV_VAR_AUTH_TOKEN in os.environ: + auth_token = os.environ[self.ENV_VAR_AUTH_TOKEN] + fields.set_field(Field(name="Authorization", values=[auth_token])) + + return fields + + def _read_file(self, filename: str) -> str: + with open(filename) as f: + try: + return f.read().strip() + except UnicodeDecodeError as e: + raise SmithyIdentityError( + f"Unable to read valid utf-8 bytes from {filename}." + ) from e + + async def get_identity( + self, *, properties: AWSIdentityProperties + ) -> AWSCredentialsIdentity: + if ( + self._credentials is not None + and self._credentials.expiration + and datetime.now(UTC) < self._credentials.expiration + ): + return self._credentials + + uri = await self._resolve_uri_from_env() + fields = await self._resolve_fields_from_env() + creds = await self._client.get_credentials(uri, fields) + + access_key_id = creds.get("AccessKeyId") + secret_access_key = creds.get("SecretAccessKey") + session_token = creds.get("Token") + expiration = creds.get("Expiration") + account_id = creds.get("AccountId") + + if isinstance(expiration, str): + expiration = datetime.fromisoformat(expiration).replace(tzinfo=UTC) + + if access_key_id is None or secret_access_key is None: + raise SmithyIdentityError( + "AccessKeyId and SecretAccessKey are required for container credentials" + ) + + self._credentials = AWSCredentialsIdentity( + access_key_id=access_key_id, + secret_access_key=secret_access_key, + session_token=session_token, + expiration=expiration, + account_id=account_id, + ) + return self._credentials + + async def invalidate(self) -> None: + """Discard cached credentials so the next resolution re-queries the endpoint.""" + self._credentials = None diff --git a/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/environment.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/environment.py new file mode 100644 index 000000000..b97b66843 --- /dev/null +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/environment.py @@ -0,0 +1,26 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver + +from ...identity.components import AWSCredentialsIdentity, AWSIdentityProperties +from ...identity.environment import EnvironmentCredentialsResolver + +__all__ = ["AsyncEnvironmentCredentialsResolver"] + + +class AsyncEnvironmentCredentialsResolver( + AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] +): + """Resolves AWS Credentials from system environment variables. + + The resolution is synchronous; this defers to the sync component without + awaiting. + """ + + def __init__(self): + self._sync = EnvironmentCredentialsResolver() + + async def get_identity( + self, *, properties: AWSIdentityProperties + ) -> AWSCredentialsIdentity: + return self._sync.get_identity(properties=properties) diff --git a/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/imds.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/imds.py new file mode 100644 index 000000000..7399ad1ec --- /dev/null +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/imds.py @@ -0,0 +1,234 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +import asyncio +import json +import warnings +from dataclasses import dataclass +from datetime import UTC, datetime +from types import MappingProxyType +from typing import Literal + +from smithy_core import URI +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver +from smithy_core.aio.interfaces.retries import AsyncRetryStrategy +from smithy_core.aio.retries import AsyncSimpleRetryStrategy +from smithy_core.exceptions import SmithyIdentityError +from smithy_http import Field, Fields +from smithy_http.aio import HTTPRequest +from smithy_http.aio.interfaces import AsyncHTTPClient + +from ... import __version__ +from ...identity.components import AWSCredentialsIdentity, AWSIdentityProperties +from ...identity.imds import Token + +_USER_AGENT_FIELD = Field( + name="User-Agent", + values=[f"aws-sdk-python-imds-client/{__version__}"], +) + + +@dataclass(init=False) +class Config: + """Configuration for EC2Metadata.""" + + _HOST_MAPPING = MappingProxyType( + {"IPv4": "169.254.169.254", "IPv6": "[fd00:ec2::254]"} + ) + _MIN_TTL = 5 + _MAX_TTL = 21600 + + retry_strategy: AsyncRetryStrategy + endpoint_uri: URI + endpoint_mode: Literal["IPv4", "IPv6"] + token_ttl: int + + def __init__( + self, + *, + retry_strategy: AsyncRetryStrategy | None = None, + endpoint_uri: URI | None = None, + endpoint_mode: Literal["IPv4", "IPv6"] = "IPv4", + token_ttl: int = _MAX_TTL, + ec2_instance_profile_name: str | None = None, + ): + # TODO: Implement retries. + self.retry_strategy = retry_strategy or AsyncSimpleRetryStrategy(max_attempts=3) + self.endpoint_mode = endpoint_mode + self.endpoint_uri = self._resolve_endpoint(endpoint_uri, endpoint_mode) + self.token_ttl = self._validate_token_ttl(token_ttl) + self.ec2_instance_profile_name = ec2_instance_profile_name + + def _validate_token_ttl(self, ttl: int) -> int: + if not self._MIN_TTL <= ttl <= self._MAX_TTL: + raise ValueError( + f"Token TTL must be between {self._MIN_TTL} and {self._MAX_TTL} seconds." + ) + return ttl + + def _resolve_endpoint( + self, endpoint_uri: URI | None, endpoint_mode: Literal["IPv4", "IPv6"] + ) -> URI: + if endpoint_uri is not None: + return endpoint_uri + + return URI( + scheme="http", + host=self._HOST_MAPPING.get(endpoint_mode, self._HOST_MAPPING["IPv4"]), + port=80, + ) + + +class TokenCache: + """Holds the token needed to fetch instance metadata. + + In addition, it knows how to refresh itself. + """ + + _TOKEN_PATH = "/latest/api/token" # noqa: S105 + + def __init__(self, http_client: AsyncHTTPClient, config: Config): + self._http_client = http_client + self._config = config + self._base_uri = config.endpoint_uri + self._refresh_lock = asyncio.Lock() + self._token = None + + def _should_refresh(self) -> bool: + return self._token is None or self._token.is_expired() + + async def _refresh(self) -> None: + async with self._refresh_lock: + if not self._should_refresh(): + return + headers = Fields( + [ + _USER_AGENT_FIELD, + Field( + name="x-aws-ec2-metadata-token-ttl-seconds", + values=[str(self._config.token_ttl)], + ), + ] + ) + request = HTTPRequest( + method="PUT", + destination=URI( + scheme=self._base_uri.scheme, + host=self._base_uri.host, + port=self._base_uri.port, + path=self._TOKEN_PATH, + ), + fields=headers, + ) + response = await self._http_client.send(request) + token_value = await response.consume_body_async() + self._token = Token(token_value.decode("utf-8"), self._config.token_ttl) + + async def get_token(self) -> Token: + if self._should_refresh(): + await self._refresh() + assert self._token is not None # noqa: S101 + return self._token + + +class EC2Metadata: + def __init__(self, http_client: AsyncHTTPClient, config: Config | None = None): + self._http_client = http_client + self._config = config or Config() + self._token_cache = TokenCache( + http_client=self._http_client, config=self._config + ) + + async def get(self, *, path: str) -> str: + token = await self._token_cache.get_token() + headers = Fields( + [ + _USER_AGENT_FIELD, + Field( + name="x-aws-ec2-metadata-token", + values=[token.value], + ), + ] + ) + request = HTTPRequest( + method="GET", + destination=URI( + scheme=self._config.endpoint_uri.scheme, + host=self._config.endpoint_uri.host, + port=self._config.endpoint_uri.port, + path=path, + ), + fields=headers, + ) + response = await self._http_client.send(request=request) + body = await response.consume_body_async() + return body.decode("utf-8") + + +class AsyncIMDSCredentialsResolver( + AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] +): + """Resolves AWS Credentials from an EC2 Instance Metadata Service (IMDS) client. + + .. warning:: + This resolver is deprecated. Use the resolver provided by the + ``aws-credentials-imds`` package instead. + """ + + _METADATA_PATH_BASE = "/latest/meta-data/iam/security-credentials" + + def __init__(self, http_client: AsyncHTTPClient, config: Config | None = None): + warnings.warn( + "`AsyncIMDSCredentialsResolver` is deprecated; install " + "`aws-credentials-imds` and use its resolver instead.", + DeprecationWarning, + stacklevel=2, + ) + # TODO: Respect IMDS specific config values from aws shared config file and environment. + self._http_client = http_client + self._ec2_metadata_client = EC2Metadata(http_client=http_client, config=config) + self._config = config or Config() + self._credentials = None + self._profile_name = self._config.ec2_instance_profile_name + + async def get_identity( + self, *, properties: AWSIdentityProperties + ) -> AWSCredentialsIdentity: + if ( + self._credentials is not None + and self._credentials.expiration + and datetime.now(UTC) < self._credentials.expiration + ): + return self._credentials + + profile = self._profile_name + if profile is None: + profile = await self._ec2_metadata_client.get(path=self._METADATA_PATH_BASE) + + creds_str = await self._ec2_metadata_client.get( + path=f"{self._METADATA_PATH_BASE}/{profile}" + ) + creds = json.loads(creds_str) + + access_key_id = creds.get("AccessKeyId") + secret_access_key = creds.get("SecretAccessKey") + session_token = creds.get("Token") + account_id = creds.get("AccountId") + expiration = creds.get("Expiration") + if expiration is not None: + expiration = datetime.fromisoformat(expiration).replace(tzinfo=UTC) + + if access_key_id is None or secret_access_key is None: + raise SmithyIdentityError("AccessKeyId and SecretAccessKey are required") + + self._credentials = AWSCredentialsIdentity( + access_key_id=access_key_id, + secret_access_key=secret_access_key, + session_token=session_token, + expiration=expiration, + account_id=account_id, + ) + return self._credentials + + async def invalidate(self) -> None: + """Discard cached credentials so the next resolution re-queries IMDS.""" + self._credentials = None diff --git a/packages/smithy-aws-core/src/smithy_aws_core/identity/process.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/process.py similarity index 95% rename from packages/smithy-aws-core/src/smithy_aws_core/identity/process.py rename to packages/smithy-aws-core/src/smithy_aws_core/aio/identity/process.py index 38a2deaa0..6d68a17c8 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/identity/process.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/process.py @@ -5,12 +5,12 @@ from datetime import UTC, datetime from typing import TypeGuard, cast -from smithy_core.aio.interfaces.identity import IdentityResolver +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver from smithy_core.exceptions import SmithyIdentityError -from .components import AWSCredentialsIdentity, AWSIdentityProperties +from ...identity.components import AWSCredentialsIdentity, AWSIdentityProperties -__all__ = ["ProcessCredentialsResolver"] +__all__ = ["AsyncProcessCredentialsResolver"] def _is_command_list(command: object) -> TypeGuard[list[str]]: @@ -19,8 +19,8 @@ def _is_command_list(command: object) -> TypeGuard[list[str]]: return all(isinstance(argument, str) for argument in cast(list[object], command)) -class ProcessCredentialsResolver( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] +class AsyncProcessCredentialsResolver( + AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] ): """Resolves AWS Credentials from a process. diff --git a/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/static.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/static.py new file mode 100644 index 000000000..4343ef53b --- /dev/null +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/identity/static.py @@ -0,0 +1,26 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver + +from ...identity.components import AWSCredentialsIdentity, AWSIdentityProperties +from ...identity.static import StaticCredentialsResolver + +__all__ = ["AsyncStaticCredentialsResolver"] + + +class AsyncStaticCredentialsResolver( + AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] +): + """Resolves static AWS credentials from a fixed identity or request properties. + + The resolution is synchronous; this defers to the sync component without + awaiting. + """ + + def __init__(self, identity: AWSCredentialsIdentity | None = None) -> None: + self._sync = StaticCredentialsResolver(identity) + + async def get_identity( + self, *, properties: AWSIdentityProperties + ) -> AWSCredentialsIdentity: + return self._sync.get_identity(properties=properties) diff --git a/packages/smithy-aws-core/src/smithy_aws_core/aio/protocols.py b/packages/smithy-aws-core/src/smithy_aws_core/aio/protocols.py index 2a6c340fd..cb3172b48 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/aio/protocols.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/aio/protocols.py @@ -1,13 +1,18 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 +from collections.abc import Callable from dataclasses import dataclass, replace +from inspect import iscoroutinefunction from io import BytesIO from typing import TYPE_CHECKING, Any, ClassVar, Final from xml.etree.ElementTree import Element from smithy_core import URI as _URI -from smithy_core.aio.interfaces import ( - ProtocolSettings, +from smithy_core.aio.interfaces import AsyncWriter +from smithy_core.aio.interfaces.auth import AsyncAuthScheme +from smithy_core.aio.interfaces.eventstream import ( + AsyncEventPublisher, + AsyncEventReceiver, ) from smithy_core.aio.types import AsyncBytesReader from smithy_core.codecs import Codec @@ -19,8 +24,15 @@ ExpectationNotMetError, MissingDependencyError, ModeledError, + UnsupportedStreamError, +) +from smithy_core.interfaces import ( + BytesReader, + BytesWriter, + ProtocolSettings, + TypedProperties, + URI, ) -from smithy_core.interfaces import BytesReader, BytesWriter, TypedProperties, URI from smithy_core.interfaces import StreamingBlob as SyncStreamingBlob from smithy_core.prelude import DOCUMENT from smithy_core.response import ResponseMetadata @@ -33,8 +45,8 @@ from smithy_http.aio import HTTPRequest as _HTTPRequest from smithy_http.aio.interfaces import HTTPErrorIdentifier, HTTPRequest, HTTPResponse from smithy_http.aio.protocols import ( - HttpBindingClientProtocol, - RpcClientProtocol, + AsyncHttpBindingClientProtocol, + AsyncRpcClientProtocol, ) from smithy_http.deserializers import HTTPResponseDeserializer @@ -72,26 +84,43 @@ except ImportError: _HAS_XML = False # type: ignore +try: + from smithy_aws_event_stream.aio import ( + AWSEventPublisher, + AWSEventReceiver, + SigningConfig, + ) + + _HAS_EVENT_STREAM = True +except ImportError: + _HAS_EVENT_STREAM = False # type: ignore + try: from smithy_aws_event_stream.exceptions import MissingInitialResponse except ImportError: pass if TYPE_CHECKING: + from smithy_aws_event_stream.aio import ( + AWSEventPublisher, + AWSEventReceiver, + SigningConfig, + ) from smithy_aws_event_stream.exceptions import MissingInitialResponse from smithy_json import JSONCodec, JSONDocument from smithy_xml import XMLCodec + from typing_extensions import TypeForm __all__ = [ "AWSErrorIdentifier", "AWSJSONDocument", - "AwsJson10ClientProtocol", - "AwsJson11ClientProtocol", - "AwsQueryClientProtocol", - "Ec2QueryClientProtocol", - "RestJsonClientProtocol", - "RestXmlClientProtocol", + "AsyncAwsJson10ClientProtocol", + "AsyncAwsJson11ClientProtocol", + "AsyncAwsQueryClientProtocol", + "AsyncEc2QueryClientProtocol", + "AsyncRestJsonClientProtocol", + "AsyncRestXmlClientProtocol", ] @@ -109,6 +138,14 @@ def _assert_xml() -> None: ) +def _assert_event_stream() -> None: + if not _HAS_EVENT_STREAM: + raise MissingDependencyError( + "Attempted to use event streams, but smithy-aws-event-stream " + "is not installed." + ) + + class AWSErrorIdentifier(HTTPErrorIdentifier): _HEADER_KEY: Final = "x-amzn-errortype" @@ -166,17 +203,81 @@ def extract_response_metadata( class _AWSHttpBindingClientProtocol( - _AWSResponseMetadataMixin, HttpBindingClientProtocol + _AWSResponseMetadataMixin, AsyncHttpBindingClientProtocol ): """Base for the AWS protocols that use HTTP bindings: restJson1 and restXml. Adds AWS response metadata. Event streams are inherited from - ``HttpClientProtocol``: events are framed as ``application/vnd.amazon.eventstream`` - and structured event payloads use the protocol's payload codec. + ``AsyncHttpBindingClientProtocol``: events are framed as + ``application/vnd.amazon.eventstream`` and structured event payloads use the + protocol's payload codec. """ + async def create_event_publisher[ + OperationInput: SerializeableShape, + OperationOutput: DeserializeableShape, + Event: SerializeableShape, + ]( + self, + *, + operation: "APIOperation[OperationInput, OperationOutput]", + request: HTTPRequest, + event_type: "TypeForm[Event]", + context: TypedProperties, + auth_scheme: AsyncAuthScheme[Any, Any, Any, Any] | None = None, + ) -> AsyncEventPublisher[Event]: + _assert_event_stream() + signing_config: SigningConfig | None = None + if auth_scheme is not None: + event_signer = auth_scheme.event_signer(request=request) + if event_signer is not None: + signing_config = SigningConfig( + signer=event_signer, + signing_properties=auth_scheme.signer_properties(context=context), + identity_resolver=auth_scheme.identity_resolver(context=context), + identity_properties=auth_scheme.identity_properties( + context=context + ), + ) + + # The HTTP body must be an async writeable. The HTTP serializers are responsible + # for ensuring this. + body = request.body + if not isinstance(body, AsyncWriter) or not iscoroutinefunction(body.write): + raise UnsupportedStreamError( + "Input streams require an async write function, but none was present " + "on the serialized HTTP request." + ) + + return AWSEventPublisher[Event]( + payload_codec=self.payload_codec, + async_writer=body, + signing_config=signing_config, + ) + + def create_event_receiver[ + OperationInput: SerializeableShape, + OperationOutput: DeserializeableShape, + Event: DeserializeableShape, + ]( + self, + *, + operation: "APIOperation[OperationInput, OperationOutput]", + request: HTTPRequest, + response: HTTPResponse, + event_type: "TypeForm[Event]", + event_deserializer: Callable[[ShapeDeserializer], Event], + context: TypedProperties, + ) -> AsyncEventReceiver[Event]: + _assert_event_stream() + return AWSEventReceiver( + payload_codec=self.payload_codec, + source=AsyncBytesReader(response.body), + deserializer=event_deserializer, + ) + -class RestJsonClientProtocol(_AWSHttpBindingClientProtocol): +class AsyncRestJsonClientProtocol(_AWSHttpBindingClientProtocol): """An implementation of the aws.protocols#restJson1 protocol.""" _id: Final = RestJson1Trait.id @@ -222,7 +323,7 @@ def _resolve_error_id( return error_id -class RestXmlClientProtocol(_AWSHttpBindingClientProtocol): +class AsyncRestXmlClientProtocol(_AWSHttpBindingClientProtocol): """An implementation of the aws.protocols#restXml protocol.""" _id: Final = RestXmlTrait.id @@ -343,7 +444,7 @@ def create_deserializer(self, source: bytes | BytesReader) -> ShapeDeserializer: ) -class _AWSJSONClientProtocol(_AWSResponseMetadataMixin, RpcClientProtocol): +class _AWSJSONClientProtocol(_AWSResponseMetadataMixin, AsyncRpcClientProtocol): _error_identifier: Final = AWSErrorIdentifier() _id: ClassVar[ShapeID] @@ -575,14 +676,14 @@ def _resolve_error_id( return error_id -class AwsJson10ClientProtocol(_AWSJSONClientProtocol): +class AsyncAwsJson10ClientProtocol(_AWSJSONClientProtocol): """An implementation of the aws.protocols#awsJson1_0 protocol.""" _id: ClassVar[ShapeID] = AwsJson1_0Trait.id _content_type: ClassVar[str] = "application/x-amz-json-1.0" -class AwsJson11ClientProtocol(_AWSJSONClientProtocol): +class AsyncAwsJson11ClientProtocol(_AWSJSONClientProtocol): """An implementation of the aws.protocols#awsJson1_1 protocol.""" _id: ClassVar[ShapeID] = AwsJson1_1Trait.id @@ -607,14 +708,14 @@ class _RecordedQueryRequestId: _QUERY_REQUEST_ID = PropertyKey( key="aws_query_request_id", value_type=_RecordedQueryRequestId ) -"""Where :py:class:`AwsQueryClientProtocol` records a body-sourced request ID. +"""Where :py:class:`AsyncAwsQueryClientProtocol` records a body-sourced request ID. The body is only available while deserializing, so the value is stored there for ``extract_response_metadata`` to read back. """ -class AwsQueryClientProtocol(_AWSResponseMetadataMixin, RpcClientProtocol): +class AsyncAwsQueryClientProtocol(_AWSResponseMetadataMixin, AsyncRpcClientProtocol): """An implementation of the aws.protocols#awsQuery protocol.""" _id: ClassVar[ShapeID] = AwsQueryTrait.id @@ -817,7 +918,7 @@ def _error_wrapper_elements(self) -> tuple[str, ...]: return ("ErrorResponse", "Error") -class Ec2QueryClientProtocol(AwsQueryClientProtocol): +class AsyncEc2QueryClientProtocol(AsyncAwsQueryClientProtocol): """An implementation of the aws.protocols#ec2Query protocol. An EC2-specific extension of awsQuery: input keys resolve via ``@ec2QueryName`` diff --git a/packages/smithy-aws-core/src/smithy_aws_core/auth/sigv4.py b/packages/smithy-aws-core/src/smithy_aws_core/auth/sigv4.py index 21caba7b4..9eb8cdb44 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/auth/sigv4.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/auth/sigv4.py @@ -1,128 +1,12 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -import re -from typing import TYPE_CHECKING, Protocol, Self -from aws_sdk_signers import AsyncEventSigner, AsyncSigV4Signer, SigV4SigningProperties -from smithy_core.aio.interfaces.auth import AuthScheme, EventSigner, Signer -from smithy_core.exceptions import SmithyIdentityError -from smithy_core.interfaces import TypedProperties as _TypedProperties -from smithy_core.types import PropertyKey -from smithy_http.aio.interfaces import HTTPRequest -from ..identity import ( - AWS_IDENTITY_CONFIG, - AWSCredentialsIdentity, - AWSCredentialsResolver, - AWSIdentityProperties, -) -from ..traits import SigV4Trait +class SigV4AuthScheme: + """SigV4 auth scheme. -if TYPE_CHECKING: - from smithy_aws_event_stream.events import EventHeaderEncoder + Placeholder for the synchronous auth scheme; populated alongside the sync client + implementation. + """ -try: - from smithy_aws_event_stream.events import EventHeaderEncoder - - HAS_EVENT_STREAM = True -except ImportError: - HAS_EVENT_STREAM = False # type: ignore - - -__all__ = [ - "SIGV4_CONFIG", - "SigV4AuthScheme", - "SigV4Config", - "SigV4Signer", -] - - -class SigV4Config(Protocol): - region: str | None - aws_credentials_identity_resolver: AWSCredentialsResolver | None - - -SIGV4_CONFIG = PropertyKey(key="config", value_type=SigV4Config) - -type SigV4Signer = Signer[HTTPRequest, AWSCredentialsIdentity, SigV4SigningProperties] - - -class SigV4AuthScheme( - AuthScheme[ - HTTPRequest, - AWSCredentialsIdentity, - AWSIdentityProperties, - SigV4SigningProperties, - ] -): - """SigV4 AuthScheme.""" - - scheme_id = SigV4Trait.id - _signer: SigV4Signer - - def __init__( - self, - *, - service: str, - signer: SigV4Signer | None = None, - ) -> None: - """Constructor. - - :param identity_resolver: The identity resolver to extract the api key identity. - :param signer: The signer used to sign the request. - """ - # TODO: There are type mismatches in the signature of the "sign" method. - # The issues seems to be that it's not using protocols in its signature - self._signer = signer or AsyncSigV4Signer() # type: ignore - self._service = service - - def identity_properties( - self, *, context: _TypedProperties - ) -> AWSIdentityProperties: - config = context[AWS_IDENTITY_CONFIG] - return { - "access_key_id": config.aws_access_key_id, - "secret_access_key": config.aws_secret_access_key, - "session_token": config.aws_session_token, - } - - def identity_resolver(self, *, context: _TypedProperties) -> AWSCredentialsResolver: - config = context.get(SIGV4_CONFIG) - if config is None or config.aws_credentials_identity_resolver is None: - raise SmithyIdentityError( - "Attempted to use SigV4 auth, but aws_credentials_identity_resolver was not " - "set on the config." - ) - return config.aws_credentials_identity_resolver - - def signer_properties(self, *, context: _TypedProperties) -> SigV4SigningProperties: - config = context.get(SIGV4_CONFIG) - if config is None or config.region is None: - raise SmithyIdentityError( - "Attempted to use SigV4 auth, but region was not set on the config." - ) - return { - "region": config.region, - "service": self._service, - } - - def signer(self) -> SigV4Signer: - return self._signer - - def event_signer( - self, *, request: HTTPRequest - ) -> EventSigner[AWSCredentialsIdentity, SigV4SigningProperties] | None: - if not HAS_EVENT_STREAM: - return None - - auth_value = request.fields["Authorization"].as_string() - signature: str = re.split("Signature=", auth_value)[-1] - - return AsyncEventSigner( - initial_signature=signature.encode("utf-8"), - event_encoder_cls=EventHeaderEncoder, - ) - - @classmethod - def from_trait(cls, trait: SigV4Trait, /) -> Self: - return cls(service=trait.name) + # TODO(sync-api): implement alongside the sync client diff --git a/packages/smithy-aws-core/src/smithy_aws_core/config/__init__.py b/packages/smithy-aws-core/src/smithy_aws_core/config/__init__.py index 4e7cad1f6..ded30f5fe 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/config/__init__.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/config/__init__.py @@ -1,30 +1,62 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -from .aws_config import AsyncAwsConfig, AwsConfigOverrides -from .context import SharedConfigContext, load_config, shared_config_files_exist +from typing import TYPE_CHECKING, Any + +from .context import shared_config_files_exist from .exceptions import ( ConfigError, ConfigParseError, ConfigValidationError, ProfileNotFoundError, ) -from .filesystem import DefaultFileSystem, FileSystem from .merged_config import MergedConfig from .types import ConfigSource +if TYPE_CHECKING: + from ..aio.config.aws_config import AsyncAwsConfig, AwsConfigOverrides + from ..aio.config.context import AsyncSharedConfigContext, load_config_async + from ..aio.config.filesystem import AsyncDefaultFileSystem, AsyncFileSystem + __all__ = [ "AsyncAwsConfig", + "AsyncDefaultFileSystem", + "AsyncFileSystem", + "AsyncSharedConfigContext", "AwsConfigOverrides", "ConfigError", "ConfigParseError", "ConfigSource", "ConfigValidationError", - "DefaultFileSystem", - "FileSystem", "MergedConfig", "ProfileNotFoundError", - "SharedConfigContext", - "load_config", + "load_config_async", "shared_config_files_exist", ] + +# Preserve the pre-relocation public import path without an eager import cycle: +# aio.config.aws_config imports back into this package's exceptions during its own +# initialization, so these relocated symbols are resolved lazily on first access. +_RELOCATED = { + "AsyncAwsConfig": "aws_config", + "AwsConfigOverrides": "aws_config", + "AsyncSharedConfigContext": "context", + "load_config_async": "context", + "AsyncDefaultFileSystem": "filesystem", + "AsyncFileSystem": "filesystem", +} + + +def __getattr__(name: str) -> Any: + module = _RELOCATED.get(name) + if module is None: + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + import importlib + + return getattr(importlib.import_module(f"..aio.config.{module}", __name__), name) + + +# Keep the lazily relocated names reachable via dir() so the public surface is +# discoverable (and recorded by the api-snapshot), not just importable. +def __dir__() -> list[str]: + return [*globals(), *_RELOCATED] diff --git a/packages/smithy-aws-core/src/smithy_aws_core/config/aws_config.py b/packages/smithy-aws-core/src/smithy_aws_core/config/aws_config.py index 9c854eb2e..8b63494ac 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/config/aws_config.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/config/aws_config.py @@ -1,465 +1,16 @@ -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -from collections.abc import Mapping -from copy import deepcopy -from dataclasses import dataclass, field, fields -from typing import TYPE_CHECKING, Any, ClassVar, Self, TypedDict, Unpack - -from smithy_core.retries import RetryStrategyOptions, RetryStrategyType - -if TYPE_CHECKING: - from smithy_core.aio.interfaces import ClientTransport - from smithy_core.aio.interfaces.identity import IdentityResolver - from smithy_core.aio.interfaces.retries import RetryStrategy - from smithy_core.interfaces import URI - from smithy_http.interfaces import HTTPRequestConfiguration - - from smithy_aws_core.identity.components import ( - AWSCredentialsIdentity, - AWSIdentityProperties, - ) - -from .context import SharedConfigContext -from .exceptions import ConfigError, ConfigValidationError -from .filesystem import FileSystem -from .resolvers import ( - resolve_endpoint_uri, - resolve_max_attempts, - resolve_region, - resolve_retry_mode, - resolve_sdk_ua_app_id, -) -from .types import UNSET, ConfigSource, FieldSpec, Resolved -from .validators import ( - validate_max_attempts, - validate_profile, - validate_region, - validate_retry_mode, -) - -_CREDENTIAL_FIELDS = ("aws_access_key_id", "aws_secret_access_key", "aws_session_token") +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 __all__ = [ - "AsyncAwsConfig", - "AwsConfigOverrides", + "AwsConfig", ] -class AwsConfigOverrides(TypedDict, total=False): - """Common keyword overrides accepted by AWS config resolution.""" - - region: str | None - retry_mode: RetryStrategyType | None - max_attempts: int | None - endpoint_uri: "str | URI | None" - aws_access_key_id: str | None - aws_secret_access_key: str | None - aws_session_token: str | None - aws_credentials_identity_resolver: ( - "IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None" - ) - sdk_ua_app_id: str | None - user_agent_extra: str | None - interceptors: list[Any] - http_request_config: "HTTPRequestConfiguration | None" - transport: "ClientTransport[Any, Any] | None" - retry_strategy: "RetryStrategy | RetryStrategyOptions | None" - - -@dataclass(kw_only=True, init=False) -class AsyncAwsConfig: +class AwsConfig: """Base configuration class for all AWS services. - Fields are resolved asynchronously from multiple sources (env vars, - config files, defaults) through the resolve() classmethod. - - Do not instantiate directly — use: - config = await AsyncAwsConfig.resolve() + Placeholder for the synchronous configuration; populated alongside the sync client + implementation. """ - region: str | None = None - """The AWS region to connect to. - """ - - retry_mode: RetryStrategyType | None = None - """The retry mode to use. Accepted overrides are ``standard`` and ``adaptive``. - - ``legacy`` is rejected when set here; when it comes from the environment or a - config file it warns and falls back to ``standard``. - """ - - max_attempts: int | None = None - """The maximum number of attempts to make per request, including the initial - attempt. Must be an integer of at least 1.""" - - endpoint_uri: "str | URI | None" = None - """A static URI to route requests to.""" - - aws_access_key_id: str | None = field(default=None, repr=False) - """The identifier for a secret access key. - - Set this together with ``aws_secret_access_key`` to supply credentials in - code. Cannot be modified after resolution; see - ``aws_credentials_identity_resolver`` to supply credentials dynamically. - """ - - aws_secret_access_key: str | None = field(default=None, repr=False) - """A secret access key that can be used to sign requests. - - Must be set together with ``aws_access_key_id``. - """ - - aws_session_token: str | None = field(default=None, repr=False) - """The session token used with temporary AWS credentials. - - Set this together with ``aws_access_key_id`` and ``aws_secret_access_key`` - when supplying temporary credentials in code. - """ - - aws_credentials_identity_resolver: "IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None" = None - """Resolves AWS Credentials. - - Set automatically to a ``StaticCredentialsResolver`` when - ``aws_access_key_id`` and ``aws_secret_access_key`` are supplied in code. - """ - - sdk_ua_app_id: str | None = None - """A unique and opaque application ID that is appended to the User-Agent - header.""" - - user_agent_extra: str | None = None - """Additional suffix to be added to the User-Agent header.""" - - interceptors: list[Any] = field(default_factory=list) # type: ignore - """The list of interceptors, which are hooks that are called during the - execution of a request.""" - - http_request_config: "HTTPRequestConfiguration | None" = None - """Configuration for individual HTTP requests.""" - - transport: "ClientTransport[Any, Any] | None" = None - """The transport to use to send requests""" - - retry_strategy: Any | None = None - """The retry strategy or options for configuring retry behavior. - """ - - _ctx: SharedConfigContext | None = field(default=None, repr=False, compare=False) - _sources: dict[str, ConfigSource] = field( # type: ignore[assignment] - default_factory=dict, - repr=False, - compare=False, - ) - - _FIELDS: ClassVar[dict[str, FieldSpec]] = { - "region": FieldSpec( - default=None, - resolver=resolve_region, - validator=validate_region, - ), - "retry_mode": FieldSpec( - default=RetryStrategyOptions.retry_mode, - resolver=resolve_retry_mode, - validator=validate_retry_mode, - ), - "max_attempts": FieldSpec( - default=RetryStrategyOptions.max_attempts, - resolver=resolve_max_attempts, - validator=validate_max_attempts, - ), - "endpoint_uri": FieldSpec( - default=None, - resolver=resolve_endpoint_uri, - ), - "aws_access_key_id": FieldSpec( - default=None, - ), - "aws_secret_access_key": FieldSpec( - default=None, - ), - "aws_session_token": FieldSpec( - default=None, - ), - "aws_credentials_identity_resolver": FieldSpec( - default=None, - ), - "sdk_ua_app_id": FieldSpec( - default=None, - resolver=resolve_sdk_ua_app_id, - ), - "user_agent_extra": FieldSpec( - default=None, - ), - "interceptors": FieldSpec( - default_factory=list, - ), - "http_request_config": FieldSpec( - default=None, - ), - "transport": FieldSpec( - default=None, - ), - "retry_strategy": FieldSpec( - default=None, - ), - } - - def __repr__(self) -> str: - """Render the config without exposing credential material. - - Defined on the base class so that every subclass inherits the - filtering, rather than relying on each subclass to mark its own - credential fields ``repr=False``. Subclasses must be declared with - ``@dataclass(repr=False)`` so they inherit this instead of generating - their own ``__repr__``. - """ - rendered = ", ".join( - f"{f.name}={getattr(self, f.name)!r}" - for f in fields(self) - if f.repr and f.name not in _CREDENTIAL_FIELDS - ) - return f"{type(self).__name__}({rendered})" - - def __init__(self, *args: object, **kwargs: object) -> None: - """Block direct construction without advertising config fields as parameters.""" - raise ConfigError( - f"{type(self).__name__} cannot be constructed directly. " - f"Use `await {type(self).__name__}.resolve(...)` instead." - ) - - @classmethod - async def resolve( - cls, - *, - profile: str | None = None, - fs: FileSystem | None = None, - config_file_path: str | None = None, - credentials_file_path: str | None = None, - **overrides: Unpack[AwsConfigOverrides], - ) -> Self: - """Resolve a config object from environment, config files, and defaults. - - This is the only supported way to create a config instance. - - :param profile: Override the active profile name. - :param fs: Override the filesystem abstraction. - :param config_file_path: Override path for config file. - :param credentials_file_path: Override path for credentials file. - :param overrides: Explicit field values that skip resolution. - :returns: A fully-resolved config instance. - :raises ProfileNotFoundError: If a profile is requested via ``profile`` or - the ``AWS_PROFILE`` environment variable but is not defined in the - config files. - """ - return await cls._resolve( - profile=profile, - fs=fs, - config_file_path=config_file_path, - credentials_file_path=credentials_file_path, - overrides=overrides, - ) - - @classmethod - async def _resolve( - cls, - *, - profile: str | None, - fs: FileSystem | None, - config_file_path: str | None, - credentials_file_path: str | None, - overrides: Mapping[str, object], - ) -> Self: - """Internal resolution entry point for generated typed config factories.""" - ctx = SharedConfigContext( - profile_name=profile, - fs=fs, - config_file_path=config_file_path, - credentials_file_path=credentials_file_path, - ) - - # Fail fast on a bad profile when one was provided (not the default) - profile_source = ctx.profile_source - if profile_source is not ConfigSource.DEFAULT: - config_file = await ctx.parsed_profiles() - validate_profile(ctx.profile_name, config_file.profiles, profile_source) - - # Create the instance without calling the blocked constructor - instance = cls._create_instance() - instance._ctx = ctx - - # Resolve each field - await instance._resolve_fields(dict(overrides)) - - return instance - - def source_of(self, field_name: str) -> ConfigSource | None: - """Get the source that provided a field's value. - - :param field_name: The config field name. - :returns: The ConfigSource, or None if not tracked. - """ - return self._sources.get(field_name) - - def resolution_context(self) -> SharedConfigContext | None: - """Get the resolution context used to create this config. - - :returns: The SharedConfigContext, or None if not available. - """ - return self._ctx - - @classmethod - def _create_instance(cls) -> Self: - """Create an instance that bypasses construction blocking.""" - instance = object.__new__(cls) - object.__setattr__(instance, "_sources", {}) - object.__setattr__(instance, "_ctx", None) - for field_name in cls._FIELDS: - object.__setattr__(instance, field_name, UNSET) - return instance - - async def _resolve_fields(self, overrides: dict[str, Any]) -> None: - """Run the resolution pipeline for all fields.""" - unknown = set(overrides) - set(self._FIELDS) - if unknown: - raise ConfigValidationError( - f"Unknown config field(s): {sorted(unknown)}. " - f"Valid fields are: {sorted(self._FIELDS)}" - ) - - # Validate credential overrides and auto-wire the identity resolver - # before the field loop, so the loop sees the resolver as an override. - self._resolve_credentials(overrides) - - for field_name, spec in self._FIELDS.items(): - # check for overrides first - if field_name in overrides: - value = overrides[field_name] - if spec.converter is not None: - value = spec.converter(value) - setattr(self, field_name, value) - self._sources[field_name] = ConfigSource.OVERRIDE - # check in resolver - elif spec.resolver is not None: - result: Resolved[Any] = await spec.resolver(self._ctx) - if result.value is not UNSET: - setattr(self, field_name, result.value) - self._sources[field_name] = result.source - else: - # If resolver returned UNSET, fall back to default - self._apply_default(field_name, spec) - - else: - # No resolver, use default directly - self._apply_default(field_name, spec) - - # Run validator for all sources - if spec.validator is not None: - spec.validator(getattr(self, field_name)) - - def _apply_default(self, field_name: str, spec: FieldSpec) -> None: - """Apply the default value for a field.""" - if spec.default_factory is not None: - value = spec.default_factory() - else: - value = spec.default - setattr(self, field_name, value) - self._sources[field_name] = ConfigSource.DEFAULT - - def _resolve_credentials(self, overrides: dict[str, Any]) -> None: - """Validate in-code credentials and auto-wire StaticCredentialsResolver. - - Rules: - - If both aws_access_key_id and aws_secret_access_key are overridden, - auto-set aws_credentials_identity_resolver to a - StaticCredentialsResolver (unless the caller already provided one). - Only the overridden values are used, so a session token present in a - profile is not picked up here. - - If credentials are overridden but the key/secret pair is incomplete, - raise ConfigValidationError. - - If no credential is overridden, credentials are resolved from the - remaining sources. - """ - - required = {"aws_access_key_id", "aws_secret_access_key"} - - cred_overrides = {f for f in _CREDENTIAL_FIELDS if f in overrides} - - if not cred_overrides: - return - - if not required <= cred_overrides: - raise ConfigValidationError( - f"Partial credential override: {sorted(cred_overrides)}. " - "Both 'aws_access_key_id' and 'aws_secret_access_key' must be " - "provided together when overriding credentials." - ) - - # Auto-wire StaticCredentialsResolver if user didn't provide one - if overrides.get("aws_credentials_identity_resolver") is None: - # Lazy import to avoid circular dependency - from smithy_aws_core.identity.components import AWSCredentialsIdentity - from smithy_aws_core.identity.static import StaticCredentialsResolver - - identity = AWSCredentialsIdentity( - access_key_id=overrides["aws_access_key_id"], - secret_access_key=overrides["aws_secret_access_key"], - session_token=overrides.get("aws_session_token"), - ) - overrides["aws_credentials_identity_resolver"] = StaticCredentialsResolver( - identity=identity - ) - - def __setattr__(self, name: str, value: Any) -> None: - """Guard and track config fields set after resolution. - - Rejects unknown field names, blocks credential mutation, validates the - new value, and records the field as an override so ``source_of()`` - stays accurate when plugins customize a config per request. - """ - # Reject unknown fields - if not name.startswith("_") and name not in self.__class__._FIELDS: - raise AttributeError( - f"'{type(self).__name__}' has no config field '{name}'" - ) - - # Apply the field's converter so a post-resolution assignment coerces - # the same way an override passed to resolve() does. - spec = self.__class__._FIELDS.get(name) - if spec is not None and spec.converter is not None and value is not UNSET: - value = spec.converter(value) - - # Block override for credentials after resolution - if ( - name in _CREDENTIAL_FIELDS - and hasattr(self, "_sources") - and name in self._sources - ): - raise AttributeError( - f"'{name}' cannot be modified after resolution. Pass credentials " - f"to `await {type(self).__name__}.resolve(...)`, or set " - "'aws_credentials_identity_resolver' to supply credentials " - "dynamically." - ) - - # Mark as override only if the field is in _FIELDS and was already resolved - if spec is not None and hasattr(self, "_sources") and name in self._sources: - if spec.validator is not None: - spec.validator(value) - self._sources[name] = ConfigSource.OVERRIDE - super().__setattr__(name, value) - - def __deepcopy__(self, memo: dict[int, Any]) -> Self: - """Deep-copy the config while sharing resources that must not be duplicated.""" - for shared in ( - self.aws_credentials_identity_resolver, - self.transport, - self.retry_strategy, - ): - if shared is not None: - memo[id(shared)] = shared - new = self._create_instance() - memo[id(self)] = new - for f in fields(self): - object.__setattr__(new, f.name, deepcopy(getattr(self, f.name), memo)) - return new + # TODO(sync-api): implement alongside the sync client diff --git a/packages/smithy-aws-core/src/smithy_aws_core/config/context.py b/packages/smithy-aws-core/src/smithy_aws_core/config/context.py index 3ce2cb482..d266ec5db 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/config/context.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/config/context.py @@ -1,34 +1,12 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 - -import logging import os from pathlib import Path -from typing import Any - -from .file_parser import ( - FileType, - parse_config_file, - standardize, -) -from .filesystem import DefaultFileSystem, FileSystem -from .merged_config import MergedConfig -from .types import ConfigSource - -__all__ = [ - "SharedConfigContext", - "load_config", - "shared_config_files_exist", -] - -logger = logging.getLogger(__name__) _DEFAULT_CONFIG_FILE = "~/.aws/config" _DEFAULT_CREDENTIALS_FILE = "~/.aws/credentials" _CONFIG_FILE_ENV_VAR = "AWS_CONFIG_FILE" _CREDENTIALS_FILE_ENV_VAR = "AWS_SHARED_CREDENTIALS_FILE" -_PROFILE_ENV_VAR = "AWS_PROFILE" -_DEFAULT_PROFILE = "default" def _resolve_config_paths( @@ -61,38 +39,6 @@ def _resolve_config_paths( return config_path, credentials_path -async def load_config( - config_file_path: Path | None = None, - credentials_file_path: Path | None = None, - fs: FileSystem | None = None, -) -> MergedConfig: - """Load and merge AWS config and credentials files. - - Parses both files, standardizes them, and returns a merged - MergedConfig ready for querying. - - :param config_file_path: Override path for config file. - Defaults to AWS_CONFIG_FILE env var or ~/.aws/config. - :param credentials_file_path: Override path for credentials file. - Defaults to AWS_SHARED_CREDENTIALS_FILE env var or ~/.aws/credentials. - :param fs: FileSystem to use for reading files. - Defaults to DefaultFileSystem (real disk I/O). - :returns: A MergedConfig with merged profiles from both files. - """ - filesystem = fs or DefaultFileSystem() - config_path, credentials_path = _resolve_config_paths( - config_file_path, credentials_file_path - ) - - raw_config = await parse_config_file(str(config_path), filesystem) - raw_credentials = await parse_config_file(str(credentials_path), filesystem) - - std_config = standardize(raw_config, FileType.CONFIG) - std_credentials = standardize(raw_credentials, FileType.CREDENTIALS) - - return MergedConfig(std_config, std_credentials) - - def shared_config_files_exist( config_file_path: Path | None = None, credentials_file_path: Path | None = None, @@ -112,112 +58,3 @@ def shared_config_files_exist( config_file_path, credentials_file_path ) return config_path.is_file() or credentials_path.is_file() - - -class SharedConfigContext: - """Resolution context shared across resolvers during config construction. - - Holds environment state and cached file data that resolvers use to - look up values. Created once per resolve() call. - """ - - def __init__( - self, - *, - profile_name: str | None = None, - fs: FileSystem | None = None, - http_client: Any | None = None, - config_file_path: str | Path | None = None, - credentials_file_path: str | Path | None = None, - ) -> None: - """Initialize the resolution context. - - :param profile_name: The active profile to use. Defaults to - AWS_PROFILE env var, then "default". - :param fs: Filesystem abstraction for reading config files. - Defaults to real disk I/O. - :param http_client: HTTP client for network-based resolvers - (e.g., IMDS). - :param config_file_path: Override path for config file. - :param credentials_file_path: Override path for credentials file. - """ - self._fs: FileSystem = fs if fs is not None else DefaultFileSystem() - self._http_client: Any | None = http_client - self._profile_name, self._profile_source = self._resolve_profile_name( - profile_name - ) - self._config_file_path: Path | None = ( - Path(config_file_path) if config_file_path is not None else None - ) - self._credentials_file_path: Path | None = ( - Path(credentials_file_path) if credentials_file_path is not None else None - ) - self._cached_config_file: MergedConfig | None = None - - @property - def profile_name(self) -> str: - """The active profile name.""" - return self._profile_name - - @property - def profile_source(self) -> ConfigSource: - """The source of the active profile name.""" - return self._profile_source - - @property - def fs(self) -> FileSystem: - """The filesystem abstraction.""" - return self._fs - - @property - def http_client(self) -> Any | None: - """HTTP client for network-based resolvers.""" - return self._http_client - - def __deepcopy__(self, memo: Any) -> "SharedConfigContext": - """Return self rather than a copy. - - The context is read-only once resolution finishes: resolvers have - already pulled their values onto the config's fields, and nothing on - the request path reads it again. Generated clients deep-copy the - config on every operation call to keep plugin mutations scoped to - that call, which would otherwise rebuild the whole parsed profile - tree per request — work proportional to the size of the caller's - shared config files. Sharing this instead keeps that cost flat - without weakening the isolation of the fields plugins actually write. - """ - return self - - async def parsed_profiles(self) -> MergedConfig: - """Get the parsed and merged config/credentials file data. - - The result is cached after the first call so files are only - read from disk once per context. - """ - if self._cached_config_file is None: - self._cached_config_file = await load_config( - config_file_path=self._config_file_path, - credentials_file_path=self._credentials_file_path, - fs=self._fs, - ) - return self._cached_config_file - - def _resolve_profile_name( - self, explicit_profile: str | None - ) -> tuple[str, ConfigSource]: - """Determine the active profile name and where it came from. - - Priority: explicit argument > AWS_PROFILE env var > "default" - - :returns: Tuple of (profile_name, source), where source is the - provenance of the name: ``OVERRIDE`` for the explicit argument, - ``ENV`` for ``AWS_PROFILE``, and ``DEFAULT`` for the fallback. - """ - if explicit_profile is not None: - return explicit_profile, ConfigSource.OVERRIDE - - env_profile = os.environ.get(_PROFILE_ENV_VAR) - if env_profile: - return env_profile, ConfigSource.ENV - - return _DEFAULT_PROFILE, ConfigSource.DEFAULT diff --git a/packages/smithy-aws-core/src/smithy_aws_core/config/file_parser.py b/packages/smithy-aws-core/src/smithy_aws_core/config/file_parser.py index 6125c0d8c..903d81de1 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/config/file_parser.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/config/file_parser.py @@ -7,7 +7,6 @@ from enum import Enum from .exceptions import ConfigParseError -from .filesystem import FileSystem __all__ = [ "FileType", @@ -15,7 +14,6 @@ "Section", "SectionMap", "StandardizedOutput", - "parse_config_file", "standardize", ] @@ -52,27 +50,6 @@ class StandardizedOutput: services: SectionMap = field(default_factory=dict) # type: ignore[assignment] -async def parse_config_file( - file_path: str, filesystem: FileSystem -) -> RawParsedSections: - """Parse an AWS config or credentials file. - - Reads the file asynchronously and parses it into raw sections. - - :param file_path: Resolved path to the file. - :param filesystem: FileSystem object to use. - :returns: Raw sections dict {section_name: {key: value}}. - :raises ConfigParseError: If the file has invalid syntax. - """ - content = await filesystem.read_file(file_path) - if content is None: - return {} - try: - return _parse_content(content) - except ConfigParseError as e: - raise ConfigParseError(f"Unable to parse config file '{file_path}': {e}") from e - - def standardize( raw_sections: RawParsedSections, file_type: FileType ) -> StandardizedOutput: @@ -123,7 +100,7 @@ def standardize( ) -def _parse_content(content: str) -> RawParsedSections: +def _parse_content(content: str) -> RawParsedSections: # type: ignore[reportUnusedFunction] """Parse config file content from a string into raw sections. :param content: The raw config file content as a string. 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 552cafae6..61e5025ba 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 @@ -2,41 +2,33 @@ # SPDX-License-Identifier: Apache-2.0 from smithy_core.types import PropertyKey -from .chain import IdentityChain, IdentityChainError, UnclaimedSource -from .chain.providers.environment import EnvironmentCredentialsProvider -from .chain.providers.process import ProfileCredentialProcessProvider -from .chain.providers.profile import ( - ProfileSessionCredentialsProvider, - ProfileStaticCredentialsProvider, +# TODO(sync-api): The shipped public name smithy_aws_core.identity.EnvironmentCredentialsResolver +# TODO(sync-api): is the ASYNC resolver -- the async client pipeline awaits its get_identity, and +# TODO(sync-api): aws-sdk-python's hand-written integration harness imports it from this path and +# TODO(sync-api): passes it to an async client. The sync twin lives at .environment and is NOT +# TODO(sync-api): re-exported here to avoid shadowing that awaitable contract. +# TODO(sync-api): This re-export makes a non-aio module import aio, which the sync-renames design +# TODO(sync-api): forbids; it is the same pre-existing root->aio dependency the branch defers, not a +# TODO(sync-api): new one. Repoint this to the sync twin and drop the aio import once the SDK harness +# TODO(sync-api): imports an async-aware resolver from smithy_aws_core.aio.identity instead. +from ..aio.identity.environment import ( + AsyncEnvironmentCredentialsResolver as EnvironmentCredentialsResolver, ) -from .chain.providers.shared_config import SharedConfigProvider +from .chain import IdentityChainError, UnclaimedSource from .components import ( AWSCredentialsIdentity, AWSCredentialsResolver, AWSIdentityConfig, AWSIdentityProperties, ) -from .container import ContainerCredentialsResolver -from .environment import EnvironmentCredentialsResolver -from .imds import IMDSCredentialsResolver -from .process import ProcessCredentialsResolver from .static import StaticCredentialsResolver __all__ = ( "AWSCredentialsIdentity", "AWSCredentialsResolver", "AWSIdentityProperties", - "ContainerCredentialsResolver", - "EnvironmentCredentialsProvider", "EnvironmentCredentialsResolver", - "IMDSCredentialsResolver", - "IdentityChain", "IdentityChainError", - "ProcessCredentialsResolver", - "ProfileCredentialProcessProvider", - "ProfileSessionCredentialsProvider", - "ProfileStaticCredentialsProvider", - "SharedConfigProvider", "StaticCredentialsResolver", "UnclaimedSource", ) diff --git a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/__init__.py b/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/__init__.py index 4dc033fe6..fe74cef81 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/__init__.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/__init__.py @@ -1,16 +1,5 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -import logging -from collections.abc import Callable, Mapping, Sequence -from importlib import metadata -from typing import Any, cast - -from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.exceptions import SmithyIdentityError -from smithy_core.interfaces.identity import Identity -from smithy_http.aio.interfaces import HTTPClient - -from ...config.merged_config import MergedConfig from .exceptions import ( IdentityChainConfigurationError, IdentityChainError, @@ -24,18 +13,10 @@ Standard, StandardProvider, ) -from .provider import ( - ChainIdentityProvider, - ChainSetup, - NamedResolver, -) __all__ = ( "After", "Before", - "ChainIdentityProvider", - "ChainSetup", - "IdentityChain", "IdentityChainConfigurationError", "IdentityChainError", "IdentityResolverFailure", @@ -44,208 +25,3 @@ "StandardProvider", "UnclaimedSource", ) - -_CHAIN_PROVIDER_ENTRY_POINT_GROUP = "smithy_aws_core.identity.chain_providers" -logger = logging.getLogger(__name__) - - -def _discover_chain_identity_providers() -> tuple[ChainIdentityProvider, ...]: - discovered: list[ChainIdentityProvider] = [] - for entry_point in metadata.entry_points(group=_CHAIN_PROVIDER_ENTRY_POINT_GROUP): - provider_factory = cast( - Callable[[], ChainIdentityProvider], - entry_point.load(), - ) - discovered.append(provider_factory()) - return tuple(discovered) - - -def _sort_by_ordering( - providers: Sequence[ChainIdentityProvider], -) -> tuple[ChainIdentityProvider, ...]: - if not providers: - return () - slot_indexes = {slot: index for index, slot in enumerate(StandardProvider)} - - def sort_key( - indexed_provider: tuple[int, ChainIdentityProvider], - ) -> tuple[int, int, int]: - discovery_index, provider = indexed_provider - ordering = provider.ordering - - match ordering: - case Before(): - constraint_precedence = 0 - case Standard(): - constraint_precedence = 1 - case After(): - constraint_precedence = 2 - case _: - raise IdentityChainConfigurationError( - f"Provider {type(provider).__name__} returned an unsupported " - f"ordering constraint: {ordering!r}." - ) - - # Slot precedence, constraint precedence, then discovery order - return (slot_indexes[ordering.slot], constraint_precedence, discovery_index) - - indexed_providers = enumerate(providers) - ordered_providers = sorted(indexed_providers, key=sort_key) - return tuple(provider for _, provider in ordered_providers) - - -def _validate_providers(providers: Sequence[ChainIdentityProvider]) -> None: - discovered_names: dict[str, ChainIdentityProvider] = {} - discovered_standard_slots: dict[StandardProvider, ChainIdentityProvider] = {} - - for provider in providers: - normalized_name = provider.name.casefold() - if (previous := discovered_names.get(normalized_name)) is not None: - raise IdentityChainConfigurationError( - f"Credential providers {type(previous).__name__} and " - f"{type(provider).__name__} use the same name: {provider.name}." - ) - discovered_names[normalized_name] = provider - - ordering = provider.ordering - if isinstance(ordering, Standard): - if (previous := discovered_standard_slots.get(ordering.slot)) is not None: - raise IdentityChainConfigurationError( - f"Credential providers {type(previous).__name__} and " - f"{type(provider).__name__} both claim standard slot: " - f"{ordering.slot.name}." - ) - discovered_standard_slots[ordering.slot] = provider - - -def _find_unclaimed_sources( - providers: Sequence[ChainIdentityProvider], -) -> tuple[UnclaimedSource, ...]: - claimed_slots = { - provider.ordering.slot - for provider in providers - if isinstance(provider.ordering, Standard) - } - unclaimed_sources: list[UnclaimedSource] = [] - - for slot in StandardProvider: - if slot in claimed_slots or not slot.is_detected(): - continue - package = slot.module_suggestion - if package: - unclaimed_sources.append( - UnclaimedSource(source_name=slot.canonical_name, package=package) - ) - - return tuple(unclaimed_sources) - - -class IdentityChain[I: Identity](IdentityResolver[I, Mapping[str, Any]]): - """Resolves identities from an assembled sequence of resolvers.""" - - _resolvers: tuple[IdentityResolver[I, Any], ...] - _identity_type: type[I] | None - _unclaimed_sources: tuple[UnclaimedSource, ...] - - def __init__( - self, - resolvers: Sequence[IdentityResolver[I, Any]], - *, - identity_type: type[I] | None = None, - unclaimed_sources: Sequence[UnclaimedSource] = (), - ) -> None: - """Initialize the chain with resolvers in precedence order. - - :param resolvers: Identity resolvers to iterate in precedence order. - :param identity_type: The identity type this chain resolves, or None when - constructing a chain directly without declaring one. - :param unclaimed_sources: Detected-but-unclaimed sources discovered during - chain assembly. This parameter is used by :meth:`create`; omit it when - constructing a chain directly. - """ - self._resolvers = tuple(resolvers) - self._identity_type = identity_type - self._unclaimed_sources = tuple(unclaimed_sources) - - @property - def identity_type(self) -> type[I] | None: - """The identity type this chain resolves, or None if not declared.""" - return self._identity_type - - @staticmethod - async def create[ChainIdentity: Identity]( - identity_type: type[ChainIdentity], - *, - config_file: MergedConfig | None = None, - profile_name: str | None = None, - region_override: str | None = None, - http_client: HTTPClient | None = None, - ) -> "IdentityChain[ChainIdentity]": - """Create an identity chain from discovered providers. - - :param identity_type: The identity type to resolve. - :param config_file: Parsed config/credentials file. Loaded from disk - when not set. - :param profile_name: Explicit profile name to use. When set, top-level - environment credential resolution is suppressed. If omitted, the shared - config provider uses ``AWS_PROFILE`` when set, otherwise ``default``. - :param region_override: Region to use for providers whose resolvers - fetch credentials through a service call. - :param http_client: HTTP client to use for providers whose resolvers make - network calls. - """ - discovered_providers = _discover_chain_identity_providers() - _validate_providers(discovered_providers) - providers = _sort_by_ordering(discovered_providers) - setup = ChainSetup( - config_file=config_file, - profile_name=profile_name, - region_override=region_override, - http_client=http_client, - ) - unclaimed_sources = _find_unclaimed_sources(discovered_providers) - - for provider in providers: - setup.set_current_provider(provider) - await provider.setup(identity_type, setup) - if setup.terminal: - break - - for source in unclaimed_sources: - logger.warning(str(source)) - return IdentityChain( - setup.resolvers, - identity_type=identity_type, - unclaimed_sources=unclaimed_sources, - ) - - async def get_identity(self, *, properties: Mapping[str, Any]) -> I: - """Return the first identity resolved by the chain.""" - failures: list[IdentityResolverFailure] = [] - for resolver in self._resolvers: - try: - return await resolver.get_identity(properties=properties) - except SmithyIdentityError as error: - if isinstance(resolver, NamedResolver): - provider_name = resolver.provider_name - failed_resolver = resolver.resolver - else: - provider_name = type(resolver).__name__ - failed_resolver = resolver - failures.append( - IdentityResolverFailure( - provider_name=provider_name, - resolver=failed_resolver, - error=error, - ) - ) - - raise IdentityChainError( - failures=tuple(failures), - unclaimed_sources=self._unclaimed_sources, - ) - - async def invalidate(self) -> None: - """Invalidate every resolver in the chain.""" - for resolver in self._resolvers: - await resolver.invalidate() diff --git a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/exceptions.py b/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/exceptions.py index 6009d6b51..079b5f8dc 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/exceptions.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/exceptions.py @@ -1,9 +1,7 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 from dataclasses import dataclass -from typing import Any -from smithy_core.aio.interfaces.identity import IdentityResolver from smithy_core.exceptions import SmithyError, SmithyIdentityError __all__ = [ @@ -41,7 +39,6 @@ class IdentityResolverFailure: """A failed identity resolution attempt.""" provider_name: str - resolver: IdentityResolver[Any, Any] error: SmithyIdentityError diff --git a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/ordering.py b/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/ordering.py index d2da8cc36..17fdac240 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/ordering.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/ordering.py @@ -4,7 +4,7 @@ from dataclasses import dataclass from enum import Enum -from ...config import shared_config_files_exist +from ...config.context import shared_config_files_exist __all__ = [ "After", diff --git a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/providers/__init__.py b/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/providers/__init__.py index d21780210..f3ca3e3b5 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/providers/__init__.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/providers/__init__.py @@ -1,4 +1,7 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 +# Reserves the "smithy_aws_core.identity.chain_providers" entry-point group for +# sync providers; the async chain discovers under "...aio.identity.chain_providers". +# TODO(sync-api): populate alongside the sync credential chain. __all__: list[str] = [] diff --git a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/providers/process.py b/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/providers/process.py index 70dadd928..015fa4081 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/providers/process.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/identity/chain/providers/process.py @@ -4,27 +4,13 @@ import sys from smithy_core.exceptions import SmithyError -from smithy_core.interfaces.identity import Identity - -from ...components import AWSCredentialsIdentity -from ...process import ProcessCredentialsResolver -from ..ordering import Standard, StandardProvider -from ..provider import ChainSetup - -__all__ = [ - "ProcessConfigurationError", - "ProfileCredentialProcessProvider", -] - -_CREDENTIAL_PROCESS = "credential_process" -_ACCOUNT_ID = "aws_account_id" class ProcessConfigurationError(SmithyError): """Raised when a profile's credential process command is misconfigured.""" -def _split_process_command( +def _split_process_command( # type: ignore[reportUnusedFunction] command: str, *, platform: str | None = None, @@ -99,40 +85,3 @@ def _split_windows_command(command: str) -> list[str]: arguments.append("".join(argument)) return arguments - - -class ProfileCredentialProcessProvider: - """Adds a process credential resolver configured by the active profile.""" - - @property - def name(self) -> str: - """Return the canonical provider name.""" - return StandardProvider.PROFILE_CREDENTIAL_PROCESS.canonical_name - - @property - def ordering(self) -> Standard: - """Return the provider's standard chain position.""" - return Standard(slot=StandardProvider.PROFILE_CREDENTIAL_PROCESS) - - async def setup(self, identity_type: type[Identity], setup: ChainSetup) -> None: - """Add a resolver when the active profile configures a credential process.""" - if identity_type is not AWSCredentialsIdentity: - return - - config_file = setup.config_file - profile_name = setup.profile_name - if config_file is None or profile_name is None: - return - - command = config_file.get(profile_name, _CREDENTIAL_PROCESS) - if not command: - return - - # The process output's AccountId takes precedence; the profile's - # aws_account_id is only used as a fallback. - setup.add_terminal_resolver( - ProcessCredentialsResolver( - _split_process_command(command), - account_id=config_file.get(profile_name, _ACCOUNT_ID), - ) - ) 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 index 25b54c1dc..ae7214966 100644 --- a/packages/smithy-aws-core/src/smithy_aws_core/identity/components.py +++ b/packages/smithy-aws-core/src/smithy_aws_core/identity/components.py @@ -4,8 +4,7 @@ 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.interfaces.identity import Identity, IdentityResolver __all__ = [ "AWSCredentialsIdentity", 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 2ca5799e8..7e9a595e3 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 @@ -1,42 +1,9 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -import asyncio -import ipaddress -import json -import os -import warnings from dataclasses import dataclass -from datetime import UTC, datetime -from urllib.parse import urlparse -from smithy_core import URI -from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.exceptions import SmithyIdentityError -from smithy_http import Field, Fields -from smithy_http.aio import HTTPRequest -from smithy_http.aio.interfaces import HTTPClient, HTTPResponse - -from smithy_aws_core.identity.components import ( - AWSCredentialsIdentity, - AWSIdentityProperties, -) - -__all__ = [ - "ContainerCredentialsConfig", - "ContainerCredentialsResolver", - "ContainerMetadataClient", -] - -_CONTAINER_METADATA_IP = "169.254.170.2" -_CONTAINER_METADATA_ALLOWED_HOSTS = { - _CONTAINER_METADATA_IP, - "169.254.170.23", - "fd00:ec2::23", - "localhost", -} _DEFAULT_TIMEOUT = 2 _DEFAULT_RETRIES = 3 -_SLEEP_SECONDS = 1 @dataclass @@ -45,187 +12,3 @@ class ContainerCredentialsConfig: timeout: int = _DEFAULT_TIMEOUT retries: int = _DEFAULT_RETRIES - - -class ContainerMetadataClient: - """Client for remote credential retrieval in Container environments like ECS/EKS.""" - - def __init__(self, http_client: HTTPClient, config: ContainerCredentialsConfig): - self._http_client = http_client - self._config = config - - def _validate_allowed_url(self, uri: URI) -> None: - if self._is_loopback(uri.host): - return - - if not self._is_allowed_container_metadata_host(uri.host): - raise SmithyIdentityError( - f"Unsupported host '{uri.host}'. " - f"Can only retrieve metadata from a loopback address or " - f"one of: {', '.join(_CONTAINER_METADATA_ALLOWED_HOSTS)}" - ) - - async def get_credentials(self, uri: URI, fields: Fields) -> dict[str, str]: - self._validate_allowed_url(uri) - fields.set_field(Field(name="Accept", values=["application/json"])) - - attempts = 0 - last_exc = None - while attempts < self._config.retries: - try: - request = HTTPRequest( - method="GET", - destination=uri, - fields=fields, - ) - response: HTTPResponse = await self._http_client.send(request) - body = await response.consume_body_async() - if response.status != 200: - raise SmithyIdentityError( - f"Container metadata service returned {response.status}: " - f"{body.decode('utf-8')}" - ) - try: - return json.loads(body.decode("utf-8")) - except Exception as e: - raise SmithyIdentityError( - f"Unable to parse JSON from container metadata: {body.decode('utf-8')}" - ) from e - except Exception as e: - last_exc = e - await asyncio.sleep(_SLEEP_SECONDS) - attempts += 1 - - raise SmithyIdentityError( - f"Failed to retrieve container metadata after {self._config.retries} attempt(s)" - ) from last_exc - - def _is_loopback(self, hostname: str) -> bool: - try: - return ipaddress.ip_address(hostname).is_loopback - except ValueError: - return False - - def _is_allowed_container_metadata_host(self, hostname: str) -> bool: - return hostname in _CONTAINER_METADATA_ALLOWED_HOSTS - - -class ContainerCredentialsResolver( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] -): - """Resolves AWS Credentials from container credential sources. - - .. warning:: - This resolver is deprecated. Use the resolver provided by the - ``aws-credentials-http`` package instead. - """ - - ENV_VAR = "AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" - ENV_VAR_FULL = "AWS_CONTAINER_CREDENTIALS_FULL_URI" - ENV_VAR_AUTH_TOKEN = "AWS_CONTAINER_AUTHORIZATION_TOKEN" # noqa: S105 - ENV_VAR_AUTH_TOKEN_FILE = "AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE" # noqa: S105 - - def __init__( - self, - http_client: HTTPClient, - config: ContainerCredentialsConfig | None = None, - ): - warnings.warn( - "`ContainerCredentialsResolver` is deprecated; install " - "`aws-credentials-http` and use its resolver instead.", - DeprecationWarning, - stacklevel=2, - ) - self._http_client = http_client - self._config = config or ContainerCredentialsConfig() - self._client = ContainerMetadataClient(http_client, self._config) - self._credentials = None - - async def _resolve_uri_from_env(self) -> URI: - if self.ENV_VAR in os.environ: - return URI( - scheme="http", - host=_CONTAINER_METADATA_IP, - path=os.environ[self.ENV_VAR], - ) - elif self.ENV_VAR_FULL in os.environ: - parsed = urlparse(os.environ[self.ENV_VAR_FULL]) - return URI( - scheme=parsed.scheme, - host=parsed.hostname or "", - port=parsed.port, - path=parsed.path, - ) - else: - raise SmithyIdentityError( - f"Neither {self.ENV_VAR} or {self.ENV_VAR_FULL} environment " - "variables are set. Unable to resolve credentials." - ) - - async def _resolve_fields_from_env(self) -> Fields: - fields = Fields() - if self.ENV_VAR_AUTH_TOKEN_FILE in os.environ: - try: - filename = os.environ[self.ENV_VAR_AUTH_TOKEN_FILE] - auth_token = await asyncio.to_thread(self._read_file, filename) - except (FileNotFoundError, PermissionError) as e: - raise SmithyIdentityError( - f"Unable to open {os.environ[self.ENV_VAR_AUTH_TOKEN_FILE]}." - ) from e - - fields.set_field(Field(name="Authorization", values=[auth_token])) - elif self.ENV_VAR_AUTH_TOKEN in os.environ: - auth_token = os.environ[self.ENV_VAR_AUTH_TOKEN] - fields.set_field(Field(name="Authorization", values=[auth_token])) - - return fields - - def _read_file(self, filename: str) -> str: - with open(filename) as f: - try: - return f.read().strip() - except UnicodeDecodeError as e: - raise SmithyIdentityError( - f"Unable to read valid utf-8 bytes from {filename}." - ) from e - - async def get_identity( - self, *, properties: AWSIdentityProperties - ) -> AWSCredentialsIdentity: - if ( - self._credentials is not None - and self._credentials.expiration - and datetime.now(UTC) < self._credentials.expiration - ): - return self._credentials - - uri = await self._resolve_uri_from_env() - fields = await self._resolve_fields_from_env() - creds = await self._client.get_credentials(uri, fields) - - access_key_id = creds.get("AccessKeyId") - secret_access_key = creds.get("SecretAccessKey") - session_token = creds.get("Token") - expiration = creds.get("Expiration") - account_id = creds.get("AccountId") - - if isinstance(expiration, str): - expiration = datetime.fromisoformat(expiration).replace(tzinfo=UTC) - - if access_key_id is None or secret_access_key is None: - raise SmithyIdentityError( - "AccessKeyId and SecretAccessKey are required for container credentials" - ) - - self._credentials = AWSCredentialsIdentity( - access_key_id=access_key_id, - secret_access_key=secret_access_key, - session_token=session_token, - expiration=expiration, - account_id=account_id, - ) - return self._credentials - - async def invalidate(self) -> None: - """Discard cached credentials so the next resolution re-queries the endpoint.""" - self._credentials = None 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 45552af6a..635477a81 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 @@ -2,7 +2,6 @@ # SPDX-License-Identifier: Apache-2.0 import os -from smithy_core.aio.interfaces.identity import IdentityResolver from smithy_core.exceptions import SmithyIdentityError from .components import AWSCredentialsIdentity, AWSIdentityProperties @@ -10,15 +9,13 @@ __all__ = ["EnvironmentCredentialsResolver"] -class EnvironmentCredentialsResolver( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] -): +class EnvironmentCredentialsResolver: """Resolves AWS Credentials from system environment variables.""" def __init__(self): self._credentials = None - async def get_identity( + def get_identity( self, *, properties: AWSIdentityProperties ) -> AWSCredentialsIdentity: if self._credentials is not None: 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 b818a3975..101c48267 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 @@ -1,88 +1,6 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -import asyncio -import json -import warnings -from dataclasses import dataclass -from datetime import UTC, datetime, timedelta -from types import MappingProxyType -from typing import Literal - -from smithy_core import URI -from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy -from smithy_core.aio.retries import SimpleRetryStrategy -from smithy_core.exceptions import SmithyIdentityError -from smithy_http import Field, Fields -from smithy_http.aio import HTTPRequest -from smithy_http.aio.interfaces import HTTPClient - -from .. import __version__ -from .components import AWSCredentialsIdentity, AWSIdentityProperties - -__all__ = [ - "Config", - "EC2Metadata", - "IMDSCredentialsResolver", - "Token", - "TokenCache", -] - -_USER_AGENT_FIELD = Field( - name="User-Agent", - values=[f"aws-sdk-python-imds-client/{__version__}"], -) - - -@dataclass(init=False) -class Config: - """Configuration for EC2Metadata.""" - - _HOST_MAPPING = MappingProxyType( - {"IPv4": "169.254.169.254", "IPv6": "[fd00:ec2::254]"} - ) - _MIN_TTL = 5 - _MAX_TTL = 21600 - - retry_strategy: RetryStrategy - endpoint_uri: URI - endpoint_mode: Literal["IPv4", "IPv6"] - token_ttl: int - - def __init__( - self, - *, - retry_strategy: RetryStrategy | None = None, - endpoint_uri: URI | None = None, - endpoint_mode: Literal["IPv4", "IPv6"] = "IPv4", - token_ttl: int = _MAX_TTL, - ec2_instance_profile_name: str | None = None, - ): - # TODO: Implement retries. - self.retry_strategy = retry_strategy or SimpleRetryStrategy(max_attempts=3) - self.endpoint_mode = endpoint_mode - self.endpoint_uri = self._resolve_endpoint(endpoint_uri, endpoint_mode) - self.token_ttl = self._validate_token_ttl(token_ttl) - self.ec2_instance_profile_name = ec2_instance_profile_name - - def _validate_token_ttl(self, ttl: int) -> int: - if not self._MIN_TTL <= ttl <= self._MAX_TTL: - raise ValueError( - f"Token TTL must be between {self._MIN_TTL} and {self._MAX_TTL} seconds." - ) - return ttl - - def _resolve_endpoint( - self, endpoint_uri: URI | None, endpoint_mode: Literal["IPv4", "IPv6"] - ) -> URI: - if endpoint_uri is not None: - return endpoint_uri - - return URI( - scheme="http", - host=self._HOST_MAPPING.get(endpoint_mode, self._HOST_MAPPING["IPv4"]), - port=80, - ) +from datetime import datetime, timedelta class Token: @@ -100,159 +18,3 @@ def is_expired(self) -> bool: @property def value(self) -> str: return self._value - - -class TokenCache: - """Holds the token needed to fetch instance metadata. - - In addition, it knows how to refresh itself. - """ - - _TOKEN_PATH = "/latest/api/token" # noqa: S105 - - def __init__(self, http_client: HTTPClient, config: Config): - self._http_client = http_client - self._config = config - self._base_uri = config.endpoint_uri - self._refresh_lock = asyncio.Lock() - self._token = None - - def _should_refresh(self) -> bool: - return self._token is None or self._token.is_expired() - - async def _refresh(self) -> None: - async with self._refresh_lock: - if not self._should_refresh(): - return - headers = Fields( - [ - _USER_AGENT_FIELD, - Field( - name="x-aws-ec2-metadata-token-ttl-seconds", - values=[str(self._config.token_ttl)], - ), - ] - ) - request = HTTPRequest( - method="PUT", - destination=URI( - scheme=self._base_uri.scheme, - host=self._base_uri.host, - port=self._base_uri.port, - path=self._TOKEN_PATH, - ), - fields=headers, - ) - response = await self._http_client.send(request) - token_value = await response.consume_body_async() - self._token = Token(token_value.decode("utf-8"), self._config.token_ttl) - - async def get_token(self) -> Token: - if self._should_refresh(): - await self._refresh() - assert self._token is not None # noqa: S101 - return self._token - - -class EC2Metadata: - def __init__(self, http_client: HTTPClient, config: Config | None = None): - self._http_client = http_client - self._config = config or Config() - self._token_cache = TokenCache( - http_client=self._http_client, config=self._config - ) - - async def get(self, *, path: str) -> str: - token = await self._token_cache.get_token() - headers = Fields( - [ - _USER_AGENT_FIELD, - Field( - name="x-aws-ec2-metadata-token", - values=[token.value], - ), - ] - ) - request = HTTPRequest( - method="GET", - destination=URI( - scheme=self._config.endpoint_uri.scheme, - host=self._config.endpoint_uri.host, - port=self._config.endpoint_uri.port, - path=path, - ), - fields=headers, - ) - response = await self._http_client.send(request=request) - body = await response.consume_body_async() - return body.decode("utf-8") - - -class IMDSCredentialsResolver( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] -): - """Resolves AWS Credentials from an EC2 Instance Metadata Service (IMDS) client. - - .. warning:: - This resolver is deprecated. Use the resolver provided by the - ``aws-credentials-imds`` package instead. - """ - - _METADATA_PATH_BASE = "/latest/meta-data/iam/security-credentials" - - def __init__(self, http_client: HTTPClient, config: Config | None = None): - warnings.warn( - "`IMDSCredentialsResolver` is deprecated; install " - "`aws-credentials-imds` and use its resolver instead.", - DeprecationWarning, - stacklevel=2, - ) - # TODO: Respect IMDS specific config values from aws shared config file and environment. - self._http_client = http_client - self._ec2_metadata_client = EC2Metadata(http_client=http_client, config=config) - self._config = config or Config() - self._credentials = None - self._profile_name = self._config.ec2_instance_profile_name - - async def get_identity( - self, *, properties: AWSIdentityProperties - ) -> AWSCredentialsIdentity: - if ( - self._credentials is not None - and self._credentials.expiration - and datetime.now(UTC) < self._credentials.expiration - ): - return self._credentials - - profile = self._profile_name - if profile is None: - profile = await self._ec2_metadata_client.get(path=self._METADATA_PATH_BASE) - - creds_str = await self._ec2_metadata_client.get( - path=f"{self._METADATA_PATH_BASE}/{profile}" - ) - creds = json.loads(creds_str) - - access_key_id = creds.get("AccessKeyId") - secret_access_key = creds.get("SecretAccessKey") - session_token = creds.get("Token") - account_id = creds.get("AccountId") - expiration = creds.get("Expiration") - if expiration is not None: - expiration = datetime.fromisoformat(expiration).replace(tzinfo=UTC) - - if access_key_id is None or secret_access_key is None: - raise SmithyIdentityError("AccessKeyId and SecretAccessKey are required") - - self._credentials = AWSCredentialsIdentity( - access_key_id=access_key_id, - secret_access_key=secret_access_key, - session_token=session_token, - expiration=expiration, - account_id=account_id, - ) - return self._credentials - - async def invalidate(self) -> None: - """Discard cached credentials so the next resolution re-queries IMDS.""" - self._credentials = None 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 dd8eae2d5..5b01aa54c 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 @@ -1,7 +1,7 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -from smithy_core.aio.interfaces.identity import IdentityResolver from smithy_core.exceptions import SmithyIdentityError +from smithy_core.interfaces.identity import IdentityResolver from .components import AWSCredentialsIdentity, AWSIdentityProperties @@ -14,13 +14,11 @@ class StaticCredentialsResolver( """Resolves static AWS credentials from a fixed identity or request properties.""" def __init__(self, identity: AWSCredentialsIdentity | None = None) -> None: - """Initialize the resolver with optional fixed credentials.""" self._identity = identity - async def get_identity( + def get_identity( self, *, properties: AWSIdentityProperties ) -> AWSCredentialsIdentity: - """Resolve credentials from the fixed identity or request properties.""" if self._identity is not None: return self._identity diff --git a/packages/smithy-aws-core/tests/unit/aio/test_event_streams.py b/packages/smithy-aws-core/tests/unit/aio/test_event_streams.py index 138e8cf5d..d17b1169d 100644 --- a/packages/smithy-aws-core/tests/unit/aio/test_event_streams.py +++ b/packages/smithy-aws-core/tests/unit/aio/test_event_streams.py @@ -9,7 +9,7 @@ from typing import Any -from smithy_aws_core.aio.protocols import AwsJson11ClientProtocol +from smithy_aws_core.aio.protocols import AsyncAwsJson11ClientProtocol from smithy_aws_event_stream.aio import AWSEventReceiver from smithy_aws_event_stream.events import Event, EventMessage from smithy_core import URI @@ -123,8 +123,8 @@ def _operation() -> APIOperation[Any, Any]: ) -def _protocol() -> AwsJson11ClientProtocol: - return AwsJson11ClientProtocol( +def _protocol() -> AsyncAwsJson11ClientProtocol: + return AsyncAwsJson11ClientProtocol( ProtocolSettings( namespace="smithy.example", service_target="StreamService", diff --git a/packages/smithy-aws-core/tests/unit/aio/test_protocols.py b/packages/smithy-aws-core/tests/unit/aio/test_protocols.py index 45342a6ce..a82a49794 100644 --- a/packages/smithy-aws-core/tests/unit/aio/test_protocols.py +++ b/packages/smithy-aws-core/tests/unit/aio/test_protocols.py @@ -9,12 +9,12 @@ import pytest from smithy_aws_core.aio.protocols import ( + AsyncAwsJson11ClientProtocol, + AsyncAwsQueryClientProtocol, + AsyncRestXmlClientProtocol, AWSErrorIdentifier, - AwsJson11ClientProtocol, AWSJSONDocument, - AwsQueryClientProtocol, ProtocolSettings, - RestXmlClientProtocol, ) from smithy_aws_event_stream.events import EventMessage from smithy_core import URI as _URI @@ -218,8 +218,8 @@ def _mock_operation( return cast("APIOperation[Any, Any]", operation) -def _aws_json11_protocol() -> AwsJson11ClientProtocol: - return AwsJson11ClientProtocol( +def _aws_json11_protocol() -> AsyncAwsJson11ClientProtocol: + return AsyncAwsJson11ClientProtocol( ProtocolSettings( namespace="com.test", service_target="JsonService", @@ -501,7 +501,7 @@ async def test_aws_json11_raises_parse_error_for_invalid_error_body() -> None: async def test_aws_query_serializes_base_request_shape() -> None: - protocol = AwsQueryClientProtocol( + protocol = AsyncAwsQueryClientProtocol( ProtocolSettings( namespace="com.test", service_target="QueryService", @@ -528,7 +528,7 @@ async def test_aws_query_serializes_base_request_shape() -> None: async def test_aws_query_resolves_modeled_error_from_query_error_trait() -> None: - protocol = AwsQueryClientProtocol( + protocol = AsyncAwsQueryClientProtocol( ProtocolSettings( namespace="com.test", service_target="QueryService", @@ -566,7 +566,7 @@ async def test_aws_query_resolves_modeled_error_from_query_error_trait() -> None async def test_aws_query_parses_success_body_once() -> None: - protocol = AwsQueryClientProtocol( + protocol = AsyncAwsQueryClientProtocol( ProtocolSettings( namespace="com.test", service_target="QueryService", @@ -601,7 +601,7 @@ async def test_aws_query_parses_success_body_once() -> None: async def test_aws_query_resolves_modeled_error_from_default_namespace_fallback() -> ( None ): - protocol = AwsQueryClientProtocol( + protocol = AsyncAwsQueryClientProtocol( ProtocolSettings( namespace="com.test", service_target="QueryService", @@ -631,7 +631,7 @@ async def test_aws_query_resolves_modeled_error_from_default_namespace_fallback( async def test_aws_query_returns_generic_error_for_unknown_code() -> None: - protocol = AwsQueryClientProtocol( + protocol = AsyncAwsQueryClientProtocol( ProtocolSettings( namespace="com.test", service_target="QueryService", @@ -663,7 +663,7 @@ async def test_aws_query_returns_generic_error_for_unknown_code() -> None: async def test_aws_query_parses_invalid_error_body_once() -> None: - protocol = AwsQueryClientProtocol( + protocol = AsyncAwsQueryClientProtocol( ProtocolSettings( namespace="com.test", service_target="QueryService", @@ -693,7 +693,7 @@ async def test_aws_query_parses_invalid_error_body_once() -> None: async def test_aws_query_reports_request_id_from_the_response_body() -> None: - protocol = AwsQueryClientProtocol( + protocol = AsyncAwsQueryClientProtocol( ProtocolSettings( namespace="com.test", service_target="QueryService", @@ -731,7 +731,7 @@ async def test_aws_query_reports_request_id_from_the_response_body() -> None: async def test_aws_query_prefers_a_request_id_header_when_one_is_sent() -> None: - protocol = AwsQueryClientProtocol( + protocol = AsyncAwsQueryClientProtocol( ProtocolSettings( namespace="com.test", service_target="QueryService", @@ -756,7 +756,7 @@ async def test_aws_query_prefers_a_request_id_header_when_one_is_sent() -> None: async def test_aws_query_reports_no_request_id_when_the_body_has_none() -> None: - protocol = AwsQueryClientProtocol( + protocol = AsyncAwsQueryClientProtocol( ProtocolSettings( namespace="com.test", service_target="QueryService", @@ -775,7 +775,7 @@ async def test_aws_query_reports_no_request_id_when_the_body_has_none() -> None: async def test_aws_query_does_not_report_a_previous_attempts_request_id() -> None: - protocol = AwsQueryClientProtocol( + protocol = AsyncAwsQueryClientProtocol( ProtocolSettings( namespace="com.test", service_target="QueryService", @@ -817,7 +817,7 @@ async def test_aws_query_does_not_report_a_previous_attempts_request_id() -> Non async def test_aws_query_does_not_report_a_previous_attempts_request_id_when_deserialization_is_skipped() -> ( None ): - protocol = AwsQueryClientProtocol( + protocol = AsyncAwsQueryClientProtocol( ProtocolSettings( namespace="com.test", service_target="QueryService", @@ -852,7 +852,7 @@ async def test_aws_query_does_not_report_a_previous_attempts_request_id_when_des async def _deserialize_query_error( - protocol: AwsQueryClientProtocol, + protocol: AsyncAwsQueryClientProtocol, response: HTTPResponse, context: TypedProperties, ) -> None: @@ -891,8 +891,8 @@ def deserialize(cls, deserializer: ShapeDeserializer) -> "_NoSuchBucket": return cls() -def _rest_xml_protocol() -> RestXmlClientProtocol: - return RestXmlClientProtocol( +def _rest_xml_protocol() -> AsyncRestXmlClientProtocol: + return AsyncRestXmlClientProtocol( ProtocolSettings( namespace="com.test", service_target="XmlService", diff --git a/packages/smithy-aws-core/tests/unit/config/test_config_file_io.py b/packages/smithy-aws-core/tests/unit/config/test_config_file_io.py index 0b24c8327..7454d5bf5 100644 --- a/packages/smithy-aws-core/tests/unit/config/test_config_file_io.py +++ b/packages/smithy-aws-core/tests/unit/config/test_config_file_io.py @@ -6,8 +6,8 @@ from unittest.mock import patch import pytest -from smithy_aws_core.config import DefaultFileSystem, load_config -from smithy_aws_core.config.file_parser import parse_config_file +from smithy_aws_core.aio.config import AsyncDefaultFileSystem, load_config_async +from smithy_aws_core.aio.config.file_parser import parse_config_file_async class TestFileIssues: @@ -15,7 +15,7 @@ class TestFileIssues: @pytest.mark.asyncio async def test_load_config_with_missing_files(self, tmp_path: Path): - config_file = await load_config( + config_file = await load_config_async( config_file_path=tmp_path / "no_config", credentials_file_path=tmp_path / "no_credentials", ) @@ -25,7 +25,7 @@ async def test_load_config_with_missing_files(self, tmp_path: Path): @pytest.mark.asyncio async def test_permission_denied_returns_empty(self, tmp_path: Path): - fs = DefaultFileSystem() + fs = AsyncDefaultFileSystem() restricted_file = tmp_path / "restricted_config" restricted_file.write_text("[profile default]\nregion = us-east-1\n") # Patch read_text to raise PermissionError rather than relying on @@ -33,7 +33,7 @@ async def test_permission_denied_returns_empty(self, tmp_path: Path): with patch.object( Path, "read_text", side_effect=PermissionError("Permission denied") ): - result = await parse_config_file(str(restricted_file), fs) + result = await parse_config_file_async(str(restricted_file), fs) assert result == {} @@ -43,11 +43,11 @@ class TestEncodingErrors: @pytest.mark.asyncio async def test_bad_unicode_raises_error(self, tmp_path: Path): """A file with invalid UTF-8 bytes should raise UnicodeDecodeError.""" - fs = DefaultFileSystem() + fs = AsyncDefaultFileSystem() bad_file = tmp_path / "bad_config" bad_file.write_bytes(b"[default]\nregion = \xff\xfe invalid") with pytest.raises(UnicodeDecodeError): - await parse_config_file(str(bad_file), fs) + await parse_config_file_async(str(bad_file), fs) class TestMultiFileMerge: @@ -66,7 +66,7 @@ async def test_credentials_override_config(self, tmp_path: Path): "aws_secret_access_key = CREDS_SECRET\n" ) - result = await load_config( + result = await load_config_async( config_file_path=config, credentials_file_path=credentials, ) @@ -80,7 +80,7 @@ async def test_missing_credentials_file_still_loads_config(self, tmp_path: Path) config = tmp_path / "config" config.write_text("[profile work]\nregion = us-west-2\n") - result = await load_config( + result = await load_config_async( config_file_path=config, credentials_file_path=tmp_path / "nonexistent", ) @@ -91,7 +91,7 @@ async def test_missing_config_file_still_loads_credentials(self, tmp_path: Path) credentials = tmp_path / "credentials" credentials.write_text("[default]\naws_access_key_id = KEY\n") - result = await load_config( + result = await load_config_async( config_file_path=tmp_path / "nonexistent", credentials_file_path=credentials, ) diff --git a/packages/smithy-aws-core/tests/unit/config/test_config_file_parser.py b/packages/smithy-aws-core/tests/unit/config/test_config_file_parser.py index 64686d507..1e0968f84 100644 --- a/packages/smithy-aws-core/tests/unit/config/test_config_file_parser.py +++ b/packages/smithy-aws-core/tests/unit/config/test_config_file_parser.py @@ -6,12 +6,12 @@ from typing import cast import pytest -from smithy_aws_core.config import DefaultFileSystem +from smithy_aws_core.aio.config import AsyncDefaultFileSystem +from smithy_aws_core.aio.config.file_parser import parse_config_file_async from smithy_aws_core.config.exceptions import ConfigParseError from smithy_aws_core.config.file_parser import ( FileType, RawParsedSections, - parse_config_file, standardize, ) from smithy_aws_core.config.merged_config import MergedConfig @@ -31,11 +31,11 @@ async def _run_parse_and_standardize( ) -> dict[str, object]: """Write content to temp files, parse through public API, return merged output.""" # Write config content to temp file - fs = DefaultFileSystem() + fs = AsyncDefaultFileSystem() if config_content is not None: config_path = tmp_path / "config" config_path.write_text(config_content, encoding="utf-8") - raw_config = await parse_config_file(str(config_path), fs) + raw_config = await parse_config_file_async(str(config_path), fs) else: raw_config = {} @@ -43,7 +43,7 @@ async def _run_parse_and_standardize( if credentials_content is not None: credentials_path = tmp_path / "credentials" credentials_path.write_text(credentials_content, encoding="utf-8") - raw_credentials = await parse_config_file(str(credentials_path), fs) + raw_credentials = await parse_config_file_async(str(credentials_path), fs) else: raw_credentials = {} @@ -146,24 +146,24 @@ def test_credentials_section_names(section_name: str, should_be_valid: bool): @pytest.mark.asyncio async def test_parse_error_includes_file_path(tmp_path: Path): - fs = DefaultFileSystem() + fs = AsyncDefaultFileSystem() bad_file = tmp_path / "config" bad_file.write_text("[profile p\n") # unclosed section header with pytest.raises(ConfigParseError, match=str(bad_file)): - await parse_config_file(str(bad_file), fs) + await parse_config_file_async(str(bad_file), fs) @pytest.mark.asyncio async def test_invalid_property_continuation_not_appended_to_previous(tmp_path: Path): """Continuation lines after an invalid property should be discarded, not appended to the previous valid property.""" - fs = DefaultFileSystem() + fs = AsyncDefaultFileSystem() config_file = tmp_path / "config" config_file.write_text( "[profile p]\nregion = us-east-1\ninvalid key = ignored\n continuation\n" ) - raw = await parse_config_file(str(config_file), fs) + raw = await parse_config_file_async(str(config_file), fs) result = standardize(raw, FileType.CONFIG) assert result.profiles["p"].properties["region"] == "us-east-1" @@ -171,13 +171,13 @@ async def test_invalid_property_continuation_not_appended_to_previous(tmp_path: @pytest.mark.asyncio async def test_invalid_property_in_first_line_with_continuation_ignored(tmp_path: Path): """Continuation lines when the first property is invalid should be discarded""" - fs = DefaultFileSystem() + fs = AsyncDefaultFileSystem() config_file = tmp_path / "config" config_file.write_text( "[profile p]\ninvalid key = ignored\n continuation\n" "region = us-east-1\ninvalid key = ignored\n continuation\n" ) - raw = await parse_config_file(str(config_file), fs) + raw = await parse_config_file_async(str(config_file), fs) result = standardize(raw, FileType.CONFIG) assert result.profiles["p"].properties["region"] == "us-east-1" @@ -185,14 +185,14 @@ async def test_invalid_property_in_first_line_with_continuation_ignored(tmp_path @pytest.mark.asyncio async def test_consecutive_invalid_properties_ignored(tmp_path: Path): """Consecutive invalid properties should be discarded""" - fs = DefaultFileSystem() + fs = AsyncDefaultFileSystem() config_file = tmp_path / "config" config_file.write_text( "[profile p]\nregion = us-east-1\ninvalid key = ignored\n continuation\n" "invalid key = ignored\n continuation\ninvalid key = ignored\n continuation\n" "output = json\n" ) - raw = await parse_config_file(str(config_file), filesystem=fs) + raw = await parse_config_file_async(str(config_file), filesystem=fs) result = standardize(raw, FileType.CONFIG) assert result.profiles["p"].properties["region"] == "us-east-1" assert result.profiles["p"].properties["output"] == "json" diff --git a/packages/smithy-aws-core/tests/unit/config/test_resolver.py b/packages/smithy-aws-core/tests/unit/config/test_resolver.py index 04014d94b..f238931b2 100644 --- a/packages/smithy-aws-core/tests/unit/config/test_resolver.py +++ b/packages/smithy-aws-core/tests/unit/config/test_resolver.py @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 """Tests for the config resolution pipeline. -Tests AsyncAwsConfig.resolve(), resolver functions, SharedConfigContext, +Tests AsyncAwsConfig.resolve(), resolver functions, AsyncSharedConfigContext, provenance tracking, and precedence behavior. """ @@ -14,14 +14,9 @@ from unittest.mock import patch import pytest -from smithy_aws_core.config.aws_config import AsyncAwsConfig, AwsConfigOverrides -from smithy_aws_core.config.context import SharedConfigContext -from smithy_aws_core.config.exceptions import ( - ConfigError, - ConfigValidationError, - ProfileNotFoundError, -) -from smithy_aws_core.config.resolvers import ( +from smithy_aws_core.aio.config.aws_config import AsyncAwsConfig, AwsConfigOverrides +from smithy_aws_core.aio.config.context import AsyncSharedConfigContext +from smithy_aws_core.aio.config.resolvers import ( EndpointUriResolver, resolve_endpoint_uri, resolve_max_attempts, @@ -29,10 +24,17 @@ resolve_retry_mode, resolve_sdk_ua_app_id, ) +from smithy_aws_core.aio.identity.environment import ( + AsyncEnvironmentCredentialsResolver, +) +from smithy_aws_core.aio.identity.static import AsyncStaticCredentialsResolver +from smithy_aws_core.config.exceptions import ( + ConfigError, + ConfigValidationError, + ProfileNotFoundError, +) from smithy_aws_core.config.types import UNSET, ConfigSource -from smithy_aws_core.identity.environment import EnvironmentCredentialsResolver -from smithy_aws_core.identity.static import StaticCredentialsResolver -from smithy_core.aio.retries import StandardRetryStrategy +from smithy_core.aio.retries import AsyncStandardRetryStrategy from smithy_http.interfaces import HTTPRequestConfiguration from smithy_http.testing import MockHTTPClient @@ -54,7 +56,7 @@ class TestResolveRegion: @pytest.mark.asyncio async def test_resolves_from_aws_region(self): with patch.dict(os.environ, {"AWS_REGION": "us-west-2"}, clear=True): - ctx = SharedConfigContext() + ctx = AsyncSharedConfigContext() result = await resolve_region(ctx) assert result.value == "us-west-2" assert result.source == ConfigSource.ENV @@ -62,7 +64,7 @@ async def test_resolves_from_aws_region(self): @pytest.mark.asyncio async def test_resolves_from_aws_default_region(self): with patch.dict(os.environ, {"AWS_DEFAULT_REGION": "eu-central-1"}, clear=True): - ctx = SharedConfigContext() + ctx = AsyncSharedConfigContext() result = await resolve_region(ctx) assert result.value == "eu-central-1" assert result.source == ConfigSource.ENV @@ -74,7 +76,7 @@ async def test_aws_region_takes_precedence_over_default_region(self): {"AWS_REGION": "us-west-2", "AWS_DEFAULT_REGION": "eu-west-1"}, clear=True, ): - ctx = SharedConfigContext() + ctx = AsyncSharedConfigContext() result = await resolve_region(ctx) assert result.value == "us-west-2" @@ -84,7 +86,7 @@ async def test_resolves_from_profile_when_no_env(self): {"/fake/config": "[profile default]\nregion = ap-southeast-1\n"} ) with patch.dict(os.environ, {}, clear=True): - ctx = SharedConfigContext( + ctx = AsyncSharedConfigContext( fs=fs, config_file_path="/fake/config", credentials_file_path="/fake/credentials", @@ -97,7 +99,7 @@ async def test_resolves_from_profile_when_no_env(self): async def test_env_takes_precedence_over_profile(self): fs = FakeFileSystem({"/fake/config": "[profile default]\nregion = eu-west-1\n"}) with patch.dict(os.environ, {"AWS_REGION": "us-west-2"}, clear=True): - ctx = SharedConfigContext( + ctx = AsyncSharedConfigContext( fs=fs, config_file_path="/fake/config", credentials_file_path="/fake/credentials", @@ -110,7 +112,7 @@ async def test_env_takes_precedence_over_profile(self): async def test_empty_string_env_var_treated_as_absent(self): fs = FakeFileSystem({"/fake/config": "[profile default]\nregion = eu-west-1\n"}) with patch.dict(os.environ, {"AWS_REGION": ""}, clear=True): - ctx = SharedConfigContext( + ctx = AsyncSharedConfigContext( fs=fs, config_file_path="/fake/config", credentials_file_path="/fake/credentials", @@ -403,25 +405,25 @@ async def test_typo_in_field_name_raises_attribute_error(self): class TestSharedConfigContext: def test_default_profile_is_default(self): with patch.dict(os.environ, {}, clear=True): - ctx = SharedConfigContext() + ctx = AsyncSharedConfigContext() assert ctx.profile_name == "default" assert ctx.profile_source is ConfigSource.DEFAULT def test_profile_from_aws_profile_env(self): with patch.dict(os.environ, {"AWS_PROFILE": "work"}, clear=True): - ctx = SharedConfigContext() + ctx = AsyncSharedConfigContext() assert ctx.profile_name == "work" assert ctx.profile_source is ConfigSource.ENV def test_empty_aws_profile_env_treated_as_absent(self): with patch.dict(os.environ, {"AWS_PROFILE": ""}, clear=True): - ctx = SharedConfigContext() + ctx = AsyncSharedConfigContext() assert ctx.profile_name == "default" assert ctx.profile_source is ConfigSource.DEFAULT def test_explicit_profile_overrides_env(self): with patch.dict(os.environ, {"AWS_PROFILE": "work"}, clear=True): - ctx = SharedConfigContext(profile_name="custom") + ctx = AsyncSharedConfigContext(profile_name="custom") assert ctx.profile_name == "custom" assert ctx.profile_source is ConfigSource.OVERRIDE @@ -429,7 +431,7 @@ def test_explicit_profile_overrides_env(self): async def test_parsed_profiles_caches_result(self): fs = FakeFileSystem({"/fake/config": "[profile default]\nregion = us-east-1\n"}) with patch.dict(os.environ, {}, clear=True): - ctx = SharedConfigContext( + ctx = AsyncSharedConfigContext( fs=fs, config_file_path="/fake/config", credentials_file_path="/fake/credentials", @@ -440,7 +442,7 @@ async def test_parsed_profiles_caches_result(self): def test_deepcopy_returns_same_instance(self): with patch.dict(os.environ, {}, clear=True): - ctx = SharedConfigContext(fs=NullFileSystem()) + ctx = AsyncSharedConfigContext(fs=NullFileSystem()) assert deepcopy(ctx) is ctx @@ -498,8 +500,8 @@ async def test_shared_resources_are_shared_by_identity(self): # The transport, credentials resolver, and retry strategy hold network # clients, locks, and shared retry quotas that must not be duplicated transport = MockHTTPClient() - resolver = EnvironmentCredentialsResolver() - retry_strategy = StandardRetryStrategy() + resolver = AsyncEnvironmentCredentialsResolver() + retry_strategy = AsyncStandardRetryStrategy() config.transport = transport config.aws_credentials_identity_resolver = resolver config.retry_strategy = retry_strategy @@ -532,7 +534,7 @@ class TestResolveRetryMode: @pytest.mark.asyncio async def test_resolves_from_env(self): with patch.dict(os.environ, {"AWS_RETRY_MODE": "standard"}, clear=True): - ctx = SharedConfigContext() + ctx = AsyncSharedConfigContext() result = await resolve_retry_mode(ctx) assert result.value == "standard" assert result.source == ConfigSource.ENV @@ -543,7 +545,7 @@ async def test_resolves_from_profile_when_no_env(self): {"/fake/config": "[profile default]\nretry_mode = standard\n"} ) with patch.dict(os.environ, {}, clear=True): - ctx = SharedConfigContext( + ctx = AsyncSharedConfigContext( fs=fs, config_file_path="/fake/config", credentials_file_path="/fake/credentials", @@ -558,7 +560,7 @@ async def test_resolves_adaptive_from_profile(self): {"/fake/config": "[profile default]\nretry_mode = adaptive\n"} ) with patch.dict(os.environ, {}, clear=True): - ctx = SharedConfigContext( + ctx = AsyncSharedConfigContext( fs=fs, config_file_path="/fake/config", credentials_file_path="/fake/credentials", @@ -575,7 +577,7 @@ async def test_env_takes_precedence_over_profile(self): {"/fake/config": "[profile default]\nretry_mode = adaptive\n"} ) with patch.dict(os.environ, {"AWS_RETRY_MODE": "standard"}, clear=True): - ctx = SharedConfigContext( + ctx = AsyncSharedConfigContext( fs=fs, config_file_path="/fake/config", credentials_file_path="/fake/credentials", @@ -587,7 +589,7 @@ async def test_env_takes_precedence_over_profile(self): @pytest.mark.asyncio async def test_returns_unset_when_not_found(self): with patch.dict(os.environ, {}, clear=True): - ctx = SharedConfigContext(fs=NullFileSystem()) + ctx = AsyncSharedConfigContext(fs=NullFileSystem()) result = await resolve_retry_mode(ctx) assert result.value is UNSET assert result.source is ConfigSource.DEFAULT @@ -595,7 +597,7 @@ async def test_returns_unset_when_not_found(self): @pytest.mark.asyncio async def test_legacy_warns_and_maps_to_standard(self): with patch.dict(os.environ, {"AWS_RETRY_MODE": "legacy"}, clear=True): - ctx = SharedConfigContext() + ctx = AsyncSharedConfigContext() with pytest.warns( UserWarning, match="'legacy' retry mode is not supported, using 'standard' instead.", @@ -607,7 +609,7 @@ async def test_legacy_warns_and_maps_to_standard(self): @pytest.mark.asyncio async def test_resolves_adaptive_from_env(self): with patch.dict(os.environ, {"AWS_RETRY_MODE": "adaptive"}, clear=True): - ctx = SharedConfigContext() + ctx = AsyncSharedConfigContext() with warnings.catch_warnings(): warnings.simplefilter("error") result = await resolve_retry_mode(ctx) @@ -619,7 +621,7 @@ class TestResolveMaxAttempts: @pytest.mark.asyncio async def test_resolves_from_env(self): with patch.dict(os.environ, {"AWS_MAX_ATTEMPTS": "5"}, clear=True): - ctx = SharedConfigContext() + ctx = AsyncSharedConfigContext() result = await resolve_max_attempts(ctx) assert result.value == 5 assert result.source == ConfigSource.ENV @@ -628,7 +630,7 @@ async def test_resolves_from_env(self): async def test_resolves_from_profile_when_no_env(self): fs = FakeFileSystem({"/fake/config": "[profile default]\nmax_attempts = 10\n"}) with patch.dict(os.environ, {}, clear=True): - ctx = SharedConfigContext( + ctx = AsyncSharedConfigContext( fs=fs, config_file_path="/fake/config", credentials_file_path="/fake/credentials", @@ -641,7 +643,7 @@ async def test_resolves_from_profile_when_no_env(self): async def test_env_takes_precedence_over_profile(self): fs = FakeFileSystem({"/fake/config": "[profile default]\nmax_attempts = 10\n"}) with patch.dict(os.environ, {"AWS_MAX_ATTEMPTS": "3"}, clear=True): - ctx = SharedConfigContext( + ctx = AsyncSharedConfigContext( fs=fs, config_file_path="/fake/config", credentials_file_path="/fake/credentials", @@ -653,14 +655,14 @@ async def test_env_takes_precedence_over_profile(self): @pytest.mark.asyncio async def test_returns_unset_when_not_found(self): with patch.dict(os.environ, {}, clear=True): - ctx = SharedConfigContext(fs=NullFileSystem()) + ctx = AsyncSharedConfigContext(fs=NullFileSystem()) result = await resolve_max_attempts(ctx) assert result.value is UNSET @pytest.mark.asyncio async def test_casts_to_int(self): with patch.dict(os.environ, {"AWS_MAX_ATTEMPTS": "7"}, clear=True): - ctx = SharedConfigContext() + ctx = AsyncSharedConfigContext() result = await resolve_max_attempts(ctx) assert result.value == 7 assert isinstance(result.value, int) @@ -668,7 +670,7 @@ async def test_casts_to_int(self): @pytest.mark.asyncio async def test_invalid_value_raises_error(self): with patch.dict(os.environ, {"AWS_MAX_ATTEMPTS": "abc"}, clear=True): - ctx = SharedConfigContext() + ctx = AsyncSharedConfigContext() with pytest.raises(ConfigValidationError, match="Invalid integer value"): await resolve_max_attempts(ctx) @@ -693,7 +695,7 @@ async def test_service_specific_env_var_takes_precedence( {"AWS_ENDPOINT_URL_BEDROCK_RUNTIME": "https://service-env.com"}, clear=True, ): - ctx = SharedConfigContext( + ctx = AsyncSharedConfigContext( fs=fs, config_file_path="/fake/config", credentials_file_path="/fake/creds", @@ -709,7 +711,7 @@ async def test_global_env_var_when_no_service_specific( with patch.dict( os.environ, {"AWS_ENDPOINT_URL": "https://global-env.com"}, clear=True ): - ctx = SharedConfigContext( + ctx = AsyncSharedConfigContext( fs=NullFileSystem(), config_file_path="/fake/config", credentials_file_path="/fake/creds", @@ -728,7 +730,7 @@ async def test_service_env_beats_global_env(self, resolver: EndpointUriResolver) }, clear=True, ): - ctx = SharedConfigContext( + ctx = AsyncSharedConfigContext( fs=NullFileSystem(), config_file_path="/fake/config", credentials_file_path="/fake/creds", @@ -751,7 +753,7 @@ async def test_service_specific_config_file(self, resolver: EndpointUriResolver) } ) with patch.dict(os.environ, {}, clear=True): - ctx = SharedConfigContext( + ctx = AsyncSharedConfigContext( fs=fs, config_file_path="/fake/config", credentials_file_path="/fake/creds", @@ -768,7 +770,7 @@ async def test_global_config_file_fallback(self, resolver: EndpointUriResolver): } ) with patch.dict(os.environ, {}, clear=True): - ctx = SharedConfigContext( + ctx = AsyncSharedConfigContext( fs=fs, config_file_path="/fake/config", credentials_file_path="/fake/creds", @@ -795,7 +797,7 @@ async def test_service_config_beats_global_config( } ) with patch.dict(os.environ, {}, clear=True): - ctx = SharedConfigContext( + ctx = AsyncSharedConfigContext( fs=fs, config_file_path="/fake/config", credentials_file_path="/fake/creds", @@ -821,7 +823,7 @@ async def test_env_beats_config_file(self, resolver: EndpointUriResolver): with patch.dict( os.environ, {"AWS_ENDPOINT_URL": "https://global-env.com"}, clear=True ): - ctx = SharedConfigContext( + ctx = AsyncSharedConfigContext( fs=fs, config_file_path="/fake/config", credentials_file_path="/fake/creds", @@ -834,7 +836,7 @@ async def test_returns_unset_when_nothing_found( self, resolver: EndpointUriResolver ): with patch.dict(os.environ, {}, clear=True): - ctx = SharedConfigContext( + ctx = AsyncSharedConfigContext( fs=NullFileSystem(), config_file_path="/fake/config", credentials_file_path="/fake/creds", @@ -852,7 +854,7 @@ async def test_spaced_sdk_id_produces_valid_env_var_name(self): {"AWS_ENDPOINT_URL_BEDROCK_RUNTIME": "https://from-env.com"}, clear=True, ): - ctx = SharedConfigContext( + ctx = AsyncSharedConfigContext( fs=NullFileSystem(), config_file_path="/fake/config", credentials_file_path="/fake/creds", @@ -980,7 +982,7 @@ async def test_key_and_secret_auto_wires_static_resolver(self): @pytest.mark.asyncio async def test_explicit_resolver_not_overwritten(self): - custom_resolver = StaticCredentialsResolver() + custom_resolver = AsyncStaticCredentialsResolver() with patch.dict(os.environ, {"AWS_REGION": "us-east-1"}, clear=True): config = await AsyncAwsConfig.resolve( fs=NullFileSystem(), @@ -1001,7 +1003,7 @@ class TestResolveSdkUaAppId: @pytest.mark.asyncio async def test_resolves_from_env(self): with patch.dict(os.environ, {"AWS_SDK_UA_APP_ID": "my-app"}, clear=True): - ctx = SharedConfigContext(fs=NullFileSystem()) + ctx = AsyncSharedConfigContext(fs=NullFileSystem()) result = await resolve_sdk_ua_app_id(ctx) assert result.value == "my-app" assert result.source == ConfigSource.ENV @@ -1012,7 +1014,7 @@ async def test_resolves_from_profile(self): {"/fake/config": "[profile default]\nsdk_ua_app_id = profile-app\n"} ) with patch.dict(os.environ, {}, clear=True): - ctx = SharedConfigContext(fs=fs, config_file_path="/fake/config") + ctx = AsyncSharedConfigContext(fs=fs, config_file_path="/fake/config") result = await resolve_sdk_ua_app_id(ctx) assert result.value == "profile-app" assert result.source == ConfigSource.PROFILE @@ -1020,7 +1022,7 @@ async def test_resolves_from_profile(self): @pytest.mark.asyncio async def test_returns_unset_when_not_configured(self): with patch.dict(os.environ, {}, clear=True): - ctx = SharedConfigContext(fs=NullFileSystem()) + ctx = AsyncSharedConfigContext(fs=NullFileSystem()) result = await resolve_sdk_ua_app_id(ctx) assert result.value is UNSET @@ -1031,7 +1033,7 @@ async def test_resolves_from_env(self): with patch.dict( os.environ, {"AWS_ENDPOINT_URL": "https://custom.endpoint"}, clear=True ): - ctx = SharedConfigContext(fs=NullFileSystem()) + ctx = AsyncSharedConfigContext(fs=NullFileSystem()) result = await resolve_endpoint_uri(ctx) assert result.value == "https://custom.endpoint" assert result.source == ConfigSource.ENV @@ -1044,7 +1046,7 @@ async def test_resolves_from_profile(self): } ) with patch.dict(os.environ, {}, clear=True): - ctx = SharedConfigContext(fs=fs, config_file_path="/fake/config") + ctx = AsyncSharedConfigContext(fs=fs, config_file_path="/fake/config") result = await resolve_endpoint_uri(ctx) assert result.value == "https://profile.endpoint" assert result.source == ConfigSource.PROFILE @@ -1052,7 +1054,7 @@ async def test_resolves_from_profile(self): @pytest.mark.asyncio async def test_returns_unset_when_not_configured(self): with patch.dict(os.environ, {}, clear=True): - ctx = SharedConfigContext(fs=NullFileSystem()) + ctx = AsyncSharedConfigContext(fs=NullFileSystem()) result = await resolve_endpoint_uri(ctx) assert result.value is UNSET diff --git a/packages/smithy-aws-core/tests/unit/endpoints/test_standard_regional.py b/packages/smithy-aws-core/tests/unit/endpoints/test_standard_regional.py index 45b271ef4..1da0c2712 100644 --- a/packages/smithy-aws-core/tests/unit/endpoints/test_standard_regional.py +++ b/packages/smithy-aws-core/tests/unit/endpoints/test_standard_regional.py @@ -5,10 +5,10 @@ from unittest.mock import Mock import pytest -from smithy_aws_core.endpoints import REGIONAL_ENDPOINT_CONFIG -from smithy_aws_core.endpoints.standard_regional import ( - StandardRegionalEndpointsResolver, +from smithy_aws_core.aio.endpoints.standard_regional import ( + AsyncStandardRegionalEndpointsResolver, ) +from smithy_aws_core.endpoints import REGIONAL_ENDPOINT_CONFIG from smithy_core import URI from smithy_core.endpoints import EndpointResolverParams from smithy_core.exceptions import EndpointResolutionError @@ -37,7 +37,7 @@ def params( async def test_resolve_endpoint_with_valid_sdk_endpoint_string(): - resolver = StandardRegionalEndpointsResolver(endpoint_prefix="service") + resolver = AsyncStandardRegionalEndpointsResolver(endpoint_prefix="service") params = EndpointConfig.params("https://example.com/path?query=123") endpoint = await resolver.resolve_endpoint(params) @@ -49,7 +49,7 @@ async def test_resolve_endpoint_with_valid_sdk_endpoint_string(): async def test_resolve_endpoint_with_sdk_endpoint_uri(): - resolver = StandardRegionalEndpointsResolver(endpoint_prefix="service") + resolver = AsyncStandardRegionalEndpointsResolver(endpoint_prefix="service") parsed_uri = URI( host="example.com", path="/path", scheme="https", query="query=123", port=443 ) @@ -61,7 +61,7 @@ async def test_resolve_endpoint_with_sdk_endpoint_uri(): async def test_resolve_endpoint_with_invalid_sdk_endpoint(): - resolver = StandardRegionalEndpointsResolver(endpoint_prefix="service") + resolver = AsyncStandardRegionalEndpointsResolver(endpoint_prefix="service") params = EndpointConfig.params("invalid_uri") with pytest.raises(EndpointResolutionError): @@ -69,7 +69,7 @@ async def test_resolve_endpoint_with_invalid_sdk_endpoint(): async def test_resolve_endpoint_with_region(): - resolver = StandardRegionalEndpointsResolver(endpoint_prefix="service") + resolver = AsyncStandardRegionalEndpointsResolver(endpoint_prefix="service") params = EndpointConfig.params(region="us-west-2") endpoint = await resolver.resolve_endpoint(params) @@ -78,7 +78,7 @@ async def test_resolve_endpoint_with_region(): async def test_resolve_endpoint_with_no_sdk_endpoint_or_region(): - resolver = StandardRegionalEndpointsResolver(endpoint_prefix="service") + resolver = AsyncStandardRegionalEndpointsResolver(endpoint_prefix="service") params = EndpointConfig.params() with pytest.raises(EndpointResolutionError): @@ -86,7 +86,7 @@ async def test_resolve_endpoint_with_no_sdk_endpoint_or_region(): async def test_resolve_endpoint_with_sdk_endpoint_and_region(): - resolver = StandardRegionalEndpointsResolver(endpoint_prefix="service") + resolver = AsyncStandardRegionalEndpointsResolver(endpoint_prefix="service") params = EndpointConfig.params( endpoint_uri="https://example.com", region="us-west-2" ) diff --git a/packages/smithy-aws-core/tests/unit/identity/chain/providers/conftest.py b/packages/smithy-aws-core/tests/unit/identity/chain/providers/conftest.py index 71882b5a0..72db6e0df 100644 --- a/packages/smithy-aws-core/tests/unit/identity/chain/providers/conftest.py +++ b/packages/smithy-aws-core/tests/unit/identity/chain/providers/conftest.py @@ -4,10 +4,10 @@ from typing import Any import pytest +from smithy_aws_core.aio.identity.chain.provider import ChainSetup from smithy_aws_core.config.file_parser import Section, StandardizedOutput from smithy_aws_core.config.merged_config import MergedConfig from smithy_aws_core.identity import AWSCredentialsIdentity -from smithy_aws_core.identity.chain.provider import ChainSetup from smithy_core.interfaces.identity import Identity diff --git a/packages/smithy-aws-core/tests/unit/identity/chain/providers/test_environment.py b/packages/smithy-aws-core/tests/unit/identity/chain/providers/test_environment.py index 766e96153..3884a17ee 100644 --- a/packages/smithy-aws-core/tests/unit/identity/chain/providers/test_environment.py +++ b/packages/smithy-aws-core/tests/unit/identity/chain/providers/test_environment.py @@ -3,11 +3,13 @@ from collections.abc import Awaitable, Callable import pytest -from smithy_aws_core.identity.chain.provider import ChainSetup -from smithy_aws_core.identity.chain.providers.environment import ( - EnvironmentCredentialsProvider, +from smithy_aws_core.aio.identity.chain.provider import ChainSetup +from smithy_aws_core.aio.identity.chain.providers.environment import ( + AsyncEnvironmentCredentialsProvider, +) +from smithy_aws_core.aio.identity.environment import ( + AsyncEnvironmentCredentialsResolver, ) -from smithy_aws_core.identity.environment import EnvironmentCredentialsResolver from .conftest import OtherIdentity @@ -20,7 +22,7 @@ async def test_ignores_non_aws_identity_type( monkeypatch.setenv("AWS_SECRET_ACCESS_KEY", "secret") setup = await setup_provider( - EnvironmentCredentialsProvider(), identity_type=OtherIdentity + AsyncEnvironmentCredentialsProvider(), identity_type=OtherIdentity ) assert setup.resolvers == () @@ -45,7 +47,7 @@ async def test_requires_both_keys( for name, value in environment.items(): monkeypatch.setenv(name, value) - setup = await setup_provider(EnvironmentCredentialsProvider()) + setup = await setup_provider(AsyncEnvironmentCredentialsProvider()) assert setup.resolvers == () assert not setup.terminal @@ -58,12 +60,12 @@ async def test_registers_terminal_resolver( monkeypatch.setenv("AWS_ACCESS_KEY_ID", "akid") monkeypatch.setenv("AWS_SECRET_ACCESS_KEY", "secret") - setup = await setup_provider(EnvironmentCredentialsProvider()) + setup = await setup_provider(AsyncEnvironmentCredentialsProvider()) assert setup.terminal assert len(setup.resolvers) == 1 assert setup.resolvers[0].provider_name == "Environment" - assert isinstance(setup.resolvers[0].resolver, EnvironmentCredentialsResolver) + assert isinstance(setup.resolvers[0].resolver, AsyncEnvironmentCredentialsResolver) async def test_explicit_profile_suppresses_environment_credentials( @@ -74,7 +76,7 @@ async def test_explicit_profile_suppresses_environment_credentials( monkeypatch.setenv("AWS_SECRET_ACCESS_KEY", "secret") setup = await setup_provider( - EnvironmentCredentialsProvider(), + AsyncEnvironmentCredentialsProvider(), profile_name="work", ) @@ -90,8 +92,8 @@ async def test_aws_profile_env_var_does_not_suppress_environment_credentials( monkeypatch.setenv("AWS_ACCESS_KEY_ID", "akid") monkeypatch.setenv("AWS_SECRET_ACCESS_KEY", "secret") - setup = await setup_provider(EnvironmentCredentialsProvider()) + setup = await setup_provider(AsyncEnvironmentCredentialsProvider()) assert setup.terminal assert len(setup.resolvers) == 1 - assert isinstance(setup.resolvers[0].resolver, EnvironmentCredentialsResolver) + assert isinstance(setup.resolvers[0].resolver, AsyncEnvironmentCredentialsResolver) diff --git a/packages/smithy-aws-core/tests/unit/identity/chain/providers/test_process.py b/packages/smithy-aws-core/tests/unit/identity/chain/providers/test_process.py index 3df8f928f..767774dcd 100644 --- a/packages/smithy-aws-core/tests/unit/identity/chain/providers/test_process.py +++ b/packages/smithy-aws-core/tests/unit/identity/chain/providers/test_process.py @@ -8,14 +8,16 @@ from unittest.mock import AsyncMock, patch import pytest +from smithy_aws_core.aio.identity.chain.provider import ChainSetup +from smithy_aws_core.aio.identity.chain.providers.process import ( + AsyncProfileCredentialProcessProvider, +) +from smithy_aws_core.aio.identity.process import AsyncProcessCredentialsResolver from smithy_aws_core.config.merged_config import MergedConfig -from smithy_aws_core.identity.chain.provider import ChainSetup from smithy_aws_core.identity.chain.providers.process import ( ProcessConfigurationError, - ProfileCredentialProcessProvider, _split_process_command, ) -from smithy_aws_core.identity.process import ProcessCredentialsResolver from .conftest import OtherIdentity @@ -95,7 +97,7 @@ async def test_ignores_non_aws_identity_type( setup_provider: Callable[..., Awaitable[ChainSetup]], merged_config: Callable[..., MergedConfig], ) -> None: - provider = ProfileCredentialProcessProvider() + provider = AsyncProfileCredentialProcessProvider() setup = await setup_provider( provider, @@ -113,7 +115,7 @@ async def test_ignores_non_aws_identity_type( async def test_requires_active_profile( setup_provider: Callable[..., Awaitable[ChainSetup]], ) -> None: - setup = await setup_provider(ProfileCredentialProcessProvider()) + setup = await setup_provider(AsyncProfileCredentialProcessProvider()) assert setup.resolvers == () assert not setup.terminal @@ -124,7 +126,7 @@ async def test_missing_process_does_not_register( merged_config: Callable[..., MergedConfig], ) -> None: setup = await setup_provider( - ProfileCredentialProcessProvider(), + AsyncProfileCredentialProcessProvider(), config_file=merged_config({"default": {}}), profile_name="default", ) @@ -138,7 +140,7 @@ async def test_registers_terminal_resolver( merged_config: Callable[..., MergedConfig], ) -> None: setup = await setup_provider( - ProfileCredentialProcessProvider(), + AsyncProfileCredentialProcessProvider(), config_file=merged_config( { "default": { @@ -154,7 +156,7 @@ async def test_registers_terminal_resolver( assert setup.terminal assert len(setup.resolvers) == 1 assert setup.resolvers[0].provider_name == "ProfileCredentialProcess" - assert isinstance(setup.resolvers[0].resolver, ProcessCredentialsResolver) + assert isinstance(setup.resolvers[0].resolver, AsyncProcessCredentialsResolver) process = AsyncMock() process.returncode = 0 @@ -188,7 +190,7 @@ async def test_account_id_falls_back_to_profile_config( merged_config: Callable[..., MergedConfig], ) -> None: setup = await setup_provider( - ProfileCredentialProcessProvider(), + AsyncProfileCredentialProcessProvider(), config_file=merged_config( { "default": { diff --git a/packages/smithy-aws-core/tests/unit/identity/chain/providers/test_profile.py b/packages/smithy-aws-core/tests/unit/identity/chain/providers/test_profile.py index 58633fcf4..8083d7827 100644 --- a/packages/smithy-aws-core/tests/unit/identity/chain/providers/test_profile.py +++ b/packages/smithy-aws-core/tests/unit/identity/chain/providers/test_profile.py @@ -4,20 +4,20 @@ from typing import Any import pytest +from smithy_aws_core.aio.identity.chain.provider import ChainSetup +from smithy_aws_core.aio.identity.chain.providers.profile import ( + AsyncProfileSessionCredentialsProvider, + AsyncProfileStaticCredentialsProvider, +) from smithy_aws_core.config.merged_config import MergedConfig from smithy_aws_core.identity import AWSCredentialsIdentity -from smithy_aws_core.identity.chain.provider import ChainSetup -from smithy_aws_core.identity.chain.providers.profile import ( - ProfileSessionCredentialsProvider, - ProfileStaticCredentialsProvider, -) from .conftest import OtherIdentity @pytest.mark.parametrize( "provider", - [ProfileSessionCredentialsProvider(), ProfileStaticCredentialsProvider()], + [AsyncProfileSessionCredentialsProvider(), AsyncProfileStaticCredentialsProvider()], ) async def test_ignores_non_aws_identity_type( provider: Any, @@ -31,7 +31,7 @@ async def test_ignores_non_aws_identity_type( @pytest.mark.parametrize( "provider", - [ProfileSessionCredentialsProvider(), ProfileStaticCredentialsProvider()], + [AsyncProfileSessionCredentialsProvider(), AsyncProfileStaticCredentialsProvider()], ) async def test_requires_active_profile( provider: Any, @@ -45,7 +45,7 @@ async def test_requires_active_profile( @pytest.mark.parametrize( "provider", - [ProfileSessionCredentialsProvider(), ProfileStaticCredentialsProvider()], + [AsyncProfileSessionCredentialsProvider(), AsyncProfileStaticCredentialsProvider()], ) async def test_missing_profile_does_not_register( provider: Any, @@ -66,7 +66,7 @@ async def test_missing_profile_does_not_register( "provider, profile, expected", [ ( - ProfileSessionCredentialsProvider(), + AsyncProfileSessionCredentialsProvider(), { "aws_access_key_id": "akid", "aws_secret_access_key": "secret", @@ -81,7 +81,7 @@ async def test_missing_profile_does_not_register( ), ), ( - ProfileStaticCredentialsProvider(), + AsyncProfileStaticCredentialsProvider(), { "aws_access_key_id": "akid", "aws_secret_access_key": "secret", @@ -116,7 +116,7 @@ async def test_registers_terminal_resolver_for_complete_profile( @pytest.mark.parametrize( "provider", - [ProfileSessionCredentialsProvider(), ProfileStaticCredentialsProvider()], + [AsyncProfileSessionCredentialsProvider(), AsyncProfileStaticCredentialsProvider()], ) async def test_defers_when_selected_profile_declares_assume_role( provider: Any, @@ -147,12 +147,12 @@ async def test_defers_when_selected_profile_declares_assume_role( "provider, properties", [ ( - ProfileSessionCredentialsProvider(), + AsyncProfileSessionCredentialsProvider(), {"aws_access_key_id": "akid", "aws_secret_access_key": "secret"}, ), - (ProfileStaticCredentialsProvider(), {"aws_access_key_id": "akid"}), + (AsyncProfileStaticCredentialsProvider(), {"aws_access_key_id": "akid"}), ( - ProfileStaticCredentialsProvider(), + AsyncProfileStaticCredentialsProvider(), { "aws_access_key_id": {"nested": "value"}, "aws_secret_access_key": "secret", diff --git a/packages/smithy-aws-core/tests/unit/identity/chain/providers/test_shared_config.py b/packages/smithy-aws-core/tests/unit/identity/chain/providers/test_shared_config.py index 88a150d46..aa7603d35 100644 --- a/packages/smithy-aws-core/tests/unit/identity/chain/providers/test_shared_config.py +++ b/packages/smithy-aws-core/tests/unit/identity/chain/providers/test_shared_config.py @@ -4,12 +4,14 @@ from unittest.mock import AsyncMock import pytest -from smithy_aws_core.config.merged_config import MergedConfig -from smithy_aws_core.identity.chain.provider import ChainSetup -from smithy_aws_core.identity.chain.providers import ( +from smithy_aws_core.aio.identity.chain.provider import ChainSetup +from smithy_aws_core.aio.identity.chain.providers import ( shared_config as shared_config_module, ) -from smithy_aws_core.identity.chain.providers.shared_config import SharedConfigProvider +from smithy_aws_core.aio.identity.chain.providers.shared_config import ( + AsyncSharedConfigProvider, +) +from smithy_aws_core.config.merged_config import MergedConfig from .conftest import OtherIdentity @@ -19,9 +21,11 @@ async def test_ignores_non_aws_identity_type( monkeypatch: pytest.MonkeyPatch, ) -> None: load_config = AsyncMock() - monkeypatch.setattr(shared_config_module, "load_config", load_config) + monkeypatch.setattr(shared_config_module, "load_config_async", load_config) - setup = await setup_provider(SharedConfigProvider(), identity_type=OtherIdentity) + setup = await setup_provider( + AsyncSharedConfigProvider(), identity_type=OtherIdentity + ) assert setup.resolvers == () assert not setup.terminal @@ -52,10 +56,10 @@ async def test_selects_profile_without_reloading( else: monkeypatch.setenv("AWS_PROFILE", environment_profile) load_config = AsyncMock() - monkeypatch.setattr(shared_config_module, "load_config", load_config) + monkeypatch.setattr(shared_config_module, "load_config_async", load_config) setup = await setup_provider( - SharedConfigProvider(), + AsyncSharedConfigProvider(), config_file=config_file, profile_name=profile_name, ) @@ -73,10 +77,10 @@ async def test_loads_when_not_preloaded( ) -> None: loaded = merged_config({"default": {"name": "loaded"}}) load_config = AsyncMock(return_value=loaded) - monkeypatch.setattr(shared_config_module, "load_config", load_config) + monkeypatch.setattr(shared_config_module, "load_config_async", load_config) monkeypatch.delenv("AWS_PROFILE", raising=False) - setup = await setup_provider(SharedConfigProvider()) + setup = await setup_provider(AsyncSharedConfigProvider()) assert setup.config_file is loaded assert setup.profile_name == "default" diff --git a/packages/smithy-aws-core/tests/unit/identity/chain/test_chain.py b/packages/smithy-aws-core/tests/unit/identity/chain/test_chain.py index abb12f8e1..63ada74f3 100644 --- a/packages/smithy-aws-core/tests/unit/identity/chain/test_chain.py +++ b/packages/smithy-aws-core/tests/unit/identity/chain/test_chain.py @@ -5,11 +5,11 @@ from typing import Any, assert_type import pytest -import smithy_aws_core.identity.chain as chain_module +import smithy_aws_core.aio.identity.chain as chain_module +from smithy_aws_core.aio.identity import AsyncIdentityChain from smithy_aws_core.identity import ( AWSCredentialsIdentity, AWSIdentityProperties, - IdentityChain, ) from smithy_aws_core.identity.chain import ( IdentityChainConfigurationError, @@ -22,7 +22,7 @@ Standard, StandardProvider, ) -from smithy_core.aio.interfaces.identity import IdentityResolver +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver from smithy_core.exceptions import SmithyIdentityError @@ -41,7 +41,9 @@ def _credentials(access_key_id: str) -> AWSCredentialsIdentity: return AWSCredentialsIdentity(access_key_id=access_key_id, secret_access_key="s") -class _FakeResolver(IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties]): +class _FakeResolver( + AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] +): def __init__( self, *, @@ -63,7 +65,7 @@ async def get_identity( async def test_returns_first_successful_resolver() -> None: miss = _FakeResolver(error=SmithyIdentityError("miss")) hit = _FakeResolver(identity=_credentials("hit")) - chain = IdentityChain((miss, hit)) + chain = AsyncIdentityChain((miss, hit)) result = await chain.get_identity(properties={}) @@ -72,14 +74,14 @@ async def test_returns_first_successful_resolver() -> None: async def test_non_identity_errors_propagate() -> None: class _BrokenResolver( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] + AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] ): async def get_identity( self, *, properties: Mapping[str, Any] ) -> AWSCredentialsIdentity: raise RuntimeError("broken") - chain = IdentityChain((_BrokenResolver(),)) + chain = AsyncIdentityChain((_BrokenResolver(),)) with pytest.raises(RuntimeError, match="broken"): await chain.get_identity(properties={}) @@ -87,7 +89,7 @@ async def get_identity( async def test_explicit_chain_preserves_resolvers() -> None: resolver = _FakeResolver(identity=_credentials("explicit")) - chain = IdentityChain((resolver,)) + chain = AsyncIdentityChain((resolver,)) assert chain._resolvers == (resolver,) assert chain.identity_type is None @@ -97,10 +99,10 @@ async def test_explicit_chain_preserves_resolvers() -> None: async def test_create_records_identity_type(monkeypatch: pytest.MonkeyPatch) -> None: monkeypatch.setattr(chain_module, "_discover_chain_identity_providers", tuple) - chain = await IdentityChain.create(AWSCredentialsIdentity) + chain = await AsyncIdentityChain.create(AWSCredentialsIdentity) assert chain.identity_type is AWSCredentialsIdentity - assert_type(chain, IdentityChain[AWSCredentialsIdentity]) + assert_type(chain, AsyncIdentityChain[AWSCredentialsIdentity]) def test_discovers_and_constructs_entry_point_providers( @@ -114,11 +116,11 @@ def load(self) -> Any: return _Provider def _entry_points(*, group: str) -> tuple[_EntryPoint, ...]: - assert group == "smithy_aws_core.identity.chain_providers" + assert group == "smithy_aws_core.aio.identity.chain_providers" return (_EntryPoint(),) monkeypatch.setattr( - "smithy_aws_core.identity.chain.metadata.entry_points", _entry_points + "smithy_aws_core.aio.identity.chain.metadata.entry_points", _entry_points ) discovered = chain_module._discover_chain_identity_providers() @@ -238,7 +240,7 @@ class _Unsupported: async def test_all_miss_raises_with_per_provider_failures() -> None: first = _FakeResolver(error=SmithyIdentityError("first miss")) second = _FakeResolver(error=SmithyIdentityError("second miss")) - chain = IdentityChain((first, second)) + chain = AsyncIdentityChain((first, second)) with pytest.raises( IdentityChainError, @@ -251,7 +253,7 @@ async def test_all_miss_raises_with_per_provider_failures() -> None: async def test_empty_chain_reports_no_configured_provider() -> None: - chain = IdentityChain((), identity_type=AWSCredentialsIdentity) + chain = AsyncIdentityChain((), identity_type=AWSCredentialsIdentity) with pytest.raises( IdentityChainError, @@ -262,7 +264,7 @@ async def test_empty_chain_reports_no_configured_provider() -> None: async def test_chained_invalidate() -> None: class _InvalidatingResolver( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] + AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] ): def __init__(self) -> None: self.invalidated = False @@ -277,7 +279,7 @@ async def invalidate(self) -> None: first = _InvalidatingResolver() second = _InvalidatingResolver() - chain = IdentityChain((first, second)) + chain = AsyncIdentityChain((first, second)) await chain.invalidate() diff --git a/packages/smithy-aws-core/tests/unit/identity/chain/test_provider.py b/packages/smithy-aws-core/tests/unit/identity/chain/test_provider.py index 63e2f62eb..698639f7c 100644 --- a/packages/smithy-aws-core/tests/unit/identity/chain/test_provider.py +++ b/packages/smithy-aws-core/tests/unit/identity/chain/test_provider.py @@ -3,10 +3,10 @@ from unittest.mock import AsyncMock import pytest +from smithy_aws_core.aio.identity.chain.provider import ChainSetup from smithy_aws_core.config.file_parser import StandardizedOutput from smithy_aws_core.config.merged_config import MergedConfig from smithy_aws_core.identity.chain.ordering import Standard, StandardProvider -from smithy_aws_core.identity.chain.provider import ChainSetup from smithy_core.interfaces.identity import Identity diff --git a/packages/smithy-aws-core/tests/unit/identity/sync/test_environment.py b/packages/smithy-aws-core/tests/unit/identity/sync/test_environment.py new file mode 100644 index 000000000..34f99237b --- /dev/null +++ b/packages/smithy-aws-core/tests/unit/identity/sync/test_environment.py @@ -0,0 +1,55 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +import pytest +from smithy_aws_core.identity.environment import EnvironmentCredentialsResolver +from smithy_core.exceptions import SmithyIdentityError + + +@pytest.fixture(autouse=True) +def clear_environment(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.delenv("AWS_ACCOUNT_ID", raising=False) + monkeypatch.delenv("AWS_SECRET_ACCESS_KEY", raising=False) + monkeypatch.delenv("AWS_ACCESS_KEY_ID", raising=False) + monkeypatch.delenv("AWS_SESSION_TOKEN", raising=False) + + +def test_no_values_set() -> None: + with pytest.raises(SmithyIdentityError): + EnvironmentCredentialsResolver().get_identity(properties={}) + + +def test_akid_missing(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("AWS_SECRET_ACCESS_KEY", "secret") + + with pytest.raises(SmithyIdentityError): + EnvironmentCredentialsResolver().get_identity(properties={}) + + +def test_secret_missing(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("AWS_ACCESS_KEY_ID", "akid") + + with pytest.raises(SmithyIdentityError): + EnvironmentCredentialsResolver().get_identity(properties={}) + + +def test_minimum_required(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("AWS_ACCESS_KEY_ID", "akid") + monkeypatch.setenv("AWS_SECRET_ACCESS_KEY", "secret") + + credentials = EnvironmentCredentialsResolver().get_identity(properties={}) + assert credentials.access_key_id == "akid" + assert credentials.secret_access_key == "secret" + + +def test_all_values(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("AWS_ACCESS_KEY_ID", "akid") + monkeypatch.setenv("AWS_SECRET_ACCESS_KEY", "secret") + monkeypatch.setenv("AWS_SESSION_TOKEN", "session") + monkeypatch.setenv("AWS_ACCOUNT_ID", "123456789012") + + credentials = EnvironmentCredentialsResolver().get_identity(properties={}) + assert credentials.access_key_id == "akid" + assert credentials.secret_access_key == "secret" + assert credentials.session_token == "session" + assert credentials.account_id == "123456789012" diff --git a/packages/smithy-aws-core/tests/unit/identity/sync/test_static.py b/packages/smithy-aws-core/tests/unit/identity/sync/test_static.py new file mode 100644 index 000000000..d5f29c7d0 --- /dev/null +++ b/packages/smithy-aws-core/tests/unit/identity/sync/test_static.py @@ -0,0 +1,46 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +import pytest +from smithy_aws_core.identity import AWSCredentialsIdentity, AWSIdentityProperties +from smithy_aws_core.identity.static import StaticCredentialsResolver +from smithy_core.exceptions import SmithyIdentityError + + +def test_returns_fixed_identity() -> None: + identity = AWSCredentialsIdentity( + access_key_id="akid", + secret_access_key="secret", + ) + resolver = StaticCredentialsResolver(identity) + + assert resolver.get_identity(properties={}) is identity + + +def test_reads_request_properties() -> None: + resolver = StaticCredentialsResolver() + + identity = resolver.get_identity( + properties={ + "access_key_id": "akid", + "secret_access_key": "secret", + "session_token": "token", + } + ) + + assert identity.access_key_id == "akid" + assert identity.secret_access_key == "secret" + assert identity.session_token == "token" + + +@pytest.mark.parametrize( + "properties", + [ + {}, + {"access_key_id": "akid"}, + {"secret_access_key": "secret"}, + ], +) +def test_requires_both_request_keys(properties: AWSIdentityProperties) -> None: + with pytest.raises(SmithyIdentityError): + StaticCredentialsResolver().get_identity(properties=properties) diff --git a/packages/smithy-aws-core/tests/unit/identity/test_container.py b/packages/smithy-aws-core/tests/unit/identity/test_container.py index 7fa49688b..1bc1d1cea 100644 --- a/packages/smithy-aws-core/tests/unit/identity/test_container.py +++ b/packages/smithy-aws-core/tests/unit/identity/test_container.py @@ -9,12 +9,12 @@ from unittest.mock import AsyncMock, patch import pytest -from smithy_aws_core.identity import AWSCredentialsIdentity -from smithy_aws_core.identity.container import ( - ContainerCredentialsConfig, - ContainerCredentialsResolver, +from smithy_aws_core.aio.identity.container import ( + AsyncContainerCredentialsResolver, ContainerMetadataClient, ) +from smithy_aws_core.identity import AWSCredentialsIdentity +from smithy_aws_core.identity.container import ContainerCredentialsConfig from smithy_core import URI from smithy_core.exceptions import SmithyIdentityError from smithy_http import Fields @@ -31,7 +31,7 @@ ISO8601 = "%Y-%m-%dT%H:%M:%SZ" pytestmark = pytest.mark.filterwarnings( - "ignore:`ContainerCredentialsResolver` is deprecated:DeprecationWarning" + "ignore:`AsyncContainerCredentialsResolver` is deprecated:DeprecationWarning" ) @@ -157,9 +157,9 @@ async def test_resolver_env_relative(): http_client = mock_http_client_response(200, resp_body.encode("utf-8")) with patch.dict( - os.environ, {ContainerCredentialsResolver.ENV_VAR: "/test"}, clear=True + os.environ, {AsyncContainerCredentialsResolver.ENV_VAR: "/test"}, clear=True ): - resolver = ContainerCredentialsResolver(http_client) + resolver = AsyncContainerCredentialsResolver(http_client) identity = await resolver.get_identity(properties={}) # Ensure we derive the correct destination @@ -181,10 +181,10 @@ async def test_resolver_env_full(): with patch.dict( os.environ, - {ContainerCredentialsResolver.ENV_VAR_FULL: "http://169.254.170.23/full"}, + {AsyncContainerCredentialsResolver.ENV_VAR_FULL: "http://169.254.170.23/full"}, clear=True, ): - resolver = ContainerCredentialsResolver(http_client) + resolver = AsyncContainerCredentialsResolver(http_client) identity = await resolver.get_identity(properties={}) # Ensure we derive the correct destination @@ -207,12 +207,12 @@ async def test_resolver_env_token(): with patch.dict( os.environ, { - ContainerCredentialsResolver.ENV_VAR_FULL: "http://169.254.170.23/full", - ContainerCredentialsResolver.ENV_VAR_AUTH_TOKEN: "Bearer foobar", + AsyncContainerCredentialsResolver.ENV_VAR_FULL: "http://169.254.170.23/full", + AsyncContainerCredentialsResolver.ENV_VAR_AUTH_TOKEN: "Bearer foobar", }, clear=True, ): - resolver = ContainerCredentialsResolver(http_client) + resolver = AsyncContainerCredentialsResolver(http_client) identity = await resolver.get_identity(properties={}) # Ensure we derive the correct destination and fields @@ -242,12 +242,12 @@ async def test_resolver_env_token_file(tmp_path: pathlib.Path): with patch.dict( os.environ, { - ContainerCredentialsResolver.ENV_VAR_FULL: "http://169.254.170.23/full", - ContainerCredentialsResolver.ENV_VAR_AUTH_TOKEN_FILE: str(token_file), + AsyncContainerCredentialsResolver.ENV_VAR_FULL: "http://169.254.170.23/full", + AsyncContainerCredentialsResolver.ENV_VAR_AUTH_TOKEN_FILE: str(token_file), }, clear=True, ): - resolver = ContainerCredentialsResolver(http_client) + resolver = AsyncContainerCredentialsResolver(http_client) identity = await resolver.get_identity(properties={}) # Ensure we derive the correct destination and fields @@ -277,12 +277,12 @@ async def test_resolver_env_token_file_invalid_bytes(tmp_path: pathlib.Path): with patch.dict( os.environ, { - ContainerCredentialsResolver.ENV_VAR_FULL: "http://169.254.170.23/full", - ContainerCredentialsResolver.ENV_VAR_AUTH_TOKEN_FILE: str(token_file), + AsyncContainerCredentialsResolver.ENV_VAR_FULL: "http://169.254.170.23/full", + AsyncContainerCredentialsResolver.ENV_VAR_AUTH_TOKEN_FILE: str(token_file), }, clear=True, ): - resolver = ContainerCredentialsResolver(http_client) + resolver = AsyncContainerCredentialsResolver(http_client) with pytest.raises(SmithyIdentityError) as e: await resolver.get_identity(properties={}) assert "Unable to read valid utf-8 bytes from " in str(e.value) @@ -300,13 +300,13 @@ async def test_resolver_env_token_file_precedence(tmp_path: pathlib.Path): with patch.dict( os.environ, { - ContainerCredentialsResolver.ENV_VAR_FULL: "http://169.254.170.23/full", - ContainerCredentialsResolver.ENV_VAR_AUTH_TOKEN_FILE: str(token_file), - ContainerCredentialsResolver.ENV_VAR_AUTH_TOKEN: "Bearer foobar", + AsyncContainerCredentialsResolver.ENV_VAR_FULL: "http://169.254.170.23/full", + AsyncContainerCredentialsResolver.ENV_VAR_AUTH_TOKEN_FILE: str(token_file), + AsyncContainerCredentialsResolver.ENV_VAR_AUTH_TOKEN: "Bearer foobar", }, clear=True, ): - resolver = ContainerCredentialsResolver(http_client) + resolver = AsyncContainerCredentialsResolver(http_client) identity = await resolver.get_identity(properties={}) # Ensure we derive the correct destination and fields @@ -335,9 +335,9 @@ async def test_resolver_valid_credentials_reused(): http_client = mock_http_client_response(200, resp_body.encode("utf-8")) with patch.dict( - os.environ, {ContainerCredentialsResolver.ENV_VAR: "/test"}, clear=True + os.environ, {AsyncContainerCredentialsResolver.ENV_VAR: "/test"}, clear=True ): - resolver = ContainerCredentialsResolver(http_client) + resolver = AsyncContainerCredentialsResolver(http_client) identity_one = await resolver.get_identity(properties={}) identity_two = await resolver.get_identity(properties={}) @@ -356,9 +356,9 @@ async def test_resolver_expired_credentials_refreshed(): http_client = mock_http_client_response(200, resp_body.encode("utf-8")) with patch.dict( - os.environ, {ContainerCredentialsResolver.ENV_VAR: "/test"}, clear=True + os.environ, {AsyncContainerCredentialsResolver.ENV_VAR: "/test"}, clear=True ): - resolver = ContainerCredentialsResolver(http_client) + resolver = AsyncContainerCredentialsResolver(http_client) identity_one = await resolver.get_identity(properties={}) identity_two = await resolver.get_identity(properties={}) @@ -381,6 +381,6 @@ async def test_resolver_missing_env(): {}, clear=True, ): - resolver = ContainerCredentialsResolver(http_client) + resolver = AsyncContainerCredentialsResolver(http_client) with pytest.raises(SmithyIdentityError): await resolver.get_identity(properties={}) diff --git a/packages/smithy-aws-core/tests/unit/identity/test_environment.py b/packages/smithy-aws-core/tests/unit/identity/test_environment.py index 982e20ca6..a8fd21bc4 100644 --- a/packages/smithy-aws-core/tests/unit/identity/test_environment.py +++ b/packages/smithy-aws-core/tests/unit/identity/test_environment.py @@ -2,7 +2,9 @@ # SPDX-License-Identifier: Apache-2.0 import pytest -from smithy_aws_core.identity.environment import EnvironmentCredentialsResolver +from smithy_aws_core.aio.identity.environment import ( + AsyncEnvironmentCredentialsResolver, +) from smithy_core.exceptions import SmithyIdentityError @@ -16,35 +18,37 @@ def clear_environment(monkeypatch: pytest.MonkeyPatch) -> None: async def test_no_values_set(): with pytest.raises(SmithyIdentityError): - await EnvironmentCredentialsResolver().get_identity(properties={}) + await AsyncEnvironmentCredentialsResolver().get_identity(properties={}) async def test_required_values_missing(monkeypatch: pytest.MonkeyPatch): monkeypatch.setenv("AWS_ACCOUNT_ID", "123456789012") with pytest.raises(SmithyIdentityError): - await EnvironmentCredentialsResolver().get_identity(properties={}) + await AsyncEnvironmentCredentialsResolver().get_identity(properties={}) async def test_akid_missing(monkeypatch: pytest.MonkeyPatch): monkeypatch.setenv("AWS_SECRET_ACCESS_KEY", "secret") with pytest.raises(SmithyIdentityError): - await EnvironmentCredentialsResolver().get_identity(properties={}) + await AsyncEnvironmentCredentialsResolver().get_identity(properties={}) async def test_secret_missing(monkeypatch: pytest.MonkeyPatch): monkeypatch.setenv("AWS_ACCESS_KEY_ID", "akid") with pytest.raises(SmithyIdentityError): - await EnvironmentCredentialsResolver().get_identity(properties={}) + await AsyncEnvironmentCredentialsResolver().get_identity(properties={}) async def test_minimum_required(monkeypatch: pytest.MonkeyPatch): monkeypatch.setenv("AWS_ACCESS_KEY_ID", "akid") monkeypatch.setenv("AWS_SECRET_ACCESS_KEY", "secret") - credentials = await EnvironmentCredentialsResolver().get_identity(properties={}) + credentials = await AsyncEnvironmentCredentialsResolver().get_identity( + properties={} + ) assert credentials.access_key_id == "akid" assert credentials.secret_access_key == "secret" @@ -55,7 +59,9 @@ async def test_all_values(monkeypatch: pytest.MonkeyPatch): monkeypatch.setenv("AWS_SESSION_TOKEN", "session") monkeypatch.setenv("AWS_ACCOUNT_ID", "123456789012") - credentials = await EnvironmentCredentialsResolver().get_identity(properties={}) + credentials = await AsyncEnvironmentCredentialsResolver().get_identity( + properties={} + ) assert credentials.access_key_id == "akid" assert credentials.secret_access_key == "secret" assert credentials.session_token == "session" diff --git a/packages/smithy-aws-core/tests/unit/identity/test_imds.py b/packages/smithy-aws-core/tests/unit/identity/test_imds.py index 7b20ee315..479de5bf5 100644 --- a/packages/smithy-aws-core/tests/unit/identity/test_imds.py +++ b/packages/smithy-aws-core/tests/unit/identity/test_imds.py @@ -8,25 +8,25 @@ from unittest.mock import AsyncMock, MagicMock import pytest -from smithy_aws_core.identity.imds import ( +from smithy_aws_core.aio.identity.imds import ( + AsyncIMDSCredentialsResolver, Config, EC2Metadata, - IMDSCredentialsResolver, - Token, TokenCache, ) +from smithy_aws_core.identity.imds import Token from smithy_core import URI -from smithy_core.aio.retries import SimpleRetryStrategy +from smithy_core.aio.retries import AsyncSimpleRetryStrategy from smithy_http.aio import HTTPRequest pytestmark = pytest.mark.filterwarnings( - "ignore:`IMDSCredentialsResolver` is deprecated:DeprecationWarning" + "ignore:`AsyncIMDSCredentialsResolver` is deprecated:DeprecationWarning" ) def test_config_defaults(): config = Config() - assert isinstance(config.retry_strategy, SimpleRetryStrategy) + assert isinstance(config.retry_strategy, AsyncSimpleRetryStrategy) assert config.endpoint_uri == URI( scheme="http", host=Config._HOST_MAPPING["IPv4"], port=80 ) @@ -153,11 +153,11 @@ async def test_ec2_metadata_get(): async def test_imds_credentials_resolver(): - # Test IMDSCredentialsResolver retrieving credentials + # Test AsyncIMDSCredentialsResolver retrieving credentials http_client = AsyncMock() config = Config() ec2_metadata = AsyncMock() - resolver = IMDSCredentialsResolver(http_client, config) + resolver = AsyncIMDSCredentialsResolver(http_client, config) resolver._ec2_metadata_client = ec2_metadata # Mock EC2Metadata client get responses diff --git a/packages/smithy-aws-core/tests/unit/identity/test_process.py b/packages/smithy-aws-core/tests/unit/identity/test_process.py index b3c7d8218..43dc06c79 100644 --- a/packages/smithy-aws-core/tests/unit/identity/test_process.py +++ b/packages/smithy-aws-core/tests/unit/identity/test_process.py @@ -7,7 +7,7 @@ from unittest.mock import AsyncMock, Mock, patch import pytest -from smithy_aws_core.identity.process import ProcessCredentialsResolver +from smithy_aws_core.aio.identity.process import AsyncProcessCredentialsResolver from smithy_core.exceptions import SmithyIdentityError ISO8601 = "%Y-%m-%dT%H:%M:%SZ" @@ -23,7 +23,7 @@ @pytest.mark.parametrize("command", [[], None, "mock-process", ["mock-process", 1]]) def test_resolver_invalid_command(command: object): with pytest.raises(ValueError, match="command must be a non-empty list"): - ProcessCredentialsResolver(command) # type: ignore[arg-type] + AsyncProcessCredentialsResolver(command) # type: ignore[arg-type] def mock_subprocess(returncode: int, stdout: bytes, stderr: bytes = b""): @@ -39,7 +39,7 @@ async def test_valid_credentials_with_session_token(): process = mock_subprocess(0, resp_body.encode("utf-8")) with patch("asyncio.create_subprocess_exec", return_value=process): - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) identity = await resolver.get_identity(properties={}) assert identity.access_key_id == "foo" @@ -59,7 +59,7 @@ async def test_valid_credentials_without_session_token(): process = mock_subprocess(0, resp_body.encode("utf-8")) with patch("asyncio.create_subprocess_exec", return_value=process): - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) identity = await resolver.get_identity(properties={}) assert identity.access_key_id == "foo" @@ -76,7 +76,7 @@ async def test_credentials_with_expiration(): process = mock_subprocess(0, resp_body.encode("utf-8")) with patch("asyncio.create_subprocess_exec", return_value=process): - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) identity = await resolver.get_identity(properties={}) assert identity.expiration is not None @@ -93,7 +93,7 @@ async def test_credentials_with_non_utc_expiration(): process = mock_subprocess(0, resp_body.encode("utf-8")) with patch("asyncio.create_subprocess_exec", return_value=process): - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) identity = await resolver.get_identity(properties={}) assert identity.expiration is not None @@ -109,7 +109,7 @@ async def test_invalid_expiration_string(): process = mock_subprocess(0, resp_body.encode("utf-8")) with patch("asyncio.create_subprocess_exec", return_value=process): - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) with pytest.raises( SmithyIdentityError, match="Invalid credential process Expiration; expected an ISO 8601 string", @@ -125,7 +125,7 @@ async def test_non_string_expiration(): process = mock_subprocess(0, resp_body.encode("utf-8")) with patch("asyncio.create_subprocess_exec", return_value=process): - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) with pytest.raises( SmithyIdentityError, match="Credential process output field 'Expiration' must be a string", @@ -141,7 +141,7 @@ async def test_credentials_with_account_id(): process = mock_subprocess(0, resp_body.encode("utf-8")) with patch("asyncio.create_subprocess_exec", return_value=process): - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) identity = await resolver.get_identity(properties={}) assert identity.account_id == "123456789012" @@ -153,7 +153,7 @@ async def test_account_id_falls_back_to_configured_value(): process = mock_subprocess(0, resp_body.encode("utf-8")) with patch("asyncio.create_subprocess_exec", return_value=process): - resolver = ProcessCredentialsResolver( + resolver = AsyncProcessCredentialsResolver( ["mock-process"], account_id="123456789012" ) identity = await resolver.get_identity(properties={}) @@ -170,7 +170,7 @@ async def test_process_account_id_takes_precedence_over_configured_value(): process = mock_subprocess(0, resp_body.encode("utf-8")) with patch("asyncio.create_subprocess_exec", return_value=process): - resolver = ProcessCredentialsResolver( + resolver = AsyncProcessCredentialsResolver( ["mock-process"], account_id="222222222222" ) identity = await resolver.get_identity(properties={}) @@ -182,7 +182,7 @@ async def test_non_zero_exit_code(): process = mock_subprocess(1, b"", b"Process error message") with patch("asyncio.create_subprocess_exec", return_value=process): - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) with pytest.raises( SmithyIdentityError, match="exit code 1: Process error message", @@ -202,7 +202,7 @@ async def test_missing_required_credentials(resp_data: dict[str, object]): process = mock_subprocess(0, resp_body.encode("utf-8")) with patch("asyncio.create_subprocess_exec", return_value=process): - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) with pytest.raises( SmithyIdentityError, match="AccessKeyId and SecretAccessKey are required", @@ -218,7 +218,7 @@ async def test_invalid_version(): process = mock_subprocess(0, resp_body.encode("utf-8")) with patch("asyncio.create_subprocess_exec", return_value=process): - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) with pytest.raises(SmithyIdentityError, match="Unsupported version '2'"): await resolver.get_identity(properties={}) @@ -232,7 +232,7 @@ async def test_missing_version(): process = mock_subprocess(0, resp_body.encode("utf-8")) with patch("asyncio.create_subprocess_exec", return_value=process): - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) with pytest.raises(SmithyIdentityError, match="Unsupported version 'None'"): await resolver.get_identity(properties={}) @@ -241,7 +241,7 @@ async def test_invalid_json(): process = mock_subprocess(0, b'{"SecretAccessKey": "json-secret"') with patch("asyncio.create_subprocess_exec", return_value=process): - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) with pytest.raises( SmithyIdentityError, match="Credential process output is not valid JSON at line 1, column", @@ -256,7 +256,7 @@ async def test_non_dict_output(): process = mock_subprocess(0, b'["not", "an", "object"]') with patch("asyncio.create_subprocess_exec", return_value=process): - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) with pytest.raises( SmithyIdentityError, match="Credential process output must be a JSON object, got list", @@ -272,7 +272,7 @@ async def test_non_string_field(): process = mock_subprocess(0, resp_body.encode("utf-8")) with patch("asyncio.create_subprocess_exec", return_value=process): - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) with pytest.raises( SmithyIdentityError, match="Credential process output field 'AccessKeyId' must be a string", @@ -284,7 +284,7 @@ async def test_invalid_utf8(): process = mock_subprocess(0, b'{"SecretAccessKey": "utf8-secret"}\xff') with patch("asyncio.create_subprocess_exec", return_value=process): - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) with pytest.raises( SmithyIdentityError, match="Credential process output is not valid UTF-8 at byte", @@ -305,7 +305,7 @@ async def test_process_timeout(): patch("asyncio.create_subprocess_exec", return_value=process), patch("asyncio.wait_for", side_effect=TimeoutError), ): - resolver = ProcessCredentialsResolver(["mock-process"], timeout=1) + resolver = AsyncProcessCredentialsResolver(["mock-process"], timeout=1) with pytest.raises(SmithyIdentityError, match="timed out after 1 seconds"): await resolver.get_identity(properties={}) @@ -318,7 +318,7 @@ async def test_process_startup_failure_raises_smithy_identity_error(): "asyncio.create_subprocess_exec", side_effect=FileNotFoundError("No such file or directory"), ): - resolver = ProcessCredentialsResolver(["missing-process"]) + resolver = AsyncProcessCredentialsResolver(["missing-process"]) with pytest.raises(SmithyIdentityError, match="failed to start"): await resolver.get_identity(properties={}) @@ -329,7 +329,7 @@ async def test_long_term_credentials_cached(): process = mock_subprocess(0, resp_body.encode("utf-8")) with patch("asyncio.create_subprocess_exec", return_value=process) as mock_exec: - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) identity_one = await resolver.get_identity(properties={}) identity_two = await resolver.get_identity(properties={}) @@ -349,7 +349,7 @@ async def test_temporary_credentials_cached_when_valid(): process = mock_subprocess(0, resp_body.encode("utf-8")) with patch("asyncio.create_subprocess_exec", return_value=process) as mock_exec: - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) identity_one = await resolver.get_identity(properties={}) identity_two = await resolver.get_identity(properties={}) @@ -381,7 +381,7 @@ async def test_expired_credentials_refreshed(): "asyncio.create_subprocess_exec", side_effect=[first_process, second_process], ) as mock_exec: - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) identity_one = await resolver.get_identity(properties={}) identity_two = await resolver.get_identity(properties={}) @@ -402,7 +402,7 @@ async def test_invalidate_preserves_cached_credentials(): process = mock_subprocess(0, resp_body.encode("utf-8")) with patch("asyncio.create_subprocess_exec", return_value=process) as mock_exec: - resolver = ProcessCredentialsResolver(["mock-process"]) + resolver = AsyncProcessCredentialsResolver(["mock-process"]) identity_one = await resolver.get_identity(properties={}) await resolver.invalidate() identity_two = await resolver.get_identity(properties={}) @@ -417,7 +417,7 @@ async def test_command_with_multiple_args(): process = mock_subprocess(0, resp_body.encode("utf-8")) with patch("asyncio.create_subprocess_exec", return_value=process) as mock_exec: - resolver = ProcessCredentialsResolver( + resolver = AsyncProcessCredentialsResolver( ["aws-credential-helper", "--profile", "test", "--format", "json"] ) await resolver.get_identity(properties={}) diff --git a/packages/smithy-aws-core/tests/unit/identity/test_static.py b/packages/smithy-aws-core/tests/unit/identity/test_static.py index 5e0a9ea66..501b5077f 100644 --- a/packages/smithy-aws-core/tests/unit/identity/test_static.py +++ b/packages/smithy-aws-core/tests/unit/identity/test_static.py @@ -2,8 +2,8 @@ # SPDX-License-Identifier: Apache-2.0 import pytest +from smithy_aws_core.aio.identity.static import AsyncStaticCredentialsResolver from smithy_aws_core.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_aws_core.identity.static import StaticCredentialsResolver from smithy_core.exceptions import SmithyIdentityError @@ -12,13 +12,13 @@ async def test_returns_fixed_identity() -> None: access_key_id="akid", secret_access_key="secret", ) - resolver = StaticCredentialsResolver(identity) + resolver = AsyncStaticCredentialsResolver(identity) assert await resolver.get_identity(properties={}) is identity async def test_reads_request_properties() -> None: - resolver = StaticCredentialsResolver() + resolver = AsyncStaticCredentialsResolver() identity = await resolver.get_identity( properties={ @@ -45,4 +45,4 @@ async def test_requires_both_request_keys( properties: AWSIdentityProperties, ) -> None: with pytest.raises(SmithyIdentityError): - await StaticCredentialsResolver().get_identity(properties=properties) + await AsyncStaticCredentialsResolver().get_identity(properties=properties) diff --git a/packages/smithy-aws-event-stream/.changes/next-release/smithy-aws-event-stream-breaking-90ed18b5e09b45e094f2f347f7d05e9c.json b/packages/smithy-aws-event-stream/.changes/next-release/smithy-aws-event-stream-breaking-90ed18b5e09b45e094f2f347f7d05e9c.json new file mode 100644 index 000000000..6c3046b14 --- /dev/null +++ b/packages/smithy-aws-event-stream/.changes/next-release/smithy-aws-event-stream-breaking-90ed18b5e09b45e094f2f347f7d05e9c.json @@ -0,0 +1,4 @@ +{ + "type": "breaking", + "description": "Added the `Async` prefix to the async event-stream implementations, for example `AsyncEventSigner`. The unprefixed names are reserved for sync implementations. Update imports to the `aio` paths." +} \ No newline at end of file diff --git a/packages/smithy-aws-event-stream/src/smithy_aws_event_stream/aio/__init__.py b/packages/smithy-aws-event-stream/src/smithy_aws_event_stream/aio/__init__.py index b86024aa8..383fde1e4 100644 --- a/packages/smithy-aws-event-stream/src/smithy_aws_event_stream/aio/__init__.py +++ b/packages/smithy-aws-event-stream/src/smithy_aws_event_stream/aio/__init__.py @@ -8,9 +8,12 @@ from typing import TYPE_CHECKING from smithy_core.aio.interfaces import AsyncByteStream, AsyncWriter -from smithy_core.aio.interfaces.auth import EventSigner -from smithy_core.aio.interfaces.eventstream import EventPublisher, EventReceiver -from smithy_core.aio.interfaces.identity import IdentityResolver +from smithy_core.aio.interfaces.auth import AsyncEventSigner +from smithy_core.aio.interfaces.eventstream import ( + AsyncEventPublisher, + AsyncEventReceiver, +) +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver from smithy_core.codecs import Codec from smithy_core.deserializers import DeserializeableShape, ShapeDeserializer from smithy_core.exceptions import ExpectationNotMetError @@ -33,13 +36,15 @@ @dataclass class SigningConfig: - signer: "EventSigner[AWSCredentialsIdentity, SigV4SigningProperties]" + signer: "AsyncEventSigner[AWSCredentialsIdentity, SigV4SigningProperties]" signing_properties: "SigV4SigningProperties" - identity_resolver: "IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties]" + identity_resolver: ( + "AsyncIdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties]" + ) identity_properties: "AWSIdentityProperties" -class AWSEventPublisher[E: SerializeableShape](EventPublisher[E]): +class AWSEventPublisher[E: SerializeableShape](AsyncEventPublisher[E]): def __init__( self, payload_codec: Codec, @@ -145,7 +150,7 @@ async def _write(self, message: EventMessage) -> None: raise OSError("Failed to write to stream.") from e -class AWSEventReceiver[E: DeserializeableShape](EventReceiver[E]): +class AWSEventReceiver[E: DeserializeableShape](AsyncEventReceiver[E]): def __init__( self, payload_codec: Codec, diff --git a/packages/smithy-cbor/tests/benchmark/model.py b/packages/smithy-cbor/tests/benchmark/model.py index d1b98b1df..c08909c8e 100644 --- a/packages/smithy-cbor/tests/benchmark/model.py +++ b/packages/smithy-cbor/tests/benchmark/model.py @@ -20,8 +20,8 @@ from datetime import datetime from typing import Any, Self -from smithy_core.aio.interfaces import ProtocolSettings from smithy_core.deserializers import ShapeDeserializer +from smithy_core.interfaces import ProtocolSettings from smithy_core.prelude import ( DOUBLE, INTEGER, diff --git a/packages/smithy-cbor/tests/benchmark/test_throughput.py b/packages/smithy-cbor/tests/benchmark/test_throughput.py index df7cefb51..659fc9825 100644 --- a/packages/smithy-cbor/tests/benchmark/test_throughput.py +++ b/packages/smithy-cbor/tests/benchmark/test_throughput.py @@ -3,7 +3,7 @@ """Throughput benchmark: rpcv2Cbor protocol vs awsJson1_0 protocol. Measures the PROTOCOL layer (``serialize_request`` / ``deserialize_response``), NOT the -raw codec. Both protocol classes subclass ``HttpClientProtocol`` and expose the same two +raw codec. Both protocol classes subclass ``AsyncHttpClientProtocol`` and expose the same two methods; we build a modeled shape + ``Schema`` + ``APIOperation`` by hand (see ``model.py``) exactly the way a generated client does, then drive the protocol methods directly with a plain ``time.perf_counter`` loop (no benchmark dependency). @@ -20,14 +20,14 @@ from collections.abc import Awaitable, Callable from datetime import UTC, datetime -from smithy_aws_core.aio.protocols import AwsJson10ClientProtocol +from smithy_aws_core.aio.protocols import AsyncAwsJson10ClientProtocol from smithy_core import URI from smithy_core.aio.types import AsyncBytesReader from smithy_core.interfaces import TypedProperties as _TypedPropertiesInterface from smithy_core.types import TypedProperties from smithy_http import tuples_to_fields from smithy_http.aio import HTTPResponse -from smithy_http.aio.protocols import RpcV2CborClientProtocol +from smithy_http.aio.protocols import AsyncRpcV2CborClientProtocol from .model import ( PUT_RECORDS_OPERATION, @@ -126,7 +126,7 @@ def __init__(self, label: str, ops_per_sec: float, mb_per_sec: float) -> None: def _bench_protocol( name: str, - protocol: RpcV2CborClientProtocol | AwsJson10ClientProtocol, + protocol: AsyncRpcV2CborClientProtocol | AsyncAwsJson10ClientProtocol, content_type: str, ctx: _TypedPropertiesInterface, ) -> tuple[_Measurement, _Measurement, int]: @@ -196,8 +196,8 @@ def test_protocol_throughput() -> None: """ ctx = TypedProperties() - cbor = RpcV2CborClientProtocol(SETTINGS) - json = AwsJson10ClientProtocol(SETTINGS) + cbor = AsyncRpcV2CborClientProtocol(SETTINGS) + json = AsyncAwsJson10ClientProtocol(SETTINGS) cbor_ser, cbor_de, cbor_bytes = _bench_protocol( "cbor", cbor, "application/cbor", ctx diff --git a/packages/smithy-core/.changes/next-release/smithy-core-breaking-ec0ea5b83d674fa0b70ba42fd42a86e9.json b/packages/smithy-core/.changes/next-release/smithy-core-breaking-ec0ea5b83d674fa0b70ba42fd42a86e9.json new file mode 100644 index 000000000..1d13a60b6 --- /dev/null +++ b/packages/smithy-core/.changes/next-release/smithy-core-breaking-ec0ea5b83d674fa0b70ba42fd42a86e9.json @@ -0,0 +1,4 @@ +{ + "type": "breaking", + "description": "Moved async implementations to `smithy_core.aio` and added the `Async` prefix to their names, for example `AsyncClientProtocol`, `AsyncRpcClientProtocol`, `AsyncEndpointResolver`, `AsyncStandardRetryStrategy`, `AsyncSigner` and the event-stream types `AsyncDuplexEventStream`/`AsyncInputEventStream`/`AsyncOutputEventStream`. The unprefixed names are reserved for sync implementations. `ProtocolSettings` and `ProtocolConstructor` moved to `smithy_core.interfaces`. Update imports to the `aio` paths." +} \ No newline at end of file diff --git a/packages/smithy-core/src/smithy_core/aio/client.py b/packages/smithy-core/src/smithy_core/aio/client.py index 719fb9341..257c99ec7 100644 --- a/packages/smithy-core/src/smithy_core/aio/client.py +++ b/packages/smithy-core/src/smithy_core/aio/client.py @@ -34,31 +34,37 @@ from ..shapes import ShapeID, ShapeType from ..types import PropertyKey from ..types import TypedProperties as _TypedProperties -from .eventstream import DuplexEventStream, InputEventStream, OutputEventStream +from .eventstream import ( + AsyncDuplexEventStream, + AsyncInputEventStream, + AsyncOutputEventStream, +) from .interfaces import ( - ClientProtocol, - ClientTransport, - EndpointResolver, + AsyncClientProtocol, + AsyncClientTransport, + AsyncEndpointResolver, Request, Response, ) -from .interfaces.auth import AuthScheme -from .interfaces.eventstream import EventReceiver -from .interfaces.retries import RetryStrategy -from .retries import AdaptiveRetryStrategy, RetryStrategyResolver +from .interfaces.auth import AsyncAuthScheme +from .interfaces.eventstream import AsyncEventReceiver +from .interfaces.retries import AsyncRetryStrategy +from .retries import AsyncAdaptiveRetryStrategy, AsyncRetryStrategyResolver from .utils import close, seek if TYPE_CHECKING: from typing_extensions import TypeForm -AUTH_SCHEME = PropertyKey(key="auth_scheme", value_type=AuthScheme[Any, Any, Any, Any]) +AUTH_SCHEME = PropertyKey( + key="auth_scheme", value_type=AsyncAuthScheme[Any, Any, Any, Any] +) _UNRESOLVED = URI(host="", path="/") _LOGGER = logging.getLogger(__name__) @dataclass(kw_only=True, frozen=True) -class ClientCall[I: SerializeableShape, O: DeserializeableShape]: +class AsyncClientCall[I: SerializeableShape, O: DeserializeableShape]: """A data class containing all the initial information about an operation invocation.""" @@ -80,13 +86,13 @@ class ClientCall[I: SerializeableShape, O: DeserializeableShape]: auth_scheme_resolver: AuthSchemeResolver """The auth scheme resolver for the operation.""" - supported_auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] + supported_auth_schemes: dict[ShapeID, AsyncAuthScheme[Any, Any, Any, Any]] """The supported auth schemes for the operation.""" - endpoint_resolver: EndpointResolver + endpoint_resolver: AsyncEndpointResolver """The endpoint resolver for the operation.""" - retry_strategy: RetryStrategy + retry_strategy: AsyncRetryStrategy """The retry strategy to use for the operation.""" retry_scope: str | None = None @@ -115,26 +121,26 @@ async def _rewind_position(body: Any) -> int | None: return None -class RequestPipeline[TRequest: Request, TResponse: Response]: +class AsyncRequestPipeline[TRequest: Request, TResponse: Response]: """Invokes client operations asynchronously.""" - protocol: ClientProtocol[TRequest, TResponse] + protocol: AsyncClientProtocol[TRequest, TResponse] """The protocol to use to serialize the request and deserialize the response.""" - transport: ClientTransport[TRequest, TResponse] + transport: AsyncClientTransport[TRequest, TResponse] """The transport to use to send the request and receive the response (e.g. an HTTP Client).""" def __init__( self, - protocol: ClientProtocol[TRequest, TResponse], - transport: ClientTransport[TRequest, TResponse], + protocol: AsyncClientProtocol[TRequest, TResponse], + transport: AsyncClientTransport[TRequest, TResponse], ) -> None: self.protocol = protocol self.transport = transport async def __call__[I: SerializeableShape, O: DeserializeableShape]( - self, call: ClientCall[I, O], / + self, call: AsyncClientCall[I, O], / ) -> O: """Invoke an operation asynchronously. @@ -148,8 +154,8 @@ async def input_stream[ O: DeserializeableShape, E: SerializeableShape, ]( - self, call: ClientCall[I, O], event_type: "TypeForm[E]", / - ) -> InputEventStream[E, O]: + self, call: AsyncClientCall[I, O], event_type: "TypeForm[E]", / + ) -> AsyncInputEventStream[E, O]: """Invoke an input stream operation asynchronously. :param call: The operation to invoke and associated context. @@ -175,7 +181,9 @@ async def input_stream[ with contextlib.suppress(BaseException): await output_future raise - return InputEventStream(input_stream=input_stream, output_future=output_future) + return AsyncInputEventStream( + input_stream=input_stream, output_future=output_future + ) async def _await_output[I: SerializeableShape, O: DeserializeableShape]( self, @@ -190,11 +198,11 @@ async def output_stream[ E: DeserializeableShape, ]( self, - call: ClientCall[I, O], + call: AsyncClientCall[I, O], event_type: "TypeForm[E]", event_deserializer: Callable[[ShapeDeserializer], E], /, - ) -> OutputEventStream[E, O]: + ) -> AsyncOutputEventStream[E, O]: """Invoke an input stream operation asynchronously. :param call: The operation to invoke and associated context. @@ -210,7 +218,7 @@ async def output_stream[ event_deserializer=event_deserializer, context=output_context.properties, ) - return OutputEventStream(output_stream=output_stream, output=output) + return AsyncOutputEventStream(output_stream=output_stream, output=output) async def duplex_stream[ I: SerializeableShape, @@ -219,12 +227,12 @@ async def duplex_stream[ OE: DeserializeableShape, ]( self, - call: ClientCall[I, O], + call: AsyncClientCall[I, O], input_event_type: "TypeForm[IE]", output_event_type: "TypeForm[OE]", event_deserializer: Callable[[ShapeDeserializer], OE], /, - ) -> DuplexEventStream[IE, OE, O]: + ) -> AsyncDuplexEventStream[IE, OE, O]: """Invoke an input stream operation asynchronously. :param call: The operation to invoke and associated context. @@ -270,7 +278,9 @@ async def duplex_stream[ event_deserializer=event_deserializer, ) ) - return DuplexEventStream(input_stream=input_stream, output_future=output_future) + return AsyncDuplexEventStream( + input_stream=input_stream, output_future=output_future + ) async def _await_output_stream[ I: SerializeableShape, @@ -278,11 +288,11 @@ async def _await_output_stream[ OE: DeserializeableShape, ]( self, - call: ClientCall[I, O], + call: AsyncClientCall[I, O], execute_task: Awaitable[tuple[O, OutputContext[I, O, TRequest, TResponse]]], output_event_type: "TypeForm[OE]", event_deserializer: Callable[[ShapeDeserializer], OE], - ) -> tuple[O, EventReceiver[OE]]: + ) -> tuple[O, AsyncEventReceiver[OE]]: output, output_context = await execute_task output_stream = self.protocol.create_event_receiver( operation=call.operation, @@ -296,7 +306,7 @@ async def _await_output_stream[ async def _execute_request[I: SerializeableShape, O: DeserializeableShape]( self, - call: ClientCall[I, O], + call: AsyncClientCall[I, O], request_future: Future[RequestContext[I, TRequest]] | None, ) -> tuple[O, OutputContext[I, O, TRequest, TResponse]]: _LOGGER.debug( @@ -354,7 +364,7 @@ def _attach_response_metadata[I: SerializeableShape, O: DeserializeableShape]( async def _handle_execution[I: SerializeableShape, O: DeserializeableShape]( self, - call: ClientCall[I, O], + call: AsyncClientCall[I, O], request_future: Future[RequestContext[I, TRequest]] | None, ) -> OutputContext[I, O, TRequest | None, TResponse | None]: interceptor = call.interceptor @@ -413,7 +423,7 @@ async def _handle_execution[I: SerializeableShape, O: DeserializeableShape]( async def _retry[I: SerializeableShape, O: DeserializeableShape]( self, - call: ClientCall[I, O], + call: AsyncClientCall[I, O], request_context: RequestContext[I, TRequest], request_future: Future[RequestContext[I, TRequest]] | None, ) -> OutputContext[I, O, TRequest | None, TResponse | None]: @@ -494,7 +504,7 @@ async def _send_with_rate_limiting[ O: DeserializeableShape, ]( self, - call: ClientCall[I, O], + call: AsyncClientCall[I, O], request_context: RequestContext[I, TRequest], request_future: Future[RequestContext[I, TRequest]] | None, ) -> OutputContext[I, O, TRequest, TResponse | None]: @@ -528,32 +538,32 @@ async def _send_with_rate_limiting[ return output_context async def _handle_pre_request_rate_limiting( - self, retry_strategy: RetryStrategy + self, retry_strategy: AsyncRetryStrategy ) -> None: """Handle rate limiting before sending request.""" - if isinstance(retry_strategy, AdaptiveRetryStrategy): + if isinstance(retry_strategy, AsyncAdaptiveRetryStrategy): await retry_strategy.acquire_from_token_bucket() async def _handle_post_error_response_rate_limiting( - self, retry_strategy: RetryStrategy, error: Exception + self, retry_strategy: AsyncRetryStrategy, error: Exception ) -> None: """Handle rate limiting after failed response.""" - if isinstance(retry_strategy, AdaptiveRetryStrategy): + if isinstance(retry_strategy, AsyncAdaptiveRetryStrategy): is_throttling = retry_strategy.is_throttling_error(error) await retry_strategy.rate_limiter.after_receiving_response(is_throttling) async def _handle_success_rate_limiting( - self, retry_strategy: RetryStrategy + self, retry_strategy: AsyncRetryStrategy ) -> None: """Handle rate limiting after successful response.""" - if isinstance(retry_strategy, AdaptiveRetryStrategy): + if isinstance(retry_strategy, AsyncAdaptiveRetryStrategy): await retry_strategy.rate_limiter.after_receiving_response( throttling_error=False ) async def _handle_attempt[I: SerializeableShape, O: DeserializeableShape]( self, - call: ClientCall[I, O], + call: AsyncClientCall[I, O], request_context: RequestContext[I, TRequest], request_future: Future[RequestContext[I, TRequest]] | None, ) -> OutputContext[I, O, TRequest, TResponse | None]: @@ -715,8 +725,8 @@ async def _handle_attempt[I: SerializeableShape, O: DeserializeableShape]( return self._finalize_attempt(call, output_context) def _resolve_auth[I: SerializeableShape, O: DeserializeableShape]( - self, call: ClientCall[Any, Any], params: AuthParams[I, O] - ) -> tuple[AuthOption, AuthScheme[TRequest, Any, Any, Any]] | None: + self, call: AsyncClientCall[Any, Any], params: AuthParams[I, O] + ) -> tuple[AuthOption, AsyncAuthScheme[TRequest, Any, Any, Any]] | None: auth_options: Sequence[AuthOption] = ( call.auth_scheme_resolver.resolve_auth_scheme(auth_parameters=params) ) @@ -731,7 +741,7 @@ def _resolve_auth[I: SerializeableShape, O: DeserializeableShape]( def _finalize_attempt[I: SerializeableShape, O: DeserializeableShape]( self, - call: ClientCall[I, O], + call: AsyncClientCall[I, O], output_context: OutputContext[I, O, TRequest, TResponse | None], ) -> OutputContext[I, O, TRequest, TResponse | None]: interceptor = call.interceptor @@ -752,7 +762,7 @@ def _finalize_attempt[I: SerializeableShape, O: DeserializeableShape]( def _finalize_execution[I: SerializeableShape, O: DeserializeableShape]( self, - call: ClientCall[I, O], + call: AsyncClientCall[I, O], output_context: OutputContext[I, O, TRequest | None, TResponse | None], ) -> OutputContext[I, O, TRequest | None, TResponse | None]: interceptor = call.interceptor @@ -781,8 +791,8 @@ def __init__(self) -> None: self._derive_lock = asyncio.Lock() self._setup_done = False self._closed = False - self._transport: ClientTransport[Any, Any] | None = None - self._retry_strategy_resolver = RetryStrategyResolver() + self._transport: AsyncClientTransport[Any, Any] | None = None + self._retry_strategy_resolver = AsyncRetryStrategyResolver() def _build_call[I: SerializeableShape, O: DeserializeableShape]( self, @@ -790,11 +800,13 @@ def _build_call[I: SerializeableShape, O: DeserializeableShape]( operation: APIOperation[I, O], *, config: Any, - retry_strategy: RetryStrategy, - ) -> tuple[RequestPipeline[Any, Any], ClientCall[I, O]]: + retry_strategy: AsyncRetryStrategy, + ) -> tuple[AsyncRequestPipeline[Any, Any], AsyncClientCall[I, O]]: """Build the pipeline and call from a resolved config and retry strategy.""" - pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) - call = ClientCall( + pipeline = AsyncRequestPipeline( + protocol=config.protocol, transport=config.transport + ) + call = AsyncClientCall( input=input, operation=operation, context=_TypedProperties({"config": config}), diff --git a/packages/smithy-core/src/smithy_core/aio/endpoints.py b/packages/smithy-core/src/smithy_core/aio/endpoints.py index 636d66657..80b93f704 100644 --- a/packages/smithy-core/src/smithy_core/aio/endpoints.py +++ b/packages/smithy-core/src/smithy_core/aio/endpoints.py @@ -5,12 +5,12 @@ from ..endpoints import Endpoint, EndpointResolverParams, resolve_static_uri from ..exceptions import EndpointResolutionError from ..interfaces import Endpoint as _Endpoint -from .interfaces import EndpointResolver +from .interfaces import AsyncEndpointResolver -__all__ = ["StaticEndpointResolver"] +__all__ = ["AsyncStaticEndpointResolver"] -class StaticEndpointResolver(EndpointResolver): +class AsyncStaticEndpointResolver(AsyncEndpointResolver): """A basic endpoint resolver that forwards a static URI.""" async def resolve_endpoint(self, params: EndpointResolverParams[Any]) -> _Endpoint: diff --git a/packages/smithy-core/src/smithy_core/aio/eventstream.py b/packages/smithy-core/src/smithy_core/aio/eventstream.py index 01b781237..ceb163476 100644 --- a/packages/smithy-core/src/smithy_core/aio/eventstream.py +++ b/packages/smithy-core/src/smithy_core/aio/eventstream.py @@ -5,12 +5,19 @@ from ..deserializers import DeserializeableShape from ..serializers import SerializeableShape -from .interfaces.eventstream import EventPublisher, EventReceiver +from .interfaces.eventstream import AsyncEventPublisher, AsyncEventReceiver -__all__ = ["DuplexEventStream", "InputEventStream", "OutputEventStream"] +__all__ = [ + "AsyncDuplexEventStream", + "AsyncInputEventStream", + "AsyncOutputEventStream", + "DuplexEventStream", + "InputEventStream", + "OutputEventStream", +] -class DuplexEventStream[ +class AsyncDuplexEventStream[ IE: SerializeableShape, OE: DeserializeableShape, O: DeserializeableShape, @@ -51,10 +58,10 @@ async def handle_output(stream: EventStream) -> None: return """ - input_stream: EventPublisher[IE] + input_stream: AsyncEventPublisher[IE] """An event stream that sends events to the service.""" - output_stream: EventReceiver[OE] | None = None + output_stream: AsyncEventReceiver[OE] | None = None """An event stream that receives events from the service. This value may be None until ``await_output`` has been called. @@ -74,13 +81,13 @@ async def handle_output(stream: EventStream) -> None: def __init__( self, *, - input_stream: EventPublisher[IE], - output_future: Future[tuple[O, EventReceiver[OE]]], + input_stream: AsyncEventPublisher[IE], + output_future: Future[tuple[O, AsyncEventReceiver[OE]]], ) -> None: self.input_stream = input_stream self._output_future = output_future - async def await_output(self) -> tuple[O, EventReceiver[OE]]: + async def await_output(self) -> tuple[O, AsyncEventReceiver[OE]]: """Await the operation's output. The EventStream will be returned as soon as the input stream is ready to @@ -120,7 +127,7 @@ async def __aexit__(self, exc_type: Any, exc_value: Any, traceback: Any): await self.close() -class InputEventStream[IE: SerializeableShape, O]: +class AsyncInputEventStream[IE: SerializeableShape, O]: """An event stream that streams messages to the service. To ensure that streams are closed upon exiting, this class may be used as an async @@ -139,7 +146,7 @@ async def main(): await stream.await_output() """ - input_stream: EventPublisher[IE] + input_stream: AsyncEventPublisher[IE] """An event stream that sends events to the service.""" output: O | None = None @@ -154,7 +161,7 @@ async def main(): def __init__( self, *, - input_stream: EventPublisher[IE], + input_stream: AsyncEventPublisher[IE], output_future: Future[O], ) -> None: self.input_stream = input_stream @@ -186,7 +193,7 @@ async def __aexit__(self, exc_type: Any, exc_value: Any, traceback: Any): await self.close() -class OutputEventStream[OE: DeserializeableShape, O: DeserializeableShape]: +class AsyncOutputEventStream[OE: DeserializeableShape, O: DeserializeableShape]: """An event stream that streams messages from the service. To ensure that streams are closed upon exiting, this class may be used as an async @@ -207,7 +214,7 @@ async def main(): return """ - output_stream: EventReceiver[OE] + output_stream: AsyncEventReceiver[OE] """An event stream that receives events from the service. This value will also be None if the operation has no output stream. @@ -220,7 +227,7 @@ async def main(): events. It will always be available before any events. """ - def __init__(self, output_stream: EventReceiver[OE], output: O) -> None: + def __init__(self, output_stream: AsyncEventReceiver[OE], output: O) -> None: self.output_stream = output_stream self.output = output @@ -233,3 +240,10 @@ async def __aenter__(self) -> Self: async def __aexit__(self, exc_type: Any, exc_value: Any, traceback: Any): await self.close() + + +# TODO(sync-renames): drop once aws-sdk-python's hand-written integration test +# harness imports the Async*-prefixed names instead of these pre-rename ones. +DuplexEventStream = AsyncDuplexEventStream +InputEventStream = AsyncInputEventStream +OutputEventStream = AsyncOutputEventStream diff --git a/packages/smithy-core/src/smithy_core/aio/identity.py b/packages/smithy-core/src/smithy_core/aio/identity.py index 30ee6770b..4c622b6db 100644 --- a/packages/smithy-core/src/smithy_core/aio/identity.py +++ b/packages/smithy-core/src/smithy_core/aio/identity.py @@ -6,16 +6,16 @@ from ..exceptions import SmithyIdentityError from ..interfaces.identity import Identity -from .interfaces.identity import IdentityResolver +from .interfaces.identity import AsyncIdentityResolver -__all__ = ["CachingIdentityResolver", "ChainedIdentityResolver"] +__all__ = ["AsyncCachingIdentityResolver", "AsyncChainedIdentityResolver"] logger: Final = logging.getLogger(__name__) # TODO: turn this into a decorator -class CachingIdentityResolver[I: Identity, IP: Mapping[str, Any]]( - IdentityResolver[I, IP] +class AsyncCachingIdentityResolver[I: Identity, IP: Mapping[str, Any]]( + AsyncIdentityResolver[I, IP] ): def __init__(self) -> None: self._cached: I | None = None @@ -33,8 +33,8 @@ async def invalidate(self) -> None: self._cached = None -class ChainedIdentityResolver[I: Identity, IP: Mapping[str, Any]]( - CachingIdentityResolver[I, IP] +class AsyncChainedIdentityResolver[I: Identity, IP: Mapping[str, Any]]( + AsyncCachingIdentityResolver[I, IP] ): """Attempts to resolve an identity by checking a sequence of sub-resolvers. @@ -42,8 +42,8 @@ class ChainedIdentityResolver[I: Identity, IP: Mapping[str, Any]]( resolver in the chain will be attempted. """ - def __init__(self, resolvers: Sequence[IdentityResolver[I, IP]]) -> None: - """Construct a ChainedIdentityResolver. + def __init__(self, resolvers: Sequence[AsyncIdentityResolver[I, IP]]) -> None: + """Construct a AsyncChainedIdentityResolver. :param resolvers: The sequence of resolvers to resolve identity from. """ diff --git a/packages/smithy-core/src/smithy_core/aio/interfaces/__init__.py b/packages/smithy-core/src/smithy_core/aio/interfaces/__init__.py index 70b10b61a..099346fa6 100644 --- a/packages/smithy-core/src/smithy_core/aio/interfaces/__init__.py +++ b/packages/smithy-core/src/smithy_core/aio/interfaces/__init__.py @@ -1,26 +1,26 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 from collections.abc import AsyncIterable, Callable -from dataclasses import dataclass from typing import TYPE_CHECKING, Any, Literal, Protocol, runtime_checkable from ...documents import TypeRegistry from ...endpoints import EndpointResolverParams from ...exceptions import UnsupportedStreamError from ...interfaces import Endpoint, TypedProperties, URI +from ...interfaces import ProtocolConstructor as ProtocolConstructor +from ...interfaces import ProtocolSettings as ProtocolSettings from ...interfaces import StreamingBlob as SyncStreamingBlob -from .eventstream import EventPublisher, EventReceiver +from .eventstream import AsyncEventPublisher, AsyncEventReceiver if TYPE_CHECKING: from typing_extensions import TypeForm - from ..._schema_compact import StaticSchema from ...deserializers import DeserializeableShape, ShapeDeserializer from ...response import ResponseMetadata - from ...schemas import APIOperation, Schema + from ...schemas import APIOperation from ...serializers import SerializeableShape from ...shapes import ShapeID - from .auth import AuthScheme + from .auth import AsyncAuthScheme @runtime_checkable @@ -77,7 +77,7 @@ def consume_body(self) -> bytes: ... -class EndpointResolver(Protocol): +class AsyncEndpointResolver(Protocol): """Resolves an operation's endpoint based given parameters.""" async def resolve_endpoint(self, params: EndpointResolverParams[Any]) -> Endpoint: @@ -88,11 +88,11 @@ async def resolve_endpoint(self, params: EndpointResolverParams[Any]) -> Endpoin ... -class ClientTransport[I: Request, O: Response](Protocol): +class AsyncClientTransport[I: Request, O: Response](Protocol): """Protocol-agnostic representation of a client transport (e.g. an HTTP client). Transports that support duplex (bidirectional) event streaming can implement - :py:class:`DuplexClientTransport`. + :py:class:`AsyncDuplexClientTransport`. """ TIMEOUT_EXCEPTIONS: tuple[type[Exception], ...] @@ -102,7 +102,9 @@ async def send(self, request: I) -> O: ... -class DuplexClientTransport[I: Request, O: Response](ClientTransport[I, O], Protocol): +class AsyncDuplexClientTransport[I: Request, O: Response]( + AsyncClientTransport[I, O], Protocol +): """A client transport that supports duplex (bidirectional) event streaming. Duplex transports can read response data while the request body is still being @@ -112,46 +114,7 @@ class DuplexClientTransport[I: Request, O: Response](ClientTransport[I, O], Prot SUPPORTS_DUPLEX_STREAMING: Literal[True] -@dataclass(kw_only=True, frozen=True) -class ProtocolSettings: - """Service-level metadata for constructing a protocol. - - Lets a consumer select a protocol by class alone (e.g. - ``protocol=AwsQueryClientProtocol``) without importing a private schema module. - """ - - namespace: str - """The service's Smithy namespace, e.g. ``com.amazonaws.sqs``.""" - - service_target: str - """The service shape name, used as the ``X-Amz-Target`` prefix by RPC protocols.""" - - version: str | None = None - """The service API version. Required by awsQuery; unused by other protocols.""" - - xml_namespace: str | None = None - """The URI of the service's ``@xmlNamespace``, applied by restXml to request - payloads that don't declare their own namespace.""" - - service_schema: "StaticSchema | Schema" - """The service shape's schema. - - Carries the service's traits, including the protocol trait whose ``eventStreamHttp`` - the RPC protocols read to negotiate HTTP/2 for event streams. The protocol reads its - own trait off this schema, so the value is inherently per-protocol rather than a - single flattened field. Codegen passes the compact schema form; it is hydrated on - first read. - """ - - -type ProtocolConstructor[T] = Callable[[ProtocolSettings], T] -"""A callable that builds a protocol instance from ``ProtocolSettings``. - -A protocol class satisfies this, since calling the class constructs an instance. -""" - - -class ClientProtocol[I: Request, O: Response](Protocol): +class AsyncClientProtocol[I: Request, O: Response](Protocol): """A protocol used by a client to communicate with a server.""" @property @@ -247,8 +210,8 @@ async def create_event_publisher[ request: I, event_type: "TypeForm[Event]", context: TypedProperties, - auth_scheme: "AuthScheme[Any, Any, Any, Any] | None" = None, - ) -> EventPublisher[Event]: + auth_scheme: "AsyncAuthScheme[Any, Any, Any, Any] | None" = None, + ) -> AsyncEventPublisher[Event]: """Creates an event publisher for a protocol event stream. :param operation: The event stream operation. @@ -272,7 +235,7 @@ def create_event_receiver[ event_type: "TypeForm[Event]", event_deserializer: Callable[["ShapeDeserializer"], Event], context: TypedProperties, - ) -> EventReceiver[Event]: + ) -> AsyncEventReceiver[Event]: """Creates an event receiver for a protocol event stream. :param operation: The event stream operation. diff --git a/packages/smithy-core/src/smithy_core/aio/interfaces/auth.py b/packages/smithy-core/src/smithy_core/aio/interfaces/auth.py index 751a9710f..2219f4af0 100644 --- a/packages/smithy-core/src/smithy_core/aio/interfaces/auth.py +++ b/packages/smithy-core/src/smithy_core/aio/interfaces/auth.py @@ -7,10 +7,10 @@ from ...interfaces.identity import Identity from ...shapes import ShapeID from . import Request -from .identity import IdentityResolver +from .identity import AsyncIdentityResolver -class Signer[R: Request, I, SP: Mapping[str, Any]](Protocol): +class AsyncSigner[R: Request, I, SP: Mapping[str, Any]](Protocol): """A class that signs requests before they are sent.""" async def sign(self, *, request: R, identity: I, properties: SP) -> R: @@ -23,7 +23,7 @@ async def sign(self, *, request: R, identity: I, properties: SP) -> R: ... -class EventSigner[I, SP: Mapping[str, Any]](Protocol): +class AsyncEventSigner[I, SP: Mapping[str, Any]](Protocol): """A class that signs requests before they are sent.""" # TODO: add a protocol type for events @@ -46,9 +46,12 @@ async def sign_empty(self, *, event: Any, identity: I, properties: SP) -> Any: ... -class AuthScheme[R: Request, I: Identity, IP: Mapping[str, Any], SP: Mapping[str, Any]]( - Protocol -): +class AsyncAuthScheme[ + R: Request, + I: Identity, + IP: Mapping[str, Any], + SP: Mapping[str, Any], +](Protocol): """A class that coordinates identity and auth.""" scheme_id: ShapeID @@ -66,7 +69,7 @@ def identity_properties(self, *, context: _TypedProperties) -> IP: def identity_resolver( self, *, context: _TypedProperties - ) -> IdentityResolver[I, IP]: + ) -> AsyncIdentityResolver[I, IP]: """Get an identity resolver for the request. The context will always include the client's config under "config". Other @@ -86,11 +89,11 @@ def signer_properties(self, *, context: _TypedProperties) -> SP: """ ... - def signer(self) -> Signer[R, I, SP]: + def signer(self) -> AsyncSigner[R, I, SP]: """Get a signer for the request.""" ... - def event_signer(self, *, request: R) -> EventSigner[I, SP] | None: + def event_signer(self, *, request: R) -> AsyncEventSigner[I, SP] | None: """Construct a signer for event stream events. :param request: The request that will initiate the event stream. The request diff --git a/packages/smithy-core/src/smithy_core/aio/interfaces/eventstream.py b/packages/smithy-core/src/smithy_core/aio/interfaces/eventstream.py index d0aaf8099..096cd46f1 100644 --- a/packages/smithy-core/src/smithy_core/aio/interfaces/eventstream.py +++ b/packages/smithy-core/src/smithy_core/aio/interfaces/eventstream.py @@ -6,7 +6,7 @@ from ...serializers import SerializeableShape -class EventPublisher[E: SerializeableShape](Protocol): +class AsyncEventPublisher[E: SerializeableShape](Protocol): """Asynchronously sends events to a service. This may be used as a context manager to ensure the stream is closed before exiting. @@ -30,7 +30,7 @@ async def __aexit__(self, exc_type: Any, exc_value: Any, traceback: Any): await self.close() -class EventReceiver[E: DeserializeableShape](Protocol): +class AsyncEventReceiver[E: DeserializeableShape](Protocol): """Asynchronously receives events from a service. Events may be received via the ``receive`` method or by using this class as diff --git a/packages/smithy-core/src/smithy_core/aio/interfaces/identity.py b/packages/smithy-core/src/smithy_core/aio/interfaces/identity.py index 2166ad37a..cc898bc26 100644 --- a/packages/smithy-core/src/smithy_core/aio/interfaces/identity.py +++ b/packages/smithy-core/src/smithy_core/aio/interfaces/identity.py @@ -6,7 +6,7 @@ from ...interfaces.identity import Identity -class IdentityResolver[I: Identity, IP: Mapping[str, Any]](Protocol): +class AsyncIdentityResolver[I: Identity, IP: Mapping[str, Any]](Protocol): """Used to load a user's `Identity` from a given source. Each `Identity` may have one or more resolver implementations. diff --git a/packages/smithy-core/src/smithy_core/aio/interfaces/retries.py b/packages/smithy-core/src/smithy_core/aio/interfaces/retries.py index fbe188b55..ff3bcce8a 100644 --- a/packages/smithy-core/src/smithy_core/aio/interfaces/retries.py +++ b/packages/smithy-core/src/smithy_core/aio/interfaces/retries.py @@ -6,8 +6,8 @@ @runtime_checkable -class RetryStrategy(Protocol): - """Issuer of :py:class:`RetryToken`s.""" +class AsyncRetryStrategy(Protocol): + """Issuer of :py:class:`RetryToken`s whose decisions may await I/O.""" backoff_strategy: RetryBackoffStrategy """The strategy used by returned tokens to compute delay duration values.""" diff --git a/packages/smithy-core/src/smithy_core/aio/retries.py b/packages/smithy-core/src/smithy_core/aio/retries.py index 6562ea8a2..7e21a7767 100644 --- a/packages/smithy-core/src/smithy_core/aio/retries.py +++ b/packages/smithy-core/src/smithy_core/aio/retries.py @@ -19,38 +19,40 @@ StandardRetryQuota, StandardRetryToken, ) -from .interfaces.retries import RetryStrategy +from .interfaces.retries import AsyncRetryStrategy __all__ = [ - "AdaptiveRetryStrategy", - "ClientRateLimiter", - "RequestRateTracker", - "RetryStrategyResolver", - "SimpleRetryStrategy", - "StandardRetryStrategy", - "TokenBucket", + "AsyncAdaptiveRetryStrategy", + "AsyncClientRateLimiter", + "AsyncRequestRateTracker", + "AsyncRetryStrategyResolver", + "AsyncSimpleRetryStrategy", + "AsyncStandardRetryStrategy", + "AsyncTokenBucket", ] -class RetryStrategyResolver: +class AsyncRetryStrategyResolver: """Retry strategy resolver that caches retry strategies based on configuration options. This resolver caches retry strategy instances based on their configuration to reuse existing - instances of RetryStrategy with the same settings. Each resolver has its own cache, so a + instances of AsyncRetryStrategy with the same settings. Each resolver has its own cache, so a client keeps its strategies, and any state they hold such as an adaptive rate limiter, for as long as the client exists, no matter how many other clients are created. """ def __init__(self) -> None: - self._strategies: dict[tuple[RetryStrategyType, int | None], RetryStrategy] = {} + self._strategies: dict[ + tuple[RetryStrategyType, int | None], AsyncRetryStrategy + ] = {} async def resolve_retry_strategy( self, *, - retry_strategy: RetryStrategy | RetryStrategyOptions | None, + retry_strategy: AsyncRetryStrategy | RetryStrategyOptions | None, retry_mode: RetryStrategyType | None = None, max_attempts: int | None = None, - ) -> RetryStrategy: + ) -> AsyncRetryStrategy: """Resolve a retry strategy from the provided options, using cache when possible. :param retry_strategy: An explicitly configured retry strategy or options for @@ -60,7 +62,7 @@ async def resolve_retry_strategy( :param max_attempts: Maximum attempts to fall back on when ``retry_strategy`` is None, typically resolved from ``AWS_MAX_ATTEMPTS`` or a config profile. """ - if isinstance(retry_strategy, RetryStrategy): + if isinstance(retry_strategy, AsyncRetryStrategy): return retry_strategy elif retry_strategy is None: # Fall back to the separately-resolved config values. @@ -70,7 +72,7 @@ async def resolve_retry_strategy( ) elif not isinstance(retry_strategy, RetryStrategyOptions): # type: ignore[reportUnnecessaryIsInstance] raise TypeError( - f"retry_strategy must be RetryStrategy, RetryStrategyOptions, or None, " + f"retry_strategy must be AsyncRetryStrategy, RetryStrategyOptions, or None, " f"got {type(retry_strategy).__name__}" ) return self._create_retry_strategy( @@ -79,7 +81,7 @@ async def resolve_retry_strategy( def _create_retry_strategy( self, retry_mode: RetryStrategyType, max_attempts: int | None - ) -> RetryStrategy: + ) -> AsyncRetryStrategy: key = (retry_mode, max_attempts) if key not in self._strategies: self._strategies[key] = self._new_retry_strategy(retry_mode, max_attempts) @@ -87,23 +89,23 @@ def _create_retry_strategy( def _new_retry_strategy( self, retry_mode: RetryStrategyType, max_attempts: int | None - ) -> RetryStrategy: + ) -> AsyncRetryStrategy: kwargs: dict[str, Any] = {"max_attempts": max_attempts} filtered_kwargs: dict[str, Any] = { k: v for k, v in kwargs.items() if v is not None } match retry_mode: case "simple": - return SimpleRetryStrategy(**filtered_kwargs) + return AsyncSimpleRetryStrategy(**filtered_kwargs) case "standard": - return StandardRetryStrategy(**filtered_kwargs) + return AsyncStandardRetryStrategy(**filtered_kwargs) case "adaptive": - return AdaptiveRetryStrategy(**filtered_kwargs) + return AsyncAdaptiveRetryStrategy(**filtered_kwargs) case _: raise ValueError(f"Unknown retry mode: {retry_mode}") -class SimpleRetryStrategy: +class AsyncSimpleRetryStrategy: def __init__( self, *, @@ -157,11 +159,11 @@ async def refresh_retry_token_for_retry( async def record_success(self, *, token: retries_interface.RetryToken) -> None: """Not used by this retry strategy.""" - def __deepcopy__(self, memo: Any) -> "SimpleRetryStrategy": + def __deepcopy__(self, memo: Any) -> "AsyncSimpleRetryStrategy": return self -class StandardRetryStrategy: +class AsyncStandardRetryStrategy: _RETRY_AFTER_MAX_ADDITIONAL: float = 5 """Upper bound (seconds) for additional delay beyond the computed backoff.""" @@ -247,7 +249,7 @@ async def refresh_retry_token_for_retry( """ if not isinstance(token_to_renew, StandardRetryToken): raise TypeError( - f"StandardRetryStrategy requires StandardRetryToken, got {type(token_to_renew).__name__}" + f"AsyncStandardRetryStrategy requires StandardRetryToken, got {type(token_to_renew).__name__}" ) if isinstance(error, retries_interface.ErrorRetryInfo) and error.is_retry_safe: @@ -295,18 +297,18 @@ async def record_success(self, *, token: retries_interface.RetryToken) -> None: """ if not isinstance(token, StandardRetryToken): raise TypeError( - f"StandardRetryStrategy requires StandardRetryToken, got {type(token).__name__}" + f"AsyncStandardRetryStrategy requires StandardRetryToken, got {type(token).__name__}" ) self._retry_quota.release(release_amount=token.quota_acquired) - def __deepcopy__(self, memo: Any) -> "StandardRetryStrategy": + def __deepcopy__(self, memo: Any) -> "AsyncStandardRetryStrategy": return self -class TokenBucket: +class AsyncTokenBucket: """Token bucket for rate limiting with configurable fill rate. - TokenBucket provides a collection of arbitrary tokens while managing issuance + AsyncTokenBucket provides a collection of arbitrary tokens while managing issuance and refilling over time. This is controlled by a fill rate that can be variably adjusted. When tokens aren't available, the bucket will enforce a delay before attempting to reacquire tokens until one is available or the defined timeout is @@ -330,7 +332,7 @@ def __init__( fill_rate: float = MIN_FILL_RATE, timeout: float = DEFAULT_TIMEOUT, ): - """Initialize a new TokenBucket. + """Initialize a new AsyncTokenBucket. :param curr_capacity: Initial number of tokens in the bucket. The bucket can hold at least MIN_CAPACITY tokens, but starts empty by default. @@ -467,10 +469,10 @@ def fill_rate(self) -> float: return self._fill_rate -class RequestRateTracker: - """RequestRateTracker tracks the client's request sending rate. +class AsyncRequestRateTracker: + """AsyncRequestRateTracker tracks the client's request sending rate. - RequestRateTracker measures the actual client request sending rate using + AsyncRequestRateTracker measures the actual client request sending rate using time-bucketed sampling with exponential smoothing. It tracks requests in half-second intervals by default and calculates a smoothed average rate to provide accurate measurements for adaptive rate limiting algorithms. @@ -484,7 +486,7 @@ def __init__( smoothing: float = _DEFAULT_SMOOTHING, time_bucket_range: float = _TIME_BUCKET_RANGE, ): - """Initialize a new RequestRateTracker. + """Initialize a new AsyncRequestRateTracker. :param smoothing: Exponential smoothing factor. This constant represents how much weight is given to recent measurements. @@ -537,10 +539,10 @@ def measured_client_rate(self) -> float: return self._measured_rate -class ClientRateLimiter: - """ClientRateLimiter limits the rate of requests. +class AsyncClientRateLimiter: + """AsyncClientRateLimiter limits the rate of requests. - ClientRateLimiter implements adaptive rate limiting using token bucket and CUBIC + AsyncClientRateLimiter implements adaptive rate limiting using token bucket and CUBIC algorithm. It controls request sending rates by acquiring tokens before requests and dynamically adjusting rates based on service responses - reducing rates when throttled and increasing rates during successful periods to optimize throughput @@ -551,12 +553,12 @@ class ClientRateLimiter: def __init__( self, - token_bucket: TokenBucket, + token_bucket: AsyncTokenBucket, cubic_calculator: CubicCalculator, - rate_tracker: RequestRateTracker, + rate_tracker: AsyncRequestRateTracker, rate_limiter_enabled: bool, ): - """Initialize a new ClientRateLimiter. + """Initialize a new AsyncClientRateLimiter. :param token_bucket: Token bucket for controlling request sending rates. :param cubic_calculator: CUBIC algorithm calculator for rate adjustments. @@ -615,10 +617,10 @@ def rate_limit_enabled(self) -> bool: return self._rate_limiter_enabled -class AdaptiveRetryStrategy(StandardRetryStrategy): +class AsyncAdaptiveRetryStrategy(AsyncStandardRetryStrategy): """Adaptive retry strategy with client-side rate limiting using CUBIC algorithm. - Builds on top of StandardRetryStrategy by adding token bucket rate limiting and + Builds on top of AsyncStandardRetryStrategy by adding token bucket rate limiting and CUBIC congestion control. Rate limiting is enabled after the first throttling response and dynamically adjusts sending rates based on the response type. @@ -638,9 +640,9 @@ def __init__( | None = None, max_attempts: int = 3, retry_quota: StandardRetryQuota | None = None, - rate_limiter: ClientRateLimiter | None = None, + rate_limiter: AsyncClientRateLimiter | None = None, ): - """Initialize AdaptiveRetryStrategy. + """Initialize AsyncAdaptiveRetryStrategy. :param backoff_strategy: The backoff strategy used to compute the retry delay for non-throttling errors. Defaults to a 50ms-base @@ -667,12 +669,12 @@ def __init__( ) if rate_limiter is None: - token_bucket = TokenBucket() + token_bucket = AsyncTokenBucket() cubic_calculator = CubicCalculator( starting_max_rate=self.STARTING_MAX_RATE, start_time=time.monotonic() ) - rate_tracker = RequestRateTracker() - self._rate_limiter = ClientRateLimiter( + rate_tracker = AsyncRequestRateTracker() + self._rate_limiter = AsyncClientRateLimiter( token_bucket=token_bucket, cubic_calculator=cubic_calculator, rate_tracker=rate_tracker, @@ -682,7 +684,7 @@ def __init__( self._rate_limiter = rate_limiter @property - def rate_limiter(self) -> ClientRateLimiter: + def rate_limiter(self) -> AsyncClientRateLimiter: """Get the rate limiter for integration with request pipeline.""" return self._rate_limiter @@ -696,5 +698,5 @@ async def acquire_from_token_bucket(self) -> None: if self._rate_limiter.rate_limit_enabled: await self._rate_limiter.before_sending_request() - def __deepcopy__(self, memo: Any) -> "AdaptiveRetryStrategy": + def __deepcopy__(self, memo: Any) -> "AsyncAdaptiveRetryStrategy": return self diff --git a/packages/smithy-core/src/smithy_core/interfaces/__init__.py b/packages/smithy-core/src/smithy_core/interfaces/__init__.py index 467d00a1a..7846cf7ae 100644 --- a/packages/smithy-core/src/smithy_core/interfaces/__init__.py +++ b/packages/smithy-core/src/smithy_core/interfaces/__init__.py @@ -1,6 +1,7 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -from collections.abc import ItemsView, Iterator, KeysView, ValuesView +from collections.abc import Callable, ItemsView, Iterator, KeysView, ValuesView +from dataclasses import dataclass from inspect import iscoroutinefunction from typing import TYPE_CHECKING, Any, Protocol, TypeGuard, overload, runtime_checkable @@ -20,6 +21,9 @@ if TYPE_CHECKING: from typing_extensions import TypeForm + from .._schema_compact import StaticSchema + from ..schemas import Schema + class URI(Protocol): """Universal Resource Identifier, target location for a :py:class:`Request`.""" @@ -236,3 +240,79 @@ def items(self) -> ItemsView[str, Any]: ... def keys(self) -> KeysView[str]: ... def values(self) -> ValuesView[Any]: ... def __contains__(self, key: object) -> bool: ... + + +@dataclass(kw_only=True, frozen=True) +class ProtocolSettings: + """Service-level metadata for constructing a protocol. + + Lets a consumer select a protocol by class alone (e.g. + ``protocol=AwsQueryClientProtocol``) without importing a private schema module. + """ + + namespace: str + """The service's Smithy namespace, e.g. ``com.amazonaws.sqs``.""" + + service_target: str + """The service shape name, used as the ``X-Amz-Target`` prefix by RPC protocols.""" + + version: str | None = None + """The service API version. Required by awsQuery; unused by other protocols.""" + + xml_namespace: str | None = None + """The URI of the service's ``@xmlNamespace``, applied by restXml to request + payloads that don't declare their own namespace.""" + + service_schema: "StaticSchema | Schema" + """The service shape's schema. + + Carries the service's traits, including the protocol trait whose ``eventStreamHttp`` + the RPC protocols read to negotiate HTTP/2 for event streams. The protocol reads its + own trait off this schema, so the value is inherently per-protocol rather than a + single flattened field. Codegen passes the compact schema form; it is hydrated on + first read. + """ + + +type ProtocolConstructor[T] = Callable[[ProtocolSettings], T] +"""A callable that builds a protocol instance from ``ProtocolSettings``. + +A protocol class satisfies this, since calling the class constructs an instance. +""" + + +class EndpointResolver(Protocol): + """Resolves an operation's endpoint given parameters. + + Placeholder for the synchronous endpoint resolver; populated alongside the sync + client implementation. + """ + + # TODO(sync-api): implement alongside the sync client + + +class ClientTransport(Protocol): + """Protocol-agnostic representation of a synchronous client transport. + + Placeholder; populated alongside the sync client implementation. + """ + + # TODO(sync-api): implement alongside the sync client + + +class DuplexClientTransport(Protocol): + """A synchronous client transport that supports duplex event streaming. + + Placeholder; populated alongside the sync client implementation. + """ + + # TODO(sync-api): implement alongside the sync client + + +class ClientProtocol(Protocol): + """A protocol used by a synchronous client to communicate with a server. + + Placeholder; populated alongside the sync client implementation. + """ + + # TODO(sync-api): implement alongside the sync client diff --git a/packages/smithy-core/src/smithy_core/interfaces/auth.py b/packages/smithy-core/src/smithy_core/interfaces/auth.py index 1f11d99e9..fe1c17720 100644 --- a/packages/smithy-core/src/smithy_core/interfaces/auth.py +++ b/packages/smithy-core/src/smithy_core/interfaces/auth.py @@ -38,3 +38,33 @@ def resolve_auth_scheme( authentication schemes to potentially use. """ ... + + +class Signer(Protocol): + """A class that signs requests before they are sent. + + Placeholder for the synchronous signer; populated alongside the sync client + implementation. + """ + + # TODO(sync-api): implement alongside the sync client + + +class EventSigner(Protocol): + """A class that signs event stream events before they are sent. + + Placeholder for the synchronous event signer; populated alongside the sync client + implementation. + """ + + # TODO(sync-api): implement alongside the sync client + + +class AuthScheme(Protocol): + """A class that coordinates identity and auth. + + Placeholder for the synchronous auth scheme; populated alongside the sync client + implementation. + """ + + # TODO(sync-api): implement alongside the sync client diff --git a/packages/smithy-core/src/smithy_core/interfaces/eventstream.py b/packages/smithy-core/src/smithy_core/interfaces/eventstream.py new file mode 100644 index 000000000..039628577 --- /dev/null +++ b/packages/smithy-core/src/smithy_core/interfaces/eventstream.py @@ -0,0 +1,23 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +from typing import Protocol + + +class EventPublisher(Protocol): + """Sends events to a service. + + Placeholder for the synchronous event publisher; populated alongside the sync + client implementation. + """ + + # TODO(sync-api): implement alongside the sync client + + +class EventReceiver(Protocol): + """Receives events from a service. + + Placeholder for the synchronous event receiver; populated alongside the sync + client implementation. + """ + + # TODO(sync-api): implement alongside the sync client diff --git a/packages/smithy-core/src/smithy_core/interfaces/identity.py b/packages/smithy-core/src/smithy_core/interfaces/identity.py index d40219b70..202ca675e 100644 --- a/packages/smithy-core/src/smithy_core/interfaces/identity.py +++ b/packages/smithy-core/src/smithy_core/interfaces/identity.py @@ -1,11 +1,12 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 +from collections.abc import Mapping from datetime import UTC, datetime -from typing import Protocol, runtime_checkable +from typing import Any, Protocol, runtime_checkable from ..utils import ensure_utc -__all__ = ["Identity"] +__all__ = ["Identity", "IdentityResolver"] @runtime_checkable @@ -28,3 +29,22 @@ def is_expired(self) -> bool: if self.expiration is None: return False return datetime.now(tz=UTC) >= self.expiration + + +class IdentityResolver[I: Identity, IP: Mapping[str, Any]](Protocol): + """Loads a user's :py:class:`Identity` from a given source. + + Placeholder for the synchronous identity resolver; populated alongside the sync + client implementation. + """ + + def get_identity(self, *, properties: IP) -> I: + # TODO(sync-api): implement alongside the sync client + ... + + def invalidate(self) -> None: + """Discard any cached identity so the next resolution re-reads its source. + + Defaults to a no-op for non-refreshable resolvers. + """ + return None diff --git a/packages/smithy-core/src/smithy_core/interfaces/retries.py b/packages/smithy-core/src/smithy_core/interfaces/retries.py index 83c04f34c..1a93ddb01 100644 --- a/packages/smithy-core/src/smithy_core/interfaces/retries.py +++ b/packages/smithy-core/src/smithy_core/interfaces/retries.py @@ -34,6 +34,17 @@ class ErrorRetryInfo(Protocol): """Whether the error is a timeout error.""" +@runtime_checkable +class RetryStrategy(Protocol): + """Issuer of :py:class:`RetryToken`s. + + Placeholder for the synchronous retry-strategy interface; populated alongside the + sync retry implementations. + """ + + # TODO(sync-api): implement alongside the sync client + + class RetryBackoffStrategy(Protocol): """Stateless strategy for computing retry delays based on retry attempt account.""" @@ -49,7 +60,7 @@ def compute_next_backoff_delay(self, retry_attempt: int) -> float: @dataclass(kw_only=True) class RetryToken(Protocol): - """Token issued by a :py:class:`smithy_core.aio.interfaces.retries.RetryStrategy` for the next attempt.""" + """Token issued by a :py:class:`smithy_core.aio.interfaces.retries.AsyncRetryStrategy` for the next attempt.""" retry_count: int """Retry count is the total number of attempts minus the initial attempt.""" diff --git a/packages/smithy-core/src/smithy_core/retries.py b/packages/smithy-core/src/smithy_core/retries.py index 91643f0c2..ce58c5688 100644 --- a/packages/smithy-core/src/smithy_core/retries.py +++ b/packages/smithy-core/src/smithy_core/retries.py @@ -213,7 +213,7 @@ def attempt_count(self) -> int: class StandardRetryQuota: - """Retry quota used by :py:class:`StandardRetryStrategy`.""" + """Retry quota used by :py:class:`AsyncStandardRetryStrategy`.""" INITIAL_RETRY_TOKENS: int = 500 RETRY_COST: int = 14 diff --git a/packages/smithy-core/tests/functional/test_retries.py b/packages/smithy-core/tests/functional/test_retries.py index 04e7de6ff..b61df8363 100644 --- a/packages/smithy-core/tests/functional/test_retries.py +++ b/packages/smithy-core/tests/functional/test_retries.py @@ -8,9 +8,12 @@ from unittest.mock import AsyncMock, MagicMock, patch import pytest -from smithy_core.aio.client import RequestPipeline +from smithy_core.aio.client import AsyncRequestPipeline from smithy_core.aio.interfaces import retries as retries_interface -from smithy_core.aio.retries import AdaptiveRetryStrategy, StandardRetryStrategy +from smithy_core.aio.retries import ( + AsyncAdaptiveRetryStrategy, + AsyncStandardRetryStrategy, +) from smithy_core.exceptions import CallError, ClientTimeoutError, RetryError from smithy_core.interceptors import RequestContext from smithy_core.retries import ( @@ -23,7 +26,7 @@ # TODO: Refactor this to use a smithy-testing generated client async def retry_operation( - strategy: retries_interface.RetryStrategy, + strategy: retries_interface.AsyncRetryStrategy, responses: list[int | Exception], ) -> tuple[str, int]: token = await strategy.acquire_initial_retry_token() @@ -61,7 +64,7 @@ async def retry_operation( async def test_standard_retry_eventually_succeeds(): quota = StandardRetryQuota(initial_capacity=500) - strategy = StandardRetryStrategy(max_attempts=3, retry_quota=quota) + strategy = AsyncStandardRetryStrategy(max_attempts=3, retry_quota=quota) result, attempts = await retry_operation(strategy, [500, 500, 200]) @@ -72,7 +75,7 @@ async def test_standard_retry_eventually_succeeds(): async def test_standard_retry_fails_due_to_max_attempts(): quota = StandardRetryQuota(initial_capacity=500) - strategy = StandardRetryStrategy(max_attempts=3, retry_quota=quota) + strategy = AsyncStandardRetryStrategy(max_attempts=3, retry_quota=quota) with pytest.raises(CallError, match="502"): await retry_operation(strategy, [502, 502, 502]) @@ -82,7 +85,7 @@ async def test_standard_retry_fails_due_to_max_attempts(): async def test_retry_quota_exhausted_after_single_retry(): quota = StandardRetryQuota(initial_capacity=14) - strategy = StandardRetryStrategy(max_attempts=3, retry_quota=quota) + strategy = AsyncStandardRetryStrategy(max_attempts=3, retry_quota=quota) with pytest.raises(CallError, match="502"): await retry_operation(strategy, [500, 502]) @@ -92,7 +95,7 @@ async def test_retry_quota_exhausted_after_single_retry(): async def test_retry_quota_prevents_retries_when_quota_zero(): quota = StandardRetryQuota(initial_capacity=0) - strategy = StandardRetryStrategy(max_attempts=3, retry_quota=quota) + strategy = AsyncStandardRetryStrategy(max_attempts=3, retry_quota=quota) with pytest.raises(CallError, match="500"): await retry_operation(strategy, [500]) @@ -102,7 +105,7 @@ async def test_retry_quota_prevents_retries_when_quota_zero(): async def test_retry_quota_stops_retries_when_exhausted(): quota = StandardRetryQuota(initial_capacity=20) - strategy = StandardRetryStrategy(max_attempts=5, retry_quota=quota) + strategy = AsyncStandardRetryStrategy(max_attempts=5, retry_quota=quota) with pytest.raises(CallError, match="502"): await retry_operation(strategy, [500, 502]) @@ -112,7 +115,7 @@ async def test_retry_quota_stops_retries_when_exhausted(): async def test_retry_quota_recovers_after_successful_responses(): quota = StandardRetryQuota(initial_capacity=30) - strategy = StandardRetryStrategy(max_attempts=5, retry_quota=quota) + strategy = AsyncStandardRetryStrategy(max_attempts=5, retry_quota=quota) # First operation: 2 retries then success await retry_operation(strategy, [500, 502, 200]) @@ -130,7 +133,7 @@ async def test_retry_quota_shared_across_concurrent_operations(): max_backoff=10, jitter_type=ExponentialBackoffJitterType.FULL, ) - strategy = StandardRetryStrategy( + strategy = AsyncStandardRetryStrategy( max_attempts=5, retry_quota=quota, backoff_strategy=backoff, @@ -148,7 +151,7 @@ async def test_retry_quota_shared_across_concurrent_operations(): async def test_retry_quota_handles_timeout_errors(): quota = StandardRetryQuota(initial_capacity=500) - strategy = StandardRetryStrategy(max_attempts=3, retry_quota=quota) + strategy = AsyncStandardRetryStrategy(max_attempts=3, retry_quota=quota) timeout1 = ClientTimeoutError() timeout2 = ClientTimeoutError() @@ -203,7 +206,7 @@ def clock(self): ): yield clock - def _call(self, strategy: AdaptiveRetryStrategy) -> Any: + def _call(self, strategy: AsyncAdaptiveRetryStrategy) -> Any: call = MagicMock() call.retryable.return_value = True call.retry_strategy = strategy @@ -262,12 +265,12 @@ async def test_adaptive_retry_sequence( jitter_type=ExponentialBackoffJitterType.FULL, random=lambda: 0.5, ) - strategy = AdaptiveRetryStrategy( + strategy = AsyncAdaptiveRetryStrategy( max_attempts=3, backoff_strategy=backoff, throttling_backoff_strategy=backoff, ) - pipeline: RequestPipeline[Any, Any] = RequestPipeline( + pipeline: AsyncRequestPipeline[Any, Any] = AsyncRequestPipeline( protocol=MagicMock(), transport=MagicMock() ) responses = iter(statuses) @@ -319,8 +322,8 @@ async def test_adaptive_retry_send_rate_converges_to_server_limit( duration = 120.0 # No retries, so backoff can't slow the client; only rate limiting can - strategy = AdaptiveRetryStrategy(max_attempts=1) - pipeline: RequestPipeline[Any, Any] = RequestPipeline( + strategy = AsyncAdaptiveRetryStrategy(max_attempts=1) + pipeline: AsyncRequestPipeline[Any, Any] = AsyncRequestPipeline( protocol=MagicMock(), transport=MagicMock() ) server_tokens = server_rps @@ -365,8 +368,8 @@ async def handle_attempt(*args: Any) -> SimpleNamespace: assert success_rate > 8 async def test_input_stream_raises_when_send_token_acquisition_fails(self): - strategy = AdaptiveRetryStrategy() - pipeline: RequestPipeline[Any, Any] = RequestPipeline( + strategy = AsyncAdaptiveRetryStrategy() + pipeline: AsyncRequestPipeline[Any, Any] = AsyncRequestPipeline( protocol=MagicMock(), transport=MagicMock() ) call = self._call(strategy) @@ -382,9 +385,11 @@ async def test_input_stream_raises_when_send_token_acquisition_fails(self): await wait_for(pipeline.input_stream(call, Any), timeout=1) def _pipeline_with_429_attempts( - self, strategy: AdaptiveRetryStrategy, acquire_results: list[Exception | None] - ) -> tuple[RequestPipeline[Any, Any], AsyncMock, Any]: - pipeline: RequestPipeline[Any, Any] = RequestPipeline( + self, + strategy: AsyncAdaptiveRetryStrategy, + acquire_results: list[Exception | None], + ) -> tuple[AsyncRequestPipeline[Any, Any], AsyncMock, Any]: + pipeline: AsyncRequestPipeline[Any, Any] = AsyncRequestPipeline( protocol=MagicMock(), transport=MagicMock() ) attempt = AsyncMock( @@ -405,7 +410,7 @@ def _pipeline_with_429_attempts( async def test_send_token_timeout_on_first_attempt_raises(self): quota = StandardRetryQuota(initial_capacity=500) - strategy = AdaptiveRetryStrategy(max_attempts=3, retry_quota=quota) + strategy = AsyncAdaptiveRetryStrategy(max_attempts=3, retry_quota=quota) pipeline, attempt, (p1, p2, p3) = self._pipeline_with_429_attempts( strategy, [TimeoutError("Failed to acquire")] ) diff --git a/packages/smithy-core/tests/unit/aio/_pipeline_harness.py b/packages/smithy-core/tests/unit/aio/_pipeline_harness.py index 30d6c8ed0..f38f4bdc9 100644 --- a/packages/smithy-core/tests/unit/aio/_pipeline_harness.py +++ b/packages/smithy-core/tests/unit/aio/_pipeline_harness.py @@ -4,10 +4,10 @@ from typing import Any, Self, cast from smithy_core import URI -from smithy_core.aio.client import ClientCall, RequestPipeline -from smithy_core.aio.interfaces import ClientProtocol -from smithy_core.aio.interfaces.retries import RetryStrategy -from smithy_core.aio.retries import SimpleRetryStrategy +from smithy_core.aio.client import AsyncClientCall, AsyncRequestPipeline +from smithy_core.aio.interfaces import AsyncClientProtocol +from smithy_core.aio.interfaces.retries import AsyncRetryStrategy +from smithy_core.aio.retries import AsyncSimpleRetryStrategy from smithy_core.deserializers import ShapeDeserializer from smithy_core.endpoints import EndpointResolverParams from smithy_core.interceptors import InterceptorChain @@ -125,7 +125,7 @@ def build(self, name: str) -> type: effective_auth_schemes=[], ) -# ``ClientCall.retryable()`` is False for operations with an input event stream, so +# ``AsyncClientCall.retryable()`` is False for operations with an input event stream, so # OPERATION above never enters the retry loop. This one has no input stream and so # exercises it. UNARY_OPERATION: APIOperation[StubInput, StubOutput] = APIOperation( @@ -275,27 +275,27 @@ class DuplexTransport(UndeclaredTransport): class PipelineHarness: protocol: StubProtocol transport: UndeclaredTransport - pipeline: RequestPipeline[Any, Any] + pipeline: AsyncRequestPipeline[Any, Any] def pipeline_harness(transport: UndeclaredTransport) -> PipelineHarness: protocol = StubProtocol() - pipeline = RequestPipeline( - protocol=cast("ClientProtocol[Any, Any]", protocol), + pipeline = AsyncRequestPipeline( + protocol=cast("AsyncClientProtocol[Any, Any]", protocol), transport=transport, ) return PipelineHarness(protocol=protocol, transport=transport, pipeline=pipeline) def retryable_client_call( - retry_strategy: RetryStrategy | None = None, -) -> ClientCall[Any, Any]: + retry_strategy: AsyncRetryStrategy | None = None, +) -> AsyncClientCall[Any, Any]: """A call that goes through the retry loop, unlike :py:func:`client_call`. Defaults to a strategy that allows a single attempt, so the loop gives up after the first failure rather than sleeping through retries. """ - return ClientCall( + return AsyncClientCall( input=StubInput(), operation=UNARY_OPERATION, context=TypedProperties(), @@ -303,12 +303,12 @@ def retryable_client_call( auth_scheme_resolver=StubAuthResolver(), supported_auth_schemes={}, endpoint_resolver=StubEndpointResolver(), - retry_strategy=retry_strategy or SimpleRetryStrategy(max_attempts=1), + retry_strategy=retry_strategy or AsyncSimpleRetryStrategy(max_attempts=1), ) -def client_call() -> ClientCall[Any, Any]: - return ClientCall( +def client_call() -> AsyncClientCall[Any, Any]: + return AsyncClientCall( input=StubInput(), operation=OPERATION, context=TypedProperties(), diff --git a/packages/smithy-core/tests/unit/aio/test_client.py b/packages/smithy-core/tests/unit/aio/test_client.py index 215d7ff14..42d99bdfc 100644 --- a/packages/smithy-core/tests/unit/aio/test_client.py +++ b/packages/smithy-core/tests/unit/aio/test_client.py @@ -9,9 +9,9 @@ import pytest from smithy_core.aio.client import AsyncClient -from smithy_core.aio.eventstream import DuplexEventStream, InputEventStream -from smithy_core.aio.interfaces import ClientTransport -from smithy_core.aio.retries import AdaptiveRetryStrategy, SimpleRetryStrategy +from smithy_core.aio.eventstream import AsyncDuplexEventStream, AsyncInputEventStream +from smithy_core.aio.interfaces import AsyncClientTransport +from smithy_core.aio.retries import AsyncAdaptiveRetryStrategy, AsyncSimpleRetryStrategy from smithy_core.aio.types import AsyncBytesReader from smithy_core.auth import AuthOption from smithy_core.exceptions import CallError, SmithyError, UnsupportedTransportError @@ -77,7 +77,7 @@ async def test_duplex_stream_proceeds_for_duplex_transport() -> None: client_call(), StubEvent, StubEvent, StubEvent.deserialize ) - assert isinstance(stream, DuplexEventStream) + assert isinstance(stream, AsyncDuplexEventStream) output, output_stream = await stream.await_output() assert isinstance(output, StubOutput) assert isinstance(output_stream, StubEventReceiver) @@ -88,7 +88,7 @@ async def test_input_stream_does_not_require_duplex_support() -> None: stream = await harness.pipeline.input_stream(client_call(), StubEvent) - assert isinstance(stream, InputEventStream) + assert isinstance(stream, AsyncInputEventStream) assert isinstance(await stream.await_output(), StubOutput) @@ -129,7 +129,7 @@ async def throttle(**kwargs: Any) -> StubOutput: raise CallError("Rate exceeded", is_retry_safe=True, is_throttling_error=True) harness.protocol.deserialize_response = throttle # type: ignore[method-assign] - strategy = AdaptiveRetryStrategy(max_attempts=3) + strategy = AsyncAdaptiveRetryStrategy(max_attempts=3) timeout = TimeoutError("Failed to acquire 1.0 tokens within 30.0s") with ( @@ -283,7 +283,7 @@ def __init__(self, *, setup: bool = True) -> None: super().__init__() self.transport = _CountingTransport() if setup: - self._transport = cast(ClientTransport[Any, Any], self.transport) + self._transport = cast(AsyncClientTransport[Any, Any], self.transport) self._setup_done = True @property @@ -359,7 +359,7 @@ async def fail_first_attempt(**kwargs: Any) -> StubOutput: return replace( client_call(), operation=operation, - retry_strategy=SimpleRetryStrategy( + retry_strategy=AsyncSimpleRetryStrategy( backoff_strategy=ExponentialRetryBackoffStrategy(backoff_scale_value=0), max_attempts=2, ), diff --git a/packages/smithy-core/tests/unit/aio/test_endpoints.py b/packages/smithy-core/tests/unit/aio/test_endpoints.py index a1e80c4be..89889fb4d 100644 --- a/packages/smithy-core/tests/unit/aio/test_endpoints.py +++ b/packages/smithy-core/tests/unit/aio/test_endpoints.py @@ -5,7 +5,7 @@ from unittest.mock import Mock from smithy_core import URI -from smithy_core.aio.endpoints import StaticEndpointResolver +from smithy_core.aio.endpoints import AsyncStaticEndpointResolver from smithy_core.endpoints import STATIC_ENDPOINT_CONFIG, EndpointResolverParams from smithy_core.types import TypedProperties @@ -34,7 +34,7 @@ async def test_endpoint_provider_with_uri_string() -> None: query="foo=bar&foo=baz", port=8080, ) - resolver = StaticEndpointResolver() + resolver = AsyncStaticEndpointResolver() result = await resolver.resolve_endpoint(params=params) assert result.uri == expected @@ -48,6 +48,6 @@ async def test_endpoint_provider_with_uri_object() -> None: port=8080, ) params = EndpointConfig.params(expected) - resolver = StaticEndpointResolver() + resolver = AsyncStaticEndpointResolver() result = await resolver.resolve_endpoint(params=params) assert result.uri == expected diff --git a/packages/smithy-core/tests/unit/aio/test_retries.py b/packages/smithy-core/tests/unit/aio/test_retries.py index c3425ff62..70395229d 100644 --- a/packages/smithy-core/tests/unit/aio/test_retries.py +++ b/packages/smithy-core/tests/unit/aio/test_retries.py @@ -5,10 +5,10 @@ import pytest from smithy_core.aio.retries import ( - AdaptiveRetryStrategy, - RetryStrategyResolver, - SimpleRetryStrategy, - StandardRetryStrategy, + AsyncAdaptiveRetryStrategy, + AsyncRetryStrategyResolver, + AsyncSimpleRetryStrategy, + AsyncStandardRetryStrategy, ) from smithy_core.exceptions import CallError, RetryError from smithy_core.retries import ( @@ -23,7 +23,7 @@ @pytest.mark.parametrize("max_attempts", [2, 3, 10]) async def test_simple_retry_strategy(max_attempts: int) -> None: - strategy = SimpleRetryStrategy( + strategy = AsyncSimpleRetryStrategy( backoff_strategy=ExponentialRetryBackoffStrategy(backoff_scale_value=5), max_attempts=max_attempts, ) @@ -38,7 +38,7 @@ async def test_simple_retry_strategy(max_attempts: int) -> None: async def test_simple_retry_does_not_retry_unclassified() -> None: - strategy = SimpleRetryStrategy( + strategy = AsyncSimpleRetryStrategy( backoff_strategy=ExponentialRetryBackoffStrategy(backoff_scale_value=5), max_attempts=2, ) @@ -50,7 +50,7 @@ async def test_simple_retry_does_not_retry_unclassified() -> None: async def test_simple_retry_does_not_retry_when_safety_unknown() -> None: - strategy = SimpleRetryStrategy( + strategy = AsyncSimpleRetryStrategy( backoff_strategy=ExponentialRetryBackoffStrategy(backoff_scale_value=5), max_attempts=2, ) @@ -61,7 +61,7 @@ async def test_simple_retry_does_not_retry_when_safety_unknown() -> None: async def test_simple_retry_does_not_retry_unsafe() -> None: - strategy = SimpleRetryStrategy( + strategy = AsyncSimpleRetryStrategy( backoff_strategy=ExponentialRetryBackoffStrategy(backoff_scale_value=5), max_attempts=2, ) @@ -73,7 +73,7 @@ async def test_simple_retry_does_not_retry_unsafe() -> None: @pytest.mark.parametrize("max_attempts", [2, 3, 10]) async def test_standard_retry_strategy(max_attempts: int) -> None: - strategy = StandardRetryStrategy(max_attempts=max_attempts) + strategy = AsyncStandardRetryStrategy(max_attempts=max_attempts) error = CallError(is_retry_safe=True) token = await strategy.acquire_initial_retry_token() for _ in range(max_attempts - 1): @@ -98,14 +98,14 @@ async def test_standard_retry_strategy(max_attempts: int) -> None: ], ) async def test_standard_retry_does_not_retry(error: Exception | CallError) -> None: - strategy = StandardRetryStrategy() + strategy = AsyncStandardRetryStrategy() token = await strategy.acquire_initial_retry_token() with pytest.raises(RetryError): await strategy.refresh_retry_token_for_retry(token_to_renew=token, error=error) async def test_standard_retry_after_within_bounds_is_honored() -> None: - strategy = StandardRetryStrategy( + strategy = AsyncStandardRetryStrategy( backoff_strategy=ExponentialRetryBackoffStrategy( backoff_scale_value=1, jitter_type=EBJT.NONE ) @@ -119,7 +119,7 @@ async def test_standard_retry_after_within_bounds_is_honored() -> None: async def test_standard_retry_after_floored_to_backoff() -> None: - strategy = StandardRetryStrategy( + strategy = AsyncStandardRetryStrategy( backoff_strategy=ExponentialRetryBackoffStrategy( backoff_scale_value=1, jitter_type=EBJT.NONE ) @@ -133,7 +133,7 @@ async def test_standard_retry_after_floored_to_backoff() -> None: async def test_standard_retry_after_capped_at_backoff_plus_max() -> None: - strategy = StandardRetryStrategy( + strategy = AsyncStandardRetryStrategy( backoff_strategy=ExponentialRetryBackoffStrategy( backoff_scale_value=1, jitter_type=EBJT.NONE ) @@ -147,7 +147,7 @@ async def test_standard_retry_after_capped_at_backoff_plus_max() -> None: async def test_standard_non_throttling_uses_default_backoff_scale() -> None: - strategy = StandardRetryStrategy() + strategy = AsyncStandardRetryStrategy() error = CallError(is_retry_safe=True, is_throttling_error=False) token = await strategy.acquire_initial_retry_token() token = await strategy.refresh_retry_token_for_retry( @@ -158,7 +158,7 @@ async def test_standard_non_throttling_uses_default_backoff_scale() -> None: async def test_standard_throttling_uses_throttling_backoff_scale() -> None: - strategy = StandardRetryStrategy() + strategy = AsyncStandardRetryStrategy() error = CallError(is_retry_safe=True, is_throttling_error=True) token = await strategy.acquire_initial_retry_token() token = await strategy.refresh_retry_token_for_retry( @@ -169,7 +169,7 @@ async def test_standard_throttling_uses_throttling_backoff_scale() -> None: async def test_standard_throttling_and_non_throttling_use_separate_strategies() -> None: - strategy = StandardRetryStrategy( + strategy = AsyncStandardRetryStrategy( backoff_strategy=ExponentialRetryBackoffStrategy( backoff_scale_value=0.05, jitter_type=EBJT.NONE, @@ -195,7 +195,7 @@ async def test_standard_throttling_and_non_throttling_use_separate_strategies() async def test_quota_exhausted_error_carries_backoff_delay() -> None: - strategy = StandardRetryStrategy( + strategy = AsyncStandardRetryStrategy( backoff_strategy=ExponentialRetryBackoffStrategy( backoff_scale_value=0.05, jitter_type=EBJT.NONE ), @@ -210,7 +210,7 @@ async def test_quota_exhausted_error_carries_backoff_delay() -> None: async def test_quota_exhausted_error_carries_throttling_backoff_delay() -> None: - strategy = StandardRetryStrategy( + strategy = AsyncStandardRetryStrategy( throttling_backoff_strategy=ExponentialRetryBackoffStrategy( backoff_scale_value=1, jitter_type=EBJT.NONE ), @@ -225,7 +225,7 @@ async def test_quota_exhausted_error_carries_throttling_backoff_delay() -> None: async def test_max_attempts_error_has_no_retry_after() -> None: - strategy = StandardRetryStrategy( + strategy = AsyncStandardRetryStrategy( retry_quota=StandardRetryQuota(initial_capacity=0), max_attempts=1, ) @@ -237,7 +237,7 @@ async def test_max_attempts_error_has_no_retry_after() -> None: async def test_non_retryable_error_has_no_retry_after() -> None: - strategy = StandardRetryStrategy( + strategy = AsyncStandardRetryStrategy( retry_quota=StandardRetryQuota(initial_capacity=0), max_attempts=5, ) @@ -250,20 +250,20 @@ async def test_non_retryable_error_has_no_retry_after() -> None: async def test_standard_retry_invalid_max_attempts() -> None: with pytest.raises(ValueError): - StandardRetryStrategy(max_attempts=-1) + AsyncStandardRetryStrategy(max_attempts=-1) async def test_retry_strategy_resolver_none_returns_default() -> None: - resolver = RetryStrategyResolver() + resolver = AsyncRetryStrategyResolver() strategy = await resolver.resolve_retry_strategy(retry_strategy=None) - assert isinstance(strategy, StandardRetryStrategy) + assert isinstance(strategy, AsyncStandardRetryStrategy) assert strategy.max_attempts == 3 async def test_retry_strategy_resolver_creates_different_strategies() -> None: - resolver = RetryStrategyResolver() + resolver = AsyncRetryStrategyResolver() options1 = RetryStrategyOptions(max_attempts=3) options2 = RetryStrategyOptions(max_attempts=5) @@ -277,7 +277,7 @@ async def test_retry_strategy_resolver_creates_different_strategies() -> None: async def test_retry_strategy_resolver_caches_strategies() -> None: - resolver = RetryStrategyResolver() + resolver = AsyncRetryStrategyResolver() strategy1 = await resolver.resolve_retry_strategy(retry_strategy=None) strategy2 = await resolver.resolve_retry_strategy(retry_strategy=None) @@ -291,18 +291,20 @@ async def test_retry_strategy_resolver_caches_strategies() -> None: async def test_retry_strategy_resolver_cache_is_not_shared_across_resolvers() -> None: - resolver = RetryStrategyResolver() + resolver = AsyncRetryStrategyResolver() options = RetryStrategyOptions(retry_mode="adaptive") strategy = await resolver.resolve_retry_strategy(retry_strategy=options) for _ in range(200): - await RetryStrategyResolver().resolve_retry_strategy(retry_strategy=options) + await AsyncRetryStrategyResolver().resolve_retry_strategy( + retry_strategy=options + ) assert await resolver.resolve_retry_strategy(retry_strategy=options) is strategy async def test_retry_strategy_resolver_strategies_are_freed_with_resolver() -> None: - resolver = RetryStrategyResolver() + resolver = AsyncRetryStrategyResolver() strategy = await resolver.resolve_retry_strategy(retry_strategy=None) strategy_ref = weakref.ref(strategy) @@ -313,8 +315,8 @@ async def test_retry_strategy_resolver_strategies_are_freed_with_resolver() -> N async def test_retry_strategy_resolver_returns_existing_strategy() -> None: - resolver = RetryStrategyResolver() - provided_strategy = SimpleRetryStrategy(max_attempts=7) + resolver = AsyncRetryStrategyResolver() + provided_strategy = AsyncSimpleRetryStrategy(max_attempts=7) strategy = await resolver.resolve_retry_strategy(retry_strategy=provided_strategy) @@ -323,51 +325,51 @@ async def test_retry_strategy_resolver_returns_existing_strategy() -> None: async def test_retry_strategy_resolver_rejects_invalid_type() -> None: - resolver = RetryStrategyResolver() + resolver = AsyncRetryStrategyResolver() with pytest.raises( TypeError, - match="retry_strategy must be RetryStrategy, RetryStrategyOptions, or None", + match="retry_strategy must be AsyncRetryStrategy, RetryStrategyOptions, or None", ): await resolver.resolve_retry_strategy(retry_strategy="invalid") # type: ignore async def test_retry_strategy_resolver_uses_max_attempts_fallback() -> None: - resolver = RetryStrategyResolver() + resolver = AsyncRetryStrategyResolver() strategy = await resolver.resolve_retry_strategy( retry_strategy=None, max_attempts=9 ) - assert isinstance(strategy, StandardRetryStrategy) + assert isinstance(strategy, AsyncStandardRetryStrategy) assert strategy.max_attempts == 9 async def test_retry_strategy_resolver_uses_retry_mode_fallback() -> None: - resolver = RetryStrategyResolver() + resolver = AsyncRetryStrategyResolver() strategy = await resolver.resolve_retry_strategy( retry_strategy=None, retry_mode="simple", max_attempts=4 ) - assert isinstance(strategy, SimpleRetryStrategy) + assert isinstance(strategy, AsyncSimpleRetryStrategy) assert strategy.max_attempts == 4 async def test_retry_strategy_resolver_uses_adaptive_retry_mode_fallback() -> None: - resolver = RetryStrategyResolver() + resolver = AsyncRetryStrategyResolver() strategy = await resolver.resolve_retry_strategy( retry_strategy=None, retry_mode="adaptive", max_attempts=4 ) - assert isinstance(strategy, AdaptiveRetryStrategy) + assert isinstance(strategy, AsyncAdaptiveRetryStrategy) assert strategy.max_attempts == 4 async def test_retry_strategy_resolver_fallback_defaults_when_unset() -> None: """Omitting both fallbacks must match the prior no-argument behavior.""" - resolver = RetryStrategyResolver() + resolver = AsyncRetryStrategyResolver() explicit = await resolver.resolve_retry_strategy( retry_strategy=None, retry_mode=None, max_attempts=None @@ -375,12 +377,12 @@ async def test_retry_strategy_resolver_fallback_defaults_when_unset() -> None: baseline = await resolver.resolve_retry_strategy(retry_strategy=None) assert explicit is baseline - assert isinstance(explicit, StandardRetryStrategy) + assert isinstance(explicit, AsyncStandardRetryStrategy) assert explicit.max_attempts == 3 async def test_explicit_retry_strategy_options_beat_fallbacks() -> None: - resolver = RetryStrategyResolver() + resolver = AsyncRetryStrategyResolver() retry_strategy = RetryStrategyOptions(max_attempts=2) strategy = await resolver.resolve_retry_strategy( @@ -391,8 +393,8 @@ async def test_explicit_retry_strategy_options_beat_fallbacks() -> None: async def test_explicit_retry_strategy_instance_beats_fallbacks() -> None: - resolver = RetryStrategyResolver() - provided = SimpleRetryStrategy(max_attempts=7) + resolver = AsyncRetryStrategyResolver() + provided = AsyncSimpleRetryStrategy(max_attempts=7) strategy = await resolver.resolve_retry_strategy( retry_strategy=provided, retry_mode="standard", max_attempts=9 @@ -403,11 +405,11 @@ async def test_explicit_retry_strategy_instance_beats_fallbacks() -> None: async def test_resolver_no_service_defaults_uses_strategy_defaults() -> None: - resolver = RetryStrategyResolver() + resolver = AsyncRetryStrategyResolver() strategy = await resolver.resolve_retry_strategy(retry_strategy=None) - assert isinstance(strategy, StandardRetryStrategy) + assert isinstance(strategy, AsyncStandardRetryStrategy) assert strategy.max_attempts == 3 delay = strategy.backoff_strategy.compute_next_backoff_delay(1) assert 0 <= delay <= 0.05 diff --git a/packages/smithy-core/tests/unit/test_retries.py b/packages/smithy-core/tests/unit/test_retries.py index d81c8d687..b51984a98 100644 --- a/packages/smithy-core/tests/unit/test_retries.py +++ b/packages/smithy-core/tests/unit/test_retries.py @@ -11,13 +11,13 @@ from unittest.mock import AsyncMock, MagicMock, patch import pytest -from smithy_core.aio.client import RequestPipeline +from smithy_core.aio.client import AsyncRequestPipeline from smithy_core.aio.retries import ( - AdaptiveRetryStrategy, - ClientRateLimiter, - RequestRateTracker, - RetryStrategyResolver, - TokenBucket, + AsyncAdaptiveRetryStrategy, + AsyncClientRateLimiter, + AsyncRequestRateTracker, + AsyncRetryStrategyResolver, + AsyncTokenBucket, ) from smithy_core.exceptions import CallError, RetryError from smithy_core.retries import ( @@ -151,14 +151,14 @@ def test_retry_quota_acquire_throttling_error( class TestTokenBucket: @pytest.mark.asyncio async def test_initial_state(self): - token_bucket = TokenBucket() + token_bucket = AsyncTokenBucket() assert token_bucket.current_capacity == 0 assert token_bucket.max_capacity == token_bucket.MIN_CAPACITY assert token_bucket.fill_rate == token_bucket.MIN_FILL_RATE @pytest.mark.asyncio async def test_acquire_succeeds_immediately_within_capacity(self): - token_bucket = TokenBucket(curr_capacity=1) + token_bucket = AsyncTokenBucket(curr_capacity=1) with patch("smithy_core.aio.retries.asyncio.wait_for") as mock_wait_for: await token_bucket.acquire(1) @@ -168,7 +168,7 @@ async def test_acquire_succeeds_immediately_within_capacity(self): @pytest.mark.asyncio async def test_acquire_waits_when_capacity_insufficient(self): - token_bucket = TokenBucket(fill_rate=100.0) + token_bucket = AsyncTokenBucket(fill_rate=100.0) await token_bucket.acquire(1) with patch( @@ -181,7 +181,7 @@ async def test_acquire_waits_when_capacity_insufficient(self): @pytest.mark.asyncio async def test_update_bucket_updates_rate(self): - token_bucket = TokenBucket(curr_capacity=1) + token_bucket = AsyncTokenBucket(curr_capacity=1) await token_bucket.update_rate(5.0) assert token_bucket.fill_rate == 5.0 @@ -190,17 +190,17 @@ async def test_update_bucket_updates_rate(self): @pytest.mark.asyncio async def test_rate_can_never_be_zero(self): - token_bucket = TokenBucket() + token_bucket = AsyncTokenBucket() await token_bucket.update_rate(0.0) - assert token_bucket.fill_rate == TokenBucket.MIN_FILL_RATE - assert token_bucket.max_capacity == TokenBucket.MIN_CAPACITY + assert token_bucket.fill_rate == AsyncTokenBucket.MIN_FILL_RATE + assert token_bucket.max_capacity == AsyncTokenBucket.MIN_CAPACITY @pytest.mark.asyncio async def test_refill_caps_at_max_capacity(self): # 100s at 4 tokens/s would refill 400 tokens, far more than the capacity of 4 with patch("time.monotonic", side_effect=[0.0, 0.0, 100.0]): - token_bucket = TokenBucket() + token_bucket = AsyncTokenBucket() await token_bucket.update_rate(4.0) with token_bucket._lock: # type: ignore token_bucket._refill() # type: ignore @@ -223,7 +223,7 @@ async def test_multiple_refills_over_time( time_values = [0.0, 1.0, 1.0, 1.5, 1.5, 4.0, 4.0, 5.0] with patch("time.monotonic", side_effect=time_values): - token_bucket = TokenBucket(curr_capacity=0, fill_rate=2.0) + token_bucket = AsyncTokenBucket(curr_capacity=0, fill_rate=2.0) for action, value in actions: if action == "acquire": @@ -234,7 +234,7 @@ async def test_multiple_refills_over_time( assert token_bucket.current_capacity == expected_capacity async def test_update_rate_wakes_waiting_acquirers(self): - token_bucket = TokenBucket(fill_rate=0.01) + token_bucket = AsyncTokenBucket(fill_rate=0.01) acquired = False @@ -257,7 +257,7 @@ async def slow_acquire(): async def test_acquire_does_not_wait_past_timeout(self): # The bucket starts empty, and at the minimum fill rate a token takes 2s to # refill, far past the timeout - token_bucket = TokenBucket(timeout=0.05) + token_bucket = AsyncTokenBucket(timeout=0.05) start = time.monotonic() with pytest.raises(TimeoutError): @@ -266,7 +266,7 @@ async def test_acquire_does_not_wait_past_timeout(self): def test_acquire_works_across_event_loops(self): # A client, and so its bucket, can outlive the event loop it was first used on - token_bucket = TokenBucket(fill_rate=20.0) + token_bucket = AsyncTokenBucket(fill_rate=20.0) async def contended_acquires(): # The bucket starts empty, so both acquires have to wait @@ -313,7 +313,7 @@ def run() -> None: return errors def test_rate_tracker(self, frequent_thread_switches: None): - tracker = RequestRateTracker() + tracker = AsyncRequestRateTracker() async def measure_many() -> None: for _ in range(3000): @@ -324,7 +324,7 @@ async def measure_many() -> None: def test_token_bucket_rate_updates_and_acquires( self, frequent_thread_switches: None ): - bucket = TokenBucket(fill_rate=100000.0) + bucket = AsyncTokenBucket(fill_rate=100000.0) async def update_and_acquire() -> None: await bucket.update_rate(100000.0) @@ -339,7 +339,7 @@ def test_token_bucket_hands_out_each_token_once( ): acquires_per_thread = 500 # Exactly enough tokens for every acquire, so no thread has to wait - bucket = TokenBucket(curr_capacity=self._THREADS * acquires_per_thread) + bucket = AsyncTokenBucket(curr_capacity=self._THREADS * acquires_per_thread) async def spend() -> None: for _ in range(acquires_per_thread): @@ -365,11 +365,11 @@ async def test_token_consumption_before_request_scenarios( current_bucket_capacity: float, expected_bucket_capacity_after_acquire: float, ): - token_bucket = TokenBucket(curr_capacity=current_bucket_capacity) + token_bucket = AsyncTokenBucket(curr_capacity=current_bucket_capacity) calculator = CubicCalculator(starting_max_rate=1.0, start_time=0.0) - tracker = RequestRateTracker() + tracker = AsyncRequestRateTracker() - limiter = ClientRateLimiter( + limiter = AsyncClientRateLimiter( token_bucket=token_bucket, cubic_calculator=calculator, rate_tracker=tracker, @@ -398,11 +398,11 @@ async def test_token_consumption_after_response_scenarios( ): with patch("time.monotonic") as mock_time: mock_time.side_effect = [0.0, 0.1, 0.2, 0.3] - token_bucket = TokenBucket() + token_bucket = AsyncTokenBucket() calculator = CubicCalculator(starting_max_rate=10.0, start_time=0.0) - tracker = RequestRateTracker() + tracker = AsyncRequestRateTracker() - limiter = ClientRateLimiter( + limiter = AsyncClientRateLimiter( token_bucket=token_bucket, cubic_calculator=calculator, rate_tracker=tracker, @@ -419,11 +419,11 @@ async def test_token_consumption_after_response_scenarios( async def test_throttling_response_enables_rate_limiter(self): with patch("time.monotonic") as mock_time: mock_time.side_effect = [0.0, 0.1, 0.2, 0.3, 0.4] - token_bucket = TokenBucket() + token_bucket = AsyncTokenBucket() calculator = CubicCalculator(starting_max_rate=10.0, start_time=0.0) - tracker = RequestRateTracker() + tracker = AsyncRequestRateTracker() - limiter = ClientRateLimiter( + limiter = AsyncClientRateLimiter( token_bucket=token_bucket, cubic_calculator=calculator, rate_tracker=tracker, @@ -436,10 +436,10 @@ async def test_throttling_response_enables_rate_limiter(self): async def test_raises_timeout_error_when_token_acquisition_takes_30_secs(self): with patch("time.monotonic") as mock_time: mock_time.side_effect = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 31] - token_bucket = TokenBucket(curr_capacity=1) + token_bucket = AsyncTokenBucket(curr_capacity=1) calculator = CubicCalculator() - tracker = RequestRateTracker() - limiter = ClientRateLimiter( + tracker = AsyncRequestRateTracker() + limiter = AsyncClientRateLimiter( token_bucket=token_bucket, cubic_calculator=calculator, rate_tracker=tracker, @@ -453,10 +453,10 @@ async def test_raises_timeout_error_when_token_acquisition_takes_30_secs(self): async def test_tokens_accumulation_after_numerous_successful_responses(self): with patch("time.monotonic") as mock_time: mock_time.side_effect = [i * 0.01 for i in range(5000)] - token_bucket = TokenBucket(curr_capacity=1) + token_bucket = AsyncTokenBucket(curr_capacity=1) calculator = CubicCalculator() - tracker = RequestRateTracker() - limiter = ClientRateLimiter( + tracker = AsyncRequestRateTracker() + limiter = AsyncClientRateLimiter( token_bucket=token_bucket, cubic_calculator=calculator, rate_tracker=tracker, @@ -497,9 +497,9 @@ async def test_sending_rate_sequence(self): with patch( "smithy_core.aio.retries.time", SimpleNamespace(monotonic=lambda: now) ): - token_bucket = TokenBucket() - tracker = RequestRateTracker() - limiter = ClientRateLimiter( + token_bucket = AsyncTokenBucket() + tracker = AsyncRequestRateTracker() + limiter = AsyncClientRateLimiter( token_bucket=token_bucket, cubic_calculator=CubicCalculator(start_time=0.0), rate_tracker=tracker, @@ -518,11 +518,11 @@ async def test_sending_rate_sequence(self): async def test_calculated_rate_is_capped_at_2x_measured_rate(self): with patch("time.monotonic") as mock_time: mock_time.side_effect = [0.0, 0.1, 0.2, 0.3, 0.4] - token_bucket = TokenBucket() + token_bucket = AsyncTokenBucket() calculator = CubicCalculator(starting_max_rate=10.0, start_time=0.0) - tracker = RequestRateTracker() + tracker = AsyncRequestRateTracker() - limiter = ClientRateLimiter( + limiter = AsyncClientRateLimiter( token_bucket=token_bucket, cubic_calculator=calculator, rate_tracker=tracker, @@ -543,11 +543,11 @@ async def test_calculated_rate_is_capped_at_2x_measured_rate(self): async def test_new_rate_is_set_while_holding_the_lock(self): # Two threads could otherwise calculate rates A then B but apply B then A - token_bucket = TokenBucket() - limiter = ClientRateLimiter( + token_bucket = AsyncTokenBucket() + limiter = AsyncClientRateLimiter( token_bucket=token_bucket, cubic_calculator=CubicCalculator(), - rate_tracker=RequestRateTracker(), + rate_tracker=AsyncRequestRateTracker(), rate_limiter_enabled=True, ) lock_held: list[bool] = [] @@ -628,7 +628,7 @@ class TestRequestRateTracker: async def test_measure_rate_same_bucket(self): with patch("time.monotonic") as mock_time: mock_time.side_effect = [0.0, 0.3, 0.4] - tracker = RequestRateTracker() + tracker = AsyncRequestRateTracker() rate1 = await tracker.measure_rate() rate2 = await tracker.measure_rate() @@ -639,7 +639,7 @@ async def test_measure_rate_same_bucket(self): async def test_measure_rate_new_bucket(self): with patch("time.monotonic") as mock_time: mock_time.side_effect = [0.0, 0.1, 0.7] - tracker = RequestRateTracker() + tracker = AsyncRequestRateTracker() await tracker.measure_rate() rate = await tracker.measure_rate() @@ -650,27 +650,27 @@ async def test_measure_rate_new_bucket(self): class TestAdaptiveRetryStrategy: - """Tests for AdaptiveRetryStrategy with rate limiting.""" + """Tests for AsyncAdaptiveRetryStrategy with rate limiting.""" def test_initialization_with_default_rate_limiter(self): - strategy = AdaptiveRetryStrategy() + strategy = AsyncAdaptiveRetryStrategy() assert strategy.rate_limiter is not None - assert isinstance(strategy.rate_limiter, ClientRateLimiter) + assert isinstance(strategy.rate_limiter, AsyncClientRateLimiter) assert strategy.rate_limiter.rate_limit_enabled is False def test_initialization_with_custom_rate_limiter(self): - token_bucket = TokenBucket() + token_bucket = AsyncTokenBucket() calculator = CubicCalculator(starting_max_rate=5.0, start_time=0.0) - tracker = RequestRateTracker() - custom_limiter = ClientRateLimiter( + tracker = AsyncRequestRateTracker() + custom_limiter = AsyncClientRateLimiter( token_bucket=token_bucket, cubic_calculator=calculator, rate_tracker=tracker, rate_limiter_enabled=True, ) - strategy = AdaptiveRetryStrategy(rate_limiter=custom_limiter) + strategy = AsyncAdaptiveRetryStrategy(rate_limiter=custom_limiter) assert strategy.rate_limiter is custom_limiter assert strategy.rate_limiter.rate_limit_enabled is True @@ -685,21 +685,21 @@ def test_initialization_with_custom_rate_limiter(self): ids=["throttling", "not_throttling", "not_a_call_error"], ) def test_is_throttling_error(self, error: Exception, expected: bool): - assert AdaptiveRetryStrategy().is_throttling_error(error) is expected + assert AsyncAdaptiveRetryStrategy().is_throttling_error(error) is expected @pytest.mark.asyncio async def test_resolver_creates_adaptive_strategy(self): - resolver = RetryStrategyResolver() + resolver = AsyncRetryStrategyResolver() option1 = RetryStrategyOptions(retry_mode="adaptive") strategy = await resolver.resolve_retry_strategy(retry_strategy=option1) - assert isinstance(strategy, AdaptiveRetryStrategy) + assert isinstance(strategy, AsyncAdaptiveRetryStrategy) assert strategy.max_attempts == 3 @pytest.mark.parametrize("max_attempts", [2, 3, 10]) async def test_adaptive_retry_strategy(self, max_attempts: int) -> None: - strategy = AdaptiveRetryStrategy(max_attempts=max_attempts) + strategy = AsyncAdaptiveRetryStrategy(max_attempts=max_attempts) error = CallError(is_retry_safe=True) token = await strategy.acquire_initial_retry_token() for _ in range(max_attempts - 1): @@ -712,16 +712,16 @@ async def test_adaptive_retry_strategy(self, max_attempts: int) -> None: ) def test_deepcopy_returns_adaptive_strategy_with_rate_limiter(self) -> None: - strategy = AdaptiveRetryStrategy() + strategy = AsyncAdaptiveRetryStrategy() copied = deepcopy(strategy) assert copied is strategy - assert isinstance(copied, AdaptiveRetryStrategy) + assert isinstance(copied, AsyncAdaptiveRetryStrategy) assert copied.rate_limiter is strategy.rate_limiter class TestRequestPipelineRateLimiting: - def _non_retryable_call(self, strategy: AdaptiveRetryStrategy) -> Any: + def _non_retryable_call(self, strategy: AsyncAdaptiveRetryStrategy) -> Any: # A call whose input stream can't be resent, so it skips the retry loop call = MagicMock() call.retryable.return_value = False @@ -730,21 +730,21 @@ def _non_retryable_call(self, strategy: AdaptiveRetryStrategy) -> Any: def _adaptive_strategy_with_mocked_limiter( self, - ) -> tuple[AdaptiveRetryStrategy, ClientRateLimiter]: - limiter = ClientRateLimiter( - token_bucket=TokenBucket(), + ) -> tuple[AsyncAdaptiveRetryStrategy, AsyncClientRateLimiter]: + limiter = AsyncClientRateLimiter( + token_bucket=AsyncTokenBucket(), cubic_calculator=CubicCalculator(), - rate_tracker=RequestRateTracker(), + rate_tracker=AsyncRequestRateTracker(), rate_limiter_enabled=True, ) limiter.before_sending_request = AsyncMock() # type: ignore[method-assign] limiter.after_receiving_response = AsyncMock() # type: ignore[method-assign] - return AdaptiveRetryStrategy(rate_limiter=limiter), limiter + return AsyncAdaptiveRetryStrategy(rate_limiter=limiter), limiter @pytest.mark.asyncio async def test_non_retryable_call_applies_rate_limiting_on_success(self): strategy, limiter = self._adaptive_strategy_with_mocked_limiter() - pipeline: RequestPipeline[Any, Any] = RequestPipeline( + pipeline: AsyncRequestPipeline[Any, Any] = AsyncRequestPipeline( protocol=MagicMock(), transport=MagicMock() ) handle_attempt = AsyncMock( @@ -765,7 +765,7 @@ async def test_non_retryable_call_applies_rate_limiting_on_success(self): @pytest.mark.asyncio async def test_non_retryable_call_reports_throttle_without_retrying(self): strategy, limiter = self._adaptive_strategy_with_mocked_limiter() - pipeline: RequestPipeline[Any, Any] = RequestPipeline( + pipeline: AsyncRequestPipeline[Any, Any] = AsyncRequestPipeline( protocol=MagicMock(), transport=MagicMock() ) error = CallError(is_retry_safe=True, is_throttling_error=True) @@ -787,7 +787,7 @@ async def test_non_retryable_call_reports_throttle_without_retrying(self): @pytest.mark.asyncio async def test_failure_without_response_does_not_update_rate_limiter(self): strategy, limiter = self._adaptive_strategy_with_mocked_limiter() - pipeline: RequestPipeline[Any, Any] = RequestPipeline( + pipeline: AsyncRequestPipeline[Any, Any] = AsyncRequestPipeline( protocol=MagicMock(), transport=MagicMock() ) # Fails before sending, e.g. endpoint resolution or signing, so no response diff --git a/packages/smithy-http/.changes/next-release/smithy-http-breaking-4dd28f24c997470bae79085d6be8c776.json b/packages/smithy-http/.changes/next-release/smithy-http-breaking-4dd28f24c997470bae79085d6be8c776.json new file mode 100644 index 000000000..38092b82d --- /dev/null +++ b/packages/smithy-http/.changes/next-release/smithy-http-breaking-4dd28f24c997470bae79085d6be8c776.json @@ -0,0 +1,4 @@ +{ + "type": "breaking", + "description": "Moved async implementations to `smithy_http.aio` and added the `Async` prefix to their names, for example `AsyncHTTPClient`, `AsyncHttpClientProtocol`, `AsyncHttpBindingClientProtocol`, `AsyncRpcV2CborClientProtocol` and `AsyncAPIKeyAuthScheme`. The unprefixed names are reserved for sync implementations. Update imports to the `aio` paths." +} \ No newline at end of file diff --git a/packages/smithy-http/src/smithy_http/aio/aiohttp.py b/packages/smithy-http/src/smithy_http/aio/aiohttp.py index a94d7713a..99dde2734 100644 --- a/packages/smithy-http/src/smithy_http/aio/aiohttp.py +++ b/packages/smithy-http/src/smithy_http/aio/aiohttp.py @@ -32,7 +32,7 @@ HTTPRequestConfiguration, ) from . import HTTPResponse -from .interfaces import HTTPClient, HTTPRequest +from .interfaces import AsyncHTTPClient, HTTPRequest from .interfaces import HTTPResponse as HTTPResponseInterface __all__ = ["AIOHTTPClient", "AIOHTTPClientConfig"] @@ -65,8 +65,8 @@ async def close(self) -> None: self._response.release() -class AIOHTTPClient(HTTPClient): - """Implementation of :py:class:`.interfaces.HTTPClient` using aiohttp.""" +class AIOHTTPClient(AsyncHTTPClient): + """Implementation of :py:class:`.interfaces.AsyncHTTPClient` using aiohttp.""" TIMEOUT_EXCEPTIONS = (TimeoutError,) diff --git a/packages/smithy-http/src/smithy_http/aio/auth/apikey.py b/packages/smithy-http/src/smithy_http/aio/auth/apikey.py index 232c6444c..08474aaa6 100644 --- a/packages/smithy-http/src/smithy_http/aio/auth/apikey.py +++ b/packages/smithy-http/src/smithy_http/aio/auth/apikey.py @@ -3,22 +3,22 @@ from typing import Any, Protocol, Self from smithy_core import URI -from smithy_core.aio.interfaces.auth import AuthScheme, Signer -from smithy_core.aio.interfaces.identity import IdentityResolver +from smithy_core.aio.interfaces.auth import AsyncAuthScheme, AsyncSigner +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver from smithy_core.exceptions import SmithyIdentityError from smithy_core.interfaces import TypedProperties as _TypedProperties from smithy_core.traits import APIKeyLocation, HTTPAPIKeyAuthTrait from smithy_core.types import PropertyKey from ... import Field -from ..identity.apikey import APIKeyIdentity, APIKeyIdentityProperties +from ...identity import APIKeyIdentity, APIKeyIdentityProperties from ..interfaces import HTTPRequest __all__ = [ "API_KEY_RESOLVER_CONFIG", - "APIKeyAuthScheme", "APIKeyResolverConfig", - "APIKeySigner", + "AsyncAPIKeyAuthScheme", + "AsyncAPIKeySigner", ] @@ -32,7 +32,7 @@ class APIKeyResolverConfig(Protocol): """ api_key_identity_resolver: ( - IdentityResolver[APIKeyIdentity, APIKeyIdentityProperties] | None + AsyncIdentityResolver[APIKeyIdentity, APIKeyIdentityProperties] | None ) """An API key identity resolver. @@ -44,7 +44,7 @@ class APIKeyResolverConfig(Protocol): """A context property bearing an API key config.""" -class APIKeySigner(Signer[HTTPRequest, APIKeyIdentity, Any]): +class AsyncAPIKeySigner(AsyncSigner[HTTPRequest, APIKeyIdentity, Any]): """A signer that signs http requests with an api key.""" def __init__( @@ -86,18 +86,18 @@ async def sign( return request -class APIKeyAuthScheme( - AuthScheme[HTTPRequest, APIKeyIdentity, APIKeyIdentityProperties, Any] +class AsyncAPIKeyAuthScheme( + AsyncAuthScheme[HTTPRequest, APIKeyIdentity, APIKeyIdentityProperties, Any] ): """An auth scheme containing necessary data and tools for api key auth.""" scheme_id = HTTPAPIKeyAuthTrait.id - _signer: APIKeySigner + _signer: AsyncAPIKeySigner def __init__( self, *, name: str, location: APIKeyLocation, scheme: str | None = None ) -> None: - self._signer = APIKeySigner(name=name, location=location, scheme=scheme) + self._signer = AsyncAPIKeySigner(name=name, location=location, scheme=scheme) def identity_properties( self, *, context: _TypedProperties @@ -109,7 +109,7 @@ def identity_properties( def identity_resolver( self, *, context: _TypedProperties - ) -> IdentityResolver[APIKeyIdentity, APIKeyIdentityProperties]: + ) -> AsyncIdentityResolver[APIKeyIdentity, APIKeyIdentityProperties]: config = context.get(API_KEY_RESOLVER_CONFIG) if config is None or config.api_key_identity_resolver is None: raise SmithyIdentityError( @@ -121,7 +121,7 @@ def identity_resolver( def signer_properties(self, *, context: _TypedProperties) -> Any: return {} - def signer(self) -> Signer[HTTPRequest, APIKeyIdentity, Any]: + def signer(self) -> AsyncSigner[HTTPRequest, APIKeyIdentity, Any]: return self._signer @classmethod diff --git a/packages/smithy-http/src/smithy_http/aio/crt.py b/packages/smithy-http/src/smithy_http/aio/crt.py index 7fa30fbec..f83352ee2 100644 --- a/packages/smithy-http/src/smithy_http/aio/crt.py +++ b/packages/smithy-http/src/smithy_http/aio/crt.py @@ -149,7 +149,7 @@ class _CRTTimeoutError(Exception): """Internal wrapper for CRT timeout errors.""" -class AWSCRTHTTPClient(http_aio_interfaces.HTTPClient): +class AWSCRTHTTPClient(http_aio_interfaces.AsyncHTTPClient): _HTTP_PORT = 80 _HTTPS_PORT = 443 _TIMEOUT_ERROR_NAMES = frozenset(["AWS_IO_SOCKET_TIMEOUT", "AWS_IO_SOCKET_CLOSED"]) diff --git a/packages/smithy-http/src/smithy_http/aio/identity/apikey.py b/packages/smithy-http/src/smithy_http/aio/identity/apikey.py index 3d1587e55..a1eba7d5d 100644 --- a/packages/smithy-http/src/smithy_http/aio/identity/apikey.py +++ b/packages/smithy-http/src/smithy_http/aio/identity/apikey.py @@ -1,36 +1,19 @@ # 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 TypedDict - -from smithy_core.aio.interfaces.identity import IdentityResolver +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver from smithy_core.exceptions import SmithyIdentityError -from smithy_core.interfaces.identity import Identity + +from ...identity import APIKeyIdentity, APIKeyIdentityProperties __all__ = [ "APIKeyIdentity", "APIKeyIdentityProperties", - "APIKeyIdentityResolver", + "AsyncAPIKeyIdentityResolver", ] -@dataclass(kw_only=True) -class APIKeyIdentity(Identity): - """The identity for auth that uses an api key.""" - - api_key: str - """The API Key to add to requests.""" - - expiration: datetime | None = None - - -class APIKeyIdentityProperties(TypedDict, total=False): - api_key: str - - -class APIKeyIdentityResolver( - IdentityResolver[APIKeyIdentity, APIKeyIdentityProperties] +class AsyncAPIKeyIdentityResolver( + AsyncIdentityResolver[APIKeyIdentity, APIKeyIdentityProperties] ): """Loads the API key identity from the configuration.""" diff --git a/packages/smithy-http/src/smithy_http/aio/interfaces/__init__.py b/packages/smithy-http/src/smithy_http/aio/interfaces/__init__.py index 91f489ba1..c38ab71b3 100644 --- a/packages/smithy-http/src/smithy_http/aio/interfaces/__init__.py +++ b/packages/smithy-http/src/smithy_http/aio/interfaces/__init__.py @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 from typing import Any, Protocol -from smithy_core.aio.interfaces import ClientTransport, Request, Response +from smithy_core.aio.interfaces import AsyncClientTransport, Request, Response from smithy_core.aio.utils import read_streaming_blob, read_streaming_blob_async from smithy_core.schemas import APIOperation from smithy_core.shapes import ShapeID @@ -14,6 +14,7 @@ ) __all__ = [ + "AsyncHTTPClient", "HTTPClient", "HTTPErrorIdentifier", "HTTPRequest", @@ -70,11 +71,11 @@ def consume_body(self) -> bytes: return read_streaming_blob(self.body) -class HTTPClient(ClientTransport[HTTPRequest, HTTPResponse], Protocol): +class AsyncHTTPClient(AsyncClientTransport[HTTPRequest, HTTPResponse], Protocol): """An asynchronous HTTP client interface. Header field names and values are not validated before reaching this - layer. Implementations of ``HTTPClient`` are responsible for + layer. Implementations of ``AsyncHTTPClient`` are responsible for validating and handling those invalid and dangerous characters (such as CR, LF, or NUL) as defined in `RFC 9110, Section 5.5 `_. @@ -101,6 +102,11 @@ async def send( ... +# TODO(sync-renames): drop once aws-sdk-python's hand-written integration test +# harness imports AsyncHTTPClient instead of the pre-rename HTTPClient name. +HTTPClient = AsyncHTTPClient + + class HTTPErrorIdentifier: """A class that uses HTTP response metadata to identify errors. diff --git a/packages/smithy-http/src/smithy_http/aio/protocols.py b/packages/smithy-http/src/smithy_http/aio/protocols.py index 7356eb311..2f728c71f 100644 --- a/packages/smithy-http/src/smithy_http/aio/protocols.py +++ b/packages/smithy-http/src/smithy_http/aio/protocols.py @@ -9,13 +9,15 @@ from smithy_core import URI as _URI from smithy_core.aio.interfaces import ( AsyncByteStream, + AsyncClientProtocol, AsyncWriter, - ClientProtocol, - ProtocolSettings, ) from smithy_core.aio.interfaces import StreamingBlob as AsyncStreamingBlob -from smithy_core.aio.interfaces.auth import AuthScheme -from smithy_core.aio.interfaces.eventstream import EventPublisher, EventReceiver +from smithy_core.aio.interfaces.auth import AsyncAuthScheme +from smithy_core.aio.interfaces.eventstream import ( + AsyncEventPublisher, + AsyncEventReceiver, +) from smithy_core.aio.types import AsyncBytesReader from smithy_core.codecs import Codec from smithy_core.deserializers import DeserializeableShape, ShapeDeserializer @@ -29,6 +31,7 @@ ) from smithy_core.interfaces import ( Endpoint, + ProtocolSettings, SeekableBytesReader, TypedProperties, URI, @@ -58,10 +61,10 @@ from .interfaces import HTTPErrorIdentifier, HTTPRequest, HTTPResponse __all__ = [ - "HttpBindingClientProtocol", - "HttpClientProtocol", - "RpcClientProtocol", - "RpcV2CborClientProtocol", + "AsyncHttpBindingClientProtocol", + "AsyncHttpClientProtocol", + "AsyncRpcClientProtocol", + "AsyncRpcV2CborClientProtocol", ] try: @@ -144,7 +147,7 @@ def _assert_event_stream() -> None: ) -class HttpClientProtocol(ClientProtocol[HTTPRequest, HTTPResponse]): +class AsyncHttpClientProtocol(AsyncClientProtocol[HTTPRequest, HTTPResponse]): """An HTTP-based protocol.""" @property @@ -209,8 +212,8 @@ async def create_event_publisher[ request: HTTPRequest, event_type: "TypeForm[Event]", context: TypedProperties, - auth_scheme: AuthScheme[Any, Any, Any, Any] | None = None, - ) -> EventPublisher[Event]: + auth_scheme: AsyncAuthScheme[Any, Any, Any, Any] | None = None, + ) -> AsyncEventPublisher[Event]: _assert_event_stream() signing_config: SigningConfig | None = None if auth_scheme is not None: @@ -261,7 +264,7 @@ def create_event_receiver[ event_type: "TypeForm[Event]", event_deserializer: Callable[[ShapeDeserializer], Event], context: TypedProperties, - ) -> EventReceiver[Event]: + ) -> AsyncEventReceiver[Event]: _assert_event_stream() return AWSEventReceiver( payload_codec=self.payload_codec, @@ -270,7 +273,7 @@ def create_event_receiver[ ) -class HttpBindingClientProtocol(HttpClientProtocol): +class AsyncHttpBindingClientProtocol(AsyncHttpClientProtocol): """An HTTP-based protocol that uses HTTP binding traits.""" @property @@ -523,7 +526,7 @@ def _is_unit(schema: Schema | None) -> bool: return original is not None and original.document_value == str(UNIT.id) -class RpcClientProtocol(HttpClientProtocol): +class AsyncRpcClientProtocol(AsyncHttpClientProtocol): """Base for the RPC-based protocols (awsJson, awsQuery, rpcv2). RPC protocols serialize the whole operation input through a codec rather than via @@ -681,7 +684,7 @@ def create_event_receiver[ event_type: "TypeForm[Event]", event_deserializer: Callable[[ShapeDeserializer], Event], context: TypedProperties, - ) -> EventReceiver[Event]: + ) -> AsyncEventReceiver[Event]: _assert_event_stream() # Continue from the reader that already consumed the initial-response frame in # deserialize_response, so subsequent events stay in order. @@ -697,7 +700,7 @@ def create_event_receiver[ ) -class _RpcV2ClientProtocol(RpcClientProtocol): +class _RpcV2ClientProtocol(AsyncRpcClientProtocol): """Shared framing for the Smithy RPC v2 protocol family (rpcv2Cbor, rpcv2Json). Subclasses supply the codec-specific pieces: the protocol id, content type, @@ -901,7 +904,7 @@ def _normalize_error_id( return candidate -class RpcV2CborClientProtocol(_RpcV2ClientProtocol): +class AsyncRpcV2CborClientProtocol(_RpcV2ClientProtocol): """An implementation of the smithy.protocols#rpcv2Cbor protocol.""" _id: ShapeID = RpcV2CborTrait.id diff --git a/packages/smithy-http/src/smithy_http/auth/__init__.py b/packages/smithy-http/src/smithy_http/auth/__init__.py new file mode 100644 index 000000000..04f8b7b76 --- /dev/null +++ b/packages/smithy-http/src/smithy_http/auth/__init__.py @@ -0,0 +1,2 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 diff --git a/packages/smithy-http/src/smithy_http/auth/apikey.py b/packages/smithy-http/src/smithy_http/auth/apikey.py new file mode 100644 index 000000000..4259ed8a7 --- /dev/null +++ b/packages/smithy-http/src/smithy_http/auth/apikey.py @@ -0,0 +1,18 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +"""Placeholders for synchronous API key auth. + +Populated alongside the sync client implementation. +""" + + +class APIKeySigner: + """A synchronous signer that signs http requests with an api key. Placeholder.""" + + # TODO(sync-api): implement alongside the sync client + + +class APIKeyAuthScheme: + """A synchronous api key auth scheme. Placeholder.""" + + # TODO(sync-api): implement alongside the sync client diff --git a/packages/smithy-http/src/smithy_http/identity.py b/packages/smithy-http/src/smithy_http/identity.py new file mode 100644 index 000000000..1081d813b --- /dev/null +++ b/packages/smithy-http/src/smithy_http/identity.py @@ -0,0 +1,31 @@ +# 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 TypedDict + +from smithy_core.interfaces.identity import Identity + + +@dataclass(kw_only=True) +class APIKeyIdentity(Identity): + """The identity for auth that uses an api key.""" + + api_key: str + """The API Key to add to requests.""" + + expiration: datetime | None = None + + +class APIKeyIdentityProperties(TypedDict, total=False): + api_key: str + + +class APIKeyIdentityResolver: + """Loads the API key identity from the configuration. + + Placeholder for the synchronous resolver; populated alongside the sync client + implementation. + """ + + # TODO(sync-api): implement alongside the sync client diff --git a/packages/smithy-http/src/smithy_http/interfaces/__init__.py b/packages/smithy-http/src/smithy_http/interfaces/__init__.py index 8c8d584d1..ba4d6dd5d 100644 --- a/packages/smithy-http/src/smithy_http/interfaces/__init__.py +++ b/packages/smithy-http/src/smithy_http/interfaces/__init__.py @@ -137,3 +137,12 @@ class HTTPRequestConfiguration: """ read_timeout: float | None = None + + +class HTTPClient(Protocol): + """A synchronous HTTP client interface. + + Placeholder; populated alongside the sync client implementation. + """ + + # TODO(sync-api): implement alongside the sync client diff --git a/packages/smithy-http/src/smithy_http/protocols.py b/packages/smithy-http/src/smithy_http/protocols.py new file mode 100644 index 000000000..8ec71dc00 --- /dev/null +++ b/packages/smithy-http/src/smithy_http/protocols.py @@ -0,0 +1,24 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +"""Placeholders for synchronous HTTP protocol implementations. + +Populated alongside the sync client implementation. +""" + + +class HttpClientProtocol: + """A synchronous HTTP-based protocol. Placeholder.""" + + # TODO(sync-api): implement alongside the sync client + + +class HttpBindingClientProtocol: + """A synchronous HTTP-binding protocol. Placeholder.""" + + # TODO(sync-api): implement alongside the sync client + + +class RpcV2CborClientProtocol: + """A synchronous RPCv2 CBOR protocol. Placeholder.""" + + # TODO(sync-api): implement alongside the sync client diff --git a/packages/smithy-http/src/smithy_http/testing/mockhttp.py b/packages/smithy-http/src/smithy_http/testing/mockhttp.py index 86131fd91..37cb3ea84 100644 --- a/packages/smithy-http/src/smithy_http/testing/mockhttp.py +++ b/packages/smithy-http/src/smithy_http/testing/mockhttp.py @@ -9,13 +9,13 @@ from smithy_http import tuples_to_fields from smithy_http.aio import HTTPResponse -from smithy_http.aio.interfaces import HTTPClient, HTTPRequest +from smithy_http.aio.interfaces import AsyncHTTPClient, HTTPRequest from smithy_http.interfaces import HTTPClientConfiguration, HTTPRequestConfiguration __all__ = ["MockHTTPClient", "MockHTTPClientError"] -class MockHTTPClient(HTTPClient): +class MockHTTPClient(AsyncHTTPClient): """Implementation of :py:class:`.interfaces.HTTPClient` solely for testing purposes. Simulates HTTP request/response behavior. Responses are queued in FIFO order and diff --git a/packages/smithy-http/tests/unit/aio/auth/test_apikey.py b/packages/smithy-http/tests/unit/aio/auth/test_apikey.py index e80a75365..0d4af060a 100644 --- a/packages/smithy-http/tests/unit/aio/auth/test_apikey.py +++ b/packages/smithy-http/tests/unit/aio/auth/test_apikey.py @@ -5,18 +5,19 @@ import pytest from smithy_core import URI -from smithy_core.aio.interfaces.identity import IdentityResolver +from smithy_core.aio.interfaces.identity import AsyncIdentityResolver from smithy_core.exceptions import SmithyIdentityError from smithy_core.types import TypedProperties from smithy_http import Field, Fields from smithy_http.aio import HTTPRequest from smithy_http.aio.auth.apikey import ( - APIKeyAuthScheme, APIKeyIdentityProperties, APIKeyLocation, - APIKeySigner, + AsyncAPIKeyAuthScheme, + AsyncAPIKeySigner, ) -from smithy_http.aio.identity.apikey import APIKeyIdentity, APIKeyIdentityResolver +from smithy_http.aio.identity.apikey import AsyncAPIKeyIdentityResolver +from smithy_http.identity import APIKeyIdentity class _FakeBody(AsyncIterable[bytes]): @@ -42,7 +43,7 @@ def request(query: str | None = None, fields: Fields | None = None) -> HTTPReque async def test_sign_empty_query() -> None: api_key = "spam" identity = APIKeyIdentity(api_key=api_key) - signer = APIKeySigner(name="eggs", location=APIKeyLocation.QUERY) + signer = AsyncAPIKeySigner(name="eggs", location=APIKeyLocation.QUERY) given = request() expected = request(query="eggs=spam") @@ -59,7 +60,7 @@ async def test_sign_empty_query() -> None: async def test_sign_non_empty_query() -> None: api_key = "spam" identity = APIKeyIdentity(api_key=api_key) - signer = APIKeySigner(name="eggs", location=APIKeyLocation.QUERY) + signer = AsyncAPIKeySigner(name="eggs", location=APIKeyLocation.QUERY) given = request(query="spam=eggs") expected = request(query="spam=eggs&eggs=spam") @@ -76,7 +77,7 @@ async def test_sign_non_empty_query() -> None: async def test_sign_header() -> None: api_key = "spam" identity = APIKeyIdentity(api_key=api_key) - signer = APIKeySigner(name="eggs", location=APIKeyLocation.HEADER) + signer = AsyncAPIKeySigner(name="eggs", location=APIKeyLocation.HEADER) given = request() expected = request(fields=Fields([Field(name="eggs", values=["spam"])])) @@ -93,7 +94,9 @@ async def test_sign_header() -> None: async def test_sign_header_with_scheme() -> None: api_key = "spam" identity = APIKeyIdentity(api_key=api_key) - signer = APIKeySigner(name="eggs", location=APIKeyLocation.HEADER, scheme="Bearer") + signer = AsyncAPIKeySigner( + name="eggs", location=APIKeyLocation.HEADER, scheme="Bearer" + ) given = request() expected = request(fields=Fields([Field(name="eggs", values=["Bearer spam"])])) @@ -110,13 +113,13 @@ async def test_sign_header_with_scheme() -> None: @dataclass class ApiKeyConfig: api_key_identity_resolver: ( - IdentityResolver[APIKeyIdentity, APIKeyIdentityProperties] | None + AsyncIdentityResolver[APIKeyIdentity, APIKeyIdentityProperties] | None ) = None async def test_auth_scheme_gets_resolver() -> None: - scheme = APIKeyAuthScheme(name="eggs", location=APIKeyLocation.QUERY) - resolver = APIKeyIdentityResolver() + scheme = AsyncAPIKeyAuthScheme(name="eggs", location=APIKeyLocation.QUERY) + resolver = AsyncAPIKeyIdentityResolver() config = ApiKeyConfig(api_key_identity_resolver=resolver) properties = TypedProperties({"config": config}) @@ -124,6 +127,6 @@ async def test_auth_scheme_gets_resolver() -> None: async def test_auth_scheme_missing_resolver() -> None: - scheme = APIKeyAuthScheme(name="eggs", location=APIKeyLocation.QUERY) + scheme = AsyncAPIKeyAuthScheme(name="eggs", location=APIKeyLocation.QUERY) with pytest.raises(SmithyIdentityError): scheme.identity_resolver(context=TypedProperties()) diff --git a/packages/smithy-http/tests/unit/aio/identity/test_apikey.py b/packages/smithy-http/tests/unit/aio/identity/test_apikey.py index 782536b21..0e8888af2 100644 --- a/packages/smithy-http/tests/unit/aio/identity/test_apikey.py +++ b/packages/smithy-http/tests/unit/aio/identity/test_apikey.py @@ -2,19 +2,19 @@ # SPDX-License-Identifier: Apache-2.0 import pytest from smithy_core.exceptions import SmithyIdentityError -from smithy_http.aio.identity.apikey import APIKeyIdentityResolver +from smithy_http.aio.identity.apikey import AsyncAPIKeyIdentityResolver async def test_identity_resolver() -> None: api_key = "spam" - resolver = APIKeyIdentityResolver() + resolver = AsyncAPIKeyIdentityResolver() identity = await resolver.get_identity(properties={"api_key": api_key}) assert identity.api_key == api_key async def test_missing_api_key() -> None: - resolver = APIKeyIdentityResolver() + resolver = AsyncAPIKeyIdentityResolver() with pytest.raises(SmithyIdentityError): await resolver.get_identity(properties={}) diff --git a/packages/smithy-http/tests/unit/aio/test_event_streams.py b/packages/smithy-http/tests/unit/aio/test_event_streams.py index f368664d5..ff1f27464 100644 --- a/packages/smithy-http/tests/unit/aio/test_event_streams.py +++ b/packages/smithy-http/tests/unit/aio/test_event_streams.py @@ -25,7 +25,7 @@ from smithy_core.types import TypedProperties from smithy_http import Fields from smithy_http.aio import HTTPRequest, HTTPResponse -from smithy_http.aio.protocols import RpcV2CborClientProtocol +from smithy_http.aio.protocols import AsyncRpcV2CborClientProtocol pytest.importorskip("smithy_cbor") @@ -178,8 +178,8 @@ def _service_schema(trait: RpcV2CborTrait | None = None) -> Schema: ) -def _protocol(service_schema: Schema | None = None) -> RpcV2CborClientProtocol: - return RpcV2CborClientProtocol( +def _protocol(service_schema: Schema | None = None) -> AsyncRpcV2CborClientProtocol: + return AsyncRpcV2CborClientProtocol( ProtocolSettings( namespace="smithy.example", service_target="StreamService", diff --git a/packages/smithy-http/tests/unit/aio/test_protocols.py b/packages/smithy-http/tests/unit/aio/test_protocols.py index 92aab05df..3d5b0a43e 100644 --- a/packages/smithy-http/tests/unit/aio/test_protocols.py +++ b/packages/smithy-http/tests/unit/aio/test_protocols.py @@ -28,11 +28,14 @@ from smithy_http.aio.interfaces import ( HTTPResponse as HTTPResponseInterface, ) -from smithy_http.aio.protocols import HttpBindingClientProtocol, HttpClientProtocol +from smithy_http.aio.protocols import ( + AsyncHttpBindingClientProtocol, + AsyncHttpClientProtocol, +) from smithy_json import JSONCodec -class MockProtocol(HttpClientProtocol): +class MockProtocol(AsyncHttpClientProtocol): _id = ShapeID("ns.foo#bar") @property @@ -61,7 +64,7 @@ def deserialize_response( raise Exception("This is only for tests.") -class MockBindingProtocol(HttpBindingClientProtocol): +class MockBindingProtocol(AsyncHttpBindingClientProtocol): _id = ShapeID("ns.foo#binding") _codec = JSONCodec() _error_identifier = HTTPErrorIdentifier() diff --git a/scripts/api-snapshot/api.json b/scripts/api-snapshot/api.json index 8c13bf091..5382d5c2c 100644 --- a/scripts/api-snapshot/api.json +++ b/scripts/api-snapshot/api.json @@ -71,16 +71,283 @@ }, "smithy_aws_core": {}, "smithy_aws_core.aio": {}, + "smithy_aws_core.aio.auth": {}, + "smithy_aws_core.aio.auth.sigv4": { + "AWSCredentialsIdentity": "rex-class", + "AWSIdentityProperties": "rex-class", + "AWS_IDENTITY_CONFIG": "rex-PropertyKey", + "AsyncAWSCredentialsResolver": "rex-type_alias", + "AsyncAuthScheme": "rex-protocol", + "AsyncEventSigner": "rex-class[async]", + "AsyncEventSignerProtocol": "rex-protocol[async]", + "AsyncSigV4AuthScheme": "class", + "AsyncSigV4Signer": "rex-class[async]", + "AsyncSigner": "rex-protocol[async]", + "EventHeaderEncoder": "rex-class", + "HTTPRequest": "rex-protocol[async]", + "PropertyKey": "rex-class", + "SIGV4_CONFIG": "PropertyKey", + "SigV4Config": "protocol", + "SigV4Signer": "rex-type_alias", + "SigV4SigningProperties": "rex-class", + "SigV4Trait": "rex-class", + "SmithyIdentityError": "rex-exception" + }, + "smithy_aws_core.aio.config": { + "AsyncAwsConfig": "rex-class[async]", + "AsyncDefaultFileSystem": "rex-class[async]", + "AsyncFileSystem": "rex-protocol[async]", + "AsyncSharedConfigContext": "rex-class[async]", + "AwsConfigOverrides": "rex-class", + "aws_config": "rex-module", + "context": "rex-module", + "file_parser": "rex-module", + "filesystem": "rex-module", + "load_config_async": "rex-function[async]", + "resolvers": "rex-module" + }, + "smithy_aws_core.aio.config.aws_config": { + "AsyncAwsConfig": "class[async]", + "AsyncFileSystem": "rex-protocol[async]", + "AsyncSharedConfigContext": "rex-class[async]", + "AwsConfigOverrides": "class", + "ConfigError": "rex-exception", + "ConfigSource": "rex-class", + "ConfigValidationError": "rex-exception", + "FieldSpec": "rex-class", + "Resolved": "rex-class", + "RetryStrategyOptions": "rex-class", + "UNSET": "rex-_UnsetType", + "resolve_endpoint_uri": "rex-function[async]", + "resolve_max_attempts": "rex-function[async]", + "resolve_region": "rex-function[async]", + "resolve_retry_mode": "rex-function[async]", + "resolve_sdk_ua_app_id": "rex-function[async]", + "validate_max_attempts": "rex-function", + "validate_profile": "rex-function", + "validate_region": "rex-function", + "validate_retry_mode": "rex-function" + }, + "smithy_aws_core.aio.config.context": { + "AsyncDefaultFileSystem": "rex-class[async]", + "AsyncFileSystem": "rex-protocol[async]", + "AsyncSharedConfigContext": "class[async]", + "ConfigSource": "rex-class", + "FileType": "rex-class", + "MergedConfig": "rex-class", + "load_config_async": "function[async]", + "logger": "Logger", + "parse_config_file_async": "rex-function[async]", + "standardize": "rex-function" + }, + "smithy_aws_core.aio.config.file_parser": { + "AsyncFileSystem": "rex-protocol[async]", + "ConfigParseError": "rex-exception", + "RawParsedSections": "rex-type_alias", + "parse_config_file_async": "function[async]" + }, + "smithy_aws_core.aio.config.filesystem": { + "AsyncDefaultFileSystem": "class[async]", + "AsyncFileSystem": "protocol[async]", + "logger": "Logger" + }, + "smithy_aws_core.aio.config.resolvers": { + "AsyncSharedConfigContext": "rex-class[async]", + "ConfigSource": "rex-class", + "ConfigValidationError": "rex-exception", + "EndpointUriResolver": "class[async]", + "Resolved": "rex-class", + "UNSET": "rex-_UnsetType", + "resolve_endpoint_uri": "function[async]", + "resolve_max_attempts": "function[async]", + "resolve_region": "function[async]", + "resolve_retry_mode": "function[async]", + "resolve_sdk_ua_app_id": "function[async]" + }, + "smithy_aws_core.aio.endpoints": {}, + "smithy_aws_core.aio.endpoints.standard_regional": { + "AsyncEndpointResolver": "rex-protocol[async]", + "AsyncStandardRegionalEndpointsResolver": "class[async]", + "Endpoint": "rex-class", + "EndpointResolutionError": "rex-exception", + "EndpointResolverParams": "rex-class", + "REGIONAL_ENDPOINT_CONFIG": "rex-PropertyKey", + "URI": "rex-class", + "resolve_static_uri": "rex-function" + }, + "smithy_aws_core.aio.identity": { + "AWSCredentialsIdentity": "rex-class", + "AWSIdentityProperties": "rex-class", + "AsyncAWSCredentialsResolver": "rex-type_alias", + "AsyncContainerCredentialsResolver": "rex-class[async]", + "AsyncEnvironmentCredentialsProvider": "rex-class[async]", + "AsyncEnvironmentCredentialsResolver": "rex-class[async]", + "AsyncIMDSCredentialsResolver": "rex-class[async]", + "AsyncIdentityChain": "rex-class[async]", + "AsyncIdentityResolver": "rex-protocol[async]", + "AsyncProcessCredentialsResolver": "rex-class[async]", + "AsyncProfileCredentialProcessProvider": "rex-class[async]", + "AsyncProfileSessionCredentialsProvider": "rex-class[async]", + "AsyncProfileStaticCredentialsProvider": "rex-class[async]", + "AsyncSharedConfigProvider": "rex-class[async]", + "AsyncStaticCredentialsResolver": "rex-class[async]", + "chain": "rex-module", + "container": "rex-module", + "environment": "rex-module", + "imds": "rex-module", + "process": "rex-module", + "static": "rex-module" + }, + "smithy_aws_core.aio.identity.chain": { + "After": "rex-class", + "AsyncHTTPClient": "rex-protocol[async]", + "AsyncIdentityChain": "class[async]", + "AsyncIdentityResolver": "rex-protocol[async]", + "Before": "rex-class", + "ChainIdentityProvider": "rex-protocol[async]", + "ChainSetup": "rex-class", + "Identity": "rex-protocol", + "IdentityChainConfigurationError": "rex-exception", + "IdentityChainError": "rex-exception", + "IdentityResolverFailure": "rex-class", + "MergedConfig": "rex-class", + "NamedResolver": "rex-class[async]", + "SmithyIdentityError": "rex-exception", + "Standard": "rex-class", + "StandardProvider": "rex-class", + "UnclaimedSource": "rex-class", + "logger": "Logger", + "provider": "rex-module", + "providers": "rex-module" + }, + "smithy_aws_core.aio.identity.chain.provider": { + "AsyncHTTPClient": "rex-protocol[async]", + "AsyncIdentityResolver": "rex-protocol[async]", + "ChainIdentityProvider": "protocol[async]", + "ChainSetup": "class", + "Identity": "rex-protocol", + "MergedConfig": "rex-class", + "NamedResolver": "class[async]", + "OrderingConstraint": "rex-type_alias" + }, + "smithy_aws_core.aio.identity.chain.providers": { + "environment": "rex-module", + "process": "rex-module", + "profile": "rex-module", + "shared_config": "rex-module" + }, + "smithy_aws_core.aio.identity.chain.providers.environment": { + "AWSCredentialsIdentity": "rex-class", + "AsyncEnvironmentCredentialsProvider": "class[async]", + "AsyncEnvironmentCredentialsResolver": "rex-class[async]", + "ChainSetup": "rex-class", + "Identity": "rex-protocol", + "Standard": "rex-class", + "StandardProvider": "rex-class" + }, + "smithy_aws_core.aio.identity.chain.providers.process": { + "AWSCredentialsIdentity": "rex-class", + "AsyncProcessCredentialsResolver": "rex-class[async]", + "AsyncProfileCredentialProcessProvider": "class[async]", + "ChainSetup": "rex-class", + "Identity": "rex-protocol", + "Standard": "rex-class", + "StandardProvider": "rex-class" + }, + "smithy_aws_core.aio.identity.chain.providers.profile": { + "AWSCredentialsIdentity": "rex-class", + "AsyncProfileSessionCredentialsProvider": "class[async]", + "AsyncProfileStaticCredentialsProvider": "class[async]", + "AsyncStaticCredentialsResolver": "rex-class[async]", + "ChainSetup": "rex-class", + "Identity": "rex-protocol", + "Standard": "rex-class", + "StandardProvider": "rex-class" + }, + "smithy_aws_core.aio.identity.chain.providers.shared_config": { + "AWSCredentialsIdentity": "rex-class", + "AsyncSharedConfigProvider": "class[async]", + "ChainSetup": "rex-class", + "Identity": "rex-protocol", + "Standard": "rex-class", + "StandardProvider": "rex-class", + "load_config_async": "rex-function[async]" + }, + "smithy_aws_core.aio.identity.container": { + "AWSCredentialsIdentity": "rex-class", + "AWSIdentityProperties": "rex-class", + "AsyncContainerCredentialsResolver": "class[async]", + "AsyncHTTPClient": "rex-protocol[async]", + "AsyncIdentityResolver": "rex-protocol[async]", + "ContainerCredentialsConfig": "rex-class", + "ContainerMetadataClient": "class[async]", + "Field": "rex-class", + "Fields": "rex-class", + "HTTPRequest": "rex-class[async]", + "HTTPResponse": "rex-protocol[async]", + "SmithyIdentityError": "rex-exception", + "URI": "rex-class" + }, + "smithy_aws_core.aio.identity.environment": { + "AWSCredentialsIdentity": "rex-class", + "AWSIdentityProperties": "rex-class", + "AsyncEnvironmentCredentialsResolver": "class[async]", + "AsyncIdentityResolver": "rex-protocol[async]", + "EnvironmentCredentialsResolver": "rex-class" + }, + "smithy_aws_core.aio.identity.imds": { + "AWSCredentialsIdentity": "rex-class", + "AWSIdentityProperties": "rex-class", + "AsyncHTTPClient": "rex-protocol[async]", + "AsyncIMDSCredentialsResolver": "class[async]", + "AsyncIdentityResolver": "rex-protocol[async]", + "AsyncRetryStrategy": "rex-protocol[async]", + "AsyncSimpleRetryStrategy": "rex-class[async]", + "Config": "class", + "EC2Metadata": "class[async]", + "Field": "rex-class", + "Fields": "rex-class", + "HTTPRequest": "rex-class[async]", + "SmithyIdentityError": "rex-exception", + "Token": "rex-class", + "TokenCache": "class[async]", + "URI": "rex-class" + }, + "smithy_aws_core.aio.identity.process": { + "AWSCredentialsIdentity": "rex-class", + "AWSIdentityProperties": "rex-class", + "AsyncIdentityResolver": "rex-protocol[async]", + "AsyncProcessCredentialsResolver": "class[async]", + "SmithyIdentityError": "rex-exception" + }, + "smithy_aws_core.aio.identity.static": { + "AWSCredentialsIdentity": "rex-class", + "AWSIdentityProperties": "rex-class", + "AsyncIdentityResolver": "rex-protocol[async]", + "AsyncStaticCredentialsResolver": "class[async]", + "StaticCredentialsResolver": "rex-class" + }, "smithy_aws_core.aio.protocols": { "APIOperation": "rex-class", "AWSErrorIdentifier": "class", + "AWSEventPublisher": "rex-class[async]", + "AWSEventReceiver": "rex-class[async]", "AWSJSONDocument": "rex-class", + "AsyncAuthScheme": "rex-protocol", + "AsyncAwsJson10ClientProtocol": "class[async]", + "AsyncAwsJson11ClientProtocol": "class[async]", + "AsyncAwsQueryClientProtocol": "class[async]", "AsyncBytesReader": "rex-class[async]", - "AwsJson10ClientProtocol": "class[async]", - "AwsJson11ClientProtocol": "class[async]", + "AsyncEc2QueryClientProtocol": "class[async]", + "AsyncEventPublisher": "rex-protocol[async]", + "AsyncEventReceiver": "rex-protocol[async]", + "AsyncHttpBindingClientProtocol": "rex-class[async]", + "AsyncRestJsonClientProtocol": "class[async]", + "AsyncRestXmlClientProtocol": "class[async]", + "AsyncRpcClientProtocol": "rex-class[async]", + "AsyncWriter": "rex-protocol[async]", "AwsJson1_0Trait": "rex-class", "AwsJson1_1Trait": "rex-class", - "AwsQueryClientProtocol": "class[async]", "AwsQueryTrait": "rex-class", "BytesReader": "rex-protocol", "BytesWriter": "rex-protocol", @@ -89,7 +356,6 @@ "DOCUMENT": "rex-Schema", "DeserializeableShape": "rex-protocol", "DiscriminatorError": "rex-exception", - "Ec2QueryClientProtocol": "class[async]", "Ec2QueryShapeSerializer": "rex-class", "Ec2QueryTrait": "rex-class", "ExpectationNotMetError": "rex-exception", @@ -98,7 +364,6 @@ "HTTPResponse": "rex-protocol[async]", "HTTPResponseDeserializer": "rex-class", "HTTPTrait": "rex-class", - "HttpBindingClientProtocol": "rex-class[async]", "JSONCodec": "rex-class", "JSONDocument": "rex-class", "MissingDependencyError": "rex-exception", @@ -109,20 +374,19 @@ "QueryShapeSerializer": "rex-class", "ResponseMetadata": "rex-class", "RestJson1Trait": "rex-class", - "RestJsonClientProtocol": "class[async]", - "RestXmlClientProtocol": "class[async]", "RestXmlTrait": "rex-class", - "RpcClientProtocol": "rex-class[async]", "SerializeableShape": "rex-protocol", "ShapeDeserializer": "rex-protocol", "ShapeID": "rex-class", "ShapeSerializer": "rex-protocol", "ShapeType": "rex-class", + "SigningConfig": "rex-class", "SyncStreamingBlob": "rex-type_alias", "TimestampFormat": "rex-class", "TypeRegistry": "rex-class", "TypedProperties": "rex-protocol", "URI": "rex-protocol", + "UnsupportedStreamError": "rex-exception", "XMLCodec": "rex-class", "create_aws_query_error": "rex-function", "parse_aws_query_request_id": "rex-function", @@ -139,84 +403,34 @@ "sigv4": "rex-module" }, "smithy_aws_core.auth.sigv4": { - "AWSCredentialsIdentity": "rex-class", - "AWSCredentialsResolver": "rex-type_alias", - "AWSIdentityProperties": "rex-class", - "AWS_IDENTITY_CONFIG": "rex-PropertyKey", - "AsyncEventSigner": "rex-class[async]", - "AsyncSigV4Signer": "rex-class[async]", - "AuthScheme": "rex-protocol", - "EventHeaderEncoder": "rex-class", - "EventSigner": "rex-protocol[async]", - "HTTPRequest": "rex-protocol[async]", - "PropertyKey": "rex-class", - "SIGV4_CONFIG": "PropertyKey", - "SigV4AuthScheme": "class", - "SigV4Config": "protocol", - "SigV4Signer": "rex-type_alias", - "SigV4SigningProperties": "rex-class", - "SigV4Trait": "rex-class", - "Signer": "rex-protocol[async]", - "SmithyIdentityError": "rex-exception" + "SigV4AuthScheme": "class" }, "smithy_aws_core.config": { "AsyncAwsConfig": "rex-class[async]", + "AsyncDefaultFileSystem": "rex-class[async]", + "AsyncFileSystem": "rex-protocol[async]", + "AsyncSharedConfigContext": "rex-class[async]", "AwsConfigOverrides": "rex-class", "ConfigError": "rex-exception", "ConfigParseError": "rex-exception", "ConfigSource": "rex-class", "ConfigValidationError": "rex-exception", - "DefaultFileSystem": "rex-class[async]", - "FileSystem": "rex-protocol[async]", "MergedConfig": "rex-class", "ProfileNotFoundError": "rex-exception", - "SharedConfigContext": "rex-class[async]", - "aws_config": "rex-module", "context": "rex-module", "exceptions": "rex-module", "file_parser": "rex-module", - "filesystem": "rex-module", - "load_config": "rex-function[async]", + "load_config_async": "rex-function[async]", "merged_config": "rex-module", - "resolvers": "rex-module", "shared_config_files_exist": "rex-function", "types": "rex-module", "validators": "rex-module" }, "smithy_aws_core.config.aws_config": { - "AsyncAwsConfig": "class[async]", - "AwsConfigOverrides": "class", - "ConfigError": "rex-exception", - "ConfigSource": "rex-class", - "ConfigValidationError": "rex-exception", - "FieldSpec": "rex-class", - "FileSystem": "rex-protocol[async]", - "Resolved": "rex-class", - "RetryStrategyOptions": "rex-class", - "SharedConfigContext": "rex-class[async]", - "UNSET": "rex-_UnsetType", - "resolve_endpoint_uri": "rex-function[async]", - "resolve_max_attempts": "rex-function[async]", - "resolve_region": "rex-function[async]", - "resolve_retry_mode": "rex-function[async]", - "resolve_sdk_ua_app_id": "rex-function[async]", - "validate_max_attempts": "rex-function", - "validate_profile": "rex-function", - "validate_region": "rex-function", - "validate_retry_mode": "rex-function" + "AwsConfig": "class" }, "smithy_aws_core.config.context": { - "ConfigSource": "rex-class", - "DefaultFileSystem": "rex-class[async]", - "FileSystem": "rex-protocol[async]", - "FileType": "rex-class", - "MergedConfig": "rex-class", - "SharedConfigContext": "class[async]", - "load_config": "function[async]", - "logger": "Logger", - "parse_config_file": "rex-function[async]", - "shared_config_files_exist": "function", - "standardize": "rex-function" + "shared_config_files_exist": "function" }, "smithy_aws_core.config.exceptions": { "ConfigError": "exception", @@ -227,40 +441,20 @@ }, "smithy_aws_core.config.file_parser": { "ConfigParseError": "rex-exception", - "FileSystem": "rex-protocol[async]", "FileType": "class", "RawParsedSections": "rex-type_alias", "Section": "class", "SectionMap": "rex-type_alias", "StandardizedOutput": "class", "logger": "Logger", - "parse_config_file": "function[async]", "standardize": "function" }, - "smithy_aws_core.config.filesystem": { - "DefaultFileSystem": "class[async]", - "FileSystem": "protocol[async]", - "logger": "Logger" - }, "smithy_aws_core.config.merged_config": { "MergedConfig": "class", "Section": "rex-class", "SectionMap": "rex-type_alias", "StandardizedOutput": "rex-class" }, - "smithy_aws_core.config.resolvers": { - "ConfigSource": "rex-class", - "ConfigValidationError": "rex-exception", - "EndpointUriResolver": "class[async]", - "Resolved": "rex-class", - "SharedConfigContext": "rex-class[async]", - "UNSET": "rex-_UnsetType", - "resolve_endpoint_uri": "function[async]", - "resolve_max_attempts": "function[async]", - "resolve_region": "function[async]", - "resolve_retry_mode": "function[async]", - "resolve_sdk_ua_app_id": "function[async]" - }, "smithy_aws_core.config.types": { "ConfigSource": "class", "FieldSpec": "class", @@ -282,73 +476,41 @@ "RegionalEndpointConfig": "class", "StaticEndpointConfig": "rex-protocol" }, - "smithy_aws_core.endpoints.standard_regional": { - "Endpoint": "rex-class", - "EndpointResolutionError": "rex-exception", - "EndpointResolver": "rex-protocol[async]", - "EndpointResolverParams": "rex-class", - "REGIONAL_ENDPOINT_CONFIG": "rex-PropertyKey", - "StandardRegionalEndpointsResolver": "class[async]", - "URI": "rex-class", - "resolve_static_uri": "rex-function" - }, "smithy_aws_core.identity": { "AWSCredentialsIdentity": "rex-class", "AWSCredentialsResolver": "rex-type_alias", "AWSIdentityConfig": "rex-protocol", "AWSIdentityProperties": "rex-class", "AWS_IDENTITY_CONFIG": "PropertyKey", - "ContainerCredentialsResolver": "rex-class[async]", - "EnvironmentCredentialsProvider": "rex-class[async]", "EnvironmentCredentialsResolver": "rex-class[async]", - "IMDSCredentialsResolver": "rex-class[async]", - "IdentityChain": "rex-class[async]", "IdentityChainError": "rex-exception", - "ProcessCredentialsResolver": "rex-class[async]", - "ProfileCredentialProcessProvider": "rex-class[async]", - "ProfileSessionCredentialsProvider": "rex-class[async]", - "ProfileStaticCredentialsProvider": "rex-class[async]", "PropertyKey": "rex-class", - "SharedConfigProvider": "rex-class[async]", - "StaticCredentialsResolver": "rex-class[async]", + "StaticCredentialsResolver": "rex-class", "UnclaimedSource": "rex-class", "chain": "rex-module", "components": "rex-module", "container": "rex-module", "environment": "rex-module", "imds": "rex-module", - "process": "rex-module", "static": "rex-module" }, "smithy_aws_core.identity.chain": { "After": "rex-class", "Before": "rex-class", - "ChainIdentityProvider": "rex-protocol[async]", - "ChainSetup": "rex-class", - "HTTPClient": "rex-protocol[async]", - "Identity": "rex-protocol", - "IdentityChain": "class[async]", "IdentityChainConfigurationError": "rex-exception", "IdentityChainError": "rex-exception", - "IdentityResolver": "rex-protocol[async]", "IdentityResolverFailure": "rex-class", - "MergedConfig": "rex-class", - "NamedResolver": "rex-class[async]", "OrderingConstraint": "rex-type_alias", - "SmithyIdentityError": "rex-exception", "Standard": "rex-class", "StandardProvider": "rex-class", "UnclaimedSource": "rex-class", "exceptions": "rex-module", - "logger": "Logger", "ordering": "rex-module", - "provider": "rex-module", "providers": "rex-module" }, "smithy_aws_core.identity.chain.exceptions": { "IdentityChainConfigurationError": "exception", "IdentityChainError": "exception", - "IdentityResolver": "rex-protocol[async]", "IdentityResolverFailure": "class", "SmithyError": "rex-exception", "SmithyIdentityError": "rex-exception", @@ -362,60 +524,12 @@ "StandardProvider": "class", "shared_config_files_exist": "rex-function" }, - "smithy_aws_core.identity.chain.provider": { - "ChainIdentityProvider": "protocol[async]", - "ChainSetup": "class", - "HTTPClient": "rex-protocol[async]", - "Identity": "rex-protocol", - "IdentityResolver": "rex-protocol[async]", - "MergedConfig": "rex-class", - "NamedResolver": "class[async]", - "OrderingConstraint": "rex-type_alias" - }, "smithy_aws_core.identity.chain.providers": { - "environment": "rex-module", - "process": "rex-module", - "profile": "rex-module", - "shared_config": "rex-module" - }, - "smithy_aws_core.identity.chain.providers.environment": { - "AWSCredentialsIdentity": "rex-class", - "ChainSetup": "rex-class", - "EnvironmentCredentialsProvider": "class[async]", - "EnvironmentCredentialsResolver": "rex-class[async]", - "Identity": "rex-protocol", - "Standard": "rex-class", - "StandardProvider": "rex-class" + "process": "rex-module" }, "smithy_aws_core.identity.chain.providers.process": { - "AWSCredentialsIdentity": "rex-class", - "ChainSetup": "rex-class", - "Identity": "rex-protocol", "ProcessConfigurationError": "exception", - "ProcessCredentialsResolver": "rex-class[async]", - "ProfileCredentialProcessProvider": "class[async]", - "SmithyError": "rex-exception", - "Standard": "rex-class", - "StandardProvider": "rex-class" - }, - "smithy_aws_core.identity.chain.providers.profile": { - "AWSCredentialsIdentity": "rex-class", - "ChainSetup": "rex-class", - "Identity": "rex-protocol", - "ProfileSessionCredentialsProvider": "class[async]", - "ProfileStaticCredentialsProvider": "class[async]", - "Standard": "rex-class", - "StandardProvider": "rex-class", - "StaticCredentialsResolver": "rex-class[async]" - }, - "smithy_aws_core.identity.chain.providers.shared_config": { - "AWSCredentialsIdentity": "rex-class", - "ChainSetup": "rex-class", - "Identity": "rex-protocol", - "SharedConfigProvider": "class[async]", - "Standard": "rex-class", - "StandardProvider": "rex-class", - "load_config": "rex-function[async]" + "SmithyError": "rex-exception" }, "smithy_aws_core.identity.components": { "AWSCredentialsIdentity": "class", @@ -423,61 +537,26 @@ "AWSIdentityConfig": "protocol", "AWSIdentityProperties": "class", "Identity": "rex-protocol", - "IdentityResolver": "rex-protocol[async]" + "IdentityResolver": "rex-protocol" }, "smithy_aws_core.identity.container": { - "AWSCredentialsIdentity": "rex-class", - "AWSIdentityProperties": "rex-class", - "ContainerCredentialsConfig": "class", - "ContainerCredentialsResolver": "class[async]", - "ContainerMetadataClient": "class[async]", - "Field": "rex-class", - "Fields": "rex-class", - "HTTPClient": "rex-protocol[async]", - "HTTPRequest": "rex-class[async]", - "HTTPResponse": "rex-protocol[async]", - "IdentityResolver": "rex-protocol[async]", - "SmithyIdentityError": "rex-exception", - "URI": "rex-class" + "ContainerCredentialsConfig": "class" }, "smithy_aws_core.identity.environment": { "AWSCredentialsIdentity": "rex-class", "AWSIdentityProperties": "rex-class", - "EnvironmentCredentialsResolver": "class[async]", - "IdentityResolver": "rex-protocol[async]", + "EnvironmentCredentialsResolver": "class", "SmithyIdentityError": "rex-exception" }, "smithy_aws_core.identity.imds": { - "AWSCredentialsIdentity": "rex-class", - "AWSIdentityProperties": "rex-class", - "Config": "class", - "EC2Metadata": "class[async]", - "Field": "rex-class", - "Fields": "rex-class", - "HTTPClient": "rex-protocol[async]", - "HTTPRequest": "rex-class[async]", - "IMDSCredentialsResolver": "class[async]", - "IdentityResolver": "rex-protocol[async]", - "RetryStrategy": "rex-protocol[async]", - "SimpleRetryStrategy": "rex-class[async]", - "SmithyIdentityError": "rex-exception", - "Token": "class", - "TokenCache": "class[async]", - "URI": "rex-class" - }, - "smithy_aws_core.identity.process": { - "AWSCredentialsIdentity": "rex-class", - "AWSIdentityProperties": "rex-class", - "IdentityResolver": "rex-protocol[async]", - "ProcessCredentialsResolver": "class[async]", - "SmithyIdentityError": "rex-exception" + "Token": "class" }, "smithy_aws_core.identity.static": { "AWSCredentialsIdentity": "rex-class", "AWSIdentityProperties": "rex-class", - "IdentityResolver": "rex-protocol[async]", + "IdentityResolver": "rex-protocol", "SmithyIdentityError": "rex-exception", - "StaticCredentialsResolver": "class[async]" + "StaticCredentialsResolver": "class" }, "smithy_aws_core.interceptors": {}, "smithy_aws_core.interceptors.user_agent": { @@ -526,17 +605,17 @@ "AWSEventPublisher": "class[async]", "AWSEventReceiver": "class[async]", "AsyncByteStream": "rex-protocol[async]", + "AsyncEventPublisher": "rex-protocol[async]", + "AsyncEventReceiver": "rex-protocol[async]", + "AsyncEventSigner": "rex-protocol[async]", + "AsyncIdentityResolver": "rex-protocol[async]", "AsyncWriter": "rex-protocol[async]", "Codec": "rex-protocol", "DeserializeableShape": "rex-protocol", "Event": "rex-class[async]", "EventError": "rex-exception", "EventMessage": "rex-class", - "EventPublisher": "rex-protocol[async]", - "EventReceiver": "rex-protocol[async]", - "EventSigner": "rex-protocol[async]", "ExpectationNotMetError": "rex-exception", - "IdentityResolver": "rex-protocol[async]", "SerializeableShape": "rex-protocol", "ShapeDeserializer": "rex-protocol", "SigningConfig": "class", @@ -630,37 +709,37 @@ "smithy_core.aio.client": { "APIOperation": "rex-class", "AUTH_SCHEME": "PropertyKey", - "AdaptiveRetryStrategy": "rex-class[async]", + "AsyncAdaptiveRetryStrategy": "rex-class[async]", + "AsyncAuthScheme": "rex-protocol", "AsyncClient": "class[async]", + "AsyncClientCall": "class", + "AsyncClientProtocol": "rex-protocol[async]", + "AsyncClientTransport": "rex-protocol[async]", + "AsyncDuplexEventStream": "rex-class[async]", + "AsyncEndpointResolver": "rex-protocol[async]", + "AsyncEventReceiver": "rex-protocol[async]", + "AsyncInputEventStream": "rex-class[async]", + "AsyncOutputEventStream": "rex-class[async]", + "AsyncRequestPipeline": "class[async]", + "AsyncRetryStrategy": "rex-protocol[async]", + "AsyncRetryStrategyResolver": "rex-class[async]", "AuthOption": "rex-protocol", "AuthParams": "rex-class", - "AuthScheme": "rex-protocol", "AuthSchemeResolver": "rex-protocol", - "ClientCall": "class", - "ClientProtocol": "rex-protocol[async]", "ClientTimeoutError": "rex-exception", - "ClientTransport": "rex-protocol[async]", "DeserializeableShape": "rex-protocol", - "DuplexEventStream": "rex-class[async]", "Endpoint": "rex-protocol", - "EndpointResolver": "rex-protocol[async]", "EndpointResolverParams": "rex-class", - "EventReceiver": "rex-protocol[async]", "InputContext": "rex-class", - "InputEventStream": "rex-class[async]", "Interceptor": "rex-class", "InterceptorChain": "rex-class", "OutputContext": "rex-class", - "OutputEventStream": "rex-class[async]", "PropertyKey": "rex-class", "Request": "rex-protocol[async]", "RequestContext": "rex-class", - "RequestPipeline": "class[async]", "Response": "rex-protocol[async]", "ResponseContext": "rex-class", "RetryError": "rex-exception", - "RetryStrategy": "rex-protocol[async]", - "RetryStrategyResolver": "rex-class[async]", "SerializeableShape": "rex-protocol", "ShapeDeserializer": "rex-protocol", "ShapeID": "rex-class", @@ -673,43 +752,46 @@ "seek": "rex-function[async]" }, "smithy_core.aio.endpoints": { + "AsyncEndpointResolver": "rex-protocol[async]", + "AsyncStaticEndpointResolver": "class[async]", "Endpoint": "rex-class", "EndpointResolutionError": "rex-exception", - "EndpointResolver": "rex-protocol[async]", "EndpointResolverParams": "rex-class", - "StaticEndpointResolver": "class[async]", "resolve_static_uri": "rex-function" }, "smithy_core.aio.eventstream": { + "AsyncDuplexEventStream": "class[async]", + "AsyncEventPublisher": "rex-protocol[async]", + "AsyncEventReceiver": "rex-protocol[async]", + "AsyncInputEventStream": "class[async]", + "AsyncOutputEventStream": "class[async]", "DeserializeableShape": "rex-protocol", "DuplexEventStream": "class[async]", - "EventPublisher": "rex-protocol[async]", - "EventReceiver": "rex-protocol[async]", "InputEventStream": "class[async]", "OutputEventStream": "class[async]", "SerializeableShape": "rex-protocol" }, "smithy_core.aio.identity": { - "CachingIdentityResolver": "class[async]", - "ChainedIdentityResolver": "class[async]", + "AsyncCachingIdentityResolver": "class[async]", + "AsyncChainedIdentityResolver": "class[async]", + "AsyncIdentityResolver": "rex-protocol[async]", "Identity": "rex-protocol", - "IdentityResolver": "rex-protocol[async]", "SmithyIdentityError": "rex-exception", "logger": "Logger" }, "smithy_core.aio.interfaces": { "AsyncByteStream": "protocol[async]", + "AsyncClientProtocol": "protocol[async]", + "AsyncClientTransport": "protocol[async]", + "AsyncDuplexClientTransport": "protocol[async]", + "AsyncEndpointResolver": "protocol[async]", + "AsyncEventPublisher": "rex-protocol[async]", + "AsyncEventReceiver": "rex-protocol[async]", "AsyncWriter": "protocol[async]", - "ClientProtocol": "protocol[async]", - "ClientTransport": "protocol[async]", - "DuplexClientTransport": "protocol[async]", "Endpoint": "rex-protocol", - "EndpointResolver": "protocol[async]", "EndpointResolverParams": "rex-class", - "EventPublisher": "rex-protocol[async]", - "EventReceiver": "rex-protocol[async]", "ProtocolConstructor": "rex-type_alias", - "ProtocolSettings": "class", + "ProtocolSettings": "rex-class", "Request": "protocol[async]", "Response": "protocol[async]", "StreamingBlob": "rex-type_alias", @@ -724,46 +806,46 @@ "retries": "rex-module" }, "smithy_core.aio.interfaces.auth": { - "AuthScheme": "protocol", - "EventSigner": "protocol[async]", + "AsyncAuthScheme": "protocol", + "AsyncEventSigner": "protocol[async]", + "AsyncIdentityResolver": "rex-protocol[async]", + "AsyncSigner": "protocol[async]", "Identity": "rex-protocol", - "IdentityResolver": "rex-protocol[async]", "Request": "rex-protocol[async]", - "ShapeID": "rex-class", - "Signer": "protocol[async]" + "ShapeID": "rex-class" }, "smithy_core.aio.interfaces.eventstream": { + "AsyncEventPublisher": "protocol[async]", + "AsyncEventReceiver": "protocol[async]", "DeserializeableShape": "rex-protocol", - "EventPublisher": "protocol[async]", - "EventReceiver": "protocol[async]", "SerializeableShape": "rex-protocol" }, "smithy_core.aio.interfaces.identity": { - "Identity": "rex-protocol", - "IdentityResolver": "protocol[async]" + "AsyncIdentityResolver": "protocol[async]", + "Identity": "rex-protocol" }, "smithy_core.aio.interfaces.retries": { + "AsyncRetryStrategy": "protocol[async]", "RetryBackoffStrategy": "rex-protocol", - "RetryStrategy": "protocol[async]", "RetryToken": "rex-protocol" }, "smithy_core.aio.retries": { - "AdaptiveRetryStrategy": "class[async]", - "ClientRateLimiter": "class[async]", + "AsyncAdaptiveRetryStrategy": "class[async]", + "AsyncClientRateLimiter": "class[async]", + "AsyncRequestRateTracker": "class[async]", + "AsyncRetryStrategy": "rex-protocol[async]", + "AsyncRetryStrategyResolver": "class[async]", + "AsyncSimpleRetryStrategy": "class[async]", + "AsyncStandardRetryStrategy": "class[async]", + "AsyncTokenBucket": "class[async]", "CubicCalculator": "rex-class", "ExponentialBackoffJitterType": "rex-class", "ExponentialRetryBackoffStrategy": "rex-class", - "RequestRateTracker": "class[async]", "RetryError": "rex-exception", - "RetryStrategy": "rex-protocol[async]", "RetryStrategyOptions": "rex-class", - "RetryStrategyResolver": "class[async]", - "SimpleRetryStrategy": "class[async]", "SimpleRetryToken": "rex-class", "StandardRetryQuota": "rex-class", - "StandardRetryStrategy": "class[async]", "StandardRetryToken": "rex-class", - "TokenBucket": "class[async]", "retries_interface": "rex-module" }, "smithy_core.aio.types": { @@ -877,8 +959,14 @@ "smithy_core.interfaces": { "BytesReader": "protocol", "BytesWriter": "protocol", + "ClientProtocol": "protocol", + "ClientTransport": "protocol", + "DuplexClientTransport": "protocol", "Endpoint": "protocol", + "EndpointResolver": "protocol", "PropertyKey": "protocol", + "ProtocolConstructor": "rex-type_alias", + "ProtocolSettings": "class", "SeekableBytesReader": "protocol", "StreamingBlob": "rex-type_alias", "TypedProperties": "protocol", @@ -891,21 +979,30 @@ }, "smithy_core.interfaces.auth": { "AuthOption": "protocol", + "AuthScheme": "protocol", "AuthSchemeResolver": "protocol", + "EventSigner": "protocol", "ShapeID": "rex-class", + "Signer": "protocol", "TypedProperties": "rex-protocol" }, + "smithy_core.interfaces.eventstream": { + "EventPublisher": "protocol", + "EventReceiver": "protocol" + }, "smithy_core.interfaces.exceptions": { "Fault": "rex-type_alias", "HasFault": "protocol" }, "smithy_core.interfaces.identity": { "Identity": "protocol", + "IdentityResolver": "protocol", "ensure_utc": "rex-function" }, "smithy_core.interfaces.retries": { "ErrorRetryInfo": "protocol", "RetryBackoffStrategy": "protocol", + "RetryStrategy": "protocol", "RetryToken": "protocol" }, "smithy_core.prelude": { @@ -1117,9 +1214,9 @@ "AIOHTTPClient": "class[async]", "AIOHTTPClientConfig": "class", "AsyncBytesReader": "rex-class[async]", + "AsyncHTTPClient": "rex-protocol[async]", "Field": "rex-class", "Fields": "rex-class", - "HTTPClient": "rex-protocol[async]", "HTTPClientConfiguration": "rex-class", "HTTPRequest": "rex-protocol[async]", "HTTPRequestConfiguration": "rex-class", @@ -1132,20 +1229,20 @@ }, "smithy_http.aio.auth": {}, "smithy_http.aio.auth.apikey": { - "APIKeyAuthScheme": "class", "APIKeyIdentity": "rex-class", "APIKeyIdentityProperties": "rex-class", "APIKeyLocation": "rex-class", "APIKeyResolverConfig": "protocol", - "APIKeySigner": "class[async]", "API_KEY_RESOLVER_CONFIG": "PropertyKey", - "AuthScheme": "rex-protocol", + "AsyncAPIKeyAuthScheme": "class", + "AsyncAPIKeySigner": "class[async]", + "AsyncAuthScheme": "rex-protocol", + "AsyncIdentityResolver": "rex-protocol[async]", + "AsyncSigner": "rex-protocol[async]", "Field": "rex-class", "HTTPAPIKeyAuthTrait": "rex-class", "HTTPRequest": "rex-protocol[async]", - "IdentityResolver": "rex-protocol[async]", "PropertyKey": "rex-class", - "Signer": "rex-protocol[async]", "SmithyIdentityError": "rex-exception", "URI": "rex-class" }, @@ -1167,20 +1264,18 @@ "http_interfaces": "rex-module", "read_streaming_blob_async": "rex-function[async]" }, - "smithy_http.aio.identity": { - "apikey": "rex-module" - }, + "smithy_http.aio.identity": {}, "smithy_http.aio.identity.apikey": { - "APIKeyIdentity": "class", - "APIKeyIdentityProperties": "class", - "APIKeyIdentityResolver": "class[async]", - "Identity": "rex-protocol", - "IdentityResolver": "rex-protocol[async]", + "APIKeyIdentity": "rex-class", + "APIKeyIdentityProperties": "rex-class", + "AsyncAPIKeyIdentityResolver": "class[async]", + "AsyncIdentityResolver": "rex-protocol[async]", "SmithyIdentityError": "rex-exception" }, "smithy_http.aio.interfaces": { "APIOperation": "rex-class", - "ClientTransport": "rex-protocol[async]", + "AsyncClientTransport": "rex-protocol[async]", + "AsyncHTTPClient": "protocol[async]", "Fields": "rex-protocol", "HTTPClient": "protocol[async]", "HTTPClientConfiguration": "rex-class", @@ -1198,22 +1293,26 @@ "APIOperation": "rex-class", "AWSEventPublisher": "rex-class[async]", "AWSEventReceiver": "rex-class[async]", + "AsyncAuthScheme": "rex-protocol", "AsyncByteStream": "rex-protocol[async]", "AsyncBytesProvider": "rex-class[async]", "AsyncBytesReader": "rex-class[async]", + "AsyncClientProtocol": "rex-protocol[async]", + "AsyncEventPublisher": "rex-protocol[async]", + "AsyncEventReceiver": "rex-protocol[async]", + "AsyncHttpBindingClientProtocol": "class[async]", + "AsyncHttpClientProtocol": "class[async]", + "AsyncRpcClientProtocol": "class[async]", + "AsyncRpcV2CborClientProtocol": "class[async]", "AsyncStreamingBlob": "rex-type_alias", "AsyncWriter": "rex-protocol[async]", - "AuthScheme": "rex-protocol", "CBORCodec": "rex-class", "CallError": "rex-exception", - "ClientProtocol": "rex-protocol[async]", "Codec": "rex-protocol", "DOCUMENT": "rex-Schema", "DefaultTrait": "rex-class", "DeserializeableShape": "rex-protocol", "Endpoint": "rex-protocol", - "EventPublisher": "rex-protocol[async]", - "EventReceiver": "rex-protocol[async]", "ExpectationNotMetError": "rex-exception", "HTTPBindingSerializer": "rex-class", "HTTPErrorIdentifier": "rex-class", @@ -1223,8 +1322,6 @@ "HTTPResponseDeserializer": "rex-class", "HTTP_BINDING_SCHEMA_EXTENSION": "rex-SchemaExtension", "HTTP_OPERATION_SCHEMA_EXTENSION": "rex-SchemaExtension", - "HttpBindingClientProtocol": "class[async]", - "HttpClientProtocol": "class[async]", "MissingDependencyError": "rex-exception", "MissingInitialResponse": "rex-exception", "ModeledError": "rex-exception", @@ -1233,8 +1330,6 @@ "ProtocolSettings": "rex-class", "RequiredTrait": "rex-class", "ResponseMetadata": "rex-class", - "RpcClientProtocol": "class[async]", - "RpcV2CborClientProtocol": "class[async]", "RpcV2CborTrait": "rex-class", "Schema": "rex-class", "SeekableBytesReader": "rex-protocol", @@ -1259,6 +1354,11 @@ "expect_type": "rex-function", "parse_rest_json_error_info": "function[async]" }, + "smithy_http.auth": {}, + "smithy_http.auth.apikey": { + "APIKeyAuthScheme": "class", + "APIKeySigner": "class" + }, "smithy_http.bindings": { "Binding": "class", "ErrorFault": "rex-class", @@ -1324,6 +1424,12 @@ "SmithyError": "rex-exception", "SmithyHTTPError": "exception" }, + "smithy_http.identity": { + "APIKeyIdentity": "class", + "APIKeyIdentityProperties": "class", + "APIKeyIdentityResolver": "class", + "Identity": "rex-protocol" + }, "smithy_http.interceptors": { "user_agent": "rex-module" }, @@ -1344,6 +1450,7 @@ "Field": "protocol", "FieldPosition": "type_alias", "Fields": "protocol", + "HTTPClient": "protocol", "HTTPClientConfiguration": "class", "HTTPRequestConfiguration": "class", "QueryParamsList": "type_alias" @@ -1353,6 +1460,11 @@ "UserAgentInterceptor": "rex-class", "user_agent_plugin": "function" }, + "smithy_http.protocols": { + "HttpBindingClientProtocol": "class", + "HttpClientProtocol": "class", + "RpcV2CborClientProtocol": "class" + }, "smithy_http.restjson": { "DocumentValue": "rex-type_alias", "RestJsonErrorInfo": "class" @@ -1444,7 +1556,7 @@ "utils": "rex-module" }, "smithy_http.testing.mockhttp": { - "HTTPClient": "rex-protocol[async]", + "AsyncHTTPClient": "rex-protocol[async]", "HTTPClientConfiguration": "rex-class", "HTTPRequest": "rex-protocol[async]", "HTTPRequestConfiguration": "rex-class",