diff --git a/codegen/core/src/main/java/software/amazon/smithy/python/codegen/ClientGenerator.java b/codegen/core/src/main/java/software/amazon/smithy/python/codegen/ClientGenerator.java index e24305226..5aa42d257 100644 --- a/codegen/core/src/main/java/software/amazon/smithy/python/codegen/ClientGenerator.java +++ b/codegen/core/src/main/java/software/amazon/smithy/python/codegen/ClientGenerator.java @@ -153,6 +153,7 @@ def _classify_error( error: Exception, context: InterceptorContext[Input, Output, $1T, $2T | None] ) -> RetryErrorInfo: + logger.debug("Classifying error: %s", error) """, transportRequest, transportResponse); writer.indent(); @@ -229,7 +230,7 @@ async def _handle_execution( event_response_deserializer: DeserializeableShape | None = None, ${/hasEventStream} ) -> Output: - logger.debug(f"Making request for operation {operation_name} with parameters: {input}") + logger.debug('Making request for operation "%s" with parameters: %s', operation_name, input) context: InterceptorContext[Input, None, None, None] = InterceptorContext( request=input, response=None, @@ -276,9 +277,11 @@ async def _handle_execution( context_with_transport_request = cast( InterceptorContext[Input, None, $2T, None], context ) + logger.debug("Serializing request for: %s", context_with_transport_request.request) context_with_transport_request._transport_request = await serialize( context_with_transport_request.request, config ) + logger.debug("Serialization complete. Transport request: %s", context_with_transport_request._transport_request) # Step 5: Invoke read_after_serialization for interceptor in interceptors: @@ -326,6 +329,11 @@ async def _handle_execution( ) except SmithyRetryException: raise context_with_response.response + logger.debug( + "Retry needed. Attempting request #%s in %.4f seconds.", + retry_token.retry_count + 1, + retry_token.retry_delay + ) await sleep(retry_token.retry_delay) current_body = context_with_transport_request.transport_request.body if (seek := getattr(current_body, "seek", None)) is not None: @@ -336,7 +344,7 @@ await seek(0) break except Exception as e: if context.response is not None: - logger.exception(f"Exception occurred while handling: {context.response}") + logger.exception("Exception occurred while handling: %s", context.response) pass context._response = e @@ -443,10 +451,12 @@ async def _handle_attempt( raise $1T( "No endpoint_uri found on the operation config." ) - + endpoint_resolver_parameters = StaticEndpointParams(uri=config.endpoint_uri) + logger.debug("Calling endpoint resolver with parameters: %s", endpoint_resolver_parameters) endpoint = await config.endpoint_resolver.resolve_endpoint( - StaticEndpointParams(uri=config.endpoint_uri) + endpoint_resolver_parameters ) + logger.debug("Endpoint resolver result: %s", endpoint) if not endpoint.uri.path: path = "" elif endpoint.uri.path.endswith("/"): @@ -484,11 +494,17 @@ async def _handle_attempt( writer.write(""" # Step 7i: sign the request if auth_option and signer: + logger.debug("HTTP request to sign: %s", context.transport_request) + logger.debug( + "Signer properties: %s", + auth_option.signer_properties + ) context._transport_request = await signer.sign( http_request=context.transport_request, identity=identity, signing_properties=auth_option.signer_properties, ) + logger.debug("Signed HTTP request: %s", context._transport_request) """); } writer.popState(); @@ -518,10 +534,13 @@ async def _handle_attempt( context_with_response = cast( InterceptorContext[Input, None, $1T, $2T], context ) + logger.debug("HTTP request config: %s", request_config) + logger.debug("Sending HTTP request: %s", context_with_response.transport_request) context_with_response._transport_response = await config.http_client.send( request=context_with_response.transport_request, request_config=request_config, ) + logger.debug("Received HTTP response: %s", context_with_response.transport_response) """, transportRequest, transportResponse); } @@ -547,16 +566,18 @@ async def _handle_attempt( InterceptorContext[Input, Output, $1T, $2T], context_with_response, ) + logger.debug("Deserializing transport response: %s", context_with_output._transport_response) context_with_output._response = await deserialize( context_with_output._transport_response, config ) + logger.debug("Deserialization complete. Response: %s", context_with_output._response) # Step 7r: Invoke read_after_deserialization for interceptor in interceptors: interceptor.read_after_deserialization(context_with_output) except Exception as e: if context.response is not None: - logger.exception(f"Exception occurred while handling: {context.response}") + logger.exception("Exception occurred while handling: %s", context.response) pass context._response = e @@ -582,7 +603,7 @@ async def _finalize_attempt( ) except Exception as e: if context.response is not None: - logger.exception(f"Exception occurred while handling: {context.response}") + logger.exception("Exception occurred while handling: %s", context.response) pass context._response = e @@ -592,7 +613,7 @@ async def _finalize_attempt( interceptor.read_after_attempt(context) except Exception as e: if context.response is not None: - logger.exception(f"Exception occurred while handling: {context.response}") + logger.exception("Exception occurred while handling: %s", context.response) pass context._response = e @@ -613,11 +634,11 @@ async def _finalize_execution( pass except Exception as e: # log and ignore exceptions - logger.exception(f"Exception occurred while dispatching trace events: {e}") + logger.exception("Exception occurred while dispatching trace events: %s", e) pass except Exception as e: if context.response is not None: - logger.exception(f"Exception occurred while handling: {context.response}") + logger.exception("Exception occurred while handling: %s", context.response) pass context._response = e @@ -627,7 +648,7 @@ async def _finalize_execution( interceptor.read_after_execution(context) except Exception as e: if context.response is not None: - logger.exception(f"Exception occurred while handling: {context.response}") + logger.exception("Exception occurred while handling: %s", context.response) pass context._response = e diff --git a/codegen/core/src/main/java/software/amazon/smithy/python/codegen/generators/StructureGenerator.java b/codegen/core/src/main/java/software/amazon/smithy/python/codegen/generators/StructureGenerator.java index a1d5658ad..a91d63000 100644 --- a/codegen/core/src/main/java/software/amazon/smithy/python/codegen/generators/StructureGenerator.java +++ b/codegen/core/src/main/java/software/amazon/smithy/python/codegen/generators/StructureGenerator.java @@ -158,14 +158,16 @@ class $1L($2T): private void writeProperties() { for (MemberShape member : requiredMembers) { writer.pushState(); - writer.putContext("sensitive", false); - if (member.hasTrait(SensitiveTrait.class)) { + var target = model.expectShape(member.getTarget()); + + if (target.hasTrait(SensitiveTrait.class)) { writer.addStdlibImport("dataclasses", "field"); writer.putContext("sensitive", true); + } else { + writer.putContext("sensitive", false); } var memberName = symbolProvider.toMemberName(member); - var target = model.expectShape(member.getTarget()); writer.putContext("quote", recursiveShapes.contains(target) ? "'" : ""); writer.write(""" $L: ${quote:L}$T${quote:L}\ @@ -178,9 +180,10 @@ private void writeProperties() { for (MemberShape member : optionalMembers) { writer.pushState(); + var target = model.expectShape(member.getTarget()); var requiresField = false; - if (member.hasTrait(SensitiveTrait.class)) { + if (target.hasTrait(SensitiveTrait.class)) { writer.putContext("sensitive", true); writer.addStdlibImport("dataclasses", "field"); requiresField = true; @@ -191,7 +194,7 @@ private void writeProperties() { var defaultValue = "None"; var defaultKey = "default"; if (member.hasTrait(DefaultTrait.class)) { - var target = model.expectShape(member.getTarget()); + defaultValue = getDefaultValue(writer, member); if (target.isDocumentShape() || Set.of("list", "dict").contains(defaultValue)) { writer.addStdlibImport("dataclasses", "field"); @@ -206,7 +209,6 @@ private void writeProperties() { writer.putContext("defaultValue", defaultValue); writer.putContext("useField", requiresField); - var target = model.expectShape(member.getTarget()); writer.putContext("quote", recursiveShapes.contains(target) ? "'" : ""); var memberName = symbolProvider.toMemberName(member); @@ -412,7 +414,7 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None: match schema.expect_member_index(): ${C|} case _: - logger.debug(f"Unexpected member schema: {schema}") + logger.debug("Unexpected member schema: %s", schema) deserializer.read_struct($T, consumer=_consumer) return kwargs diff --git a/codegen/core/src/main/java/software/amazon/smithy/python/codegen/generators/UnionGenerator.java b/codegen/core/src/main/java/software/amazon/smithy/python/codegen/generators/UnionGenerator.java index 7996375d0..e592460d9 100644 --- a/codegen/core/src/main/java/software/amazon/smithy/python/codegen/generators/UnionGenerator.java +++ b/codegen/core/src/main/java/software/amazon/smithy/python/codegen/generators/UnionGenerator.java @@ -162,7 +162,7 @@ def _consumer(self, schema: Schema, de: ShapeDeserializer) -> None: match schema.expect_member_index(): ${4C|} case _: - logger.debug(f"Unexpected member schema: {schema}") + logger.debug("Unexpected member schema: %s", schema) def _set_result(self, value: $2T) -> None: if self._result is not None: