From 89af039186e6b1067ce20f58927e9d992ed6739b Mon Sep 17 00:00:00 2001 From: jonathan343 Date: Sat, 15 Aug 2026 19:57:54 -0400 Subject: [PATCH 1/2] test using the new config object --- .../aws-sdk-bedrock-runtime/tests/integration/__init__.py | 6 +++--- .../tests/integration/test_bidirectional_streaming.py | 2 +- .../tests/integration/test_non_streaming.py | 2 +- .../tests/integration/test_output_streaming.py | 2 +- .../aws-sdk-connecthealth/tests/integration/__init__.py | 8 ++++---- .../aws-sdk-connecthealth/tests/integration/conftest.py | 2 +- .../tests/integration/test_bidirectional_streaming.py | 2 +- .../tests/integration/test_non_streaming.py | 8 ++++---- .../aws-sdk-lex-runtime-v2/tests/integration/__init__.py | 6 +++--- .../tests/integration/test_bidirectional_streaming.py | 2 +- .../tests/integration/test_non_streaming.py | 2 +- clients/aws-sdk-polly/examples/stream_speech_to_file.py | 4 ++-- .../aws-sdk-polly/examples/stream_speech_to_speakers.py | 4 ++-- clients/aws-sdk-polly/tests/integration/__init__.py | 6 +++--- .../tests/integration/test_bidirectional_streaming.py | 2 +- .../aws-sdk-polly/tests/integration/test_non_streaming.py | 2 +- .../tests/integration/test_output_streaming.py | 2 +- clients/aws-sdk-qbusiness/tests/integration/__init__.py | 6 +++--- clients/aws-sdk-qbusiness/tests/integration/conftest.py | 2 +- .../tests/integration/test_bidirectional_streaming.py | 2 +- .../tests/integration/test_non_streaming.py | 2 +- .../aws-sdk-transcribe-streaming/examples/simple_file.py | 4 ++-- .../aws-sdk-transcribe-streaming/examples/simple_mic.py | 4 ++-- .../tests/integration/__init__.py | 6 +++--- .../tests/integration/test_bidirectional_streaming.py | 2 +- .../tests/integration/test_non_streaming.py | 2 +- 26 files changed, 46 insertions(+), 46 deletions(-) diff --git a/clients/aws-sdk-bedrock-runtime/tests/integration/__init__.py b/clients/aws-sdk-bedrock-runtime/tests/integration/__init__.py index 44217f9..c932637 100644 --- a/clients/aws-sdk-bedrock-runtime/tests/integration/__init__.py +++ b/clients/aws-sdk-bedrock-runtime/tests/integration/__init__.py @@ -7,7 +7,7 @@ from smithy_aws_core.identity import EnvironmentCredentialsResolver from aws_sdk_bedrock_runtime.client import BedrockRuntimeClient -from aws_sdk_bedrock_runtime.config import Config +from aws_sdk_bedrock_runtime.config import AsyncBedrockRuntimeConfig MODEL_ID = "global.amazon.nova-2-lite-v1:0" BIDIRECTIONAL_MODEL_ID = "amazon.nova-2-sonic-v1:0" @@ -15,10 +15,10 @@ AUDIO_FILE = Path(__file__).parent / "assets" / "test.pcm" -def create_bedrock_client(region: str) -> BedrockRuntimeClient: +async def create_bedrock_client(region: str) -> BedrockRuntimeClient: """Helper to create a BedrockRuntimeClient for a given region.""" return BedrockRuntimeClient( - config=Config( + config=await AsyncBedrockRuntimeConfig.resolve( endpoint_uri=f"https://bedrock-runtime.{region}.amazonaws.com", region=region, aws_credentials_identity_resolver=EnvironmentCredentialsResolver(), diff --git a/clients/aws-sdk-bedrock-runtime/tests/integration/test_bidirectional_streaming.py b/clients/aws-sdk-bedrock-runtime/tests/integration/test_bidirectional_streaming.py index 67f6955..9f12aea 100644 --- a/clients/aws-sdk-bedrock-runtime/tests/integration/test_bidirectional_streaming.py +++ b/clients/aws-sdk-bedrock-runtime/tests/integration/test_bidirectional_streaming.py @@ -244,7 +244,7 @@ async def _receive_stream_output( async def test_invoke_model_with_bidirectional_stream() -> None: """Test bidirectional streaming with audio input and text/audio output.""" - bedrock_client = create_bedrock_client("us-east-1") + bedrock_client = await create_bedrock_client("us-east-1") stream = await bedrock_client.invoke_model_with_bidirectional_stream( InvokeModelWithBidirectionalStreamOperationInput( diff --git a/clients/aws-sdk-bedrock-runtime/tests/integration/test_non_streaming.py b/clients/aws-sdk-bedrock-runtime/tests/integration/test_non_streaming.py index aefb9de..c8567d2 100644 --- a/clients/aws-sdk-bedrock-runtime/tests/integration/test_non_streaming.py +++ b/clients/aws-sdk-bedrock-runtime/tests/integration/test_non_streaming.py @@ -15,7 +15,7 @@ async def test_converse() -> None: - bedrock_client = create_bedrock_client("us-west-2") + bedrock_client = await create_bedrock_client("us-west-2") input_message = Message(role="user", content=[ContentBlockText(value=MESSAGE)]) response = await bedrock_client.converse( diff --git a/clients/aws-sdk-bedrock-runtime/tests/integration/test_output_streaming.py b/clients/aws-sdk-bedrock-runtime/tests/integration/test_output_streaming.py index b06b53e..1312d8e 100644 --- a/clients/aws-sdk-bedrock-runtime/tests/integration/test_output_streaming.py +++ b/clients/aws-sdk-bedrock-runtime/tests/integration/test_output_streaming.py @@ -17,7 +17,7 @@ async def test_converse_stream() -> None: - bedrock_client = create_bedrock_client("us-west-2") + bedrock_client = await create_bedrock_client("us-west-2") input_message = Message(role="user", content=[ContentBlockText(value=MESSAGE)]) response = await bedrock_client.converse_stream( diff --git a/clients/aws-sdk-connecthealth/tests/integration/__init__.py b/clients/aws-sdk-connecthealth/tests/integration/__init__.py index 10673d0..6ef5fe1 100644 --- a/clients/aws-sdk-connecthealth/tests/integration/__init__.py +++ b/clients/aws-sdk-connecthealth/tests/integration/__init__.py @@ -6,15 +6,15 @@ from smithy_aws_core.identity import EnvironmentCredentialsResolver from aws_sdk_connecthealth.client import ConnectHealthClient -from aws_sdk_connecthealth.config import Config, Plugin +from aws_sdk_connecthealth.config import AsyncConnectHealthConfig, Plugin REGION = "us-east-1" AUDIO_FILE = Path(__file__).parent / "assets" / "test.wav" -def create_connecthealth_client(region: str) -> ConnectHealthClient: +async def create_connecthealth_client(region: str) -> ConnectHealthClient: return ConnectHealthClient( - config=Config( + config=await AsyncConnectHealthConfig.resolve( endpoint_uri=f"https://health-agent.{region}.api.aws", region=region, aws_credentials_identity_resolver=EnvironmentCredentialsResolver(), @@ -26,7 +26,7 @@ def streaming_endpoint_plugin(region: str) -> Plugin: """Per-operation plugin that routes to the ``streaming.`` host prefix.""" streaming_uri = f"https://streaming.health-agent.{region}.api.aws" - def _plugin(config: Config) -> None: + def _plugin(config: AsyncConnectHealthConfig) -> None: config.endpoint_uri = streaming_uri return _plugin diff --git a/clients/aws-sdk-connecthealth/tests/integration/conftest.py b/clients/aws-sdk-connecthealth/tests/integration/conftest.py index 49618dd..39ef145 100644 --- a/clients/aws-sdk-connecthealth/tests/integration/conftest.py +++ b/clients/aws-sdk-connecthealth/tests/integration/conftest.py @@ -153,7 +153,7 @@ async def connecthealth_resources(): bucket_name = f"integ-test-connecthealth-bucket-{unique_suffix}" s3_client = boto3.client("s3", region_name=REGION) - client = create_connecthealth_client(REGION) + client = await create_connecthealth_client(REGION) domain_id: str | None = None subscription_id: str | None = None diff --git a/clients/aws-sdk-connecthealth/tests/integration/test_bidirectional_streaming.py b/clients/aws-sdk-connecthealth/tests/integration/test_bidirectional_streaming.py index eae2df4..1c230b7 100644 --- a/clients/aws-sdk-connecthealth/tests/integration/test_bidirectional_streaming.py +++ b/clients/aws-sdk-connecthealth/tests/integration/test_bidirectional_streaming.py @@ -157,7 +157,7 @@ async def test_start_medical_scribe_listening_session(connecthealth_resources) - """Test bidirectional streaming with audio input and transcript output.""" domain_id, subscription_id, output_s3_uri = connecthealth_resources - client = create_connecthealth_client(REGION) + client = await create_connecthealth_client(REGION) endpoint_plugin = streaming_endpoint_plugin(REGION) session_id = str(uuid.uuid4()) diff --git a/clients/aws-sdk-connecthealth/tests/integration/test_non_streaming.py b/clients/aws-sdk-connecthealth/tests/integration/test_non_streaming.py index 3365dfd..5085a1e 100644 --- a/clients/aws-sdk-connecthealth/tests/integration/test_non_streaming.py +++ b/clients/aws-sdk-connecthealth/tests/integration/test_non_streaming.py @@ -23,7 +23,7 @@ async def test_list_domains(connecthealth_resources) -> None: """Test non-streaming ListDomains operation.""" _ = connecthealth_resources - client = create_connecthealth_client(REGION) + client = await create_connecthealth_client(REGION) response = await client.list_domains(input=ListDomainsInput()) @@ -35,7 +35,7 @@ async def test_list_domains(connecthealth_resources) -> None: async def test_get_domain(connecthealth_resources) -> None: """Test non-streaming GetDomain operation.""" domain_id, _, _ = connecthealth_resources - client = create_connecthealth_client(REGION) + client = await create_connecthealth_client(REGION) response = await client.get_domain(input=GetDomainInput(domain_id=domain_id)) @@ -54,7 +54,7 @@ async def test_get_domain(connecthealth_resources) -> None: async def test_list_subscriptions(connecthealth_resources) -> None: """Test non-streaming ListSubscriptions operation.""" domain_id, subscription_id, _ = connecthealth_resources - client = create_connecthealth_client(REGION) + client = await create_connecthealth_client(REGION) response = await client.list_subscriptions( input=ListSubscriptionsInput(domain_id=domain_id) @@ -72,7 +72,7 @@ async def test_list_subscriptions(connecthealth_resources) -> None: async def test_get_subscription(connecthealth_resources) -> None: """Test non-streaming GetSubscription operation.""" domain_id, subscription_id, _ = connecthealth_resources - client = create_connecthealth_client(REGION) + client = await create_connecthealth_client(REGION) response = await client.get_subscription( input=GetSubscriptionInput(domain_id=domain_id, subscription_id=subscription_id) diff --git a/clients/aws-sdk-lex-runtime-v2/tests/integration/__init__.py b/clients/aws-sdk-lex-runtime-v2/tests/integration/__init__.py index 0da32eb..80af586 100644 --- a/clients/aws-sdk-lex-runtime-v2/tests/integration/__init__.py +++ b/clients/aws-sdk-lex-runtime-v2/tests/integration/__init__.py @@ -4,16 +4,16 @@ from smithy_aws_core.identity import EnvironmentCredentialsResolver from aws_sdk_lex_runtime_v2.client import LexRuntimeV2Client -from aws_sdk_lex_runtime_v2.config import Config +from aws_sdk_lex_runtime_v2.config import AsyncLexRuntimeV2Config BOT_ALIAS_ID = "TSTALIASID" LOCALE_ID = "en_US" REGION = "us-east-1" -def create_lex_client(region: str) -> LexRuntimeV2Client: +async def create_lex_client(region: str) -> LexRuntimeV2Client: return LexRuntimeV2Client( - config=Config( + config=await AsyncLexRuntimeV2Config.resolve( endpoint_uri=f"https://runtime-v2-lex.{region}.amazonaws.com", region=region, aws_credentials_identity_resolver=EnvironmentCredentialsResolver(), diff --git a/clients/aws-sdk-lex-runtime-v2/tests/integration/test_bidirectional_streaming.py b/clients/aws-sdk-lex-runtime-v2/tests/integration/test_bidirectional_streaming.py index fc12bea..25fcd2e 100644 --- a/clients/aws-sdk-lex-runtime-v2/tests/integration/test_bidirectional_streaming.py +++ b/clients/aws-sdk-lex-runtime-v2/tests/integration/test_bidirectional_streaming.py @@ -125,7 +125,7 @@ async def _receive_events( async def test_start_conversation(lex_bot: str) -> None: """Test bidirectional streaming StartConversation operation.""" - client = create_lex_client(REGION) + client = await create_lex_client(REGION) stream = await client.start_conversation( input=StartConversationInput( diff --git a/clients/aws-sdk-lex-runtime-v2/tests/integration/test_non_streaming.py b/clients/aws-sdk-lex-runtime-v2/tests/integration/test_non_streaming.py index d3abd05..f8b39d7 100644 --- a/clients/aws-sdk-lex-runtime-v2/tests/integration/test_non_streaming.py +++ b/clients/aws-sdk-lex-runtime-v2/tests/integration/test_non_streaming.py @@ -11,7 +11,7 @@ async def test_recognize_text(lex_bot: str) -> None: """Test non-streaming RecognizeText operation.""" - client = create_lex_client(REGION) + client = await create_lex_client(REGION) response = await client.recognize_text( input=RecognizeTextInput( bot_id=lex_bot, diff --git a/clients/aws-sdk-polly/examples/stream_speech_to_file.py b/clients/aws-sdk-polly/examples/stream_speech_to_file.py index 642bff6..ac80611 100644 --- a/clients/aws-sdk-polly/examples/stream_speech_to_file.py +++ b/clients/aws-sdk-polly/examples/stream_speech_to_file.py @@ -36,7 +36,7 @@ from smithy_core.aio.interfaces.eventstream import EventPublisher, EventReceiver from aws_sdk_polly.client import PollyClient -from aws_sdk_polly.config import Config +from aws_sdk_polly.config import AsyncPollyConfig from aws_sdk_polly.models import ( CloseStreamEvent, StartSpeechSynthesisStreamActionStream, @@ -133,7 +133,7 @@ async def main(): text_chunks = get_text_chunks(args.text) client = PollyClient( - config=Config( + config=await AsyncPollyConfig.resolve( endpoint_uri=f"https://polly.{args.region}.amazonaws.com", region=args.region, aws_credentials_identity_resolver=EnvironmentCredentialsResolver(), diff --git a/clients/aws-sdk-polly/examples/stream_speech_to_speakers.py b/clients/aws-sdk-polly/examples/stream_speech_to_speakers.py index 0bc72a3..d7ed2ec 100644 --- a/clients/aws-sdk-polly/examples/stream_speech_to_speakers.py +++ b/clients/aws-sdk-polly/examples/stream_speech_to_speakers.py @@ -40,7 +40,7 @@ from smithy_core.aio.interfaces.eventstream import EventPublisher, EventReceiver from aws_sdk_polly.client import PollyClient -from aws_sdk_polly.config import Config +from aws_sdk_polly.config import AsyncPollyConfig from aws_sdk_polly.models import ( CloseStreamEvent, StartSpeechSynthesisStreamActionStream, @@ -239,7 +239,7 @@ async def main(): text_chunks = get_text_chunks(args.text) client = PollyClient( - config=Config( + config=await AsyncPollyConfig.resolve( endpoint_uri=f"https://polly.{args.region}.amazonaws.com", region=args.region, aws_credentials_identity_resolver=EnvironmentCredentialsResolver(), diff --git a/clients/aws-sdk-polly/tests/integration/__init__.py b/clients/aws-sdk-polly/tests/integration/__init__.py index 57dc918..66b167b 100644 --- a/clients/aws-sdk-polly/tests/integration/__init__.py +++ b/clients/aws-sdk-polly/tests/integration/__init__.py @@ -4,7 +4,7 @@ from smithy_aws_core.identity import EnvironmentCredentialsResolver from aws_sdk_polly.client import PollyClient -from aws_sdk_polly.config import Config +from aws_sdk_polly.config import AsyncPollyConfig REGION = "us-east-1" VOICE_ID = "Matthew" @@ -14,10 +14,10 @@ TEST_TEXT = "Hello from the AWS SDK for Python Polly integration tests." -def create_polly_client(region: str) -> PollyClient: +async def create_polly_client(region: str) -> PollyClient: """Helper to create a PollyClient for a given region.""" return PollyClient( - config=Config( + config=await AsyncPollyConfig.resolve( endpoint_uri=f"https://polly.{region}.amazonaws.com", region=region, aws_credentials_identity_resolver=EnvironmentCredentialsResolver(), diff --git a/clients/aws-sdk-polly/tests/integration/test_bidirectional_streaming.py b/clients/aws-sdk-polly/tests/integration/test_bidirectional_streaming.py index ef41d47..0aa8030 100644 --- a/clients/aws-sdk-polly/tests/integration/test_bidirectional_streaming.py +++ b/clients/aws-sdk-polly/tests/integration/test_bidirectional_streaming.py @@ -96,7 +96,7 @@ async def _receive_audio( async def test_start_speech_synthesis_stream() -> None: """Test bidirectional streaming with text input and audio output.""" - client = create_polly_client(REGION) + client = await create_polly_client(REGION) stream = await client.start_speech_synthesis_stream( input=StartSpeechSynthesisStreamInput( diff --git a/clients/aws-sdk-polly/tests/integration/test_non_streaming.py b/clients/aws-sdk-polly/tests/integration/test_non_streaming.py index 8143f72..825440b 100644 --- a/clients/aws-sdk-polly/tests/integration/test_non_streaming.py +++ b/clients/aws-sdk-polly/tests/integration/test_non_streaming.py @@ -10,7 +10,7 @@ async def test_describe_voices() -> None: """Test non-streaming DescribeVoices operation.""" - client = create_polly_client(REGION) + client = await create_polly_client(REGION) response = await client.describe_voices(input=DescribeVoicesInput(engine=ENGINE)) diff --git a/clients/aws-sdk-polly/tests/integration/test_output_streaming.py b/clients/aws-sdk-polly/tests/integration/test_output_streaming.py index d844602..a83ed8c 100644 --- a/clients/aws-sdk-polly/tests/integration/test_output_streaming.py +++ b/clients/aws-sdk-polly/tests/integration/test_output_streaming.py @@ -20,7 +20,7 @@ async def test_synthesize_speech() -> None: """Test output-streaming SynthesizeSpeech operation.""" - client = create_polly_client(REGION) + client = await create_polly_client(REGION) response = await client.synthesize_speech( input=SynthesizeSpeechInput( diff --git a/clients/aws-sdk-qbusiness/tests/integration/__init__.py b/clients/aws-sdk-qbusiness/tests/integration/__init__.py index 4f44e2c..6930af3 100644 --- a/clients/aws-sdk-qbusiness/tests/integration/__init__.py +++ b/clients/aws-sdk-qbusiness/tests/integration/__init__.py @@ -4,15 +4,15 @@ from smithy_aws_core.identity import EnvironmentCredentialsResolver from aws_sdk_qbusiness.client import QBusinessClient -from aws_sdk_qbusiness.config import Config +from aws_sdk_qbusiness.config import AsyncQBusinessConfig REGION = "us-east-1" -def create_qbusiness_client(region: str) -> QBusinessClient: +async def create_qbusiness_client(region: str) -> QBusinessClient: """Helper to create a QBusinessClient for a given region.""" return QBusinessClient( - config=Config( + config=await AsyncQBusinessConfig.resolve( endpoint_uri=f"https://qbusiness.{region}.api.aws", region=region, aws_credentials_identity_resolver=EnvironmentCredentialsResolver(), diff --git a/clients/aws-sdk-qbusiness/tests/integration/conftest.py b/clients/aws-sdk-qbusiness/tests/integration/conftest.py index c8d7b44..4209e37 100644 --- a/clients/aws-sdk-qbusiness/tests/integration/conftest.py +++ b/clients/aws-sdk-qbusiness/tests/integration/conftest.py @@ -207,7 +207,7 @@ async def qbusiness_app(): index_name = f"integ-test-qbusiness-index-{unique_suffix}" retriever_name = f"integ-test-qbusiness-retriever-{unique_suffix}" - client = create_qbusiness_client(REGION) + client = await create_qbusiness_client(REGION) application_id: str | None = None try: application_id = await _create_qbusiness_app( diff --git a/clients/aws-sdk-qbusiness/tests/integration/test_bidirectional_streaming.py b/clients/aws-sdk-qbusiness/tests/integration/test_bidirectional_streaming.py index 3da172e..9b458eb 100644 --- a/clients/aws-sdk-qbusiness/tests/integration/test_bidirectional_streaming.py +++ b/clients/aws-sdk-qbusiness/tests/integration/test_bidirectional_streaming.py @@ -94,7 +94,7 @@ async def _receive_chat_output( async def test_chat_bidirectional_streaming(qbusiness_app: str) -> None: """Test bidirectional streaming with text input and chat output.""" - qbusiness_client = create_qbusiness_client(REGION) + qbusiness_client = await create_qbusiness_client(REGION) stream = await qbusiness_client.chat( input=ChatInput(application_id=qbusiness_app, client_token=str(uuid.uuid4())) diff --git a/clients/aws-sdk-qbusiness/tests/integration/test_non_streaming.py b/clients/aws-sdk-qbusiness/tests/integration/test_non_streaming.py index 3fb429b..4e3c166 100644 --- a/clients/aws-sdk-qbusiness/tests/integration/test_non_streaming.py +++ b/clients/aws-sdk-qbusiness/tests/integration/test_non_streaming.py @@ -12,7 +12,7 @@ async def test_chat_sync(qbusiness_app: str) -> None: """Test non-streaming ChatSync operation.""" - qbusiness_client = create_qbusiness_client(REGION) + qbusiness_client = await create_qbusiness_client(REGION) response = await qbusiness_client.chat_sync( input=ChatSyncInput( diff --git a/clients/aws-sdk-transcribe-streaming/examples/simple_file.py b/clients/aws-sdk-transcribe-streaming/examples/simple_file.py index 8c3fe6d..eb353b9 100644 --- a/clients/aws-sdk-transcribe-streaming/examples/simple_file.py +++ b/clients/aws-sdk-transcribe-streaming/examples/simple_file.py @@ -37,7 +37,7 @@ StartStreamTranscriptionInput, TranscribeStreamingClient, ) -from aws_sdk_transcribe_streaming.config import Config +from aws_sdk_transcribe_streaming.config import AsyncTranscribeStreamingConfig from aws_sdk_transcribe_streaming.models import ( AudioEvent, AudioStream, @@ -118,7 +118,7 @@ async def write_chunks(audio_stream: EventPublisher[AudioStream]): async def main(): # Initialize the Transcribe Streaming client client = TranscribeStreamingClient( - config=Config( + config=await AsyncTranscribeStreamingConfig.resolve( endpoint_uri=ENDPOINT_URI, region=AWS_REGION, aws_credentials_identity_resolver=EnvironmentCredentialsResolver(), diff --git a/clients/aws-sdk-transcribe-streaming/examples/simple_mic.py b/clients/aws-sdk-transcribe-streaming/examples/simple_mic.py index 3dca9fd..2d2fa56 100644 --- a/clients/aws-sdk-transcribe-streaming/examples/simple_mic.py +++ b/clients/aws-sdk-transcribe-streaming/examples/simple_mic.py @@ -37,7 +37,7 @@ StartStreamTranscriptionInput, TranscribeStreamingClient, ) -from aws_sdk_transcribe_streaming.config import Config +from aws_sdk_transcribe_streaming.config import AsyncTranscribeStreamingConfig from aws_sdk_transcribe_streaming.models import ( AudioEvent, AudioStream, @@ -116,7 +116,7 @@ async def write_chunks(audio_stream: EventPublisher[AudioStream]): async def main(): # Initialize the Transcribe Streaming client client = TranscribeStreamingClient( - config=Config( + config=await AsyncTranscribeStreamingConfig.resolve( endpoint_uri=ENDPOINT_URI, region=AWS_REGION, aws_credentials_identity_resolver=EnvironmentCredentialsResolver(), diff --git a/clients/aws-sdk-transcribe-streaming/tests/integration/__init__.py b/clients/aws-sdk-transcribe-streaming/tests/integration/__init__.py index d5b39d3..02e9789 100644 --- a/clients/aws-sdk-transcribe-streaming/tests/integration/__init__.py +++ b/clients/aws-sdk-transcribe-streaming/tests/integration/__init__.py @@ -6,15 +6,15 @@ from smithy_aws_core.identity import EnvironmentCredentialsResolver from aws_sdk_transcribe_streaming.client import TranscribeStreamingClient -from aws_sdk_transcribe_streaming.config import Config +from aws_sdk_transcribe_streaming.config import AsyncTranscribeStreamingConfig AUDIO_FILE = Path(__file__).parent / "assets" / "test.wav" -def create_transcribe_client(region: str) -> TranscribeStreamingClient: +async def create_transcribe_client(region: str) -> TranscribeStreamingClient: """Helper to create a TranscribeStreamingClient for a given region.""" return TranscribeStreamingClient( - config=Config( + config=await AsyncTranscribeStreamingConfig.resolve( endpoint_uri=f"https://transcribestreaming.{region}.amazonaws.com", region=region, aws_credentials_identity_resolver=EnvironmentCredentialsResolver(), diff --git a/clients/aws-sdk-transcribe-streaming/tests/integration/test_bidirectional_streaming.py b/clients/aws-sdk-transcribe-streaming/tests/integration/test_bidirectional_streaming.py index b58a014..49055a8 100644 --- a/clients/aws-sdk-transcribe-streaming/tests/integration/test_bidirectional_streaming.py +++ b/clients/aws-sdk-transcribe-streaming/tests/integration/test_bidirectional_streaming.py @@ -88,7 +88,7 @@ async def _receive_transcription_output( async def test_start_stream_transcription() -> None: """Test bidirectional streaming with audio input and transcription output.""" - transcribe_client = create_transcribe_client("us-west-2") + transcribe_client = await create_transcribe_client("us-west-2") stream = await transcribe_client.start_stream_transcription( input=StartStreamTranscriptionInput( diff --git a/clients/aws-sdk-transcribe-streaming/tests/integration/test_non_streaming.py b/clients/aws-sdk-transcribe-streaming/tests/integration/test_non_streaming.py index ee5e3ef..9c476e6 100644 --- a/clients/aws-sdk-transcribe-streaming/tests/integration/test_non_streaming.py +++ b/clients/aws-sdk-transcribe-streaming/tests/integration/test_non_streaming.py @@ -43,7 +43,7 @@ async def _run_medical_scribe_session(role_arn: str, s3_bucket: str) -> None: """Run a full Medical Scribe streaming session and verify its completion.""" - transcribe_client = create_transcribe_client("us-east-1") + transcribe_client = await create_transcribe_client("us-east-1") session_id = str(uuid.uuid4()) stream = await transcribe_client.start_medical_scribe_stream( From a2db5fc082ad16e5cc630ab47181944fceaafc57 Mon Sep 17 00:00:00 2001 From: aws-sdk-python-automation Date: Wed, 19 Aug 2026 08:59:11 +0000 Subject: [PATCH 2/2] Release 2026-08-19 --- .../aws-sdk-api-gateway/.changes/0.10.0.json | 8 + clients/aws-sdk-api-gateway/CHANGELOG.md | 5 + clients/aws-sdk-api-gateway/pyproject.toml | 4 +- .../scripts/docs/generate_doc_stubs.py | 56 +- .../src/aws_sdk_api_gateway/__init__.py | 2 +- .../src/aws_sdk_api_gateway/accept_header.py | 4 +- .../src/aws_sdk_api_gateway/client.py | 3390 ++++++++++--- .../src/aws_sdk_api_gateway/config.py | 219 +- .../src/aws_sdk_api_gateway/user_agent.py | 4 +- ..._protocol.py => test_restjson_protocol.py} | 0 .../.changes/0.10.0.json | 8 + .../CHANGELOG.md | 5 + .../pyproject.toml | 4 +- .../scripts/docs/generate_doc_stubs.py | 56 +- .../aws_sdk_bedrock_agent_runtime/__init__.py | 2 +- .../aws_sdk_bedrock_agent_runtime/client.py | 933 +++- .../aws_sdk_bedrock_agent_runtime/config.py | 219 +- .../aws_sdk_bedrock_agent_runtime/models.py | 16 +- .../user_agent.py | 4 +- ..._protocol.py => test_restjson_protocol.py} | 0 .../.changes/0.10.0.json | 8 + clients/aws-sdk-bedrock-agent/CHANGELOG.md | 5 + clients/aws-sdk-bedrock-agent/pyproject.toml | 4 +- .../scripts/docs/generate_doc_stubs.py | 56 +- .../src/aws_sdk_bedrock_agent/__init__.py | 2 +- .../src/aws_sdk_bedrock_agent/client.py | 2067 ++++++-- .../src/aws_sdk_bedrock_agent/config.py | 219 +- .../src/aws_sdk_bedrock_agent/models.py | 4 +- .../src/aws_sdk_bedrock_agent/user_agent.py | 4 +- ..._protocol.py => test_restjson_protocol.py} | 0 .../.changes/0.10.0.json | 8 + .../CHANGELOG.md | 5 + .../pyproject.toml | 4 +- .../scripts/docs/generate_doc_stubs.py | 56 +- .../__init__.py | 2 +- .../client.py | 4497 +++++++++++++---- .../config.py | 219 +- .../models.py | 22 +- .../user_agent.py | 4 +- ..._protocol.py => test_restjson_protocol.py} | 0 .../.changes/0.10.0.json | 8 + .../aws-sdk-bedrock-agentcore/CHANGELOG.md | 5 + .../aws-sdk-bedrock-agentcore/pyproject.toml | 4 +- .../scripts/docs/generate_doc_stubs.py | 56 +- .../src/aws_sdk_bedrock_agentcore/__init__.py | 2 +- .../src/aws_sdk_bedrock_agentcore/client.py | 1824 +++++-- .../src/aws_sdk_bedrock_agentcore/config.py | 219 +- .../src/aws_sdk_bedrock_agentcore/models.py | 20 +- .../aws_sdk_bedrock_agentcore/user_agent.py | 4 +- ..._protocol.py => test_restjson_protocol.py} | 0 .../.changes/0.10.0.json | 8 + .../CHANGELOG.md | 5 + .../pyproject.toml | 4 +- .../scripts/docs/generate_doc_stubs.py | 56 +- .../__init__.py | 2 +- .../aws_sdk_bedrock_data_automation/client.py | 771 ++- .../aws_sdk_bedrock_data_automation/config.py | 219 +- .../aws_sdk_bedrock_data_automation/models.py | 52 +- .../user_agent.py | 4 +- ..._protocol.py => test_restjson_protocol.py} | 0 .../.changes/0.10.0.json | 8 + clients/aws-sdk-bedrock-runtime/CHANGELOG.md | 5 + .../aws-sdk-bedrock-runtime/pyproject.toml | 4 +- .../scripts/docs/generate_doc_stubs.py | 56 +- .../src/aws_sdk_bedrock_runtime/__init__.py | 2 +- .../src/aws_sdk_bedrock_runtime/client.py | 339 +- .../src/aws_sdk_bedrock_runtime/config.py | 219 +- .../src/aws_sdk_bedrock_runtime/user_agent.py | 4 +- ..._protocol.py => test_restjson_protocol.py} | 0 clients/aws-sdk-bedrock/.changes/0.10.0.json | 8 + clients/aws-sdk-bedrock/CHANGELOG.md | 5 + clients/aws-sdk-bedrock/pyproject.toml | 4 +- .../scripts/docs/generate_doc_stubs.py | 56 +- .../src/aws_sdk_bedrock/__init__.py | 2 +- .../src/aws_sdk_bedrock/_private/schemas.py | 8 +- .../src/aws_sdk_bedrock/client.py | 2958 ++++++++--- .../src/aws_sdk_bedrock/config.py | 219 +- .../src/aws_sdk_bedrock/user_agent.py | 4 +- ..._protocol.py => test_restjson_protocol.py} | 0 .../.changes/0.10.0.json | 8 + clients/aws-sdk-connecthealth/CHANGELOG.md | 5 + clients/aws-sdk-connecthealth/pyproject.toml | 4 +- .../scripts/docs/generate_doc_stubs.py | 56 +- .../src/aws_sdk_connecthealth/__init__.py | 2 +- .../src/aws_sdk_connecthealth/client.py | 474 +- .../src/aws_sdk_connecthealth/config.py | 215 +- .../src/aws_sdk_connecthealth/user_agent.py | 4 +- ..._protocol.py => test_restjson_protocol.py} | 0 .../aws-sdk-guardduty/.changes/0.10.0.json | 8 + clients/aws-sdk-guardduty/CHANGELOG.md | 5 + clients/aws-sdk-guardduty/pyproject.toml | 4 +- .../scripts/docs/generate_doc_stubs.py | 56 +- .../src/aws_sdk_guardduty/__init__.py | 2 +- .../src/aws_sdk_guardduty/client.py | 2472 +++++++-- .../src/aws_sdk_guardduty/config.py | 219 +- .../src/aws_sdk_guardduty/user_agent.py | 4 +- ..._protocol.py => test_restjson_protocol.py} | 0 clients/aws-sdk-lambda/.changes/0.10.0.json | 8 + clients/aws-sdk-lambda/CHANGELOG.md | 5 + clients/aws-sdk-lambda/pyproject.toml | 4 +- .../scripts/docs/generate_doc_stubs.py | 56 +- .../src/aws_sdk_lambda/__init__.py | 2 +- .../src/aws_sdk_lambda/client.py | 2337 +++++++-- .../src/aws_sdk_lambda/config.py | 213 +- .../src/aws_sdk_lambda/models.py | 2 +- .../src/aws_sdk_lambda/user_agent.py | 4 +- ..._protocol.py => test_restjson_protocol.py} | 0 .../.changes/0.10.0.json | 8 + clients/aws-sdk-lex-runtime-v2/CHANGELOG.md | 5 + clients/aws-sdk-lex-runtime-v2/pyproject.toml | 4 +- .../scripts/docs/generate_doc_stubs.py | 56 +- .../src/aws_sdk_lex_runtime_v2/__init__.py | 2 +- .../src/aws_sdk_lex_runtime_v2/client.py | 204 +- .../src/aws_sdk_lex_runtime_v2/config.py | 219 +- .../src/aws_sdk_lex_runtime_v2/user_agent.py | 4 +- ..._protocol.py => test_restjson_protocol.py} | 0 clients/aws-sdk-polly/.changes/0.10.0.json | 8 + clients/aws-sdk-polly/CHANGELOG.md | 5 + clients/aws-sdk-polly/pyproject.toml | 4 +- .../scripts/docs/generate_doc_stubs.py | 56 +- .../src/aws_sdk_polly/__init__.py | 2 +- .../aws-sdk-polly/src/aws_sdk_polly/client.py | 312 +- .../aws-sdk-polly/src/aws_sdk_polly/config.py | 213 +- .../src/aws_sdk_polly/user_agent.py | 4 +- ..._protocol.py => test_restjson_protocol.py} | 0 clients/aws-sdk-python/.changes/0.10.0.json | 76 + clients/aws-sdk-python/CHANGELOG.md | 22 + clients/aws-sdk-python/pyproject.toml | 36 +- .../src/aws_sdk_python/__init__.py | 2 +- .../aws-sdk-qbusiness/.changes/0.10.0.json | 8 + clients/aws-sdk-qbusiness/CHANGELOG.md | 5 + clients/aws-sdk-qbusiness/pyproject.toml | 4 +- .../scripts/docs/generate_doc_stubs.py | 56 +- .../src/aws_sdk_qbusiness/__init__.py | 2 +- .../src/aws_sdk_qbusiness/client.py | 2283 +++++++-- .../src/aws_sdk_qbusiness/config.py | 215 +- .../src/aws_sdk_qbusiness/user_agent.py | 4 +- ..._protocol.py => test_restjson_protocol.py} | 0 .../.changes/0.10.0.json | 8 + .../CHANGELOG.md | 5 + .../pyproject.toml | 4 +- .../scripts/docs/generate_doc_stubs.py | 56 +- .../__init__.py | 2 +- .../aws_sdk_sagemaker_runtime_http2/client.py | 69 +- .../aws_sdk_sagemaker_runtime_http2/config.py | 219 +- .../user_agent.py | 4 +- ..._protocol.py => test_restjson_protocol.py} | 0 clients/aws-sdk-sns/.changes/0.10.0.json | 8 + clients/aws-sdk-sns/CHANGELOG.md | 5 + clients/aws-sdk-sns/pyproject.toml | 4 +- .../scripts/docs/generate_doc_stubs.py | 56 +- .../aws-sdk-sns/src/aws_sdk_sns/__init__.py | 2 +- clients/aws-sdk-sns/src/aws_sdk_sns/client.py | 1174 ++++- clients/aws-sdk-sns/src/aws_sdk_sns/config.py | 217 +- .../aws-sdk-sns/src/aws_sdk_sns/user_agent.py | 4 +- clients/aws-sdk-sts/.changes/0.10.0.json | 8 + clients/aws-sdk-sts/CHANGELOG.md | 5 + clients/aws-sdk-sts/pyproject.toml | 4 +- .../scripts/docs/generate_doc_stubs.py | 56 +- .../aws-sdk-sts/src/aws_sdk_sts/__init__.py | 2 +- clients/aws-sdk-sts/src/aws_sdk_sts/client.py | 337 +- clients/aws-sdk-sts/src/aws_sdk_sts/config.py | 217 +- .../aws-sdk-sts/src/aws_sdk_sts/user_agent.py | 4 +- .../.changes/0.10.0.json | 8 + .../aws-sdk-transcribe-streaming/CHANGELOG.md | 5 + .../pyproject.toml | 4 +- .../scripts/docs/generate_doc_stubs.py | 56 +- .../aws_sdk_transcribe_streaming/__init__.py | 2 +- .../aws_sdk_transcribe_streaming/client.py | 177 +- .../aws_sdk_transcribe_streaming/config.py | 215 +- .../user_agent.py | 4 +- ..._protocol.py => test_restjson_protocol.py} | 0 .../aws-credentials-http/.changes/0.2.0.json | 8 + packages/aws-credentials-http/CHANGELOG.md | 5 + packages/aws-credentials-http/pyproject.toml | 2 +- .../src/aws_credentials_http/__init__.py | 2 +- .../aws-credentials-imds/.changes/0.2.0.json | 8 + packages/aws-credentials-imds/CHANGELOG.md | 5 + packages/aws-credentials-imds/pyproject.toml | 2 +- .../src/aws_credentials_imds/__init__.py | 2 +- .../aws-credentials-sts/.changes/0.2.0.json | 12 + packages/aws-credentials-sts/CHANGELOG.md | 6 + packages/aws-credentials-sts/pyproject.toml | 4 +- .../src/aws_credentials_sts/__init__.py | 2 +- 184 files changed, 23946 insertions(+), 8330 deletions(-) create mode 100644 clients/aws-sdk-api-gateway/.changes/0.10.0.json rename clients/aws-sdk-api-gateway/tests/{test_protocol.py => test_restjson_protocol.py} (100%) create mode 100644 clients/aws-sdk-bedrock-agent-runtime/.changes/0.10.0.json rename clients/aws-sdk-bedrock-agent-runtime/tests/{test_protocol.py => test_restjson_protocol.py} (100%) create mode 100644 clients/aws-sdk-bedrock-agent/.changes/0.10.0.json rename clients/aws-sdk-bedrock-agent/tests/{test_protocol.py => test_restjson_protocol.py} (100%) create mode 100644 clients/aws-sdk-bedrock-agentcore-control/.changes/0.10.0.json rename clients/aws-sdk-bedrock-agentcore-control/tests/{test_protocol.py => test_restjson_protocol.py} (100%) create mode 100644 clients/aws-sdk-bedrock-agentcore/.changes/0.10.0.json rename clients/aws-sdk-bedrock-agentcore/tests/{test_protocol.py => test_restjson_protocol.py} (100%) create mode 100644 clients/aws-sdk-bedrock-data-automation/.changes/0.10.0.json rename clients/aws-sdk-bedrock-data-automation/tests/{test_protocol.py => test_restjson_protocol.py} (100%) create mode 100644 clients/aws-sdk-bedrock-runtime/.changes/0.10.0.json rename clients/aws-sdk-bedrock-runtime/tests/{test_protocol.py => test_restjson_protocol.py} (100%) create mode 100644 clients/aws-sdk-bedrock/.changes/0.10.0.json rename clients/aws-sdk-bedrock/tests/{test_protocol.py => test_restjson_protocol.py} (100%) create mode 100644 clients/aws-sdk-connecthealth/.changes/0.10.0.json rename clients/aws-sdk-connecthealth/tests/{test_protocol.py => test_restjson_protocol.py} (100%) create mode 100644 clients/aws-sdk-guardduty/.changes/0.10.0.json rename clients/aws-sdk-guardduty/tests/{test_protocol.py => test_restjson_protocol.py} (100%) create mode 100644 clients/aws-sdk-lambda/.changes/0.10.0.json rename clients/aws-sdk-lambda/tests/{test_protocol.py => test_restjson_protocol.py} (100%) create mode 100644 clients/aws-sdk-lex-runtime-v2/.changes/0.10.0.json rename clients/aws-sdk-lex-runtime-v2/tests/{test_protocol.py => test_restjson_protocol.py} (100%) create mode 100644 clients/aws-sdk-polly/.changes/0.10.0.json rename clients/aws-sdk-polly/tests/{test_protocol.py => test_restjson_protocol.py} (100%) create mode 100644 clients/aws-sdk-python/.changes/0.10.0.json create mode 100644 clients/aws-sdk-qbusiness/.changes/0.10.0.json rename clients/aws-sdk-qbusiness/tests/{test_protocol.py => test_restjson_protocol.py} (100%) create mode 100644 clients/aws-sdk-sagemaker-runtime-http2/.changes/0.10.0.json rename clients/aws-sdk-sagemaker-runtime-http2/tests/{test_protocol.py => test_restjson_protocol.py} (100%) create mode 100644 clients/aws-sdk-sns/.changes/0.10.0.json create mode 100644 clients/aws-sdk-sts/.changes/0.10.0.json create mode 100644 clients/aws-sdk-transcribe-streaming/.changes/0.10.0.json rename clients/aws-sdk-transcribe-streaming/tests/{test_protocol.py => test_restjson_protocol.py} (100%) create mode 100644 packages/aws-credentials-http/.changes/0.2.0.json create mode 100644 packages/aws-credentials-imds/.changes/0.2.0.json create mode 100644 packages/aws-credentials-sts/.changes/0.2.0.json diff --git a/clients/aws-sdk-api-gateway/.changes/0.10.0.json b/clients/aws-sdk-api-gateway/.changes/0.10.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/clients/aws-sdk-api-gateway/.changes/0.10.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-api-gateway/CHANGELOG.md b/clients/aws-sdk-api-gateway/CHANGELOG.md index 27b6ee4..3152a43 100644 --- a/clients/aws-sdk-api-gateway/CHANGELOG.md +++ b/clients/aws-sdk-api-gateway/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### Dependencies diff --git a/clients/aws-sdk-api-gateway/pyproject.toml b/clients/aws-sdk-api-gateway/pyproject.toml index 593e7f3..3d26163 100644 --- a/clients/aws-sdk-api-gateway/pyproject.toml +++ b/clients/aws-sdk-api-gateway/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "aws_sdk_api_gateway" -version = "0.9.0" +version = "0.10.0" description = "aws_sdk_api_gateway client" readme = "README.md" requires-python = ">=3.12" @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ - "smithy_aws_core[json]~=0.9.0", + "smithy_aws_core[json]~=0.10.0", "smithy_core~=0.8.0", "smithy_http[aiohttp]~=0.4.0" ] diff --git a/clients/aws-sdk-api-gateway/scripts/docs/generate_doc_stubs.py b/clients/aws-sdk-api-gateway/scripts/docs/generate_doc_stubs.py index b00ac66..56ab5a8 100644 --- a/clients/aws-sdk-api-gateway/scripts/docs/generate_doc_stubs.py +++ b/clients/aws-sdk-api-gateway/scripts/docs/generate_doc_stubs.py @@ -8,6 +8,7 @@ import argparse import logging +import re import sys from collections.abc import Sequence from dataclasses import dataclass @@ -115,19 +116,43 @@ class ClientInfo: class DocStubGenerator: """Generate markdown API Reference stubs for AWS SDK for Python clients.""" - def __init__(self, client_dir: Path, output_dir: Path) -> None: + def __init__(self, client_dir: Path, output_dir: Path, service_name: str | None = None) -> None: """ Initialize the documentation generator. Args: client_dir: Path to the client source directory output_dir: Path to the output directory for generated doc stubs + service_name: Display name for the service (e.g. the Smithy sdkId + "SNS"). When omitted, falls back to a title-cased derivation of + the package name, which does not preserve acronym casing. """ self.client_dir = client_dir self.output_dir = output_dir - # Extract service name from package name - # (e.g., "aws_sdk_bedrock_runtime" -> "Bedrock Runtime") - self.service_name = client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + # Use the explicit override, then the sdkId from the package, then + # fall back to a title-cased package name (does not keep acronym + # casing, so "sns" becomes "Sns"). + self.service_name = ( + service_name + or self._sdk_id_from_package(client_dir) + or client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + ) + + @staticmethod + def _sdk_id_from_package(client_dir: Path) -> str | None: + """ + Read the authoritative service name (Smithy sdkId) from the package. + + The generated ``_private/schemas.py`` carries the ``aws.api#service`` + trait's ``sdkId`` (e.g. "SNS"), the same field the sidebar navigation + uses, so it keeps acronym casing that the package name does not. + Returns None if the file or value is absent. + """ + schemas = client_dir / "_private" / "schemas.py" + if not schemas.is_file(): + return None + match = re.search(r'"sdkId":\s*"([^"]+)"', schemas.read_text()) + return match.group(1) if match else None def generate(self) -> bool: """ @@ -166,10 +191,13 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: if not client_class: raise ValueError(f"No class ending with 'Client' found in {package_name}.client") - config_class = config_module.members.get("Config") + config_class = self._find_class_with_suffix(config_module, "Config") + if not config_class: + raise ValueError(f"No class ending with 'Config' found in {package_name}.config") + plugin_alias = config_module.members.get("Plugin") - if not config_class or not plugin_alias: - raise ValueError(f"Missing Config or Plugin in {package_name}.config") + if not plugin_alias: + raise ValueError(f"Missing Plugin in {package_name}.config") config = TypeInfo(name=config_class.name, module_path=config_class.path) plugin = TypeInfo(name=plugin_alias.name, module_path=plugin_alias.path) @@ -194,8 +222,12 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: ) def _find_class_with_suffix(self, module: Module, suffix: str) -> Class | None: - """Find the class in the module with a matching suffix.""" + """Find the class defined in the module with a matching suffix.""" for cls in module.classes.values(): + # Skip imported classes so a same-package import (e.g. a *Config + # class re-exported from config.py) can't shadow the defined one. + if cls.is_imported: + continue if cls.name.endswith(suffix): return cls return None @@ -616,6 +648,12 @@ def main() -> int: required=True, help="Output directory for generated doc stubs", ) + parser.add_argument( + "-s", + "--service-name", + default=None, + help="Display name for the service (Smithy sdkId, e.g. 'SNS')", + ) args = parser.parse_args() client_dir = args.client_dir.resolve() @@ -626,7 +664,7 @@ def main() -> int: return 1 try: - generator = DocStubGenerator(client_dir, output_dir) + generator = DocStubGenerator(client_dir, output_dir, args.service_name) success = generator.generate() return 0 if success else 1 except Exception as e: diff --git a/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/__init__.py b/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/__init__.py index 7e20a8c..3c99375 100644 --- a/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/__init__.py +++ b/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/__init__.py @@ -1,3 +1,3 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -__version__: str = "0.9.0" +__version__: str = "0.10.0" diff --git a/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/accept_header.py b/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/accept_header.py index 2da3315..9b6c375 100644 --- a/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/accept_header.py +++ b/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/accept_header.py @@ -6,7 +6,7 @@ from smithy_http import Field from smithy_http.aio.interfaces import HTTPRequest -from .config import Config +from .config import AsyncAPIGatewayConfig class _AcceptHeaderInterceptor(Interceptor[Any, Any, HTTPRequest, None]): @@ -21,5 +21,5 @@ def modify_before_signing( return request -def accept_header_plugin(config: Config): +def accept_header_plugin(config: AsyncAPIGatewayConfig): config.interceptors.append(_AcceptHeaderInterceptor()) diff --git a/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/client.py b/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/client.py index 453c6df..9935ed6 100644 --- a/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/client.py +++ b/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/client.py @@ -1,5 +1,6 @@ # Code generated by smithy-python-codegen DO NOT EDIT. +import asyncio from copy import deepcopy import logging @@ -11,7 +12,7 @@ from smithy_http.plugins import user_agent_plugin from .accept_header import accept_header_plugin -from .config import Config, Plugin +from .config import AsyncAPIGatewayConfig, Plugin from .models import ( CREATE_API_KEY, CREATE_AUTHORIZER, @@ -402,7 +403,9 @@ class AsyncAPIGatewayClient: """ def __init__( - self, config: Config | None = None, plugins: list[Plugin] | None = None + self, + config: AsyncAPIGatewayConfig | None = None, + plugins: list[Plugin] | None = None, ): """ Constructor for `AsyncAPIGatewayClient`. @@ -412,23 +415,36 @@ def __init__( Optional configuration for the client. Here you can set things like the endpoint for HTTP services or auth credentials. plugins: - A list of callables that modify the configuration dynamically. These - can be used to set defaults, for example. + A list of callables applied once to the client's base configuration. + Their changes are inherited by every operation invocation. """ - self._config = config or Config() - - client_plugins: list[Plugin] = [ + self._config = config + self._plugins = plugins + self._derive_lock = asyncio.Lock() + self._setup_done = False + self._retry_strategy_resolver = RetryStrategyResolver() + self._client_plugins: list[Plugin] = [ accept_header_plugin, aws_user_agent_plugin, user_agent_plugin, ] - if plugins: - client_plugins.extend(plugins) - - for plugin in client_plugins: - plugin(self._config) - self._retry_strategy_resolver = RetryStrategyResolver() + async def _ensure_setup(self) -> None: + if not self._setup_done: + async with self._derive_lock: + if not self._setup_done: + if self._config is None: + config = await AsyncAPIGatewayConfig.resolve() + else: + # Copy so plugins don't mutate the caller's config. + config = deepcopy(self._config) + for plugin in self._client_plugins: + plugin(config) + if self._plugins: + for plugin in self._plugins: + plugin(config) + self._config = config + self._setup_done = True async def create_api_key( self, input: CreateApiKeyInput, plugins: list[Plugin] | None = None @@ -451,16 +467,31 @@ async def create_api_key( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -498,16 +529,31 @@ async def create_authorizer( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -545,16 +591,31 @@ async def create_base_path_mapping( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -593,16 +654,31 @@ async def create_deployment( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -640,16 +716,31 @@ async def create_documentation_part( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -689,16 +780,31 @@ async def create_documentation_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -736,16 +842,31 @@ async def create_domain_name( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -786,16 +907,31 @@ async def create_domain_name_access_association( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -833,16 +969,31 @@ async def create_model( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -880,16 +1031,31 @@ async def create_request_validator( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -927,16 +1093,31 @@ async def create_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -974,16 +1155,31 @@ async def create_rest_api( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1022,16 +1218,31 @@ async def create_stage( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1070,16 +1281,31 @@ async def create_usage_plan( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1117,16 +1343,31 @@ async def create_usage_plan_key( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1167,16 +1408,31 @@ async def create_vpc_link( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1214,16 +1470,31 @@ async def delete_api_key( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1261,16 +1532,31 @@ async def delete_authorizer( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1308,16 +1594,31 @@ async def delete_base_path_mapping( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1355,16 +1656,31 @@ async def delete_client_certificate( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1403,16 +1719,31 @@ async def delete_deployment( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1450,16 +1781,31 @@ async def delete_documentation_part( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1499,16 +1845,31 @@ async def delete_documentation_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1546,16 +1907,31 @@ async def delete_domain_name( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1600,16 +1976,31 @@ async def delete_domain_name_access_association( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1648,16 +2039,31 @@ async def delete_gateway_response( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1695,16 +2101,31 @@ async def delete_integration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1742,16 +2163,31 @@ async def delete_integration_response( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1789,16 +2225,31 @@ async def delete_method( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1836,16 +2287,31 @@ async def delete_method_response( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1883,16 +2349,31 @@ async def delete_model( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1930,16 +2411,31 @@ async def delete_request_validator( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1977,16 +2473,31 @@ async def delete_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2024,16 +2535,31 @@ async def delete_rest_api( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2071,16 +2597,31 @@ async def delete_stage( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2118,16 +2659,31 @@ async def delete_usage_plan( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2166,16 +2722,31 @@ async def delete_usage_plan_key( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2213,16 +2784,31 @@ async def delete_vpc_link( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2262,16 +2848,31 @@ async def flush_stage_authorizers_cache( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2309,16 +2910,31 @@ async def flush_stage_cache( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2356,16 +2972,31 @@ async def generate_client_certificate( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2403,16 +3034,31 @@ async def get_account( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2450,16 +3096,31 @@ async def get_api_key( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2497,16 +3158,31 @@ async def get_api_keys( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2544,16 +3220,31 @@ async def get_authorizer( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2591,16 +3282,31 @@ async def get_authorizers( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2638,16 +3344,31 @@ async def get_base_path_mapping( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2685,16 +3406,31 @@ async def get_base_path_mappings( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2732,16 +3468,31 @@ async def get_client_certificate( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2779,16 +3530,31 @@ async def get_client_certificates( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2826,16 +3592,31 @@ async def get_deployment( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2873,16 +3654,31 @@ async def get_deployments( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2920,16 +3716,31 @@ async def get_documentation_part( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2967,16 +3778,31 @@ async def get_documentation_parts( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3014,16 +3840,31 @@ async def get_documentation_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3061,16 +3902,31 @@ async def get_documentation_versions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3109,16 +3965,31 @@ async def get_domain_name( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3158,16 +4029,31 @@ async def get_domain_name_access_associations( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3205,16 +4091,31 @@ async def get_domain_names( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3252,16 +4153,31 @@ async def get_export( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3300,16 +4216,31 @@ async def get_gateway_response( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3350,16 +4281,31 @@ async def get_gateway_responses( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3397,16 +4343,31 @@ async def get_integration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3444,16 +4405,31 @@ async def get_integration_response( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3491,16 +4467,31 @@ async def get_method( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3538,16 +4529,31 @@ async def get_method_response( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3585,16 +4591,31 @@ async def get_model( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3632,16 +4653,31 @@ async def get_models( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3680,16 +4716,31 @@ async def get_model_template( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3727,16 +4778,31 @@ async def get_request_validator( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3774,16 +4840,31 @@ async def get_request_validators( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3821,16 +4902,31 @@ async def get_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3868,16 +4964,31 @@ async def get_resources( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3915,16 +5026,31 @@ async def get_rest_api( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3962,16 +5088,31 @@ async def get_rest_apis( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4009,16 +5150,31 @@ async def get_sdk( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4056,16 +5212,31 @@ async def get_sdk_type( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4103,16 +5274,31 @@ async def get_sdk_types( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4150,16 +5336,31 @@ async def get_stage( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4197,16 +5398,31 @@ async def get_stages( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4244,16 +5460,31 @@ async def get_tags( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4291,16 +5522,31 @@ async def get_usage( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4338,16 +5584,31 @@ async def get_usage_plan( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4385,16 +5646,31 @@ async def get_usage_plan_key( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4433,16 +5709,31 @@ async def get_usage_plan_keys( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4480,16 +5771,31 @@ async def get_usage_plans( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4527,16 +5833,31 @@ async def get_vpc_link( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4575,16 +5896,31 @@ async def get_vpc_links( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4622,16 +5958,31 @@ async def import_api_keys( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4669,16 +6020,31 @@ async def import_documentation_parts( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4717,16 +6083,31 @@ async def import_rest_api( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4765,16 +6146,31 @@ async def put_gateway_response( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4812,16 +6208,31 @@ async def put_integration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4859,16 +6270,31 @@ async def put_integration_response( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4906,16 +6332,31 @@ async def put_method( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4953,16 +6394,31 @@ async def put_method_response( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5003,16 +6459,31 @@ async def put_rest_api( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5058,16 +6529,31 @@ async def reject_domain_name_access_association( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5105,16 +6591,31 @@ async def tag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5153,16 +6654,31 @@ async def test_invoke_authorizer( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5201,16 +6717,31 @@ async def test_invoke_method( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5248,16 +6779,31 @@ async def untag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5295,16 +6841,31 @@ async def update_account( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5342,16 +6903,31 @@ async def update_api_key( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5389,16 +6965,31 @@ async def update_authorizer( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5436,16 +7027,31 @@ async def update_base_path_mapping( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5483,16 +7089,31 @@ async def update_client_certificate( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5530,16 +7151,31 @@ async def update_deployment( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5577,16 +7213,31 @@ async def update_documentation_part( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5626,16 +7277,31 @@ async def update_documentation_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5673,16 +7339,31 @@ async def update_domain_name( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5721,16 +7402,31 @@ async def update_gateway_response( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5768,16 +7464,31 @@ async def update_integration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5815,16 +7526,31 @@ async def update_integration_response( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5862,16 +7588,31 @@ async def update_method( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5909,16 +7650,31 @@ async def update_method_response( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5957,16 +7713,31 @@ async def update_model( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6004,16 +7775,31 @@ async def update_request_validator( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6051,16 +7837,31 @@ async def update_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6098,16 +7899,31 @@ async def update_rest_api( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6145,16 +7961,31 @@ async def update_stage( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6193,16 +8024,31 @@ async def update_usage( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6240,16 +8086,31 @@ async def update_usage_plan( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6287,16 +8148,31 @@ async def update_vpc_link( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) diff --git a/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/config.py b/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/config.py index 3cebab0..4c9b35b 100644 --- a/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/config.py +++ b/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/config.py @@ -1,24 +1,24 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -from dataclasses import dataclass -from typing import Any, Callable, TypeAlias, Union +from dataclasses import dataclass, field +from typing import Any, Callable, ClassVar, Self, TypeAlias, Union, 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.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ClientProtocol, ClientTransport, EndpointResolver +from smithy_core.aio.interfaces import ClientProtocol, EndpointResolver from smithy_core.aio.interfaces.auth import AuthScheme from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy from smithy_core.interceptors import Interceptor -from smithy_core.interfaces import URI -from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.aiohttp import AIOHTTPClient -from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import ( BACKPLANE_CONTROL_SERVICE as _SCHEMA_BACKPLANE_CONTROL_SERVICE, @@ -442,141 +442,136 @@ ] -@dataclass(init=False) -class Config: - """Configuration for API Gateway.""" - - auth_scheme_resolver: HTTPAuthSchemeResolver - """ - An auth scheme resolver that determines the auth scheme for each - operation. - """ - - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] - """A map of auth scheme ids to auth schemes.""" - - aws_access_key_id: str | None - """The identifier for a secret access key.""" - - aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None - ) - """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" +class _AsyncAPIGatewayConfigOverrides(AwsConfigOverrides, total=False): + endpoint_resolver: EndpointResolver | None + protocol: ClientProtocol[Any, Any] | None + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None - aws_secret_access_key: str | None - """A secret access key that can be used to sign requests.""" - aws_session_token: str | None - """An access key ID that identifies temporary security credentials.""" +@dataclass(kw_only=True, repr=False, init=False) +class AsyncAPIGatewayConfig(AsyncAwsConfig): + """API Gateway configuration (async-resolved).""" - endpoint_resolver: EndpointResolver + endpoint_resolver: EndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - endpoint_uri: str | URI | None - """A static URI to route requests to.""" - - http_request_config: HTTPRequestConfiguration | None - """Configuration for individual HTTP requests.""" + protocol: ClientProtocol[Any, Any] | None = None + """The protocol to serialize and deserialize requests with.""" - interceptors: list[_ServiceInterceptor] + interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) """ The list of interceptors, which are hooks that are called during the execution of a request. """ - protocol: ClientProtocol[Any, Any] | None - """The protocol to serialize and deserialize requests with.""" + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + """A map of auth scheme ids to auth schemes.""" - region: str | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None = None """ - The AWS region to connect to. The configured region is used to determine - the service endpoint. + An auth scheme resolver that determines the auth scheme for each + operation. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + aws_credentials_identity_resolver: ( + IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + ) = None + """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" + + region: str | None = None """ - The retry strategy or options for configuring retry behavior. Can be - either a configured RetryStrategy or RetryStrategyOptions to create one. + The AWS region to connect to. The configured region is used to determine + the service endpoint. """ - sdk_ua_app_id: str | None + aws_access_key_id: str | None = None + """The identifier for a secret access key.""" + + aws_secret_access_key: str | None = None + """A secret access key that can be used to sign requests.""" + + aws_session_token: str | None = None + """The session token used with temporary AWS credentials.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + sdk_ua_app_id: str | None = None """ A unique and opaque application ID that is appended to the User-Agent header. """ - transport: ClientTransport[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 - streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. - """ - - user_agent_extra: str | None - """Additional suffix to be added to the User-Agent header.""" - - def __init__( - self, - *, - auth_scheme_resolver: HTTPAuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - aws_access_key_id: str | None = None, - aws_credentials_identity_resolver: IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties - ] - | None = None, - aws_secret_access_key: str | None = None, - aws_session_token: str | None = None, - endpoint_resolver: EndpointResolver | None = None, - endpoint_uri: str | URI | None = None, - http_request_config: HTTPRequestConfiguration | None = None, - interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] | None = None, - region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, - sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, - user_agent_extra: str | None = None, - ): - self.auth_scheme_resolver = auth_scheme_resolver or HTTPAuthSchemeResolver() - self.auth_schemes = auth_schemes or { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="apigateway") - } - self.aws_access_key_id = aws_access_key_id - self.aws_credentials_identity_resolver = aws_credentials_identity_resolver - self.aws_secret_access_key = aws_secret_access_key - self.aws_session_token = aws_session_token - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="apigateway" - ) - self.endpoint_uri = endpoint_uri - self.http_request_config = http_request_config - self.interceptors = interceptors or [] - self.protocol = protocol or RestJsonClientProtocol( - _SCHEMA_BACKPLANE_CONTROL_SERVICE - ) - self.region = region - self.retry_strategy = retry_strategy - self.sdk_ua_app_id = sdk_ua_app_id - self.transport = transport or AIOHTTPClient() - self.user_agent_extra = user_agent_extra + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "aws_credentials_identity_resolver": FieldSpec(default=None), + "region": FieldSpec(default=None), + "aws_access_key_id": FieldSpec(default=None), + "aws_secret_access_key": FieldSpec(default=None), + "aws_session_token": FieldSpec(default=None), + "user_agent_extra": FieldSpec(default=None), + "sdk_ua_app_id": FieldSpec(default=None), + **AsyncAwsConfig._FIELDS, + "endpoint_uri": FieldSpec( + default=None, resolver=EndpointUriResolver("api_gateway") + ), + "endpoint_resolver": FieldSpec( + default_factory=lambda: StandardRegionalEndpointsResolver( + endpoint_prefix="apigateway" + ) + ), + "protocol": FieldSpec( + default_factory=lambda: RestJsonClientProtocol( + _SCHEMA_BACKPLANE_CONTROL_SERVICE + ) + ), + "auth_schemes": FieldSpec( + default_factory=lambda: { + ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="apigateway") + } + ), + "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: """ - Sets the implementation of an auth scheme. - - Using this method ensures the correct key is used. + Set an auth scheme implementation using its scheme ID. :param scheme: + The auth scheme to add or replace. + """ + auth_schemes = dict(self.auth_schemes or {}) + auth_schemes[scheme.scheme_id] = scheme + self.auth_schemes = auth_schemes - Args: - scheme: - The auth scheme to add. + @classmethod + async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] + cls, + *, + profile: str | None = None, + fs: FileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[_AsyncAPIGatewayConfigOverrides], + ) -> Self: + """ + Resolve config from environment, config files, defaults, and explicit + overrides. """ - self.auth_schemes[scheme.scheme_id] = scheme + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) -Plugin: TypeAlias = Callable[[Config], None] -"""A callable that allows customizing the config object on each request.""" +Plugin: TypeAlias = Callable[[AsyncAPIGatewayConfig], None] +""" +A callable that customizes a client configuration. Service-level plugins +are applied once to the base configuration inherited by every operation. +Operation-level plugins apply only to a single operation invocation. +""" diff --git a/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/user_agent.py b/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/user_agent.py index d2a4211..8a6a1af 100644 --- a/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/user_agent.py +++ b/clients/aws-sdk-api-gateway/src/aws_sdk_api_gateway/user_agent.py @@ -3,10 +3,10 @@ from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor from . import __version__ -from .config import Config +from .config import AsyncAPIGatewayConfig -def aws_user_agent_plugin(config: Config): +def aws_user_agent_plugin(config: AsyncAPIGatewayConfig): config.interceptors.append( UserAgentInterceptor( ua_suffix=config.user_agent_extra, diff --git a/clients/aws-sdk-api-gateway/tests/test_protocol.py b/clients/aws-sdk-api-gateway/tests/test_restjson_protocol.py similarity index 100% rename from clients/aws-sdk-api-gateway/tests/test_protocol.py rename to clients/aws-sdk-api-gateway/tests/test_restjson_protocol.py diff --git a/clients/aws-sdk-bedrock-agent-runtime/.changes/0.10.0.json b/clients/aws-sdk-bedrock-agent-runtime/.changes/0.10.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/clients/aws-sdk-bedrock-agent-runtime/.changes/0.10.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-bedrock-agent-runtime/CHANGELOG.md b/clients/aws-sdk-bedrock-agent-runtime/CHANGELOG.md index ef02ac4..9aba0c4 100644 --- a/clients/aws-sdk-bedrock-agent-runtime/CHANGELOG.md +++ b/clients/aws-sdk-bedrock-agent-runtime/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### Dependencies diff --git a/clients/aws-sdk-bedrock-agent-runtime/pyproject.toml b/clients/aws-sdk-bedrock-agent-runtime/pyproject.toml index e3c1bb9..468c311 100644 --- a/clients/aws-sdk-bedrock-agent-runtime/pyproject.toml +++ b/clients/aws-sdk-bedrock-agent-runtime/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "aws_sdk_bedrock_agent_runtime" -version = "0.9.0" +version = "0.10.0" description = "aws_sdk_bedrock_agent_runtime client" readme = "README.md" requires-python = ">=3.12" @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ - "smithy_aws_core[eventstream, json]~=0.9.0", + "smithy_aws_core[eventstream, json]~=0.10.0", "smithy_core~=0.8.0", "smithy_http[awscrt]~=0.4.0" ] diff --git a/clients/aws-sdk-bedrock-agent-runtime/scripts/docs/generate_doc_stubs.py b/clients/aws-sdk-bedrock-agent-runtime/scripts/docs/generate_doc_stubs.py index b00ac66..56ab5a8 100644 --- a/clients/aws-sdk-bedrock-agent-runtime/scripts/docs/generate_doc_stubs.py +++ b/clients/aws-sdk-bedrock-agent-runtime/scripts/docs/generate_doc_stubs.py @@ -8,6 +8,7 @@ import argparse import logging +import re import sys from collections.abc import Sequence from dataclasses import dataclass @@ -115,19 +116,43 @@ class ClientInfo: class DocStubGenerator: """Generate markdown API Reference stubs for AWS SDK for Python clients.""" - def __init__(self, client_dir: Path, output_dir: Path) -> None: + def __init__(self, client_dir: Path, output_dir: Path, service_name: str | None = None) -> None: """ Initialize the documentation generator. Args: client_dir: Path to the client source directory output_dir: Path to the output directory for generated doc stubs + service_name: Display name for the service (e.g. the Smithy sdkId + "SNS"). When omitted, falls back to a title-cased derivation of + the package name, which does not preserve acronym casing. """ self.client_dir = client_dir self.output_dir = output_dir - # Extract service name from package name - # (e.g., "aws_sdk_bedrock_runtime" -> "Bedrock Runtime") - self.service_name = client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + # Use the explicit override, then the sdkId from the package, then + # fall back to a title-cased package name (does not keep acronym + # casing, so "sns" becomes "Sns"). + self.service_name = ( + service_name + or self._sdk_id_from_package(client_dir) + or client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + ) + + @staticmethod + def _sdk_id_from_package(client_dir: Path) -> str | None: + """ + Read the authoritative service name (Smithy sdkId) from the package. + + The generated ``_private/schemas.py`` carries the ``aws.api#service`` + trait's ``sdkId`` (e.g. "SNS"), the same field the sidebar navigation + uses, so it keeps acronym casing that the package name does not. + Returns None if the file or value is absent. + """ + schemas = client_dir / "_private" / "schemas.py" + if not schemas.is_file(): + return None + match = re.search(r'"sdkId":\s*"([^"]+)"', schemas.read_text()) + return match.group(1) if match else None def generate(self) -> bool: """ @@ -166,10 +191,13 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: if not client_class: raise ValueError(f"No class ending with 'Client' found in {package_name}.client") - config_class = config_module.members.get("Config") + config_class = self._find_class_with_suffix(config_module, "Config") + if not config_class: + raise ValueError(f"No class ending with 'Config' found in {package_name}.config") + plugin_alias = config_module.members.get("Plugin") - if not config_class or not plugin_alias: - raise ValueError(f"Missing Config or Plugin in {package_name}.config") + if not plugin_alias: + raise ValueError(f"Missing Plugin in {package_name}.config") config = TypeInfo(name=config_class.name, module_path=config_class.path) plugin = TypeInfo(name=plugin_alias.name, module_path=plugin_alias.path) @@ -194,8 +222,12 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: ) def _find_class_with_suffix(self, module: Module, suffix: str) -> Class | None: - """Find the class in the module with a matching suffix.""" + """Find the class defined in the module with a matching suffix.""" for cls in module.classes.values(): + # Skip imported classes so a same-package import (e.g. a *Config + # class re-exported from config.py) can't shadow the defined one. + if cls.is_imported: + continue if cls.name.endswith(suffix): return cls return None @@ -616,6 +648,12 @@ def main() -> int: required=True, help="Output directory for generated doc stubs", ) + parser.add_argument( + "-s", + "--service-name", + default=None, + help="Display name for the service (Smithy sdkId, e.g. 'SNS')", + ) args = parser.parse_args() client_dir = args.client_dir.resolve() @@ -626,7 +664,7 @@ def main() -> int: return 1 try: - generator = DocStubGenerator(client_dir, output_dir) + generator = DocStubGenerator(client_dir, output_dir, args.service_name) success = generator.generate() return 0 if success else 1 except Exception as e: diff --git a/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/__init__.py b/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/__init__.py index 7e20a8c..3c99375 100644 --- a/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/__init__.py +++ b/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/__init__.py @@ -1,3 +1,3 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -__version__: str = "0.9.0" +__version__: str = "0.10.0" diff --git a/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/client.py b/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/client.py index d9a711b..69d5dfc 100644 --- a/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/client.py +++ b/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/client.py @@ -1,5 +1,6 @@ # Code generated by smithy-python-codegen DO NOT EDIT. +import asyncio from copy import deepcopy import logging @@ -11,7 +12,7 @@ from smithy_core.types import TypedProperties from smithy_http.plugins import user_agent_plugin -from .config import Config, Plugin +from .config import AsyncBedrockAgentRuntimeConfig, Plugin from .models import ( AGENTIC_RETRIEVE_STREAM, AgenticRetrieveStreamInput, @@ -138,7 +139,9 @@ class AsyncBedrockAgentRuntimeClient: """ def __init__( - self, config: Config | None = None, plugins: list[Plugin] | None = None + self, + config: AsyncBedrockAgentRuntimeConfig | None = None, + plugins: list[Plugin] | None = None, ): """ Constructor for `AsyncBedrockAgentRuntimeClient`. @@ -148,19 +151,32 @@ def __init__( Optional configuration for the client. Here you can set things like the endpoint for HTTP services or auth credentials. plugins: - A list of callables that modify the configuration dynamically. These - can be used to set defaults, for example. + A list of callables applied once to the client's base configuration. + Their changes are inherited by every operation invocation. """ - self._config = config or Config() - - client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] - if plugins: - client_plugins.extend(plugins) - - for plugin in client_plugins: - plugin(self._config) - + self._config = config + self._plugins = plugins + self._derive_lock = asyncio.Lock() + self._setup_done = False self._retry_strategy_resolver = RetryStrategyResolver() + self._client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] + + async def _ensure_setup(self) -> None: + if not self._setup_done: + async with self._derive_lock: + if not self._setup_done: + if self._config is None: + config = await AsyncBedrockAgentRuntimeConfig.resolve() + else: + # Copy so plugins don't mutate the caller's config. + config = deepcopy(self._config) + for plugin in self._client_plugins: + plugin(config) + if self._plugins: + for plugin in self._plugins: + plugin(config) + self._config = config + self._setup_done = True async def agentic_retrieve_stream( self, input: AgenticRetrieveStreamInput, plugins: list[Plugin] | None = None @@ -195,16 +211,31 @@ async def agentic_retrieve_stream( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -258,16 +289,31 @@ async def create_invocation( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -334,16 +380,31 @@ async def create_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -381,16 +442,31 @@ async def delete_agent_memory( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -434,16 +510,31 @@ async def delete_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -486,16 +577,31 @@ async def end_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -536,16 +642,31 @@ async def generate_query( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -583,16 +704,31 @@ async def get_agent_memory( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -631,16 +767,31 @@ async def get_document_content( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -686,16 +837,31 @@ async def get_execution_flow_snapshot( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -734,16 +900,31 @@ async def get_flow_execution( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -784,16 +965,31 @@ async def get_invocation_step( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -834,16 +1030,31 @@ async def get_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -915,16 +1126,31 @@ async def invoke_agent( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -973,16 +1199,31 @@ async def invoke_flow( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1044,16 +1285,31 @@ async def invoke_inline_agent( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1102,16 +1358,31 @@ async def list_flow_execution_events( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1155,16 +1426,31 @@ async def list_flow_executions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1205,16 +1491,31 @@ async def list_invocations( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1255,16 +1556,31 @@ async def list_invocation_steps( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1305,16 +1621,31 @@ async def list_sessions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1352,16 +1683,31 @@ async def list_tags_for_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1403,16 +1749,31 @@ async def optimize_prompt( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1468,16 +1829,31 @@ async def put_invocation_step( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1517,16 +1893,31 @@ async def rerank( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1564,16 +1955,31 @@ async def retrieve( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1623,16 +2029,31 @@ async def retrieve_and_generate( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1686,16 +2107,31 @@ async def retrieve_and_generate_stream( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1747,16 +2183,31 @@ async def start_flow_execution( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1796,16 +2247,31 @@ async def stop_flow_execution( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1845,16 +2311,31 @@ async def tag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1892,16 +2373,31 @@ async def untag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1942,16 +2438,31 @@ async def update_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) diff --git a/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/config.py b/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/config.py index 220c466..4112317 100644 --- a/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/config.py +++ b/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/config.py @@ -1,24 +1,24 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -from dataclasses import dataclass -from typing import Any, Callable, TypeAlias, Union +from dataclasses import dataclass, field +from typing import Any, Callable, ClassVar, Self, TypeAlias, Union, 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.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ClientProtocol, ClientTransport, EndpointResolver +from smithy_core.aio.interfaces import ClientProtocol, EndpointResolver from smithy_core.aio.interfaces.auth import AuthScheme from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy from smithy_core.interceptors import Interceptor -from smithy_core.interfaces import URI -from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.crt import AWSCRTHTTPClient -from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import ( AMAZON_BEDROCK_AGENT_RUN_TIME_SERVICE as _SCHEMA_AMAZON_BEDROCK_AGENT_RUN_TIME_SERVICE, @@ -137,141 +137,136 @@ ] -@dataclass(init=False) -class Config: - """Configuration for Bedrock Agent Runtime.""" - - auth_scheme_resolver: HTTPAuthSchemeResolver - """ - An auth scheme resolver that determines the auth scheme for each - operation. - """ - - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] - """A map of auth scheme ids to auth schemes.""" - - aws_access_key_id: str | None - """The identifier for a secret access key.""" - - aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None - ) - """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" +class _AsyncBedrockAgentRuntimeConfigOverrides(AwsConfigOverrides, total=False): + endpoint_resolver: EndpointResolver | None + protocol: ClientProtocol[Any, Any] | None + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None - aws_secret_access_key: str | None - """A secret access key that can be used to sign requests.""" - aws_session_token: str | None - """An access key ID that identifies temporary security credentials.""" +@dataclass(kw_only=True, repr=False, init=False) +class AsyncBedrockAgentRuntimeConfig(AsyncAwsConfig): + """Bedrock Agent Runtime configuration (async-resolved).""" - endpoint_resolver: EndpointResolver + endpoint_resolver: EndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - endpoint_uri: str | URI | None - """A static URI to route requests to.""" - - http_request_config: HTTPRequestConfiguration | None - """Configuration for individual HTTP requests.""" + protocol: ClientProtocol[Any, Any] | None = None + """The protocol to serialize and deserialize requests with.""" - interceptors: list[_ServiceInterceptor] + interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) """ The list of interceptors, which are hooks that are called during the execution of a request. """ - protocol: ClientProtocol[Any, Any] | None - """The protocol to serialize and deserialize requests with.""" + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + """A map of auth scheme ids to auth schemes.""" - region: str | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None = None """ - The AWS region to connect to. The configured region is used to determine - the service endpoint. + An auth scheme resolver that determines the auth scheme for each + operation. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + aws_credentials_identity_resolver: ( + IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + ) = None + """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" + + region: str | None = None """ - The retry strategy or options for configuring retry behavior. Can be - either a configured RetryStrategy or RetryStrategyOptions to create one. + The AWS region to connect to. The configured region is used to determine + the service endpoint. """ - sdk_ua_app_id: str | None + aws_access_key_id: str | None = None + """The identifier for a secret access key.""" + + aws_secret_access_key: str | None = None + """A secret access key that can be used to sign requests.""" + + aws_session_token: str | None = None + """The session token used with temporary AWS credentials.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + sdk_ua_app_id: str | None = None """ A unique and opaque application ID that is appended to the User-Agent header. """ - transport: ClientTransport[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 - streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. - """ - - user_agent_extra: str | None - """Additional suffix to be added to the User-Agent header.""" - - def __init__( - self, - *, - auth_scheme_resolver: HTTPAuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - aws_access_key_id: str | None = None, - aws_credentials_identity_resolver: IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties - ] - | None = None, - aws_secret_access_key: str | None = None, - aws_session_token: str | None = None, - endpoint_resolver: EndpointResolver | None = None, - endpoint_uri: str | URI | None = None, - http_request_config: HTTPRequestConfiguration | None = None, - interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] | None = None, - region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, - sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, - user_agent_extra: str | None = None, - ): - self.auth_scheme_resolver = auth_scheme_resolver or HTTPAuthSchemeResolver() - self.auth_schemes = auth_schemes or { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="bedrock") - } - self.aws_access_key_id = aws_access_key_id - self.aws_credentials_identity_resolver = aws_credentials_identity_resolver - self.aws_secret_access_key = aws_secret_access_key - self.aws_session_token = aws_session_token - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="bedrock-agent-runtime" - ) - self.endpoint_uri = endpoint_uri - self.http_request_config = http_request_config - self.interceptors = interceptors or [] - self.protocol = protocol or RestJsonClientProtocol( - _SCHEMA_AMAZON_BEDROCK_AGENT_RUN_TIME_SERVICE - ) - self.region = region - self.retry_strategy = retry_strategy - self.sdk_ua_app_id = sdk_ua_app_id - self.transport = transport or AWSCRTHTTPClient() - self.user_agent_extra = user_agent_extra + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "aws_credentials_identity_resolver": FieldSpec(default=None), + "region": FieldSpec(default=None), + "aws_access_key_id": FieldSpec(default=None), + "aws_secret_access_key": FieldSpec(default=None), + "aws_session_token": FieldSpec(default=None), + "user_agent_extra": FieldSpec(default=None), + "sdk_ua_app_id": FieldSpec(default=None), + **AsyncAwsConfig._FIELDS, + "endpoint_uri": FieldSpec( + default=None, resolver=EndpointUriResolver("bedrock_agent_runtime") + ), + "endpoint_resolver": FieldSpec( + default_factory=lambda: StandardRegionalEndpointsResolver( + endpoint_prefix="bedrock-agent-runtime" + ) + ), + "protocol": FieldSpec( + default_factory=lambda: RestJsonClientProtocol( + _SCHEMA_AMAZON_BEDROCK_AGENT_RUN_TIME_SERVICE + ) + ), + "auth_schemes": FieldSpec( + default_factory=lambda: { + ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="bedrock") + } + ), + "auth_scheme_resolver": FieldSpec(default_factory=HTTPAuthSchemeResolver), + "transport": FieldSpec(default_factory=lambda: AWSCRTHTTPClient()), + } def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None: """ - Sets the implementation of an auth scheme. - - Using this method ensures the correct key is used. + Set an auth scheme implementation using its scheme ID. :param scheme: + The auth scheme to add or replace. + """ + auth_schemes = dict(self.auth_schemes or {}) + auth_schemes[scheme.scheme_id] = scheme + self.auth_schemes = auth_schemes - Args: - scheme: - The auth scheme to add. + @classmethod + async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] + cls, + *, + profile: str | None = None, + fs: FileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[_AsyncBedrockAgentRuntimeConfigOverrides], + ) -> Self: + """ + Resolve config from environment, config files, defaults, and explicit + overrides. """ - self.auth_schemes[scheme.scheme_id] = scheme + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) -Plugin: TypeAlias = Callable[[Config], None] -"""A callable that allows customizing the config object on each request.""" +Plugin: TypeAlias = Callable[[AsyncBedrockAgentRuntimeConfig], None] +""" +A callable that customizes a client configuration. Service-level plugins +are applied once to the base configuration inherited by every operation. +Operation-level plugins apply only to a single operation invocation. +""" diff --git a/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/models.py b/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/models.py index a0981fb..71ca727 100644 --- a/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/models.py +++ b/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/models.py @@ -5470,7 +5470,7 @@ class AgenticRetrieveType(UnknownEnumMixin, StrEnum): """The type of retrieval source.""" BEDROCK_KNOWLEDGE_BASE = "BedrockKnowledgeBase" - """A Bedrock knowledge base retrieval source. """ + """A Bedrock knowledge base retrieval source.""" @dataclass(kw_only=True) @@ -5563,24 +5563,24 @@ class AgenticRetrieveStatus(UnknownEnumMixin, StrEnum): """The status of an agentic retrieval step.""" IN_PROGRESS = "IN_PROGRESS" - """The step is currently in progress. """ + """The step is currently in progress.""" SUCCEEDED = "SUCCEEDED" - """The step completed successfully. """ + """The step completed successfully.""" FAILED = "FAILED" - """The step failed. """ + """The step failed.""" class AgenticRetrieveStep(UnknownEnumMixin, StrEnum): """The step in the agentic retrieval process.""" PLANNING = "Planning" - """The planning phase of retrieval. """ + """The planning phase of retrieval.""" RETRIEVAL = "Retrieval" - """The retrieval phase where data is fetched. """ + """The retrieval phase where data is fetched.""" SPECULATIVE_RETRIEVAL = "SpeculativeRetrieval" - """A speculative retrieval phase for optimization. """ + """A speculative retrieval phase for optimization.""" FULL_DOCUMENT_EXPANSION = "FullDocumentExpansion" - """The full document expansion phase. """ + """The full document expansion phase.""" @dataclass(kw_only=True) diff --git a/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/user_agent.py b/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/user_agent.py index 2e23294..98455ec 100644 --- a/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/user_agent.py +++ b/clients/aws-sdk-bedrock-agent-runtime/src/aws_sdk_bedrock_agent_runtime/user_agent.py @@ -3,10 +3,10 @@ from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor from . import __version__ -from .config import Config +from .config import AsyncBedrockAgentRuntimeConfig -def aws_user_agent_plugin(config: Config): +def aws_user_agent_plugin(config: AsyncBedrockAgentRuntimeConfig): config.interceptors.append( UserAgentInterceptor( ua_suffix=config.user_agent_extra, diff --git a/clients/aws-sdk-bedrock-agent-runtime/tests/test_protocol.py b/clients/aws-sdk-bedrock-agent-runtime/tests/test_restjson_protocol.py similarity index 100% rename from clients/aws-sdk-bedrock-agent-runtime/tests/test_protocol.py rename to clients/aws-sdk-bedrock-agent-runtime/tests/test_restjson_protocol.py diff --git a/clients/aws-sdk-bedrock-agent/.changes/0.10.0.json b/clients/aws-sdk-bedrock-agent/.changes/0.10.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/clients/aws-sdk-bedrock-agent/.changes/0.10.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-bedrock-agent/CHANGELOG.md b/clients/aws-sdk-bedrock-agent/CHANGELOG.md index 3bcda4e..58d2b7e 100644 --- a/clients/aws-sdk-bedrock-agent/CHANGELOG.md +++ b/clients/aws-sdk-bedrock-agent/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### Dependencies diff --git a/clients/aws-sdk-bedrock-agent/pyproject.toml b/clients/aws-sdk-bedrock-agent/pyproject.toml index 1d39605..4dba43d 100644 --- a/clients/aws-sdk-bedrock-agent/pyproject.toml +++ b/clients/aws-sdk-bedrock-agent/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "aws_sdk_bedrock_agent" -version = "0.9.0" +version = "0.10.0" description = "aws_sdk_bedrock_agent client" readme = "README.md" requires-python = ">=3.12" @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ - "smithy_aws_core[json]~=0.9.0", + "smithy_aws_core[json]~=0.10.0", "smithy_core~=0.8.0", "smithy_http[aiohttp]~=0.4.0" ] diff --git a/clients/aws-sdk-bedrock-agent/scripts/docs/generate_doc_stubs.py b/clients/aws-sdk-bedrock-agent/scripts/docs/generate_doc_stubs.py index b00ac66..56ab5a8 100644 --- a/clients/aws-sdk-bedrock-agent/scripts/docs/generate_doc_stubs.py +++ b/clients/aws-sdk-bedrock-agent/scripts/docs/generate_doc_stubs.py @@ -8,6 +8,7 @@ import argparse import logging +import re import sys from collections.abc import Sequence from dataclasses import dataclass @@ -115,19 +116,43 @@ class ClientInfo: class DocStubGenerator: """Generate markdown API Reference stubs for AWS SDK for Python clients.""" - def __init__(self, client_dir: Path, output_dir: Path) -> None: + def __init__(self, client_dir: Path, output_dir: Path, service_name: str | None = None) -> None: """ Initialize the documentation generator. Args: client_dir: Path to the client source directory output_dir: Path to the output directory for generated doc stubs + service_name: Display name for the service (e.g. the Smithy sdkId + "SNS"). When omitted, falls back to a title-cased derivation of + the package name, which does not preserve acronym casing. """ self.client_dir = client_dir self.output_dir = output_dir - # Extract service name from package name - # (e.g., "aws_sdk_bedrock_runtime" -> "Bedrock Runtime") - self.service_name = client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + # Use the explicit override, then the sdkId from the package, then + # fall back to a title-cased package name (does not keep acronym + # casing, so "sns" becomes "Sns"). + self.service_name = ( + service_name + or self._sdk_id_from_package(client_dir) + or client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + ) + + @staticmethod + def _sdk_id_from_package(client_dir: Path) -> str | None: + """ + Read the authoritative service name (Smithy sdkId) from the package. + + The generated ``_private/schemas.py`` carries the ``aws.api#service`` + trait's ``sdkId`` (e.g. "SNS"), the same field the sidebar navigation + uses, so it keeps acronym casing that the package name does not. + Returns None if the file or value is absent. + """ + schemas = client_dir / "_private" / "schemas.py" + if not schemas.is_file(): + return None + match = re.search(r'"sdkId":\s*"([^"]+)"', schemas.read_text()) + return match.group(1) if match else None def generate(self) -> bool: """ @@ -166,10 +191,13 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: if not client_class: raise ValueError(f"No class ending with 'Client' found in {package_name}.client") - config_class = config_module.members.get("Config") + config_class = self._find_class_with_suffix(config_module, "Config") + if not config_class: + raise ValueError(f"No class ending with 'Config' found in {package_name}.config") + plugin_alias = config_module.members.get("Plugin") - if not config_class or not plugin_alias: - raise ValueError(f"Missing Config or Plugin in {package_name}.config") + if not plugin_alias: + raise ValueError(f"Missing Plugin in {package_name}.config") config = TypeInfo(name=config_class.name, module_path=config_class.path) plugin = TypeInfo(name=plugin_alias.name, module_path=plugin_alias.path) @@ -194,8 +222,12 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: ) def _find_class_with_suffix(self, module: Module, suffix: str) -> Class | None: - """Find the class in the module with a matching suffix.""" + """Find the class defined in the module with a matching suffix.""" for cls in module.classes.values(): + # Skip imported classes so a same-package import (e.g. a *Config + # class re-exported from config.py) can't shadow the defined one. + if cls.is_imported: + continue if cls.name.endswith(suffix): return cls return None @@ -616,6 +648,12 @@ def main() -> int: required=True, help="Output directory for generated doc stubs", ) + parser.add_argument( + "-s", + "--service-name", + default=None, + help="Display name for the service (Smithy sdkId, e.g. 'SNS')", + ) args = parser.parse_args() client_dir = args.client_dir.resolve() @@ -626,7 +664,7 @@ def main() -> int: return 1 try: - generator = DocStubGenerator(client_dir, output_dir) + generator = DocStubGenerator(client_dir, output_dir, args.service_name) success = generator.generate() return 0 if success else 1 except Exception as e: diff --git a/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/__init__.py b/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/__init__.py index 7e20a8c..3c99375 100644 --- a/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/__init__.py +++ b/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/__init__.py @@ -1,3 +1,3 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -__version__: str = "0.9.0" +__version__: str = "0.10.0" diff --git a/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/client.py b/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/client.py index 5b320cf..4662c0b 100644 --- a/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/client.py +++ b/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/client.py @@ -1,5 +1,6 @@ # Code generated by smithy-python-codegen DO NOT EDIT. +import asyncio from copy import deepcopy import logging @@ -10,7 +11,7 @@ from smithy_core.types import TypedProperties from smithy_http.plugins import user_agent_plugin -from .config import Config, Plugin +from .config import AsyncBedrockAgentConfig, Plugin from .models import ( ASSOCIATE_AGENT_COLLABORATOR, ASSOCIATE_AGENT_KNOWLEDGE_BASE, @@ -251,7 +252,9 @@ class AsyncBedrockAgentClient: """ def __init__( - self, config: Config | None = None, plugins: list[Plugin] | None = None + self, + config: AsyncBedrockAgentConfig | None = None, + plugins: list[Plugin] | None = None, ): """ Constructor for `AsyncBedrockAgentClient`. @@ -261,19 +264,32 @@ def __init__( Optional configuration for the client. Here you can set things like the endpoint for HTTP services or auth credentials. plugins: - A list of callables that modify the configuration dynamically. These - can be used to set defaults, for example. + A list of callables applied once to the client's base configuration. + Their changes are inherited by every operation invocation. """ - self._config = config or Config() - - client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] - if plugins: - client_plugins.extend(plugins) - - for plugin in client_plugins: - plugin(self._config) - + self._config = config + self._plugins = plugins + self._derive_lock = asyncio.Lock() + self._setup_done = False self._retry_strategy_resolver = RetryStrategyResolver() + self._client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] + + async def _ensure_setup(self) -> None: + if not self._setup_done: + async with self._derive_lock: + if not self._setup_done: + if self._config is None: + config = await AsyncBedrockAgentConfig.resolve() + else: + # Copy so plugins don't mutate the caller's config. + config = deepcopy(self._config) + for plugin in self._client_plugins: + plugin(config) + if self._plugins: + for plugin in self._plugins: + plugin(config) + self._config = config + self._setup_done = True async def associate_agent_collaborator( self, @@ -298,16 +314,31 @@ async def associate_agent_collaborator( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -349,16 +380,31 @@ async def associate_agent_knowledge_base( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -429,16 +475,31 @@ async def create_agent( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -494,16 +555,31 @@ async def create_agent_action_group( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -541,16 +617,31 @@ async def create_agent_alias( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -594,16 +685,31 @@ async def create_data_source( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -648,16 +754,31 @@ async def create_flow( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -698,16 +819,31 @@ async def create_flow_alias( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -748,16 +884,31 @@ async def create_flow_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -841,16 +992,31 @@ async def create_knowledge_base( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -895,16 +1061,31 @@ async def create_prompt( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -946,16 +1127,31 @@ async def create_prompt_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -993,16 +1189,31 @@ async def delete_agent( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1040,16 +1251,31 @@ async def delete_agent_action_group( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1087,16 +1313,31 @@ async def delete_agent_alias( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1134,16 +1375,31 @@ async def delete_agent_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1181,16 +1437,31 @@ async def delete_data_source( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1228,16 +1499,31 @@ async def delete_flow( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1275,16 +1561,31 @@ async def delete_flow_alias( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1322,16 +1623,31 @@ async def delete_flow_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1373,16 +1689,31 @@ async def delete_knowledge_base( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1426,16 +1757,31 @@ async def delete_knowledge_base_documents( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1479,16 +1825,31 @@ async def delete_prompt( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1528,16 +1889,31 @@ async def delete_resource_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1577,16 +1953,31 @@ async def disassociate_agent_collaborator( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1626,16 +2017,31 @@ async def disassociate_agent_knowledge_base( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1673,16 +2079,31 @@ async def get_agent( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1720,16 +2141,31 @@ async def get_agent_action_group( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1767,16 +2203,31 @@ async def get_agent_alias( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1814,16 +2265,31 @@ async def get_agent_collaborator( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1861,16 +2327,31 @@ async def get_agent_knowledge_base( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1908,16 +2389,31 @@ async def get_agent_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1955,16 +2451,31 @@ async def get_data_source( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2005,16 +2516,31 @@ async def get_flow( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2055,16 +2581,31 @@ async def get_flow_alias( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2105,16 +2646,31 @@ async def get_flow_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2154,16 +2710,31 @@ async def get_ingestion_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2201,16 +2772,31 @@ async def get_knowledge_base( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2252,16 +2838,31 @@ async def get_knowledge_base_documents( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2306,16 +2907,31 @@ async def get_prompt( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2353,16 +2969,31 @@ async def get_resource_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2408,16 +3039,31 @@ async def ingest_knowledge_base_documents( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2455,16 +3101,31 @@ async def list_agent_action_groups( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2502,16 +3163,31 @@ async def list_agent_aliases( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2549,16 +3225,31 @@ async def list_agent_collaborators( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2597,16 +3288,31 @@ async def list_agent_knowledge_bases( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2645,16 +3351,31 @@ async def list_agents( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2692,16 +3413,31 @@ async def list_agent_versions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2740,16 +3476,31 @@ async def list_data_sources( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2787,16 +3538,31 @@ async def list_flow_aliases( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2837,16 +3603,31 @@ async def list_flows( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2887,16 +3668,31 @@ async def list_flow_versions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2935,16 +3731,31 @@ async def list_ingestion_jobs( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2988,16 +3799,31 @@ async def list_knowledge_base_documents( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3036,16 +3862,31 @@ async def list_knowledge_bases( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3089,16 +3930,31 @@ async def list_prompts( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3136,16 +3992,31 @@ async def list_tags_for_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3184,16 +4055,31 @@ async def prepare_agent( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3234,16 +4120,31 @@ async def prepare_flow( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3284,16 +4185,31 @@ async def put_resource_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3332,16 +4248,31 @@ async def start_ingestion_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3381,16 +4312,31 @@ async def stop_ingestion_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3430,16 +4376,31 @@ async def tag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3477,16 +4438,31 @@ async def untag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3524,16 +4500,31 @@ async def update_agent( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3571,16 +4562,31 @@ async def update_agent_action_group( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3618,16 +4624,31 @@ async def update_agent_alias( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3665,16 +4686,31 @@ async def update_agent_collaborator( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3713,16 +4749,31 @@ async def update_agent_knowledge_base( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3764,16 +4815,31 @@ async def update_data_source( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3816,16 +4882,31 @@ async def update_flow( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3867,16 +4948,31 @@ async def update_flow_alias( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3930,16 +5026,31 @@ async def update_knowledge_base( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3983,16 +5094,31 @@ async def update_prompt( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4030,16 +5156,31 @@ async def validate_flow_definition( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) diff --git a/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/config.py b/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/config.py index b04a0e0..94e9cee 100644 --- a/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/config.py +++ b/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/config.py @@ -1,24 +1,24 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -from dataclasses import dataclass -from typing import Any, Callable, TypeAlias, Union +from dataclasses import dataclass, field +from typing import Any, Callable, ClassVar, Self, TypeAlias, Union, 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.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ClientProtocol, ClientTransport, EndpointResolver +from smithy_core.aio.interfaces import ClientProtocol, EndpointResolver from smithy_core.aio.interfaces.auth import AuthScheme from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy from smithy_core.interceptors import Interceptor -from smithy_core.interfaces import URI -from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.aiohttp import AIOHTTPClient -from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import ( AMAZON_BEDROCK_AGENT_BUILD_TIME_LAMBDA as _SCHEMA_AMAZON_BEDROCK_AGENT_BUILD_TIME_LAMBDA, @@ -281,141 +281,136 @@ ] -@dataclass(init=False) -class Config: - """Configuration for Bedrock Agent.""" - - auth_scheme_resolver: HTTPAuthSchemeResolver - """ - An auth scheme resolver that determines the auth scheme for each - operation. - """ - - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] - """A map of auth scheme ids to auth schemes.""" - - aws_access_key_id: str | None - """The identifier for a secret access key.""" - - aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None - ) - """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" +class _AsyncBedrockAgentConfigOverrides(AwsConfigOverrides, total=False): + endpoint_resolver: EndpointResolver | None + protocol: ClientProtocol[Any, Any] | None + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None - aws_secret_access_key: str | None - """A secret access key that can be used to sign requests.""" - aws_session_token: str | None - """An access key ID that identifies temporary security credentials.""" +@dataclass(kw_only=True, repr=False, init=False) +class AsyncBedrockAgentConfig(AsyncAwsConfig): + """Bedrock Agent configuration (async-resolved).""" - endpoint_resolver: EndpointResolver + endpoint_resolver: EndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - endpoint_uri: str | URI | None - """A static URI to route requests to.""" - - http_request_config: HTTPRequestConfiguration | None - """Configuration for individual HTTP requests.""" + protocol: ClientProtocol[Any, Any] | None = None + """The protocol to serialize and deserialize requests with.""" - interceptors: list[_ServiceInterceptor] + interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) """ The list of interceptors, which are hooks that are called during the execution of a request. """ - protocol: ClientProtocol[Any, Any] | None - """The protocol to serialize and deserialize requests with.""" + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + """A map of auth scheme ids to auth schemes.""" - region: str | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None = None """ - The AWS region to connect to. The configured region is used to determine - the service endpoint. + An auth scheme resolver that determines the auth scheme for each + operation. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + aws_credentials_identity_resolver: ( + IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + ) = None + """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" + + region: str | None = None """ - The retry strategy or options for configuring retry behavior. Can be - either a configured RetryStrategy or RetryStrategyOptions to create one. + The AWS region to connect to. The configured region is used to determine + the service endpoint. """ - sdk_ua_app_id: str | None + aws_access_key_id: str | None = None + """The identifier for a secret access key.""" + + aws_secret_access_key: str | None = None + """A secret access key that can be used to sign requests.""" + + aws_session_token: str | None = None + """The session token used with temporary AWS credentials.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + sdk_ua_app_id: str | None = None """ A unique and opaque application ID that is appended to the User-Agent header. """ - transport: ClientTransport[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 - streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. - """ - - user_agent_extra: str | None - """Additional suffix to be added to the User-Agent header.""" - - def __init__( - self, - *, - auth_scheme_resolver: HTTPAuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - aws_access_key_id: str | None = None, - aws_credentials_identity_resolver: IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties - ] - | None = None, - aws_secret_access_key: str | None = None, - aws_session_token: str | None = None, - endpoint_resolver: EndpointResolver | None = None, - endpoint_uri: str | URI | None = None, - http_request_config: HTTPRequestConfiguration | None = None, - interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] | None = None, - region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, - sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, - user_agent_extra: str | None = None, - ): - self.auth_scheme_resolver = auth_scheme_resolver or HTTPAuthSchemeResolver() - self.auth_schemes = auth_schemes or { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="bedrock") - } - self.aws_access_key_id = aws_access_key_id - self.aws_credentials_identity_resolver = aws_credentials_identity_resolver - self.aws_secret_access_key = aws_secret_access_key - self.aws_session_token = aws_session_token - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="bedrock-agent" - ) - self.endpoint_uri = endpoint_uri - self.http_request_config = http_request_config - self.interceptors = interceptors or [] - self.protocol = protocol or RestJsonClientProtocol( - _SCHEMA_AMAZON_BEDROCK_AGENT_BUILD_TIME_LAMBDA - ) - self.region = region - self.retry_strategy = retry_strategy - self.sdk_ua_app_id = sdk_ua_app_id - self.transport = transport or AIOHTTPClient() - self.user_agent_extra = user_agent_extra + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "aws_credentials_identity_resolver": FieldSpec(default=None), + "region": FieldSpec(default=None), + "aws_access_key_id": FieldSpec(default=None), + "aws_secret_access_key": FieldSpec(default=None), + "aws_session_token": FieldSpec(default=None), + "user_agent_extra": FieldSpec(default=None), + "sdk_ua_app_id": FieldSpec(default=None), + **AsyncAwsConfig._FIELDS, + "endpoint_uri": FieldSpec( + default=None, resolver=EndpointUriResolver("bedrock_agent") + ), + "endpoint_resolver": FieldSpec( + default_factory=lambda: StandardRegionalEndpointsResolver( + endpoint_prefix="bedrock-agent" + ) + ), + "protocol": FieldSpec( + default_factory=lambda: RestJsonClientProtocol( + _SCHEMA_AMAZON_BEDROCK_AGENT_BUILD_TIME_LAMBDA + ) + ), + "auth_schemes": FieldSpec( + default_factory=lambda: { + ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="bedrock") + } + ), + "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: """ - Sets the implementation of an auth scheme. - - Using this method ensures the correct key is used. + Set an auth scheme implementation using its scheme ID. :param scheme: + The auth scheme to add or replace. + """ + auth_schemes = dict(self.auth_schemes or {}) + auth_schemes[scheme.scheme_id] = scheme + self.auth_schemes = auth_schemes - Args: - scheme: - The auth scheme to add. + @classmethod + async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] + cls, + *, + profile: str | None = None, + fs: FileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[_AsyncBedrockAgentConfigOverrides], + ) -> Self: + """ + Resolve config from environment, config files, defaults, and explicit + overrides. """ - self.auth_schemes[scheme.scheme_id] = scheme + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) -Plugin: TypeAlias = Callable[[Config], None] -"""A callable that allows customizing the config object on each request.""" +Plugin: TypeAlias = Callable[[AsyncBedrockAgentConfig], None] +""" +A callable that customizes a client configuration. Service-level plugins +are applied once to the base configuration inherited by every operation. +Operation-level plugins apply only to a single operation invocation. +""" diff --git a/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/models.py b/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/models.py index 1ecbd45..403f772 100644 --- a/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/models.py +++ b/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/models.py @@ -4653,9 +4653,9 @@ class AliasInvocationState(UnknownEnumMixin, StrEnum): """Enum representing the invocation state of an agent alias""" ACCEPT_INVOCATIONS = "ACCEPT_INVOCATIONS" - """Agent is actively processing requests """ + """Agent is actively processing requests""" REJECT_INVOCATIONS = "REJECT_INVOCATIONS" - """Agent is paused and will not accept new requests """ + """Agent is paused and will not accept new requests""" @dataclass(kw_only=True) diff --git a/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/user_agent.py b/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/user_agent.py index 1e2f7d8..4c1213e 100644 --- a/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/user_agent.py +++ b/clients/aws-sdk-bedrock-agent/src/aws_sdk_bedrock_agent/user_agent.py @@ -3,10 +3,10 @@ from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor from . import __version__ -from .config import Config +from .config import AsyncBedrockAgentConfig -def aws_user_agent_plugin(config: Config): +def aws_user_agent_plugin(config: AsyncBedrockAgentConfig): config.interceptors.append( UserAgentInterceptor( ua_suffix=config.user_agent_extra, diff --git a/clients/aws-sdk-bedrock-agent/tests/test_protocol.py b/clients/aws-sdk-bedrock-agent/tests/test_restjson_protocol.py similarity index 100% rename from clients/aws-sdk-bedrock-agent/tests/test_protocol.py rename to clients/aws-sdk-bedrock-agent/tests/test_restjson_protocol.py diff --git a/clients/aws-sdk-bedrock-agentcore-control/.changes/0.10.0.json b/clients/aws-sdk-bedrock-agentcore-control/.changes/0.10.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/clients/aws-sdk-bedrock-agentcore-control/.changes/0.10.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-bedrock-agentcore-control/CHANGELOG.md b/clients/aws-sdk-bedrock-agentcore-control/CHANGELOG.md index 34b0ed0..7e1b62c 100644 --- a/clients/aws-sdk-bedrock-agentcore-control/CHANGELOG.md +++ b/clients/aws-sdk-bedrock-agentcore-control/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### API Changes diff --git a/clients/aws-sdk-bedrock-agentcore-control/pyproject.toml b/clients/aws-sdk-bedrock-agentcore-control/pyproject.toml index 7648326..18de596 100644 --- a/clients/aws-sdk-bedrock-agentcore-control/pyproject.toml +++ b/clients/aws-sdk-bedrock-agentcore-control/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "aws_sdk_bedrock_agentcore_control" -version = "0.9.0" +version = "0.10.0" description = "aws_sdk_bedrock_agentcore_control client" readme = "README.md" requires-python = ">=3.12" @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ - "smithy_aws_core[json]~=0.9.0", + "smithy_aws_core[json]~=0.10.0", "smithy_core~=0.8.0", "smithy_http[aiohttp]~=0.4.0" ] diff --git a/clients/aws-sdk-bedrock-agentcore-control/scripts/docs/generate_doc_stubs.py b/clients/aws-sdk-bedrock-agentcore-control/scripts/docs/generate_doc_stubs.py index b00ac66..56ab5a8 100644 --- a/clients/aws-sdk-bedrock-agentcore-control/scripts/docs/generate_doc_stubs.py +++ b/clients/aws-sdk-bedrock-agentcore-control/scripts/docs/generate_doc_stubs.py @@ -8,6 +8,7 @@ import argparse import logging +import re import sys from collections.abc import Sequence from dataclasses import dataclass @@ -115,19 +116,43 @@ class ClientInfo: class DocStubGenerator: """Generate markdown API Reference stubs for AWS SDK for Python clients.""" - def __init__(self, client_dir: Path, output_dir: Path) -> None: + def __init__(self, client_dir: Path, output_dir: Path, service_name: str | None = None) -> None: """ Initialize the documentation generator. Args: client_dir: Path to the client source directory output_dir: Path to the output directory for generated doc stubs + service_name: Display name for the service (e.g. the Smithy sdkId + "SNS"). When omitted, falls back to a title-cased derivation of + the package name, which does not preserve acronym casing. """ self.client_dir = client_dir self.output_dir = output_dir - # Extract service name from package name - # (e.g., "aws_sdk_bedrock_runtime" -> "Bedrock Runtime") - self.service_name = client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + # Use the explicit override, then the sdkId from the package, then + # fall back to a title-cased package name (does not keep acronym + # casing, so "sns" becomes "Sns"). + self.service_name = ( + service_name + or self._sdk_id_from_package(client_dir) + or client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + ) + + @staticmethod + def _sdk_id_from_package(client_dir: Path) -> str | None: + """ + Read the authoritative service name (Smithy sdkId) from the package. + + The generated ``_private/schemas.py`` carries the ``aws.api#service`` + trait's ``sdkId`` (e.g. "SNS"), the same field the sidebar navigation + uses, so it keeps acronym casing that the package name does not. + Returns None if the file or value is absent. + """ + schemas = client_dir / "_private" / "schemas.py" + if not schemas.is_file(): + return None + match = re.search(r'"sdkId":\s*"([^"]+)"', schemas.read_text()) + return match.group(1) if match else None def generate(self) -> bool: """ @@ -166,10 +191,13 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: if not client_class: raise ValueError(f"No class ending with 'Client' found in {package_name}.client") - config_class = config_module.members.get("Config") + config_class = self._find_class_with_suffix(config_module, "Config") + if not config_class: + raise ValueError(f"No class ending with 'Config' found in {package_name}.config") + plugin_alias = config_module.members.get("Plugin") - if not config_class or not plugin_alias: - raise ValueError(f"Missing Config or Plugin in {package_name}.config") + if not plugin_alias: + raise ValueError(f"Missing Plugin in {package_name}.config") config = TypeInfo(name=config_class.name, module_path=config_class.path) plugin = TypeInfo(name=plugin_alias.name, module_path=plugin_alias.path) @@ -194,8 +222,12 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: ) def _find_class_with_suffix(self, module: Module, suffix: str) -> Class | None: - """Find the class in the module with a matching suffix.""" + """Find the class defined in the module with a matching suffix.""" for cls in module.classes.values(): + # Skip imported classes so a same-package import (e.g. a *Config + # class re-exported from config.py) can't shadow the defined one. + if cls.is_imported: + continue if cls.name.endswith(suffix): return cls return None @@ -616,6 +648,12 @@ def main() -> int: required=True, help="Output directory for generated doc stubs", ) + parser.add_argument( + "-s", + "--service-name", + default=None, + help="Display name for the service (Smithy sdkId, e.g. 'SNS')", + ) args = parser.parse_args() client_dir = args.client_dir.resolve() @@ -626,7 +664,7 @@ def main() -> int: return 1 try: - generator = DocStubGenerator(client_dir, output_dir) + generator = DocStubGenerator(client_dir, output_dir, args.service_name) success = generator.generate() return 0 if success else 1 except Exception as e: diff --git a/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/__init__.py b/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/__init__.py index 7e20a8c..3c99375 100644 --- a/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/__init__.py +++ b/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/__init__.py @@ -1,3 +1,3 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -__version__: str = "0.9.0" +__version__: str = "0.10.0" diff --git a/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/client.py b/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/client.py index b2ed255..8f4ffc4 100644 --- a/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/client.py +++ b/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/client.py @@ -1,5 +1,6 @@ # Code generated by smithy-python-codegen DO NOT EDIT. +import asyncio from copy import deepcopy import logging @@ -10,7 +11,7 @@ from smithy_core.types import TypedProperties from smithy_http.plugins import user_agent_plugin -from .config import Config, Plugin +from .config import AsyncBedrockAgentCoreControlConfig, Plugin from .models import ( ADD_DATASET_EXAMPLES, AddDatasetExamplesInput, @@ -522,7 +523,9 @@ class AsyncBedrockAgentCoreControlClient: """ def __init__( - self, config: Config | None = None, plugins: list[Plugin] | None = None + self, + config: AsyncBedrockAgentCoreControlConfig | None = None, + plugins: list[Plugin] | None = None, ): """ Constructor for `AsyncBedrockAgentCoreControlClient`. @@ -532,19 +535,32 @@ def __init__( Optional configuration for the client. Here you can set things like the endpoint for HTTP services or auth credentials. plugins: - A list of callables that modify the configuration dynamically. These - can be used to set defaults, for example. + A list of callables applied once to the client's base configuration. + Their changes are inherited by every operation invocation. """ - self._config = config or Config() - - client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] - if plugins: - client_plugins.extend(plugins) - - for plugin in client_plugins: - plugin(self._config) - + self._config = config + self._plugins = plugins + self._derive_lock = asyncio.Lock() + self._setup_done = False self._retry_strategy_resolver = RetryStrategyResolver() + self._client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] + + async def _ensure_setup(self) -> None: + if not self._setup_done: + async with self._derive_lock: + if not self._setup_done: + if self._config is None: + config = await AsyncBedrockAgentCoreControlConfig.resolve() + else: + # Copy so plugins don't mutate the caller's config. + config = deepcopy(self._config) + for plugin in self._client_plugins: + plugin(config) + if self._plugins: + for plugin in self._plugins: + plugin(config) + self._config = config + self._setup_done = True async def add_dataset_examples( self, input: AddDatasetExamplesInput, plugins: list[Plugin] | None = None @@ -570,16 +586,31 @@ async def add_dataset_examples( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -620,16 +651,31 @@ async def batch_put_gateway_rate_limits( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -667,16 +713,31 @@ async def create_agent_runtime( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -716,16 +777,31 @@ async def create_agent_runtime_endpoint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -765,16 +841,31 @@ async def create_api_key_credential_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -812,16 +903,31 @@ async def create_browser( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -862,16 +968,31 @@ async def create_browser_profile( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -916,16 +1037,31 @@ async def create_capacity_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -963,16 +1099,31 @@ async def create_code_interpreter( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1012,16 +1163,31 @@ async def create_configuration_bundle( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1061,16 +1227,31 @@ async def create_dataset( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1111,16 +1292,31 @@ async def create_dataset_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1162,16 +1358,31 @@ async def create_evaluator( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1213,16 +1424,31 @@ async def create_gateway( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1262,16 +1488,31 @@ async def create_gateway_rate_limit( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1311,16 +1552,31 @@ async def create_gateway_rule( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1359,16 +1615,31 @@ async def create_gateway_target( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1406,16 +1677,31 @@ async def create_harness( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1453,16 +1739,31 @@ async def create_harness_endpoint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1500,16 +1801,31 @@ async def create_memory( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1549,16 +1865,31 @@ async def create_oauth2_credential_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1601,16 +1932,31 @@ async def create_online_evaluation_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1650,16 +1996,31 @@ async def create_payment_connector( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1701,16 +2062,31 @@ async def create_payment_credential_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1754,16 +2130,31 @@ async def create_payment_manager( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1812,16 +2203,31 @@ async def create_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1867,16 +2273,31 @@ async def create_policy_engine( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1920,16 +2341,31 @@ async def create_registry( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1972,16 +2408,31 @@ async def create_registry_record( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2019,16 +2470,31 @@ async def create_workload_identity( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2067,16 +2533,31 @@ async def delete_agent_runtime( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2116,16 +2597,31 @@ async def delete_agent_runtime_endpoint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2165,16 +2661,31 @@ async def delete_api_key_credential_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2212,16 +2723,31 @@ async def delete_browser( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2259,16 +2785,31 @@ async def delete_browser_profile( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2308,16 +2849,31 @@ async def delete_capacity_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2355,16 +2911,31 @@ async def delete_code_interpreter( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2402,16 +2973,31 @@ async def delete_configuration_bundle( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2451,16 +3037,31 @@ async def delete_dataset( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2500,16 +3101,31 @@ async def delete_dataset_examples( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2549,16 +3165,31 @@ async def delete_evaluator( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2596,16 +3227,31 @@ async def delete_gateway( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2643,16 +3289,31 @@ async def delete_gateway_rate_limit( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2690,16 +3351,31 @@ async def delete_gateway_rule( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2742,16 +3418,31 @@ async def delete_gateway_target( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2789,16 +3480,31 @@ async def delete_harness( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2836,16 +3542,31 @@ async def delete_harness_endpoint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2883,16 +3604,31 @@ async def delete_memory( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2932,16 +3668,31 @@ async def delete_oauth2_credential_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2982,16 +3733,31 @@ async def delete_online_evaluation_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3029,16 +3795,31 @@ async def delete_payment_connector( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3079,16 +3860,31 @@ async def delete_payment_credential_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3128,16 +3924,31 @@ async def delete_payment_manager( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3179,16 +3990,31 @@ async def delete_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3231,16 +4057,31 @@ async def delete_policy_engine( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3280,16 +4121,31 @@ async def delete_registry( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3328,16 +4184,31 @@ async def delete_registry_record( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3379,16 +4250,31 @@ async def delete_resource_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3426,16 +4312,31 @@ async def delete_workload_identity( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3473,16 +4374,31 @@ async def get_agent_runtime( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3520,16 +4436,31 @@ async def get_agent_runtime_endpoint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3569,16 +4500,31 @@ async def get_api_key_credential_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3616,16 +4562,31 @@ async def get_browser( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3663,16 +4624,31 @@ async def get_browser_profile( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3711,16 +4687,31 @@ async def get_capacity_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3758,16 +4749,31 @@ async def get_code_interpreter( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3808,16 +4814,31 @@ async def get_configuration_bundle( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3858,16 +4879,31 @@ async def get_configuration_bundle_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3907,16 +4943,31 @@ async def get_dataset( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3956,16 +5007,31 @@ async def get_evaluator( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4003,16 +5069,31 @@ async def get_gateway( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4050,16 +5131,31 @@ async def get_gateway_rate_limit( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4097,16 +5193,31 @@ async def get_gateway_rule( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4144,16 +5255,31 @@ async def get_gateway_target( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4191,16 +5317,31 @@ async def get_harness( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4238,16 +5379,31 @@ async def get_harness_endpoint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4285,16 +5441,31 @@ async def get_memory( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4334,16 +5505,31 @@ async def get_oauth2_credential_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4382,16 +5568,31 @@ async def get_online_evaluation_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4429,16 +5630,31 @@ async def get_payment_connector( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4478,16 +5694,31 @@ async def get_payment_credential_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4525,16 +5756,31 @@ async def get_payment_manager( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4575,16 +5821,31 @@ async def get_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4625,16 +5886,31 @@ async def get_policy_engine( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4678,16 +5954,31 @@ async def get_policy_engine_summary( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4728,16 +6019,31 @@ async def get_policy_generation( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4783,16 +6089,31 @@ async def get_policy_generation_summary( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4836,16 +6157,31 @@ async def get_policy_summary( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4883,16 +6219,31 @@ async def get_registry( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4930,16 +6281,31 @@ async def get_registry_record( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4981,16 +6347,31 @@ async def get_resource_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5028,16 +6409,31 @@ async def get_token_vault( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5075,16 +6471,31 @@ async def get_workload_identity( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5122,16 +6533,31 @@ async def list_agent_runtime_endpoints( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5169,16 +6595,31 @@ async def list_agent_runtimes( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5216,16 +6657,31 @@ async def list_agent_runtime_versions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5268,16 +6724,31 @@ async def list_agent_runtime_versions_by_capacity_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5317,16 +6788,31 @@ async def list_api_key_credential_providers( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5364,16 +6850,31 @@ async def list_browser_profiles( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5411,16 +6912,31 @@ async def list_browsers( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5461,16 +6977,31 @@ async def list_capacity_providers( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5508,16 +7039,31 @@ async def list_code_interpreters( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5555,16 +7101,31 @@ async def list_configuration_bundles( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5605,16 +7166,31 @@ async def list_configuration_bundle_versions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5655,16 +7231,31 @@ async def list_dataset_examples( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5702,16 +7293,31 @@ async def list_datasets( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5750,16 +7356,31 @@ async def list_dataset_versions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5798,16 +7419,31 @@ async def list_evaluators( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5846,16 +7482,31 @@ async def list_gateway_rate_limits( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5893,16 +7544,31 @@ async def list_gateway_rules( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5940,16 +7606,31 @@ async def list_gateways( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5987,16 +7668,31 @@ async def list_gateway_targets( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6034,16 +7730,31 @@ async def list_harness_endpoints( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6081,16 +7792,31 @@ async def list_harnesses( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6128,16 +7854,31 @@ async def list_harness_versions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6176,16 +7917,31 @@ async def list_memories( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6225,16 +7981,31 @@ async def list_oauth2_credential_providers( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6275,16 +8046,31 @@ async def list_online_evaluation_configs( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6322,16 +8108,31 @@ async def list_payment_connectors( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6371,16 +8172,31 @@ async def list_payment_credential_providers( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6418,16 +8234,31 @@ async def list_payment_managers( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6468,16 +8299,31 @@ async def list_policies( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6518,16 +8364,31 @@ async def list_policy_engines( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6571,16 +8432,31 @@ async def list_policy_engine_summaries( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6624,16 +8500,31 @@ async def list_policy_generation_assets( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6673,16 +8564,31 @@ async def list_policy_generations( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6728,16 +8634,31 @@ async def list_policy_generation_summaries( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6781,16 +8702,31 @@ async def list_policy_summaries( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6830,16 +8766,31 @@ async def list_registries( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6879,16 +8830,31 @@ async def list_registry_records( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6930,16 +8896,31 @@ async def list_tags_for_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -6977,16 +8958,31 @@ async def list_workload_identities( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7029,16 +9025,31 @@ async def put_resource_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7076,16 +9087,31 @@ async def set_token_vault_cmk( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7136,16 +9162,31 @@ async def start_policy_generation( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7187,16 +9228,31 @@ async def submit_registry_record_for_approval( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7244,16 +9300,31 @@ async def synchronize_gateway_targets( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7298,16 +9369,31 @@ async def tag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7349,16 +9435,31 @@ async def untag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7396,16 +9497,31 @@ async def update_agent_runtime( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7445,16 +9561,31 @@ async def update_agent_runtime_endpoint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7494,16 +9625,31 @@ async def update_api_key_credential_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7543,16 +9689,31 @@ async def update_capacity_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7592,16 +9753,31 @@ async def update_configuration_bundle( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7642,16 +9818,31 @@ async def update_dataset( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7692,16 +9883,31 @@ async def update_dataset_examples( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7741,16 +9947,31 @@ async def update_evaluator( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7788,16 +10009,31 @@ async def update_gateway( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7836,16 +10072,31 @@ async def update_gateway_rate_limit( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7883,16 +10134,31 @@ async def update_gateway_rule( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7935,16 +10201,31 @@ async def update_gateway_target( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -7982,16 +10263,31 @@ async def update_harness( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -8029,16 +10325,31 @@ async def update_harness_endpoint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -8076,16 +10387,31 @@ async def update_memory( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -8125,16 +10451,31 @@ async def update_oauth2_credential_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -8176,16 +10517,31 @@ async def update_online_evaluation_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -8224,16 +10580,31 @@ async def update_payment_connector( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -8274,16 +10645,31 @@ async def update_payment_credential_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -8322,16 +10708,31 @@ async def update_payment_manager( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -8374,16 +10775,31 @@ async def update_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -8425,16 +10841,31 @@ async def update_policy_engine( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -8473,16 +10904,31 @@ async def update_registry( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -8522,16 +10968,31 @@ async def update_registry_record( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -8572,16 +11033,31 @@ async def update_registry_record_status( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -8619,16 +11095,31 @@ async def update_workload_identity( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) diff --git a/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/config.py b/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/config.py index aa0dc92..69ce31e 100644 --- a/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/config.py +++ b/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/config.py @@ -1,24 +1,24 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -from dataclasses import dataclass -from typing import Any, Callable, TypeAlias, Union +from dataclasses import dataclass, field +from typing import Any, Callable, ClassVar, Self, TypeAlias, Union, 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.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ClientProtocol, ClientTransport, EndpointResolver +from smithy_core.aio.interfaces import ClientProtocol, EndpointResolver from smithy_core.aio.interfaces.auth import AuthScheme from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy from smithy_core.interceptors import Interceptor -from smithy_core.interfaces import URI -from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.aiohttp import AIOHTTPClient -from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import ( AMAZON_BEDROCK_AGENT_CORE_CONTROL as _SCHEMA_AMAZON_BEDROCK_AGENT_CORE_CONTROL, @@ -658,141 +658,136 @@ ] -@dataclass(init=False) -class Config: - """Configuration for Bedrock AgentCore Control.""" - - auth_scheme_resolver: HTTPAuthSchemeResolver - """ - An auth scheme resolver that determines the auth scheme for each - operation. - """ - - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] - """A map of auth scheme ids to auth schemes.""" - - aws_access_key_id: str | None - """The identifier for a secret access key.""" - - aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None - ) - """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" +class _AsyncBedrockAgentCoreControlConfigOverrides(AwsConfigOverrides, total=False): + endpoint_resolver: EndpointResolver | None + protocol: ClientProtocol[Any, Any] | None + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None - aws_secret_access_key: str | None - """A secret access key that can be used to sign requests.""" - aws_session_token: str | None - """An access key ID that identifies temporary security credentials.""" +@dataclass(kw_only=True, repr=False, init=False) +class AsyncBedrockAgentCoreControlConfig(AsyncAwsConfig): + """Bedrock AgentCore Control configuration (async-resolved).""" - endpoint_resolver: EndpointResolver + endpoint_resolver: EndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - endpoint_uri: str | URI | None - """A static URI to route requests to.""" - - http_request_config: HTTPRequestConfiguration | None - """Configuration for individual HTTP requests.""" + protocol: ClientProtocol[Any, Any] | None = None + """The protocol to serialize and deserialize requests with.""" - interceptors: list[_ServiceInterceptor] + interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) """ The list of interceptors, which are hooks that are called during the execution of a request. """ - protocol: ClientProtocol[Any, Any] | None - """The protocol to serialize and deserialize requests with.""" + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + """A map of auth scheme ids to auth schemes.""" - region: str | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None = None """ - The AWS region to connect to. The configured region is used to determine - the service endpoint. + An auth scheme resolver that determines the auth scheme for each + operation. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + aws_credentials_identity_resolver: ( + IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + ) = None + """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" + + region: str | None = None """ - The retry strategy or options for configuring retry behavior. Can be - either a configured RetryStrategy or RetryStrategyOptions to create one. + The AWS region to connect to. The configured region is used to determine + the service endpoint. """ - sdk_ua_app_id: str | None + aws_access_key_id: str | None = None + """The identifier for a secret access key.""" + + aws_secret_access_key: str | None = None + """A secret access key that can be used to sign requests.""" + + aws_session_token: str | None = None + """The session token used with temporary AWS credentials.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + sdk_ua_app_id: str | None = None """ A unique and opaque application ID that is appended to the User-Agent header. """ - transport: ClientTransport[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 - streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. - """ - - user_agent_extra: str | None - """Additional suffix to be added to the User-Agent header.""" - - def __init__( - self, - *, - auth_scheme_resolver: HTTPAuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - aws_access_key_id: str | None = None, - aws_credentials_identity_resolver: IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties - ] - | None = None, - aws_secret_access_key: str | None = None, - aws_session_token: str | None = None, - endpoint_resolver: EndpointResolver | None = None, - endpoint_uri: str | URI | None = None, - http_request_config: HTTPRequestConfiguration | None = None, - interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] | None = None, - region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, - sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, - user_agent_extra: str | None = None, - ): - self.auth_scheme_resolver = auth_scheme_resolver or HTTPAuthSchemeResolver() - self.auth_schemes = auth_schemes or { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="bedrock-agentcore") - } - self.aws_access_key_id = aws_access_key_id - self.aws_credentials_identity_resolver = aws_credentials_identity_resolver - self.aws_secret_access_key = aws_secret_access_key - self.aws_session_token = aws_session_token - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="bedrock-agentcore-control" - ) - self.endpoint_uri = endpoint_uri - self.http_request_config = http_request_config - self.interceptors = interceptors or [] - self.protocol = protocol or RestJsonClientProtocol( - _SCHEMA_AMAZON_BEDROCK_AGENT_CORE_CONTROL - ) - self.region = region - self.retry_strategy = retry_strategy - self.sdk_ua_app_id = sdk_ua_app_id - self.transport = transport or AIOHTTPClient() - self.user_agent_extra = user_agent_extra + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "aws_credentials_identity_resolver": FieldSpec(default=None), + "region": FieldSpec(default=None), + "aws_access_key_id": FieldSpec(default=None), + "aws_secret_access_key": FieldSpec(default=None), + "aws_session_token": FieldSpec(default=None), + "user_agent_extra": FieldSpec(default=None), + "sdk_ua_app_id": FieldSpec(default=None), + **AsyncAwsConfig._FIELDS, + "endpoint_uri": FieldSpec( + default=None, resolver=EndpointUriResolver("bedrock_agentcore_control") + ), + "endpoint_resolver": FieldSpec( + default_factory=lambda: StandardRegionalEndpointsResolver( + endpoint_prefix="bedrock-agentcore-control" + ) + ), + "protocol": FieldSpec( + default_factory=lambda: RestJsonClientProtocol( + _SCHEMA_AMAZON_BEDROCK_AGENT_CORE_CONTROL + ) + ), + "auth_schemes": FieldSpec( + default_factory=lambda: { + ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="bedrock-agentcore") + } + ), + "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: """ - Sets the implementation of an auth scheme. - - Using this method ensures the correct key is used. + Set an auth scheme implementation using its scheme ID. :param scheme: + The auth scheme to add or replace. + """ + auth_schemes = dict(self.auth_schemes or {}) + auth_schemes[scheme.scheme_id] = scheme + self.auth_schemes = auth_schemes - Args: - scheme: - The auth scheme to add. + @classmethod + async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] + cls, + *, + profile: str | None = None, + fs: FileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[_AsyncBedrockAgentCoreControlConfigOverrides], + ) -> Self: + """ + Resolve config from environment, config files, defaults, and explicit + overrides. """ - self.auth_schemes[scheme.scheme_id] = scheme + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) -Plugin: TypeAlias = Callable[[Config], None] -"""A callable that allows customizing the config object on each request.""" +Plugin: TypeAlias = Callable[[AsyncBedrockAgentCoreControlConfig], None] +""" +A callable that customizes a client configuration. Service-level plugins +are applied once to the base configuration inherited by every operation. +Operation-level plugins apply only to a single operation invocation. +""" diff --git a/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/models.py b/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/models.py index 37b00d5..42603d8 100644 --- a/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/models.py +++ b/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/models.py @@ -2278,7 +2278,7 @@ class DatasetStatus(UnknownEnumMixin, StrEnum): """Dataset lifecycle and operation status.""" CREATING = "CREATING" - """CreateDataset async ingestion in progress. All writes are blocked. """ + """CreateDataset async ingestion in progress. All writes are blocked.""" UPDATING = "UPDATING" """ An async example mutation or CreateDatasetVersion is in progress. All @@ -2295,7 +2295,7 @@ class DatasetStatus(UnknownEnumMixin, StrEnum): guards. """ CREATE_FAILED = "CREATE_FAILED" - """Initial ingestion failed. DRAFT record exists but contains no examples. """ + """Initial ingestion failed. DRAFT record exists but contains no examples.""" UPDATE_FAILED = "UPDATE_FAILED" """ Last example mutation or CreateDatasetVersion failed. DRAFT may be @@ -21768,7 +21768,7 @@ class DraftStatus(UnknownEnumMixin, StrEnum): versions have been published yet. """ UNMODIFIED = "UNMODIFIED" - """DRAFT content matches the latest published version exactly. """ + """DRAFT content matches the latest published version exactly.""" @dataclass(kw_only=True) @@ -39021,11 +39021,11 @@ def _set_result(self, value: HarnessMemoryConfiguration) -> None: class HarnessBedrockApiFormat(UnknownEnumMixin, StrEnum): CONVERSE_STREAM = "converse_stream" - """Use the Bedrock Converse Stream API format. """ + """Use the Bedrock Converse Stream API format.""" RESPONSES = "responses" - """Use the Responses API format. """ + """Use the Responses API format.""" CHAT_COMPLETIONS = "chat_completions" - """Use the Chat Completions API format. """ + """Use the Chat Completions API format.""" @dataclass(kw_only=True) @@ -39413,9 +39413,9 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: class HarnessOpenAiApiFormat(UnknownEnumMixin, StrEnum): CHAT_COMPLETIONS = "chat_completions" - """Use the Chat Completions API format. """ + """Use the Chat Completions API format.""" RESPONSES = "responses" - """Use the Responses API format. """ + """Use the Responses API format.""" @dataclass(kw_only=True) @@ -52201,7 +52201,7 @@ class OnBehalfOfTokenExchangeGrantTypeType(UnknownEnumMixin, StrEnum): supporting on-behalf-of flows. """ JWT_AUTHORIZATION_GRANT = "JWT_AUTHORIZATION_GRANT" - """RFC 7523 JWT authorization grant, adopted by Microsoft Entra ID. """ + """RFC 7523 JWT authorization grant, adopted by Microsoft Entra ID.""" def _serialize_scopes_list_type( @@ -59082,9 +59082,9 @@ class PaymentCredentialProviderVendorType(UnknownEnumMixin, StrEnum): """ COINBASE_CDP = "CoinbaseCDP" - """Coinbase Developer Platform. """ + """Coinbase Developer Platform.""" STRIPE_PRIVY = "StripePrivy" - """Stripe and Privy. """ + """Stripe and Privy.""" @dataclass(kw_only=True) diff --git a/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/user_agent.py b/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/user_agent.py index 88f17e1..2b19b1f 100644 --- a/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/user_agent.py +++ b/clients/aws-sdk-bedrock-agentcore-control/src/aws_sdk_bedrock_agentcore_control/user_agent.py @@ -3,10 +3,10 @@ from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor from . import __version__ -from .config import Config +from .config import AsyncBedrockAgentCoreControlConfig -def aws_user_agent_plugin(config: Config): +def aws_user_agent_plugin(config: AsyncBedrockAgentCoreControlConfig): config.interceptors.append( UserAgentInterceptor( ua_suffix=config.user_agent_extra, diff --git a/clients/aws-sdk-bedrock-agentcore-control/tests/test_protocol.py b/clients/aws-sdk-bedrock-agentcore-control/tests/test_restjson_protocol.py similarity index 100% rename from clients/aws-sdk-bedrock-agentcore-control/tests/test_protocol.py rename to clients/aws-sdk-bedrock-agentcore-control/tests/test_restjson_protocol.py diff --git a/clients/aws-sdk-bedrock-agentcore/.changes/0.10.0.json b/clients/aws-sdk-bedrock-agentcore/.changes/0.10.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/clients/aws-sdk-bedrock-agentcore/.changes/0.10.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-bedrock-agentcore/CHANGELOG.md b/clients/aws-sdk-bedrock-agentcore/CHANGELOG.md index 196dcb6..088b002 100644 --- a/clients/aws-sdk-bedrock-agentcore/CHANGELOG.md +++ b/clients/aws-sdk-bedrock-agentcore/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### API Changes diff --git a/clients/aws-sdk-bedrock-agentcore/pyproject.toml b/clients/aws-sdk-bedrock-agentcore/pyproject.toml index df095a7..2c12c4a 100644 --- a/clients/aws-sdk-bedrock-agentcore/pyproject.toml +++ b/clients/aws-sdk-bedrock-agentcore/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "aws_sdk_bedrock_agentcore" -version = "0.9.0" +version = "0.10.0" description = "aws_sdk_bedrock_agentcore client" readme = "README.md" requires-python = ">=3.12" @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ - "smithy_aws_core[eventstream, json]~=0.9.0", + "smithy_aws_core[eventstream, json]~=0.10.0", "smithy_core~=0.8.0", "smithy_http[awscrt]~=0.4.0" ] diff --git a/clients/aws-sdk-bedrock-agentcore/scripts/docs/generate_doc_stubs.py b/clients/aws-sdk-bedrock-agentcore/scripts/docs/generate_doc_stubs.py index b00ac66..56ab5a8 100644 --- a/clients/aws-sdk-bedrock-agentcore/scripts/docs/generate_doc_stubs.py +++ b/clients/aws-sdk-bedrock-agentcore/scripts/docs/generate_doc_stubs.py @@ -8,6 +8,7 @@ import argparse import logging +import re import sys from collections.abc import Sequence from dataclasses import dataclass @@ -115,19 +116,43 @@ class ClientInfo: class DocStubGenerator: """Generate markdown API Reference stubs for AWS SDK for Python clients.""" - def __init__(self, client_dir: Path, output_dir: Path) -> None: + def __init__(self, client_dir: Path, output_dir: Path, service_name: str | None = None) -> None: """ Initialize the documentation generator. Args: client_dir: Path to the client source directory output_dir: Path to the output directory for generated doc stubs + service_name: Display name for the service (e.g. the Smithy sdkId + "SNS"). When omitted, falls back to a title-cased derivation of + the package name, which does not preserve acronym casing. """ self.client_dir = client_dir self.output_dir = output_dir - # Extract service name from package name - # (e.g., "aws_sdk_bedrock_runtime" -> "Bedrock Runtime") - self.service_name = client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + # Use the explicit override, then the sdkId from the package, then + # fall back to a title-cased package name (does not keep acronym + # casing, so "sns" becomes "Sns"). + self.service_name = ( + service_name + or self._sdk_id_from_package(client_dir) + or client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + ) + + @staticmethod + def _sdk_id_from_package(client_dir: Path) -> str | None: + """ + Read the authoritative service name (Smithy sdkId) from the package. + + The generated ``_private/schemas.py`` carries the ``aws.api#service`` + trait's ``sdkId`` (e.g. "SNS"), the same field the sidebar navigation + uses, so it keeps acronym casing that the package name does not. + Returns None if the file or value is absent. + """ + schemas = client_dir / "_private" / "schemas.py" + if not schemas.is_file(): + return None + match = re.search(r'"sdkId":\s*"([^"]+)"', schemas.read_text()) + return match.group(1) if match else None def generate(self) -> bool: """ @@ -166,10 +191,13 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: if not client_class: raise ValueError(f"No class ending with 'Client' found in {package_name}.client") - config_class = config_module.members.get("Config") + config_class = self._find_class_with_suffix(config_module, "Config") + if not config_class: + raise ValueError(f"No class ending with 'Config' found in {package_name}.config") + plugin_alias = config_module.members.get("Plugin") - if not config_class or not plugin_alias: - raise ValueError(f"Missing Config or Plugin in {package_name}.config") + if not plugin_alias: + raise ValueError(f"Missing Plugin in {package_name}.config") config = TypeInfo(name=config_class.name, module_path=config_class.path) plugin = TypeInfo(name=plugin_alias.name, module_path=plugin_alias.path) @@ -194,8 +222,12 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: ) def _find_class_with_suffix(self, module: Module, suffix: str) -> Class | None: - """Find the class in the module with a matching suffix.""" + """Find the class defined in the module with a matching suffix.""" for cls in module.classes.values(): + # Skip imported classes so a same-package import (e.g. a *Config + # class re-exported from config.py) can't shadow the defined one. + if cls.is_imported: + continue if cls.name.endswith(suffix): return cls return None @@ -616,6 +648,12 @@ def main() -> int: required=True, help="Output directory for generated doc stubs", ) + parser.add_argument( + "-s", + "--service-name", + default=None, + help="Display name for the service (Smithy sdkId, e.g. 'SNS')", + ) args = parser.parse_args() client_dir = args.client_dir.resolve() @@ -626,7 +664,7 @@ def main() -> int: return 1 try: - generator = DocStubGenerator(client_dir, output_dir) + generator = DocStubGenerator(client_dir, output_dir, args.service_name) success = generator.generate() return 0 if success else 1 except Exception as e: diff --git a/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/__init__.py b/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/__init__.py index 7e20a8c..3c99375 100644 --- a/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/__init__.py +++ b/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/__init__.py @@ -1,3 +1,3 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -__version__: str = "0.9.0" +__version__: str = "0.10.0" diff --git a/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/client.py b/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/client.py index 804732c..42b3825 100644 --- a/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/client.py +++ b/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/client.py @@ -1,5 +1,6 @@ # Code generated by smithy-python-codegen DO NOT EDIT. +import asyncio from copy import deepcopy import logging @@ -11,7 +12,7 @@ from smithy_core.types import TypedProperties from smithy_http.plugins import user_agent_plugin -from .config import Config, Plugin +from .config import AsyncBedrockAgentCoreConfig, Plugin from .models import ( BATCH_CREATE_MEMORY_RECORDS, BATCH_DELETE_MEMORY_RECORDS, @@ -232,7 +233,9 @@ class AsyncBedrockAgentCoreClient: """ def __init__( - self, config: Config | None = None, plugins: list[Plugin] | None = None + self, + config: AsyncBedrockAgentCoreConfig | None = None, + plugins: list[Plugin] | None = None, ): """ Constructor for `AsyncBedrockAgentCoreClient`. @@ -242,19 +245,32 @@ def __init__( Optional configuration for the client. Here you can set things like the endpoint for HTTP services or auth credentials. plugins: - A list of callables that modify the configuration dynamically. These - can be used to set defaults, for example. + A list of callables applied once to the client's base configuration. + Their changes are inherited by every operation invocation. """ - self._config = config or Config() - - client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] - if plugins: - client_plugins.extend(plugins) - - for plugin in client_plugins: - plugin(self._config) - + self._config = config + self._plugins = plugins + self._derive_lock = asyncio.Lock() + self._setup_done = False self._retry_strategy_resolver = RetryStrategyResolver() + self._client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] + + async def _ensure_setup(self) -> None: + if not self._setup_done: + async with self._derive_lock: + if not self._setup_done: + if self._config is None: + config = await AsyncBedrockAgentCoreConfig.resolve() + else: + # Copy so plugins don't mutate the caller's config. + config = deepcopy(self._config) + for plugin in self._client_plugins: + plugin(config) + if self._plugins: + for plugin in self._plugins: + plugin(config) + self._config = config + self._setup_done = True async def batch_create_memory_records( self, input: BatchCreateMemoryRecordsInput, plugins: list[Plugin] | None = None @@ -278,16 +294,31 @@ async def batch_create_memory_records( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -326,16 +357,31 @@ async def batch_delete_memory_records( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -374,16 +420,31 @@ async def batch_update_memory_records( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -422,16 +483,31 @@ async def complete_resource_token_auth( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -472,16 +548,31 @@ async def create_ab_test( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -526,16 +617,31 @@ async def create_event( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -573,16 +679,31 @@ async def create_payment_instrument( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -620,16 +741,31 @@ async def create_payment_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -667,16 +803,31 @@ async def delete_ab_test( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -714,16 +865,31 @@ async def delete_batch_evaluation( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -766,16 +932,31 @@ async def delete_capacity_provider_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -817,16 +998,31 @@ async def delete_event( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -868,16 +1064,31 @@ async def delete_memory_record( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -916,16 +1127,31 @@ async def delete_payment_instrument( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -964,16 +1190,31 @@ async def delete_payment_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1011,16 +1252,31 @@ async def delete_recommendation( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1060,16 +1316,31 @@ async def evaluate( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1108,16 +1379,31 @@ async def get_ab_test( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1155,16 +1441,31 @@ async def get_agent_card( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1203,16 +1504,31 @@ async def get_batch_evaluation( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1265,16 +1581,31 @@ async def get_browser_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1326,16 +1657,31 @@ async def get_code_interpreter_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1377,16 +1723,31 @@ async def get_event( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1427,16 +1788,31 @@ async def get_memory_record( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1474,16 +1850,31 @@ async def get_payment_instrument( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1523,16 +1914,31 @@ async def get_payment_instrument_balance( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1570,16 +1976,31 @@ async def get_payment_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1618,16 +2039,31 @@ async def get_recommendation( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1665,16 +2101,31 @@ async def get_resource_api_key( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1712,16 +2163,31 @@ async def get_resource_oauth2_token( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1760,16 +2226,31 @@ async def get_resource_payment_token( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1808,16 +2289,31 @@ async def get_workload_access_token( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1858,16 +2354,31 @@ async def get_workload_access_token_for_jwt( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1908,16 +2419,31 @@ async def get_workload_access_token_for_user_id( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1983,16 +2509,31 @@ async def invoke_agent_runtime( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2043,16 +2584,31 @@ async def invoke_agent_runtime_command( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2110,16 +2666,31 @@ async def invoke_browser( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2174,16 +2745,31 @@ async def invoke_code_interpreter( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2225,16 +2811,31 @@ async def invoke_harness( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2276,16 +2877,31 @@ async def list_ab_tests( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2328,16 +2944,31 @@ async def list_actors( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2376,16 +3007,31 @@ async def list_batch_evaluations( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2437,16 +3083,31 @@ async def list_browser_sessions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2502,16 +3163,31 @@ async def list_code_interpreter_sessions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2554,16 +3230,31 @@ async def list_events( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2605,16 +3296,31 @@ async def list_memory_extraction_jobs( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2657,16 +3363,31 @@ async def list_memory_records( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2704,16 +3425,31 @@ async def list_payment_instruments( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2751,16 +3487,31 @@ async def list_payment_sessions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2799,16 +3550,31 @@ async def list_recommendations( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2853,16 +3619,31 @@ async def list_sessions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2900,16 +3681,31 @@ async def process_payment( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2953,16 +3749,31 @@ async def retrieve_memory_records( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3019,16 +3830,31 @@ async def save_browser_session_profile( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3068,16 +3894,31 @@ async def search_registry_records( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3118,16 +3959,31 @@ async def start_batch_evaluation( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3185,16 +4041,31 @@ async def start_browser_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3249,16 +4120,31 @@ async def start_code_interpreter_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3302,16 +4188,31 @@ async def start_memory_extraction_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3351,16 +4252,31 @@ async def start_recommendation( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3399,16 +4315,31 @@ async def stop_batch_evaluation( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3458,16 +4389,31 @@ async def stop_browser_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3520,16 +4466,31 @@ async def stop_code_interpreter_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3567,16 +4528,31 @@ async def stop_runtime_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3615,16 +4591,31 @@ async def update_ab_test( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3663,16 +4654,31 @@ async def update_browser_stream( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) diff --git a/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/config.py b/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/config.py index c0ccd50..d8069b2 100644 --- a/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/config.py +++ b/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/config.py @@ -1,24 +1,24 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -from dataclasses import dataclass -from typing import Any, Callable, TypeAlias, Union +from dataclasses import dataclass, field +from typing import Any, Callable, ClassVar, Self, TypeAlias, Union, 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.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ClientProtocol, ClientTransport, EndpointResolver +from smithy_core.aio.interfaces import ClientProtocol, EndpointResolver from smithy_core.aio.interfaces.auth import AuthScheme from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy from smithy_core.interceptors import Interceptor -from smithy_core.interfaces import URI -from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.crt import AWSCRTHTTPClient -from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import ( AMAZON_BEDROCK_AGENT_CORE as _SCHEMA_AMAZON_BEDROCK_AGENT_CORE, @@ -268,141 +268,136 @@ ] -@dataclass(init=False) -class Config: - """Configuration for Bedrock AgentCore.""" - - auth_scheme_resolver: HTTPAuthSchemeResolver - """ - An auth scheme resolver that determines the auth scheme for each - operation. - """ - - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] - """A map of auth scheme ids to auth schemes.""" - - aws_access_key_id: str | None - """The identifier for a secret access key.""" - - aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None - ) - """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" +class _AsyncBedrockAgentCoreConfigOverrides(AwsConfigOverrides, total=False): + endpoint_resolver: EndpointResolver | None + protocol: ClientProtocol[Any, Any] | None + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None - aws_secret_access_key: str | None - """A secret access key that can be used to sign requests.""" - aws_session_token: str | None - """An access key ID that identifies temporary security credentials.""" +@dataclass(kw_only=True, repr=False, init=False) +class AsyncBedrockAgentCoreConfig(AsyncAwsConfig): + """Bedrock AgentCore configuration (async-resolved).""" - endpoint_resolver: EndpointResolver + endpoint_resolver: EndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - endpoint_uri: str | URI | None - """A static URI to route requests to.""" - - http_request_config: HTTPRequestConfiguration | None - """Configuration for individual HTTP requests.""" + protocol: ClientProtocol[Any, Any] | None = None + """The protocol to serialize and deserialize requests with.""" - interceptors: list[_ServiceInterceptor] + interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) """ The list of interceptors, which are hooks that are called during the execution of a request. """ - protocol: ClientProtocol[Any, Any] | None - """The protocol to serialize and deserialize requests with.""" + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + """A map of auth scheme ids to auth schemes.""" - region: str | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None = None """ - The AWS region to connect to. The configured region is used to determine - the service endpoint. + An auth scheme resolver that determines the auth scheme for each + operation. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + aws_credentials_identity_resolver: ( + IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + ) = None + """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" + + region: str | None = None """ - The retry strategy or options for configuring retry behavior. Can be - either a configured RetryStrategy or RetryStrategyOptions to create one. + The AWS region to connect to. The configured region is used to determine + the service endpoint. """ - sdk_ua_app_id: str | None + aws_access_key_id: str | None = None + """The identifier for a secret access key.""" + + aws_secret_access_key: str | None = None + """A secret access key that can be used to sign requests.""" + + aws_session_token: str | None = None + """The session token used with temporary AWS credentials.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + sdk_ua_app_id: str | None = None """ A unique and opaque application ID that is appended to the User-Agent header. """ - transport: ClientTransport[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 - streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. - """ - - user_agent_extra: str | None - """Additional suffix to be added to the User-Agent header.""" - - def __init__( - self, - *, - auth_scheme_resolver: HTTPAuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - aws_access_key_id: str | None = None, - aws_credentials_identity_resolver: IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties - ] - | None = None, - aws_secret_access_key: str | None = None, - aws_session_token: str | None = None, - endpoint_resolver: EndpointResolver | None = None, - endpoint_uri: str | URI | None = None, - http_request_config: HTTPRequestConfiguration | None = None, - interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] | None = None, - region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, - sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, - user_agent_extra: str | None = None, - ): - self.auth_scheme_resolver = auth_scheme_resolver or HTTPAuthSchemeResolver() - self.auth_schemes = auth_schemes or { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="bedrock-agentcore") - } - self.aws_access_key_id = aws_access_key_id - self.aws_credentials_identity_resolver = aws_credentials_identity_resolver - self.aws_secret_access_key = aws_secret_access_key - self.aws_session_token = aws_session_token - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="bedrock-agentcore" - ) - self.endpoint_uri = endpoint_uri - self.http_request_config = http_request_config - self.interceptors = interceptors or [] - self.protocol = protocol or RestJsonClientProtocol( - _SCHEMA_AMAZON_BEDROCK_AGENT_CORE - ) - self.region = region - self.retry_strategy = retry_strategy - self.sdk_ua_app_id = sdk_ua_app_id - self.transport = transport or AWSCRTHTTPClient() - self.user_agent_extra = user_agent_extra + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "aws_credentials_identity_resolver": FieldSpec(default=None), + "region": FieldSpec(default=None), + "aws_access_key_id": FieldSpec(default=None), + "aws_secret_access_key": FieldSpec(default=None), + "aws_session_token": FieldSpec(default=None), + "user_agent_extra": FieldSpec(default=None), + "sdk_ua_app_id": FieldSpec(default=None), + **AsyncAwsConfig._FIELDS, + "endpoint_uri": FieldSpec( + default=None, resolver=EndpointUriResolver("bedrock_agentcore") + ), + "endpoint_resolver": FieldSpec( + default_factory=lambda: StandardRegionalEndpointsResolver( + endpoint_prefix="bedrock-agentcore" + ) + ), + "protocol": FieldSpec( + default_factory=lambda: RestJsonClientProtocol( + _SCHEMA_AMAZON_BEDROCK_AGENT_CORE + ) + ), + "auth_schemes": FieldSpec( + default_factory=lambda: { + ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="bedrock-agentcore") + } + ), + "auth_scheme_resolver": FieldSpec(default_factory=HTTPAuthSchemeResolver), + "transport": FieldSpec(default_factory=lambda: AWSCRTHTTPClient()), + } def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None: """ - Sets the implementation of an auth scheme. - - Using this method ensures the correct key is used. + Set an auth scheme implementation using its scheme ID. :param scheme: + The auth scheme to add or replace. + """ + auth_schemes = dict(self.auth_schemes or {}) + auth_schemes[scheme.scheme_id] = scheme + self.auth_schemes = auth_schemes - Args: - scheme: - The auth scheme to add. + @classmethod + async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] + cls, + *, + profile: str | None = None, + fs: FileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[_AsyncBedrockAgentCoreConfigOverrides], + ) -> Self: + """ + Resolve config from environment, config files, defaults, and explicit + overrides. """ - self.auth_schemes[scheme.scheme_id] = scheme + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) -Plugin: TypeAlias = Callable[[Config], None] -"""A callable that allows customizing the config object on each request.""" +Plugin: TypeAlias = Callable[[AsyncBedrockAgentCoreConfig], None] +""" +A callable that customizes a client configuration. Service-level plugins +are applied once to the base configuration inherited by every operation. +Operation-level plugins apply only to a single operation invocation. +""" diff --git a/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/models.py b/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/models.py index 9b53539..f95c882 100644 --- a/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/models.py +++ b/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/models.py @@ -25376,11 +25376,11 @@ def _read_value(d: ShapeDeserializer): class HarnessBedrockApiFormat(UnknownEnumMixin, StrEnum): CONVERSE_STREAM = "converse_stream" - """Use the Bedrock Converse Stream API format. """ + """Use the Bedrock Converse Stream API format.""" RESPONSES = "responses" - """Use the Responses API format. """ + """Use the Responses API format.""" CHAT_COMPLETIONS = "chat_completions" - """Use the Chat Completions API format. """ + """Use the Chat Completions API format.""" @dataclass(kw_only=True) @@ -25768,9 +25768,9 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: class HarnessOpenAiApiFormat(UnknownEnumMixin, StrEnum): CHAT_COMPLETIONS = "chat_completions" - """Use the Chat Completions API format. """ + """Use the Chat Completions API format.""" RESPONSES = "responses" - """Use the Responses API format. """ + """Use the Responses API format.""" @dataclass(kw_only=True) @@ -36785,15 +36785,15 @@ class BlockchainChainId(UnknownEnumMixin, StrEnum): """ BASE = "BASE" - """Base Mainnet (EVM L2) """ + """Base Mainnet (EVM L2)""" BASE_SEPOLIA = "BASE_SEPOLIA" - """Base Sepolia testnet (EVM L2) """ + """Base Sepolia testnet (EVM L2)""" ETHEREUM = "ETHEREUM" - """Ethereum Mainnet (EVM L1) """ + """Ethereum Mainnet (EVM L1)""" SOLANA = "SOLANA" - """Solana Mainnet """ + """Solana Mainnet""" SOLANA_DEVNET = "SOLANA_DEVNET" - """Solana Devnet testnet """ + """Solana Devnet testnet""" class InstrumentBalanceToken(UnknownEnumMixin, StrEnum): diff --git a/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/user_agent.py b/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/user_agent.py index 11f1788..39e164c 100644 --- a/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/user_agent.py +++ b/clients/aws-sdk-bedrock-agentcore/src/aws_sdk_bedrock_agentcore/user_agent.py @@ -3,10 +3,10 @@ from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor from . import __version__ -from .config import Config +from .config import AsyncBedrockAgentCoreConfig -def aws_user_agent_plugin(config: Config): +def aws_user_agent_plugin(config: AsyncBedrockAgentCoreConfig): config.interceptors.append( UserAgentInterceptor( ua_suffix=config.user_agent_extra, diff --git a/clients/aws-sdk-bedrock-agentcore/tests/test_protocol.py b/clients/aws-sdk-bedrock-agentcore/tests/test_restjson_protocol.py similarity index 100% rename from clients/aws-sdk-bedrock-agentcore/tests/test_protocol.py rename to clients/aws-sdk-bedrock-agentcore/tests/test_restjson_protocol.py diff --git a/clients/aws-sdk-bedrock-data-automation/.changes/0.10.0.json b/clients/aws-sdk-bedrock-data-automation/.changes/0.10.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/clients/aws-sdk-bedrock-data-automation/.changes/0.10.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-bedrock-data-automation/CHANGELOG.md b/clients/aws-sdk-bedrock-data-automation/CHANGELOG.md index 1458782..321240f 100644 --- a/clients/aws-sdk-bedrock-data-automation/CHANGELOG.md +++ b/clients/aws-sdk-bedrock-data-automation/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### Dependencies diff --git a/clients/aws-sdk-bedrock-data-automation/pyproject.toml b/clients/aws-sdk-bedrock-data-automation/pyproject.toml index 6c1f16c..8361856 100644 --- a/clients/aws-sdk-bedrock-data-automation/pyproject.toml +++ b/clients/aws-sdk-bedrock-data-automation/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "aws_sdk_bedrock_data_automation" -version = "0.9.0" +version = "0.10.0" description = "aws_sdk_bedrock_data_automation client" readme = "README.md" requires-python = ">=3.12" @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ - "smithy_aws_core[json]~=0.9.0", + "smithy_aws_core[json]~=0.10.0", "smithy_core~=0.8.0", "smithy_http[aiohttp]~=0.4.0" ] diff --git a/clients/aws-sdk-bedrock-data-automation/scripts/docs/generate_doc_stubs.py b/clients/aws-sdk-bedrock-data-automation/scripts/docs/generate_doc_stubs.py index b00ac66..56ab5a8 100644 --- a/clients/aws-sdk-bedrock-data-automation/scripts/docs/generate_doc_stubs.py +++ b/clients/aws-sdk-bedrock-data-automation/scripts/docs/generate_doc_stubs.py @@ -8,6 +8,7 @@ import argparse import logging +import re import sys from collections.abc import Sequence from dataclasses import dataclass @@ -115,19 +116,43 @@ class ClientInfo: class DocStubGenerator: """Generate markdown API Reference stubs for AWS SDK for Python clients.""" - def __init__(self, client_dir: Path, output_dir: Path) -> None: + def __init__(self, client_dir: Path, output_dir: Path, service_name: str | None = None) -> None: """ Initialize the documentation generator. Args: client_dir: Path to the client source directory output_dir: Path to the output directory for generated doc stubs + service_name: Display name for the service (e.g. the Smithy sdkId + "SNS"). When omitted, falls back to a title-cased derivation of + the package name, which does not preserve acronym casing. """ self.client_dir = client_dir self.output_dir = output_dir - # Extract service name from package name - # (e.g., "aws_sdk_bedrock_runtime" -> "Bedrock Runtime") - self.service_name = client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + # Use the explicit override, then the sdkId from the package, then + # fall back to a title-cased package name (does not keep acronym + # casing, so "sns" becomes "Sns"). + self.service_name = ( + service_name + or self._sdk_id_from_package(client_dir) + or client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + ) + + @staticmethod + def _sdk_id_from_package(client_dir: Path) -> str | None: + """ + Read the authoritative service name (Smithy sdkId) from the package. + + The generated ``_private/schemas.py`` carries the ``aws.api#service`` + trait's ``sdkId`` (e.g. "SNS"), the same field the sidebar navigation + uses, so it keeps acronym casing that the package name does not. + Returns None if the file or value is absent. + """ + schemas = client_dir / "_private" / "schemas.py" + if not schemas.is_file(): + return None + match = re.search(r'"sdkId":\s*"([^"]+)"', schemas.read_text()) + return match.group(1) if match else None def generate(self) -> bool: """ @@ -166,10 +191,13 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: if not client_class: raise ValueError(f"No class ending with 'Client' found in {package_name}.client") - config_class = config_module.members.get("Config") + config_class = self._find_class_with_suffix(config_module, "Config") + if not config_class: + raise ValueError(f"No class ending with 'Config' found in {package_name}.config") + plugin_alias = config_module.members.get("Plugin") - if not config_class or not plugin_alias: - raise ValueError(f"Missing Config or Plugin in {package_name}.config") + if not plugin_alias: + raise ValueError(f"Missing Plugin in {package_name}.config") config = TypeInfo(name=config_class.name, module_path=config_class.path) plugin = TypeInfo(name=plugin_alias.name, module_path=plugin_alias.path) @@ -194,8 +222,12 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: ) def _find_class_with_suffix(self, module: Module, suffix: str) -> Class | None: - """Find the class in the module with a matching suffix.""" + """Find the class defined in the module with a matching suffix.""" for cls in module.classes.values(): + # Skip imported classes so a same-package import (e.g. a *Config + # class re-exported from config.py) can't shadow the defined one. + if cls.is_imported: + continue if cls.name.endswith(suffix): return cls return None @@ -616,6 +648,12 @@ def main() -> int: required=True, help="Output directory for generated doc stubs", ) + parser.add_argument( + "-s", + "--service-name", + default=None, + help="Display name for the service (Smithy sdkId, e.g. 'SNS')", + ) args = parser.parse_args() client_dir = args.client_dir.resolve() @@ -626,7 +664,7 @@ def main() -> int: return 1 try: - generator = DocStubGenerator(client_dir, output_dir) + generator = DocStubGenerator(client_dir, output_dir, args.service_name) success = generator.generate() return 0 if success else 1 except Exception as e: diff --git a/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/__init__.py b/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/__init__.py index 7e20a8c..3c99375 100644 --- a/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/__init__.py +++ b/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/__init__.py @@ -1,3 +1,3 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -__version__: str = "0.9.0" +__version__: str = "0.10.0" diff --git a/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/client.py b/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/client.py index 1b6a6ff..470c222 100644 --- a/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/client.py +++ b/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/client.py @@ -1,5 +1,6 @@ # Code generated by smithy-python-codegen DO NOT EDIT. +import asyncio from copy import deepcopy import logging @@ -10,7 +11,7 @@ from smithy_core.types import TypedProperties from smithy_http.plugins import user_agent_plugin -from .config import Config, Plugin +from .config import AsyncBedrockDataAutomationConfig, Plugin from .models import ( COPY_BLUEPRINT_STAGE, CREATE_BLUEPRINT, @@ -104,7 +105,9 @@ class AsyncBedrockDataAutomationClient: """Amazon Bedrock Data Automation BuildTime""" def __init__( - self, config: Config | None = None, plugins: list[Plugin] | None = None + self, + config: AsyncBedrockDataAutomationConfig | None = None, + plugins: list[Plugin] | None = None, ): """ Constructor for `AsyncBedrockDataAutomationClient`. @@ -114,19 +117,32 @@ def __init__( Optional configuration for the client. Here you can set things like the endpoint for HTTP services or auth credentials. plugins: - A list of callables that modify the configuration dynamically. These - can be used to set defaults, for example. + A list of callables applied once to the client's base configuration. + Their changes are inherited by every operation invocation. """ - self._config = config or Config() - - client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] - if plugins: - client_plugins.extend(plugins) - - for plugin in client_plugins: - plugin(self._config) - + self._config = config + self._plugins = plugins + self._derive_lock = asyncio.Lock() + self._setup_done = False self._retry_strategy_resolver = RetryStrategyResolver() + self._client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] + + async def _ensure_setup(self) -> None: + if not self._setup_done: + async with self._derive_lock: + if not self._setup_done: + if self._config is None: + config = await AsyncBedrockDataAutomationConfig.resolve() + else: + # Copy so plugins don't mutate the caller's config. + config = deepcopy(self._config) + for plugin in self._client_plugins: + plugin(config) + if self._plugins: + for plugin in self._plugins: + plugin(config) + self._config = config + self._setup_done = True async def copy_blueprint_stage( self, input: CopyBlueprintStageInput, plugins: list[Plugin] | None = None @@ -149,16 +165,31 @@ async def copy_blueprint_stage( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -196,16 +227,31 @@ async def create_blueprint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -244,16 +290,31 @@ async def create_blueprint_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -293,16 +354,31 @@ async def create_data_automation_library( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -342,16 +418,31 @@ async def create_data_automation_project( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -389,16 +480,31 @@ async def delete_blueprint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -438,16 +544,31 @@ async def delete_data_automation_library( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -487,16 +608,31 @@ async def delete_data_automation_project( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -534,16 +670,31 @@ async def get_blueprint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -583,16 +734,31 @@ async def get_blueprint_optimization_status( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -630,16 +796,31 @@ async def get_data_automation_library( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -679,16 +860,31 @@ async def get_data_automation_library_entity( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -728,16 +924,31 @@ async def get_data_automation_library_ingestion_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -775,16 +986,31 @@ async def get_data_automation_project( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -824,16 +1050,31 @@ async def invoke_blueprint_optimization_async( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -873,16 +1114,31 @@ async def invoke_data_automation_library_ingestion_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -920,16 +1176,31 @@ async def list_blueprints( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -969,16 +1240,31 @@ async def list_data_automation_libraries( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1018,16 +1304,31 @@ async def list_data_automation_library_entities( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1067,16 +1368,31 @@ async def list_data_automation_library_ingestion_jobs( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1116,16 +1432,31 @@ async def list_data_automation_projects( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1163,16 +1494,31 @@ async def list_tags_for_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1210,16 +1556,31 @@ async def tag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1257,16 +1618,31 @@ async def untag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1304,16 +1680,31 @@ async def update_blueprint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1353,16 +1744,31 @@ async def update_data_automation_library( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1402,16 +1808,31 @@ async def update_data_automation_project( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) diff --git a/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/config.py b/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/config.py index 124f20e..0dc8071 100644 --- a/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/config.py +++ b/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/config.py @@ -1,24 +1,24 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -from dataclasses import dataclass -from typing import Any, Callable, TypeAlias, Union +from dataclasses import dataclass, field +from typing import Any, Callable, ClassVar, Self, TypeAlias, Union, 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.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ClientProtocol, ClientTransport, EndpointResolver +from smithy_core.aio.interfaces import ClientProtocol, EndpointResolver from smithy_core.aio.interfaces.auth import AuthScheme from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy from smithy_core.interceptors import Interceptor -from smithy_core.interfaces import URI -from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.aiohttp import AIOHTTPClient -from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import ( AMAZON_BEDROCK_KEYSTONE_BUILD_TIME_SERVICE as _SCHEMA_AMAZON_BEDROCK_KEYSTONE_BUILD_TIME_SERVICE, @@ -168,141 +168,136 @@ ] -@dataclass(init=False) -class Config: - """Configuration for Bedrock Data Automation.""" - - auth_scheme_resolver: HTTPAuthSchemeResolver - """ - An auth scheme resolver that determines the auth scheme for each - operation. - """ - - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] - """A map of auth scheme ids to auth schemes.""" - - aws_access_key_id: str | None - """The identifier for a secret access key.""" - - aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None - ) - """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" +class _AsyncBedrockDataAutomationConfigOverrides(AwsConfigOverrides, total=False): + endpoint_resolver: EndpointResolver | None + protocol: ClientProtocol[Any, Any] | None + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None - aws_secret_access_key: str | None - """A secret access key that can be used to sign requests.""" - aws_session_token: str | None - """An access key ID that identifies temporary security credentials.""" +@dataclass(kw_only=True, repr=False, init=False) +class AsyncBedrockDataAutomationConfig(AsyncAwsConfig): + """Bedrock Data Automation configuration (async-resolved).""" - endpoint_resolver: EndpointResolver + endpoint_resolver: EndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - endpoint_uri: str | URI | None - """A static URI to route requests to.""" - - http_request_config: HTTPRequestConfiguration | None - """Configuration for individual HTTP requests.""" + protocol: ClientProtocol[Any, Any] | None = None + """The protocol to serialize and deserialize requests with.""" - interceptors: list[_ServiceInterceptor] + interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) """ The list of interceptors, which are hooks that are called during the execution of a request. """ - protocol: ClientProtocol[Any, Any] | None - """The protocol to serialize and deserialize requests with.""" + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + """A map of auth scheme ids to auth schemes.""" - region: str | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None = None """ - The AWS region to connect to. The configured region is used to determine - the service endpoint. + An auth scheme resolver that determines the auth scheme for each + operation. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + aws_credentials_identity_resolver: ( + IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + ) = None + """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" + + region: str | None = None """ - The retry strategy or options for configuring retry behavior. Can be - either a configured RetryStrategy or RetryStrategyOptions to create one. + The AWS region to connect to. The configured region is used to determine + the service endpoint. """ - sdk_ua_app_id: str | None + aws_access_key_id: str | None = None + """The identifier for a secret access key.""" + + aws_secret_access_key: str | None = None + """A secret access key that can be used to sign requests.""" + + aws_session_token: str | None = None + """The session token used with temporary AWS credentials.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + sdk_ua_app_id: str | None = None """ A unique and opaque application ID that is appended to the User-Agent header. """ - transport: ClientTransport[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 - streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. - """ - - user_agent_extra: str | None - """Additional suffix to be added to the User-Agent header.""" - - def __init__( - self, - *, - auth_scheme_resolver: HTTPAuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - aws_access_key_id: str | None = None, - aws_credentials_identity_resolver: IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties - ] - | None = None, - aws_secret_access_key: str | None = None, - aws_session_token: str | None = None, - endpoint_resolver: EndpointResolver | None = None, - endpoint_uri: str | URI | None = None, - http_request_config: HTTPRequestConfiguration | None = None, - interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] | None = None, - region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, - sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, - user_agent_extra: str | None = None, - ): - self.auth_scheme_resolver = auth_scheme_resolver or HTTPAuthSchemeResolver() - self.auth_schemes = auth_schemes or { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="bedrock") - } - self.aws_access_key_id = aws_access_key_id - self.aws_credentials_identity_resolver = aws_credentials_identity_resolver - self.aws_secret_access_key = aws_secret_access_key - self.aws_session_token = aws_session_token - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="bedrock-data-automation" - ) - self.endpoint_uri = endpoint_uri - self.http_request_config = http_request_config - self.interceptors = interceptors or [] - self.protocol = protocol or RestJsonClientProtocol( - _SCHEMA_AMAZON_BEDROCK_KEYSTONE_BUILD_TIME_SERVICE - ) - self.region = region - self.retry_strategy = retry_strategy - self.sdk_ua_app_id = sdk_ua_app_id - self.transport = transport or AIOHTTPClient() - self.user_agent_extra = user_agent_extra + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "aws_credentials_identity_resolver": FieldSpec(default=None), + "region": FieldSpec(default=None), + "aws_access_key_id": FieldSpec(default=None), + "aws_secret_access_key": FieldSpec(default=None), + "aws_session_token": FieldSpec(default=None), + "user_agent_extra": FieldSpec(default=None), + "sdk_ua_app_id": FieldSpec(default=None), + **AsyncAwsConfig._FIELDS, + "endpoint_uri": FieldSpec( + default=None, resolver=EndpointUriResolver("bedrock_data_automation") + ), + "endpoint_resolver": FieldSpec( + default_factory=lambda: StandardRegionalEndpointsResolver( + endpoint_prefix="bedrock-data-automation" + ) + ), + "protocol": FieldSpec( + default_factory=lambda: RestJsonClientProtocol( + _SCHEMA_AMAZON_BEDROCK_KEYSTONE_BUILD_TIME_SERVICE + ) + ), + "auth_schemes": FieldSpec( + default_factory=lambda: { + ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="bedrock") + } + ), + "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: """ - Sets the implementation of an auth scheme. - - Using this method ensures the correct key is used. + Set an auth scheme implementation using its scheme ID. :param scheme: + The auth scheme to add or replace. + """ + auth_schemes = dict(self.auth_schemes or {}) + auth_schemes[scheme.scheme_id] = scheme + self.auth_schemes = auth_schemes - Args: - scheme: - The auth scheme to add. + @classmethod + async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] + cls, + *, + profile: str | None = None, + fs: FileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[_AsyncBedrockDataAutomationConfigOverrides], + ) -> Self: + """ + Resolve config from environment, config files, defaults, and explicit + overrides. """ - self.auth_schemes[scheme.scheme_id] = scheme + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) -Plugin: TypeAlias = Callable[[Config], None] -"""A callable that allows customizing the config object on each request.""" +Plugin: TypeAlias = Callable[[AsyncBedrockDataAutomationConfig], None] +""" +A callable that customizes a client configuration. Service-level plugins +are applied once to the base configuration inherited by every operation. +Operation-level plugins apply only to a single operation invocation. +""" diff --git a/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/models.py b/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/models.py index 9ba1400..69cc587 100644 --- a/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/models.py +++ b/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/models.py @@ -6085,18 +6085,18 @@ class SensitiveDataDetectionMode(UnknownEnumMixin, StrEnum): """Mode for sensitive data detection""" DETECTION = "DETECTION" - """Only detect sensitive data without redaction """ + """Only detect sensitive data without redaction""" DETECTION_AND_REDACTION = "DETECTION_AND_REDACTION" - """Detect and redact sensitive data """ + """Detect and redact sensitive data""" class SensitiveDataDetectionScopeType(UnknownEnumMixin, StrEnum): """Types of sensitive data detection scope""" STANDARD = "STANDARD" - """Standard PII detection """ + """Standard PII detection""" CUSTOM = "CUSTOM" - """Custom PII detection """ + """Custom PII detection""" def _serialize_sensitive_data_detection_scope( @@ -6134,81 +6134,81 @@ class PIIEntityType(UnknownEnumMixin, StrEnum): """ ALL = "ALL" - """All supported PII entity types """ + """All supported PII entity types""" ADDRESS = "ADDRESS" """ A physical address, such as '100 Main Street, Anytown, USA' or 'Suite #12, Building 123' """ AGE = "AGE" - """An individual's age, including the quantity and unit of time """ + """An individual's age, including the quantity and unit of time""" NAME = "NAME" """ An individual's name. Does not include titles such as Dr., Mr., Mrs., or Miss """ EMAIL = "EMAIL" - """An email address, such as marymajor@email.com """ + """An email address, such as marymajor@email.com""" PHONE = "PHONE" - """A phone number. Also includes fax and pager numbers """ + """A phone number. Also includes fax and pager numbers""" USERNAME = "USERNAME" """ A user name that identifies an account, such as a login name, screen name, nick name, or handle """ PASSWORD = "PASSWORD" - """An alphanumeric string that is used as a password """ + """An alphanumeric string that is used as a password""" DRIVER_ID = "DRIVER_ID" - """The number assigned to a driver's license """ + """The number assigned to a driver's license""" LICENSE_PLATE = "LICENSE_PLATE" """ A license plate for a vehicle issued by the state or country where the vehicle is registered """ VEHICLE_IDENTIFICATION_NUMBER = "VEHICLE_IDENTIFICATION_NUMBER" - """A Vehicle Identification Number (VIN) that uniquely identifies a vehicle """ + """A Vehicle Identification Number (VIN) that uniquely identifies a vehicle""" CREDIT_DEBIT_CARD_CVV = "CREDIT_DEBIT_CARD_CVV" """ A three-digit card verification code (CVV) for VISA, MasterCard, and Discover cards, or four-digit for American Express """ CREDIT_DEBIT_CARD_EXPIRY = "CREDIT_DEBIT_CARD_EXPIRY" - """The expiration date for a credit or debit card """ + """The expiration date for a credit or debit card""" CREDIT_DEBIT_CARD_NUMBER = "CREDIT_DEBIT_CARD_NUMBER" - """The number for a credit or debit card """ + """The number for a credit or debit card""" PIN = "PIN" - """A four-digit personal identification number (PIN) """ + """A four-digit personal identification number (PIN)""" INTERNATIONAL_BANK_ACCOUNT_NUMBER = "INTERNATIONAL_BANK_ACCOUNT_NUMBER" """ An International Bank Account Number with specific formats for each country """ SWIFT_CODE = "SWIFT_CODE" - """A SWIFT code - standard format of Bank Identifier Code (BIC) """ + """A SWIFT code - standard format of Bank Identifier Code (BIC)""" IP_ADDRESS = "IP_ADDRESS" - """An IPv4 address, such as 198.51.100.0 """ + """An IPv4 address, such as 198.51.100.0""" MAC_ADDRESS = "MAC_ADDRESS" """ A media access control (MAC) address - unique identifier for network interface controller """ URL = "URL" - """A web address, such as www.example.com """ + """A web address, such as www.example.com""" AWS_ACCESS_KEY = "AWS_ACCESS_KEY" - """A unique identifier associated with AWS secret access key """ + """A unique identifier associated with AWS secret access key""" AWS_SECRET_KEY = "AWS_SECRET_KEY" """ A unique identifier associated with AWS access key for signing programmatic requests """ US_BANK_ACCOUNT_NUMBER = "US_BANK_ACCOUNT_NUMBER" - """A US bank account number, typically 10 to 12 digits long """ + """A US bank account number, typically 10 to 12 digits long""" US_BANK_ROUTING_NUMBER = "US_BANK_ROUTING_NUMBER" - """A US bank account routing number, typically nine digits long """ + """A US bank account routing number, typically nine digits long""" US_INDIVIDUAL_TAX_IDENTIFICATION_NUMBER = "US_INDIVIDUAL_TAX_IDENTIFICATION_NUMBER" - """A US Individual Taxpayer Identification Number (ITIN) """ + """A US Individual Taxpayer Identification Number (ITIN)""" US_PASSPORT_NUMBER = "US_PASSPORT_NUMBER" - """A US passport number, ranging from six to nine alphanumeric characters """ + """A US passport number, ranging from six to nine alphanumeric characters""" US_SOCIAL_SECURITY_NUMBER = "US_SOCIAL_SECURITY_NUMBER" """ A US Social Security Number (SSN) - nine-digit number for US citizens @@ -6220,9 +6220,9 @@ class PIIEntityType(UnknownEnumMixin, StrEnum): healthcare benefits """ CA_SOCIAL_INSURANCE_NUMBER = "CA_SOCIAL_INSURANCE_NUMBER" - """A Canadian Social Insurance Number (SIN) - nine-digit unique identifier """ + """A Canadian Social Insurance Number (SIN) - nine-digit unique identifier""" UK_NATIONAL_HEALTH_SERVICE_NUMBER = "UK_NATIONAL_HEALTH_SERVICE_NUMBER" - """A UK National Health Service Number - 10-17 digit number """ + """A UK National Health Service Number - 10-17 digit number""" UK_NATIONAL_INSURANCE_NUMBER = "UK_NATIONAL_INSURANCE_NUMBER" """ A UK National Insurance Number (NINO) for accessing National Insurance @@ -6265,9 +6265,9 @@ class PIIRedactionMaskMode(UnknownEnumMixin, StrEnum): """Mode for redacting detected PII""" PII = "PII" - """Replace with generic PII marker [PII] """ + """Replace with generic PII marker [PII]""" ENTITY_TYPE = "ENTITY_TYPE" - """Replace with specific entity type marker, e.g. [NAME]/[SSN] etc. """ + """Replace with specific entity type marker, e.g. [NAME]/[SSN] etc.""" @dataclass(kw_only=True) diff --git a/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/user_agent.py b/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/user_agent.py index f6e359a..6171f4f 100644 --- a/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/user_agent.py +++ b/clients/aws-sdk-bedrock-data-automation/src/aws_sdk_bedrock_data_automation/user_agent.py @@ -3,10 +3,10 @@ from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor from . import __version__ -from .config import Config +from .config import AsyncBedrockDataAutomationConfig -def aws_user_agent_plugin(config: Config): +def aws_user_agent_plugin(config: AsyncBedrockDataAutomationConfig): config.interceptors.append( UserAgentInterceptor( ua_suffix=config.user_agent_extra, diff --git a/clients/aws-sdk-bedrock-data-automation/tests/test_protocol.py b/clients/aws-sdk-bedrock-data-automation/tests/test_restjson_protocol.py similarity index 100% rename from clients/aws-sdk-bedrock-data-automation/tests/test_protocol.py rename to clients/aws-sdk-bedrock-data-automation/tests/test_restjson_protocol.py diff --git a/clients/aws-sdk-bedrock-runtime/.changes/0.10.0.json b/clients/aws-sdk-bedrock-runtime/.changes/0.10.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/clients/aws-sdk-bedrock-runtime/.changes/0.10.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-bedrock-runtime/CHANGELOG.md b/clients/aws-sdk-bedrock-runtime/CHANGELOG.md index 1733c12..33f8bf2 100644 --- a/clients/aws-sdk-bedrock-runtime/CHANGELOG.md +++ b/clients/aws-sdk-bedrock-runtime/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### Dependencies diff --git a/clients/aws-sdk-bedrock-runtime/pyproject.toml b/clients/aws-sdk-bedrock-runtime/pyproject.toml index 4401329..753f06c 100644 --- a/clients/aws-sdk-bedrock-runtime/pyproject.toml +++ b/clients/aws-sdk-bedrock-runtime/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "aws_sdk_bedrock_runtime" -version = "0.9.0" +version = "0.10.0" description = "aws_sdk_bedrock_runtime client" readme = "README.md" requires-python = ">=3.12" @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ - "smithy_aws_core[eventstream, json]~=0.9.0", + "smithy_aws_core[eventstream, json]~=0.10.0", "smithy_core~=0.8.0", "smithy_http[awscrt]~=0.4.0" ] diff --git a/clients/aws-sdk-bedrock-runtime/scripts/docs/generate_doc_stubs.py b/clients/aws-sdk-bedrock-runtime/scripts/docs/generate_doc_stubs.py index b00ac66..56ab5a8 100644 --- a/clients/aws-sdk-bedrock-runtime/scripts/docs/generate_doc_stubs.py +++ b/clients/aws-sdk-bedrock-runtime/scripts/docs/generate_doc_stubs.py @@ -8,6 +8,7 @@ import argparse import logging +import re import sys from collections.abc import Sequence from dataclasses import dataclass @@ -115,19 +116,43 @@ class ClientInfo: class DocStubGenerator: """Generate markdown API Reference stubs for AWS SDK for Python clients.""" - def __init__(self, client_dir: Path, output_dir: Path) -> None: + def __init__(self, client_dir: Path, output_dir: Path, service_name: str | None = None) -> None: """ Initialize the documentation generator. Args: client_dir: Path to the client source directory output_dir: Path to the output directory for generated doc stubs + service_name: Display name for the service (e.g. the Smithy sdkId + "SNS"). When omitted, falls back to a title-cased derivation of + the package name, which does not preserve acronym casing. """ self.client_dir = client_dir self.output_dir = output_dir - # Extract service name from package name - # (e.g., "aws_sdk_bedrock_runtime" -> "Bedrock Runtime") - self.service_name = client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + # Use the explicit override, then the sdkId from the package, then + # fall back to a title-cased package name (does not keep acronym + # casing, so "sns" becomes "Sns"). + self.service_name = ( + service_name + or self._sdk_id_from_package(client_dir) + or client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + ) + + @staticmethod + def _sdk_id_from_package(client_dir: Path) -> str | None: + """ + Read the authoritative service name (Smithy sdkId) from the package. + + The generated ``_private/schemas.py`` carries the ``aws.api#service`` + trait's ``sdkId`` (e.g. "SNS"), the same field the sidebar navigation + uses, so it keeps acronym casing that the package name does not. + Returns None if the file or value is absent. + """ + schemas = client_dir / "_private" / "schemas.py" + if not schemas.is_file(): + return None + match = re.search(r'"sdkId":\s*"([^"]+)"', schemas.read_text()) + return match.group(1) if match else None def generate(self) -> bool: """ @@ -166,10 +191,13 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: if not client_class: raise ValueError(f"No class ending with 'Client' found in {package_name}.client") - config_class = config_module.members.get("Config") + config_class = self._find_class_with_suffix(config_module, "Config") + if not config_class: + raise ValueError(f"No class ending with 'Config' found in {package_name}.config") + plugin_alias = config_module.members.get("Plugin") - if not config_class or not plugin_alias: - raise ValueError(f"Missing Config or Plugin in {package_name}.config") + if not plugin_alias: + raise ValueError(f"Missing Plugin in {package_name}.config") config = TypeInfo(name=config_class.name, module_path=config_class.path) plugin = TypeInfo(name=plugin_alias.name, module_path=plugin_alias.path) @@ -194,8 +222,12 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: ) def _find_class_with_suffix(self, module: Module, suffix: str) -> Class | None: - """Find the class in the module with a matching suffix.""" + """Find the class defined in the module with a matching suffix.""" for cls in module.classes.values(): + # Skip imported classes so a same-package import (e.g. a *Config + # class re-exported from config.py) can't shadow the defined one. + if cls.is_imported: + continue if cls.name.endswith(suffix): return cls return None @@ -616,6 +648,12 @@ def main() -> int: required=True, help="Output directory for generated doc stubs", ) + parser.add_argument( + "-s", + "--service-name", + default=None, + help="Display name for the service (Smithy sdkId, e.g. 'SNS')", + ) args = parser.parse_args() client_dir = args.client_dir.resolve() @@ -626,7 +664,7 @@ def main() -> int: return 1 try: - generator = DocStubGenerator(client_dir, output_dir) + generator = DocStubGenerator(client_dir, output_dir, args.service_name) success = generator.generate() return 0 if success else 1 except Exception as e: diff --git a/clients/aws-sdk-bedrock-runtime/src/aws_sdk_bedrock_runtime/__init__.py b/clients/aws-sdk-bedrock-runtime/src/aws_sdk_bedrock_runtime/__init__.py index 7e20a8c..3c99375 100644 --- a/clients/aws-sdk-bedrock-runtime/src/aws_sdk_bedrock_runtime/__init__.py +++ b/clients/aws-sdk-bedrock-runtime/src/aws_sdk_bedrock_runtime/__init__.py @@ -1,3 +1,3 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -__version__: str = "0.9.0" +__version__: str = "0.10.0" diff --git a/clients/aws-sdk-bedrock-runtime/src/aws_sdk_bedrock_runtime/client.py b/clients/aws-sdk-bedrock-runtime/src/aws_sdk_bedrock_runtime/client.py index a4e74db..106e521 100644 --- a/clients/aws-sdk-bedrock-runtime/src/aws_sdk_bedrock_runtime/client.py +++ b/clients/aws-sdk-bedrock-runtime/src/aws_sdk_bedrock_runtime/client.py @@ -1,5 +1,6 @@ # Code generated by smithy-python-codegen DO NOT EDIT. +import asyncio from copy import deepcopy import logging from typing import Any, TYPE_CHECKING @@ -13,7 +14,7 @@ from smithy_core.types import TypedProperties from smithy_http.plugins import user_agent_plugin -from .config import Config, Plugin +from .config import AsyncBedrockRuntimeConfig, Plugin from .models import ( APPLY_GUARDRAIL, ApplyGuardrailInput, @@ -69,7 +70,9 @@ class AsyncBedrockRuntimeClient: """ def __init__( - self, config: Config | None = None, plugins: list[Plugin] | None = None + self, + config: AsyncBedrockRuntimeConfig | None = None, + plugins: list[Plugin] | None = None, ): """ Constructor for `AsyncBedrockRuntimeClient`. @@ -79,19 +82,32 @@ def __init__( Optional configuration for the client. Here you can set things like the endpoint for HTTP services or auth credentials. plugins: - A list of callables that modify the configuration dynamically. These - can be used to set defaults, for example. + A list of callables applied once to the client's base configuration. + Their changes are inherited by every operation invocation. """ - self._config = config or Config() - - client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] - if plugins: - client_plugins.extend(plugins) - - for plugin in client_plugins: - plugin(self._config) - + self._config = config + self._plugins = plugins + self._derive_lock = asyncio.Lock() + self._setup_done = False self._retry_strategy_resolver = RetryStrategyResolver() + self._client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] + + async def _ensure_setup(self) -> None: + if not self._setup_done: + async with self._derive_lock: + if not self._setup_done: + if self._config is None: + config = await AsyncBedrockRuntimeConfig.resolve() + else: + # Copy so plugins don't mutate the caller's config. + config = deepcopy(self._config) + for plugin in self._client_plugins: + plugin(config) + if self._plugins: + for plugin in self._plugins: + plugin(config) + self._config = config + self._setup_done = True async def apply_guardrail( self, input: ApplyGuardrailInput, plugins: list[Plugin] | None = None @@ -120,16 +136,31 @@ async def apply_guardrail( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -216,16 +247,31 @@ async def converse( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -323,16 +369,31 @@ async def converse_stream( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -400,16 +461,31 @@ async def count_tokens( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -447,16 +523,31 @@ async def get_async_invoke( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -496,16 +587,31 @@ async def invoke_guardrail_checks( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -567,16 +673,31 @@ async def invoke_model( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -630,16 +751,31 @@ async def invoke_model_with_bidirectional_stream( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -717,16 +853,31 @@ async def invoke_model_with_response_stream( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -766,16 +917,31 @@ async def list_async_invokes( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -826,16 +992,31 @@ async def start_async_invoke( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) diff --git a/clients/aws-sdk-bedrock-runtime/src/aws_sdk_bedrock_runtime/config.py b/clients/aws-sdk-bedrock-runtime/src/aws_sdk_bedrock_runtime/config.py index 450998e..a3c2f78 100644 --- a/clients/aws-sdk-bedrock-runtime/src/aws_sdk_bedrock_runtime/config.py +++ b/clients/aws-sdk-bedrock-runtime/src/aws_sdk_bedrock_runtime/config.py @@ -1,24 +1,24 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -from dataclasses import dataclass -from typing import Any, Callable, TypeAlias, Union +from dataclasses import dataclass, field +from typing import Any, Callable, ClassVar, Self, TypeAlias, Union, 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.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ClientProtocol, ClientTransport, EndpointResolver +from smithy_core.aio.interfaces import ClientProtocol, EndpointResolver from smithy_core.aio.interfaces.auth import AuthScheme from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy from smithy_core.interceptors import Interceptor -from smithy_core.interfaces import URI -from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.crt import AWSCRTHTTPClient -from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import ( AMAZON_BEDROCK_FRONTEND_SERVICE as _SCHEMA_AMAZON_BEDROCK_FRONTEND_SERVICE, @@ -75,141 +75,136 @@ ] -@dataclass(init=False) -class Config: - """Configuration for Bedrock Runtime.""" - - auth_scheme_resolver: HTTPAuthSchemeResolver - """ - An auth scheme resolver that determines the auth scheme for each - operation. - """ - - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] - """A map of auth scheme ids to auth schemes.""" - - aws_access_key_id: str | None - """The identifier for a secret access key.""" - - aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None - ) - """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" +class _AsyncBedrockRuntimeConfigOverrides(AwsConfigOverrides, total=False): + endpoint_resolver: EndpointResolver | None + protocol: ClientProtocol[Any, Any] | None + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None - aws_secret_access_key: str | None - """A secret access key that can be used to sign requests.""" - aws_session_token: str | None - """An access key ID that identifies temporary security credentials.""" +@dataclass(kw_only=True, repr=False, init=False) +class AsyncBedrockRuntimeConfig(AsyncAwsConfig): + """Bedrock Runtime configuration (async-resolved).""" - endpoint_resolver: EndpointResolver + endpoint_resolver: EndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - endpoint_uri: str | URI | None - """A static URI to route requests to.""" - - http_request_config: HTTPRequestConfiguration | None - """Configuration for individual HTTP requests.""" + protocol: ClientProtocol[Any, Any] | None = None + """The protocol to serialize and deserialize requests with.""" - interceptors: list[_ServiceInterceptor] + interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) """ The list of interceptors, which are hooks that are called during the execution of a request. """ - protocol: ClientProtocol[Any, Any] | None - """The protocol to serialize and deserialize requests with.""" + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + """A map of auth scheme ids to auth schemes.""" - region: str | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None = None """ - The AWS region to connect to. The configured region is used to determine - the service endpoint. + An auth scheme resolver that determines the auth scheme for each + operation. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + aws_credentials_identity_resolver: ( + IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + ) = None + """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" + + region: str | None = None """ - The retry strategy or options for configuring retry behavior. Can be - either a configured RetryStrategy or RetryStrategyOptions to create one. + The AWS region to connect to. The configured region is used to determine + the service endpoint. """ - sdk_ua_app_id: str | None + aws_access_key_id: str | None = None + """The identifier for a secret access key.""" + + aws_secret_access_key: str | None = None + """A secret access key that can be used to sign requests.""" + + aws_session_token: str | None = None + """The session token used with temporary AWS credentials.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + sdk_ua_app_id: str | None = None """ A unique and opaque application ID that is appended to the User-Agent header. """ - transport: ClientTransport[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 - streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. - """ - - user_agent_extra: str | None - """Additional suffix to be added to the User-Agent header.""" - - def __init__( - self, - *, - auth_scheme_resolver: HTTPAuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - aws_access_key_id: str | None = None, - aws_credentials_identity_resolver: IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties - ] - | None = None, - aws_secret_access_key: str | None = None, - aws_session_token: str | None = None, - endpoint_resolver: EndpointResolver | None = None, - endpoint_uri: str | URI | None = None, - http_request_config: HTTPRequestConfiguration | None = None, - interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] | None = None, - region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, - sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, - user_agent_extra: str | None = None, - ): - self.auth_scheme_resolver = auth_scheme_resolver or HTTPAuthSchemeResolver() - self.auth_schemes = auth_schemes or { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="bedrock") - } - self.aws_access_key_id = aws_access_key_id - self.aws_credentials_identity_resolver = aws_credentials_identity_resolver - self.aws_secret_access_key = aws_secret_access_key - self.aws_session_token = aws_session_token - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="bedrock-runtime" - ) - self.endpoint_uri = endpoint_uri - self.http_request_config = http_request_config - self.interceptors = interceptors or [] - self.protocol = protocol or RestJsonClientProtocol( - _SCHEMA_AMAZON_BEDROCK_FRONTEND_SERVICE - ) - self.region = region - self.retry_strategy = retry_strategy - self.sdk_ua_app_id = sdk_ua_app_id - self.transport = transport or AWSCRTHTTPClient() - self.user_agent_extra = user_agent_extra + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "aws_credentials_identity_resolver": FieldSpec(default=None), + "region": FieldSpec(default=None), + "aws_access_key_id": FieldSpec(default=None), + "aws_secret_access_key": FieldSpec(default=None), + "aws_session_token": FieldSpec(default=None), + "user_agent_extra": FieldSpec(default=None), + "sdk_ua_app_id": FieldSpec(default=None), + **AsyncAwsConfig._FIELDS, + "endpoint_uri": FieldSpec( + default=None, resolver=EndpointUriResolver("bedrock_runtime") + ), + "endpoint_resolver": FieldSpec( + default_factory=lambda: StandardRegionalEndpointsResolver( + endpoint_prefix="bedrock-runtime" + ) + ), + "protocol": FieldSpec( + default_factory=lambda: RestJsonClientProtocol( + _SCHEMA_AMAZON_BEDROCK_FRONTEND_SERVICE + ) + ), + "auth_schemes": FieldSpec( + default_factory=lambda: { + ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="bedrock") + } + ), + "auth_scheme_resolver": FieldSpec(default_factory=HTTPAuthSchemeResolver), + "transport": FieldSpec(default_factory=lambda: AWSCRTHTTPClient()), + } def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None: """ - Sets the implementation of an auth scheme. - - Using this method ensures the correct key is used. + Set an auth scheme implementation using its scheme ID. :param scheme: + The auth scheme to add or replace. + """ + auth_schemes = dict(self.auth_schemes or {}) + auth_schemes[scheme.scheme_id] = scheme + self.auth_schemes = auth_schemes - Args: - scheme: - The auth scheme to add. + @classmethod + async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] + cls, + *, + profile: str | None = None, + fs: FileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[_AsyncBedrockRuntimeConfigOverrides], + ) -> Self: + """ + Resolve config from environment, config files, defaults, and explicit + overrides. """ - self.auth_schemes[scheme.scheme_id] = scheme + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) -Plugin: TypeAlias = Callable[[Config], None] -"""A callable that allows customizing the config object on each request.""" +Plugin: TypeAlias = Callable[[AsyncBedrockRuntimeConfig], None] +""" +A callable that customizes a client configuration. Service-level plugins +are applied once to the base configuration inherited by every operation. +Operation-level plugins apply only to a single operation invocation. +""" diff --git a/clients/aws-sdk-bedrock-runtime/src/aws_sdk_bedrock_runtime/user_agent.py b/clients/aws-sdk-bedrock-runtime/src/aws_sdk_bedrock_runtime/user_agent.py index d797692..65c541e 100644 --- a/clients/aws-sdk-bedrock-runtime/src/aws_sdk_bedrock_runtime/user_agent.py +++ b/clients/aws-sdk-bedrock-runtime/src/aws_sdk_bedrock_runtime/user_agent.py @@ -3,10 +3,10 @@ from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor from . import __version__ -from .config import Config +from .config import AsyncBedrockRuntimeConfig -def aws_user_agent_plugin(config: Config): +def aws_user_agent_plugin(config: AsyncBedrockRuntimeConfig): config.interceptors.append( UserAgentInterceptor( ua_suffix=config.user_agent_extra, diff --git a/clients/aws-sdk-bedrock-runtime/tests/test_protocol.py b/clients/aws-sdk-bedrock-runtime/tests/test_restjson_protocol.py similarity index 100% rename from clients/aws-sdk-bedrock-runtime/tests/test_protocol.py rename to clients/aws-sdk-bedrock-runtime/tests/test_restjson_protocol.py diff --git a/clients/aws-sdk-bedrock/.changes/0.10.0.json b/clients/aws-sdk-bedrock/.changes/0.10.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/clients/aws-sdk-bedrock/.changes/0.10.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-bedrock/CHANGELOG.md b/clients/aws-sdk-bedrock/CHANGELOG.md index babce7d..f34069e 100644 --- a/clients/aws-sdk-bedrock/CHANGELOG.md +++ b/clients/aws-sdk-bedrock/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### Dependencies diff --git a/clients/aws-sdk-bedrock/pyproject.toml b/clients/aws-sdk-bedrock/pyproject.toml index e99673c..706791b 100644 --- a/clients/aws-sdk-bedrock/pyproject.toml +++ b/clients/aws-sdk-bedrock/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "aws_sdk_bedrock" -version = "0.9.0" +version = "0.10.0" description = "aws_sdk_bedrock client" readme = "README.md" requires-python = ">=3.12" @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ - "smithy_aws_core[json]~=0.9.0", + "smithy_aws_core[json]~=0.10.0", "smithy_core~=0.8.0", "smithy_http[aiohttp]~=0.4.0" ] diff --git a/clients/aws-sdk-bedrock/scripts/docs/generate_doc_stubs.py b/clients/aws-sdk-bedrock/scripts/docs/generate_doc_stubs.py index b00ac66..56ab5a8 100644 --- a/clients/aws-sdk-bedrock/scripts/docs/generate_doc_stubs.py +++ b/clients/aws-sdk-bedrock/scripts/docs/generate_doc_stubs.py @@ -8,6 +8,7 @@ import argparse import logging +import re import sys from collections.abc import Sequence from dataclasses import dataclass @@ -115,19 +116,43 @@ class ClientInfo: class DocStubGenerator: """Generate markdown API Reference stubs for AWS SDK for Python clients.""" - def __init__(self, client_dir: Path, output_dir: Path) -> None: + def __init__(self, client_dir: Path, output_dir: Path, service_name: str | None = None) -> None: """ Initialize the documentation generator. Args: client_dir: Path to the client source directory output_dir: Path to the output directory for generated doc stubs + service_name: Display name for the service (e.g. the Smithy sdkId + "SNS"). When omitted, falls back to a title-cased derivation of + the package name, which does not preserve acronym casing. """ self.client_dir = client_dir self.output_dir = output_dir - # Extract service name from package name - # (e.g., "aws_sdk_bedrock_runtime" -> "Bedrock Runtime") - self.service_name = client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + # Use the explicit override, then the sdkId from the package, then + # fall back to a title-cased package name (does not keep acronym + # casing, so "sns" becomes "Sns"). + self.service_name = ( + service_name + or self._sdk_id_from_package(client_dir) + or client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + ) + + @staticmethod + def _sdk_id_from_package(client_dir: Path) -> str | None: + """ + Read the authoritative service name (Smithy sdkId) from the package. + + The generated ``_private/schemas.py`` carries the ``aws.api#service`` + trait's ``sdkId`` (e.g. "SNS"), the same field the sidebar navigation + uses, so it keeps acronym casing that the package name does not. + Returns None if the file or value is absent. + """ + schemas = client_dir / "_private" / "schemas.py" + if not schemas.is_file(): + return None + match = re.search(r'"sdkId":\s*"([^"]+)"', schemas.read_text()) + return match.group(1) if match else None def generate(self) -> bool: """ @@ -166,10 +191,13 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: if not client_class: raise ValueError(f"No class ending with 'Client' found in {package_name}.client") - config_class = config_module.members.get("Config") + config_class = self._find_class_with_suffix(config_module, "Config") + if not config_class: + raise ValueError(f"No class ending with 'Config' found in {package_name}.config") + plugin_alias = config_module.members.get("Plugin") - if not config_class or not plugin_alias: - raise ValueError(f"Missing Config or Plugin in {package_name}.config") + if not plugin_alias: + raise ValueError(f"Missing Plugin in {package_name}.config") config = TypeInfo(name=config_class.name, module_path=config_class.path) plugin = TypeInfo(name=plugin_alias.name, module_path=plugin_alias.path) @@ -194,8 +222,12 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: ) def _find_class_with_suffix(self, module: Module, suffix: str) -> Class | None: - """Find the class in the module with a matching suffix.""" + """Find the class defined in the module with a matching suffix.""" for cls in module.classes.values(): + # Skip imported classes so a same-package import (e.g. a *Config + # class re-exported from config.py) can't shadow the defined one. + if cls.is_imported: + continue if cls.name.endswith(suffix): return cls return None @@ -616,6 +648,12 @@ def main() -> int: required=True, help="Output directory for generated doc stubs", ) + parser.add_argument( + "-s", + "--service-name", + default=None, + help="Display name for the service (Smithy sdkId, e.g. 'SNS')", + ) args = parser.parse_args() client_dir = args.client_dir.resolve() @@ -626,7 +664,7 @@ def main() -> int: return 1 try: - generator = DocStubGenerator(client_dir, output_dir) + generator = DocStubGenerator(client_dir, output_dir, args.service_name) success = generator.generate() return 0 if success else 1 except Exception as e: diff --git a/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/__init__.py b/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/__init__.py index 7e20a8c..3c99375 100644 --- a/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/__init__.py +++ b/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/__init__.py @@ -1,3 +1,3 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -__version__: str = "0.9.0" +__version__: str = "0.10.0" diff --git a/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/_private/schemas.py b/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/_private/schemas.py index bc67768..17126eb 100644 --- a/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/_private/schemas.py +++ b/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/_private/schemas.py @@ -18037,10 +18037,10 @@ ], ) -RETRIEVAL_FILTER.members["andAll"] = Schema.member( - id=RETRIEVAL_FILTER.id.with_member("andAll"), target=RETRIEVAL_FILTER_LIST, index=11 -) - RETRIEVAL_FILTER.members["orAll"] = Schema.member( id=RETRIEVAL_FILTER.id.with_member("orAll"), target=RETRIEVAL_FILTER_LIST, index=12 ) + +RETRIEVAL_FILTER.members["andAll"] = Schema.member( + id=RETRIEVAL_FILTER.id.with_member("andAll"), target=RETRIEVAL_FILTER_LIST, index=11 +) diff --git a/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/client.py b/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/client.py index 7220d8d..2cab462 100644 --- a/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/client.py +++ b/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/client.py @@ -1,5 +1,6 @@ # Code generated by smithy-python-codegen DO NOT EDIT. +import asyncio from copy import deepcopy import logging @@ -10,7 +11,7 @@ from smithy_core.types import TypedProperties from smithy_http.plugins import user_agent_plugin -from .config import Config, Plugin +from .config import AsyncBedrockConfig, Plugin from .models import ( BATCH_DELETE_ADVANCED_PROMPT_OPTIMIZATION_JOB, BATCH_DELETE_EVALUATION_JOB, @@ -350,7 +351,9 @@ class AsyncBedrockClient: """ def __init__( - self, config: Config | None = None, plugins: list[Plugin] | None = None + self, + config: AsyncBedrockConfig | None = None, + plugins: list[Plugin] | None = None, ): """ Constructor for `AsyncBedrockClient`. @@ -360,19 +363,32 @@ def __init__( Optional configuration for the client. Here you can set things like the endpoint for HTTP services or auth credentials. plugins: - A list of callables that modify the configuration dynamically. These - can be used to set defaults, for example. + A list of callables applied once to the client's base configuration. + Their changes are inherited by every operation invocation. """ - self._config = config or Config() - - client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] - if plugins: - client_plugins.extend(plugins) - - for plugin in client_plugins: - plugin(self._config) - + self._config = config + self._plugins = plugins + self._derive_lock = asyncio.Lock() + self._setup_done = False self._retry_strategy_resolver = RetryStrategyResolver() + self._client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] + + async def _ensure_setup(self) -> None: + if not self._setup_done: + async with self._derive_lock: + if not self._setup_done: + if self._config is None: + config = await AsyncBedrockConfig.resolve() + else: + # Copy so plugins don't mutate the caller's config. + config = deepcopy(self._config) + for plugin in self._client_plugins: + plugin(config) + if self._plugins: + for plugin in self._plugins: + plugin(config) + self._config = config + self._setup_done = True async def batch_delete_advanced_prompt_optimization_job( self, @@ -397,16 +413,31 @@ async def batch_delete_advanced_prompt_optimization_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -447,16 +478,31 @@ async def batch_delete_evaluation_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -498,16 +544,31 @@ async def cancel_automated_reasoning_policy_build_workflow( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -549,16 +610,31 @@ async def create_advanced_prompt_optimization_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -606,16 +682,31 @@ async def create_automated_reasoning_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -658,16 +749,31 @@ async def create_automated_reasoning_policy_test_case( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -709,16 +815,31 @@ async def create_automated_reasoning_policy_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -791,16 +912,31 @@ async def create_custom_model( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -856,16 +992,31 @@ async def create_custom_model_deployment( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -903,16 +1054,31 @@ async def create_evaluation_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -952,16 +1118,31 @@ async def create_foundation_model_agreement( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1027,16 +1208,31 @@ async def create_guardrail( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1076,16 +1272,31 @@ async def create_guardrail_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1132,16 +1343,31 @@ async def create_inference_profile( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1182,16 +1408,31 @@ async def create_marketplace_model_endpoint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1233,16 +1474,31 @@ async def create_model_copy_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1301,16 +1557,31 @@ async def create_model_customization_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1351,16 +1622,31 @@ async def create_model_import_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1406,16 +1692,31 @@ async def create_model_invocation_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1454,16 +1755,31 @@ async def create_prompt_router( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1509,16 +1825,31 @@ async def create_provisioned_model_throughput( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1560,16 +1891,31 @@ async def delete_automated_reasoning_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1611,16 +1957,31 @@ async def delete_automated_reasoning_policy_build_workflow( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1661,16 +2022,31 @@ async def delete_automated_reasoning_policy_test_case( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1712,16 +2088,31 @@ async def delete_custom_model( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1772,16 +2163,31 @@ async def delete_custom_model_deployment( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1821,16 +2227,31 @@ async def delete_enforced_guardrail_configuration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1870,16 +2291,31 @@ async def delete_foundation_model_agreement( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1925,16 +2361,31 @@ async def delete_guardrail( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1976,16 +2427,31 @@ async def delete_imported_model( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2027,16 +2493,31 @@ async def delete_inference_profile( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2076,16 +2557,31 @@ async def delete_marketplace_model_endpoint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2125,16 +2621,31 @@ async def delete_model_invocation_logging_configuration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2172,16 +2683,31 @@ async def delete_prompt_router( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2226,16 +2752,31 @@ async def delete_provisioned_model_throughput( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2273,16 +2814,31 @@ async def delete_resource_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2324,16 +2880,31 @@ async def deregister_marketplace_model_endpoint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2375,16 +2946,31 @@ async def export_automated_reasoning_policy_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2422,16 +3008,31 @@ async def get_account_data_retention( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2471,16 +3072,31 @@ async def get_advanced_prompt_optimization_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2522,16 +3138,31 @@ async def get_automated_reasoning_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2573,16 +3204,31 @@ async def get_automated_reasoning_policy_annotations( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2623,16 +3269,31 @@ async def get_automated_reasoning_policy_build_workflow( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2674,16 +3335,31 @@ async def get_automated_reasoning_policy_build_workflow_result_assets( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2725,16 +3401,31 @@ async def get_automated_reasoning_policy_next_scenario( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2774,16 +3465,31 @@ async def get_automated_reasoning_policy_test_case( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2824,16 +3530,31 @@ async def get_automated_reasoning_policy_test_result( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2875,16 +3596,31 @@ async def get_custom_model( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2933,16 +3669,31 @@ async def get_custom_model_deployment( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2980,16 +3731,31 @@ async def get_evaluation_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3027,16 +3793,31 @@ async def get_foundation_model( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3076,16 +3857,31 @@ async def get_foundation_model_availability( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3124,16 +3920,31 @@ async def get_guardrail( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3171,16 +3982,31 @@ async def get_imported_model( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3222,16 +4048,31 @@ async def get_inference_profile( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3272,16 +4113,31 @@ async def get_marketplace_model_endpoint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3323,16 +4179,31 @@ async def get_model_copy_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3374,16 +4245,31 @@ async def get_model_customization_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3425,16 +4311,31 @@ async def get_model_import_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3474,16 +4375,31 @@ async def get_model_invocation_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3523,16 +4439,31 @@ async def get_model_invocation_logging_configuration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3570,16 +4501,31 @@ async def get_prompt_router( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3623,16 +4569,31 @@ async def get_provisioned_model_throughput( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3670,16 +4631,31 @@ async def get_resource_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3717,16 +4693,31 @@ async def get_use_case_for_model_access( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3766,16 +4757,31 @@ async def list_advanced_prompt_optimization_jobs( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3817,16 +4823,31 @@ async def list_automated_reasoning_policies( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3867,16 +4888,31 @@ async def list_automated_reasoning_policy_build_workflows( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3918,16 +4954,31 @@ async def list_automated_reasoning_policy_test_cases( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3968,16 +5019,31 @@ async def list_automated_reasoning_policy_test_results( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4031,16 +5097,31 @@ async def list_custom_model_deployments( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4084,16 +5165,31 @@ async def list_custom_models( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4133,16 +5229,31 @@ async def list_enforced_guardrails_configuration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4180,16 +5291,31 @@ async def list_evaluation_jobs( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4229,16 +5355,31 @@ async def list_foundation_model_agreement_offers( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4281,16 +5422,31 @@ async def list_foundation_models( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4336,16 +5492,31 @@ async def list_guardrails( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4388,16 +5559,31 @@ async def list_imported_models( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4439,16 +5625,31 @@ async def list_inference_profiles( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4489,16 +5690,31 @@ async def list_marketplace_model_endpoints( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4541,16 +5757,31 @@ async def list_model_copy_jobs( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4596,16 +5827,31 @@ async def list_model_customization_jobs( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4648,16 +5894,31 @@ async def list_model_import_jobs( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4697,16 +5958,31 @@ async def list_model_invocation_jobs( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4744,16 +6020,31 @@ async def list_prompt_routers( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4797,16 +6088,31 @@ async def list_provisioned_model_throughputs( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4849,16 +6155,31 @@ async def list_tags_for_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4896,16 +6217,31 @@ async def put_account_data_retention( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4945,16 +6281,31 @@ async def put_enforced_guardrail_configuration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4994,16 +6345,31 @@ async def put_model_invocation_logging_configuration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5041,16 +6407,31 @@ async def put_resource_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5088,16 +6469,31 @@ async def put_use_case_for_model_access( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5138,16 +6534,31 @@ async def register_marketplace_model_endpoint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5189,16 +6600,31 @@ async def start_automated_reasoning_policy_build_workflow( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5240,16 +6666,31 @@ async def start_automated_reasoning_policy_test_workflow( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5289,16 +6730,31 @@ async def stop_advanced_prompt_optimization_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5336,16 +6792,31 @@ async def stop_evaluation_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5387,16 +6858,31 @@ async def stop_model_customization_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5436,16 +6922,31 @@ async def stop_model_invocation_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5486,16 +6987,31 @@ async def tag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5537,16 +7053,31 @@ async def untag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5588,16 +7119,31 @@ async def update_automated_reasoning_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5639,16 +7185,31 @@ async def update_automated_reasoning_policy_annotations( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5689,16 +7250,31 @@ async def update_automated_reasoning_policy_test_case( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5739,16 +7315,31 @@ async def update_custom_model_deployment( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5824,16 +7415,31 @@ async def update_guardrail( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5874,16 +7480,31 @@ async def update_marketplace_model_endpoint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5927,16 +7548,31 @@ async def update_provisioned_model_throughput( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) diff --git a/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/config.py b/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/config.py index 90a4e57..e0c8b63 100644 --- a/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/config.py +++ b/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/config.py @@ -1,24 +1,24 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -from dataclasses import dataclass -from typing import Any, Callable, TypeAlias, Union +from dataclasses import dataclass, field +from typing import Any, Callable, ClassVar, Self, TypeAlias, Union, 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.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ClientProtocol, ClientTransport, EndpointResolver +from smithy_core.aio.interfaces import ClientProtocol, EndpointResolver from smithy_core.aio.interfaces.auth import AuthScheme from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy from smithy_core.interceptors import Interceptor -from smithy_core.interfaces import URI -from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.aiohttp import AIOHTTPClient -from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import ( AMAZON_BEDROCK_CONTROL_PLANE_SERVICE as _SCHEMA_AMAZON_BEDROCK_CONTROL_PLANE_SERVICE, @@ -631,141 +631,136 @@ ] -@dataclass(init=False) -class Config: - """Configuration for Bedrock.""" - - auth_scheme_resolver: HTTPAuthSchemeResolver - """ - An auth scheme resolver that determines the auth scheme for each - operation. - """ - - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] - """A map of auth scheme ids to auth schemes.""" - - aws_access_key_id: str | None - """The identifier for a secret access key.""" - - aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None - ) - """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" +class _AsyncBedrockConfigOverrides(AwsConfigOverrides, total=False): + endpoint_resolver: EndpointResolver | None + protocol: ClientProtocol[Any, Any] | None + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None - aws_secret_access_key: str | None - """A secret access key that can be used to sign requests.""" - aws_session_token: str | None - """An access key ID that identifies temporary security credentials.""" +@dataclass(kw_only=True, repr=False, init=False) +class AsyncBedrockConfig(AsyncAwsConfig): + """Bedrock configuration (async-resolved).""" - endpoint_resolver: EndpointResolver + endpoint_resolver: EndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - endpoint_uri: str | URI | None - """A static URI to route requests to.""" - - http_request_config: HTTPRequestConfiguration | None - """Configuration for individual HTTP requests.""" + protocol: ClientProtocol[Any, Any] | None = None + """The protocol to serialize and deserialize requests with.""" - interceptors: list[_ServiceInterceptor] + interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) """ The list of interceptors, which are hooks that are called during the execution of a request. """ - protocol: ClientProtocol[Any, Any] | None - """The protocol to serialize and deserialize requests with.""" + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + """A map of auth scheme ids to auth schemes.""" - region: str | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None = None """ - The AWS region to connect to. The configured region is used to determine - the service endpoint. + An auth scheme resolver that determines the auth scheme for each + operation. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + aws_credentials_identity_resolver: ( + IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + ) = None + """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" + + region: str | None = None """ - The retry strategy or options for configuring retry behavior. Can be - either a configured RetryStrategy or RetryStrategyOptions to create one. + The AWS region to connect to. The configured region is used to determine + the service endpoint. """ - sdk_ua_app_id: str | None + aws_access_key_id: str | None = None + """The identifier for a secret access key.""" + + aws_secret_access_key: str | None = None + """A secret access key that can be used to sign requests.""" + + aws_session_token: str | None = None + """The session token used with temporary AWS credentials.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + sdk_ua_app_id: str | None = None """ A unique and opaque application ID that is appended to the User-Agent header. """ - transport: ClientTransport[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 - streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. - """ - - user_agent_extra: str | None - """Additional suffix to be added to the User-Agent header.""" - - def __init__( - self, - *, - auth_scheme_resolver: HTTPAuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - aws_access_key_id: str | None = None, - aws_credentials_identity_resolver: IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties - ] - | None = None, - aws_secret_access_key: str | None = None, - aws_session_token: str | None = None, - endpoint_resolver: EndpointResolver | None = None, - endpoint_uri: str | URI | None = None, - http_request_config: HTTPRequestConfiguration | None = None, - interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] | None = None, - region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, - sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, - user_agent_extra: str | None = None, - ): - self.auth_scheme_resolver = auth_scheme_resolver or HTTPAuthSchemeResolver() - self.auth_schemes = auth_schemes or { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="bedrock") - } - self.aws_access_key_id = aws_access_key_id - self.aws_credentials_identity_resolver = aws_credentials_identity_resolver - self.aws_secret_access_key = aws_secret_access_key - self.aws_session_token = aws_session_token - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="bedrock" - ) - self.endpoint_uri = endpoint_uri - self.http_request_config = http_request_config - self.interceptors = interceptors or [] - self.protocol = protocol or RestJsonClientProtocol( - _SCHEMA_AMAZON_BEDROCK_CONTROL_PLANE_SERVICE - ) - self.region = region - self.retry_strategy = retry_strategy - self.sdk_ua_app_id = sdk_ua_app_id - self.transport = transport or AIOHTTPClient() - self.user_agent_extra = user_agent_extra + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "aws_credentials_identity_resolver": FieldSpec(default=None), + "region": FieldSpec(default=None), + "aws_access_key_id": FieldSpec(default=None), + "aws_secret_access_key": FieldSpec(default=None), + "aws_session_token": FieldSpec(default=None), + "user_agent_extra": FieldSpec(default=None), + "sdk_ua_app_id": FieldSpec(default=None), + **AsyncAwsConfig._FIELDS, + "endpoint_uri": FieldSpec( + default=None, resolver=EndpointUriResolver("bedrock") + ), + "endpoint_resolver": FieldSpec( + default_factory=lambda: StandardRegionalEndpointsResolver( + endpoint_prefix="bedrock" + ) + ), + "protocol": FieldSpec( + default_factory=lambda: RestJsonClientProtocol( + _SCHEMA_AMAZON_BEDROCK_CONTROL_PLANE_SERVICE + ) + ), + "auth_schemes": FieldSpec( + default_factory=lambda: { + ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="bedrock") + } + ), + "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: """ - Sets the implementation of an auth scheme. - - Using this method ensures the correct key is used. + Set an auth scheme implementation using its scheme ID. :param scheme: + The auth scheme to add or replace. + """ + auth_schemes = dict(self.auth_schemes or {}) + auth_schemes[scheme.scheme_id] = scheme + self.auth_schemes = auth_schemes - Args: - scheme: - The auth scheme to add. + @classmethod + async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] + cls, + *, + profile: str | None = None, + fs: FileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[_AsyncBedrockConfigOverrides], + ) -> Self: + """ + Resolve config from environment, config files, defaults, and explicit + overrides. """ - self.auth_schemes[scheme.scheme_id] = scheme + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) -Plugin: TypeAlias = Callable[[Config], None] -"""A callable that allows customizing the config object on each request.""" +Plugin: TypeAlias = Callable[[AsyncBedrockConfig], None] +""" +A callable that customizes a client configuration. Service-level plugins +are applied once to the base configuration inherited by every operation. +Operation-level plugins apply only to a single operation invocation. +""" diff --git a/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/user_agent.py b/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/user_agent.py index fcd1ae4..bc33619 100644 --- a/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/user_agent.py +++ b/clients/aws-sdk-bedrock/src/aws_sdk_bedrock/user_agent.py @@ -3,10 +3,10 @@ from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor from . import __version__ -from .config import Config +from .config import AsyncBedrockConfig -def aws_user_agent_plugin(config: Config): +def aws_user_agent_plugin(config: AsyncBedrockConfig): config.interceptors.append( UserAgentInterceptor( ua_suffix=config.user_agent_extra, diff --git a/clients/aws-sdk-bedrock/tests/test_protocol.py b/clients/aws-sdk-bedrock/tests/test_restjson_protocol.py similarity index 100% rename from clients/aws-sdk-bedrock/tests/test_protocol.py rename to clients/aws-sdk-bedrock/tests/test_restjson_protocol.py diff --git a/clients/aws-sdk-connecthealth/.changes/0.10.0.json b/clients/aws-sdk-connecthealth/.changes/0.10.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/clients/aws-sdk-connecthealth/.changes/0.10.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-connecthealth/CHANGELOG.md b/clients/aws-sdk-connecthealth/CHANGELOG.md index 4fad15d..4b49cad 100644 --- a/clients/aws-sdk-connecthealth/CHANGELOG.md +++ b/clients/aws-sdk-connecthealth/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### Dependencies diff --git a/clients/aws-sdk-connecthealth/pyproject.toml b/clients/aws-sdk-connecthealth/pyproject.toml index 0f9d262..44def56 100644 --- a/clients/aws-sdk-connecthealth/pyproject.toml +++ b/clients/aws-sdk-connecthealth/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "aws_sdk_connecthealth" -version = "0.9.0" +version = "0.10.0" description = "aws_sdk_connecthealth client" readme = "README.md" requires-python = ">=3.12" @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ - "smithy_aws_core[eventstream, json]~=0.9.0", + "smithy_aws_core[eventstream, json]~=0.10.0", "smithy_core~=0.8.0", "smithy_http[awscrt]~=0.4.0" ] diff --git a/clients/aws-sdk-connecthealth/scripts/docs/generate_doc_stubs.py b/clients/aws-sdk-connecthealth/scripts/docs/generate_doc_stubs.py index b00ac66..56ab5a8 100644 --- a/clients/aws-sdk-connecthealth/scripts/docs/generate_doc_stubs.py +++ b/clients/aws-sdk-connecthealth/scripts/docs/generate_doc_stubs.py @@ -8,6 +8,7 @@ import argparse import logging +import re import sys from collections.abc import Sequence from dataclasses import dataclass @@ -115,19 +116,43 @@ class ClientInfo: class DocStubGenerator: """Generate markdown API Reference stubs for AWS SDK for Python clients.""" - def __init__(self, client_dir: Path, output_dir: Path) -> None: + def __init__(self, client_dir: Path, output_dir: Path, service_name: str | None = None) -> None: """ Initialize the documentation generator. Args: client_dir: Path to the client source directory output_dir: Path to the output directory for generated doc stubs + service_name: Display name for the service (e.g. the Smithy sdkId + "SNS"). When omitted, falls back to a title-cased derivation of + the package name, which does not preserve acronym casing. """ self.client_dir = client_dir self.output_dir = output_dir - # Extract service name from package name - # (e.g., "aws_sdk_bedrock_runtime" -> "Bedrock Runtime") - self.service_name = client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + # Use the explicit override, then the sdkId from the package, then + # fall back to a title-cased package name (does not keep acronym + # casing, so "sns" becomes "Sns"). + self.service_name = ( + service_name + or self._sdk_id_from_package(client_dir) + or client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + ) + + @staticmethod + def _sdk_id_from_package(client_dir: Path) -> str | None: + """ + Read the authoritative service name (Smithy sdkId) from the package. + + The generated ``_private/schemas.py`` carries the ``aws.api#service`` + trait's ``sdkId`` (e.g. "SNS"), the same field the sidebar navigation + uses, so it keeps acronym casing that the package name does not. + Returns None if the file or value is absent. + """ + schemas = client_dir / "_private" / "schemas.py" + if not schemas.is_file(): + return None + match = re.search(r'"sdkId":\s*"([^"]+)"', schemas.read_text()) + return match.group(1) if match else None def generate(self) -> bool: """ @@ -166,10 +191,13 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: if not client_class: raise ValueError(f"No class ending with 'Client' found in {package_name}.client") - config_class = config_module.members.get("Config") + config_class = self._find_class_with_suffix(config_module, "Config") + if not config_class: + raise ValueError(f"No class ending with 'Config' found in {package_name}.config") + plugin_alias = config_module.members.get("Plugin") - if not config_class or not plugin_alias: - raise ValueError(f"Missing Config or Plugin in {package_name}.config") + if not plugin_alias: + raise ValueError(f"Missing Plugin in {package_name}.config") config = TypeInfo(name=config_class.name, module_path=config_class.path) plugin = TypeInfo(name=plugin_alias.name, module_path=plugin_alias.path) @@ -194,8 +222,12 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: ) def _find_class_with_suffix(self, module: Module, suffix: str) -> Class | None: - """Find the class in the module with a matching suffix.""" + """Find the class defined in the module with a matching suffix.""" for cls in module.classes.values(): + # Skip imported classes so a same-package import (e.g. a *Config + # class re-exported from config.py) can't shadow the defined one. + if cls.is_imported: + continue if cls.name.endswith(suffix): return cls return None @@ -616,6 +648,12 @@ def main() -> int: required=True, help="Output directory for generated doc stubs", ) + parser.add_argument( + "-s", + "--service-name", + default=None, + help="Display name for the service (Smithy sdkId, e.g. 'SNS')", + ) args = parser.parse_args() client_dir = args.client_dir.resolve() @@ -626,7 +664,7 @@ def main() -> int: return 1 try: - generator = DocStubGenerator(client_dir, output_dir) + generator = DocStubGenerator(client_dir, output_dir, args.service_name) success = generator.generate() return 0 if success else 1 except Exception as e: diff --git a/clients/aws-sdk-connecthealth/src/aws_sdk_connecthealth/__init__.py b/clients/aws-sdk-connecthealth/src/aws_sdk_connecthealth/__init__.py index 7e20a8c..3c99375 100644 --- a/clients/aws-sdk-connecthealth/src/aws_sdk_connecthealth/__init__.py +++ b/clients/aws-sdk-connecthealth/src/aws_sdk_connecthealth/__init__.py @@ -1,3 +1,3 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -__version__: str = "0.9.0" +__version__: str = "0.10.0" diff --git a/clients/aws-sdk-connecthealth/src/aws_sdk_connecthealth/client.py b/clients/aws-sdk-connecthealth/src/aws_sdk_connecthealth/client.py index 8dfeb3b..7e971f2 100644 --- a/clients/aws-sdk-connecthealth/src/aws_sdk_connecthealth/client.py +++ b/clients/aws-sdk-connecthealth/src/aws_sdk_connecthealth/client.py @@ -1,5 +1,6 @@ # Code generated by smithy-python-codegen DO NOT EDIT. +import asyncio from copy import deepcopy import logging from typing import Any, TYPE_CHECKING @@ -13,7 +14,7 @@ from smithy_core.types import TypedProperties from smithy_http.plugins import user_agent_plugin -from .config import Config, Plugin +from .config import AsyncConnectHealthConfig, Plugin from .models import ( ACTIVATE_SUBSCRIPTION, ActivateSubscriptionInput, @@ -90,7 +91,9 @@ class AsyncConnectHealthClient: """ def __init__( - self, config: Config | None = None, plugins: list[Plugin] | None = None + self, + config: AsyncConnectHealthConfig | None = None, + plugins: list[Plugin] | None = None, ): """ Constructor for `AsyncConnectHealthClient`. @@ -100,19 +103,32 @@ def __init__( Optional configuration for the client. Here you can set things like the endpoint for HTTP services or auth credentials. plugins: - A list of callables that modify the configuration dynamically. These - can be used to set defaults, for example. + A list of callables applied once to the client's base configuration. + Their changes are inherited by every operation invocation. """ - self._config = config or Config() - - client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] - if plugins: - client_plugins.extend(plugins) - - for plugin in client_plugins: - plugin(self._config) - + self._config = config + self._plugins = plugins + self._derive_lock = asyncio.Lock() + self._setup_done = False self._retry_strategy_resolver = RetryStrategyResolver() + self._client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] + + async def _ensure_setup(self) -> None: + if not self._setup_done: + async with self._derive_lock: + if not self._setup_done: + if self._config is None: + config = await AsyncConnectHealthConfig.resolve() + else: + # Copy so plugins don't mutate the caller's config. + config = deepcopy(self._config) + for plugin in self._client_plugins: + plugin(config) + if self._plugins: + for plugin in self._plugins: + plugin(config) + self._config = config + self._setup_done = True async def activate_subscription( self, input: ActivateSubscriptionInput, plugins: list[Plugin] | None = None @@ -135,16 +151,31 @@ async def activate_subscription( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -182,16 +213,31 @@ async def create_domain( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -230,16 +276,31 @@ async def create_subscription( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -277,16 +338,31 @@ async def deactivate_subscription( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -324,16 +400,31 @@ async def delete_domain( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -371,16 +462,31 @@ async def get_domain( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -420,16 +526,31 @@ async def get_medical_scribe_listening_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -467,16 +588,31 @@ async def get_patient_insights_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -514,16 +650,31 @@ async def get_subscription( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -561,16 +712,31 @@ async def list_domains( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -608,16 +774,31 @@ async def list_subscriptions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -655,16 +836,31 @@ async def list_tags_for_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -709,16 +905,31 @@ async def start_medical_scribe_listening_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -761,16 +972,31 @@ async def start_patient_insights_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -808,16 +1034,31 @@ async def tag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -855,16 +1096,31 @@ async def untag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) diff --git a/clients/aws-sdk-connecthealth/src/aws_sdk_connecthealth/config.py b/clients/aws-sdk-connecthealth/src/aws_sdk_connecthealth/config.py index 84017b2..ed643bd 100644 --- a/clients/aws-sdk-connecthealth/src/aws_sdk_connecthealth/config.py +++ b/clients/aws-sdk-connecthealth/src/aws_sdk_connecthealth/config.py @@ -1,24 +1,24 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -from dataclasses import dataclass -from typing import Any, Callable, TypeAlias, Union +from dataclasses import dataclass, field +from typing import Any, Callable, ClassVar, Self, TypeAlias, Union, 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.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ClientProtocol, ClientTransport, EndpointResolver +from smithy_core.aio.interfaces import ClientProtocol, EndpointResolver from smithy_core.aio.interfaces.auth import AuthScheme from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy from smithy_core.interceptors import Interceptor -from smithy_core.interfaces import URI -from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.crt import AWSCRTHTTPClient -from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import CONNECT_HEALTH as _SCHEMA_CONNECT_HEALTH from .auth import HTTPAuthSchemeResolver @@ -88,139 +88,134 @@ ] -@dataclass(init=False) -class Config: - """Configuration for ConnectHealth.""" - - auth_scheme_resolver: HTTPAuthSchemeResolver - """ - An auth scheme resolver that determines the auth scheme for each - operation. - """ - - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] - """A map of auth scheme ids to auth schemes.""" - - aws_access_key_id: str | None - """The identifier for a secret access key.""" - - aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None - ) - """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" +class _AsyncConnectHealthConfigOverrides(AwsConfigOverrides, total=False): + endpoint_resolver: EndpointResolver | None + protocol: ClientProtocol[Any, Any] | None + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None - aws_secret_access_key: str | None - """A secret access key that can be used to sign requests.""" - aws_session_token: str | None - """An access key ID that identifies temporary security credentials.""" +@dataclass(kw_only=True, repr=False, init=False) +class AsyncConnectHealthConfig(AsyncAwsConfig): + """ConnectHealth configuration (async-resolved).""" - endpoint_resolver: EndpointResolver + endpoint_resolver: EndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - endpoint_uri: str | URI | None - """A static URI to route requests to.""" - - http_request_config: HTTPRequestConfiguration | None - """Configuration for individual HTTP requests.""" + protocol: ClientProtocol[Any, Any] | None = None + """The protocol to serialize and deserialize requests with.""" - interceptors: list[_ServiceInterceptor] + interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) """ The list of interceptors, which are hooks that are called during the execution of a request. """ - protocol: ClientProtocol[Any, Any] | None - """The protocol to serialize and deserialize requests with.""" + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + """A map of auth scheme ids to auth schemes.""" - region: str | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None = None """ - The AWS region to connect to. The configured region is used to determine - the service endpoint. + An auth scheme resolver that determines the auth scheme for each + operation. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + aws_credentials_identity_resolver: ( + IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + ) = None + """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" + + region: str | None = None """ - The retry strategy or options for configuring retry behavior. Can be - either a configured RetryStrategy or RetryStrategyOptions to create one. + The AWS region to connect to. The configured region is used to determine + the service endpoint. """ - sdk_ua_app_id: str | None + aws_access_key_id: str | None = None + """The identifier for a secret access key.""" + + aws_secret_access_key: str | None = None + """A secret access key that can be used to sign requests.""" + + aws_session_token: str | None = None + """The session token used with temporary AWS credentials.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + sdk_ua_app_id: str | None = None """ A unique and opaque application ID that is appended to the User-Agent header. """ - transport: ClientTransport[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 - streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. - """ - - user_agent_extra: str | None - """Additional suffix to be added to the User-Agent header.""" - - def __init__( - self, - *, - auth_scheme_resolver: HTTPAuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - aws_access_key_id: str | None = None, - aws_credentials_identity_resolver: IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties - ] - | None = None, - aws_secret_access_key: str | None = None, - aws_session_token: str | None = None, - endpoint_resolver: EndpointResolver | None = None, - endpoint_uri: str | URI | None = None, - http_request_config: HTTPRequestConfiguration | None = None, - interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] | None = None, - region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, - sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, - user_agent_extra: str | None = None, - ): - self.auth_scheme_resolver = auth_scheme_resolver or HTTPAuthSchemeResolver() - self.auth_schemes = auth_schemes or { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="health-agent") - } - self.aws_access_key_id = aws_access_key_id - self.aws_credentials_identity_resolver = aws_credentials_identity_resolver - self.aws_secret_access_key = aws_secret_access_key - self.aws_session_token = aws_session_token - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="health-agent" - ) - self.endpoint_uri = endpoint_uri - self.http_request_config = http_request_config - self.interceptors = interceptors or [] - self.protocol = protocol or RestJsonClientProtocol(_SCHEMA_CONNECT_HEALTH) - self.region = region - self.retry_strategy = retry_strategy - self.sdk_ua_app_id = sdk_ua_app_id - self.transport = transport or AWSCRTHTTPClient() - self.user_agent_extra = user_agent_extra + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "aws_credentials_identity_resolver": FieldSpec(default=None), + "region": FieldSpec(default=None), + "aws_access_key_id": FieldSpec(default=None), + "aws_secret_access_key": FieldSpec(default=None), + "aws_session_token": FieldSpec(default=None), + "user_agent_extra": FieldSpec(default=None), + "sdk_ua_app_id": FieldSpec(default=None), + **AsyncAwsConfig._FIELDS, + "endpoint_uri": FieldSpec( + default=None, resolver=EndpointUriResolver("connecthealth") + ), + "endpoint_resolver": FieldSpec( + default_factory=lambda: StandardRegionalEndpointsResolver( + endpoint_prefix="health-agent" + ) + ), + "protocol": FieldSpec( + default_factory=lambda: RestJsonClientProtocol(_SCHEMA_CONNECT_HEALTH) + ), + "auth_schemes": FieldSpec( + default_factory=lambda: { + ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="health-agent") + } + ), + "auth_scheme_resolver": FieldSpec(default_factory=HTTPAuthSchemeResolver), + "transport": FieldSpec(default_factory=lambda: AWSCRTHTTPClient()), + } def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None: """ - Sets the implementation of an auth scheme. - - Using this method ensures the correct key is used. + Set an auth scheme implementation using its scheme ID. :param scheme: + The auth scheme to add or replace. + """ + auth_schemes = dict(self.auth_schemes or {}) + auth_schemes[scheme.scheme_id] = scheme + self.auth_schemes = auth_schemes - Args: - scheme: - The auth scheme to add. + @classmethod + async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] + cls, + *, + profile: str | None = None, + fs: FileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[_AsyncConnectHealthConfigOverrides], + ) -> Self: + """ + Resolve config from environment, config files, defaults, and explicit + overrides. """ - self.auth_schemes[scheme.scheme_id] = scheme + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) -Plugin: TypeAlias = Callable[[Config], None] -"""A callable that allows customizing the config object on each request.""" +Plugin: TypeAlias = Callable[[AsyncConnectHealthConfig], None] +""" +A callable that customizes a client configuration. Service-level plugins +are applied once to the base configuration inherited by every operation. +Operation-level plugins apply only to a single operation invocation. +""" diff --git a/clients/aws-sdk-connecthealth/src/aws_sdk_connecthealth/user_agent.py b/clients/aws-sdk-connecthealth/src/aws_sdk_connecthealth/user_agent.py index 86da99f..288d597 100644 --- a/clients/aws-sdk-connecthealth/src/aws_sdk_connecthealth/user_agent.py +++ b/clients/aws-sdk-connecthealth/src/aws_sdk_connecthealth/user_agent.py @@ -3,10 +3,10 @@ from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor from . import __version__ -from .config import Config +from .config import AsyncConnectHealthConfig -def aws_user_agent_plugin(config: Config): +def aws_user_agent_plugin(config: AsyncConnectHealthConfig): config.interceptors.append( UserAgentInterceptor( ua_suffix=config.user_agent_extra, diff --git a/clients/aws-sdk-connecthealth/tests/test_protocol.py b/clients/aws-sdk-connecthealth/tests/test_restjson_protocol.py similarity index 100% rename from clients/aws-sdk-connecthealth/tests/test_protocol.py rename to clients/aws-sdk-connecthealth/tests/test_restjson_protocol.py diff --git a/clients/aws-sdk-guardduty/.changes/0.10.0.json b/clients/aws-sdk-guardduty/.changes/0.10.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/clients/aws-sdk-guardduty/.changes/0.10.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-guardduty/CHANGELOG.md b/clients/aws-sdk-guardduty/CHANGELOG.md index f38f61c..4e92bd0 100644 --- a/clients/aws-sdk-guardduty/CHANGELOG.md +++ b/clients/aws-sdk-guardduty/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### Dependencies diff --git a/clients/aws-sdk-guardduty/pyproject.toml b/clients/aws-sdk-guardduty/pyproject.toml index 6353ae4..b4e122f 100644 --- a/clients/aws-sdk-guardduty/pyproject.toml +++ b/clients/aws-sdk-guardduty/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "aws_sdk_guardduty" -version = "0.9.0" +version = "0.10.0" description = "aws_sdk_guardduty client" readme = "README.md" requires-python = ">=3.12" @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ - "smithy_aws_core[json]~=0.9.0", + "smithy_aws_core[json]~=0.10.0", "smithy_core~=0.8.0", "smithy_http[aiohttp]~=0.4.0" ] diff --git a/clients/aws-sdk-guardduty/scripts/docs/generate_doc_stubs.py b/clients/aws-sdk-guardduty/scripts/docs/generate_doc_stubs.py index b00ac66..56ab5a8 100644 --- a/clients/aws-sdk-guardduty/scripts/docs/generate_doc_stubs.py +++ b/clients/aws-sdk-guardduty/scripts/docs/generate_doc_stubs.py @@ -8,6 +8,7 @@ import argparse import logging +import re import sys from collections.abc import Sequence from dataclasses import dataclass @@ -115,19 +116,43 @@ class ClientInfo: class DocStubGenerator: """Generate markdown API Reference stubs for AWS SDK for Python clients.""" - def __init__(self, client_dir: Path, output_dir: Path) -> None: + def __init__(self, client_dir: Path, output_dir: Path, service_name: str | None = None) -> None: """ Initialize the documentation generator. Args: client_dir: Path to the client source directory output_dir: Path to the output directory for generated doc stubs + service_name: Display name for the service (e.g. the Smithy sdkId + "SNS"). When omitted, falls back to a title-cased derivation of + the package name, which does not preserve acronym casing. """ self.client_dir = client_dir self.output_dir = output_dir - # Extract service name from package name - # (e.g., "aws_sdk_bedrock_runtime" -> "Bedrock Runtime") - self.service_name = client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + # Use the explicit override, then the sdkId from the package, then + # fall back to a title-cased package name (does not keep acronym + # casing, so "sns" becomes "Sns"). + self.service_name = ( + service_name + or self._sdk_id_from_package(client_dir) + or client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + ) + + @staticmethod + def _sdk_id_from_package(client_dir: Path) -> str | None: + """ + Read the authoritative service name (Smithy sdkId) from the package. + + The generated ``_private/schemas.py`` carries the ``aws.api#service`` + trait's ``sdkId`` (e.g. "SNS"), the same field the sidebar navigation + uses, so it keeps acronym casing that the package name does not. + Returns None if the file or value is absent. + """ + schemas = client_dir / "_private" / "schemas.py" + if not schemas.is_file(): + return None + match = re.search(r'"sdkId":\s*"([^"]+)"', schemas.read_text()) + return match.group(1) if match else None def generate(self) -> bool: """ @@ -166,10 +191,13 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: if not client_class: raise ValueError(f"No class ending with 'Client' found in {package_name}.client") - config_class = config_module.members.get("Config") + config_class = self._find_class_with_suffix(config_module, "Config") + if not config_class: + raise ValueError(f"No class ending with 'Config' found in {package_name}.config") + plugin_alias = config_module.members.get("Plugin") - if not config_class or not plugin_alias: - raise ValueError(f"Missing Config or Plugin in {package_name}.config") + if not plugin_alias: + raise ValueError(f"Missing Plugin in {package_name}.config") config = TypeInfo(name=config_class.name, module_path=config_class.path) plugin = TypeInfo(name=plugin_alias.name, module_path=plugin_alias.path) @@ -194,8 +222,12 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: ) def _find_class_with_suffix(self, module: Module, suffix: str) -> Class | None: - """Find the class in the module with a matching suffix.""" + """Find the class defined in the module with a matching suffix.""" for cls in module.classes.values(): + # Skip imported classes so a same-package import (e.g. a *Config + # class re-exported from config.py) can't shadow the defined one. + if cls.is_imported: + continue if cls.name.endswith(suffix): return cls return None @@ -616,6 +648,12 @@ def main() -> int: required=True, help="Output directory for generated doc stubs", ) + parser.add_argument( + "-s", + "--service-name", + default=None, + help="Display name for the service (Smithy sdkId, e.g. 'SNS')", + ) args = parser.parse_args() client_dir = args.client_dir.resolve() @@ -626,7 +664,7 @@ def main() -> int: return 1 try: - generator = DocStubGenerator(client_dir, output_dir) + generator = DocStubGenerator(client_dir, output_dir, args.service_name) success = generator.generate() return 0 if success else 1 except Exception as e: diff --git a/clients/aws-sdk-guardduty/src/aws_sdk_guardduty/__init__.py b/clients/aws-sdk-guardduty/src/aws_sdk_guardduty/__init__.py index 7e20a8c..3c99375 100644 --- a/clients/aws-sdk-guardduty/src/aws_sdk_guardduty/__init__.py +++ b/clients/aws-sdk-guardduty/src/aws_sdk_guardduty/__init__.py @@ -1,3 +1,3 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -__version__: str = "0.9.0" +__version__: str = "0.10.0" diff --git a/clients/aws-sdk-guardduty/src/aws_sdk_guardduty/client.py b/clients/aws-sdk-guardduty/src/aws_sdk_guardduty/client.py index 5d46ed6..dc551a1 100644 --- a/clients/aws-sdk-guardduty/src/aws_sdk_guardduty/client.py +++ b/clients/aws-sdk-guardduty/src/aws_sdk_guardduty/client.py @@ -1,5 +1,6 @@ # Code generated by smithy-python-codegen DO NOT EDIT. +import asyncio from copy import deepcopy import logging @@ -10,7 +11,7 @@ from smithy_core.types import TypedProperties from smithy_http.plugins import user_agent_plugin -from .config import Config, Plugin +from .config import AsyncGuardDutyConfig, Plugin from .models import ( ACCEPT_ADMINISTRATOR_INVITATION, ACCEPT_INVITATION, @@ -322,7 +323,9 @@ class AsyncGuardDutyClient: """ def __init__( - self, config: Config | None = None, plugins: list[Plugin] | None = None + self, + config: AsyncGuardDutyConfig | None = None, + plugins: list[Plugin] | None = None, ): """ Constructor for `AsyncGuardDutyClient`. @@ -332,19 +335,32 @@ def __init__( Optional configuration for the client. Here you can set things like the endpoint for HTTP services or auth credentials. plugins: - A list of callables that modify the configuration dynamically. These - can be used to set defaults, for example. + A list of callables applied once to the client's base configuration. + Their changes are inherited by every operation invocation. """ - self._config = config or Config() - - client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] - if plugins: - client_plugins.extend(plugins) - - for plugin in client_plugins: - plugin(self._config) - + self._config = config + self._plugins = plugins + self._derive_lock = asyncio.Lock() + self._setup_done = False self._retry_strategy_resolver = RetryStrategyResolver() + self._client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] + + async def _ensure_setup(self) -> None: + if not self._setup_done: + async with self._derive_lock: + if not self._setup_done: + if self._config is None: + config = await AsyncGuardDutyConfig.resolve() + else: + # Copy so plugins don't mutate the caller's config. + config = deepcopy(self._config) + for plugin in self._client_plugins: + plugin(config) + if self._plugins: + for plugin in self._plugins: + plugin(config) + self._config = config + self._setup_done = True async def accept_administrator_invitation( self, @@ -370,16 +386,31 @@ async def accept_administrator_invitation( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -418,16 +449,31 @@ async def accept_invitation( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -470,16 +516,31 @@ async def archive_findings( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -541,16 +602,31 @@ async def create_detector( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -591,16 +667,31 @@ async def create_filter( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -668,16 +759,31 @@ async def create_investigation( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -720,16 +826,31 @@ async def create_ip_set( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -775,16 +896,31 @@ async def create_malware_protection_plan( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -853,16 +989,31 @@ async def create_members( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -904,16 +1055,31 @@ async def create_publishing_destination( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -953,16 +1119,31 @@ async def create_sample_findings( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1004,16 +1185,31 @@ async def create_threat_entity_set( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1053,16 +1249,31 @@ async def create_threat_intel_set( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1107,16 +1318,31 @@ async def create_trusted_entity_set( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1155,16 +1381,31 @@ async def decline_invitations( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1203,16 +1444,31 @@ async def delete_detector( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1250,16 +1506,31 @@ async def delete_filter( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1298,16 +1569,31 @@ async def delete_invitations( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1346,16 +1632,31 @@ async def delete_ip_set( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1397,16 +1698,31 @@ async def delete_malware_protection_plan( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1449,16 +1765,31 @@ async def delete_members( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1498,16 +1829,31 @@ async def delete_publishing_destination( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1546,16 +1892,31 @@ async def delete_threat_entity_set( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1593,16 +1954,31 @@ async def delete_threat_intel_set( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1641,16 +2017,31 @@ async def delete_trusted_entity_set( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1695,16 +2086,31 @@ async def describe_malware_scans( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1750,16 +2156,31 @@ async def describe_organization_configuration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1800,16 +2221,31 @@ async def describe_publishing_destination( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1851,16 +2287,31 @@ async def disable_organization_admin_account( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1917,16 +2368,31 @@ async def disassociate_from_administrator_account( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1979,16 +2445,31 @@ async def disassociate_from_master_account( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2059,16 +2540,31 @@ async def disassociate_members( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2110,16 +2606,31 @@ async def enable_organization_admin_account( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2171,16 +2682,31 @@ async def get_administrator_account( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2222,16 +2748,31 @@ async def get_coverage_statistics( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2274,16 +2815,31 @@ async def get_detector( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2321,16 +2877,31 @@ async def get_filter( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2368,16 +2939,31 @@ async def get_findings( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2424,16 +3010,31 @@ async def get_findings_statistics( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2481,16 +3082,31 @@ async def get_investigation( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2529,16 +3145,31 @@ async def get_invitations_count( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2576,16 +3207,31 @@ async def get_ip_set( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2624,16 +3270,31 @@ async def get_malware_protection_plan( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2679,16 +3340,31 @@ async def get_malware_scan( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2731,16 +3407,31 @@ async def get_malware_scan_settings( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2779,16 +3470,31 @@ async def get_master_account( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2832,16 +3538,31 @@ async def get_member_detectors( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2880,16 +3601,31 @@ async def get_members( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2932,16 +3668,31 @@ async def get_organization_statistics( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2980,16 +3731,31 @@ async def get_remaining_free_trial_days( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3028,16 +3794,31 @@ async def get_threat_entity_set( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3075,16 +3856,31 @@ async def get_threat_intel_set( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3123,16 +3919,31 @@ async def get_trusted_entity_set( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3176,16 +3987,31 @@ async def get_usage_statistics( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3266,16 +4092,31 @@ async def invite_members( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3318,16 +4159,31 @@ async def list_coverage( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3366,16 +4222,31 @@ async def list_detectors( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3413,16 +4284,31 @@ async def list_filters( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3465,16 +4351,31 @@ async def list_findings( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3523,16 +4424,31 @@ async def list_investigations( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3571,16 +4487,31 @@ async def list_invitations( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3620,16 +4551,31 @@ async def list_ip_sets( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3670,16 +4616,31 @@ async def list_malware_protection_plans( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3719,16 +4680,31 @@ async def list_malware_scans( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3767,16 +4743,31 @@ async def list_members( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3817,16 +4808,31 @@ async def list_organization_admin_accounts( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3867,16 +4873,31 @@ async def list_publishing_destinations( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3917,16 +4938,31 @@ async def list_tags_for_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3967,16 +5003,31 @@ async def list_threat_entity_sets( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4016,16 +5067,31 @@ async def list_threat_intel_sets( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4066,16 +5132,31 @@ async def list_trusted_entity_sets( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4120,16 +5201,31 @@ async def send_object_malware_scan( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4182,16 +5278,31 @@ async def start_malware_scan( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4233,16 +5344,31 @@ async def start_monitoring_members( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4286,16 +5412,31 @@ async def stop_monitoring_members( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4333,16 +5474,31 @@ async def tag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4380,16 +5536,31 @@ async def unarchive_findings( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4427,16 +5598,31 @@ async def untag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4486,16 +5672,31 @@ async def update_detector( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4533,16 +5734,31 @@ async def update_filter( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4580,16 +5796,31 @@ async def update_findings_feedback( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4627,16 +5858,31 @@ async def update_ip_set( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4676,16 +5922,31 @@ async def update_malware_protection_plan( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4728,16 +5989,31 @@ async def update_malware_scan_settings( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4787,16 +6063,31 @@ async def update_member_detectors( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4850,16 +6141,31 @@ async def update_organization_configuration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4900,16 +6206,31 @@ async def update_publishing_destination( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4948,16 +6269,31 @@ async def update_threat_entity_set( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4995,16 +6331,31 @@ async def update_threat_intel_set( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5043,16 +6394,31 @@ async def update_trusted_entity_set( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) diff --git a/clients/aws-sdk-guardduty/src/aws_sdk_guardduty/config.py b/clients/aws-sdk-guardduty/src/aws_sdk_guardduty/config.py index 41f84ad..36e50d3 100644 --- a/clients/aws-sdk-guardduty/src/aws_sdk_guardduty/config.py +++ b/clients/aws-sdk-guardduty/src/aws_sdk_guardduty/config.py @@ -1,24 +1,24 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -from dataclasses import dataclass -from typing import Any, Callable, TypeAlias, Union +from dataclasses import dataclass, field +from typing import Any, Callable, ClassVar, Self, TypeAlias, Union, 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.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ClientProtocol, ClientTransport, EndpointResolver +from smithy_core.aio.interfaces import ClientProtocol, EndpointResolver from smithy_core.aio.interfaces.auth import AuthScheme from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy from smithy_core.interceptors import Interceptor -from smithy_core.interfaces import URI -from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.aiohttp import AIOHTTPClient -from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import GUARD_DUTY_API_SERVICE as _SCHEMA_GUARD_DUTY_API_SERVICE from .auth import HTTPAuthSchemeResolver @@ -369,141 +369,136 @@ ] -@dataclass(init=False) -class Config: - """Configuration for GuardDuty.""" - - auth_scheme_resolver: HTTPAuthSchemeResolver - """ - An auth scheme resolver that determines the auth scheme for each - operation. - """ - - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] - """A map of auth scheme ids to auth schemes.""" - - aws_access_key_id: str | None - """The identifier for a secret access key.""" - - aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None - ) - """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" +class _AsyncGuardDutyConfigOverrides(AwsConfigOverrides, total=False): + endpoint_resolver: EndpointResolver | None + protocol: ClientProtocol[Any, Any] | None + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None - aws_secret_access_key: str | None - """A secret access key that can be used to sign requests.""" - aws_session_token: str | None - """An access key ID that identifies temporary security credentials.""" +@dataclass(kw_only=True, repr=False, init=False) +class AsyncGuardDutyConfig(AsyncAwsConfig): + """GuardDuty configuration (async-resolved).""" - endpoint_resolver: EndpointResolver + endpoint_resolver: EndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - endpoint_uri: str | URI | None - """A static URI to route requests to.""" - - http_request_config: HTTPRequestConfiguration | None - """Configuration for individual HTTP requests.""" + protocol: ClientProtocol[Any, Any] | None = None + """The protocol to serialize and deserialize requests with.""" - interceptors: list[_ServiceInterceptor] + interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) """ The list of interceptors, which are hooks that are called during the execution of a request. """ - protocol: ClientProtocol[Any, Any] | None - """The protocol to serialize and deserialize requests with.""" + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + """A map of auth scheme ids to auth schemes.""" - region: str | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None = None """ - The AWS region to connect to. The configured region is used to determine - the service endpoint. + An auth scheme resolver that determines the auth scheme for each + operation. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + aws_credentials_identity_resolver: ( + IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + ) = None + """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" + + region: str | None = None """ - The retry strategy or options for configuring retry behavior. Can be - either a configured RetryStrategy or RetryStrategyOptions to create one. + The AWS region to connect to. The configured region is used to determine + the service endpoint. """ - sdk_ua_app_id: str | None + aws_access_key_id: str | None = None + """The identifier for a secret access key.""" + + aws_secret_access_key: str | None = None + """A secret access key that can be used to sign requests.""" + + aws_session_token: str | None = None + """The session token used with temporary AWS credentials.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + sdk_ua_app_id: str | None = None """ A unique and opaque application ID that is appended to the User-Agent header. """ - transport: ClientTransport[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 - streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. - """ - - user_agent_extra: str | None - """Additional suffix to be added to the User-Agent header.""" - - def __init__( - self, - *, - auth_scheme_resolver: HTTPAuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - aws_access_key_id: str | None = None, - aws_credentials_identity_resolver: IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties - ] - | None = None, - aws_secret_access_key: str | None = None, - aws_session_token: str | None = None, - endpoint_resolver: EndpointResolver | None = None, - endpoint_uri: str | URI | None = None, - http_request_config: HTTPRequestConfiguration | None = None, - interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] | None = None, - region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, - sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, - user_agent_extra: str | None = None, - ): - self.auth_scheme_resolver = auth_scheme_resolver or HTTPAuthSchemeResolver() - self.auth_schemes = auth_schemes or { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="guardduty") - } - self.aws_access_key_id = aws_access_key_id - self.aws_credentials_identity_resolver = aws_credentials_identity_resolver - self.aws_secret_access_key = aws_secret_access_key - self.aws_session_token = aws_session_token - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="guardduty" - ) - self.endpoint_uri = endpoint_uri - self.http_request_config = http_request_config - self.interceptors = interceptors or [] - self.protocol = protocol or RestJsonClientProtocol( - _SCHEMA_GUARD_DUTY_API_SERVICE - ) - self.region = region - self.retry_strategy = retry_strategy - self.sdk_ua_app_id = sdk_ua_app_id - self.transport = transport or AIOHTTPClient() - self.user_agent_extra = user_agent_extra + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "aws_credentials_identity_resolver": FieldSpec(default=None), + "region": FieldSpec(default=None), + "aws_access_key_id": FieldSpec(default=None), + "aws_secret_access_key": FieldSpec(default=None), + "aws_session_token": FieldSpec(default=None), + "user_agent_extra": FieldSpec(default=None), + "sdk_ua_app_id": FieldSpec(default=None), + **AsyncAwsConfig._FIELDS, + "endpoint_uri": FieldSpec( + default=None, resolver=EndpointUriResolver("guardduty") + ), + "endpoint_resolver": FieldSpec( + default_factory=lambda: StandardRegionalEndpointsResolver( + endpoint_prefix="guardduty" + ) + ), + "protocol": FieldSpec( + default_factory=lambda: RestJsonClientProtocol( + _SCHEMA_GUARD_DUTY_API_SERVICE + ) + ), + "auth_schemes": FieldSpec( + default_factory=lambda: { + ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="guardduty") + } + ), + "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: """ - Sets the implementation of an auth scheme. - - Using this method ensures the correct key is used. + Set an auth scheme implementation using its scheme ID. :param scheme: + The auth scheme to add or replace. + """ + auth_schemes = dict(self.auth_schemes or {}) + auth_schemes[scheme.scheme_id] = scheme + self.auth_schemes = auth_schemes - Args: - scheme: - The auth scheme to add. + @classmethod + async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] + cls, + *, + profile: str | None = None, + fs: FileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[_AsyncGuardDutyConfigOverrides], + ) -> Self: + """ + Resolve config from environment, config files, defaults, and explicit + overrides. """ - self.auth_schemes[scheme.scheme_id] = scheme + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) -Plugin: TypeAlias = Callable[[Config], None] -"""A callable that allows customizing the config object on each request.""" +Plugin: TypeAlias = Callable[[AsyncGuardDutyConfig], None] +""" +A callable that customizes a client configuration. Service-level plugins +are applied once to the base configuration inherited by every operation. +Operation-level plugins apply only to a single operation invocation. +""" diff --git a/clients/aws-sdk-guardduty/src/aws_sdk_guardduty/user_agent.py b/clients/aws-sdk-guardduty/src/aws_sdk_guardduty/user_agent.py index cfe2fcc..dbc526b 100644 --- a/clients/aws-sdk-guardduty/src/aws_sdk_guardduty/user_agent.py +++ b/clients/aws-sdk-guardduty/src/aws_sdk_guardduty/user_agent.py @@ -3,10 +3,10 @@ from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor from . import __version__ -from .config import Config +from .config import AsyncGuardDutyConfig -def aws_user_agent_plugin(config: Config): +def aws_user_agent_plugin(config: AsyncGuardDutyConfig): config.interceptors.append( UserAgentInterceptor( ua_suffix=config.user_agent_extra, diff --git a/clients/aws-sdk-guardduty/tests/test_protocol.py b/clients/aws-sdk-guardduty/tests/test_restjson_protocol.py similarity index 100% rename from clients/aws-sdk-guardduty/tests/test_protocol.py rename to clients/aws-sdk-guardduty/tests/test_restjson_protocol.py diff --git a/clients/aws-sdk-lambda/.changes/0.10.0.json b/clients/aws-sdk-lambda/.changes/0.10.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/clients/aws-sdk-lambda/.changes/0.10.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-lambda/CHANGELOG.md b/clients/aws-sdk-lambda/CHANGELOG.md index fe29f93..54a6882 100644 --- a/clients/aws-sdk-lambda/CHANGELOG.md +++ b/clients/aws-sdk-lambda/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### Dependencies diff --git a/clients/aws-sdk-lambda/pyproject.toml b/clients/aws-sdk-lambda/pyproject.toml index 6e904ff..20ee291 100644 --- a/clients/aws-sdk-lambda/pyproject.toml +++ b/clients/aws-sdk-lambda/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "aws_sdk_lambda" -version = "0.9.0" +version = "0.10.0" description = "aws_sdk_lambda client" readme = "README.md" requires-python = ">=3.12" @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ - "smithy_aws_core[eventstream, json]~=0.9.0", + "smithy_aws_core[eventstream, json]~=0.10.0", "smithy_core~=0.8.0", "smithy_http[awscrt]~=0.4.0" ] diff --git a/clients/aws-sdk-lambda/scripts/docs/generate_doc_stubs.py b/clients/aws-sdk-lambda/scripts/docs/generate_doc_stubs.py index b00ac66..56ab5a8 100644 --- a/clients/aws-sdk-lambda/scripts/docs/generate_doc_stubs.py +++ b/clients/aws-sdk-lambda/scripts/docs/generate_doc_stubs.py @@ -8,6 +8,7 @@ import argparse import logging +import re import sys from collections.abc import Sequence from dataclasses import dataclass @@ -115,19 +116,43 @@ class ClientInfo: class DocStubGenerator: """Generate markdown API Reference stubs for AWS SDK for Python clients.""" - def __init__(self, client_dir: Path, output_dir: Path) -> None: + def __init__(self, client_dir: Path, output_dir: Path, service_name: str | None = None) -> None: """ Initialize the documentation generator. Args: client_dir: Path to the client source directory output_dir: Path to the output directory for generated doc stubs + service_name: Display name for the service (e.g. the Smithy sdkId + "SNS"). When omitted, falls back to a title-cased derivation of + the package name, which does not preserve acronym casing. """ self.client_dir = client_dir self.output_dir = output_dir - # Extract service name from package name - # (e.g., "aws_sdk_bedrock_runtime" -> "Bedrock Runtime") - self.service_name = client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + # Use the explicit override, then the sdkId from the package, then + # fall back to a title-cased package name (does not keep acronym + # casing, so "sns" becomes "Sns"). + self.service_name = ( + service_name + or self._sdk_id_from_package(client_dir) + or client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + ) + + @staticmethod + def _sdk_id_from_package(client_dir: Path) -> str | None: + """ + Read the authoritative service name (Smithy sdkId) from the package. + + The generated ``_private/schemas.py`` carries the ``aws.api#service`` + trait's ``sdkId`` (e.g. "SNS"), the same field the sidebar navigation + uses, so it keeps acronym casing that the package name does not. + Returns None if the file or value is absent. + """ + schemas = client_dir / "_private" / "schemas.py" + if not schemas.is_file(): + return None + match = re.search(r'"sdkId":\s*"([^"]+)"', schemas.read_text()) + return match.group(1) if match else None def generate(self) -> bool: """ @@ -166,10 +191,13 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: if not client_class: raise ValueError(f"No class ending with 'Client' found in {package_name}.client") - config_class = config_module.members.get("Config") + config_class = self._find_class_with_suffix(config_module, "Config") + if not config_class: + raise ValueError(f"No class ending with 'Config' found in {package_name}.config") + plugin_alias = config_module.members.get("Plugin") - if not config_class or not plugin_alias: - raise ValueError(f"Missing Config or Plugin in {package_name}.config") + if not plugin_alias: + raise ValueError(f"Missing Plugin in {package_name}.config") config = TypeInfo(name=config_class.name, module_path=config_class.path) plugin = TypeInfo(name=plugin_alias.name, module_path=plugin_alias.path) @@ -194,8 +222,12 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: ) def _find_class_with_suffix(self, module: Module, suffix: str) -> Class | None: - """Find the class in the module with a matching suffix.""" + """Find the class defined in the module with a matching suffix.""" for cls in module.classes.values(): + # Skip imported classes so a same-package import (e.g. a *Config + # class re-exported from config.py) can't shadow the defined one. + if cls.is_imported: + continue if cls.name.endswith(suffix): return cls return None @@ -616,6 +648,12 @@ def main() -> int: required=True, help="Output directory for generated doc stubs", ) + parser.add_argument( + "-s", + "--service-name", + default=None, + help="Display name for the service (Smithy sdkId, e.g. 'SNS')", + ) args = parser.parse_args() client_dir = args.client_dir.resolve() @@ -626,7 +664,7 @@ def main() -> int: return 1 try: - generator = DocStubGenerator(client_dir, output_dir) + generator = DocStubGenerator(client_dir, output_dir, args.service_name) success = generator.generate() return 0 if success else 1 except Exception as e: diff --git a/clients/aws-sdk-lambda/src/aws_sdk_lambda/__init__.py b/clients/aws-sdk-lambda/src/aws_sdk_lambda/__init__.py index 7e20a8c..3c99375 100644 --- a/clients/aws-sdk-lambda/src/aws_sdk_lambda/__init__.py +++ b/clients/aws-sdk-lambda/src/aws_sdk_lambda/__init__.py @@ -1,3 +1,3 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -__version__: str = "0.9.0" +__version__: str = "0.10.0" diff --git a/clients/aws-sdk-lambda/src/aws_sdk_lambda/client.py b/clients/aws-sdk-lambda/src/aws_sdk_lambda/client.py index 3cf08f8..2338c00 100644 --- a/clients/aws-sdk-lambda/src/aws_sdk_lambda/client.py +++ b/clients/aws-sdk-lambda/src/aws_sdk_lambda/client.py @@ -1,5 +1,6 @@ # Code generated by smithy-python-codegen DO NOT EDIT. +import asyncio from copy import deepcopy import logging @@ -11,7 +12,7 @@ from smithy_core.types import TypedProperties from smithy_http.plugins import user_agent_plugin -from .config import Config, Plugin +from .config import AsyncLambdaConfig, Plugin from .models import ( ADD_LAYER_VERSION_PERMISSION, ADD_PERMISSION, @@ -358,7 +359,9 @@ class AsyncLambdaClient: """ def __init__( - self, config: Config | None = None, plugins: list[Plugin] | None = None + self, + config: AsyncLambdaConfig | None = None, + plugins: list[Plugin] | None = None, ): """ Constructor for `AsyncLambdaClient`. @@ -368,19 +371,32 @@ def __init__( Optional configuration for the client. Here you can set things like the endpoint for HTTP services or auth credentials. plugins: - A list of callables that modify the configuration dynamically. These - can be used to set defaults, for example. + A list of callables applied once to the client's base configuration. + Their changes are inherited by every operation invocation. """ - self._config = config or Config() - - client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] - if plugins: - client_plugins.extend(plugins) - - for plugin in client_plugins: - plugin(self._config) - + self._config = config + self._plugins = plugins + self._derive_lock = asyncio.Lock() + self._setup_done = False self._retry_strategy_resolver = RetryStrategyResolver() + self._client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] + + async def _ensure_setup(self) -> None: + if not self._setup_done: + async with self._derive_lock: + if not self._setup_done: + if self._config is None: + config = await AsyncLambdaConfig.resolve() + else: + # Copy so plugins don't mutate the caller's config. + config = deepcopy(self._config) + for plugin in self._client_plugins: + plugin(config) + if self._plugins: + for plugin in self._plugins: + plugin(config) + self._config = config + self._setup_done = True async def add_layer_version_permission( self, input: AddLayerVersionPermissionInput, plugins: list[Plugin] | None = None @@ -410,16 +426,31 @@ async def add_layer_version_permission( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -479,16 +510,31 @@ async def add_permission( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -538,16 +584,31 @@ async def checkpoint_durable_execution( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -592,16 +653,31 @@ async def create_alias( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -640,16 +716,31 @@ async def create_capacity_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -691,16 +782,31 @@ async def create_code_signing_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -812,16 +918,31 @@ async def create_event_source_mapping( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -925,16 +1046,31 @@ async def create_function( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -974,16 +1110,31 @@ async def create_function_url_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1022,16 +1173,31 @@ async def delete_alias( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1070,16 +1236,31 @@ async def delete_capacity_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1118,16 +1299,31 @@ async def delete_code_signing_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1171,16 +1367,31 @@ async def delete_event_source_mapping( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1230,16 +1441,31 @@ async def delete_function( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1279,16 +1505,31 @@ async def delete_function_code_signing_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1326,16 +1567,31 @@ async def delete_function_concurrency( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1379,16 +1635,31 @@ async def delete_function_event_invoke_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1428,16 +1699,31 @@ async def delete_function_url_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1479,16 +1765,31 @@ async def delete_layer_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1528,16 +1829,31 @@ async def delete_provisioned_concurrency_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1577,16 +1893,31 @@ async def get_account_settings( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1625,16 +1956,31 @@ async def get_alias( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1673,16 +2019,31 @@ async def get_capacity_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1720,16 +2081,31 @@ async def get_code_signing_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1771,16 +2147,31 @@ async def get_durable_execution( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1829,16 +2220,31 @@ async def get_durable_execution_history( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1885,16 +2291,31 @@ async def get_durable_execution_state( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1933,16 +2354,31 @@ async def get_event_source_mapping( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1983,16 +2419,31 @@ async def get_function( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2032,16 +2483,31 @@ async def get_function_code_signing_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2081,16 +2547,31 @@ async def get_function_concurrency( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2133,16 +2614,31 @@ async def get_function_configuration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2186,16 +2682,31 @@ async def get_function_event_invoke_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2237,16 +2748,31 @@ async def get_function_recursion_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2285,16 +2811,31 @@ async def get_function_scaling_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2332,16 +2873,31 @@ async def get_function_url_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2381,16 +2937,31 @@ async def get_layer_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2430,16 +3001,31 @@ async def get_layer_version_by_arn( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2479,16 +3065,31 @@ async def get_layer_version_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2528,16 +3129,31 @@ async def get_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2578,16 +3194,31 @@ async def get_provisioned_concurrency_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2633,16 +3264,31 @@ async def get_runtime_management_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2734,16 +3380,31 @@ async def invoke( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2792,16 +3453,31 @@ async def invoke_async( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2850,16 +3526,31 @@ async def invoke_with_response_stream( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2903,16 +3594,31 @@ async def list_aliases( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2950,16 +3656,31 @@ async def list_capacity_providers( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3000,16 +3721,31 @@ async def list_code_signing_configs( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3053,16 +3789,31 @@ async def list_durable_executions_by_function( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3101,16 +3852,31 @@ async def list_event_source_mappings( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3154,16 +3920,31 @@ async def list_function_event_invoke_configs( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3212,16 +3993,31 @@ async def list_functions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3263,16 +4059,31 @@ async def list_functions_by_code_signing_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3310,16 +4121,31 @@ async def list_function_url_configs( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3360,16 +4186,31 @@ async def list_function_versions_by_capacity_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3415,16 +4256,31 @@ async def list_layers( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3468,16 +4324,31 @@ async def list_layer_versions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3518,16 +4389,31 @@ async def list_provisioned_concurrency_configs( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3568,16 +4454,31 @@ async def list_tags( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3618,16 +4519,31 @@ async def list_versions_by_function( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3671,16 +4587,31 @@ async def publish_layer_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3730,16 +4661,31 @@ async def publish_version( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3781,16 +4727,31 @@ async def put_function_code_signing_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3842,16 +4803,31 @@ async def put_function_concurrency( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3916,16 +4892,31 @@ async def put_function_event_invoke_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3979,16 +4970,31 @@ async def put_function_recursion_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4029,16 +5035,31 @@ async def put_function_scaling_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4079,16 +5100,31 @@ async def put_provisioned_concurrency_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4130,16 +5166,31 @@ async def put_runtime_management_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4182,16 +5233,31 @@ async def remove_layer_version_permission( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4231,16 +5297,31 @@ async def remove_permission( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4282,16 +5363,31 @@ async def send_durable_execution_callback_failure( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4333,16 +5429,31 @@ async def send_durable_execution_callback_heartbeat( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4384,16 +5495,31 @@ async def send_durable_execution_callback_success( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4434,16 +5560,31 @@ async def stop_durable_execution( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4482,16 +5623,31 @@ async def tag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4531,16 +5687,31 @@ async def untag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4579,16 +5750,31 @@ async def update_alias( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4626,16 +5812,31 @@ async def update_capacity_provider( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4675,16 +5876,31 @@ async def update_code_signing_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4796,16 +6012,31 @@ async def update_event_source_mapping( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4868,16 +6099,31 @@ async def update_function_code( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4935,16 +6181,31 @@ async def update_function_configuration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4988,16 +6249,31 @@ async def update_function_event_invoke_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -5035,16 +6311,31 @@ async def update_function_url_config( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) diff --git a/clients/aws-sdk-lambda/src/aws_sdk_lambda/config.py b/clients/aws-sdk-lambda/src/aws_sdk_lambda/config.py index bb98097..987439b 100644 --- a/clients/aws-sdk-lambda/src/aws_sdk_lambda/config.py +++ b/clients/aws-sdk-lambda/src/aws_sdk_lambda/config.py @@ -1,24 +1,24 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -from dataclasses import dataclass -from typing import Any, Callable, TypeAlias, Union +from dataclasses import dataclass, field +from typing import Any, Callable, ClassVar, Self, TypeAlias, Union, 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.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ClientProtocol, ClientTransport, EndpointResolver +from smithy_core.aio.interfaces import ClientProtocol, EndpointResolver from smithy_core.aio.interfaces.auth import AuthScheme from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy from smithy_core.interceptors import Interceptor -from smithy_core.interfaces import URI -from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.crt import AWSCRTHTTPClient -from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import AWS_GIR_API_SERVICE as _SCHEMA_AWS_GIR_API_SERVICE from .auth import HTTPAuthSchemeResolver @@ -399,139 +399,132 @@ ] -@dataclass(init=False) -class Config: - """Configuration for Lambda.""" - - auth_scheme_resolver: HTTPAuthSchemeResolver - """ - An auth scheme resolver that determines the auth scheme for each - operation. - """ - - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] - """A map of auth scheme ids to auth schemes.""" - - aws_access_key_id: str | None - """The identifier for a secret access key.""" - - aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None - ) - """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" +class _AsyncLambdaConfigOverrides(AwsConfigOverrides, total=False): + endpoint_resolver: EndpointResolver | None + protocol: ClientProtocol[Any, Any] | None + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None - aws_secret_access_key: str | None - """A secret access key that can be used to sign requests.""" - aws_session_token: str | None - """An access key ID that identifies temporary security credentials.""" +@dataclass(kw_only=True, repr=False, init=False) +class AsyncLambdaConfig(AsyncAwsConfig): + """Lambda configuration (async-resolved).""" - endpoint_resolver: EndpointResolver + endpoint_resolver: EndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - endpoint_uri: str | URI | None - """A static URI to route requests to.""" - - http_request_config: HTTPRequestConfiguration | None - """Configuration for individual HTTP requests.""" + protocol: ClientProtocol[Any, Any] | None = None + """The protocol to serialize and deserialize requests with.""" - interceptors: list[_ServiceInterceptor] + interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) """ The list of interceptors, which are hooks that are called during the execution of a request. """ - protocol: ClientProtocol[Any, Any] | None - """The protocol to serialize and deserialize requests with.""" + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + """A map of auth scheme ids to auth schemes.""" - region: str | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None = None """ - The AWS region to connect to. The configured region is used to determine - the service endpoint. + An auth scheme resolver that determines the auth scheme for each + operation. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + aws_credentials_identity_resolver: ( + IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + ) = None + """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" + + region: str | None = None """ - The retry strategy or options for configuring retry behavior. Can be - either a configured RetryStrategy or RetryStrategyOptions to create one. + The AWS region to connect to. The configured region is used to determine + the service endpoint. """ - sdk_ua_app_id: str | None + aws_access_key_id: str | None = None + """The identifier for a secret access key.""" + + aws_secret_access_key: str | None = None + """A secret access key that can be used to sign requests.""" + + aws_session_token: str | None = None + """The session token used with temporary AWS credentials.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + sdk_ua_app_id: str | None = None """ A unique and opaque application ID that is appended to the User-Agent header. """ - transport: ClientTransport[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 - streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. - """ - - user_agent_extra: str | None - """Additional suffix to be added to the User-Agent header.""" - - def __init__( - self, - *, - auth_scheme_resolver: HTTPAuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - aws_access_key_id: str | None = None, - aws_credentials_identity_resolver: IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties - ] - | None = None, - aws_secret_access_key: str | None = None, - aws_session_token: str | None = None, - endpoint_resolver: EndpointResolver | None = None, - endpoint_uri: str | URI | None = None, - http_request_config: HTTPRequestConfiguration | None = None, - interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] | None = None, - region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, - sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, - user_agent_extra: str | None = None, - ): - self.auth_scheme_resolver = auth_scheme_resolver or HTTPAuthSchemeResolver() - self.auth_schemes = auth_schemes or { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="lambda") - } - self.aws_access_key_id = aws_access_key_id - self.aws_credentials_identity_resolver = aws_credentials_identity_resolver - self.aws_secret_access_key = aws_secret_access_key - self.aws_session_token = aws_session_token - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="lambda" - ) - self.endpoint_uri = endpoint_uri - self.http_request_config = http_request_config - self.interceptors = interceptors or [] - self.protocol = protocol or RestJsonClientProtocol(_SCHEMA_AWS_GIR_API_SERVICE) - self.region = region - self.retry_strategy = retry_strategy - self.sdk_ua_app_id = sdk_ua_app_id - self.transport = transport or AWSCRTHTTPClient() - self.user_agent_extra = user_agent_extra + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "aws_credentials_identity_resolver": FieldSpec(default=None), + "region": FieldSpec(default=None), + "aws_access_key_id": FieldSpec(default=None), + "aws_secret_access_key": FieldSpec(default=None), + "aws_session_token": FieldSpec(default=None), + "user_agent_extra": FieldSpec(default=None), + "sdk_ua_app_id": FieldSpec(default=None), + **AsyncAwsConfig._FIELDS, + "endpoint_uri": FieldSpec(default=None, resolver=EndpointUriResolver("lambda")), + "endpoint_resolver": FieldSpec( + default_factory=lambda: StandardRegionalEndpointsResolver( + endpoint_prefix="lambda" + ) + ), + "protocol": FieldSpec( + default_factory=lambda: RestJsonClientProtocol(_SCHEMA_AWS_GIR_API_SERVICE) + ), + "auth_schemes": FieldSpec( + default_factory=lambda: { + ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="lambda") + } + ), + "auth_scheme_resolver": FieldSpec(default_factory=HTTPAuthSchemeResolver), + "transport": FieldSpec(default_factory=lambda: AWSCRTHTTPClient()), + } def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None: """ - Sets the implementation of an auth scheme. - - Using this method ensures the correct key is used. + Set an auth scheme implementation using its scheme ID. :param scheme: + The auth scheme to add or replace. + """ + auth_schemes = dict(self.auth_schemes or {}) + auth_schemes[scheme.scheme_id] = scheme + self.auth_schemes = auth_schemes - Args: - scheme: - The auth scheme to add. + @classmethod + async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] + cls, + *, + profile: str | None = None, + fs: FileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[_AsyncLambdaConfigOverrides], + ) -> Self: + """ + Resolve config from environment, config files, defaults, and explicit + overrides. """ - self.auth_schemes[scheme.scheme_id] = scheme + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) -Plugin: TypeAlias = Callable[[Config], None] -"""A callable that allows customizing the config object on each request.""" +Plugin: TypeAlias = Callable[[AsyncLambdaConfig], None] +""" +A callable that customizes a client configuration. Service-level plugins +are applied once to the base configuration inherited by every operation. +Operation-level plugins apply only to a single operation invocation. +""" diff --git a/clients/aws-sdk-lambda/src/aws_sdk_lambda/models.py b/clients/aws-sdk-lambda/src/aws_sdk_lambda/models.py index 3370450..8744bb5 100644 --- a/clients/aws-sdk-lambda/src/aws_sdk_lambda/models.py +++ b/clients/aws-sdk-lambda/src/aws_sdk_lambda/models.py @@ -2961,7 +2961,7 @@ def _read_value(k: str, d: ShapeDeserializer): class PropagateTagsMode(UnknownEnumMixin, StrEnum): NONE = "None" - """Tag propagation is disabled. No tags are applied to managed resources. """ + """Tag propagation is disabled. No tags are applied to managed resources.""" EXPLICIT = "Explicit" """ Tags specified in `ExplicitTags` are applied to managed resources at diff --git a/clients/aws-sdk-lambda/src/aws_sdk_lambda/user_agent.py b/clients/aws-sdk-lambda/src/aws_sdk_lambda/user_agent.py index 075ad95..6141c3c 100644 --- a/clients/aws-sdk-lambda/src/aws_sdk_lambda/user_agent.py +++ b/clients/aws-sdk-lambda/src/aws_sdk_lambda/user_agent.py @@ -3,10 +3,10 @@ from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor from . import __version__ -from .config import Config +from .config import AsyncLambdaConfig -def aws_user_agent_plugin(config: Config): +def aws_user_agent_plugin(config: AsyncLambdaConfig): config.interceptors.append( UserAgentInterceptor( ua_suffix=config.user_agent_extra, diff --git a/clients/aws-sdk-lambda/tests/test_protocol.py b/clients/aws-sdk-lambda/tests/test_restjson_protocol.py similarity index 100% rename from clients/aws-sdk-lambda/tests/test_protocol.py rename to clients/aws-sdk-lambda/tests/test_restjson_protocol.py diff --git a/clients/aws-sdk-lex-runtime-v2/.changes/0.10.0.json b/clients/aws-sdk-lex-runtime-v2/.changes/0.10.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/clients/aws-sdk-lex-runtime-v2/.changes/0.10.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-lex-runtime-v2/CHANGELOG.md b/clients/aws-sdk-lex-runtime-v2/CHANGELOG.md index 2d6fc98..3712b8d 100644 --- a/clients/aws-sdk-lex-runtime-v2/CHANGELOG.md +++ b/clients/aws-sdk-lex-runtime-v2/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### Dependencies diff --git a/clients/aws-sdk-lex-runtime-v2/pyproject.toml b/clients/aws-sdk-lex-runtime-v2/pyproject.toml index 42901a9..f2a92cc 100644 --- a/clients/aws-sdk-lex-runtime-v2/pyproject.toml +++ b/clients/aws-sdk-lex-runtime-v2/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "aws_sdk_lex_runtime_v2" -version = "0.9.0" +version = "0.10.0" description = "aws_sdk_lex_runtime_v2 client" readme = "README.md" requires-python = ">=3.12" @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ - "smithy_aws_core[eventstream, json]~=0.9.0", + "smithy_aws_core[eventstream, json]~=0.10.0", "smithy_core~=0.8.0", "smithy_http[awscrt]~=0.4.0" ] diff --git a/clients/aws-sdk-lex-runtime-v2/scripts/docs/generate_doc_stubs.py b/clients/aws-sdk-lex-runtime-v2/scripts/docs/generate_doc_stubs.py index b00ac66..56ab5a8 100644 --- a/clients/aws-sdk-lex-runtime-v2/scripts/docs/generate_doc_stubs.py +++ b/clients/aws-sdk-lex-runtime-v2/scripts/docs/generate_doc_stubs.py @@ -8,6 +8,7 @@ import argparse import logging +import re import sys from collections.abc import Sequence from dataclasses import dataclass @@ -115,19 +116,43 @@ class ClientInfo: class DocStubGenerator: """Generate markdown API Reference stubs for AWS SDK for Python clients.""" - def __init__(self, client_dir: Path, output_dir: Path) -> None: + def __init__(self, client_dir: Path, output_dir: Path, service_name: str | None = None) -> None: """ Initialize the documentation generator. Args: client_dir: Path to the client source directory output_dir: Path to the output directory for generated doc stubs + service_name: Display name for the service (e.g. the Smithy sdkId + "SNS"). When omitted, falls back to a title-cased derivation of + the package name, which does not preserve acronym casing. """ self.client_dir = client_dir self.output_dir = output_dir - # Extract service name from package name - # (e.g., "aws_sdk_bedrock_runtime" -> "Bedrock Runtime") - self.service_name = client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + # Use the explicit override, then the sdkId from the package, then + # fall back to a title-cased package name (does not keep acronym + # casing, so "sns" becomes "Sns"). + self.service_name = ( + service_name + or self._sdk_id_from_package(client_dir) + or client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + ) + + @staticmethod + def _sdk_id_from_package(client_dir: Path) -> str | None: + """ + Read the authoritative service name (Smithy sdkId) from the package. + + The generated ``_private/schemas.py`` carries the ``aws.api#service`` + trait's ``sdkId`` (e.g. "SNS"), the same field the sidebar navigation + uses, so it keeps acronym casing that the package name does not. + Returns None if the file or value is absent. + """ + schemas = client_dir / "_private" / "schemas.py" + if not schemas.is_file(): + return None + match = re.search(r'"sdkId":\s*"([^"]+)"', schemas.read_text()) + return match.group(1) if match else None def generate(self) -> bool: """ @@ -166,10 +191,13 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: if not client_class: raise ValueError(f"No class ending with 'Client' found in {package_name}.client") - config_class = config_module.members.get("Config") + config_class = self._find_class_with_suffix(config_module, "Config") + if not config_class: + raise ValueError(f"No class ending with 'Config' found in {package_name}.config") + plugin_alias = config_module.members.get("Plugin") - if not config_class or not plugin_alias: - raise ValueError(f"Missing Config or Plugin in {package_name}.config") + if not plugin_alias: + raise ValueError(f"Missing Plugin in {package_name}.config") config = TypeInfo(name=config_class.name, module_path=config_class.path) plugin = TypeInfo(name=plugin_alias.name, module_path=plugin_alias.path) @@ -194,8 +222,12 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: ) def _find_class_with_suffix(self, module: Module, suffix: str) -> Class | None: - """Find the class in the module with a matching suffix.""" + """Find the class defined in the module with a matching suffix.""" for cls in module.classes.values(): + # Skip imported classes so a same-package import (e.g. a *Config + # class re-exported from config.py) can't shadow the defined one. + if cls.is_imported: + continue if cls.name.endswith(suffix): return cls return None @@ -616,6 +648,12 @@ def main() -> int: required=True, help="Output directory for generated doc stubs", ) + parser.add_argument( + "-s", + "--service-name", + default=None, + help="Display name for the service (Smithy sdkId, e.g. 'SNS')", + ) args = parser.parse_args() client_dir = args.client_dir.resolve() @@ -626,7 +664,7 @@ def main() -> int: return 1 try: - generator = DocStubGenerator(client_dir, output_dir) + generator = DocStubGenerator(client_dir, output_dir, args.service_name) success = generator.generate() return 0 if success else 1 except Exception as e: diff --git a/clients/aws-sdk-lex-runtime-v2/src/aws_sdk_lex_runtime_v2/__init__.py b/clients/aws-sdk-lex-runtime-v2/src/aws_sdk_lex_runtime_v2/__init__.py index 7e20a8c..3c99375 100644 --- a/clients/aws-sdk-lex-runtime-v2/src/aws_sdk_lex_runtime_v2/__init__.py +++ b/clients/aws-sdk-lex-runtime-v2/src/aws_sdk_lex_runtime_v2/__init__.py @@ -1,3 +1,3 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -__version__: str = "0.9.0" +__version__: str = "0.10.0" diff --git a/clients/aws-sdk-lex-runtime-v2/src/aws_sdk_lex_runtime_v2/client.py b/clients/aws-sdk-lex-runtime-v2/src/aws_sdk_lex_runtime_v2/client.py index 0815076..951c7cf 100644 --- a/clients/aws-sdk-lex-runtime-v2/src/aws_sdk_lex_runtime_v2/client.py +++ b/clients/aws-sdk-lex-runtime-v2/src/aws_sdk_lex_runtime_v2/client.py @@ -1,5 +1,6 @@ # Code generated by smithy-python-codegen DO NOT EDIT. +import asyncio from copy import deepcopy import logging from typing import Any, TYPE_CHECKING @@ -13,7 +14,7 @@ from smithy_core.types import TypedProperties from smithy_http.plugins import user_agent_plugin -from .config import Config, Plugin +from .config import AsyncLexRuntimeV2Config, Plugin from .models import ( DELETE_SESSION, DeleteSessionInput, @@ -50,7 +51,9 @@ class AsyncLexRuntimeV2Client: """ def __init__( - self, config: Config | None = None, plugins: list[Plugin] | None = None + self, + config: AsyncLexRuntimeV2Config | None = None, + plugins: list[Plugin] | None = None, ): """ Constructor for `AsyncLexRuntimeV2Client`. @@ -60,19 +63,32 @@ def __init__( Optional configuration for the client. Here you can set things like the endpoint for HTTP services or auth credentials. plugins: - A list of callables that modify the configuration dynamically. These - can be used to set defaults, for example. + A list of callables applied once to the client's base configuration. + Their changes are inherited by every operation invocation. """ - self._config = config or Config() - - client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] - if plugins: - client_plugins.extend(plugins) - - for plugin in client_plugins: - plugin(self._config) - + self._config = config + self._plugins = plugins + self._derive_lock = asyncio.Lock() + self._setup_done = False self._retry_strategy_resolver = RetryStrategyResolver() + self._client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] + + async def _ensure_setup(self) -> None: + if not self._setup_done: + async with self._derive_lock: + if not self._setup_done: + if self._config is None: + config = await AsyncLexRuntimeV2Config.resolve() + else: + # Copy so plugins don't mutate the caller's config. + config = deepcopy(self._config) + for plugin in self._client_plugins: + plugin(config) + if self._plugins: + for plugin in self._plugins: + plugin(config) + self._config = config + self._setup_done = True async def delete_session( self, input: DeleteSessionInput, plugins: list[Plugin] | None = None @@ -110,16 +126,31 @@ async def delete_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -164,16 +195,31 @@ async def get_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -213,16 +259,31 @@ async def put_session( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -286,16 +347,31 @@ async def recognize_text( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -381,16 +457,31 @@ async def recognize_utterance( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -479,16 +570,31 @@ async def start_conversation( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) diff --git a/clients/aws-sdk-lex-runtime-v2/src/aws_sdk_lex_runtime_v2/config.py b/clients/aws-sdk-lex-runtime-v2/src/aws_sdk_lex_runtime_v2/config.py index ada831f..8663089 100644 --- a/clients/aws-sdk-lex-runtime-v2/src/aws_sdk_lex_runtime_v2/config.py +++ b/clients/aws-sdk-lex-runtime-v2/src/aws_sdk_lex_runtime_v2/config.py @@ -1,24 +1,24 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -from dataclasses import dataclass -from typing import Any, Callable, TypeAlias, Union +from dataclasses import dataclass, field +from typing import Any, Callable, ClassVar, Self, TypeAlias, Union, 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.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ClientProtocol, ClientTransport, EndpointResolver +from smithy_core.aio.interfaces import ClientProtocol, EndpointResolver from smithy_core.aio.interfaces.auth import AuthScheme from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy from smithy_core.interceptors import Interceptor -from smithy_core.interfaces import URI -from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.crt import AWSCRTHTTPClient -from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import ( AWS_DEEP_SENSE_RUN_TIME_SERVICE_API2_0 as _SCHEMA_AWS_DEEP_SENSE_RUN_TIME_SERVICE_API2_0, @@ -50,141 +50,136 @@ ] -@dataclass(init=False) -class Config: - """Configuration for Lex Runtime V2.""" - - auth_scheme_resolver: HTTPAuthSchemeResolver - """ - An auth scheme resolver that determines the auth scheme for each - operation. - """ - - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] - """A map of auth scheme ids to auth schemes.""" - - aws_access_key_id: str | None - """The identifier for a secret access key.""" - - aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None - ) - """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" +class _AsyncLexRuntimeV2ConfigOverrides(AwsConfigOverrides, total=False): + endpoint_resolver: EndpointResolver | None + protocol: ClientProtocol[Any, Any] | None + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None - aws_secret_access_key: str | None - """A secret access key that can be used to sign requests.""" - aws_session_token: str | None - """An access key ID that identifies temporary security credentials.""" +@dataclass(kw_only=True, repr=False, init=False) +class AsyncLexRuntimeV2Config(AsyncAwsConfig): + """Lex Runtime V2 configuration (async-resolved).""" - endpoint_resolver: EndpointResolver + endpoint_resolver: EndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - endpoint_uri: str | URI | None - """A static URI to route requests to.""" - - http_request_config: HTTPRequestConfiguration | None - """Configuration for individual HTTP requests.""" + protocol: ClientProtocol[Any, Any] | None = None + """The protocol to serialize and deserialize requests with.""" - interceptors: list[_ServiceInterceptor] + interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) """ The list of interceptors, which are hooks that are called during the execution of a request. """ - protocol: ClientProtocol[Any, Any] | None - """The protocol to serialize and deserialize requests with.""" + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + """A map of auth scheme ids to auth schemes.""" - region: str | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None = None """ - The AWS region to connect to. The configured region is used to determine - the service endpoint. + An auth scheme resolver that determines the auth scheme for each + operation. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + aws_credentials_identity_resolver: ( + IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + ) = None + """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" + + region: str | None = None """ - The retry strategy or options for configuring retry behavior. Can be - either a configured RetryStrategy or RetryStrategyOptions to create one. + The AWS region to connect to. The configured region is used to determine + the service endpoint. """ - sdk_ua_app_id: str | None + aws_access_key_id: str | None = None + """The identifier for a secret access key.""" + + aws_secret_access_key: str | None = None + """A secret access key that can be used to sign requests.""" + + aws_session_token: str | None = None + """The session token used with temporary AWS credentials.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + sdk_ua_app_id: str | None = None """ A unique and opaque application ID that is appended to the User-Agent header. """ - transport: ClientTransport[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 - streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. - """ - - user_agent_extra: str | None - """Additional suffix to be added to the User-Agent header.""" - - def __init__( - self, - *, - auth_scheme_resolver: HTTPAuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - aws_access_key_id: str | None = None, - aws_credentials_identity_resolver: IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties - ] - | None = None, - aws_secret_access_key: str | None = None, - aws_session_token: str | None = None, - endpoint_resolver: EndpointResolver | None = None, - endpoint_uri: str | URI | None = None, - http_request_config: HTTPRequestConfiguration | None = None, - interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] | None = None, - region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, - sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, - user_agent_extra: str | None = None, - ): - self.auth_scheme_resolver = auth_scheme_resolver or HTTPAuthSchemeResolver() - self.auth_schemes = auth_schemes or { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="lex") - } - self.aws_access_key_id = aws_access_key_id - self.aws_credentials_identity_resolver = aws_credentials_identity_resolver - self.aws_secret_access_key = aws_secret_access_key - self.aws_session_token = aws_session_token - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="runtime-v2-lex" - ) - self.endpoint_uri = endpoint_uri - self.http_request_config = http_request_config - self.interceptors = interceptors or [] - self.protocol = protocol or RestJsonClientProtocol( - _SCHEMA_AWS_DEEP_SENSE_RUN_TIME_SERVICE_API2_0 - ) - self.region = region - self.retry_strategy = retry_strategy - self.sdk_ua_app_id = sdk_ua_app_id - self.transport = transport or AWSCRTHTTPClient() - self.user_agent_extra = user_agent_extra + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "aws_credentials_identity_resolver": FieldSpec(default=None), + "region": FieldSpec(default=None), + "aws_access_key_id": FieldSpec(default=None), + "aws_secret_access_key": FieldSpec(default=None), + "aws_session_token": FieldSpec(default=None), + "user_agent_extra": FieldSpec(default=None), + "sdk_ua_app_id": FieldSpec(default=None), + **AsyncAwsConfig._FIELDS, + "endpoint_uri": FieldSpec( + default=None, resolver=EndpointUriResolver("lex_runtime_v2") + ), + "endpoint_resolver": FieldSpec( + default_factory=lambda: StandardRegionalEndpointsResolver( + endpoint_prefix="runtime-v2-lex" + ) + ), + "protocol": FieldSpec( + default_factory=lambda: RestJsonClientProtocol( + _SCHEMA_AWS_DEEP_SENSE_RUN_TIME_SERVICE_API2_0 + ) + ), + "auth_schemes": FieldSpec( + default_factory=lambda: { + ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="lex") + } + ), + "auth_scheme_resolver": FieldSpec(default_factory=HTTPAuthSchemeResolver), + "transport": FieldSpec(default_factory=lambda: AWSCRTHTTPClient()), + } def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None: """ - Sets the implementation of an auth scheme. - - Using this method ensures the correct key is used. + Set an auth scheme implementation using its scheme ID. :param scheme: + The auth scheme to add or replace. + """ + auth_schemes = dict(self.auth_schemes or {}) + auth_schemes[scheme.scheme_id] = scheme + self.auth_schemes = auth_schemes - Args: - scheme: - The auth scheme to add. + @classmethod + async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] + cls, + *, + profile: str | None = None, + fs: FileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[_AsyncLexRuntimeV2ConfigOverrides], + ) -> Self: + """ + Resolve config from environment, config files, defaults, and explicit + overrides. """ - self.auth_schemes[scheme.scheme_id] = scheme + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) -Plugin: TypeAlias = Callable[[Config], None] -"""A callable that allows customizing the config object on each request.""" +Plugin: TypeAlias = Callable[[AsyncLexRuntimeV2Config], None] +""" +A callable that customizes a client configuration. Service-level plugins +are applied once to the base configuration inherited by every operation. +Operation-level plugins apply only to a single operation invocation. +""" diff --git a/clients/aws-sdk-lex-runtime-v2/src/aws_sdk_lex_runtime_v2/user_agent.py b/clients/aws-sdk-lex-runtime-v2/src/aws_sdk_lex_runtime_v2/user_agent.py index b59564e..8a3f0e9 100644 --- a/clients/aws-sdk-lex-runtime-v2/src/aws_sdk_lex_runtime_v2/user_agent.py +++ b/clients/aws-sdk-lex-runtime-v2/src/aws_sdk_lex_runtime_v2/user_agent.py @@ -3,10 +3,10 @@ from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor from . import __version__ -from .config import Config +from .config import AsyncLexRuntimeV2Config -def aws_user_agent_plugin(config: Config): +def aws_user_agent_plugin(config: AsyncLexRuntimeV2Config): config.interceptors.append( UserAgentInterceptor( ua_suffix=config.user_agent_extra, diff --git a/clients/aws-sdk-lex-runtime-v2/tests/test_protocol.py b/clients/aws-sdk-lex-runtime-v2/tests/test_restjson_protocol.py similarity index 100% rename from clients/aws-sdk-lex-runtime-v2/tests/test_protocol.py rename to clients/aws-sdk-lex-runtime-v2/tests/test_restjson_protocol.py diff --git a/clients/aws-sdk-polly/.changes/0.10.0.json b/clients/aws-sdk-polly/.changes/0.10.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/clients/aws-sdk-polly/.changes/0.10.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-polly/CHANGELOG.md b/clients/aws-sdk-polly/CHANGELOG.md index 810b5e8..ed8e153 100644 --- a/clients/aws-sdk-polly/CHANGELOG.md +++ b/clients/aws-sdk-polly/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### Dependencies diff --git a/clients/aws-sdk-polly/pyproject.toml b/clients/aws-sdk-polly/pyproject.toml index 81d35ee..f18b525 100644 --- a/clients/aws-sdk-polly/pyproject.toml +++ b/clients/aws-sdk-polly/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "aws_sdk_polly" -version = "0.9.0" +version = "0.10.0" description = "aws_sdk_polly client" readme = "README.md" requires-python = ">=3.12" @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ - "smithy_aws_core[eventstream, json]~=0.9.0", + "smithy_aws_core[eventstream, json]~=0.10.0", "smithy_core~=0.8.0", "smithy_http[awscrt]~=0.4.0" ] diff --git a/clients/aws-sdk-polly/scripts/docs/generate_doc_stubs.py b/clients/aws-sdk-polly/scripts/docs/generate_doc_stubs.py index b00ac66..56ab5a8 100644 --- a/clients/aws-sdk-polly/scripts/docs/generate_doc_stubs.py +++ b/clients/aws-sdk-polly/scripts/docs/generate_doc_stubs.py @@ -8,6 +8,7 @@ import argparse import logging +import re import sys from collections.abc import Sequence from dataclasses import dataclass @@ -115,19 +116,43 @@ class ClientInfo: class DocStubGenerator: """Generate markdown API Reference stubs for AWS SDK for Python clients.""" - def __init__(self, client_dir: Path, output_dir: Path) -> None: + def __init__(self, client_dir: Path, output_dir: Path, service_name: str | None = None) -> None: """ Initialize the documentation generator. Args: client_dir: Path to the client source directory output_dir: Path to the output directory for generated doc stubs + service_name: Display name for the service (e.g. the Smithy sdkId + "SNS"). When omitted, falls back to a title-cased derivation of + the package name, which does not preserve acronym casing. """ self.client_dir = client_dir self.output_dir = output_dir - # Extract service name from package name - # (e.g., "aws_sdk_bedrock_runtime" -> "Bedrock Runtime") - self.service_name = client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + # Use the explicit override, then the sdkId from the package, then + # fall back to a title-cased package name (does not keep acronym + # casing, so "sns" becomes "Sns"). + self.service_name = ( + service_name + or self._sdk_id_from_package(client_dir) + or client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + ) + + @staticmethod + def _sdk_id_from_package(client_dir: Path) -> str | None: + """ + Read the authoritative service name (Smithy sdkId) from the package. + + The generated ``_private/schemas.py`` carries the ``aws.api#service`` + trait's ``sdkId`` (e.g. "SNS"), the same field the sidebar navigation + uses, so it keeps acronym casing that the package name does not. + Returns None if the file or value is absent. + """ + schemas = client_dir / "_private" / "schemas.py" + if not schemas.is_file(): + return None + match = re.search(r'"sdkId":\s*"([^"]+)"', schemas.read_text()) + return match.group(1) if match else None def generate(self) -> bool: """ @@ -166,10 +191,13 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: if not client_class: raise ValueError(f"No class ending with 'Client' found in {package_name}.client") - config_class = config_module.members.get("Config") + config_class = self._find_class_with_suffix(config_module, "Config") + if not config_class: + raise ValueError(f"No class ending with 'Config' found in {package_name}.config") + plugin_alias = config_module.members.get("Plugin") - if not config_class or not plugin_alias: - raise ValueError(f"Missing Config or Plugin in {package_name}.config") + if not plugin_alias: + raise ValueError(f"Missing Plugin in {package_name}.config") config = TypeInfo(name=config_class.name, module_path=config_class.path) plugin = TypeInfo(name=plugin_alias.name, module_path=plugin_alias.path) @@ -194,8 +222,12 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: ) def _find_class_with_suffix(self, module: Module, suffix: str) -> Class | None: - """Find the class in the module with a matching suffix.""" + """Find the class defined in the module with a matching suffix.""" for cls in module.classes.values(): + # Skip imported classes so a same-package import (e.g. a *Config + # class re-exported from config.py) can't shadow the defined one. + if cls.is_imported: + continue if cls.name.endswith(suffix): return cls return None @@ -616,6 +648,12 @@ def main() -> int: required=True, help="Output directory for generated doc stubs", ) + parser.add_argument( + "-s", + "--service-name", + default=None, + help="Display name for the service (Smithy sdkId, e.g. 'SNS')", + ) args = parser.parse_args() client_dir = args.client_dir.resolve() @@ -626,7 +664,7 @@ def main() -> int: return 1 try: - generator = DocStubGenerator(client_dir, output_dir) + generator = DocStubGenerator(client_dir, output_dir, args.service_name) success = generator.generate() return 0 if success else 1 except Exception as e: diff --git a/clients/aws-sdk-polly/src/aws_sdk_polly/__init__.py b/clients/aws-sdk-polly/src/aws_sdk_polly/__init__.py index 7e20a8c..3c99375 100644 --- a/clients/aws-sdk-polly/src/aws_sdk_polly/__init__.py +++ b/clients/aws-sdk-polly/src/aws_sdk_polly/__init__.py @@ -1,3 +1,3 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -__version__: str = "0.9.0" +__version__: str = "0.10.0" diff --git a/clients/aws-sdk-polly/src/aws_sdk_polly/client.py b/clients/aws-sdk-polly/src/aws_sdk_polly/client.py index 712a6e1..9ed2e0b 100644 --- a/clients/aws-sdk-polly/src/aws_sdk_polly/client.py +++ b/clients/aws-sdk-polly/src/aws_sdk_polly/client.py @@ -1,5 +1,6 @@ # Code generated by smithy-python-codegen DO NOT EDIT. +import asyncio from copy import deepcopy import logging from typing import Any, TYPE_CHECKING @@ -13,7 +14,7 @@ from smithy_core.types import TypedProperties from smithy_http.plugins import user_agent_plugin -from .config import Config, Plugin +from .config import AsyncPollyConfig, Plugin from .models import ( DELETE_LEXICON, DESCRIBE_VOICES, @@ -67,7 +68,9 @@ class AsyncPollyClient: """ def __init__( - self, config: Config | None = None, plugins: list[Plugin] | None = None + self, + config: AsyncPollyConfig | None = None, + plugins: list[Plugin] | None = None, ): """ Constructor for `AsyncPollyClient`. @@ -77,19 +80,32 @@ def __init__( Optional configuration for the client. Here you can set things like the endpoint for HTTP services or auth credentials. plugins: - A list of callables that modify the configuration dynamically. These - can be used to set defaults, for example. + A list of callables applied once to the client's base configuration. + Their changes are inherited by every operation invocation. """ - self._config = config or Config() - - client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] - if plugins: - client_plugins.extend(plugins) - - for plugin in client_plugins: - plugin(self._config) - + self._config = config + self._plugins = plugins + self._derive_lock = asyncio.Lock() + self._setup_done = False self._retry_strategy_resolver = RetryStrategyResolver() + self._client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] + + async def _ensure_setup(self) -> None: + if not self._setup_done: + async with self._derive_lock: + if not self._setup_done: + if self._config is None: + config = await AsyncPollyConfig.resolve() + else: + # Copy so plugins don't mutate the caller's config. + config = deepcopy(self._config) + for plugin in self._client_plugins: + plugin(config) + if self._plugins: + for plugin in self._plugins: + plugin(config) + self._config = config + self._setup_done = True async def delete_lexicon( self, input: DeleteLexiconInput, plugins: list[Plugin] | None = None @@ -118,16 +134,31 @@ async def delete_lexicon( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -184,16 +215,31 @@ async def describe_voices( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -233,16 +279,31 @@ async def get_lexicon( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -283,16 +344,31 @@ async def get_speech_synthesis_task( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -332,16 +408,31 @@ async def list_lexicons( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -381,16 +472,31 @@ async def list_speech_synthesis_tasks( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -435,16 +541,31 @@ async def put_lexicon( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -496,16 +617,31 @@ async def start_speech_synthesis_stream( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -556,16 +692,31 @@ async def start_speech_synthesis_task( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -608,16 +759,31 @@ async def synthesize_speech( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) diff --git a/clients/aws-sdk-polly/src/aws_sdk_polly/config.py b/clients/aws-sdk-polly/src/aws_sdk_polly/config.py index 435ad57..4b7ccb2 100644 --- a/clients/aws-sdk-polly/src/aws_sdk_polly/config.py +++ b/clients/aws-sdk-polly/src/aws_sdk_polly/config.py @@ -1,24 +1,24 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -from dataclasses import dataclass -from typing import Any, Callable, TypeAlias, Union +from dataclasses import dataclass, field +from typing import Any, Callable, ClassVar, Self, TypeAlias, Union, 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.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ClientProtocol, ClientTransport, EndpointResolver +from smithy_core.aio.interfaces import ClientProtocol, EndpointResolver from smithy_core.aio.interfaces.auth import AuthScheme from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy from smithy_core.interceptors import Interceptor -from smithy_core.interfaces import URI -from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.crt import AWSCRTHTTPClient -from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import PARROT_V1 as _SCHEMA_PARROT_V1 from .auth import HTTPAuthSchemeResolver @@ -66,139 +66,132 @@ ] -@dataclass(init=False) -class Config: - """Configuration for Polly.""" - - auth_scheme_resolver: HTTPAuthSchemeResolver - """ - An auth scheme resolver that determines the auth scheme for each - operation. - """ - - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] - """A map of auth scheme ids to auth schemes.""" - - aws_access_key_id: str | None - """The identifier for a secret access key.""" - - aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None - ) - """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" +class _AsyncPollyConfigOverrides(AwsConfigOverrides, total=False): + endpoint_resolver: EndpointResolver | None + protocol: ClientProtocol[Any, Any] | None + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None - aws_secret_access_key: str | None - """A secret access key that can be used to sign requests.""" - aws_session_token: str | None - """An access key ID that identifies temporary security credentials.""" +@dataclass(kw_only=True, repr=False, init=False) +class AsyncPollyConfig(AsyncAwsConfig): + """Polly configuration (async-resolved).""" - endpoint_resolver: EndpointResolver + endpoint_resolver: EndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - endpoint_uri: str | URI | None - """A static URI to route requests to.""" - - http_request_config: HTTPRequestConfiguration | None - """Configuration for individual HTTP requests.""" + protocol: ClientProtocol[Any, Any] | None = None + """The protocol to serialize and deserialize requests with.""" - interceptors: list[_ServiceInterceptor] + interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) """ The list of interceptors, which are hooks that are called during the execution of a request. """ - protocol: ClientProtocol[Any, Any] | None - """The protocol to serialize and deserialize requests with.""" + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + """A map of auth scheme ids to auth schemes.""" - region: str | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None = None """ - The AWS region to connect to. The configured region is used to determine - the service endpoint. + An auth scheme resolver that determines the auth scheme for each + operation. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + aws_credentials_identity_resolver: ( + IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + ) = None + """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" + + region: str | None = None """ - The retry strategy or options for configuring retry behavior. Can be - either a configured RetryStrategy or RetryStrategyOptions to create one. + The AWS region to connect to. The configured region is used to determine + the service endpoint. """ - sdk_ua_app_id: str | None + aws_access_key_id: str | None = None + """The identifier for a secret access key.""" + + aws_secret_access_key: str | None = None + """A secret access key that can be used to sign requests.""" + + aws_session_token: str | None = None + """The session token used with temporary AWS credentials.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + sdk_ua_app_id: str | None = None """ A unique and opaque application ID that is appended to the User-Agent header. """ - transport: ClientTransport[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 - streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. - """ - - user_agent_extra: str | None - """Additional suffix to be added to the User-Agent header.""" - - def __init__( - self, - *, - auth_scheme_resolver: HTTPAuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - aws_access_key_id: str | None = None, - aws_credentials_identity_resolver: IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties - ] - | None = None, - aws_secret_access_key: str | None = None, - aws_session_token: str | None = None, - endpoint_resolver: EndpointResolver | None = None, - endpoint_uri: str | URI | None = None, - http_request_config: HTTPRequestConfiguration | None = None, - interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] | None = None, - region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, - sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, - user_agent_extra: str | None = None, - ): - self.auth_scheme_resolver = auth_scheme_resolver or HTTPAuthSchemeResolver() - self.auth_schemes = auth_schemes or { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="polly") - } - self.aws_access_key_id = aws_access_key_id - self.aws_credentials_identity_resolver = aws_credentials_identity_resolver - self.aws_secret_access_key = aws_secret_access_key - self.aws_session_token = aws_session_token - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="polly" - ) - self.endpoint_uri = endpoint_uri - self.http_request_config = http_request_config - self.interceptors = interceptors or [] - self.protocol = protocol or RestJsonClientProtocol(_SCHEMA_PARROT_V1) - self.region = region - self.retry_strategy = retry_strategy - self.sdk_ua_app_id = sdk_ua_app_id - self.transport = transport or AWSCRTHTTPClient() - self.user_agent_extra = user_agent_extra + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "aws_credentials_identity_resolver": FieldSpec(default=None), + "region": FieldSpec(default=None), + "aws_access_key_id": FieldSpec(default=None), + "aws_secret_access_key": FieldSpec(default=None), + "aws_session_token": FieldSpec(default=None), + "user_agent_extra": FieldSpec(default=None), + "sdk_ua_app_id": FieldSpec(default=None), + **AsyncAwsConfig._FIELDS, + "endpoint_uri": FieldSpec(default=None, resolver=EndpointUriResolver("polly")), + "endpoint_resolver": FieldSpec( + default_factory=lambda: StandardRegionalEndpointsResolver( + endpoint_prefix="polly" + ) + ), + "protocol": FieldSpec( + default_factory=lambda: RestJsonClientProtocol(_SCHEMA_PARROT_V1) + ), + "auth_schemes": FieldSpec( + default_factory=lambda: { + ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="polly") + } + ), + "auth_scheme_resolver": FieldSpec(default_factory=HTTPAuthSchemeResolver), + "transport": FieldSpec(default_factory=lambda: AWSCRTHTTPClient()), + } def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None: """ - Sets the implementation of an auth scheme. - - Using this method ensures the correct key is used. + Set an auth scheme implementation using its scheme ID. :param scheme: + The auth scheme to add or replace. + """ + auth_schemes = dict(self.auth_schemes or {}) + auth_schemes[scheme.scheme_id] = scheme + self.auth_schemes = auth_schemes - Args: - scheme: - The auth scheme to add. + @classmethod + async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] + cls, + *, + profile: str | None = None, + fs: FileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[_AsyncPollyConfigOverrides], + ) -> Self: + """ + Resolve config from environment, config files, defaults, and explicit + overrides. """ - self.auth_schemes[scheme.scheme_id] = scheme + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) -Plugin: TypeAlias = Callable[[Config], None] -"""A callable that allows customizing the config object on each request.""" +Plugin: TypeAlias = Callable[[AsyncPollyConfig], None] +""" +A callable that customizes a client configuration. Service-level plugins +are applied once to the base configuration inherited by every operation. +Operation-level plugins apply only to a single operation invocation. +""" diff --git a/clients/aws-sdk-polly/src/aws_sdk_polly/user_agent.py b/clients/aws-sdk-polly/src/aws_sdk_polly/user_agent.py index 6648a43..490ff09 100644 --- a/clients/aws-sdk-polly/src/aws_sdk_polly/user_agent.py +++ b/clients/aws-sdk-polly/src/aws_sdk_polly/user_agent.py @@ -3,10 +3,10 @@ from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor from . import __version__ -from .config import Config +from .config import AsyncPollyConfig -def aws_user_agent_plugin(config: Config): +def aws_user_agent_plugin(config: AsyncPollyConfig): config.interceptors.append( UserAgentInterceptor( ua_suffix=config.user_agent_extra, diff --git a/clients/aws-sdk-polly/tests/test_protocol.py b/clients/aws-sdk-polly/tests/test_restjson_protocol.py similarity index 100% rename from clients/aws-sdk-polly/tests/test_protocol.py rename to clients/aws-sdk-polly/tests/test_restjson_protocol.py diff --git a/clients/aws-sdk-python/.changes/0.10.0.json b/clients/aws-sdk-python/.changes/0.10.0.json new file mode 100644 index 0000000..f6a9dea --- /dev/null +++ b/clients/aws-sdk-python/.changes/0.10.0.json @@ -0,0 +1,76 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `aws-sdk-api-gateway` from `~=0.9.0` to `~=0.10.0`." + }, + { + "type": "dependency", + "description": "Bump `aws-sdk-bedrock` from `~=0.9.0` to `~=0.10.0`." + }, + { + "type": "dependency", + "description": "Bump `aws-sdk-bedrock-agent` from `~=0.9.0` to `~=0.10.0`." + }, + { + "type": "dependency", + "description": "Bump `aws-sdk-bedrock-agent-runtime` from `~=0.9.0` to `~=0.10.0`." + }, + { + "type": "dependency", + "description": "Bump `aws-sdk-bedrock-agentcore` from `~=0.9.0` to `~=0.10.0`." + }, + { + "type": "dependency", + "description": "Bump `aws-sdk-bedrock-agentcore-control` from `~=0.9.0` to `~=0.10.0`." + }, + { + "type": "dependency", + "description": "Bump `aws-sdk-bedrock-data-automation` from `~=0.9.0` to `~=0.10.0`." + }, + { + "type": "dependency", + "description": "Bump `aws-sdk-bedrock-runtime` from `~=0.9.0` to `~=0.10.0`." + }, + { + "type": "dependency", + "description": "Bump `aws-sdk-connecthealth` from `~=0.9.0` to `~=0.10.0`." + }, + { + "type": "dependency", + "description": "Bump `aws-sdk-guardduty` from `~=0.9.0` to `~=0.10.0`." + }, + { + "type": "dependency", + "description": "Bump `aws-sdk-lambda` from `~=0.9.0` to `~=0.10.0`." + }, + { + "type": "dependency", + "description": "Bump `aws-sdk-lex-runtime-v2` from `~=0.9.0` to `~=0.10.0`." + }, + { + "type": "dependency", + "description": "Bump `aws-sdk-polly` from `~=0.9.0` to `~=0.10.0`." + }, + { + "type": "dependency", + "description": "Bump `aws-sdk-qbusiness` from `~=0.9.0` to `~=0.10.0`." + }, + { + "type": "dependency", + "description": "Bump `aws-sdk-sagemaker-runtime-http2` from `~=0.9.0` to `~=0.10.0`." + }, + { + "type": "dependency", + "description": "Bump `aws-sdk-sns` from `~=0.9.0` to `~=0.10.0`." + }, + { + "type": "dependency", + "description": "Bump `aws-sdk-sts` from `~=0.9.0` to `~=0.10.0`." + }, + { + "type": "dependency", + "description": "Bump `aws-sdk-transcribe-streaming` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-python/CHANGELOG.md b/clients/aws-sdk-python/CHANGELOG.md index f9ce9e6..04ee525 100644 --- a/clients/aws-sdk-python/CHANGELOG.md +++ b/clients/aws-sdk-python/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `aws-sdk-api-gateway` from `~=0.9.0` to `~=0.10.0`. +* Bump `aws-sdk-bedrock` from `~=0.9.0` to `~=0.10.0`. +* Bump `aws-sdk-bedrock-agent` from `~=0.9.0` to `~=0.10.0`. +* Bump `aws-sdk-bedrock-agent-runtime` from `~=0.9.0` to `~=0.10.0`. +* Bump `aws-sdk-bedrock-agentcore` from `~=0.9.0` to `~=0.10.0`. +* Bump `aws-sdk-bedrock-agentcore-control` from `~=0.9.0` to `~=0.10.0`. +* Bump `aws-sdk-bedrock-data-automation` from `~=0.9.0` to `~=0.10.0`. +* Bump `aws-sdk-bedrock-runtime` from `~=0.9.0` to `~=0.10.0`. +* Bump `aws-sdk-connecthealth` from `~=0.9.0` to `~=0.10.0`. +* Bump `aws-sdk-guardduty` from `~=0.9.0` to `~=0.10.0`. +* Bump `aws-sdk-lambda` from `~=0.9.0` to `~=0.10.0`. +* Bump `aws-sdk-lex-runtime-v2` from `~=0.9.0` to `~=0.10.0`. +* Bump `aws-sdk-polly` from `~=0.9.0` to `~=0.10.0`. +* Bump `aws-sdk-qbusiness` from `~=0.9.0` to `~=0.10.0`. +* Bump `aws-sdk-sagemaker-runtime-http2` from `~=0.9.0` to `~=0.10.0`. +* Bump `aws-sdk-sns` from `~=0.9.0` to `~=0.10.0`. +* Bump `aws-sdk-sts` from `~=0.9.0` to `~=0.10.0`. +* Bump `aws-sdk-transcribe-streaming` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### Dependencies diff --git a/clients/aws-sdk-python/pyproject.toml b/clients/aws-sdk-python/pyproject.toml index 34ec666..5edc2cd 100644 --- a/clients/aws-sdk-python/pyproject.toml +++ b/clients/aws-sdk-python/pyproject.toml @@ -22,24 +22,24 @@ classifiers = [ dependencies = [] [project.optional-dependencies] -api_gateway = ["aws_sdk_api_gateway~=0.9.0"] -bedrock = ["aws_sdk_bedrock~=0.9.0"] -bedrock_agent = ["aws_sdk_bedrock_agent~=0.9.0"] -bedrock_agent_runtime = ["aws_sdk_bedrock_agent_runtime~=0.9.0"] -bedrock_agentcore = ["aws_sdk_bedrock_agentcore~=0.9.0"] -bedrock_agentcore_control = ["aws_sdk_bedrock_agentcore_control~=0.9.0"] -bedrock_data_automation = ["aws_sdk_bedrock_data_automation~=0.9.0"] -bedrock_runtime = ["aws_sdk_bedrock_runtime~=0.9.0"] -connecthealth = ["aws_sdk_connecthealth~=0.9.0"] -guardduty = ["aws_sdk_guardduty~=0.9.0"] -lambda = ["aws_sdk_lambda~=0.9.0"] -lex_runtime_v2 = ["aws_sdk_lex_runtime_v2~=0.9.0"] -polly = ["aws_sdk_polly~=0.9.0"] -qbusiness = ["aws_sdk_qbusiness~=0.9.0"] -sagemaker_runtime_http2 = ["aws_sdk_sagemaker_runtime_http2~=0.9.0"] -sns = ["aws_sdk_sns~=0.9.0"] -sts = ["aws_sdk_sts~=0.9.0"] -transcribe_streaming = ["aws_sdk_transcribe_streaming~=0.9.0"] +api_gateway = ["aws_sdk_api_gateway~=0.10.0"] +bedrock = ["aws_sdk_bedrock~=0.10.0"] +bedrock_agent = ["aws_sdk_bedrock_agent~=0.10.0"] +bedrock_agent_runtime = ["aws_sdk_bedrock_agent_runtime~=0.10.0"] +bedrock_agentcore = ["aws_sdk_bedrock_agentcore~=0.10.0"] +bedrock_agentcore_control = ["aws_sdk_bedrock_agentcore_control~=0.10.0"] +bedrock_data_automation = ["aws_sdk_bedrock_data_automation~=0.10.0"] +bedrock_runtime = ["aws_sdk_bedrock_runtime~=0.10.0"] +connecthealth = ["aws_sdk_connecthealth~=0.10.0"] +guardduty = ["aws_sdk_guardduty~=0.10.0"] +lambda = ["aws_sdk_lambda~=0.10.0"] +lex_runtime_v2 = ["aws_sdk_lex_runtime_v2~=0.10.0"] +polly = ["aws_sdk_polly~=0.10.0"] +qbusiness = ["aws_sdk_qbusiness~=0.10.0"] +sagemaker_runtime_http2 = ["aws_sdk_sagemaker_runtime_http2~=0.10.0"] +sns = ["aws_sdk_sns~=0.10.0"] +sts = ["aws_sdk_sts~=0.10.0"] +transcribe_streaming = ["aws_sdk_transcribe_streaming~=0.10.0"] all = [ "aws_sdk_python[api_gateway]", diff --git a/clients/aws-sdk-python/src/aws_sdk_python/__init__.py b/clients/aws-sdk-python/src/aws_sdk_python/__init__.py index c73e336..21f3525 100644 --- a/clients/aws-sdk-python/src/aws_sdk_python/__init__.py +++ b/clients/aws-sdk-python/src/aws_sdk_python/__init__.py @@ -1,6 +1,6 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -__version__ = "0.9.0" +__version__ = "0.10.0" # TODO: Consider adding relative imports for services from the top level namespace? diff --git a/clients/aws-sdk-qbusiness/.changes/0.10.0.json b/clients/aws-sdk-qbusiness/.changes/0.10.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/clients/aws-sdk-qbusiness/.changes/0.10.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-qbusiness/CHANGELOG.md b/clients/aws-sdk-qbusiness/CHANGELOG.md index 57eef1d..13efe69 100644 --- a/clients/aws-sdk-qbusiness/CHANGELOG.md +++ b/clients/aws-sdk-qbusiness/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### Dependencies diff --git a/clients/aws-sdk-qbusiness/pyproject.toml b/clients/aws-sdk-qbusiness/pyproject.toml index f7baa76..aa3197d 100644 --- a/clients/aws-sdk-qbusiness/pyproject.toml +++ b/clients/aws-sdk-qbusiness/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "aws_sdk_qbusiness" -version = "0.9.0" +version = "0.10.0" description = "aws_sdk_qbusiness client" readme = "README.md" requires-python = ">=3.12" @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ - "smithy_aws_core[eventstream, json]~=0.9.0", + "smithy_aws_core[eventstream, json]~=0.10.0", "smithy_core~=0.8.0", "smithy_http[awscrt]~=0.4.0" ] diff --git a/clients/aws-sdk-qbusiness/scripts/docs/generate_doc_stubs.py b/clients/aws-sdk-qbusiness/scripts/docs/generate_doc_stubs.py index b00ac66..56ab5a8 100644 --- a/clients/aws-sdk-qbusiness/scripts/docs/generate_doc_stubs.py +++ b/clients/aws-sdk-qbusiness/scripts/docs/generate_doc_stubs.py @@ -8,6 +8,7 @@ import argparse import logging +import re import sys from collections.abc import Sequence from dataclasses import dataclass @@ -115,19 +116,43 @@ class ClientInfo: class DocStubGenerator: """Generate markdown API Reference stubs for AWS SDK for Python clients.""" - def __init__(self, client_dir: Path, output_dir: Path) -> None: + def __init__(self, client_dir: Path, output_dir: Path, service_name: str | None = None) -> None: """ Initialize the documentation generator. Args: client_dir: Path to the client source directory output_dir: Path to the output directory for generated doc stubs + service_name: Display name for the service (e.g. the Smithy sdkId + "SNS"). When omitted, falls back to a title-cased derivation of + the package name, which does not preserve acronym casing. """ self.client_dir = client_dir self.output_dir = output_dir - # Extract service name from package name - # (e.g., "aws_sdk_bedrock_runtime" -> "Bedrock Runtime") - self.service_name = client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + # Use the explicit override, then the sdkId from the package, then + # fall back to a title-cased package name (does not keep acronym + # casing, so "sns" becomes "Sns"). + self.service_name = ( + service_name + or self._sdk_id_from_package(client_dir) + or client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + ) + + @staticmethod + def _sdk_id_from_package(client_dir: Path) -> str | None: + """ + Read the authoritative service name (Smithy sdkId) from the package. + + The generated ``_private/schemas.py`` carries the ``aws.api#service`` + trait's ``sdkId`` (e.g. "SNS"), the same field the sidebar navigation + uses, so it keeps acronym casing that the package name does not. + Returns None if the file or value is absent. + """ + schemas = client_dir / "_private" / "schemas.py" + if not schemas.is_file(): + return None + match = re.search(r'"sdkId":\s*"([^"]+)"', schemas.read_text()) + return match.group(1) if match else None def generate(self) -> bool: """ @@ -166,10 +191,13 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: if not client_class: raise ValueError(f"No class ending with 'Client' found in {package_name}.client") - config_class = config_module.members.get("Config") + config_class = self._find_class_with_suffix(config_module, "Config") + if not config_class: + raise ValueError(f"No class ending with 'Config' found in {package_name}.config") + plugin_alias = config_module.members.get("Plugin") - if not config_class or not plugin_alias: - raise ValueError(f"Missing Config or Plugin in {package_name}.config") + if not plugin_alias: + raise ValueError(f"Missing Plugin in {package_name}.config") config = TypeInfo(name=config_class.name, module_path=config_class.path) plugin = TypeInfo(name=plugin_alias.name, module_path=plugin_alias.path) @@ -194,8 +222,12 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: ) def _find_class_with_suffix(self, module: Module, suffix: str) -> Class | None: - """Find the class in the module with a matching suffix.""" + """Find the class defined in the module with a matching suffix.""" for cls in module.classes.values(): + # Skip imported classes so a same-package import (e.g. a *Config + # class re-exported from config.py) can't shadow the defined one. + if cls.is_imported: + continue if cls.name.endswith(suffix): return cls return None @@ -616,6 +648,12 @@ def main() -> int: required=True, help="Output directory for generated doc stubs", ) + parser.add_argument( + "-s", + "--service-name", + default=None, + help="Display name for the service (Smithy sdkId, e.g. 'SNS')", + ) args = parser.parse_args() client_dir = args.client_dir.resolve() @@ -626,7 +664,7 @@ def main() -> int: return 1 try: - generator = DocStubGenerator(client_dir, output_dir) + generator = DocStubGenerator(client_dir, output_dir, args.service_name) success = generator.generate() return 0 if success else 1 except Exception as e: diff --git a/clients/aws-sdk-qbusiness/src/aws_sdk_qbusiness/__init__.py b/clients/aws-sdk-qbusiness/src/aws_sdk_qbusiness/__init__.py index 7e20a8c..3c99375 100644 --- a/clients/aws-sdk-qbusiness/src/aws_sdk_qbusiness/__init__.py +++ b/clients/aws-sdk-qbusiness/src/aws_sdk_qbusiness/__init__.py @@ -1,3 +1,3 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -__version__: str = "0.9.0" +__version__: str = "0.10.0" diff --git a/clients/aws-sdk-qbusiness/src/aws_sdk_qbusiness/client.py b/clients/aws-sdk-qbusiness/src/aws_sdk_qbusiness/client.py index 45705ab..828eaf3 100644 --- a/clients/aws-sdk-qbusiness/src/aws_sdk_qbusiness/client.py +++ b/clients/aws-sdk-qbusiness/src/aws_sdk_qbusiness/client.py @@ -1,5 +1,6 @@ # Code generated by smithy-python-codegen DO NOT EDIT. +import asyncio from copy import deepcopy import logging from typing import Any, TYPE_CHECKING @@ -13,7 +14,7 @@ from smithy_core.types import TypedProperties from smithy_http.plugins import user_agent_plugin -from .config import Config, Plugin +from .config import AsyncQBusinessConfig, Plugin from .models import ( ASSOCIATE_PERMISSION, AssociatePermissionInput, @@ -311,7 +312,9 @@ class AsyncQBusinessClient: """ def __init__( - self, config: Config | None = None, plugins: list[Plugin] | None = None + self, + config: AsyncQBusinessConfig | None = None, + plugins: list[Plugin] | None = None, ): """ Constructor for `AsyncQBusinessClient`. @@ -321,19 +324,32 @@ def __init__( Optional configuration for the client. Here you can set things like the endpoint for HTTP services or auth credentials. plugins: - A list of callables that modify the configuration dynamically. These - can be used to set defaults, for example. + A list of callables applied once to the client's base configuration. + Their changes are inherited by every operation invocation. """ - self._config = config or Config() - - client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] - if plugins: - client_plugins.extend(plugins) - - for plugin in client_plugins: - plugin(self._config) - + self._config = config + self._plugins = plugins + self._derive_lock = asyncio.Lock() + self._setup_done = False self._retry_strategy_resolver = RetryStrategyResolver() + self._client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] + + async def _ensure_setup(self) -> None: + if not self._setup_done: + async with self._derive_lock: + if not self._setup_done: + if self._config is None: + config = await AsyncQBusinessConfig.resolve() + else: + # Copy so plugins don't mutate the caller's config. + config = deepcopy(self._config) + for plugin in self._client_plugins: + plugin(config) + if self._plugins: + for plugin in self._plugins: + plugin(config) + self._config = config + self._setup_done = True async def associate_permission( self, input: AssociatePermissionInput, plugins: list[Plugin] | None = None @@ -360,16 +376,31 @@ async def associate_permission( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -411,16 +442,31 @@ async def batch_delete_document( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -471,16 +517,31 @@ async def batch_put_document( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -520,16 +581,31 @@ async def cancel_subscription( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -567,16 +643,31 @@ async def chat( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -619,16 +710,31 @@ async def chat_sync( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -668,16 +774,31 @@ async def check_document_access( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -719,16 +840,31 @@ async def create_anonymous_web_experience_url( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -786,16 +922,31 @@ async def create_application( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -838,16 +989,31 @@ async def create_chat_response_configuration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -893,16 +1059,31 @@ async def create_data_accessor( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -944,16 +1125,31 @@ async def create_data_source( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1001,16 +1197,31 @@ async def create_index( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1048,16 +1259,31 @@ async def create_plugin( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1095,16 +1321,31 @@ async def create_retriever( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1154,16 +1395,31 @@ async def create_subscription( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1202,16 +1458,31 @@ async def create_user( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1249,16 +1520,31 @@ async def create_web_experience( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1296,16 +1582,31 @@ async def delete_application( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1344,16 +1645,31 @@ async def delete_attachment( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1394,16 +1710,31 @@ async def delete_chat_controls_configuration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1444,16 +1775,31 @@ async def delete_chat_response_configuration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1491,16 +1837,31 @@ async def delete_conversation( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1541,16 +1902,31 @@ async def delete_data_accessor( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1590,16 +1966,31 @@ async def delete_data_source( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1647,16 +2038,31 @@ async def delete_group( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1694,16 +2100,31 @@ async def delete_index( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1741,16 +2162,31 @@ async def delete_plugin( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1788,16 +2224,31 @@ async def delete_retriever( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1835,16 +2286,31 @@ async def delete_user( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1882,16 +2348,31 @@ async def delete_web_experience( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1932,16 +2413,31 @@ async def disassociate_permission( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1979,16 +2475,31 @@ async def get_application( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2029,16 +2540,31 @@ async def get_chat_controls_configuration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2080,16 +2606,31 @@ async def get_chat_response_configuration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2132,16 +2673,31 @@ async def get_data_accessor( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2180,16 +2736,31 @@ async def get_data_source( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2231,16 +2802,31 @@ async def get_document_content( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2278,16 +2864,31 @@ async def get_group( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2325,16 +2926,31 @@ async def get_index( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2379,16 +2995,31 @@ async def get_media( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2426,16 +3057,31 @@ async def get_plugin( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2476,16 +3122,31 @@ async def get_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2524,16 +3185,31 @@ async def get_retriever( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2572,16 +3248,31 @@ async def get_user( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2619,16 +3310,31 @@ async def get_web_experience( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2672,16 +3378,31 @@ async def list_applications( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2721,16 +3442,31 @@ async def list_attachments( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2773,16 +3509,31 @@ async def list_chat_response_configurations( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2820,16 +3571,31 @@ async def list_conversations( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2870,16 +3636,31 @@ async def list_data_accessors( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2918,16 +3699,31 @@ async def list_data_sources( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2966,16 +3762,31 @@ async def list_data_source_sync_jobs( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3013,16 +3824,31 @@ async def list_documents( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3060,16 +3886,31 @@ async def list_groups( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3107,16 +3948,31 @@ async def list_indices( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3155,16 +4011,31 @@ async def list_messages( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3203,16 +4074,31 @@ async def list_plugin_actions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3250,16 +4136,31 @@ async def list_plugins( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3298,16 +4199,31 @@ async def list_plugin_type_actions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3345,16 +4261,31 @@ async def list_plugin_type_metadata( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3392,16 +4323,31 @@ async def list_retrievers( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3439,16 +4385,31 @@ async def list_subscriptions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3488,16 +4449,31 @@ async def list_tags_for_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3535,16 +4511,31 @@ async def list_web_experiences( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3583,16 +4574,31 @@ async def put_feedback( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3646,16 +4652,31 @@ async def put_group( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3700,16 +4721,31 @@ async def search_relevant_content( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3749,16 +4785,31 @@ async def start_data_source_sync_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3797,16 +4848,31 @@ async def stop_data_source_sync_job( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3846,16 +4912,31 @@ async def tag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3893,16 +4974,31 @@ async def untag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -3951,16 +5047,31 @@ async def update_application( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4001,16 +5112,31 @@ async def update_chat_controls_configuration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4053,16 +5179,31 @@ async def update_chat_response_configuration( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4104,16 +5245,31 @@ async def update_data_accessor( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4151,16 +5307,31 @@ async def update_data_source( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4198,16 +5369,31 @@ async def update_index( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4245,16 +5431,31 @@ async def update_plugin( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4292,16 +5493,31 @@ async def update_retriever( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4343,16 +5559,31 @@ async def update_subscription( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4390,16 +5621,31 @@ async def update_user( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -4437,16 +5683,31 @@ async def update_web_experience( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) diff --git a/clients/aws-sdk-qbusiness/src/aws_sdk_qbusiness/config.py b/clients/aws-sdk-qbusiness/src/aws_sdk_qbusiness/config.py index f16784d..9a8d1a4 100644 --- a/clients/aws-sdk-qbusiness/src/aws_sdk_qbusiness/config.py +++ b/clients/aws-sdk-qbusiness/src/aws_sdk_qbusiness/config.py @@ -1,24 +1,24 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -from dataclasses import dataclass -from typing import Any, Callable, TypeAlias, Union +from dataclasses import dataclass, field +from typing import Any, Callable, ClassVar, Self, TypeAlias, Union, 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.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ClientProtocol, ClientTransport, EndpointResolver +from smithy_core.aio.interfaces import ClientProtocol, EndpointResolver from smithy_core.aio.interfaces.auth import AuthScheme from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy from smithy_core.interceptors import Interceptor -from smithy_core.interfaces import URI -from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.crt import AWSCRTHTTPClient -from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import EXPERT_Q as _SCHEMA_EXPERT_Q from .auth import HTTPAuthSchemeResolver @@ -318,139 +318,134 @@ ] -@dataclass(init=False) -class Config: - """Configuration for QBusiness.""" - - auth_scheme_resolver: HTTPAuthSchemeResolver - """ - An auth scheme resolver that determines the auth scheme for each - operation. - """ - - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] - """A map of auth scheme ids to auth schemes.""" - - aws_access_key_id: str | None - """The identifier for a secret access key.""" - - aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None - ) - """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" +class _AsyncQBusinessConfigOverrides(AwsConfigOverrides, total=False): + endpoint_resolver: EndpointResolver | None + protocol: ClientProtocol[Any, Any] | None + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None - aws_secret_access_key: str | None - """A secret access key that can be used to sign requests.""" - aws_session_token: str | None - """An access key ID that identifies temporary security credentials.""" +@dataclass(kw_only=True, repr=False, init=False) +class AsyncQBusinessConfig(AsyncAwsConfig): + """QBusiness configuration (async-resolved).""" - endpoint_resolver: EndpointResolver + endpoint_resolver: EndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - endpoint_uri: str | URI | None - """A static URI to route requests to.""" - - http_request_config: HTTPRequestConfiguration | None - """Configuration for individual HTTP requests.""" + protocol: ClientProtocol[Any, Any] | None = None + """The protocol to serialize and deserialize requests with.""" - interceptors: list[_ServiceInterceptor] + interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) """ The list of interceptors, which are hooks that are called during the execution of a request. """ - protocol: ClientProtocol[Any, Any] | None - """The protocol to serialize and deserialize requests with.""" + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + """A map of auth scheme ids to auth schemes.""" - region: str | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None = None """ - The AWS region to connect to. The configured region is used to determine - the service endpoint. + An auth scheme resolver that determines the auth scheme for each + operation. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + aws_credentials_identity_resolver: ( + IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + ) = None + """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" + + region: str | None = None """ - The retry strategy or options for configuring retry behavior. Can be - either a configured RetryStrategy or RetryStrategyOptions to create one. + The AWS region to connect to. The configured region is used to determine + the service endpoint. """ - sdk_ua_app_id: str | None + aws_access_key_id: str | None = None + """The identifier for a secret access key.""" + + aws_secret_access_key: str | None = None + """A secret access key that can be used to sign requests.""" + + aws_session_token: str | None = None + """The session token used with temporary AWS credentials.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + sdk_ua_app_id: str | None = None """ A unique and opaque application ID that is appended to the User-Agent header. """ - transport: ClientTransport[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 - streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. - """ - - user_agent_extra: str | None - """Additional suffix to be added to the User-Agent header.""" - - def __init__( - self, - *, - auth_scheme_resolver: HTTPAuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - aws_access_key_id: str | None = None, - aws_credentials_identity_resolver: IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties - ] - | None = None, - aws_secret_access_key: str | None = None, - aws_session_token: str | None = None, - endpoint_resolver: EndpointResolver | None = None, - endpoint_uri: str | URI | None = None, - http_request_config: HTTPRequestConfiguration | None = None, - interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] | None = None, - region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, - sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, - user_agent_extra: str | None = None, - ): - self.auth_scheme_resolver = auth_scheme_resolver or HTTPAuthSchemeResolver() - self.auth_schemes = auth_schemes or { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="qbusiness") - } - self.aws_access_key_id = aws_access_key_id - self.aws_credentials_identity_resolver = aws_credentials_identity_resolver - self.aws_secret_access_key = aws_secret_access_key - self.aws_session_token = aws_session_token - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="qbusiness" - ) - self.endpoint_uri = endpoint_uri - self.http_request_config = http_request_config - self.interceptors = interceptors or [] - self.protocol = protocol or RestJsonClientProtocol(_SCHEMA_EXPERT_Q) - self.region = region - self.retry_strategy = retry_strategy - self.sdk_ua_app_id = sdk_ua_app_id - self.transport = transport or AWSCRTHTTPClient() - self.user_agent_extra = user_agent_extra + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "aws_credentials_identity_resolver": FieldSpec(default=None), + "region": FieldSpec(default=None), + "aws_access_key_id": FieldSpec(default=None), + "aws_secret_access_key": FieldSpec(default=None), + "aws_session_token": FieldSpec(default=None), + "user_agent_extra": FieldSpec(default=None), + "sdk_ua_app_id": FieldSpec(default=None), + **AsyncAwsConfig._FIELDS, + "endpoint_uri": FieldSpec( + default=None, resolver=EndpointUriResolver("qbusiness") + ), + "endpoint_resolver": FieldSpec( + default_factory=lambda: StandardRegionalEndpointsResolver( + endpoint_prefix="qbusiness" + ) + ), + "protocol": FieldSpec( + default_factory=lambda: RestJsonClientProtocol(_SCHEMA_EXPERT_Q) + ), + "auth_schemes": FieldSpec( + default_factory=lambda: { + ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="qbusiness") + } + ), + "auth_scheme_resolver": FieldSpec(default_factory=HTTPAuthSchemeResolver), + "transport": FieldSpec(default_factory=lambda: AWSCRTHTTPClient()), + } def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None: """ - Sets the implementation of an auth scheme. - - Using this method ensures the correct key is used. + Set an auth scheme implementation using its scheme ID. :param scheme: + The auth scheme to add or replace. + """ + auth_schemes = dict(self.auth_schemes or {}) + auth_schemes[scheme.scheme_id] = scheme + self.auth_schemes = auth_schemes - Args: - scheme: - The auth scheme to add. + @classmethod + async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] + cls, + *, + profile: str | None = None, + fs: FileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[_AsyncQBusinessConfigOverrides], + ) -> Self: + """ + Resolve config from environment, config files, defaults, and explicit + overrides. """ - self.auth_schemes[scheme.scheme_id] = scheme + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) -Plugin: TypeAlias = Callable[[Config], None] -"""A callable that allows customizing the config object on each request.""" +Plugin: TypeAlias = Callable[[AsyncQBusinessConfig], None] +""" +A callable that customizes a client configuration. Service-level plugins +are applied once to the base configuration inherited by every operation. +Operation-level plugins apply only to a single operation invocation. +""" diff --git a/clients/aws-sdk-qbusiness/src/aws_sdk_qbusiness/user_agent.py b/clients/aws-sdk-qbusiness/src/aws_sdk_qbusiness/user_agent.py index af061fa..31f7323 100644 --- a/clients/aws-sdk-qbusiness/src/aws_sdk_qbusiness/user_agent.py +++ b/clients/aws-sdk-qbusiness/src/aws_sdk_qbusiness/user_agent.py @@ -3,10 +3,10 @@ from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor from . import __version__ -from .config import Config +from .config import AsyncQBusinessConfig -def aws_user_agent_plugin(config: Config): +def aws_user_agent_plugin(config: AsyncQBusinessConfig): config.interceptors.append( UserAgentInterceptor( ua_suffix=config.user_agent_extra, diff --git a/clients/aws-sdk-qbusiness/tests/test_protocol.py b/clients/aws-sdk-qbusiness/tests/test_restjson_protocol.py similarity index 100% rename from clients/aws-sdk-qbusiness/tests/test_protocol.py rename to clients/aws-sdk-qbusiness/tests/test_restjson_protocol.py diff --git a/clients/aws-sdk-sagemaker-runtime-http2/.changes/0.10.0.json b/clients/aws-sdk-sagemaker-runtime-http2/.changes/0.10.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/clients/aws-sdk-sagemaker-runtime-http2/.changes/0.10.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-sagemaker-runtime-http2/CHANGELOG.md b/clients/aws-sdk-sagemaker-runtime-http2/CHANGELOG.md index 654c67f..404d611 100644 --- a/clients/aws-sdk-sagemaker-runtime-http2/CHANGELOG.md +++ b/clients/aws-sdk-sagemaker-runtime-http2/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### Dependencies diff --git a/clients/aws-sdk-sagemaker-runtime-http2/pyproject.toml b/clients/aws-sdk-sagemaker-runtime-http2/pyproject.toml index e8212fe..30bf9fe 100644 --- a/clients/aws-sdk-sagemaker-runtime-http2/pyproject.toml +++ b/clients/aws-sdk-sagemaker-runtime-http2/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "aws_sdk_sagemaker_runtime_http2" -version = "0.9.0" +version = "0.10.0" description = "aws_sdk_sagemaker_runtime_http2 client" readme = "README.md" requires-python = ">=3.12" @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ - "smithy_aws_core[eventstream, json]~=0.9.0", + "smithy_aws_core[eventstream, json]~=0.10.0", "smithy_core~=0.8.0", "smithy_http[awscrt]~=0.4.0" ] diff --git a/clients/aws-sdk-sagemaker-runtime-http2/scripts/docs/generate_doc_stubs.py b/clients/aws-sdk-sagemaker-runtime-http2/scripts/docs/generate_doc_stubs.py index b00ac66..56ab5a8 100644 --- a/clients/aws-sdk-sagemaker-runtime-http2/scripts/docs/generate_doc_stubs.py +++ b/clients/aws-sdk-sagemaker-runtime-http2/scripts/docs/generate_doc_stubs.py @@ -8,6 +8,7 @@ import argparse import logging +import re import sys from collections.abc import Sequence from dataclasses import dataclass @@ -115,19 +116,43 @@ class ClientInfo: class DocStubGenerator: """Generate markdown API Reference stubs for AWS SDK for Python clients.""" - def __init__(self, client_dir: Path, output_dir: Path) -> None: + def __init__(self, client_dir: Path, output_dir: Path, service_name: str | None = None) -> None: """ Initialize the documentation generator. Args: client_dir: Path to the client source directory output_dir: Path to the output directory for generated doc stubs + service_name: Display name for the service (e.g. the Smithy sdkId + "SNS"). When omitted, falls back to a title-cased derivation of + the package name, which does not preserve acronym casing. """ self.client_dir = client_dir self.output_dir = output_dir - # Extract service name from package name - # (e.g., "aws_sdk_bedrock_runtime" -> "Bedrock Runtime") - self.service_name = client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + # Use the explicit override, then the sdkId from the package, then + # fall back to a title-cased package name (does not keep acronym + # casing, so "sns" becomes "Sns"). + self.service_name = ( + service_name + or self._sdk_id_from_package(client_dir) + or client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + ) + + @staticmethod + def _sdk_id_from_package(client_dir: Path) -> str | None: + """ + Read the authoritative service name (Smithy sdkId) from the package. + + The generated ``_private/schemas.py`` carries the ``aws.api#service`` + trait's ``sdkId`` (e.g. "SNS"), the same field the sidebar navigation + uses, so it keeps acronym casing that the package name does not. + Returns None if the file or value is absent. + """ + schemas = client_dir / "_private" / "schemas.py" + if not schemas.is_file(): + return None + match = re.search(r'"sdkId":\s*"([^"]+)"', schemas.read_text()) + return match.group(1) if match else None def generate(self) -> bool: """ @@ -166,10 +191,13 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: if not client_class: raise ValueError(f"No class ending with 'Client' found in {package_name}.client") - config_class = config_module.members.get("Config") + config_class = self._find_class_with_suffix(config_module, "Config") + if not config_class: + raise ValueError(f"No class ending with 'Config' found in {package_name}.config") + plugin_alias = config_module.members.get("Plugin") - if not config_class or not plugin_alias: - raise ValueError(f"Missing Config or Plugin in {package_name}.config") + if not plugin_alias: + raise ValueError(f"Missing Plugin in {package_name}.config") config = TypeInfo(name=config_class.name, module_path=config_class.path) plugin = TypeInfo(name=plugin_alias.name, module_path=plugin_alias.path) @@ -194,8 +222,12 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: ) def _find_class_with_suffix(self, module: Module, suffix: str) -> Class | None: - """Find the class in the module with a matching suffix.""" + """Find the class defined in the module with a matching suffix.""" for cls in module.classes.values(): + # Skip imported classes so a same-package import (e.g. a *Config + # class re-exported from config.py) can't shadow the defined one. + if cls.is_imported: + continue if cls.name.endswith(suffix): return cls return None @@ -616,6 +648,12 @@ def main() -> int: required=True, help="Output directory for generated doc stubs", ) + parser.add_argument( + "-s", + "--service-name", + default=None, + help="Display name for the service (Smithy sdkId, e.g. 'SNS')", + ) args = parser.parse_args() client_dir = args.client_dir.resolve() @@ -626,7 +664,7 @@ def main() -> int: return 1 try: - generator = DocStubGenerator(client_dir, output_dir) + generator = DocStubGenerator(client_dir, output_dir, args.service_name) success = generator.generate() return 0 if success else 1 except Exception as e: diff --git a/clients/aws-sdk-sagemaker-runtime-http2/src/aws_sdk_sagemaker_runtime_http2/__init__.py b/clients/aws-sdk-sagemaker-runtime-http2/src/aws_sdk_sagemaker_runtime_http2/__init__.py index 7e20a8c..3c99375 100644 --- a/clients/aws-sdk-sagemaker-runtime-http2/src/aws_sdk_sagemaker_runtime_http2/__init__.py +++ b/clients/aws-sdk-sagemaker-runtime-http2/src/aws_sdk_sagemaker_runtime_http2/__init__.py @@ -1,3 +1,3 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -__version__: str = "0.9.0" +__version__: str = "0.10.0" diff --git a/clients/aws-sdk-sagemaker-runtime-http2/src/aws_sdk_sagemaker_runtime_http2/client.py b/clients/aws-sdk-sagemaker-runtime-http2/src/aws_sdk_sagemaker_runtime_http2/client.py index cd17e2e..5a3959c 100644 --- a/clients/aws-sdk-sagemaker-runtime-http2/src/aws_sdk_sagemaker_runtime_http2/client.py +++ b/clients/aws-sdk-sagemaker-runtime-http2/src/aws_sdk_sagemaker_runtime_http2/client.py @@ -1,5 +1,6 @@ # Code generated by smithy-python-codegen DO NOT EDIT. +import asyncio from copy import deepcopy import logging from typing import Any, TYPE_CHECKING @@ -13,7 +14,7 @@ from smithy_core.types import TypedProperties from smithy_http.plugins import user_agent_plugin -from .config import Config, Plugin +from .config import AsyncSageMakerRuntimeHTTP2Config, Plugin from .models import ( INVOKE_ENDPOINT_WITH_BIDIRECTIONAL_STREAM, InvokeEndpointWithBidirectionalStreamInput, @@ -32,7 +33,9 @@ class AsyncSageMakerRuntimeHTTP2Client: """The Amazon SageMaker AI runtime HTTP/2 API.""" def __init__( - self, config: Config | None = None, plugins: list[Plugin] | None = None + self, + config: AsyncSageMakerRuntimeHTTP2Config | None = None, + plugins: list[Plugin] | None = None, ): """ Constructor for `AsyncSageMakerRuntimeHTTP2Client`. @@ -42,19 +45,32 @@ def __init__( Optional configuration for the client. Here you can set things like the endpoint for HTTP services or auth credentials. plugins: - A list of callables that modify the configuration dynamically. These - can be used to set defaults, for example. + A list of callables applied once to the client's base configuration. + Their changes are inherited by every operation invocation. """ - self._config = config or Config() - - client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] - if plugins: - client_plugins.extend(plugins) - - for plugin in client_plugins: - plugin(self._config) - + self._config = config + self._plugins = plugins + self._derive_lock = asyncio.Lock() + self._setup_done = False self._retry_strategy_resolver = RetryStrategyResolver() + self._client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] + + async def _ensure_setup(self) -> None: + if not self._setup_done: + async with self._derive_lock: + if not self._setup_done: + if self._config is None: + config = await AsyncSageMakerRuntimeHTTP2Config.resolve() + else: + # Copy so plugins don't mutate the caller's config. + config = deepcopy(self._config) + for plugin in self._client_plugins: + plugin(config) + if self._plugins: + for plugin in self._plugins: + plugin(config) + self._config = config + self._setup_done = True async def invoke_endpoint_with_bidirectional_stream( self, @@ -117,16 +133,31 @@ async def invoke_endpoint_with_bidirectional_stream( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) diff --git a/clients/aws-sdk-sagemaker-runtime-http2/src/aws_sdk_sagemaker_runtime_http2/config.py b/clients/aws-sdk-sagemaker-runtime-http2/src/aws_sdk_sagemaker_runtime_http2/config.py index 5a9e5b0..3cded56 100644 --- a/clients/aws-sdk-sagemaker-runtime-http2/src/aws_sdk_sagemaker_runtime_http2/config.py +++ b/clients/aws-sdk-sagemaker-runtime-http2/src/aws_sdk_sagemaker_runtime_http2/config.py @@ -1,24 +1,24 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -from dataclasses import dataclass -from typing import Any, Callable, TypeAlias, Union +from dataclasses import dataclass, field +from typing import Any, Callable, ClassVar, Self, TypeAlias, Union, 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.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ClientProtocol, ClientTransport, EndpointResolver +from smithy_core.aio.interfaces import ClientProtocol, EndpointResolver from smithy_core.aio.interfaces.auth import AuthScheme from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy from smithy_core.interceptors import Interceptor -from smithy_core.interfaces import URI -from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.crt import AWSCRTHTTPClient -from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import ( AMAZON_SAGE_MAKER_RUNTIME_HTTP2 as _SCHEMA_AMAZON_SAGE_MAKER_RUNTIME_HTTP2, @@ -40,141 +40,136 @@ ] -@dataclass(init=False) -class Config: - """Configuration for SageMaker Runtime HTTP2.""" - - auth_scheme_resolver: HTTPAuthSchemeResolver - """ - An auth scheme resolver that determines the auth scheme for each - operation. - """ - - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] - """A map of auth scheme ids to auth schemes.""" - - aws_access_key_id: str | None - """The identifier for a secret access key.""" - - aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None - ) - """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" +class _AsyncSageMakerRuntimeHTTP2ConfigOverrides(AwsConfigOverrides, total=False): + endpoint_resolver: EndpointResolver | None + protocol: ClientProtocol[Any, Any] | None + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None - aws_secret_access_key: str | None - """A secret access key that can be used to sign requests.""" - aws_session_token: str | None - """An access key ID that identifies temporary security credentials.""" +@dataclass(kw_only=True, repr=False, init=False) +class AsyncSageMakerRuntimeHTTP2Config(AsyncAwsConfig): + """SageMaker Runtime HTTP2 configuration (async-resolved).""" - endpoint_resolver: EndpointResolver + endpoint_resolver: EndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - endpoint_uri: str | URI | None - """A static URI to route requests to.""" - - http_request_config: HTTPRequestConfiguration | None - """Configuration for individual HTTP requests.""" + protocol: ClientProtocol[Any, Any] | None = None + """The protocol to serialize and deserialize requests with.""" - interceptors: list[_ServiceInterceptor] + interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) """ The list of interceptors, which are hooks that are called during the execution of a request. """ - protocol: ClientProtocol[Any, Any] | None - """The protocol to serialize and deserialize requests with.""" + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + """A map of auth scheme ids to auth schemes.""" - region: str | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None = None """ - The AWS region to connect to. The configured region is used to determine - the service endpoint. + An auth scheme resolver that determines the auth scheme for each + operation. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + aws_credentials_identity_resolver: ( + IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + ) = None + """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" + + region: str | None = None """ - The retry strategy or options for configuring retry behavior. Can be - either a configured RetryStrategy or RetryStrategyOptions to create one. + The AWS region to connect to. The configured region is used to determine + the service endpoint. """ - sdk_ua_app_id: str | None + aws_access_key_id: str | None = None + """The identifier for a secret access key.""" + + aws_secret_access_key: str | None = None + """A secret access key that can be used to sign requests.""" + + aws_session_token: str | None = None + """The session token used with temporary AWS credentials.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + sdk_ua_app_id: str | None = None """ A unique and opaque application ID that is appended to the User-Agent header. """ - transport: ClientTransport[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 - streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. - """ - - user_agent_extra: str | None - """Additional suffix to be added to the User-Agent header.""" - - def __init__( - self, - *, - auth_scheme_resolver: HTTPAuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - aws_access_key_id: str | None = None, - aws_credentials_identity_resolver: IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties - ] - | None = None, - aws_secret_access_key: str | None = None, - aws_session_token: str | None = None, - endpoint_resolver: EndpointResolver | None = None, - endpoint_uri: str | URI | None = None, - http_request_config: HTTPRequestConfiguration | None = None, - interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] | None = None, - region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, - sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, - user_agent_extra: str | None = None, - ): - self.auth_scheme_resolver = auth_scheme_resolver or HTTPAuthSchemeResolver() - self.auth_schemes = auth_schemes or { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="sagemaker") - } - self.aws_access_key_id = aws_access_key_id - self.aws_credentials_identity_resolver = aws_credentials_identity_resolver - self.aws_secret_access_key = aws_secret_access_key - self.aws_session_token = aws_session_token - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="runtime.sagemaker" - ) - self.endpoint_uri = endpoint_uri - self.http_request_config = http_request_config - self.interceptors = interceptors or [] - self.protocol = protocol or RestJsonClientProtocol( - _SCHEMA_AMAZON_SAGE_MAKER_RUNTIME_HTTP2 - ) - self.region = region - self.retry_strategy = retry_strategy - self.sdk_ua_app_id = sdk_ua_app_id - self.transport = transport or AWSCRTHTTPClient() - self.user_agent_extra = user_agent_extra + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "aws_credentials_identity_resolver": FieldSpec(default=None), + "region": FieldSpec(default=None), + "aws_access_key_id": FieldSpec(default=None), + "aws_secret_access_key": FieldSpec(default=None), + "aws_session_token": FieldSpec(default=None), + "user_agent_extra": FieldSpec(default=None), + "sdk_ua_app_id": FieldSpec(default=None), + **AsyncAwsConfig._FIELDS, + "endpoint_uri": FieldSpec( + default=None, resolver=EndpointUriResolver("sagemaker_runtime_http2") + ), + "endpoint_resolver": FieldSpec( + default_factory=lambda: StandardRegionalEndpointsResolver( + endpoint_prefix="runtime.sagemaker" + ) + ), + "protocol": FieldSpec( + default_factory=lambda: RestJsonClientProtocol( + _SCHEMA_AMAZON_SAGE_MAKER_RUNTIME_HTTP2 + ) + ), + "auth_schemes": FieldSpec( + default_factory=lambda: { + ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="sagemaker") + } + ), + "auth_scheme_resolver": FieldSpec(default_factory=HTTPAuthSchemeResolver), + "transport": FieldSpec(default_factory=lambda: AWSCRTHTTPClient()), + } def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None: """ - Sets the implementation of an auth scheme. - - Using this method ensures the correct key is used. + Set an auth scheme implementation using its scheme ID. :param scheme: + The auth scheme to add or replace. + """ + auth_schemes = dict(self.auth_schemes or {}) + auth_schemes[scheme.scheme_id] = scheme + self.auth_schemes = auth_schemes - Args: - scheme: - The auth scheme to add. + @classmethod + async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] + cls, + *, + profile: str | None = None, + fs: FileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[_AsyncSageMakerRuntimeHTTP2ConfigOverrides], + ) -> Self: + """ + Resolve config from environment, config files, defaults, and explicit + overrides. """ - self.auth_schemes[scheme.scheme_id] = scheme + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) -Plugin: TypeAlias = Callable[[Config], None] -"""A callable that allows customizing the config object on each request.""" +Plugin: TypeAlias = Callable[[AsyncSageMakerRuntimeHTTP2Config], None] +""" +A callable that customizes a client configuration. Service-level plugins +are applied once to the base configuration inherited by every operation. +Operation-level plugins apply only to a single operation invocation. +""" diff --git a/clients/aws-sdk-sagemaker-runtime-http2/src/aws_sdk_sagemaker_runtime_http2/user_agent.py b/clients/aws-sdk-sagemaker-runtime-http2/src/aws_sdk_sagemaker_runtime_http2/user_agent.py index 643af39..1e2a67f 100644 --- a/clients/aws-sdk-sagemaker-runtime-http2/src/aws_sdk_sagemaker_runtime_http2/user_agent.py +++ b/clients/aws-sdk-sagemaker-runtime-http2/src/aws_sdk_sagemaker_runtime_http2/user_agent.py @@ -3,10 +3,10 @@ from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor from . import __version__ -from .config import Config +from .config import AsyncSageMakerRuntimeHTTP2Config -def aws_user_agent_plugin(config: Config): +def aws_user_agent_plugin(config: AsyncSageMakerRuntimeHTTP2Config): config.interceptors.append( UserAgentInterceptor( ua_suffix=config.user_agent_extra, diff --git a/clients/aws-sdk-sagemaker-runtime-http2/tests/test_protocol.py b/clients/aws-sdk-sagemaker-runtime-http2/tests/test_restjson_protocol.py similarity index 100% rename from clients/aws-sdk-sagemaker-runtime-http2/tests/test_protocol.py rename to clients/aws-sdk-sagemaker-runtime-http2/tests/test_restjson_protocol.py diff --git a/clients/aws-sdk-sns/.changes/0.10.0.json b/clients/aws-sdk-sns/.changes/0.10.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/clients/aws-sdk-sns/.changes/0.10.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-sns/CHANGELOG.md b/clients/aws-sdk-sns/CHANGELOG.md index d1dd537..759d97d 100644 --- a/clients/aws-sdk-sns/CHANGELOG.md +++ b/clients/aws-sdk-sns/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### Dependencies diff --git a/clients/aws-sdk-sns/pyproject.toml b/clients/aws-sdk-sns/pyproject.toml index 0422c8b..1138c23 100644 --- a/clients/aws-sdk-sns/pyproject.toml +++ b/clients/aws-sdk-sns/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "aws_sdk_sns" -version = "0.9.0" +version = "0.10.0" description = "aws_sdk_sns client" readme = "README.md" requires-python = ">=3.12" @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ - "smithy_aws_core[xml]~=0.9.0", + "smithy_aws_core[xml]~=0.10.0", "smithy_core~=0.8.0", "smithy_http[aiohttp]~=0.4.0" ] diff --git a/clients/aws-sdk-sns/scripts/docs/generate_doc_stubs.py b/clients/aws-sdk-sns/scripts/docs/generate_doc_stubs.py index b00ac66..56ab5a8 100644 --- a/clients/aws-sdk-sns/scripts/docs/generate_doc_stubs.py +++ b/clients/aws-sdk-sns/scripts/docs/generate_doc_stubs.py @@ -8,6 +8,7 @@ import argparse import logging +import re import sys from collections.abc import Sequence from dataclasses import dataclass @@ -115,19 +116,43 @@ class ClientInfo: class DocStubGenerator: """Generate markdown API Reference stubs for AWS SDK for Python clients.""" - def __init__(self, client_dir: Path, output_dir: Path) -> None: + def __init__(self, client_dir: Path, output_dir: Path, service_name: str | None = None) -> None: """ Initialize the documentation generator. Args: client_dir: Path to the client source directory output_dir: Path to the output directory for generated doc stubs + service_name: Display name for the service (e.g. the Smithy sdkId + "SNS"). When omitted, falls back to a title-cased derivation of + the package name, which does not preserve acronym casing. """ self.client_dir = client_dir self.output_dir = output_dir - # Extract service name from package name - # (e.g., "aws_sdk_bedrock_runtime" -> "Bedrock Runtime") - self.service_name = client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + # Use the explicit override, then the sdkId from the package, then + # fall back to a title-cased package name (does not keep acronym + # casing, so "sns" becomes "Sns"). + self.service_name = ( + service_name + or self._sdk_id_from_package(client_dir) + or client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + ) + + @staticmethod + def _sdk_id_from_package(client_dir: Path) -> str | None: + """ + Read the authoritative service name (Smithy sdkId) from the package. + + The generated ``_private/schemas.py`` carries the ``aws.api#service`` + trait's ``sdkId`` (e.g. "SNS"), the same field the sidebar navigation + uses, so it keeps acronym casing that the package name does not. + Returns None if the file or value is absent. + """ + schemas = client_dir / "_private" / "schemas.py" + if not schemas.is_file(): + return None + match = re.search(r'"sdkId":\s*"([^"]+)"', schemas.read_text()) + return match.group(1) if match else None def generate(self) -> bool: """ @@ -166,10 +191,13 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: if not client_class: raise ValueError(f"No class ending with 'Client' found in {package_name}.client") - config_class = config_module.members.get("Config") + config_class = self._find_class_with_suffix(config_module, "Config") + if not config_class: + raise ValueError(f"No class ending with 'Config' found in {package_name}.config") + plugin_alias = config_module.members.get("Plugin") - if not config_class or not plugin_alias: - raise ValueError(f"Missing Config or Plugin in {package_name}.config") + if not plugin_alias: + raise ValueError(f"Missing Plugin in {package_name}.config") config = TypeInfo(name=config_class.name, module_path=config_class.path) plugin = TypeInfo(name=plugin_alias.name, module_path=plugin_alias.path) @@ -194,8 +222,12 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: ) def _find_class_with_suffix(self, module: Module, suffix: str) -> Class | None: - """Find the class in the module with a matching suffix.""" + """Find the class defined in the module with a matching suffix.""" for cls in module.classes.values(): + # Skip imported classes so a same-package import (e.g. a *Config + # class re-exported from config.py) can't shadow the defined one. + if cls.is_imported: + continue if cls.name.endswith(suffix): return cls return None @@ -616,6 +648,12 @@ def main() -> int: required=True, help="Output directory for generated doc stubs", ) + parser.add_argument( + "-s", + "--service-name", + default=None, + help="Display name for the service (Smithy sdkId, e.g. 'SNS')", + ) args = parser.parse_args() client_dir = args.client_dir.resolve() @@ -626,7 +664,7 @@ def main() -> int: return 1 try: - generator = DocStubGenerator(client_dir, output_dir) + generator = DocStubGenerator(client_dir, output_dir, args.service_name) success = generator.generate() return 0 if success else 1 except Exception as e: diff --git a/clients/aws-sdk-sns/src/aws_sdk_sns/__init__.py b/clients/aws-sdk-sns/src/aws_sdk_sns/__init__.py index 7e20a8c..3c99375 100644 --- a/clients/aws-sdk-sns/src/aws_sdk_sns/__init__.py +++ b/clients/aws-sdk-sns/src/aws_sdk_sns/__init__.py @@ -1,3 +1,3 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -__version__: str = "0.9.0" +__version__: str = "0.10.0" diff --git a/clients/aws-sdk-sns/src/aws_sdk_sns/client.py b/clients/aws-sdk-sns/src/aws_sdk_sns/client.py index 119b694..31e0a7b 100644 --- a/clients/aws-sdk-sns/src/aws_sdk_sns/client.py +++ b/clients/aws-sdk-sns/src/aws_sdk_sns/client.py @@ -1,5 +1,6 @@ # Code generated by smithy-python-codegen DO NOT EDIT. +import asyncio from copy import deepcopy import logging @@ -10,7 +11,7 @@ from smithy_core.types import TypedProperties from smithy_http.plugins import user_agent_plugin -from .config import Config, Plugin +from .config import AsyncSNSConfig, Plugin from .models import ( ADD_PERMISSION, AddPermissionInput, @@ -170,7 +171,7 @@ class AsyncSNSClient: """ def __init__( - self, config: Config | None = None, plugins: list[Plugin] | None = None + self, config: AsyncSNSConfig | None = None, plugins: list[Plugin] | None = None ): """ Constructor for `AsyncSNSClient`. @@ -180,19 +181,32 @@ def __init__( Optional configuration for the client. Here you can set things like the endpoint for HTTP services or auth credentials. plugins: - A list of callables that modify the configuration dynamically. These - can be used to set defaults, for example. + A list of callables applied once to the client's base configuration. + Their changes are inherited by every operation invocation. """ - self._config = config or Config() - - client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] - if plugins: - client_plugins.extend(plugins) - - for plugin in client_plugins: - plugin(self._config) - + self._config = config + self._plugins = plugins + self._derive_lock = asyncio.Lock() + self._setup_done = False self._retry_strategy_resolver = RetryStrategyResolver() + self._client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] + + async def _ensure_setup(self) -> None: + if not self._setup_done: + async with self._derive_lock: + if not self._setup_done: + if self._config is None: + config = await AsyncSNSConfig.resolve() + else: + # Copy so plugins don't mutate the caller's config. + config = deepcopy(self._config) + for plugin in self._client_plugins: + plugin(config) + if self._plugins: + for plugin in self._plugins: + plugin(config) + self._config = config + self._setup_done = True async def add_permission( self, input: AddPermissionInput, plugins: list[Plugin] | None = None @@ -221,16 +235,31 @@ async def add_permission( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -275,16 +304,31 @@ async def check_if_phone_number_is_opted_out( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -326,16 +370,31 @@ async def confirm_subscription( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -414,16 +473,31 @@ async def create_platform_application( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -477,16 +551,31 @@ async def create_platform_endpoint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -538,16 +627,31 @@ async def create_sms_sandbox_phone_number( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -591,16 +695,31 @@ async def create_topic( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -644,16 +763,31 @@ async def delete_endpoint( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -694,16 +828,31 @@ async def delete_platform_application( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -755,16 +904,31 @@ async def delete_sms_sandbox_phone_number( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -805,16 +969,31 @@ async def delete_topic( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -853,16 +1032,31 @@ async def get_data_protection_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -903,16 +1097,31 @@ async def get_endpoint_attributes( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -956,16 +1165,31 @@ async def get_platform_application_attributes( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1006,16 +1230,31 @@ async def get_sms_attributes( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1067,16 +1306,31 @@ async def get_sms_sandbox_account_status( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1114,16 +1368,31 @@ async def get_subscription_attributes( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1162,16 +1431,31 @@ async def get_topic_attributes( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1223,16 +1507,31 @@ async def list_endpoints_by_platform_application( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1274,16 +1573,31 @@ async def list_origination_numbers( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1330,16 +1644,31 @@ async def list_phone_numbers_opted_out( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1388,16 +1717,31 @@ async def list_platform_applications( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1449,16 +1793,31 @@ async def list_sms_sandbox_phone_numbers( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1501,16 +1860,31 @@ async def list_subscriptions( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1554,16 +1928,31 @@ async def list_subscriptions_by_topic( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1604,16 +1993,31 @@ async def list_tags_for_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1656,16 +2060,31 @@ async def list_topics( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1706,16 +2125,31 @@ async def opt_in_phone_number( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1775,16 +2209,31 @@ async def publish( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1861,16 +2310,31 @@ async def publish_batch( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1909,16 +2373,31 @@ async def put_data_protection_policy( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1961,16 +2440,31 @@ async def remove_permission( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2011,16 +2505,31 @@ async def set_endpoint_attributes( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2066,16 +2575,31 @@ async def set_platform_application_attributes( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2124,16 +2648,31 @@ async def set_sms_attributes( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2172,16 +2711,31 @@ async def set_subscription_attributes( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2224,16 +2778,31 @@ async def set_topic_attributes( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2279,16 +2848,31 @@ async def subscribe( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2345,16 +2929,31 @@ async def tag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2400,16 +2999,31 @@ async def unsubscribe( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2450,16 +3064,31 @@ async def untag_resource( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -2511,16 +3140,31 @@ async def verify_sms_sandbox_phone_number( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) diff --git a/clients/aws-sdk-sns/src/aws_sdk_sns/config.py b/clients/aws-sdk-sns/src/aws_sdk_sns/config.py index 5ba408b..f2a0daf 100644 --- a/clients/aws-sdk-sns/src/aws_sdk_sns/config.py +++ b/clients/aws-sdk-sns/src/aws_sdk_sns/config.py @@ -1,24 +1,24 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -from dataclasses import dataclass -from typing import Any, Callable, TypeAlias, Union +from dataclasses import dataclass, field +from typing import Any, Callable, ClassVar, Self, TypeAlias, Union, 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.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ClientProtocol, ClientTransport, EndpointResolver +from smithy_core.aio.interfaces import ClientProtocol, EndpointResolver from smithy_core.aio.interfaces.auth import AuthScheme from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy from smithy_core.interceptors import Interceptor -from smithy_core.interfaces import URI -from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.aiohttp import AIOHTTPClient -from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import ( AMAZON_SIMPLE_NOTIFICATION_SERVICE as _SCHEMA_AMAZON_SIMPLE_NOTIFICATION_SERVICE, @@ -199,141 +199,134 @@ ] -@dataclass(init=False) -class Config: - """Configuration for SNS.""" - - auth_scheme_resolver: HTTPAuthSchemeResolver - """ - An auth scheme resolver that determines the auth scheme for each - operation. - """ - - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] - """A map of auth scheme ids to auth schemes.""" - - aws_access_key_id: str | None - """The identifier for a secret access key.""" - - aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None - ) - """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" +class _AsyncSNSConfigOverrides(AwsConfigOverrides, total=False): + endpoint_resolver: EndpointResolver | None + protocol: ClientProtocol[Any, Any] | None + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None - aws_secret_access_key: str | None - """A secret access key that can be used to sign requests.""" - aws_session_token: str | None - """An access key ID that identifies temporary security credentials.""" +@dataclass(kw_only=True, repr=False, init=False) +class AsyncSNSConfig(AsyncAwsConfig): + """SNS configuration (async-resolved).""" - endpoint_resolver: EndpointResolver + endpoint_resolver: EndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - endpoint_uri: str | URI | None - """A static URI to route requests to.""" - - http_request_config: HTTPRequestConfiguration | None - """Configuration for individual HTTP requests.""" + protocol: ClientProtocol[Any, Any] | None = None + """The protocol to serialize and deserialize requests with.""" - interceptors: list[_ServiceInterceptor] + interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) """ The list of interceptors, which are hooks that are called during the execution of a request. """ - protocol: ClientProtocol[Any, Any] | None - """The protocol to serialize and deserialize requests with.""" + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + """A map of auth scheme ids to auth schemes.""" - region: str | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None = None """ - The AWS region to connect to. The configured region is used to determine - the service endpoint. + An auth scheme resolver that determines the auth scheme for each + operation. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + aws_credentials_identity_resolver: ( + IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + ) = None + """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" + + region: str | None = None """ - The retry strategy or options for configuring retry behavior. Can be - either a configured RetryStrategy or RetryStrategyOptions to create one. + The AWS region to connect to. The configured region is used to determine + the service endpoint. """ - sdk_ua_app_id: str | None + aws_access_key_id: str | None = None + """The identifier for a secret access key.""" + + aws_secret_access_key: str | None = None + """A secret access key that can be used to sign requests.""" + + aws_session_token: str | None = None + """The session token used with temporary AWS credentials.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + sdk_ua_app_id: str | None = None """ A unique and opaque application ID that is appended to the User-Agent header. """ - transport: ClientTransport[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 - streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. - """ - - user_agent_extra: str | None - """Additional suffix to be added to the User-Agent header.""" - - def __init__( - self, - *, - auth_scheme_resolver: HTTPAuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - aws_access_key_id: str | None = None, - aws_credentials_identity_resolver: IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties - ] - | None = None, - aws_secret_access_key: str | None = None, - aws_session_token: str | None = None, - endpoint_resolver: EndpointResolver | None = None, - endpoint_uri: str | URI | None = None, - http_request_config: HTTPRequestConfiguration | None = None, - interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] | None = None, - region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, - sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, - user_agent_extra: str | None = None, - ): - self.auth_scheme_resolver = auth_scheme_resolver or HTTPAuthSchemeResolver() - self.auth_schemes = auth_schemes or { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="sns") - } - self.aws_access_key_id = aws_access_key_id - self.aws_credentials_identity_resolver = aws_credentials_identity_resolver - self.aws_secret_access_key = aws_secret_access_key - self.aws_session_token = aws_session_token - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="sns" - ) - self.endpoint_uri = endpoint_uri - self.http_request_config = http_request_config - self.interceptors = interceptors or [] - self.protocol = protocol or AwsQueryClientProtocol( - _SCHEMA_AMAZON_SIMPLE_NOTIFICATION_SERVICE, "2010-03-31" - ) - self.region = region - self.retry_strategy = retry_strategy - self.sdk_ua_app_id = sdk_ua_app_id - self.transport = transport or AIOHTTPClient() - self.user_agent_extra = user_agent_extra + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "aws_credentials_identity_resolver": FieldSpec(default=None), + "region": FieldSpec(default=None), + "aws_access_key_id": FieldSpec(default=None), + "aws_secret_access_key": FieldSpec(default=None), + "aws_session_token": FieldSpec(default=None), + "user_agent_extra": FieldSpec(default=None), + "sdk_ua_app_id": FieldSpec(default=None), + **AsyncAwsConfig._FIELDS, + "endpoint_uri": FieldSpec(default=None, resolver=EndpointUriResolver("sns")), + "endpoint_resolver": FieldSpec( + default_factory=lambda: StandardRegionalEndpointsResolver( + endpoint_prefix="sns" + ) + ), + "protocol": FieldSpec( + default_factory=lambda: AwsQueryClientProtocol( + _SCHEMA_AMAZON_SIMPLE_NOTIFICATION_SERVICE, "2010-03-31" + ) + ), + "auth_schemes": FieldSpec( + default_factory=lambda: { + ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="sns") + } + ), + "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: """ - Sets the implementation of an auth scheme. - - Using this method ensures the correct key is used. + Set an auth scheme implementation using its scheme ID. :param scheme: + The auth scheme to add or replace. + """ + auth_schemes = dict(self.auth_schemes or {}) + auth_schemes[scheme.scheme_id] = scheme + self.auth_schemes = auth_schemes - Args: - scheme: - The auth scheme to add. + @classmethod + async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] + cls, + *, + profile: str | None = None, + fs: FileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[_AsyncSNSConfigOverrides], + ) -> Self: + """ + Resolve config from environment, config files, defaults, and explicit + overrides. """ - self.auth_schemes[scheme.scheme_id] = scheme + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) -Plugin: TypeAlias = Callable[[Config], None] -"""A callable that allows customizing the config object on each request.""" +Plugin: TypeAlias = Callable[[AsyncSNSConfig], None] +""" +A callable that customizes a client configuration. Service-level plugins +are applied once to the base configuration inherited by every operation. +Operation-level plugins apply only to a single operation invocation. +""" diff --git a/clients/aws-sdk-sns/src/aws_sdk_sns/user_agent.py b/clients/aws-sdk-sns/src/aws_sdk_sns/user_agent.py index 05dec1c..c6cfd32 100644 --- a/clients/aws-sdk-sns/src/aws_sdk_sns/user_agent.py +++ b/clients/aws-sdk-sns/src/aws_sdk_sns/user_agent.py @@ -3,10 +3,10 @@ from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor from . import __version__ -from .config import Config +from .config import AsyncSNSConfig -def aws_user_agent_plugin(config: Config): +def aws_user_agent_plugin(config: AsyncSNSConfig): config.interceptors.append( UserAgentInterceptor( ua_suffix=config.user_agent_extra, diff --git a/clients/aws-sdk-sts/.changes/0.10.0.json b/clients/aws-sdk-sts/.changes/0.10.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/clients/aws-sdk-sts/.changes/0.10.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-sts/CHANGELOG.md b/clients/aws-sdk-sts/CHANGELOG.md index 30ef1f5..8c444e2 100644 --- a/clients/aws-sdk-sts/CHANGELOG.md +++ b/clients/aws-sdk-sts/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### Dependencies diff --git a/clients/aws-sdk-sts/pyproject.toml b/clients/aws-sdk-sts/pyproject.toml index 6cb91f5..c907fcd 100644 --- a/clients/aws-sdk-sts/pyproject.toml +++ b/clients/aws-sdk-sts/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "aws_sdk_sts" -version = "0.9.0" +version = "0.10.0" description = "aws_sdk_sts client" readme = "README.md" requires-python = ">=3.12" @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ - "smithy_aws_core[xml]~=0.9.0", + "smithy_aws_core[xml]~=0.10.0", "smithy_core~=0.8.0", "smithy_http[aiohttp]~=0.4.0" ] diff --git a/clients/aws-sdk-sts/scripts/docs/generate_doc_stubs.py b/clients/aws-sdk-sts/scripts/docs/generate_doc_stubs.py index b00ac66..56ab5a8 100644 --- a/clients/aws-sdk-sts/scripts/docs/generate_doc_stubs.py +++ b/clients/aws-sdk-sts/scripts/docs/generate_doc_stubs.py @@ -8,6 +8,7 @@ import argparse import logging +import re import sys from collections.abc import Sequence from dataclasses import dataclass @@ -115,19 +116,43 @@ class ClientInfo: class DocStubGenerator: """Generate markdown API Reference stubs for AWS SDK for Python clients.""" - def __init__(self, client_dir: Path, output_dir: Path) -> None: + def __init__(self, client_dir: Path, output_dir: Path, service_name: str | None = None) -> None: """ Initialize the documentation generator. Args: client_dir: Path to the client source directory output_dir: Path to the output directory for generated doc stubs + service_name: Display name for the service (e.g. the Smithy sdkId + "SNS"). When omitted, falls back to a title-cased derivation of + the package name, which does not preserve acronym casing. """ self.client_dir = client_dir self.output_dir = output_dir - # Extract service name from package name - # (e.g., "aws_sdk_bedrock_runtime" -> "Bedrock Runtime") - self.service_name = client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + # Use the explicit override, then the sdkId from the package, then + # fall back to a title-cased package name (does not keep acronym + # casing, so "sns" becomes "Sns"). + self.service_name = ( + service_name + or self._sdk_id_from_package(client_dir) + or client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + ) + + @staticmethod + def _sdk_id_from_package(client_dir: Path) -> str | None: + """ + Read the authoritative service name (Smithy sdkId) from the package. + + The generated ``_private/schemas.py`` carries the ``aws.api#service`` + trait's ``sdkId`` (e.g. "SNS"), the same field the sidebar navigation + uses, so it keeps acronym casing that the package name does not. + Returns None if the file or value is absent. + """ + schemas = client_dir / "_private" / "schemas.py" + if not schemas.is_file(): + return None + match = re.search(r'"sdkId":\s*"([^"]+)"', schemas.read_text()) + return match.group(1) if match else None def generate(self) -> bool: """ @@ -166,10 +191,13 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: if not client_class: raise ValueError(f"No class ending with 'Client' found in {package_name}.client") - config_class = config_module.members.get("Config") + config_class = self._find_class_with_suffix(config_module, "Config") + if not config_class: + raise ValueError(f"No class ending with 'Config' found in {package_name}.config") + plugin_alias = config_module.members.get("Plugin") - if not config_class or not plugin_alias: - raise ValueError(f"Missing Config or Plugin in {package_name}.config") + if not plugin_alias: + raise ValueError(f"Missing Plugin in {package_name}.config") config = TypeInfo(name=config_class.name, module_path=config_class.path) plugin = TypeInfo(name=plugin_alias.name, module_path=plugin_alias.path) @@ -194,8 +222,12 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: ) def _find_class_with_suffix(self, module: Module, suffix: str) -> Class | None: - """Find the class in the module with a matching suffix.""" + """Find the class defined in the module with a matching suffix.""" for cls in module.classes.values(): + # Skip imported classes so a same-package import (e.g. a *Config + # class re-exported from config.py) can't shadow the defined one. + if cls.is_imported: + continue if cls.name.endswith(suffix): return cls return None @@ -616,6 +648,12 @@ def main() -> int: required=True, help="Output directory for generated doc stubs", ) + parser.add_argument( + "-s", + "--service-name", + default=None, + help="Display name for the service (Smithy sdkId, e.g. 'SNS')", + ) args = parser.parse_args() client_dir = args.client_dir.resolve() @@ -626,7 +664,7 @@ def main() -> int: return 1 try: - generator = DocStubGenerator(client_dir, output_dir) + generator = DocStubGenerator(client_dir, output_dir, args.service_name) success = generator.generate() return 0 if success else 1 except Exception as e: diff --git a/clients/aws-sdk-sts/src/aws_sdk_sts/__init__.py b/clients/aws-sdk-sts/src/aws_sdk_sts/__init__.py index 7e20a8c..3c99375 100644 --- a/clients/aws-sdk-sts/src/aws_sdk_sts/__init__.py +++ b/clients/aws-sdk-sts/src/aws_sdk_sts/__init__.py @@ -1,3 +1,3 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -__version__: str = "0.9.0" +__version__: str = "0.10.0" diff --git a/clients/aws-sdk-sts/src/aws_sdk_sts/client.py b/clients/aws-sdk-sts/src/aws_sdk_sts/client.py index 0e95045..ac166ed 100644 --- a/clients/aws-sdk-sts/src/aws_sdk_sts/client.py +++ b/clients/aws-sdk-sts/src/aws_sdk_sts/client.py @@ -1,5 +1,6 @@ # Code generated by smithy-python-codegen DO NOT EDIT. +import asyncio from copy import deepcopy import logging @@ -10,7 +11,7 @@ from smithy_core.types import TypedProperties from smithy_http.plugins import user_agent_plugin -from .config import Config, Plugin +from .config import AsyncSTSConfig, Plugin from .models import ( ASSUME_ROLE, ASSUME_ROLE_WITH_SAML, @@ -62,7 +63,7 @@ class AsyncSTSClient: """ def __init__( - self, config: Config | None = None, plugins: list[Plugin] | None = None + self, config: AsyncSTSConfig | None = None, plugins: list[Plugin] | None = None ): """ Constructor for `AsyncSTSClient`. @@ -72,19 +73,32 @@ def __init__( Optional configuration for the client. Here you can set things like the endpoint for HTTP services or auth credentials. plugins: - A list of callables that modify the configuration dynamically. These - can be used to set defaults, for example. + A list of callables applied once to the client's base configuration. + Their changes are inherited by every operation invocation. """ - self._config = config or Config() - - client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] - if plugins: - client_plugins.extend(plugins) - - for plugin in client_plugins: - plugin(self._config) - + self._config = config + self._plugins = plugins + self._derive_lock = asyncio.Lock() + self._setup_done = False self._retry_strategy_resolver = RetryStrategyResolver() + self._client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] + + async def _ensure_setup(self) -> None: + if not self._setup_done: + async with self._derive_lock: + if not self._setup_done: + if self._config is None: + config = await AsyncSTSConfig.resolve() + else: + # Copy so plugins don't mutate the caller's config. + config = deepcopy(self._config) + for plugin in self._client_plugins: + plugin(config) + if self._plugins: + for plugin in self._plugins: + plugin(config) + self._config = config + self._setup_done = True async def assume_role( self, input: AssumeRoleInput, plugins: list[Plugin] | None = None @@ -215,16 +229,31 @@ async def assume_role( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -418,16 +447,31 @@ async def assume_role_with_saml( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -618,16 +662,31 @@ async def assume_role_with_web_identity( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -697,16 +756,31 @@ async def assume_root( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -784,16 +858,31 @@ async def decode_authorization_message( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -858,16 +947,31 @@ async def get_access_key_info( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -916,16 +1020,31 @@ async def get_caller_identity( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -967,16 +1086,31 @@ async def get_delegated_access_token( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1128,16 +1262,31 @@ async def get_federation_token( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1243,16 +1392,31 @@ async def get_session_token( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -1294,16 +1458,31 @@ async def get_web_identity_token( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) diff --git a/clients/aws-sdk-sts/src/aws_sdk_sts/config.py b/clients/aws-sdk-sts/src/aws_sdk_sts/config.py index f9105b3..c3f6652 100644 --- a/clients/aws-sdk-sts/src/aws_sdk_sts/config.py +++ b/clients/aws-sdk-sts/src/aws_sdk_sts/config.py @@ -1,24 +1,24 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -from dataclasses import dataclass -from typing import Any, Callable, TypeAlias, Union +from dataclasses import dataclass, field +from typing import Any, Callable, ClassVar, Self, TypeAlias, Union, 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.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ClientProtocol, ClientTransport, EndpointResolver +from smithy_core.aio.interfaces import ClientProtocol, EndpointResolver from smithy_core.aio.interfaces.auth import AuthScheme from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy from smithy_core.interceptors import Interceptor -from smithy_core.interfaces import URI -from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.aiohttp import AIOHTTPClient -from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import ( AWS_SECURITY_TOKEN_SERVICE_V20110615 as _SCHEMA_AWS_SECURITY_TOKEN_SERVICE_V20110615, @@ -69,141 +69,134 @@ ] -@dataclass(init=False) -class Config: - """Configuration for STS.""" - - auth_scheme_resolver: HTTPAuthSchemeResolver - """ - An auth scheme resolver that determines the auth scheme for each - operation. - """ - - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] - """A map of auth scheme ids to auth schemes.""" - - aws_access_key_id: str | None - """The identifier for a secret access key.""" - - aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None - ) - """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" +class _AsyncSTSConfigOverrides(AwsConfigOverrides, total=False): + endpoint_resolver: EndpointResolver | None + protocol: ClientProtocol[Any, Any] | None + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None - aws_secret_access_key: str | None - """A secret access key that can be used to sign requests.""" - aws_session_token: str | None - """An access key ID that identifies temporary security credentials.""" +@dataclass(kw_only=True, repr=False, init=False) +class AsyncSTSConfig(AsyncAwsConfig): + """STS configuration (async-resolved).""" - endpoint_resolver: EndpointResolver + endpoint_resolver: EndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - endpoint_uri: str | URI | None - """A static URI to route requests to.""" - - http_request_config: HTTPRequestConfiguration | None - """Configuration for individual HTTP requests.""" + protocol: ClientProtocol[Any, Any] | None = None + """The protocol to serialize and deserialize requests with.""" - interceptors: list[_ServiceInterceptor] + interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) """ The list of interceptors, which are hooks that are called during the execution of a request. """ - protocol: ClientProtocol[Any, Any] | None - """The protocol to serialize and deserialize requests with.""" + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + """A map of auth scheme ids to auth schemes.""" - region: str | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None = None """ - The AWS region to connect to. The configured region is used to determine - the service endpoint. + An auth scheme resolver that determines the auth scheme for each + operation. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + aws_credentials_identity_resolver: ( + IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + ) = None + """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" + + region: str | None = None """ - The retry strategy or options for configuring retry behavior. Can be - either a configured RetryStrategy or RetryStrategyOptions to create one. + The AWS region to connect to. The configured region is used to determine + the service endpoint. """ - sdk_ua_app_id: str | None + aws_access_key_id: str | None = None + """The identifier for a secret access key.""" + + aws_secret_access_key: str | None = None + """A secret access key that can be used to sign requests.""" + + aws_session_token: str | None = None + """The session token used with temporary AWS credentials.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + sdk_ua_app_id: str | None = None """ A unique and opaque application ID that is appended to the User-Agent header. """ - transport: ClientTransport[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 - streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. - """ - - user_agent_extra: str | None - """Additional suffix to be added to the User-Agent header.""" - - def __init__( - self, - *, - auth_scheme_resolver: HTTPAuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - aws_access_key_id: str | None = None, - aws_credentials_identity_resolver: IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties - ] - | None = None, - aws_secret_access_key: str | None = None, - aws_session_token: str | None = None, - endpoint_resolver: EndpointResolver | None = None, - endpoint_uri: str | URI | None = None, - http_request_config: HTTPRequestConfiguration | None = None, - interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] | None = None, - region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, - sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, - user_agent_extra: str | None = None, - ): - self.auth_scheme_resolver = auth_scheme_resolver or HTTPAuthSchemeResolver() - self.auth_schemes = auth_schemes or { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="sts") - } - self.aws_access_key_id = aws_access_key_id - self.aws_credentials_identity_resolver = aws_credentials_identity_resolver - self.aws_secret_access_key = aws_secret_access_key - self.aws_session_token = aws_session_token - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="sts" - ) - self.endpoint_uri = endpoint_uri - self.http_request_config = http_request_config - self.interceptors = interceptors or [] - self.protocol = protocol or AwsQueryClientProtocol( - _SCHEMA_AWS_SECURITY_TOKEN_SERVICE_V20110615, "2011-06-15" - ) - self.region = region - self.retry_strategy = retry_strategy - self.sdk_ua_app_id = sdk_ua_app_id - self.transport = transport or AIOHTTPClient() - self.user_agent_extra = user_agent_extra + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "aws_credentials_identity_resolver": FieldSpec(default=None), + "region": FieldSpec(default=None), + "aws_access_key_id": FieldSpec(default=None), + "aws_secret_access_key": FieldSpec(default=None), + "aws_session_token": FieldSpec(default=None), + "user_agent_extra": FieldSpec(default=None), + "sdk_ua_app_id": FieldSpec(default=None), + **AsyncAwsConfig._FIELDS, + "endpoint_uri": FieldSpec(default=None, resolver=EndpointUriResolver("sts")), + "endpoint_resolver": FieldSpec( + default_factory=lambda: StandardRegionalEndpointsResolver( + endpoint_prefix="sts" + ) + ), + "protocol": FieldSpec( + default_factory=lambda: AwsQueryClientProtocol( + _SCHEMA_AWS_SECURITY_TOKEN_SERVICE_V20110615, "2011-06-15" + ) + ), + "auth_schemes": FieldSpec( + default_factory=lambda: { + ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="sts") + } + ), + "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: """ - Sets the implementation of an auth scheme. - - Using this method ensures the correct key is used. + Set an auth scheme implementation using its scheme ID. :param scheme: + The auth scheme to add or replace. + """ + auth_schemes = dict(self.auth_schemes or {}) + auth_schemes[scheme.scheme_id] = scheme + self.auth_schemes = auth_schemes - Args: - scheme: - The auth scheme to add. + @classmethod + async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] + cls, + *, + profile: str | None = None, + fs: FileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[_AsyncSTSConfigOverrides], + ) -> Self: + """ + Resolve config from environment, config files, defaults, and explicit + overrides. """ - self.auth_schemes[scheme.scheme_id] = scheme + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) -Plugin: TypeAlias = Callable[[Config], None] -"""A callable that allows customizing the config object on each request.""" +Plugin: TypeAlias = Callable[[AsyncSTSConfig], None] +""" +A callable that customizes a client configuration. Service-level plugins +are applied once to the base configuration inherited by every operation. +Operation-level plugins apply only to a single operation invocation. +""" diff --git a/clients/aws-sdk-sts/src/aws_sdk_sts/user_agent.py b/clients/aws-sdk-sts/src/aws_sdk_sts/user_agent.py index 34c32fb..4124ca8 100644 --- a/clients/aws-sdk-sts/src/aws_sdk_sts/user_agent.py +++ b/clients/aws-sdk-sts/src/aws_sdk_sts/user_agent.py @@ -3,10 +3,10 @@ from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor from . import __version__ -from .config import Config +from .config import AsyncSTSConfig -def aws_user_agent_plugin(config: Config): +def aws_user_agent_plugin(config: AsyncSTSConfig): config.interceptors.append( UserAgentInterceptor( ua_suffix=config.user_agent_extra, diff --git a/clients/aws-sdk-transcribe-streaming/.changes/0.10.0.json b/clients/aws-sdk-transcribe-streaming/.changes/0.10.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/clients/aws-sdk-transcribe-streaming/.changes/0.10.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/clients/aws-sdk-transcribe-streaming/CHANGELOG.md b/clients/aws-sdk-transcribe-streaming/CHANGELOG.md index fddab32..d2c48ef 100644 --- a/clients/aws-sdk-transcribe-streaming/CHANGELOG.md +++ b/clients/aws-sdk-transcribe-streaming/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.10.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.9.0 ### Dependencies diff --git a/clients/aws-sdk-transcribe-streaming/pyproject.toml b/clients/aws-sdk-transcribe-streaming/pyproject.toml index 9d7c0f8..ab5ad3d 100644 --- a/clients/aws-sdk-transcribe-streaming/pyproject.toml +++ b/clients/aws-sdk-transcribe-streaming/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "aws_sdk_transcribe_streaming" -version = "0.9.0" +version = "0.10.0" description = "aws_sdk_transcribe_streaming client" readme = "README.md" requires-python = ">=3.12" @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ - "smithy_aws_core[eventstream, json]~=0.9.0", + "smithy_aws_core[eventstream, json]~=0.10.0", "smithy_core~=0.8.0", "smithy_http[awscrt]~=0.4.0" ] diff --git a/clients/aws-sdk-transcribe-streaming/scripts/docs/generate_doc_stubs.py b/clients/aws-sdk-transcribe-streaming/scripts/docs/generate_doc_stubs.py index b00ac66..56ab5a8 100644 --- a/clients/aws-sdk-transcribe-streaming/scripts/docs/generate_doc_stubs.py +++ b/clients/aws-sdk-transcribe-streaming/scripts/docs/generate_doc_stubs.py @@ -8,6 +8,7 @@ import argparse import logging +import re import sys from collections.abc import Sequence from dataclasses import dataclass @@ -115,19 +116,43 @@ class ClientInfo: class DocStubGenerator: """Generate markdown API Reference stubs for AWS SDK for Python clients.""" - def __init__(self, client_dir: Path, output_dir: Path) -> None: + def __init__(self, client_dir: Path, output_dir: Path, service_name: str | None = None) -> None: """ Initialize the documentation generator. Args: client_dir: Path to the client source directory output_dir: Path to the output directory for generated doc stubs + service_name: Display name for the service (e.g. the Smithy sdkId + "SNS"). When omitted, falls back to a title-cased derivation of + the package name, which does not preserve acronym casing. """ self.client_dir = client_dir self.output_dir = output_dir - # Extract service name from package name - # (e.g., "aws_sdk_bedrock_runtime" -> "Bedrock Runtime") - self.service_name = client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + # Use the explicit override, then the sdkId from the package, then + # fall back to a title-cased package name (does not keep acronym + # casing, so "sns" becomes "Sns"). + self.service_name = ( + service_name + or self._sdk_id_from_package(client_dir) + or client_dir.name.replace("aws_sdk_", "").replace("_", " ").title() + ) + + @staticmethod + def _sdk_id_from_package(client_dir: Path) -> str | None: + """ + Read the authoritative service name (Smithy sdkId) from the package. + + The generated ``_private/schemas.py`` carries the ``aws.api#service`` + trait's ``sdkId`` (e.g. "SNS"), the same field the sidebar navigation + uses, so it keeps acronym casing that the package name does not. + Returns None if the file or value is absent. + """ + schemas = client_dir / "_private" / "schemas.py" + if not schemas.is_file(): + return None + match = re.search(r'"sdkId":\s*"([^"]+)"', schemas.read_text()) + return match.group(1) if match else None def generate(self) -> bool: """ @@ -166,10 +191,13 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: if not client_class: raise ValueError(f"No class ending with 'Client' found in {package_name}.client") - config_class = config_module.members.get("Config") + config_class = self._find_class_with_suffix(config_module, "Config") + if not config_class: + raise ValueError(f"No class ending with 'Config' found in {package_name}.config") + plugin_alias = config_module.members.get("Plugin") - if not config_class or not plugin_alias: - raise ValueError(f"Missing Config or Plugin in {package_name}.config") + if not plugin_alias: + raise ValueError(f"Missing Plugin in {package_name}.config") config = TypeInfo(name=config_class.name, module_path=config_class.path) plugin = TypeInfo(name=plugin_alias.name, module_path=plugin_alias.path) @@ -194,8 +222,12 @@ def _analyze_client_package(self, package_name: str) -> ClientInfo: ) def _find_class_with_suffix(self, module: Module, suffix: str) -> Class | None: - """Find the class in the module with a matching suffix.""" + """Find the class defined in the module with a matching suffix.""" for cls in module.classes.values(): + # Skip imported classes so a same-package import (e.g. a *Config + # class re-exported from config.py) can't shadow the defined one. + if cls.is_imported: + continue if cls.name.endswith(suffix): return cls return None @@ -616,6 +648,12 @@ def main() -> int: required=True, help="Output directory for generated doc stubs", ) + parser.add_argument( + "-s", + "--service-name", + default=None, + help="Display name for the service (Smithy sdkId, e.g. 'SNS')", + ) args = parser.parse_args() client_dir = args.client_dir.resolve() @@ -626,7 +664,7 @@ def main() -> int: return 1 try: - generator = DocStubGenerator(client_dir, output_dir) + generator = DocStubGenerator(client_dir, output_dir, args.service_name) success = generator.generate() return 0 if success else 1 except Exception as e: diff --git a/clients/aws-sdk-transcribe-streaming/src/aws_sdk_transcribe_streaming/__init__.py b/clients/aws-sdk-transcribe-streaming/src/aws_sdk_transcribe_streaming/__init__.py index 7e20a8c..3c99375 100644 --- a/clients/aws-sdk-transcribe-streaming/src/aws_sdk_transcribe_streaming/__init__.py +++ b/clients/aws-sdk-transcribe-streaming/src/aws_sdk_transcribe_streaming/__init__.py @@ -1,3 +1,3 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -__version__: str = "0.9.0" +__version__: str = "0.10.0" diff --git a/clients/aws-sdk-transcribe-streaming/src/aws_sdk_transcribe_streaming/client.py b/clients/aws-sdk-transcribe-streaming/src/aws_sdk_transcribe_streaming/client.py index e967d50..2b68e73 100644 --- a/clients/aws-sdk-transcribe-streaming/src/aws_sdk_transcribe_streaming/client.py +++ b/clients/aws-sdk-transcribe-streaming/src/aws_sdk_transcribe_streaming/client.py @@ -1,5 +1,6 @@ # Code generated by smithy-python-codegen DO NOT EDIT. +import asyncio from copy import deepcopy import logging from typing import Any, TYPE_CHECKING @@ -13,7 +14,7 @@ from smithy_core.types import TypedProperties from smithy_http.plugins import user_agent_plugin -from .config import Config, Plugin +from .config import AsyncTranscribeStreamingConfig, Plugin from .models import ( AudioStream, CallAnalyticsTranscriptResultStream, @@ -71,7 +72,9 @@ class AsyncTranscribeStreamingClient: """ def __init__( - self, config: Config | None = None, plugins: list[Plugin] | None = None + self, + config: AsyncTranscribeStreamingConfig | None = None, + plugins: list[Plugin] | None = None, ): """ Constructor for `AsyncTranscribeStreamingClient`. @@ -81,19 +84,32 @@ def __init__( Optional configuration for the client. Here you can set things like the endpoint for HTTP services or auth credentials. plugins: - A list of callables that modify the configuration dynamically. These - can be used to set defaults, for example. + A list of callables applied once to the client's base configuration. + Their changes are inherited by every operation invocation. """ - self._config = config or Config() - - client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] - if plugins: - client_plugins.extend(plugins) - - for plugin in client_plugins: - plugin(self._config) - + self._config = config + self._plugins = plugins + self._derive_lock = asyncio.Lock() + self._setup_done = False self._retry_strategy_resolver = RetryStrategyResolver() + self._client_plugins: list[Plugin] = [aws_user_agent_plugin, user_agent_plugin] + + async def _ensure_setup(self) -> None: + if not self._setup_done: + async with self._derive_lock: + if not self._setup_done: + if self._config is None: + config = await AsyncTranscribeStreamingConfig.resolve() + else: + # Copy so plugins don't mutate the caller's config. + config = deepcopy(self._config) + for plugin in self._client_plugins: + plugin(config) + if self._plugins: + for plugin in self._plugins: + plugin(config) + self._config = config + self._setup_done = True async def get_medical_scribe_stream( self, input: GetMedicalScribeStreamInput, plugins: list[Plugin] | None = None @@ -120,16 +136,31 @@ async def get_medical_scribe_stream( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -189,16 +220,31 @@ async def start_call_analytics_stream_transcription( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -281,16 +327,31 @@ async def start_medical_scribe_stream( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -353,16 +414,31 @@ async def start_medical_stream_transcription( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) @@ -421,16 +497,31 @@ async def start_stream_transcription( operation_plugins: list[Plugin] = [] if plugins: operation_plugins.extend(plugins) - config = deepcopy(self._config) - for plugin in operation_plugins: - plugin(config) - if config.protocol is None or config.transport is None: + await self._ensure_setup() + assert self._config is not None + if operation_plugins: + # Keep operation-plugin mutations scoped to this call. + config = deepcopy(self._config) + for plugin in operation_plugins: + plugin(config) + else: + config = self._config + if ( + config.protocol is None + or config.transport is None + or config.endpoint_resolver is None + or config.auth_scheme_resolver is None + or config.auth_schemes is None + ): raise ExpectationNotMetError( - "protocol and transport MUST be set on the config to make calls." + "protocol, transport, endpoint_resolver, auth_scheme_resolver," + " and auth_schemes MUST be set on the config to make calls." ) retry_strategy = await self._retry_strategy_resolver.resolve_retry_strategy( - retry_strategy=config.retry_strategy + retry_strategy=config.retry_strategy, + retry_mode=config.retry_mode, + max_attempts=config.max_attempts, ) pipeline = RequestPipeline(protocol=config.protocol, transport=config.transport) diff --git a/clients/aws-sdk-transcribe-streaming/src/aws_sdk_transcribe_streaming/config.py b/clients/aws-sdk-transcribe-streaming/src/aws_sdk_transcribe_streaming/config.py index fe4f2f6..0a7f715 100644 --- a/clients/aws-sdk-transcribe-streaming/src/aws_sdk_transcribe_streaming/config.py +++ b/clients/aws-sdk-transcribe-streaming/src/aws_sdk_transcribe_streaming/config.py @@ -1,24 +1,24 @@ # Code generated by smithy-python-codegen DO NOT EDIT. -from dataclasses import dataclass -from typing import Any, Callable, TypeAlias, Union +from dataclasses import dataclass, field +from typing import Any, Callable, ClassVar, Self, TypeAlias, Union, 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.identity import AWSCredentialsIdentity, AWSIdentityProperties -from smithy_core.aio.interfaces import ClientProtocol, ClientTransport, EndpointResolver +from smithy_core.aio.interfaces import ClientProtocol, EndpointResolver from smithy_core.aio.interfaces.auth import AuthScheme from smithy_core.aio.interfaces.identity import IdentityResolver -from smithy_core.aio.interfaces.retries import RetryStrategy from smithy_core.interceptors import Interceptor -from smithy_core.interfaces import URI -from smithy_core.retries import RetryStrategyOptions from smithy_core.shapes import ShapeID from smithy_http.aio.crt import AWSCRTHTTPClient -from smithy_http.interfaces import HTTPRequestConfiguration from ._private.schemas import TRANSCRIBE as _SCHEMA_TRANSCRIBE from .auth import HTTPAuthSchemeResolver @@ -59,139 +59,134 @@ ] -@dataclass(init=False) -class Config: - """Configuration for Transcribe Streaming.""" - - auth_scheme_resolver: HTTPAuthSchemeResolver - """ - An auth scheme resolver that determines the auth scheme for each - operation. - """ - - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] - """A map of auth scheme ids to auth schemes.""" - - aws_access_key_id: str | None - """The identifier for a secret access key.""" - - aws_credentials_identity_resolver: ( - IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None - ) - """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" +class _AsyncTranscribeStreamingConfigOverrides(AwsConfigOverrides, total=False): + endpoint_resolver: EndpointResolver | None + protocol: ClientProtocol[Any, Any] | None + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None - aws_secret_access_key: str | None - """A secret access key that can be used to sign requests.""" - aws_session_token: str | None - """An access key ID that identifies temporary security credentials.""" +@dataclass(kw_only=True, repr=False, init=False) +class AsyncTranscribeStreamingConfig(AsyncAwsConfig): + """Transcribe Streaming configuration (async-resolved).""" - endpoint_resolver: EndpointResolver + endpoint_resolver: EndpointResolver | None = None """ The endpoint resolver used to resolve the final endpoint per-operation based on the configuration. """ - endpoint_uri: str | URI | None - """A static URI to route requests to.""" - - http_request_config: HTTPRequestConfiguration | None - """Configuration for individual HTTP requests.""" + protocol: ClientProtocol[Any, Any] | None = None + """The protocol to serialize and deserialize requests with.""" - interceptors: list[_ServiceInterceptor] + interceptors: list[_ServiceInterceptor] = field(default_factory=lambda: []) """ The list of interceptors, which are hooks that are called during the execution of a request. """ - protocol: ClientProtocol[Any, Any] | None - """The protocol to serialize and deserialize requests with.""" + auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None + """A map of auth scheme ids to auth schemes.""" - region: str | None + auth_scheme_resolver: HTTPAuthSchemeResolver | None = None """ - The AWS region to connect to. The configured region is used to determine - the service endpoint. + An auth scheme resolver that determines the auth scheme for each + operation. """ - retry_strategy: RetryStrategy | RetryStrategyOptions | None + aws_credentials_identity_resolver: ( + IdentityResolver[AWSCredentialsIdentity, AWSIdentityProperties] | None + ) = None + """Resolves AWS Credentials. Required for operations that use Sigv4 Auth.""" + + region: str | None = None """ - The retry strategy or options for configuring retry behavior. Can be - either a configured RetryStrategy or RetryStrategyOptions to create one. + The AWS region to connect to. The configured region is used to determine + the service endpoint. """ - sdk_ua_app_id: str | None + aws_access_key_id: str | None = None + """The identifier for a secret access key.""" + + aws_secret_access_key: str | None = None + """A secret access key that can be used to sign requests.""" + + aws_session_token: str | None = None + """The session token used with temporary AWS credentials.""" + + user_agent_extra: str | None = None + """Additional suffix to be added to the User-Agent header.""" + + sdk_ua_app_id: str | None = None """ A unique and opaque application ID that is appended to the User-Agent header. """ - transport: ClientTransport[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 - streaming unless they explicitly set SUPPORTS_DUPLEX_STREAMING to True. - """ - - user_agent_extra: str | None - """Additional suffix to be added to the User-Agent header.""" - - def __init__( - self, - *, - auth_scheme_resolver: HTTPAuthSchemeResolver | None = None, - auth_schemes: dict[ShapeID, AuthScheme[Any, Any, Any, Any]] | None = None, - aws_access_key_id: str | None = None, - aws_credentials_identity_resolver: IdentityResolver[ - AWSCredentialsIdentity, AWSIdentityProperties - ] - | None = None, - aws_secret_access_key: str | None = None, - aws_session_token: str | None = None, - endpoint_resolver: EndpointResolver | None = None, - endpoint_uri: str | URI | None = None, - http_request_config: HTTPRequestConfiguration | None = None, - interceptors: list[_ServiceInterceptor] | None = None, - protocol: ClientProtocol[Any, Any] | None = None, - region: str | None = None, - retry_strategy: RetryStrategy | RetryStrategyOptions | None = None, - sdk_ua_app_id: str | None = None, - transport: ClientTransport[Any, Any] | None = None, - user_agent_extra: str | None = None, - ): - self.auth_scheme_resolver = auth_scheme_resolver or HTTPAuthSchemeResolver() - self.auth_schemes = auth_schemes or { - ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="transcribe") - } - self.aws_access_key_id = aws_access_key_id - self.aws_credentials_identity_resolver = aws_credentials_identity_resolver - self.aws_secret_access_key = aws_secret_access_key - self.aws_session_token = aws_session_token - self.endpoint_resolver = endpoint_resolver or StandardRegionalEndpointsResolver( - endpoint_prefix="transcribestreaming" - ) - self.endpoint_uri = endpoint_uri - self.http_request_config = http_request_config - self.interceptors = interceptors or [] - self.protocol = protocol or RestJsonClientProtocol(_SCHEMA_TRANSCRIBE) - self.region = region - self.retry_strategy = retry_strategy - self.sdk_ua_app_id = sdk_ua_app_id - self.transport = transport or AWSCRTHTTPClient() - self.user_agent_extra = user_agent_extra + _FIELDS: ClassVar[dict[str, FieldSpec]] = { + "aws_credentials_identity_resolver": FieldSpec(default=None), + "region": FieldSpec(default=None), + "aws_access_key_id": FieldSpec(default=None), + "aws_secret_access_key": FieldSpec(default=None), + "aws_session_token": FieldSpec(default=None), + "user_agent_extra": FieldSpec(default=None), + "sdk_ua_app_id": FieldSpec(default=None), + **AsyncAwsConfig._FIELDS, + "endpoint_uri": FieldSpec( + default=None, resolver=EndpointUriResolver("transcribe_streaming") + ), + "endpoint_resolver": FieldSpec( + default_factory=lambda: StandardRegionalEndpointsResolver( + endpoint_prefix="transcribestreaming" + ) + ), + "protocol": FieldSpec( + default_factory=lambda: RestJsonClientProtocol(_SCHEMA_TRANSCRIBE) + ), + "auth_schemes": FieldSpec( + default_factory=lambda: { + ShapeID("aws.auth#sigv4"): SigV4AuthScheme(service="transcribe") + } + ), + "auth_scheme_resolver": FieldSpec(default_factory=HTTPAuthSchemeResolver), + "transport": FieldSpec(default_factory=lambda: AWSCRTHTTPClient()), + } def set_auth_scheme(self, scheme: AuthScheme[Any, Any, Any, Any]) -> None: """ - Sets the implementation of an auth scheme. - - Using this method ensures the correct key is used. + Set an auth scheme implementation using its scheme ID. :param scheme: + The auth scheme to add or replace. + """ + auth_schemes = dict(self.auth_schemes or {}) + auth_schemes[scheme.scheme_id] = scheme + self.auth_schemes = auth_schemes - Args: - scheme: - The auth scheme to add. + @classmethod + async def resolve( # pyright: ignore[reportIncompatibleMethodOverride] + cls, + *, + profile: str | None = None, + fs: FileSystem | None = None, + config_file_path: str | None = None, + credentials_file_path: str | None = None, + **overrides: Unpack[_AsyncTranscribeStreamingConfigOverrides], + ) -> Self: + """ + Resolve config from environment, config files, defaults, and explicit + overrides. """ - self.auth_schemes[scheme.scheme_id] = scheme + return await cls._resolve( + profile=profile, + fs=fs, + config_file_path=config_file_path, + credentials_file_path=credentials_file_path, + overrides=overrides, + ) -Plugin: TypeAlias = Callable[[Config], None] -"""A callable that allows customizing the config object on each request.""" +Plugin: TypeAlias = Callable[[AsyncTranscribeStreamingConfig], None] +""" +A callable that customizes a client configuration. Service-level plugins +are applied once to the base configuration inherited by every operation. +Operation-level plugins apply only to a single operation invocation. +""" diff --git a/clients/aws-sdk-transcribe-streaming/src/aws_sdk_transcribe_streaming/user_agent.py b/clients/aws-sdk-transcribe-streaming/src/aws_sdk_transcribe_streaming/user_agent.py index f923a15..83a71a3 100644 --- a/clients/aws-sdk-transcribe-streaming/src/aws_sdk_transcribe_streaming/user_agent.py +++ b/clients/aws-sdk-transcribe-streaming/src/aws_sdk_transcribe_streaming/user_agent.py @@ -3,10 +3,10 @@ from smithy_aws_core.interceptors.user_agent import UserAgentInterceptor from . import __version__ -from .config import Config +from .config import AsyncTranscribeStreamingConfig -def aws_user_agent_plugin(config: Config): +def aws_user_agent_plugin(config: AsyncTranscribeStreamingConfig): config.interceptors.append( UserAgentInterceptor( ua_suffix=config.user_agent_extra, diff --git a/clients/aws-sdk-transcribe-streaming/tests/test_protocol.py b/clients/aws-sdk-transcribe-streaming/tests/test_restjson_protocol.py similarity index 100% rename from clients/aws-sdk-transcribe-streaming/tests/test_protocol.py rename to clients/aws-sdk-transcribe-streaming/tests/test_restjson_protocol.py diff --git a/packages/aws-credentials-http/.changes/0.2.0.json b/packages/aws-credentials-http/.changes/0.2.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/packages/aws-credentials-http/.changes/0.2.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/packages/aws-credentials-http/CHANGELOG.md b/packages/aws-credentials-http/CHANGELOG.md index e0372dc..410e334 100644 --- a/packages/aws-credentials-http/CHANGELOG.md +++ b/packages/aws-credentials-http/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.2.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.1.0 ### Features diff --git a/packages/aws-credentials-http/pyproject.toml b/packages/aws-credentials-http/pyproject.toml index 5b7d9ae..0446f88 100644 --- a/packages/aws-credentials-http/pyproject.toml +++ b/packages/aws-credentials-http/pyproject.toml @@ -27,7 +27,7 @@ classifiers = [ "Topic :: Software Development :: Libraries", ] dependencies = [ - "smithy-aws-core~=0.9.0", + "smithy-aws-core~=0.10.0", "smithy-core~=0.8.0", "smithy-http[aiohttp]~=0.4.0", ] diff --git a/packages/aws-credentials-http/src/aws_credentials_http/__init__.py b/packages/aws-credentials-http/src/aws_credentials_http/__init__.py index 7159b3f..01a48cd 100644 --- a/packages/aws-credentials-http/src/aws_credentials_http/__init__.py +++ b/packages/aws-credentials-http/src/aws_credentials_http/__init__.py @@ -1,6 +1,6 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -__version__ = "0.1.0" +__version__ = "0.2.0" from .providers import EcsContainerProvider from .resolvers import ContainerCredentialsResolver diff --git a/packages/aws-credentials-imds/.changes/0.2.0.json b/packages/aws-credentials-imds/.changes/0.2.0.json new file mode 100644 index 0000000..0ed62e6 --- /dev/null +++ b/packages/aws-credentials-imds/.changes/0.2.0.json @@ -0,0 +1,8 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/packages/aws-credentials-imds/CHANGELOG.md b/packages/aws-credentials-imds/CHANGELOG.md index daec9cb..24acb05 100644 --- a/packages/aws-credentials-imds/CHANGELOG.md +++ b/packages/aws-credentials-imds/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v0.2.0 + +### Dependencies +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.1.0 ### Features diff --git a/packages/aws-credentials-imds/pyproject.toml b/packages/aws-credentials-imds/pyproject.toml index 848308c..ef10ebf 100644 --- a/packages/aws-credentials-imds/pyproject.toml +++ b/packages/aws-credentials-imds/pyproject.toml @@ -27,7 +27,7 @@ classifiers = [ "Topic :: Software Development :: Libraries", ] dependencies = [ - "smithy-aws-core~=0.9.0", + "smithy-aws-core~=0.10.0", "smithy-core~=0.8.0", "smithy-http[aiohttp]~=0.4.0", ] diff --git a/packages/aws-credentials-imds/src/aws_credentials_imds/__init__.py b/packages/aws-credentials-imds/src/aws_credentials_imds/__init__.py index 899cf9f..587a249 100644 --- a/packages/aws-credentials-imds/src/aws_credentials_imds/__init__.py +++ b/packages/aws-credentials-imds/src/aws_credentials_imds/__init__.py @@ -1,6 +1,6 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -__version__ = "0.1.0" +__version__ = "0.2.0" from .client import IMDSConfig, IMDSConfigurationError from .providers import Ec2InstanceMetadataProvider diff --git a/packages/aws-credentials-sts/.changes/0.2.0.json b/packages/aws-credentials-sts/.changes/0.2.0.json new file mode 100644 index 0000000..948e768 --- /dev/null +++ b/packages/aws-credentials-sts/.changes/0.2.0.json @@ -0,0 +1,12 @@ +{ + "changes": [ + { + "type": "dependency", + "description": "Bump `aws-sdk-sts` from `~=0.9.0` to `~=0.10.0`." + }, + { + "type": "dependency", + "description": "Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`." + } + ] +} diff --git a/packages/aws-credentials-sts/CHANGELOG.md b/packages/aws-credentials-sts/CHANGELOG.md index f91f96d..10a6b72 100644 --- a/packages/aws-credentials-sts/CHANGELOG.md +++ b/packages/aws-credentials-sts/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## v0.2.0 + +### Dependencies +* Bump `aws-sdk-sts` from `~=0.9.0` to `~=0.10.0`. +* Bump `smithy-aws-core` from `~=0.9.0` to `~=0.10.0`. + ## v0.1.0 ### Features diff --git a/packages/aws-credentials-sts/pyproject.toml b/packages/aws-credentials-sts/pyproject.toml index 0f9e54f..de5cc7a 100644 --- a/packages/aws-credentials-sts/pyproject.toml +++ b/packages/aws-credentials-sts/pyproject.toml @@ -27,8 +27,8 @@ classifiers = [ "Topic :: Software Development :: Libraries", ] dependencies = [ - "aws-sdk-sts~=0.9.0", - "smithy-aws-core~=0.9.0", + "aws-sdk-sts~=0.10.0", + "smithy-aws-core~=0.10.0", "smithy-core~=0.8.0", "smithy-http~=0.4.0", ] diff --git a/packages/aws-credentials-sts/src/aws_credentials_sts/__init__.py b/packages/aws-credentials-sts/src/aws_credentials_sts/__init__.py index a5cd972..34463f4 100644 --- a/packages/aws-credentials-sts/src/aws_credentials_sts/__init__.py +++ b/packages/aws-credentials-sts/src/aws_credentials_sts/__init__.py @@ -1,6 +1,6 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -__version__ = "0.1.0" +__version__ = "0.2.0" from .providers import ProfileAssumeRoleProvider from .resolvers import (