From d1863f6588d1e4ad49f9fa48889dd82ba577b6d3 Mon Sep 17 00:00:00 2001 From: chalmer lowe Date: Wed, 7 Oct 2026 16:59:34 -0400 Subject: [PATCH 1/6] refactor(observability): simplify AsyncGapicCallable inheritance and preserve transport kind - Make _AsyncGapicCallable subclass _GapicCallable directly, reusing _prepare_call and _trace_span. - Restore _WRAP_METHOD_SUPPORTS_KIND check in base transport template to preserve kind attribute across Generation 2 google-api-core runtimes. - Restore tests for process-level interrupt bypass and BaseException status message extraction. - Regenerate base transport integration goldens. --- .../services/%service/transports/base.py.j2 | 31 ++- .../services/asset_service/transports/base.py | 31 ++- .../iam_credentials/transports/base.py | 31 ++- .../services/eventarc/transports/base.py | 31 ++- .../config_service_v2/transports/base.py | 31 ++- .../logging_service_v2/transports/base.py | 31 ++- .../metrics_service_v2/transports/base.py | 31 ++- .../config_service_v2/transports/base.py | 31 ++- .../logging_service_v2/transports/base.py | 31 ++- .../metrics_service_v2/transports/base.py | 31 ++- .../services/cloud_redis/transports/base.py | 31 ++- .../services/cloud_redis/transports/base.py | 31 ++- .../services/echo/transports/base.py | 31 ++- .../services/identity/transports/base.py | 31 ++- .../services/messaging/transports/base.py | 31 ++- .../transports/base.py | 31 ++- .../sequence_service/transports/base.py | 31 ++- .../services/testing/transports/base.py | 31 ++- .../transports/base.py | 31 ++- .../google/api_core/gapic_v1/method.py | 62 +++-- .../google/api_core/gapic_v1/method_async.py | 211 ++++-------------- .../tests/asyncio/gapic/test_method_async.py | 113 +++++----- .../tests/unit/gapic/test_method.py | 38 ++++ 23 files changed, 654 insertions(+), 359 deletions(-) diff --git a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/base.py.j2 b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/base.py.j2 index fe12fbdcc411..b640ce742ac2 100644 --- a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/base.py.j2 +++ b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/base.py.j2 @@ -188,10 +188,17 @@ class {{ service.name }}Transport(abc.ABC): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -213,10 +220,22 @@ class {{ service.name }}Transport(abc.ABC): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/gapic-generator/tests/integration/goldens/asset/google/cloud/asset_v1/services/asset_service/transports/base.py b/packages/gapic-generator/tests/integration/goldens/asset/google/cloud/asset_v1/services/asset_service/transports/base.py index 8840dbfc0fd7..79447422dbe0 100755 --- a/packages/gapic-generator/tests/integration/goldens/asset/google/cloud/asset_v1/services/asset_service/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/asset/google/cloud/asset_v1/services/asset_service/transports/base.py @@ -159,10 +159,17 @@ def _wrap_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -184,10 +191,22 @@ def _wrap_async_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/gapic-generator/tests/integration/goldens/credentials/google/iam/credentials_v1/services/iam_credentials/transports/base.py b/packages/gapic-generator/tests/integration/goldens/credentials/google/iam/credentials_v1/services/iam_credentials/transports/base.py index 5d577415bdad..a6a591c74875 100755 --- a/packages/gapic-generator/tests/integration/goldens/credentials/google/iam/credentials_v1/services/iam_credentials/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/credentials/google/iam/credentials_v1/services/iam_credentials/transports/base.py @@ -156,10 +156,17 @@ def _wrap_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -181,10 +188,22 @@ def _wrap_async_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/gapic-generator/tests/integration/goldens/eventarc/google/cloud/eventarc_v1/services/eventarc/transports/base.py b/packages/gapic-generator/tests/integration/goldens/eventarc/google/cloud/eventarc_v1/services/eventarc/transports/base.py index 9aac532d8376..8a3befd4551f 100755 --- a/packages/gapic-generator/tests/integration/goldens/eventarc/google/cloud/eventarc_v1/services/eventarc/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/eventarc/google/cloud/eventarc_v1/services/eventarc/transports/base.py @@ -171,10 +171,17 @@ def _wrap_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -196,10 +203,22 @@ def _wrap_async_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/config_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/config_service_v2/transports/base.py index 5928c3dd2280..5707a45531b6 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/config_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/config_service_v2/transports/base.py @@ -162,10 +162,17 @@ def _wrap_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -187,10 +194,22 @@ def _wrap_async_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/logging_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/logging_service_v2/transports/base.py index 2547e10f105b..ea765e4edfc6 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/logging_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/logging_service_v2/transports/base.py @@ -162,10 +162,17 @@ def _wrap_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -187,10 +194,22 @@ def _wrap_async_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py index 64f32a0a6022..7007f92dbc94 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py @@ -162,10 +162,17 @@ def _wrap_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -187,10 +194,22 @@ def _wrap_async_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/config_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/config_service_v2/transports/base.py index 5928c3dd2280..5707a45531b6 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/config_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/config_service_v2/transports/base.py @@ -162,10 +162,17 @@ def _wrap_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -187,10 +194,22 @@ def _wrap_async_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/logging_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/logging_service_v2/transports/base.py index 2547e10f105b..ea765e4edfc6 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/logging_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/logging_service_v2/transports/base.py @@ -162,10 +162,17 @@ def _wrap_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -187,10 +194,22 @@ def _wrap_async_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py index 64f32a0a6022..7007f92dbc94 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py @@ -162,10 +162,17 @@ def _wrap_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -187,10 +194,22 @@ def _wrap_async_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/gapic-generator/tests/integration/goldens/redis/google/cloud/redis_v1/services/cloud_redis/transports/base.py b/packages/gapic-generator/tests/integration/goldens/redis/google/cloud/redis_v1/services/cloud_redis/transports/base.py index a4f11b9bf2b0..900e23932764 100755 --- a/packages/gapic-generator/tests/integration/goldens/redis/google/cloud/redis_v1/services/cloud_redis/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/redis/google/cloud/redis_v1/services/cloud_redis/transports/base.py @@ -159,10 +159,17 @@ def _wrap_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -184,10 +191,22 @@ def _wrap_async_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/gapic-generator/tests/integration/goldens/redis_selective/google/cloud/redis_v1/services/cloud_redis/transports/base.py b/packages/gapic-generator/tests/integration/goldens/redis_selective/google/cloud/redis_v1/services/cloud_redis/transports/base.py index 327984cec569..522d1bc8f1f4 100755 --- a/packages/gapic-generator/tests/integration/goldens/redis_selective/google/cloud/redis_v1/services/cloud_redis/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/redis_selective/google/cloud/redis_v1/services/cloud_redis/transports/base.py @@ -159,10 +159,17 @@ def _wrap_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -184,10 +191,22 @@ def _wrap_async_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/transports/base.py index 684e191c3512..305d7a681b27 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/transports/base.py @@ -160,10 +160,17 @@ def _wrap_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -185,10 +192,22 @@ def _wrap_async_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/identity/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/identity/transports/base.py index 5bf22ac55612..46d739bacd32 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/identity/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/identity/transports/base.py @@ -160,10 +160,17 @@ def _wrap_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -185,10 +192,22 @@ def _wrap_async_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/messaging/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/messaging/transports/base.py index 4078f037702f..ec70881c3932 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/messaging/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/messaging/transports/base.py @@ -161,10 +161,17 @@ def _wrap_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -186,10 +193,22 @@ def _wrap_async_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/base.py index b1688f42550a..ba64e978b4f2 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/base.py @@ -161,10 +161,17 @@ def _wrap_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -186,10 +193,22 @@ def _wrap_async_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/sequence_service/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/sequence_service/transports/base.py index a82c31ac851c..a085e6adc5c4 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/sequence_service/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/sequence_service/transports/base.py @@ -161,10 +161,17 @@ def _wrap_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -186,10 +193,22 @@ def _wrap_async_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/testing/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/testing/transports/base.py index 1743258a589b..9a45da720e2b 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/testing/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/testing/transports/base.py @@ -160,10 +160,17 @@ def _wrap_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -185,10 +192,22 @@ def _wrap_async_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/google/cloud/storagebatchoperations_v1/services/storage_batch_operations/transports/base.py b/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/google/cloud/storagebatchoperations_v1/services/storage_batch_operations/transports/base.py index bee249c160a9..d98286e5cc64 100755 --- a/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/google/cloud/storagebatchoperations_v1/services/storage_batch_operations/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/google/cloud/storagebatchoperations_v1/services/storage_batch_operations/transports/base.py @@ -161,10 +161,17 @@ def _wrap_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # Strip tracing-only arguments (client_options, method_name, is_streaming). + # See _wrap_async_method for full historical generation details. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _wrap_async_method(self, func, *args, **kwargs): @@ -186,10 +193,22 @@ def _wrap_async_method(self, func, *args, **kwargs): if kind: # pragma: NO COVER kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - # The fallback below strips tracing-specific arguments when an older version - # of google-api-core is installed (which does not accept client_options, etc.). - for k in ["client_options", "method_name", "is_streaming", "kind"]: # pragma: NO COVER + # Fallback for older runtime versions of google-api-core: + # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) + # which were added in the universal tracing release. + # 2. Preserve `kind` if supported by the installed google-api-core version. + # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. + # - Ancient versions (< 2.29.0) do not accept `kind`. + # This preserves the Generation 2 fix from PR #2111 where passing `kind` + # is necessary to prevent REST transports from falling back to gRPC wrapping. + for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER kwargs.pop(k, None) # pragma: NO COVER + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER + kwargs["kind"] = self.kind # pragma: NO COVER + else: # pragma: NO COVER + kwargs.pop("kind", None) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER def _prep_wrapped_messages(self, client_info): diff --git a/packages/google-api-core/google/api_core/gapic_v1/method.py b/packages/google-api-core/google/api_core/gapic_v1/method.py index b12a0e126a60..a6e70fe7c6d8 100644 --- a/packages/google-api-core/google/api_core/gapic_v1/method.py +++ b/packages/google-api-core/google/api_core/gapic_v1/method.py @@ -41,6 +41,10 @@ class _MethodDefault(enum.Enum): """Sentinel value indicating that a retry, timeout, or compression argument was unspecified, so the default should be used.""" +_TRANSPORT_KIND_GRPC = "grpc" +_TRANSPORT_KIND_REST = "rest" +_DEFAULT_TRANSPORT_KIND = _TRANSPORT_KIND_GRPC + def _is_not_none_or_false(value): return value is not None and value is not False @@ -122,7 +126,7 @@ def _extract_rpc_identity( return method_str, service, method -def _extract_status_code(exc: Optional[Exception]) -> str: +def _extract_status_code(exc: Optional[BaseException]) -> str: """Extract canonical status code name string from an exception. Status code name strings are resolved by inspecting the following locations: @@ -132,7 +136,7 @@ def _extract_status_code(exc: Optional[Exception]) -> str: * Fallback: Defaults to the exception class name for standard Python errors. Args: - exc (Optional[Exception]): The exception to extract the status code name from. + exc (Optional[BaseException]): The exception to extract the status code name from. Returns: str: The canonical status code name (e.g. "NOT_FOUND", "UNAVAILABLE") or class name. @@ -166,7 +170,7 @@ def _extract_status_code(exc: Optional[Exception]) -> str: return target.__class__.__name__ -def _extract_error_attributes(exc: Optional[Exception]) -> dict[str, Any]: +def _extract_error_attributes(exc: Optional[BaseException]) -> dict[str, Any]: """Extract gcp.errors.* and error.type attributes from an exception. Error details and ErrorInfo structures are resolved by inspecting the following locations: @@ -176,7 +180,7 @@ def _extract_error_attributes(exc: Optional[Exception]) -> dict[str, Any]: * Unified attribute extraction: Extracts domain, reason, and metadata from ErrorInfo or exception attributes. Args: - exc (Optional[Exception]): An exception (such as GoogleAPICallError or grpc.RpcError) or ErrorInfo object. + exc (Optional[BaseException]): An exception (such as GoogleAPICallError or grpc.RpcError) or ErrorInfo object. Returns: dict[str, Any]: Extracted error attributes (e.g. gcp.errors.domain, error.type, gcp.errors.metadata.*). @@ -228,9 +232,10 @@ def _extract_error_attributes(exc: Optional[Exception]) -> dict[str, Any]: # 5. Extract human-readable error description for cross-language PRD parity message = getattr(target_exc, "message", None) - if not message and hasattr(target_exc, "details") and callable(target_exc.details): - message = target_exc.details() - if not message and isinstance(target_exc, Exception): + if not message and hasattr(target_exc, "details"): + details = target_exc.details + message = details() if callable(details) else details + if not message and isinstance(target_exc, BaseException): message = str(target_exc) if message: attrs["status.message"] = str(message) @@ -271,6 +276,8 @@ class _GapicCallable(object): Allowed values for OpenTelemetry method tracing are "grpc" and "rest". """ + _SUPPORTED_TRACING_KINDS = (_TRANSPORT_KIND_GRPC, _TRANSPORT_KIND_REST) + def __init__( self, target, @@ -282,7 +289,7 @@ def __init__( method_name=None, is_streaming=False, client_info=None, - kind="grpc", + kind=_DEFAULT_TRANSPORT_KIND, ): self._target = target self._retry = retry @@ -301,11 +308,11 @@ def __init__( self._default_metadata = self._static_metadata # Configure the OpenTelemetry span factory once at initialization. - # For now, method tracing is gated to non-streaming gRPC calls where an explicit method_name is provided. + # For now, method tracing is gated to non-streaming calls where an explicit method_name is provided. self._start_span_fn = None if ( not is_streaming - and kind in ("grpc", "rest") + and kind in self._SUPPORTED_TRACING_KINDS and method_name is not None and _observability.is_otel_capabilities_enabled(client_options) ): @@ -323,9 +330,8 @@ def __init__( tracer = trace.get_tracer("google.api_core") span_name, _, _ = _extract_rpc_identity(method_name) - is_rest = kind in ("rest", "rest_asyncio") span_attributes = { - "rpc.system.name": "http" if is_rest else "grpc", + "rpc.system.name": "http" if kind.startswith("rest") else "grpc", "rpc.method": span_name, } self._start_span_fn = functools.partial( @@ -338,11 +344,7 @@ def __init__( # Gracefully disable tracing if OpenTelemetry or custom provider fails self._start_span_fn = None - def __call__( - self, *args, timeout=DEFAULT, retry=DEFAULT, compression=DEFAULT, **kwargs - ): - """Invoke the low-level RPC with retry, timeout, compression, and metadata.""" - + def _prepare_call(self, timeout, retry, compression, kwargs): if retry is DEFAULT: retry = self._retry @@ -376,22 +378,26 @@ def __call__( if compression is not None: kwargs["compression"] = compression + return wrapped_func + + @contextlib.contextmanager + def _trace_span(self): span_cm = contextlib.nullcontext() if self._start_span_fn is not None: try: span_cm = self._start_span_fn() - except ( - Exception - ): # Fail-open: proceed without span if tracing initialization fails + except Exception: + # Fail-open: proceed without span if tracing initialization fails span_cm = contextlib.nullcontext() with span_cm as span: try: - result = wrapped_func(*args, **kwargs) + yield if span is not None and hasattr(span, "set_attribute"): span.set_attribute("rpc.response.status_code", "OK") - return result - except Exception as exc: + except (KeyboardInterrupt, SystemExit, GeneratorExit): + raise + except BaseException as exc: if span is not None and hasattr(span, "set_attribute"): span.set_attribute( "rpc.response.status_code", _extract_status_code(exc) @@ -400,6 +406,14 @@ def __call__( span.set_attribute(k, v) raise + def __call__( + self, *args, timeout=DEFAULT, retry=DEFAULT, compression=DEFAULT, **kwargs + ): + """Invoke the low-level RPC with retry, timeout, compression, and metadata.""" + wrapped_func = self._prepare_call(timeout, retry, compression, kwargs) + with self._trace_span(): + return wrapped_func(*args, **kwargs) + def wrap_method( func, @@ -412,7 +426,7 @@ def wrap_method( client_options=None, method_name=None, is_streaming=False, - kind="grpc", + kind=_DEFAULT_TRANSPORT_KIND, ): """Wrap an RPC method with common behavior. diff --git a/packages/google-api-core/google/api_core/gapic_v1/method_async.py b/packages/google-api-core/google/api_core/gapic_v1/method_async.py index e550b4228745..2402f9f3ff95 100644 --- a/packages/google-api-core/google/api_core/gapic_v1/method_async.py +++ b/packages/google-api-core/google/api_core/gapic_v1/method_async.py @@ -17,192 +17,40 @@ compression, pagination, and long-running operations to methods. """ -import asyncio -import contextlib import functools import inspect -from google.api_core import _observability, grpc_helpers_async +from google.api_core import grpc_helpers_async from google.api_core.gapic_v1 import client_info -from google.api_core.gapic_v1.client_info import METRICS_METADATA_KEY - -# Retain _GapicCallable import for backward compatibility with external packages from google.api_core.gapic_v1.method import ( # noqa: F401 DEFAULT, USE_DEFAULT_METADATA, - _apply_decorators, - _deduplicate_metadata_tokens, - _extract_error_attributes, - _extract_metrics_header, - _extract_rpc_identity, - _extract_status_code, _GapicCallable, ) -from google.api_core.timeout import TimeToDeadlineTimeout - -_DEFAULT_ASYNC_TRANSPORT_KIND = "grpc_asyncio" - - -class _AsyncGapicCallable(object): - """Async callable object that wraps an async RPC method with retry, timeout, metadata, and tracing. - - Args: - target (Callable): The low-level async RPC method. - retry (Optional[google.api_core.retry_async.AsyncRetry]): The default retry for the - callable. If ``None``, this callable will not retry by default. - timeout (Optional[Union[google.api_core.timeout.Timeout, float]]): The default timeout for the - callable. If ``None``, this callable will not specify a timeout argument to the - low-level RPC method. - compression (Optional[grpc.Compression]): The default compression for the callable. - If ``None``, this callable will not specify a compression argument to the low-level - RPC method. - metadata (Optional[Sequence[Tuple[str, str]]]): Additional metadata that is - provided to the RPC method on every invocation. This is merged with - any metadata specified during invocation. If ``None``, no - additional metadata will be passed to the RPC method. - client_options (Optional[google.api_core.client_options.ClientOptions]): - Client options used to configure client-level behavior, such as - custom OpenTelemetry tracer providers. Defaults to None. - method_name (Optional[str]): The optional explicit full RPC method name - (e.g. "/google.cloud.secretmanager.v1.SecretManagerService/AccessSecretVersion"). - is_streaming (bool): Whether the RPC method is streaming. Defaults to False. - Note: Streaming methods do not currently generate Tier 3 observability spans. - client_info (Optional[google.api_core.gapic_v1.client_info.ClientInfo]): - Client information used for metadata headers. Defaults to None. - kind (str): The transport kind for the RPC method. Defaults to "grpc_asyncio". - Allowed values for OpenTelemetry method tracing are "grpc_asyncio" and "rest_asyncio". - """ - def __init__( - self, - target, - retry, - timeout, - compression, - metadata=None, - client_options=None, - method_name=None, - is_streaming=False, - client_info=None, - kind=_DEFAULT_ASYNC_TRANSPORT_KIND, - ): - self._target = target - self._retry = retry - self._timeout = timeout - self._compression = compression - - # Pre-extract the x-goog-api-client header from the initialized metadata. - self._x_goog_api_client, remaining = _extract_metrics_header(metadata) - self._static_metadata = tuple(remaining) - if self._x_goog_api_client: - self._default_metadata = ( - (METRICS_METADATA_KEY, self._x_goog_api_client), - *self._static_metadata, - ) - else: - self._default_metadata = self._static_metadata +_TRANSPORT_KIND_GRPC_ASYNC = "grpc_asyncio" +_TRANSPORT_KIND_REST_ASYNC = "rest_asyncio" +_DEFAULT_ASYNC_TRANSPORT_KIND = _TRANSPORT_KIND_GRPC_ASYNC - # Configure the OpenTelemetry span factory once at initialization. - self._start_span_fn = None - if ( - not is_streaming - and kind in ("grpc_asyncio", "rest_asyncio") - and method_name is not None - and _observability.is_otel_capabilities_enabled(client_options) - ): - try: - from opentelemetry import trace - tracer_provider = None - if isinstance(client_options, dict): - tracer_provider = client_options.get("tracer_provider") - elif client_options is not None: - tracer_provider = getattr(client_options, "tracer_provider", None) - if tracer_provider is not None: - tracer = tracer_provider.get_tracer("google.api_core") - else: - tracer = trace.get_tracer("google.api_core") +class _AsyncGapicCallable(_GapicCallable): + """Async callable object that wraps an async RPC method with retry, timeout, metadata, and tracing.""" - span_name, _, _ = _extract_rpc_identity(method_name) - is_rest = kind in ("rest", "rest_asyncio") - span_attributes = { - "rpc.system.name": "http" if is_rest else "grpc", - "rpc.method": span_name, - } - self._start_span_fn = functools.partial( - tracer.start_as_current_span, - span_name, - kind=trace.SpanKind.CLIENT, - attributes=span_attributes, - ) - except (ImportError, AttributeError, TypeError): - # Gracefully disable tracing if OpenTelemetry or custom provider fails - self._start_span_fn = None + _SUPPORTED_TRACING_KINDS = ( + _TRANSPORT_KIND_GRPC_ASYNC, + _TRANSPORT_KIND_REST_ASYNC, + ) async def __call__( self, *args, timeout=DEFAULT, retry=DEFAULT, compression=DEFAULT, **kwargs ): """Invoke the low-level async RPC with retry, timeout, compression, and metadata.""" - if retry is DEFAULT: - retry = self._retry - - if timeout is DEFAULT: - timeout = self._timeout - - if compression is DEFAULT: - compression = self._compression - - if isinstance(timeout, (int, float)): - timeout = TimeToDeadlineTimeout(timeout=timeout) - - # Apply all applicable decorators. - wrapped_func = _apply_decorators(self._target, [retry, timeout]) - - if user_metadata := kwargs.get("metadata"): - # Add the user agent metadata to the call. - final_metadata = list(self._static_metadata) - user_x_goog, remaining = _extract_metrics_header(user_metadata) - - merged_header = _deduplicate_metadata_tokens( - self._x_goog_api_client, user_x_goog - ) - if merged_header: - final_metadata.append((METRICS_METADATA_KEY, merged_header)) - final_metadata.extend(remaining) - kwargs["metadata"] = final_metadata - elif self._default_metadata: - kwargs["metadata"] = self._default_metadata - - if compression is not None: - kwargs["compression"] = compression - - span_cm = contextlib.nullcontext() - if self._start_span_fn is not None: - try: - span_cm = self._start_span_fn() - except ( - Exception - ): # Fail-open: proceed without span if tracing initialization fails - span_cm = contextlib.nullcontext() - - with span_cm as span: - try: - res = wrapped_func(*args, **kwargs) - if inspect.isawaitable(res): - result = await res - else: - result = res - if span is not None and hasattr(span, "set_attribute"): - span.set_attribute("rpc.response.status_code", "OK") - return result - except (Exception, asyncio.CancelledError) as exc: - if span is not None and hasattr(span, "set_attribute"): - span.set_attribute( - "rpc.response.status_code", _extract_status_code(exc) - ) - for k, v in _extract_error_attributes(exc).items(): - span.set_attribute(k, v) - raise + wrapped_func = self._prepare_call(timeout, retry, compression, kwargs) + with self._trace_span(): + res = wrapped_func(*args, **kwargs) + if inspect.isawaitable(res): + return await res + return res def wrap_method( @@ -219,6 +67,33 @@ def wrap_method( ): """Wrap an async RPC method with common behavior. + Args: + func (Callable): The low-level async RPC method. + default_retry (Optional[google.api_core.retry_async.AsyncRetry]): The default + retry strategy. If ``None``, the method will not retry by default. + default_timeout (Optional[Union[google.api_core.timeout.Timeout, float]]): The + default timeout strategy. Can also be specified as an int or float. If + ``None``, the method will not have a timeout specified by default. + default_compression (Optional[grpc.Compression]): The default + grpc.Compression. If ``None``, the method will not have + compression specified by default. + client_info (Optional[google.api_core.gapic_v1.client_info.ClientInfo]): + Client information used to create a user-agent string that's + passed as gRPC metadata to the method. If unspecified, then + a sane default will be used. If ``None``, then no user agent + metadata will be provided to the RPC method. + kind (str): The transport kind for the RPC method. Defaults to "grpc_asyncio". + Allowed values for OpenTelemetry method tracing are "grpc_asyncio" and "rest_asyncio". + client_options + (Optional[google.api_core.client_options.ClientOptions]): + Client options used to configure client-level behavior, such as + custom OpenTelemetry tracer providers. Defaults to None. + method_name (Optional[str]): Optional explicit full RPC method name + (e.g. "/google.cloud.secretmanager.v1.SecretManagerService/AccessSecretVersion"). + Used to identify the RPC for observability. + is_streaming (bool): Whether the RPC method is streaming. Defaults to False. + Streaming methods are currently gated and do not generate Tier 3 spans. + Returns: Callable: A new callable that takes optional ``retry``, ``timeout``, and ``compression`` arguments and applies the common error mapping, diff --git a/packages/google-api-core/tests/asyncio/gapic/test_method_async.py b/packages/google-api-core/tests/asyncio/gapic/test_method_async.py index 517f475a76fd..d51ae6ea2a49 100644 --- a/packages/google-api-core/tests/asyncio/gapic/test_method_async.py +++ b/packages/google-api-core/tests/asyncio/gapic/test_method_async.py @@ -350,11 +350,14 @@ async def test_wrap_method_async_otel_tracing_skips_span( """Proves that under various gating conditions, no async Tier 3 span is created.""" mock_target = mock.AsyncMock(return_value="success") mock_trace = mock.Mock() + from google.api_core import _observability with ( - mock.patch( - "google.api_core._observability.is_otel_capabilities_enabled", + mock.patch.object( + _observability, + "is_otel_capabilities_enabled", return_value=capabilities_enabled, + autospec=True, ), mock.patch.dict( "sys.modules", @@ -371,8 +374,18 @@ async def test_wrap_method_async_otel_tracing_skips_span( mock_trace.get_tracer.assert_not_called() +@pytest.mark.parametrize( + "kind,expected_rpc_system", + [ + ("grpc_asyncio", "grpc"), + ("rest_asyncio", "http"), + ], + ids=["grpc_asyncio", "rest_asyncio"], +) @pytest.mark.asyncio -async def test_wrap_method_async_otel_tracing_enabled_success(mock_otel): +async def test_wrap_method_async_otel_tracing_enabled_success( + mock_otel, kind, expected_rpc_system +): """Proves that when OpenTelemetry tracing is enabled and method_name is passed, a T3 client span is started and awaited.""" mock_target = mock.AsyncMock(return_value="async_success") @@ -380,7 +393,7 @@ async def test_wrap_method_async_otel_tracing_enabled_success(mock_otel): mock_target, default_timeout=60, method_name="/google.cloud.secretmanager.v1.SecretManagerService/ListSecrets", - kind="grpc_asyncio", + kind=kind, ) result = await wrapped() @@ -389,32 +402,7 @@ async def test_wrap_method_async_otel_tracing_enabled_success(mock_otel): "google.cloud.secretmanager.v1.SecretManagerService/ListSecrets", kind="CLIENT", attributes={ - "rpc.system.name": "grpc", - "rpc.method": "google.cloud.secretmanager.v1.SecretManagerService/ListSecrets", - }, - ) - mock_otel.span.set_attribute.assert_called_with("rpc.response.status_code", "OK") - - -@pytest.mark.asyncio -async def test_wrap_method_async_otel_tracing_enabled_rest_asyncio(mock_otel): - """Proves that when kind is 'rest_asyncio', a T3 client span is started.""" - mock_target = mock.AsyncMock(return_value="rest_success") - - wrapped = gapic_v1.method_async.wrap_method( - mock_target, - default_timeout=60, - method_name="/google.cloud.secretmanager.v1.SecretManagerService/ListSecrets", - kind="rest_asyncio", - ) - result = await wrapped() - - assert result == "rest_success" - mock_otel.tracer.start_as_current_span.assert_called_once_with( - "google.cloud.secretmanager.v1.SecretManagerService/ListSecrets", - kind="CLIENT", - attributes={ - "rpc.system.name": "http", + "rpc.system.name": expected_rpc_system, "rpc.method": "google.cloud.secretmanager.v1.SecretManagerService/ListSecrets", }, ) @@ -447,37 +435,31 @@ async def delayed_target(*args, **kwargs): @pytest.mark.asyncio -async def test_wrap_method_async_otel_tracing_custom_client_options(mock_otel): +@pytest.mark.parametrize( + "options_builder", + [ + pytest.param( + lambda p: client_options_lib.ClientOptions(tracer_provider=p), + id="client_options_object", + ), + pytest.param( + lambda p: {"tracer_provider": p}, + id="client_options_dict", + ), + ], +) +async def test_wrap_method_async_otel_tracing_client_options( + mock_otel, options_builder +): """Proves that providing client_options with a custom tracer_provider uses that provider.""" mock_target = mock.AsyncMock(return_value="success") mock_provider = mock.Mock() mock_provider.get_tracer.return_value = mock_otel.tracer - client_options = client_options_lib.ClientOptions(tracer_provider=mock_provider) - wrapped = gapic_v1.method_async.wrap_method( mock_target, - client_options=client_options, - method_name="/google.cloud.secretmanager.v1.SecretManagerService/ListSecrets", - ) - result = await wrapped() - - assert result == "success" - mock_provider.get_tracer.assert_called_once_with("google.api_core") - - -@pytest.mark.asyncio -async def test_wrap_method_async_otel_tracing_dict_client_options(mock_otel): - """Proves that providing a dict with tracer_provider uses that provider.""" - mock_target = mock.AsyncMock(return_value="success") - - mock_provider = mock.Mock() - mock_provider.get_tracer.return_value = mock_otel.tracer - - wrapped = gapic_v1.method_async.wrap_method( - mock_target, - client_options={"tracer_provider": mock_provider}, + client_options=options_builder(mock_provider), method_name="/google.cloud.secretmanager.v1.SecretManagerService/ListSecrets", ) result = await wrapped() @@ -505,6 +487,31 @@ async def test_wrap_method_async_otel_tracing_enabled_error(mock_otel): ) +@pytest.mark.asyncio +@pytest.mark.parametrize("interrupt_exc", [KeyboardInterrupt, SystemExit]) +async def test_wrap_method_async_otel_tracing_interrupt_bypasses_error_attributes( + mock_otel, interrupt_exc +): + """Proves that process-level interrupts in async calls are re-raised without polluting span error attributes.""" + mock_target = mock.AsyncMock(side_effect=interrupt_exc()) + + wrapped = gapic_v1.method_async.wrap_method( + mock_target, + method_name="/google.cloud.secretmanager.v1.SecretManagerService/GetSecret", + ) + + with pytest.raises(interrupt_exc): + await wrapped() + + for call in mock_otel.span.set_attribute.call_args_list: + attr_name = call[0][0] + assert attr_name not in ( + "rpc.response.status_code", + "error.type", + "status.message", + ) + + @pytest.mark.asyncio async def test_wrap_method_async_otel_tracing_records_gcp_error_attributes(mock_otel): """Proves that GCP error attributes (domain, reason, metadata) are recorded on the span.""" diff --git a/packages/google-api-core/tests/unit/gapic/test_method.py b/packages/google-api-core/tests/unit/gapic/test_method.py index 18a20d8e1879..a979a948338e 100644 --- a/packages/google-api-core/tests/unit/gapic/test_method.py +++ b/packages/google-api-core/tests/unit/gapic/test_method.py @@ -539,6 +539,30 @@ def test_wrap_method_otel_tracing_enabled_error(mock_otel): ) +@pytest.mark.parametrize("interrupt_exc", [KeyboardInterrupt, SystemExit]) +def test_wrap_method_otel_tracing_interrupt_bypasses_error_attributes( + mock_otel, interrupt_exc +): + """Proves that process-level interrupts are re-raised without polluting span error attributes.""" + mock_target = mock.Mock(side_effect=interrupt_exc()) + + wrapped = google.api_core.gapic_v1.method.wrap_method( + mock_target, + method_name="/google.cloud.secretmanager.v1.SecretManagerService/ListSecrets", + ) + with pytest.raises(interrupt_exc): + wrapped() + + # The span should NOT record error attributes for process-level interruptions + for call in mock_otel.span.set_attribute.call_args_list: + attr_name = call[0][0] + assert attr_name not in ( + "rpc.response.status_code", + "error.type", + "status.message", + ) + + @pytest.mark.parametrize( "exc,expected_status", [ @@ -911,6 +935,20 @@ def test_extract_error_attributes_variations(): "error.type": "ValueError", } + # 11. status.message extraction from BaseException subclasses (e.g. asyncio.CancelledError) + import asyncio + + exc_cancelled_with_msg = asyncio.CancelledError("async task cancelled") + assert _extract_error_attributes(exc_cancelled_with_msg) == { + "error.type": "CancelledError", + "status.message": "async task cancelled", + } + + exc_cancelled_empty = asyncio.CancelledError() + assert _extract_error_attributes(exc_cancelled_empty) == { + "error.type": "CancelledError", + } + def test_wrap_method_otel_tracing_partial_span_capabilities(mock_otel): """Proves handling when span has or lacks set_attribute.""" From 9572b55bbc0ccd0670454ed2f4ef414d256119f5 Mon Sep 17 00:00:00 2001 From: chalmer lowe Date: Wed, 7 Oct 2026 16:59:50 -0400 Subject: [PATCH 2/6] fix(resumable-upload): forward client_options in gRPC transport resumable REST stubs - Pass client_options=getattr(transport, "_client_options", None) when instantiating RestTransport and AsyncRestTransport inside gRPC resumable upload stubs. - Update test template assertion to verify client_options is forwarded. - Regenerate showcase resumable upload service goldens. --- .../%name_%version/%sub/services/%service/transports/grpc.py.j2 | 1 + .../%sub/services/%service/transports/grpc_asyncio.py.j2 | 1 + .../tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 | 1 + .../services/resumable_upload_service/transports/grpc.py | 1 + .../services/resumable_upload_service/transports/grpc_asyncio.py | 1 + .../unit/gapic/showcase_v1beta1/test_resumable_upload_service.py | 1 + 6 files changed, 6 insertions(+) diff --git a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/grpc.py.j2 b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/grpc.py.j2 index f54cf0d0c739..c6ea02ef3317 100644 --- a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/grpc.py.j2 +++ b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/grpc.py.j2 @@ -426,6 +426,7 @@ class {{ service.name }}GrpcTransport({{ service.name }}Transport): credentials=transport._credentials, client_info=transport._client_info, client_cert_source_for_mtls=transport._client_cert_source_for_mtls, + client_options=getattr(transport, "_client_options", None), ) return transport._rest_transport.{{ method.transport_safe_name|snake_case }}(*args, **kwargs) self._stubs['{{ method.transport_safe_name|snake_case }}'] = _RestStub() diff --git a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/grpc_asyncio.py.j2 b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/grpc_asyncio.py.j2 index ba5aebc31a4d..894fdd9de946 100644 --- a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/grpc_asyncio.py.j2 +++ b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/grpc_asyncio.py.j2 @@ -435,6 +435,7 @@ class {{ service.grpc_asyncio_transport_name }}({{ service.name }}Transport): host=transport._host, credentials=transport._credentials, client_info=transport._client_info, + client_options=getattr(transport, "_client_options", None), ) return transport._rest_transport.{{ method.transport_safe_name|snake_case }}(*args, **kwargs) self._stubs['{{ method.transport_safe_name|snake_case }}'] = _AsyncRestStub() diff --git a/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 b/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 index 53accce6375d..0405149dee50 100644 --- a/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 +++ b/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 @@ -1817,6 +1817,7 @@ async def test_{{ service.name|snake_case }}_{{ method.name|snake_case }}_grpc_a host=transport._host, credentials=transport._credentials, client_info=transport._client_info, + client_options=getattr(transport, "_client_options", None), ) assert mock_rest_transport.{{ method.transport_safe_name|snake_case }}.call_count == 2 await transport.close() diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/grpc.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/grpc.py index 164281da93ae..66a696e695f0 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/grpc.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/grpc.py @@ -398,6 +398,7 @@ def __call__(self, *args, **kwargs): credentials=transport._credentials, client_info=transport._client_info, client_cert_source_for_mtls=transport._client_cert_source_for_mtls, + client_options=getattr(transport, "_client_options", None), ) return transport._rest_transport.upload_media(*args, **kwargs) self._stubs['upload_media'] = _RestStub() diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/grpc_asyncio.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/grpc_asyncio.py index db2b68ba76be..d43839f84e68 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/grpc_asyncio.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/grpc_asyncio.py @@ -412,6 +412,7 @@ def __call__(self, *args, **kwargs): host=transport._host, credentials=transport._credentials, client_info=transport._client_info, + client_options=getattr(transport, "_client_options", None), ) return transport._rest_transport.upload_media(*args, **kwargs) self._stubs['upload_media'] = _AsyncRestStub() diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_resumable_upload_service.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_resumable_upload_service.py index 278da48d6481..405a4621ce5b 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_resumable_upload_service.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_resumable_upload_service.py @@ -2396,6 +2396,7 @@ async def test_resumable_upload_service_upload_media_grpc_asyncio_rest_stub(): host=transport._host, credentials=transport._credentials, client_info=transport._client_info, + client_options=getattr(transport, "_client_options", None), ) assert mock_rest_transport.upload_media.call_count == 2 await transport.close() From d537e18e229a4b6bb7588c81cfd616c5d60d8278 Mon Sep 17 00:00:00 2001 From: chalmer lowe Date: Thu, 8 Oct 2026 05:22:05 -0400 Subject: [PATCH 3/6] test(gapic): add base transport wrap_method tests and remove pragmas --- .../services/%service/transports/base.py.j2 | 40 +++--- .../%name_%version/%sub/test_%service.py.j2 | 128 ++++++++++++++++++ .../services/asset_service/transports/base.py | 40 +++--- .../unit/gapic/asset_v1/test_asset_service.py | 126 +++++++++++++++++ .../iam_credentials/transports/base.py | 40 +++--- .../credentials_v1/test_iam_credentials.py | 126 +++++++++++++++++ .../services/eventarc/transports/base.py | 40 +++--- .../unit/gapic/eventarc_v1/test_eventarc.py | 126 +++++++++++++++++ .../config_service_v2/transports/base.py | 40 +++--- .../logging_service_v2/transports/base.py | 40 +++--- .../metrics_service_v2/transports/base.py | 40 +++--- .../logging_v2/test_config_service_v2.py | 126 +++++++++++++++++ .../logging_v2/test_logging_service_v2.py | 126 +++++++++++++++++ .../logging_v2/test_metrics_service_v2.py | 126 +++++++++++++++++ .../config_service_v2/transports/base.py | 40 +++--- .../logging_service_v2/transports/base.py | 40 +++--- .../metrics_service_v2/transports/base.py | 40 +++--- .../logging_v2/test_config_service_v2.py | 126 +++++++++++++++++ .../logging_v2/test_logging_service_v2.py | 126 +++++++++++++++++ .../logging_v2/test_metrics_service_v2.py | 126 +++++++++++++++++ .../services/cloud_redis/transports/base.py | 40 +++--- .../unit/gapic/redis_v1/test_cloud_redis.py | 126 +++++++++++++++++ .../services/cloud_redis/transports/base.py | 40 +++--- .../unit/gapic/redis_v1/test_cloud_redis.py | 126 +++++++++++++++++ .../services/echo/transports/base.py | 40 +++--- .../services/identity/transports/base.py | 40 +++--- .../services/messaging/transports/base.py | 40 +++--- .../transports/base.py | 40 +++--- .../sequence_service/transports/base.py | 40 +++--- .../services/testing/transports/base.py | 40 +++--- .../unit/gapic/showcase_v1beta1/test_echo.py | 126 +++++++++++++++++ .../gapic/showcase_v1beta1/test_identity.py | 126 +++++++++++++++++ .../gapic/showcase_v1beta1/test_messaging.py | 126 +++++++++++++++++ .../test_resumable_upload_service.py | 126 +++++++++++++++++ .../showcase_v1beta1/test_sequence_service.py | 126 +++++++++++++++++ .../gapic/showcase_v1beta1/test_testing.py | 126 +++++++++++++++++ .../transports/base.py | 40 +++--- .../test_storage_batch_operations.py | 126 +++++++++++++++++ 38 files changed, 2776 insertions(+), 380 deletions(-) diff --git a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/base.py.j2 b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/base.py.j2 index b640ce742ac2..5514064b5816 100644 --- a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/base.py.j2 +++ b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/base.py.j2 @@ -179,27 +179,27 @@ class {{ service.name }}Transport(abc.ABC): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -211,13 +211,13 @@ class {{ service.name }}Transport(abc.ABC): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -228,15 +228,15 @@ class {{ service.name }}Transport(abc.ABC): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 b/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 index 0405149dee50..cef62317477d 100644 --- a/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 +++ b/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 @@ -2476,4 +2476,132 @@ def test_api_key_credentials(client_class, transport_class): api_audience=None, ) + +def test_{{ service.name|snake_case }}_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.{{ service.name }}{{ opts.transport[0].capitalize() }}Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "{{ opts.transport[0] }}" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.{{ service.name }}Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_{{ service.name|snake_case }}_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.{{ service.name }}{{ opts.transport[0].capitalize() }}Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "{{ opts.transport[0] }}" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +{% if 'grpc' in opts.transport %} +def test_{{ service.name|snake_case }}_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.{{ service.grpc_asyncio_transport_name }}( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.{{ service.name }}Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_{{ service.name|snake_case }}_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.{{ service.grpc_asyncio_transport_name }}( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs +{% endif %} + {% endblock %} diff --git a/packages/gapic-generator/tests/integration/goldens/asset/google/cloud/asset_v1/services/asset_service/transports/base.py b/packages/gapic-generator/tests/integration/goldens/asset/google/cloud/asset_v1/services/asset_service/transports/base.py index 79447422dbe0..fb24cd085139 100755 --- a/packages/gapic-generator/tests/integration/goldens/asset/google/cloud/asset_v1/services/asset_service/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/asset/google/cloud/asset_v1/services/asset_service/transports/base.py @@ -150,27 +150,27 @@ def _wrap_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -182,13 +182,13 @@ def _wrap_async_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -199,15 +199,15 @@ def _wrap_async_method(self, func, *args, **kwargs): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py b/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py index ea507dee5887..6f07fac50f72 100755 --- a/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py +++ b/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py @@ -18410,3 +18410,129 @@ def test_api_key_credentials(client_class, transport_class): always_use_jwt_access=True, api_audience=None, ) + + +def test_asset_service_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.AssetServiceGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.AssetServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_asset_service_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.AssetServiceGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +def test_asset_service_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.AssetServiceGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.AssetServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_asset_service_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.AssetServiceGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/credentials/google/iam/credentials_v1/services/iam_credentials/transports/base.py b/packages/gapic-generator/tests/integration/goldens/credentials/google/iam/credentials_v1/services/iam_credentials/transports/base.py index a6a591c74875..ae2b41d82cc8 100755 --- a/packages/gapic-generator/tests/integration/goldens/credentials/google/iam/credentials_v1/services/iam_credentials/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/credentials/google/iam/credentials_v1/services/iam_credentials/transports/base.py @@ -147,27 +147,27 @@ def _wrap_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -179,13 +179,13 @@ def _wrap_async_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -196,15 +196,15 @@ def _wrap_async_method(self, func, *args, **kwargs): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/tests/integration/goldens/credentials/tests/unit/gapic/credentials_v1/test_iam_credentials.py b/packages/gapic-generator/tests/integration/goldens/credentials/tests/unit/gapic/credentials_v1/test_iam_credentials.py index d374eae044ac..0f0092fbbb21 100755 --- a/packages/gapic-generator/tests/integration/goldens/credentials/tests/unit/gapic/credentials_v1/test_iam_credentials.py +++ b/packages/gapic-generator/tests/integration/goldens/credentials/tests/unit/gapic/credentials_v1/test_iam_credentials.py @@ -4456,3 +4456,129 @@ def test_api_key_credentials(client_class, transport_class): always_use_jwt_access=True, api_audience=None, ) + + +def test_iam_credentials_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.IAMCredentialsGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.IAMCredentialsTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_iam_credentials_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.IAMCredentialsGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +def test_iam_credentials_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.IAMCredentialsGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.IAMCredentialsTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_iam_credentials_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.IAMCredentialsGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/eventarc/google/cloud/eventarc_v1/services/eventarc/transports/base.py b/packages/gapic-generator/tests/integration/goldens/eventarc/google/cloud/eventarc_v1/services/eventarc/transports/base.py index 8a3befd4551f..ec0714ccba70 100755 --- a/packages/gapic-generator/tests/integration/goldens/eventarc/google/cloud/eventarc_v1/services/eventarc/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/eventarc/google/cloud/eventarc_v1/services/eventarc/transports/base.py @@ -162,27 +162,27 @@ def _wrap_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -194,13 +194,13 @@ def _wrap_async_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -211,15 +211,15 @@ def _wrap_async_method(self, func, *args, **kwargs): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/tests/integration/goldens/eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py b/packages/gapic-generator/tests/integration/goldens/eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py index 937e3558b3c9..308e03062247 100755 --- a/packages/gapic-generator/tests/integration/goldens/eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py +++ b/packages/gapic-generator/tests/integration/goldens/eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py @@ -33513,3 +33513,129 @@ def test_api_key_credentials(client_class, transport_class): always_use_jwt_access=True, api_audience=None, ) + + +def test_eventarc_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.EventarcGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.EventarcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_eventarc_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.EventarcGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +def test_eventarc_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.EventarcGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.EventarcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_eventarc_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.EventarcGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/config_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/config_service_v2/transports/base.py index 5707a45531b6..064ad3c2e01c 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/config_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/config_service_v2/transports/base.py @@ -153,27 +153,27 @@ def _wrap_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -185,13 +185,13 @@ def _wrap_async_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -202,15 +202,15 @@ def _wrap_async_method(self, func, *args, **kwargs): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/logging_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/logging_service_v2/transports/base.py index ea765e4edfc6..650a76f42786 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/logging_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/logging_service_v2/transports/base.py @@ -153,27 +153,27 @@ def _wrap_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -185,13 +185,13 @@ def _wrap_async_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -202,15 +202,15 @@ def _wrap_async_method(self, func, *args, **kwargs): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py index 7007f92dbc94..51502358e671 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py @@ -153,27 +153,27 @@ def _wrap_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -185,13 +185,13 @@ def _wrap_async_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -202,15 +202,15 @@ def _wrap_async_method(self, func, *args, **kwargs): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_config_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_config_service_v2.py index 6a0372b7a0e7..47a69ec5879a 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_config_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_config_service_v2.py @@ -14007,3 +14007,129 @@ def test_api_key_credentials(client_class, transport_class): always_use_jwt_access=True, api_audience=None, ) + + +def test_config_service_v2_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.ConfigServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.ConfigServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_config_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.ConfigServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +def test_config_service_v2_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.ConfigServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.ConfigServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_config_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.ConfigServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_logging_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_logging_service_v2.py index 20b3b64dd51e..6cf09d688261 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_logging_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_logging_service_v2.py @@ -4447,3 +4447,129 @@ def test_api_key_credentials(client_class, transport_class): always_use_jwt_access=True, api_audience=None, ) + + +def test_logging_service_v2_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.LoggingServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.LoggingServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_logging_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.LoggingServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +def test_logging_service_v2_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.LoggingServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.LoggingServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_logging_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.LoggingServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_metrics_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_metrics_service_v2.py index 94dd963c9ac2..c2286665c4e6 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_metrics_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_metrics_service_v2.py @@ -4247,3 +4247,129 @@ def test_api_key_credentials(client_class, transport_class): always_use_jwt_access=True, api_audience=None, ) + + +def test_metrics_service_v2_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.MetricsServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.MetricsServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_metrics_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.MetricsServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +def test_metrics_service_v2_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.MetricsServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.MetricsServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_metrics_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.MetricsServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/config_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/config_service_v2/transports/base.py index 5707a45531b6..064ad3c2e01c 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/config_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/config_service_v2/transports/base.py @@ -153,27 +153,27 @@ def _wrap_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -185,13 +185,13 @@ def _wrap_async_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -202,15 +202,15 @@ def _wrap_async_method(self, func, *args, **kwargs): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/logging_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/logging_service_v2/transports/base.py index ea765e4edfc6..650a76f42786 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/logging_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/logging_service_v2/transports/base.py @@ -153,27 +153,27 @@ def _wrap_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -185,13 +185,13 @@ def _wrap_async_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -202,15 +202,15 @@ def _wrap_async_method(self, func, *args, **kwargs): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py index 7007f92dbc94..51502358e671 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py @@ -153,27 +153,27 @@ def _wrap_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -185,13 +185,13 @@ def _wrap_async_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -202,15 +202,15 @@ def _wrap_async_method(self, func, *args, **kwargs): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_config_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_config_service_v2.py index c958e82e22f1..12b00822a69c 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_config_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_config_service_v2.py @@ -14007,3 +14007,129 @@ def test_api_key_credentials(client_class, transport_class): always_use_jwt_access=True, api_audience=None, ) + + +def test_config_service_v2_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.ConfigServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.ConfigServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_config_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.ConfigServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +def test_config_service_v2_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.ConfigServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.ConfigServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_config_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.ConfigServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_logging_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_logging_service_v2.py index 20b3b64dd51e..6cf09d688261 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_logging_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_logging_service_v2.py @@ -4447,3 +4447,129 @@ def test_api_key_credentials(client_class, transport_class): always_use_jwt_access=True, api_audience=None, ) + + +def test_logging_service_v2_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.LoggingServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.LoggingServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_logging_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.LoggingServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +def test_logging_service_v2_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.LoggingServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.LoggingServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_logging_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.LoggingServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_metrics_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_metrics_service_v2.py index b613eed4163a..fa939c1bfaf3 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_metrics_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_metrics_service_v2.py @@ -4247,3 +4247,129 @@ def test_api_key_credentials(client_class, transport_class): always_use_jwt_access=True, api_audience=None, ) + + +def test_metrics_service_v2_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.MetricsServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.MetricsServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_metrics_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.MetricsServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +def test_metrics_service_v2_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.MetricsServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.MetricsServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_metrics_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.MetricsServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/redis/google/cloud/redis_v1/services/cloud_redis/transports/base.py b/packages/gapic-generator/tests/integration/goldens/redis/google/cloud/redis_v1/services/cloud_redis/transports/base.py index 900e23932764..87d04daa7c00 100755 --- a/packages/gapic-generator/tests/integration/goldens/redis/google/cloud/redis_v1/services/cloud_redis/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/redis/google/cloud/redis_v1/services/cloud_redis/transports/base.py @@ -150,27 +150,27 @@ def _wrap_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -182,13 +182,13 @@ def _wrap_async_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -199,15 +199,15 @@ def _wrap_async_method(self, func, *args, **kwargs): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/tests/integration/goldens/redis/tests/unit/gapic/redis_v1/test_cloud_redis.py b/packages/gapic-generator/tests/integration/goldens/redis/tests/unit/gapic/redis_v1/test_cloud_redis.py index 262e2c3f072b..d705739db671 100755 --- a/packages/gapic-generator/tests/integration/goldens/redis/tests/unit/gapic/redis_v1/test_cloud_redis.py +++ b/packages/gapic-generator/tests/integration/goldens/redis/tests/unit/gapic/redis_v1/test_cloud_redis.py @@ -13301,3 +13301,129 @@ def test_api_key_credentials(client_class, transport_class): always_use_jwt_access=True, api_audience=None, ) + + +def test_cloud_redis_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.CloudRedisGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.CloudRedisTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_cloud_redis_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.CloudRedisGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +def test_cloud_redis_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.CloudRedisGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.CloudRedisTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_cloud_redis_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.CloudRedisGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/redis_selective/google/cloud/redis_v1/services/cloud_redis/transports/base.py b/packages/gapic-generator/tests/integration/goldens/redis_selective/google/cloud/redis_v1/services/cloud_redis/transports/base.py index 522d1bc8f1f4..96f45900e846 100755 --- a/packages/gapic-generator/tests/integration/goldens/redis_selective/google/cloud/redis_v1/services/cloud_redis/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/redis_selective/google/cloud/redis_v1/services/cloud_redis/transports/base.py @@ -150,27 +150,27 @@ def _wrap_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -182,13 +182,13 @@ def _wrap_async_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -199,15 +199,15 @@ def _wrap_async_method(self, func, *args, **kwargs): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/tests/integration/goldens/redis_selective/tests/unit/gapic/redis_v1/test_cloud_redis.py b/packages/gapic-generator/tests/integration/goldens/redis_selective/tests/unit/gapic/redis_v1/test_cloud_redis.py index f45bec4b8e3c..31ec13c12887 100755 --- a/packages/gapic-generator/tests/integration/goldens/redis_selective/tests/unit/gapic/redis_v1/test_cloud_redis.py +++ b/packages/gapic-generator/tests/integration/goldens/redis_selective/tests/unit/gapic/redis_v1/test_cloud_redis.py @@ -8521,3 +8521,129 @@ def test_api_key_credentials(client_class, transport_class): always_use_jwt_access=True, api_audience=None, ) + + +def test_cloud_redis_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.CloudRedisGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.CloudRedisTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_cloud_redis_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.CloudRedisGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +def test_cloud_redis_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.CloudRedisGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.CloudRedisTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_cloud_redis_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.CloudRedisGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/transports/base.py index 305d7a681b27..b0b4d8cbdb23 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/transports/base.py @@ -151,27 +151,27 @@ def _wrap_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -183,13 +183,13 @@ def _wrap_async_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -200,15 +200,15 @@ def _wrap_async_method(self, func, *args, **kwargs): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/identity/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/identity/transports/base.py index 46d739bacd32..e5139d9096cb 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/identity/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/identity/transports/base.py @@ -151,27 +151,27 @@ def _wrap_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -183,13 +183,13 @@ def _wrap_async_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -200,15 +200,15 @@ def _wrap_async_method(self, func, *args, **kwargs): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/messaging/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/messaging/transports/base.py index ec70881c3932..142c409f6822 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/messaging/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/messaging/transports/base.py @@ -152,27 +152,27 @@ def _wrap_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -184,13 +184,13 @@ def _wrap_async_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -201,15 +201,15 @@ def _wrap_async_method(self, func, *args, **kwargs): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/base.py index ba64e978b4f2..7037e2244978 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/base.py @@ -152,27 +152,27 @@ def _wrap_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -184,13 +184,13 @@ def _wrap_async_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -201,15 +201,15 @@ def _wrap_async_method(self, func, *args, **kwargs): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/sequence_service/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/sequence_service/transports/base.py index a085e6adc5c4..719efa7692b7 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/sequence_service/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/sequence_service/transports/base.py @@ -152,27 +152,27 @@ def _wrap_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -184,13 +184,13 @@ def _wrap_async_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -201,15 +201,15 @@ def _wrap_async_method(self, func, *args, **kwargs): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/testing/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/testing/transports/base.py index 9a45da720e2b..33b45285b6c9 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/testing/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/testing/transports/base.py @@ -151,27 +151,27 @@ def _wrap_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -183,13 +183,13 @@ def _wrap_async_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -200,15 +200,15 @@ def _wrap_async_method(self, func, *args, **kwargs): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_echo.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_echo.py index 2838d603e7fc..6f348e2baee6 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_echo.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_echo.py @@ -9780,3 +9780,129 @@ def test_api_key_credentials(client_class, transport_class): always_use_jwt_access=True, api_audience=None, ) + + +def test_echo_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.EchoGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.EchoTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_echo_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.EchoGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +def test_echo_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.EchoGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.EchoTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_echo_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.EchoGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_identity.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_identity.py index a9d0b5f347a7..7f9115be34e9 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_identity.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_identity.py @@ -6887,3 +6887,129 @@ def test_api_key_credentials(client_class, transport_class): always_use_jwt_access=True, api_audience=None, ) + + +def test_identity_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.IdentityGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.IdentityTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_identity_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.IdentityGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +def test_identity_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.IdentityGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.IdentityTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_identity_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.IdentityGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_messaging.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_messaging.py index b2a984e65b9d..1e420825222f 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_messaging.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_messaging.py @@ -11787,3 +11787,129 @@ def test_api_key_credentials(client_class, transport_class): always_use_jwt_access=True, api_audience=None, ) + + +def test_messaging_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.MessagingGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.MessagingTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_messaging_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.MessagingGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +def test_messaging_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.MessagingGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.MessagingTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_messaging_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.MessagingGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_resumable_upload_service.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_resumable_upload_service.py index 405a4621ce5b..8a818e99ec3a 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_resumable_upload_service.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_resumable_upload_service.py @@ -4480,3 +4480,129 @@ def test_api_key_credentials(client_class, transport_class): always_use_jwt_access=True, api_audience=None, ) + + +def test_resumable_upload_service_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.ResumableUploadServiceGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.ResumableUploadServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_resumable_upload_service_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.ResumableUploadServiceGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +def test_resumable_upload_service_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.ResumableUploadServiceGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.ResumableUploadServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_resumable_upload_service_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.ResumableUploadServiceGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_sequence_service.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_sequence_service.py index 2876b35164be..98627248a6d8 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_sequence_service.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_sequence_service.py @@ -7569,3 +7569,129 @@ def test_api_key_credentials(client_class, transport_class): always_use_jwt_access=True, api_audience=None, ) + + +def test_sequence_service_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.SequenceServiceGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.SequenceServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_sequence_service_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.SequenceServiceGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +def test_sequence_service_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.SequenceServiceGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.SequenceServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_sequence_service_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.SequenceServiceGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_testing.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_testing.py index a2fe4054dcd9..0b812dc5d177 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_testing.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_testing.py @@ -7758,3 +7758,129 @@ def test_api_key_credentials(client_class, transport_class): always_use_jwt_access=True, api_audience=None, ) + + +def test_testing_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.TestingGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.TestingTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_testing_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.TestingGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +def test_testing_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.TestingGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.TestingTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_testing_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.TestingGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/google/cloud/storagebatchoperations_v1/services/storage_batch_operations/transports/base.py b/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/google/cloud/storagebatchoperations_v1/services/storage_batch_operations/transports/base.py index d98286e5cc64..b84f01981a89 100755 --- a/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/google/cloud/storagebatchoperations_v1/services/storage_batch_operations/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/google/cloud/storagebatchoperations_v1/services/storage_batch_operations/transports/base.py @@ -152,27 +152,27 @@ def _wrap_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: # Strip tracing-only arguments (client_options, method_name, is_streaming). # See _wrap_async_method for full historical generation details. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method.wrap_method(func, *args, **kwargs) def _wrap_async_method(self, func, *args, **kwargs): """Wrap an async RPC method with common client-level features. @@ -184,13 +184,13 @@ def _wrap_async_method(self, func, *args, **kwargs): stripped for backward compatibility with older `google-api-core` versions. """ - if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_TRACING: kwargs["client_options"] = self._client_options try: kind = self.kind - except NotImplementedError: # pragma: NO COVER + except NotImplementedError: kind = None - if kind: # pragma: NO COVER + if kind: kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: @@ -201,15 +201,15 @@ def _wrap_async_method(self, func, *args, **kwargs): # - Ancient versions (< 2.29.0) do not accept `kind`. # This preserves the Generation 2 fix from PR #2111 where passing `kind` # is necessary to prevent REST transports from falling back to gRPC wrapping. - for k in ["client_options", "method_name", "is_streaming"]: # pragma: NO COVER - kwargs.pop(k, None) # pragma: NO COVER + for k in ["client_options", "method_name", "is_streaming"]: + kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: # pragma: NO COVER - kwargs["kind"] = self.kind # pragma: NO COVER - else: # pragma: NO COVER - kwargs.pop("kind", None) # pragma: NO COVER + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: + kwargs["kind"] = self.kind + else: + kwargs.pop("kind", None) - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # pragma: NO COVER + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) def _prep_wrapped_messages(self, client_info): """Precompute and cache wrapped methods for RPC dispatch.""" diff --git a/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/tests/unit/gapic/storagebatchoperations_v1/test_storage_batch_operations.py b/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/tests/unit/gapic/storagebatchoperations_v1/test_storage_batch_operations.py index 10bb5ecf13f2..eed0974ce04e 100755 --- a/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/tests/unit/gapic/storagebatchoperations_v1/test_storage_batch_operations.py +++ b/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/tests/unit/gapic/storagebatchoperations_v1/test_storage_batch_operations.py @@ -8457,3 +8457,129 @@ def test_api_key_credentials(client_class, transport_class): always_use_jwt_access=True, api_audience=None, ) + + +def test_storage_batch_operations_base_transport_wrap_method_modern(): + """Test wrap_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc" + transport = transports.StorageBatchOperationsGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.StorageBatchOperationsTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_storage_batch_operations_base_transport_wrap_method_fallbacks(monkeypatch): + """Test wrap_method defensive fallbacks with older google-api-core versions.""" + transport = transports.StorageBatchOperationsGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + +def test_storage_batch_operations_base_transport_wrap_async_method_modern(): + """Test _wrap_async_method with modern google-api-core (supports tracing).""" + # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" + transport = transports.StorageBatchOperationsGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method(func) + assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" + assert "client_options" in mock_wrap.call_args.kwargs + + # 2. Base transport: kind raises NotImplementedError and is cleanly omitted + base_transport = transports.StorageBatchOperationsTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + base_transport._wrap_async_method(func) + assert "kind" not in mock_wrap.call_args.kwargs + assert "client_options" in mock_wrap.call_args.kwargs + + +def test_storage_batch_operations_base_transport_wrap_async_method_fallbacks(monkeypatch): + """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" + transport = transports.StorageBatchOperationsGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + + # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + func = mock.MagicMock() + transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert kwargs.get("kind") == "grpc_asyncio" + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs From 8fbf40470108cab6e8349f618703a018cc5b5416 Mon Sep 17 00:00:00 2001 From: chalmer lowe Date: Thu, 8 Oct 2026 06:12:50 -0400 Subject: [PATCH 4/6] docs(gapic): standardize transport fallback era comments and remove ancient PR reference --- .../services/%service/transports/base.py.j2 | 17 ++++++++--------- .../services/asset_service/transports/base.py | 17 ++++++++--------- .../services/iam_credentials/transports/base.py | 17 ++++++++--------- .../services/eventarc/transports/base.py | 17 ++++++++--------- .../config_service_v2/transports/base.py | 17 ++++++++--------- .../logging_service_v2/transports/base.py | 17 ++++++++--------- .../metrics_service_v2/transports/base.py | 17 ++++++++--------- .../config_service_v2/transports/base.py | 17 ++++++++--------- .../logging_service_v2/transports/base.py | 17 ++++++++--------- .../metrics_service_v2/transports/base.py | 17 ++++++++--------- .../services/cloud_redis/transports/base.py | 17 ++++++++--------- .../services/cloud_redis/transports/base.py | 17 ++++++++--------- .../services/echo/transports/base.py | 17 ++++++++--------- .../services/identity/transports/base.py | 17 ++++++++--------- .../services/messaging/transports/base.py | 17 ++++++++--------- .../resumable_upload_service/transports/base.py | 17 ++++++++--------- .../sequence_service/transports/base.py | 17 ++++++++--------- .../services/testing/transports/base.py | 17 ++++++++--------- .../storage_batch_operations/transports/base.py | 17 ++++++++--------- 19 files changed, 152 insertions(+), 171 deletions(-) diff --git a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/base.py.j2 b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/base.py.j2 index 5514064b5816..95b9761f6be7 100644 --- a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/base.py.j2 +++ b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/base.py.j2 @@ -189,8 +189,10 @@ class {{ service.name }}Transport(abc.ABC): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -221,13 +223,10 @@ class {{ service.name }}Transport(abc.ABC): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) diff --git a/packages/gapic-generator/tests/integration/goldens/asset/google/cloud/asset_v1/services/asset_service/transports/base.py b/packages/gapic-generator/tests/integration/goldens/asset/google/cloud/asset_v1/services/asset_service/transports/base.py index fb24cd085139..f1d399bee365 100755 --- a/packages/gapic-generator/tests/integration/goldens/asset/google/cloud/asset_v1/services/asset_service/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/asset/google/cloud/asset_v1/services/asset_service/transports/base.py @@ -160,8 +160,10 @@ def _wrap_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -192,13 +194,10 @@ def _wrap_async_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) diff --git a/packages/gapic-generator/tests/integration/goldens/credentials/google/iam/credentials_v1/services/iam_credentials/transports/base.py b/packages/gapic-generator/tests/integration/goldens/credentials/google/iam/credentials_v1/services/iam_credentials/transports/base.py index ae2b41d82cc8..a42fa1a12401 100755 --- a/packages/gapic-generator/tests/integration/goldens/credentials/google/iam/credentials_v1/services/iam_credentials/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/credentials/google/iam/credentials_v1/services/iam_credentials/transports/base.py @@ -157,8 +157,10 @@ def _wrap_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -189,13 +191,10 @@ def _wrap_async_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) diff --git a/packages/gapic-generator/tests/integration/goldens/eventarc/google/cloud/eventarc_v1/services/eventarc/transports/base.py b/packages/gapic-generator/tests/integration/goldens/eventarc/google/cloud/eventarc_v1/services/eventarc/transports/base.py index ec0714ccba70..65d38d2a33fe 100755 --- a/packages/gapic-generator/tests/integration/goldens/eventarc/google/cloud/eventarc_v1/services/eventarc/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/eventarc/google/cloud/eventarc_v1/services/eventarc/transports/base.py @@ -172,8 +172,10 @@ def _wrap_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -204,13 +206,10 @@ def _wrap_async_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) diff --git a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/config_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/config_service_v2/transports/base.py index 064ad3c2e01c..411a2bb42071 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/config_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/config_service_v2/transports/base.py @@ -163,8 +163,10 @@ def _wrap_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -195,13 +197,10 @@ def _wrap_async_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) diff --git a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/logging_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/logging_service_v2/transports/base.py index 650a76f42786..52229d09cb4d 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/logging_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/logging_service_v2/transports/base.py @@ -163,8 +163,10 @@ def _wrap_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -195,13 +197,10 @@ def _wrap_async_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) diff --git a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py index 51502358e671..b1362ebaaa02 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py @@ -163,8 +163,10 @@ def _wrap_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -195,13 +197,10 @@ def _wrap_async_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/config_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/config_service_v2/transports/base.py index 064ad3c2e01c..411a2bb42071 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/config_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/config_service_v2/transports/base.py @@ -163,8 +163,10 @@ def _wrap_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -195,13 +197,10 @@ def _wrap_async_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/logging_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/logging_service_v2/transports/base.py index 650a76f42786..52229d09cb4d 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/logging_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/logging_service_v2/transports/base.py @@ -163,8 +163,10 @@ def _wrap_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -195,13 +197,10 @@ def _wrap_async_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py index 51502358e671..b1362ebaaa02 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py @@ -163,8 +163,10 @@ def _wrap_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -195,13 +197,10 @@ def _wrap_async_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) diff --git a/packages/gapic-generator/tests/integration/goldens/redis/google/cloud/redis_v1/services/cloud_redis/transports/base.py b/packages/gapic-generator/tests/integration/goldens/redis/google/cloud/redis_v1/services/cloud_redis/transports/base.py index 87d04daa7c00..0d8a80fe4103 100755 --- a/packages/gapic-generator/tests/integration/goldens/redis/google/cloud/redis_v1/services/cloud_redis/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/redis/google/cloud/redis_v1/services/cloud_redis/transports/base.py @@ -160,8 +160,10 @@ def _wrap_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -192,13 +194,10 @@ def _wrap_async_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) diff --git a/packages/gapic-generator/tests/integration/goldens/redis_selective/google/cloud/redis_v1/services/cloud_redis/transports/base.py b/packages/gapic-generator/tests/integration/goldens/redis_selective/google/cloud/redis_v1/services/cloud_redis/transports/base.py index 96f45900e846..273eed53f04c 100755 --- a/packages/gapic-generator/tests/integration/goldens/redis_selective/google/cloud/redis_v1/services/cloud_redis/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/redis_selective/google/cloud/redis_v1/services/cloud_redis/transports/base.py @@ -160,8 +160,10 @@ def _wrap_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -192,13 +194,10 @@ def _wrap_async_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/transports/base.py index b0b4d8cbdb23..91fa07a2b880 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/transports/base.py @@ -161,8 +161,10 @@ def _wrap_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -193,13 +195,10 @@ def _wrap_async_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/identity/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/identity/transports/base.py index e5139d9096cb..49fbc30b88d8 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/identity/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/identity/transports/base.py @@ -161,8 +161,10 @@ def _wrap_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -193,13 +195,10 @@ def _wrap_async_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/messaging/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/messaging/transports/base.py index 142c409f6822..15502730443d 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/messaging/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/messaging/transports/base.py @@ -162,8 +162,10 @@ def _wrap_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -194,13 +196,10 @@ def _wrap_async_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/base.py index 7037e2244978..71f5298a2fbd 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/base.py @@ -162,8 +162,10 @@ def _wrap_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -194,13 +196,10 @@ def _wrap_async_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/sequence_service/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/sequence_service/transports/base.py index 719efa7692b7..a18b57d38122 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/sequence_service/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/sequence_service/transports/base.py @@ -162,8 +162,10 @@ def _wrap_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -194,13 +196,10 @@ def _wrap_async_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/testing/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/testing/transports/base.py index 33b45285b6c9..ba16abfa83c7 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/testing/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/testing/transports/base.py @@ -161,8 +161,10 @@ def _wrap_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -193,13 +195,10 @@ def _wrap_async_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) diff --git a/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/google/cloud/storagebatchoperations_v1/services/storage_batch_operations/transports/base.py b/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/google/cloud/storagebatchoperations_v1/services/storage_batch_operations/transports/base.py index b84f01981a89..f3ca1dee16d5 100755 --- a/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/google/cloud/storagebatchoperations_v1/services/storage_batch_operations/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/google/cloud/storagebatchoperations_v1/services/storage_batch_operations/transports/base.py @@ -162,8 +162,10 @@ def _wrap_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # Strip tracing-only arguments (client_options, method_name, is_streaming). - # See _wrap_async_method for full historical generation details. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) @@ -194,13 +196,10 @@ def _wrap_async_method(self, func, *args, **kwargs): kwargs["kind"] = kind return gapic_v1.method_async.wrap_method(func, *args, **kwargs) # Fallback for older runtime versions of google-api-core: - # 1. Strip tracing-only arguments (client_options, method_name, is_streaming) - # which were added in the universal tracing release. - # 2. Preserve `kind` if supported by the installed google-api-core version. - # - Modern versions (>= 2.36.0 or >= 2.29.0) accept `kind`. - # - Ancient versions (< 2.29.0) do not accept `kind`. - # This preserves the Generation 2 fix from PR #2111 where passing `kind` - # is necessary to prevent REST transports from falling back to gRPC wrapping. + # - Era 1 (< 2.29.0): Neither tracing args nor `kind` are supported. + # - Era 2 (>= 2.29.0, < 2.36.0): `kind` is supported (prevents REST from + # falling back to gRPC wrapping), but tracing args are not. + # (These fallbacks can be removed once google-api-core < 2.36.0 is no longer supported.) for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) From a3affce69d0589ec25f887a25a1f8c4d714610e8 Mon Sep 17 00:00:00 2001 From: chalmer lowe Date: Thu, 8 Oct 2026 07:14:43 -0400 Subject: [PATCH 5/6] test(gapic): isolate wrap_method tests and regenerate integration goldens - Ensure modern and fallback wrap_method tests monkeypatch tracing support flags to isolate test execution from the installed google-api-core runtime. - Wrap transport instantiation inside mock.patch to avoid calling unmocked wrap_method during transport initialization. - Dynamicize transport kind in unit test comments. - Regenerate all integration goldens. --- .../%name_%version/%sub/test_%service.py.j2 | 46 ++++++++++--------- .../unit/gapic/asset_v1/test_asset_service.py | 44 ++++++++++-------- .../credentials_v1/test_iam_credentials.py | 44 ++++++++++-------- .../unit/gapic/eventarc_v1/test_eventarc.py | 44 ++++++++++-------- .../logging_v2/test_config_service_v2.py | 44 ++++++++++-------- .../logging_v2/test_logging_service_v2.py | 44 ++++++++++-------- .../logging_v2/test_metrics_service_v2.py | 44 ++++++++++-------- .../logging_v2/test_config_service_v2.py | 44 ++++++++++-------- .../logging_v2/test_logging_service_v2.py | 44 ++++++++++-------- .../logging_v2/test_metrics_service_v2.py | 44 ++++++++++-------- .../unit/gapic/redis_v1/test_cloud_redis.py | 44 ++++++++++-------- .../unit/gapic/redis_v1/test_cloud_redis.py | 44 ++++++++++-------- .../unit/gapic/showcase_v1beta1/test_echo.py | 44 ++++++++++-------- .../gapic/showcase_v1beta1/test_identity.py | 44 ++++++++++-------- .../gapic/showcase_v1beta1/test_messaging.py | 44 ++++++++++-------- .../test_resumable_upload_service.py | 44 ++++++++++-------- .../showcase_v1beta1/test_sequence_service.py | 44 ++++++++++-------- .../gapic/showcase_v1beta1/test_testing.py | 44 ++++++++++-------- .../test_storage_batch_operations.py | 44 ++++++++++-------- 19 files changed, 457 insertions(+), 381 deletions(-) diff --git a/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 b/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 index cef62317477d..9900ad01af37 100644 --- a/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 +++ b/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 @@ -2477,23 +2477,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_{{ service.name|snake_case }}_base_transport_wrap_method_modern(): +def test_{{ service.name|snake_case }}_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" - # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.{{ service.name }}{{ opts.transport[0].capitalize() }}Transport( - credentials=ga_credentials.AnonymousCredentials() - ) + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) + # 1. Concrete transport: passes client_options=None and kind="{{ opts.transport[0] }}" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.{{ service.name }}{{ opts.transport[0].capitalize() }}Transport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "{{ opts.transport[0] }}" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.{{ service.name }}Transport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.{{ service.name }}Transport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -2502,10 +2503,11 @@ def test_{{ service.name|snake_case }}_base_transport_wrap_method_modern(): def test_{{ service.name|snake_case }}_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.{{ service.name }}{{ opts.transport[0].capitalize() }}Transport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.{{ service.name }}{{ opts.transport[0].capitalize() }}Transport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -2541,23 +2543,24 @@ def test_{{ service.name|snake_case }}_base_transport_wrap_method_fallbacks(monk {% if 'grpc' in opts.transport %} -def test_{{ service.name|snake_case }}_base_transport_wrap_async_method_modern(): +def test_{{ service.name|snake_case }}_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.{{ service.grpc_asyncio_transport_name }}( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.{{ service.grpc_asyncio_transport_name }}( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.{{ service.name }}Transport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.{{ service.name }}Transport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -2566,10 +2569,11 @@ def test_{{ service.name|snake_case }}_base_transport_wrap_async_method_modern() def test_{{ service.name|snake_case }}_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.{{ service.grpc_asyncio_transport_name }}( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.{{ service.grpc_asyncio_transport_name }}( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) diff --git a/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py b/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py index 6f07fac50f72..5b870c0abb32 100755 --- a/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py +++ b/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py @@ -18412,23 +18412,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_asset_service_base_transport_wrap_method_modern(): +def test_asset_service_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.AssetServiceGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.AssetServiceGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.AssetServiceTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.AssetServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -18437,10 +18438,11 @@ def test_asset_service_base_transport_wrap_method_modern(): def test_asset_service_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.AssetServiceGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.AssetServiceGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -18475,23 +18477,24 @@ def test_asset_service_base_transport_wrap_method_fallbacks(monkeypatch): assert "is_streaming" not in kwargs -def test_asset_service_base_transport_wrap_async_method_modern(): +def test_asset_service_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.AssetServiceGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.AssetServiceGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.AssetServiceTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.AssetServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -18500,10 +18503,11 @@ def test_asset_service_base_transport_wrap_async_method_modern(): def test_asset_service_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.AssetServiceGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.AssetServiceGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) diff --git a/packages/gapic-generator/tests/integration/goldens/credentials/tests/unit/gapic/credentials_v1/test_iam_credentials.py b/packages/gapic-generator/tests/integration/goldens/credentials/tests/unit/gapic/credentials_v1/test_iam_credentials.py index 0f0092fbbb21..c96810fc3945 100755 --- a/packages/gapic-generator/tests/integration/goldens/credentials/tests/unit/gapic/credentials_v1/test_iam_credentials.py +++ b/packages/gapic-generator/tests/integration/goldens/credentials/tests/unit/gapic/credentials_v1/test_iam_credentials.py @@ -4458,23 +4458,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_iam_credentials_base_transport_wrap_method_modern(): +def test_iam_credentials_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.IAMCredentialsGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.IAMCredentialsGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.IAMCredentialsTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.IAMCredentialsTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -4483,10 +4484,11 @@ def test_iam_credentials_base_transport_wrap_method_modern(): def test_iam_credentials_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.IAMCredentialsGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.IAMCredentialsGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -4521,23 +4523,24 @@ def test_iam_credentials_base_transport_wrap_method_fallbacks(monkeypatch): assert "is_streaming" not in kwargs -def test_iam_credentials_base_transport_wrap_async_method_modern(): +def test_iam_credentials_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.IAMCredentialsGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.IAMCredentialsGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.IAMCredentialsTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.IAMCredentialsTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -4546,10 +4549,11 @@ def test_iam_credentials_base_transport_wrap_async_method_modern(): def test_iam_credentials_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.IAMCredentialsGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.IAMCredentialsGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) diff --git a/packages/gapic-generator/tests/integration/goldens/eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py b/packages/gapic-generator/tests/integration/goldens/eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py index 308e03062247..e058585f3280 100755 --- a/packages/gapic-generator/tests/integration/goldens/eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py +++ b/packages/gapic-generator/tests/integration/goldens/eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py @@ -33515,23 +33515,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_eventarc_base_transport_wrap_method_modern(): +def test_eventarc_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.EventarcGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.EventarcGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.EventarcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.EventarcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -33540,10 +33541,11 @@ def test_eventarc_base_transport_wrap_method_modern(): def test_eventarc_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.EventarcGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.EventarcGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -33578,23 +33580,24 @@ def test_eventarc_base_transport_wrap_method_fallbacks(monkeypatch): assert "is_streaming" not in kwargs -def test_eventarc_base_transport_wrap_async_method_modern(): +def test_eventarc_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.EventarcGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.EventarcGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.EventarcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.EventarcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -33603,10 +33606,11 @@ def test_eventarc_base_transport_wrap_async_method_modern(): def test_eventarc_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.EventarcGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.EventarcGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) diff --git a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_config_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_config_service_v2.py index 47a69ec5879a..bb1a73608112 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_config_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_config_service_v2.py @@ -14009,23 +14009,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_config_service_v2_base_transport_wrap_method_modern(): +def test_config_service_v2_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.ConfigServiceV2GrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.ConfigServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.ConfigServiceV2Transport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.ConfigServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -14034,10 +14035,11 @@ def test_config_service_v2_base_transport_wrap_method_modern(): def test_config_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.ConfigServiceV2GrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.ConfigServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -14072,23 +14074,24 @@ def test_config_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): assert "is_streaming" not in kwargs -def test_config_service_v2_base_transport_wrap_async_method_modern(): +def test_config_service_v2_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.ConfigServiceV2GrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.ConfigServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.ConfigServiceV2Transport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.ConfigServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -14097,10 +14100,11 @@ def test_config_service_v2_base_transport_wrap_async_method_modern(): def test_config_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.ConfigServiceV2GrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.ConfigServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) diff --git a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_logging_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_logging_service_v2.py index 6cf09d688261..7c85c9efd6e3 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_logging_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_logging_service_v2.py @@ -4449,23 +4449,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_logging_service_v2_base_transport_wrap_method_modern(): +def test_logging_service_v2_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.LoggingServiceV2GrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.LoggingServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.LoggingServiceV2Transport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.LoggingServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -4474,10 +4475,11 @@ def test_logging_service_v2_base_transport_wrap_method_modern(): def test_logging_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.LoggingServiceV2GrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.LoggingServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -4512,23 +4514,24 @@ def test_logging_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): assert "is_streaming" not in kwargs -def test_logging_service_v2_base_transport_wrap_async_method_modern(): +def test_logging_service_v2_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.LoggingServiceV2GrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.LoggingServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.LoggingServiceV2Transport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.LoggingServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -4537,10 +4540,11 @@ def test_logging_service_v2_base_transport_wrap_async_method_modern(): def test_logging_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.LoggingServiceV2GrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.LoggingServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) diff --git a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_metrics_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_metrics_service_v2.py index c2286665c4e6..c919af231db0 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_metrics_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_metrics_service_v2.py @@ -4249,23 +4249,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_metrics_service_v2_base_transport_wrap_method_modern(): +def test_metrics_service_v2_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.MetricsServiceV2GrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.MetricsServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.MetricsServiceV2Transport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.MetricsServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -4274,10 +4275,11 @@ def test_metrics_service_v2_base_transport_wrap_method_modern(): def test_metrics_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.MetricsServiceV2GrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.MetricsServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -4312,23 +4314,24 @@ def test_metrics_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): assert "is_streaming" not in kwargs -def test_metrics_service_v2_base_transport_wrap_async_method_modern(): +def test_metrics_service_v2_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.MetricsServiceV2GrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.MetricsServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.MetricsServiceV2Transport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.MetricsServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -4337,10 +4340,11 @@ def test_metrics_service_v2_base_transport_wrap_async_method_modern(): def test_metrics_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.MetricsServiceV2GrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.MetricsServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_config_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_config_service_v2.py index 12b00822a69c..e44166dc2d68 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_config_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_config_service_v2.py @@ -14009,23 +14009,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_config_service_v2_base_transport_wrap_method_modern(): +def test_config_service_v2_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.ConfigServiceV2GrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.ConfigServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.ConfigServiceV2Transport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.ConfigServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -14034,10 +14035,11 @@ def test_config_service_v2_base_transport_wrap_method_modern(): def test_config_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.ConfigServiceV2GrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.ConfigServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -14072,23 +14074,24 @@ def test_config_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): assert "is_streaming" not in kwargs -def test_config_service_v2_base_transport_wrap_async_method_modern(): +def test_config_service_v2_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.ConfigServiceV2GrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.ConfigServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.ConfigServiceV2Transport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.ConfigServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -14097,10 +14100,11 @@ def test_config_service_v2_base_transport_wrap_async_method_modern(): def test_config_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.ConfigServiceV2GrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.ConfigServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_logging_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_logging_service_v2.py index 6cf09d688261..7c85c9efd6e3 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_logging_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_logging_service_v2.py @@ -4449,23 +4449,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_logging_service_v2_base_transport_wrap_method_modern(): +def test_logging_service_v2_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.LoggingServiceV2GrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.LoggingServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.LoggingServiceV2Transport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.LoggingServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -4474,10 +4475,11 @@ def test_logging_service_v2_base_transport_wrap_method_modern(): def test_logging_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.LoggingServiceV2GrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.LoggingServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -4512,23 +4514,24 @@ def test_logging_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): assert "is_streaming" not in kwargs -def test_logging_service_v2_base_transport_wrap_async_method_modern(): +def test_logging_service_v2_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.LoggingServiceV2GrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.LoggingServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.LoggingServiceV2Transport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.LoggingServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -4537,10 +4540,11 @@ def test_logging_service_v2_base_transport_wrap_async_method_modern(): def test_logging_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.LoggingServiceV2GrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.LoggingServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_metrics_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_metrics_service_v2.py index fa939c1bfaf3..3ee26d38dbbe 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_metrics_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_metrics_service_v2.py @@ -4249,23 +4249,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_metrics_service_v2_base_transport_wrap_method_modern(): +def test_metrics_service_v2_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.MetricsServiceV2GrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.MetricsServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.MetricsServiceV2Transport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.MetricsServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -4274,10 +4275,11 @@ def test_metrics_service_v2_base_transport_wrap_method_modern(): def test_metrics_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.MetricsServiceV2GrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.MetricsServiceV2GrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -4312,23 +4314,24 @@ def test_metrics_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): assert "is_streaming" not in kwargs -def test_metrics_service_v2_base_transport_wrap_async_method_modern(): +def test_metrics_service_v2_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.MetricsServiceV2GrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.MetricsServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.MetricsServiceV2Transport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.MetricsServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -4337,10 +4340,11 @@ def test_metrics_service_v2_base_transport_wrap_async_method_modern(): def test_metrics_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.MetricsServiceV2GrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.MetricsServiceV2GrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) diff --git a/packages/gapic-generator/tests/integration/goldens/redis/tests/unit/gapic/redis_v1/test_cloud_redis.py b/packages/gapic-generator/tests/integration/goldens/redis/tests/unit/gapic/redis_v1/test_cloud_redis.py index d705739db671..9480978584fd 100755 --- a/packages/gapic-generator/tests/integration/goldens/redis/tests/unit/gapic/redis_v1/test_cloud_redis.py +++ b/packages/gapic-generator/tests/integration/goldens/redis/tests/unit/gapic/redis_v1/test_cloud_redis.py @@ -13303,23 +13303,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_cloud_redis_base_transport_wrap_method_modern(): +def test_cloud_redis_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.CloudRedisGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.CloudRedisGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.CloudRedisTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.CloudRedisTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -13328,10 +13329,11 @@ def test_cloud_redis_base_transport_wrap_method_modern(): def test_cloud_redis_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.CloudRedisGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.CloudRedisGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -13366,23 +13368,24 @@ def test_cloud_redis_base_transport_wrap_method_fallbacks(monkeypatch): assert "is_streaming" not in kwargs -def test_cloud_redis_base_transport_wrap_async_method_modern(): +def test_cloud_redis_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.CloudRedisGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.CloudRedisGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.CloudRedisTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.CloudRedisTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -13391,10 +13394,11 @@ def test_cloud_redis_base_transport_wrap_async_method_modern(): def test_cloud_redis_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.CloudRedisGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.CloudRedisGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) diff --git a/packages/gapic-generator/tests/integration/goldens/redis_selective/tests/unit/gapic/redis_v1/test_cloud_redis.py b/packages/gapic-generator/tests/integration/goldens/redis_selective/tests/unit/gapic/redis_v1/test_cloud_redis.py index 31ec13c12887..8bb0893a4aea 100755 --- a/packages/gapic-generator/tests/integration/goldens/redis_selective/tests/unit/gapic/redis_v1/test_cloud_redis.py +++ b/packages/gapic-generator/tests/integration/goldens/redis_selective/tests/unit/gapic/redis_v1/test_cloud_redis.py @@ -8523,23 +8523,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_cloud_redis_base_transport_wrap_method_modern(): +def test_cloud_redis_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.CloudRedisGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.CloudRedisGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.CloudRedisTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.CloudRedisTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -8548,10 +8549,11 @@ def test_cloud_redis_base_transport_wrap_method_modern(): def test_cloud_redis_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.CloudRedisGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.CloudRedisGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -8586,23 +8588,24 @@ def test_cloud_redis_base_transport_wrap_method_fallbacks(monkeypatch): assert "is_streaming" not in kwargs -def test_cloud_redis_base_transport_wrap_async_method_modern(): +def test_cloud_redis_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.CloudRedisGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.CloudRedisGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.CloudRedisTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.CloudRedisTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -8611,10 +8614,11 @@ def test_cloud_redis_base_transport_wrap_async_method_modern(): def test_cloud_redis_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.CloudRedisGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.CloudRedisGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_echo.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_echo.py index 6f348e2baee6..bdf5b7388b15 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_echo.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_echo.py @@ -9782,23 +9782,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_echo_base_transport_wrap_method_modern(): +def test_echo_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.EchoGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.EchoGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.EchoTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.EchoTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -9807,10 +9808,11 @@ def test_echo_base_transport_wrap_method_modern(): def test_echo_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.EchoGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.EchoGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -9845,23 +9847,24 @@ def test_echo_base_transport_wrap_method_fallbacks(monkeypatch): assert "is_streaming" not in kwargs -def test_echo_base_transport_wrap_async_method_modern(): +def test_echo_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.EchoGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.EchoGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.EchoTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.EchoTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -9870,10 +9873,11 @@ def test_echo_base_transport_wrap_async_method_modern(): def test_echo_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.EchoGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.EchoGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_identity.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_identity.py index 7f9115be34e9..273f72a79e1a 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_identity.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_identity.py @@ -6889,23 +6889,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_identity_base_transport_wrap_method_modern(): +def test_identity_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.IdentityGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.IdentityGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.IdentityTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.IdentityTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -6914,10 +6915,11 @@ def test_identity_base_transport_wrap_method_modern(): def test_identity_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.IdentityGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.IdentityGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -6952,23 +6954,24 @@ def test_identity_base_transport_wrap_method_fallbacks(monkeypatch): assert "is_streaming" not in kwargs -def test_identity_base_transport_wrap_async_method_modern(): +def test_identity_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.IdentityGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.IdentityGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.IdentityTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.IdentityTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -6977,10 +6980,11 @@ def test_identity_base_transport_wrap_async_method_modern(): def test_identity_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.IdentityGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.IdentityGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_messaging.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_messaging.py index 1e420825222f..ae311784667d 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_messaging.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_messaging.py @@ -11789,23 +11789,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_messaging_base_transport_wrap_method_modern(): +def test_messaging_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.MessagingGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.MessagingGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.MessagingTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.MessagingTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -11814,10 +11815,11 @@ def test_messaging_base_transport_wrap_method_modern(): def test_messaging_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.MessagingGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.MessagingGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -11852,23 +11854,24 @@ def test_messaging_base_transport_wrap_method_fallbacks(monkeypatch): assert "is_streaming" not in kwargs -def test_messaging_base_transport_wrap_async_method_modern(): +def test_messaging_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.MessagingGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.MessagingGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.MessagingTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.MessagingTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -11877,10 +11880,11 @@ def test_messaging_base_transport_wrap_async_method_modern(): def test_messaging_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.MessagingGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.MessagingGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_resumable_upload_service.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_resumable_upload_service.py index 8a818e99ec3a..5c5ec1a31dcb 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_resumable_upload_service.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_resumable_upload_service.py @@ -4482,23 +4482,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_resumable_upload_service_base_transport_wrap_method_modern(): +def test_resumable_upload_service_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.ResumableUploadServiceGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.ResumableUploadServiceGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.ResumableUploadServiceTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.ResumableUploadServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -4507,10 +4508,11 @@ def test_resumable_upload_service_base_transport_wrap_method_modern(): def test_resumable_upload_service_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.ResumableUploadServiceGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.ResumableUploadServiceGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -4545,23 +4547,24 @@ def test_resumable_upload_service_base_transport_wrap_method_fallbacks(monkeypat assert "is_streaming" not in kwargs -def test_resumable_upload_service_base_transport_wrap_async_method_modern(): +def test_resumable_upload_service_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.ResumableUploadServiceGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.ResumableUploadServiceGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.ResumableUploadServiceTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.ResumableUploadServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -4570,10 +4573,11 @@ def test_resumable_upload_service_base_transport_wrap_async_method_modern(): def test_resumable_upload_service_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.ResumableUploadServiceGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.ResumableUploadServiceGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_sequence_service.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_sequence_service.py index 98627248a6d8..205884f9dbef 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_sequence_service.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_sequence_service.py @@ -7571,23 +7571,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_sequence_service_base_transport_wrap_method_modern(): +def test_sequence_service_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.SequenceServiceGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.SequenceServiceGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.SequenceServiceTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.SequenceServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -7596,10 +7597,11 @@ def test_sequence_service_base_transport_wrap_method_modern(): def test_sequence_service_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.SequenceServiceGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.SequenceServiceGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -7634,23 +7636,24 @@ def test_sequence_service_base_transport_wrap_method_fallbacks(monkeypatch): assert "is_streaming" not in kwargs -def test_sequence_service_base_transport_wrap_async_method_modern(): +def test_sequence_service_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.SequenceServiceGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.SequenceServiceGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.SequenceServiceTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.SequenceServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -7659,10 +7662,11 @@ def test_sequence_service_base_transport_wrap_async_method_modern(): def test_sequence_service_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.SequenceServiceGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.SequenceServiceGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_testing.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_testing.py index 0b812dc5d177..e647e4c04abb 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_testing.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_testing.py @@ -7760,23 +7760,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_testing_base_transport_wrap_method_modern(): +def test_testing_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.TestingGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.TestingGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.TestingTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.TestingTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -7785,10 +7786,11 @@ def test_testing_base_transport_wrap_method_modern(): def test_testing_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.TestingGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.TestingGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -7823,23 +7825,24 @@ def test_testing_base_transport_wrap_method_fallbacks(monkeypatch): assert "is_streaming" not in kwargs -def test_testing_base_transport_wrap_async_method_modern(): +def test_testing_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.TestingGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.TestingGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.TestingTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.TestingTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -7848,10 +7851,11 @@ def test_testing_base_transport_wrap_async_method_modern(): def test_testing_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.TestingGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.TestingGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) diff --git a/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/tests/unit/gapic/storagebatchoperations_v1/test_storage_batch_operations.py b/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/tests/unit/gapic/storagebatchoperations_v1/test_storage_batch_operations.py index eed0974ce04e..529d35ff1e38 100755 --- a/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/tests/unit/gapic/storagebatchoperations_v1/test_storage_batch_operations.py +++ b/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/tests/unit/gapic/storagebatchoperations_v1/test_storage_batch_operations.py @@ -8459,23 +8459,24 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_storage_batch_operations_base_transport_wrap_method_modern(): +def test_storage_batch_operations_base_transport_wrap_method_modern(monkeypatch): """Test wrap_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" - transport = transports.StorageBatchOperationsGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + transport = transports.StorageBatchOperationsGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.StorageBatchOperationsTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.StorageBatchOperationsTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -8484,10 +8485,11 @@ def test_storage_batch_operations_base_transport_wrap_method_modern(): def test_storage_batch_operations_base_transport_wrap_method_fallbacks(monkeypatch): """Test wrap_method defensive fallbacks with older google-api-core versions.""" - transport = transports.StorageBatchOperationsGrpcTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): + transport = transports.StorageBatchOperationsGrpcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", False) @@ -8522,23 +8524,24 @@ def test_storage_batch_operations_base_transport_wrap_method_fallbacks(monkeypat assert "is_streaming" not in kwargs -def test_storage_batch_operations_base_transport_wrap_async_method_modern(): +def test_storage_batch_operations_base_transport_wrap_async_method_modern(monkeypatch): """Test _wrap_async_method with modern google-api-core (supports tracing).""" + monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" - transport = transports.StorageBatchOperationsGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + transport = transports.StorageBatchOperationsGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() transport._wrap_async_method(func) assert mock_wrap.call_args.kwargs["kind"] == "grpc_asyncio" assert "client_options" in mock_wrap.call_args.kwargs # 2. Base transport: kind raises NotImplementedError and is cleanly omitted - base_transport = transports.StorageBatchOperationsTransport( - credentials=ga_credentials.AnonymousCredentials() - ) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.StorageBatchOperationsTransport( + credentials=ga_credentials.AnonymousCredentials() + ) func = mock.MagicMock() base_transport._wrap_async_method(func) assert "kind" not in mock_wrap.call_args.kwargs @@ -8547,10 +8550,11 @@ def test_storage_batch_operations_base_transport_wrap_async_method_modern(): def test_storage_batch_operations_base_transport_wrap_async_method_fallbacks(monkeypatch): """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" - transport = transports.StorageBatchOperationsGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials() - ) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): + transport = transports.StorageBatchOperationsGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials() + ) # Era 1: Ancient google-api-core (< 2.29.0: can be removed once google-api-core < 2.29.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", False) From 72af789d2063d5e38835e3c39cde21865701f0a9 Mon Sep 17 00:00:00 2001 From: chalmer lowe Date: Thu, 8 Oct 2026 08:05:06 -0400 Subject: [PATCH 6/6] fix(gapic): guard transport kind access in older api-core fallback paths - Safely handle NotImplementedError when inspecting self.kind in _wrap_method and _wrap_async_method fallback paths of base.py.j2. - Clarify wrap method fallback test naming in test_%service.py.j2 and add test assertions for base transport instances. - Regenerate all integration goldens. --- .../services/%service/transports/base.py.j2 | 18 ++++- .../%name_%version/%sub/test_%service.py.j2 | 80 +++++++++++++++++-- .../services/asset_service/transports/base.py | 18 ++++- .../unit/gapic/asset_v1/test_asset_service.py | 80 +++++++++++++++++-- .../iam_credentials/transports/base.py | 18 ++++- .../credentials_v1/test_iam_credentials.py | 80 +++++++++++++++++-- .../services/eventarc/transports/base.py | 18 ++++- .../unit/gapic/eventarc_v1/test_eventarc.py | 80 +++++++++++++++++-- .../config_service_v2/transports/base.py | 18 ++++- .../logging_service_v2/transports/base.py | 18 ++++- .../metrics_service_v2/transports/base.py | 18 ++++- .../logging_v2/test_config_service_v2.py | 80 +++++++++++++++++-- .../logging_v2/test_logging_service_v2.py | 80 +++++++++++++++++-- .../logging_v2/test_metrics_service_v2.py | 80 +++++++++++++++++-- .../config_service_v2/transports/base.py | 18 ++++- .../logging_service_v2/transports/base.py | 18 ++++- .../metrics_service_v2/transports/base.py | 18 ++++- .../logging_v2/test_config_service_v2.py | 80 +++++++++++++++++-- .../logging_v2/test_logging_service_v2.py | 80 +++++++++++++++++-- .../logging_v2/test_metrics_service_v2.py | 80 +++++++++++++++++-- .../services/cloud_redis/transports/base.py | 18 ++++- .../unit/gapic/redis_v1/test_cloud_redis.py | 80 +++++++++++++++++-- .../services/cloud_redis/transports/base.py | 18 ++++- .../unit/gapic/redis_v1/test_cloud_redis.py | 80 +++++++++++++++++-- .../services/echo/transports/base.py | 18 ++++- .../services/identity/transports/base.py | 18 ++++- .../services/messaging/transports/base.py | 18 ++++- .../transports/base.py | 18 ++++- .../sequence_service/transports/base.py | 18 ++++- .../services/testing/transports/base.py | 18 ++++- .../unit/gapic/showcase_v1beta1/test_echo.py | 80 +++++++++++++++++-- .../gapic/showcase_v1beta1/test_identity.py | 80 +++++++++++++++++-- .../gapic/showcase_v1beta1/test_messaging.py | 80 +++++++++++++++++-- .../test_resumable_upload_service.py | 80 +++++++++++++++++-- .../showcase_v1beta1/test_sequence_service.py | 80 +++++++++++++++++-- .../gapic/showcase_v1beta1/test_testing.py | 80 +++++++++++++++++-- .../transports/base.py | 18 ++++- .../test_storage_batch_operations.py | 80 +++++++++++++++++-- 38 files changed, 1634 insertions(+), 228 deletions(-) diff --git a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/base.py.j2 b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/base.py.j2 index 95b9761f6be7..9c93aaea9c1d 100644 --- a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/base.py.j2 +++ b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/transports/base.py.j2 @@ -196,8 +196,13 @@ class {{ service.name }}Transport(abc.ABC): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -230,8 +235,13 @@ class {{ service.name }}Transport(abc.ABC): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 b/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 index 9900ad01af37..5b3c39c061ec 100644 --- a/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 +++ b/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 @@ -2477,8 +2477,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_{{ service.name|snake_case }}_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_{{ service.name|snake_case }}_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="{{ opts.transport[0] }}" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -2501,8 +2500,7 @@ def test_{{ service.name|snake_case }}_base_transport_wrap_method_modern(monkeyp assert "client_options" in mock_wrap.call_args.kwargs -def test_{{ service.name|snake_case }}_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_{{ service.name|snake_case }}_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.{{ service.name }}{{ opts.transport[0].capitalize() }}Transport( @@ -2525,6 +2523,23 @@ def test_{{ service.name|snake_case }}_base_transport_wrap_method_fallbacks(monk assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.{{ service.name }}Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -2541,10 +2556,26 @@ def test_{{ service.name|snake_case }}_base_transport_wrap_method_fallbacks(monk assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.{{ service.name }}Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + {% if 'grpc' in opts.transport %} -def test_{{ service.name|snake_case }}_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_{{ service.name|snake_case }}_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -2567,8 +2598,7 @@ def test_{{ service.name|snake_case }}_base_transport_wrap_async_method_modern(m assert "client_options" in mock_wrap.call_args.kwargs -def test_{{ service.name|snake_case }}_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_{{ service.name|snake_case }}_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.{{ service.grpc_asyncio_transport_name }}( @@ -2591,6 +2621,23 @@ def test_{{ service.name|snake_case }}_base_transport_wrap_async_method_fallback assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.{{ service.name }}Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -2606,6 +2653,23 @@ def test_{{ service.name|snake_case }}_base_transport_wrap_async_method_fallback assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.{{ service.name }}Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs {% endif %} {% endblock %} diff --git a/packages/gapic-generator/tests/integration/goldens/asset/google/cloud/asset_v1/services/asset_service/transports/base.py b/packages/gapic-generator/tests/integration/goldens/asset/google/cloud/asset_v1/services/asset_service/transports/base.py index f1d399bee365..515c173224af 100755 --- a/packages/gapic-generator/tests/integration/goldens/asset/google/cloud/asset_v1/services/asset_service/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/asset/google/cloud/asset_v1/services/asset_service/transports/base.py @@ -167,8 +167,13 @@ def _wrap_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -201,8 +206,13 @@ def _wrap_async_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py b/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py index 5b870c0abb32..b19ad4ebf79f 100755 --- a/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py +++ b/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py @@ -18412,8 +18412,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_asset_service_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_asset_service_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -18436,8 +18435,7 @@ def test_asset_service_base_transport_wrap_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_asset_service_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_asset_service_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.AssetServiceGrpcTransport( @@ -18460,6 +18458,23 @@ def test_asset_service_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.AssetServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -18476,9 +18491,25 @@ def test_asset_service_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.AssetServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + -def test_asset_service_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_asset_service_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -18501,8 +18532,7 @@ def test_asset_service_base_transport_wrap_async_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_asset_service_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_asset_service_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.AssetServiceGrpcAsyncIOTransport( @@ -18525,6 +18555,23 @@ def test_asset_service_base_transport_wrap_async_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.AssetServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -18540,3 +18587,20 @@ def test_asset_service_base_transport_wrap_async_method_fallbacks(monkeypatch): assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.AssetServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/credentials/google/iam/credentials_v1/services/iam_credentials/transports/base.py b/packages/gapic-generator/tests/integration/goldens/credentials/google/iam/credentials_v1/services/iam_credentials/transports/base.py index a42fa1a12401..9ad2c974a10c 100755 --- a/packages/gapic-generator/tests/integration/goldens/credentials/google/iam/credentials_v1/services/iam_credentials/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/credentials/google/iam/credentials_v1/services/iam_credentials/transports/base.py @@ -164,8 +164,13 @@ def _wrap_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -198,8 +203,13 @@ def _wrap_async_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/tests/integration/goldens/credentials/tests/unit/gapic/credentials_v1/test_iam_credentials.py b/packages/gapic-generator/tests/integration/goldens/credentials/tests/unit/gapic/credentials_v1/test_iam_credentials.py index c96810fc3945..4b13be93cc7c 100755 --- a/packages/gapic-generator/tests/integration/goldens/credentials/tests/unit/gapic/credentials_v1/test_iam_credentials.py +++ b/packages/gapic-generator/tests/integration/goldens/credentials/tests/unit/gapic/credentials_v1/test_iam_credentials.py @@ -4458,8 +4458,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_iam_credentials_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_iam_credentials_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -4482,8 +4481,7 @@ def test_iam_credentials_base_transport_wrap_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_iam_credentials_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_iam_credentials_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.IAMCredentialsGrpcTransport( @@ -4506,6 +4504,23 @@ def test_iam_credentials_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.IAMCredentialsTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -4522,9 +4537,25 @@ def test_iam_credentials_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.IAMCredentialsTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + -def test_iam_credentials_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_iam_credentials_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -4547,8 +4578,7 @@ def test_iam_credentials_base_transport_wrap_async_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_iam_credentials_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_iam_credentials_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.IAMCredentialsGrpcAsyncIOTransport( @@ -4571,6 +4601,23 @@ def test_iam_credentials_base_transport_wrap_async_method_fallbacks(monkeypatch) assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.IAMCredentialsTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -4586,3 +4633,20 @@ def test_iam_credentials_base_transport_wrap_async_method_fallbacks(monkeypatch) assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.IAMCredentialsTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/eventarc/google/cloud/eventarc_v1/services/eventarc/transports/base.py b/packages/gapic-generator/tests/integration/goldens/eventarc/google/cloud/eventarc_v1/services/eventarc/transports/base.py index 65d38d2a33fe..963fc7ddb134 100755 --- a/packages/gapic-generator/tests/integration/goldens/eventarc/google/cloud/eventarc_v1/services/eventarc/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/eventarc/google/cloud/eventarc_v1/services/eventarc/transports/base.py @@ -179,8 +179,13 @@ def _wrap_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -213,8 +218,13 @@ def _wrap_async_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/tests/integration/goldens/eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py b/packages/gapic-generator/tests/integration/goldens/eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py index e058585f3280..52b232686c64 100755 --- a/packages/gapic-generator/tests/integration/goldens/eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py +++ b/packages/gapic-generator/tests/integration/goldens/eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py @@ -33515,8 +33515,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_eventarc_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_eventarc_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -33539,8 +33538,7 @@ def test_eventarc_base_transport_wrap_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_eventarc_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_eventarc_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.EventarcGrpcTransport( @@ -33563,6 +33561,23 @@ def test_eventarc_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.EventarcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -33579,9 +33594,25 @@ def test_eventarc_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.EventarcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + -def test_eventarc_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_eventarc_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -33604,8 +33635,7 @@ def test_eventarc_base_transport_wrap_async_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_eventarc_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_eventarc_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.EventarcGrpcAsyncIOTransport( @@ -33628,6 +33658,23 @@ def test_eventarc_base_transport_wrap_async_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.EventarcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -33643,3 +33690,20 @@ def test_eventarc_base_transport_wrap_async_method_fallbacks(monkeypatch): assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.EventarcTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/config_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/config_service_v2/transports/base.py index 411a2bb42071..4a5dbf0b6ca1 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/config_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/config_service_v2/transports/base.py @@ -170,8 +170,13 @@ def _wrap_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -204,8 +209,13 @@ def _wrap_async_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/logging_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/logging_service_v2/transports/base.py index 52229d09cb4d..4f1882897e01 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/logging_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/logging_service_v2/transports/base.py @@ -170,8 +170,13 @@ def _wrap_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -204,8 +209,13 @@ def _wrap_async_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py index b1362ebaaa02..98e6b8826af6 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py @@ -170,8 +170,13 @@ def _wrap_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -204,8 +209,13 @@ def _wrap_async_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_config_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_config_service_v2.py index bb1a73608112..afb0002126cf 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_config_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_config_service_v2.py @@ -14009,8 +14009,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_config_service_v2_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_config_service_v2_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -14033,8 +14032,7 @@ def test_config_service_v2_base_transport_wrap_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_config_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_config_service_v2_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.ConfigServiceV2GrpcTransport( @@ -14057,6 +14055,23 @@ def test_config_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.ConfigServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -14073,9 +14088,25 @@ def test_config_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.ConfigServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + -def test_config_service_v2_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_config_service_v2_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -14098,8 +14129,7 @@ def test_config_service_v2_base_transport_wrap_async_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_config_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_config_service_v2_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.ConfigServiceV2GrpcAsyncIOTransport( @@ -14122,6 +14152,23 @@ def test_config_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatc assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.ConfigServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -14137,3 +14184,20 @@ def test_config_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatc assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.ConfigServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_logging_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_logging_service_v2.py index 7c85c9efd6e3..4f3443ffa649 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_logging_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_logging_service_v2.py @@ -4449,8 +4449,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_logging_service_v2_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_logging_service_v2_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -4473,8 +4472,7 @@ def test_logging_service_v2_base_transport_wrap_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_logging_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_logging_service_v2_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.LoggingServiceV2GrpcTransport( @@ -4497,6 +4495,23 @@ def test_logging_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.LoggingServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -4513,9 +4528,25 @@ def test_logging_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.LoggingServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + -def test_logging_service_v2_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_logging_service_v2_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -4538,8 +4569,7 @@ def test_logging_service_v2_base_transport_wrap_async_method_modern(monkeypatch) assert "client_options" in mock_wrap.call_args.kwargs -def test_logging_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_logging_service_v2_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.LoggingServiceV2GrpcAsyncIOTransport( @@ -4562,6 +4592,23 @@ def test_logging_service_v2_base_transport_wrap_async_method_fallbacks(monkeypat assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.LoggingServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -4577,3 +4624,20 @@ def test_logging_service_v2_base_transport_wrap_async_method_fallbacks(monkeypat assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.LoggingServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_metrics_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_metrics_service_v2.py index c919af231db0..a54c2753e0e5 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_metrics_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_metrics_service_v2.py @@ -4249,8 +4249,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_metrics_service_v2_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_metrics_service_v2_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -4273,8 +4272,7 @@ def test_metrics_service_v2_base_transport_wrap_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_metrics_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_metrics_service_v2_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.MetricsServiceV2GrpcTransport( @@ -4297,6 +4295,23 @@ def test_metrics_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.MetricsServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -4313,9 +4328,25 @@ def test_metrics_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.MetricsServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + -def test_metrics_service_v2_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_metrics_service_v2_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -4338,8 +4369,7 @@ def test_metrics_service_v2_base_transport_wrap_async_method_modern(monkeypatch) assert "client_options" in mock_wrap.call_args.kwargs -def test_metrics_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_metrics_service_v2_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.MetricsServiceV2GrpcAsyncIOTransport( @@ -4362,6 +4392,23 @@ def test_metrics_service_v2_base_transport_wrap_async_method_fallbacks(monkeypat assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.MetricsServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -4377,3 +4424,20 @@ def test_metrics_service_v2_base_transport_wrap_async_method_fallbacks(monkeypat assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.MetricsServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/config_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/config_service_v2/transports/base.py index 411a2bb42071..4a5dbf0b6ca1 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/config_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/config_service_v2/transports/base.py @@ -170,8 +170,13 @@ def _wrap_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -204,8 +209,13 @@ def _wrap_async_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/logging_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/logging_service_v2/transports/base.py index 52229d09cb4d..4f1882897e01 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/logging_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/logging_service_v2/transports/base.py @@ -170,8 +170,13 @@ def _wrap_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -204,8 +209,13 @@ def _wrap_async_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py index b1362ebaaa02..98e6b8826af6 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/google/cloud/logging_v2/services/metrics_service_v2/transports/base.py @@ -170,8 +170,13 @@ def _wrap_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -204,8 +209,13 @@ def _wrap_async_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_config_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_config_service_v2.py index e44166dc2d68..bc4c58a995f5 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_config_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_config_service_v2.py @@ -14009,8 +14009,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_config_service_v2_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_config_service_v2_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -14033,8 +14032,7 @@ def test_config_service_v2_base_transport_wrap_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_config_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_config_service_v2_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.ConfigServiceV2GrpcTransport( @@ -14057,6 +14055,23 @@ def test_config_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.ConfigServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -14073,9 +14088,25 @@ def test_config_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.ConfigServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + -def test_config_service_v2_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_config_service_v2_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -14098,8 +14129,7 @@ def test_config_service_v2_base_transport_wrap_async_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_config_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_config_service_v2_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.ConfigServiceV2GrpcAsyncIOTransport( @@ -14122,6 +14152,23 @@ def test_config_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatc assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.ConfigServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -14137,3 +14184,20 @@ def test_config_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatc assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.ConfigServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_logging_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_logging_service_v2.py index 7c85c9efd6e3..4f3443ffa649 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_logging_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_logging_service_v2.py @@ -4449,8 +4449,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_logging_service_v2_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_logging_service_v2_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -4473,8 +4472,7 @@ def test_logging_service_v2_base_transport_wrap_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_logging_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_logging_service_v2_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.LoggingServiceV2GrpcTransport( @@ -4497,6 +4495,23 @@ def test_logging_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.LoggingServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -4513,9 +4528,25 @@ def test_logging_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.LoggingServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + -def test_logging_service_v2_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_logging_service_v2_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -4538,8 +4569,7 @@ def test_logging_service_v2_base_transport_wrap_async_method_modern(monkeypatch) assert "client_options" in mock_wrap.call_args.kwargs -def test_logging_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_logging_service_v2_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.LoggingServiceV2GrpcAsyncIOTransport( @@ -4562,6 +4592,23 @@ def test_logging_service_v2_base_transport_wrap_async_method_fallbacks(monkeypat assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.LoggingServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -4577,3 +4624,20 @@ def test_logging_service_v2_base_transport_wrap_async_method_fallbacks(monkeypat assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.LoggingServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_metrics_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_metrics_service_v2.py index 3ee26d38dbbe..590d022a4056 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_metrics_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_metrics_service_v2.py @@ -4249,8 +4249,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_metrics_service_v2_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_metrics_service_v2_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -4273,8 +4272,7 @@ def test_metrics_service_v2_base_transport_wrap_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_metrics_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_metrics_service_v2_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.MetricsServiceV2GrpcTransport( @@ -4297,6 +4295,23 @@ def test_metrics_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.MetricsServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -4313,9 +4328,25 @@ def test_metrics_service_v2_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.MetricsServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + -def test_metrics_service_v2_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_metrics_service_v2_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -4338,8 +4369,7 @@ def test_metrics_service_v2_base_transport_wrap_async_method_modern(monkeypatch) assert "client_options" in mock_wrap.call_args.kwargs -def test_metrics_service_v2_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_metrics_service_v2_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.MetricsServiceV2GrpcAsyncIOTransport( @@ -4362,6 +4392,23 @@ def test_metrics_service_v2_base_transport_wrap_async_method_fallbacks(monkeypat assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.MetricsServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -4377,3 +4424,20 @@ def test_metrics_service_v2_base_transport_wrap_async_method_fallbacks(monkeypat assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.MetricsServiceV2Transport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/redis/google/cloud/redis_v1/services/cloud_redis/transports/base.py b/packages/gapic-generator/tests/integration/goldens/redis/google/cloud/redis_v1/services/cloud_redis/transports/base.py index 0d8a80fe4103..7164fc0bfe5f 100755 --- a/packages/gapic-generator/tests/integration/goldens/redis/google/cloud/redis_v1/services/cloud_redis/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/redis/google/cloud/redis_v1/services/cloud_redis/transports/base.py @@ -167,8 +167,13 @@ def _wrap_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -201,8 +206,13 @@ def _wrap_async_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/tests/integration/goldens/redis/tests/unit/gapic/redis_v1/test_cloud_redis.py b/packages/gapic-generator/tests/integration/goldens/redis/tests/unit/gapic/redis_v1/test_cloud_redis.py index 9480978584fd..2dcd23f856aa 100755 --- a/packages/gapic-generator/tests/integration/goldens/redis/tests/unit/gapic/redis_v1/test_cloud_redis.py +++ b/packages/gapic-generator/tests/integration/goldens/redis/tests/unit/gapic/redis_v1/test_cloud_redis.py @@ -13303,8 +13303,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_cloud_redis_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_cloud_redis_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -13327,8 +13326,7 @@ def test_cloud_redis_base_transport_wrap_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_cloud_redis_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_cloud_redis_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.CloudRedisGrpcTransport( @@ -13351,6 +13349,23 @@ def test_cloud_redis_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.CloudRedisTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -13367,9 +13382,25 @@ def test_cloud_redis_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.CloudRedisTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + -def test_cloud_redis_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_cloud_redis_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -13392,8 +13423,7 @@ def test_cloud_redis_base_transport_wrap_async_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_cloud_redis_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_cloud_redis_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.CloudRedisGrpcAsyncIOTransport( @@ -13416,6 +13446,23 @@ def test_cloud_redis_base_transport_wrap_async_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.CloudRedisTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -13431,3 +13478,20 @@ def test_cloud_redis_base_transport_wrap_async_method_fallbacks(monkeypatch): assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.CloudRedisTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/redis_selective/google/cloud/redis_v1/services/cloud_redis/transports/base.py b/packages/gapic-generator/tests/integration/goldens/redis_selective/google/cloud/redis_v1/services/cloud_redis/transports/base.py index 273eed53f04c..da37256c19e4 100755 --- a/packages/gapic-generator/tests/integration/goldens/redis_selective/google/cloud/redis_v1/services/cloud_redis/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/redis_selective/google/cloud/redis_v1/services/cloud_redis/transports/base.py @@ -167,8 +167,13 @@ def _wrap_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -201,8 +206,13 @@ def _wrap_async_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/tests/integration/goldens/redis_selective/tests/unit/gapic/redis_v1/test_cloud_redis.py b/packages/gapic-generator/tests/integration/goldens/redis_selective/tests/unit/gapic/redis_v1/test_cloud_redis.py index 8bb0893a4aea..7237130575ff 100755 --- a/packages/gapic-generator/tests/integration/goldens/redis_selective/tests/unit/gapic/redis_v1/test_cloud_redis.py +++ b/packages/gapic-generator/tests/integration/goldens/redis_selective/tests/unit/gapic/redis_v1/test_cloud_redis.py @@ -8523,8 +8523,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_cloud_redis_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_cloud_redis_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -8547,8 +8546,7 @@ def test_cloud_redis_base_transport_wrap_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_cloud_redis_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_cloud_redis_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.CloudRedisGrpcTransport( @@ -8571,6 +8569,23 @@ def test_cloud_redis_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.CloudRedisTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -8587,9 +8602,25 @@ def test_cloud_redis_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.CloudRedisTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + -def test_cloud_redis_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_cloud_redis_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -8612,8 +8643,7 @@ def test_cloud_redis_base_transport_wrap_async_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_cloud_redis_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_cloud_redis_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.CloudRedisGrpcAsyncIOTransport( @@ -8636,6 +8666,23 @@ def test_cloud_redis_base_transport_wrap_async_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.CloudRedisTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -8651,3 +8698,20 @@ def test_cloud_redis_base_transport_wrap_async_method_fallbacks(monkeypatch): assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.CloudRedisTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/transports/base.py index 91fa07a2b880..f5e34a9f9aa7 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/transports/base.py @@ -168,8 +168,13 @@ def _wrap_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -202,8 +207,13 @@ def _wrap_async_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/identity/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/identity/transports/base.py index 49fbc30b88d8..8f44d529f6dd 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/identity/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/identity/transports/base.py @@ -168,8 +168,13 @@ def _wrap_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -202,8 +207,13 @@ def _wrap_async_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/messaging/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/messaging/transports/base.py index 15502730443d..c783a24ea331 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/messaging/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/messaging/transports/base.py @@ -169,8 +169,13 @@ def _wrap_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -203,8 +208,13 @@ def _wrap_async_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/base.py index 71f5298a2fbd..b9ca386076b2 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/resumable_upload_service/transports/base.py @@ -169,8 +169,13 @@ def _wrap_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -203,8 +208,13 @@ def _wrap_async_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/sequence_service/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/sequence_service/transports/base.py index a18b57d38122..f6b79c09fa5f 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/sequence_service/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/sequence_service/transports/base.py @@ -169,8 +169,13 @@ def _wrap_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -203,8 +208,13 @@ def _wrap_async_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/testing/transports/base.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/testing/transports/base.py index ba16abfa83c7..f0fc08e3ef55 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/testing/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/testing/transports/base.py @@ -168,8 +168,13 @@ def _wrap_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -202,8 +207,13 @@ def _wrap_async_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_echo.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_echo.py index bdf5b7388b15..ab41a74e8afa 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_echo.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_echo.py @@ -9782,8 +9782,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_echo_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_echo_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -9806,8 +9805,7 @@ def test_echo_base_transport_wrap_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_echo_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_echo_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.EchoGrpcTransport( @@ -9830,6 +9828,23 @@ def test_echo_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.EchoTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -9846,9 +9861,25 @@ def test_echo_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.EchoTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + -def test_echo_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_echo_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -9871,8 +9902,7 @@ def test_echo_base_transport_wrap_async_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_echo_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_echo_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.EchoGrpcAsyncIOTransport( @@ -9895,6 +9925,23 @@ def test_echo_base_transport_wrap_async_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.EchoTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -9910,3 +9957,20 @@ def test_echo_base_transport_wrap_async_method_fallbacks(monkeypatch): assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.EchoTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_identity.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_identity.py index 273f72a79e1a..1e96a08dcbdc 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_identity.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_identity.py @@ -6889,8 +6889,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_identity_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_identity_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -6913,8 +6912,7 @@ def test_identity_base_transport_wrap_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_identity_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_identity_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.IdentityGrpcTransport( @@ -6937,6 +6935,23 @@ def test_identity_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.IdentityTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -6953,9 +6968,25 @@ def test_identity_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.IdentityTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + -def test_identity_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_identity_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -6978,8 +7009,7 @@ def test_identity_base_transport_wrap_async_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_identity_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_identity_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.IdentityGrpcAsyncIOTransport( @@ -7002,6 +7032,23 @@ def test_identity_base_transport_wrap_async_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.IdentityTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -7017,3 +7064,20 @@ def test_identity_base_transport_wrap_async_method_fallbacks(monkeypatch): assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.IdentityTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_messaging.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_messaging.py index ae311784667d..4d366542f410 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_messaging.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_messaging.py @@ -11789,8 +11789,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_messaging_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_messaging_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -11813,8 +11812,7 @@ def test_messaging_base_transport_wrap_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_messaging_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_messaging_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.MessagingGrpcTransport( @@ -11837,6 +11835,23 @@ def test_messaging_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.MessagingTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -11853,9 +11868,25 @@ def test_messaging_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.MessagingTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + -def test_messaging_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_messaging_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -11878,8 +11909,7 @@ def test_messaging_base_transport_wrap_async_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_messaging_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_messaging_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.MessagingGrpcAsyncIOTransport( @@ -11902,6 +11932,23 @@ def test_messaging_base_transport_wrap_async_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.MessagingTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -11917,3 +11964,20 @@ def test_messaging_base_transport_wrap_async_method_fallbacks(monkeypatch): assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.MessagingTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_resumable_upload_service.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_resumable_upload_service.py index 5c5ec1a31dcb..cdf9f108e7bb 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_resumable_upload_service.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_resumable_upload_service.py @@ -4482,8 +4482,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_resumable_upload_service_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_resumable_upload_service_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -4506,8 +4505,7 @@ def test_resumable_upload_service_base_transport_wrap_method_modern(monkeypatch) assert "client_options" in mock_wrap.call_args.kwargs -def test_resumable_upload_service_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_resumable_upload_service_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.ResumableUploadServiceGrpcTransport( @@ -4530,6 +4528,23 @@ def test_resumable_upload_service_base_transport_wrap_method_fallbacks(monkeypat assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.ResumableUploadServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -4546,9 +4561,25 @@ def test_resumable_upload_service_base_transport_wrap_method_fallbacks(monkeypat assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.ResumableUploadServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + -def test_resumable_upload_service_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_resumable_upload_service_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -4571,8 +4602,7 @@ def test_resumable_upload_service_base_transport_wrap_async_method_modern(monkey assert "client_options" in mock_wrap.call_args.kwargs -def test_resumable_upload_service_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_resumable_upload_service_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.ResumableUploadServiceGrpcAsyncIOTransport( @@ -4595,6 +4625,23 @@ def test_resumable_upload_service_base_transport_wrap_async_method_fallbacks(mon assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.ResumableUploadServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -4610,3 +4657,20 @@ def test_resumable_upload_service_base_transport_wrap_async_method_fallbacks(mon assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.ResumableUploadServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_sequence_service.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_sequence_service.py index 205884f9dbef..78383ff9ec55 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_sequence_service.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_sequence_service.py @@ -7571,8 +7571,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_sequence_service_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_sequence_service_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -7595,8 +7594,7 @@ def test_sequence_service_base_transport_wrap_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_sequence_service_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_sequence_service_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.SequenceServiceGrpcTransport( @@ -7619,6 +7617,23 @@ def test_sequence_service_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.SequenceServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -7635,9 +7650,25 @@ def test_sequence_service_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.SequenceServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + -def test_sequence_service_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_sequence_service_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -7660,8 +7691,7 @@ def test_sequence_service_base_transport_wrap_async_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_sequence_service_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_sequence_service_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.SequenceServiceGrpcAsyncIOTransport( @@ -7684,6 +7714,23 @@ def test_sequence_service_base_transport_wrap_async_method_fallbacks(monkeypatch assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.SequenceServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -7699,3 +7746,20 @@ def test_sequence_service_base_transport_wrap_async_method_fallbacks(monkeypatch assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.SequenceServiceTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_testing.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_testing.py index e647e4c04abb..336faed128c4 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_testing.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_testing.py @@ -7760,8 +7760,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_testing_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_testing_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -7784,8 +7783,7 @@ def test_testing_base_transport_wrap_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_testing_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_testing_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.TestingGrpcTransport( @@ -7808,6 +7806,23 @@ def test_testing_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.TestingTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -7824,9 +7839,25 @@ def test_testing_base_transport_wrap_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.TestingTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + -def test_testing_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_testing_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -7849,8 +7880,7 @@ def test_testing_base_transport_wrap_async_method_modern(monkeypatch): assert "client_options" in mock_wrap.call_args.kwargs -def test_testing_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_testing_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.TestingGrpcAsyncIOTransport( @@ -7873,6 +7903,23 @@ def test_testing_base_transport_wrap_async_method_fallbacks(monkeypatch): assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.TestingTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -7888,3 +7935,20 @@ def test_testing_base_transport_wrap_async_method_fallbacks(monkeypatch): assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.TestingTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs diff --git a/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/google/cloud/storagebatchoperations_v1/services/storage_batch_operations/transports/base.py b/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/google/cloud/storagebatchoperations_v1/services/storage_batch_operations/transports/base.py index f3ca1dee16d5..5cf929454825 100755 --- a/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/google/cloud/storagebatchoperations_v1/services/storage_batch_operations/transports/base.py +++ b/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/google/cloud/storagebatchoperations_v1/services/storage_batch_operations/transports/base.py @@ -169,8 +169,13 @@ def _wrap_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) @@ -203,8 +208,13 @@ def _wrap_async_method(self, func, *args, **kwargs): for k in ["client_options", "method_name", "is_streaming"]: kwargs.pop(k, None) - if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and self.kind: - kwargs["kind"] = self.kind + try: + kind = self.kind + except NotImplementedError: + kind = None + + if _ASYNC_WRAP_METHOD_SUPPORTS_KIND and kind: + kwargs["kind"] = kind else: kwargs.pop("kind", None) diff --git a/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/tests/unit/gapic/storagebatchoperations_v1/test_storage_batch_operations.py b/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/tests/unit/gapic/storagebatchoperations_v1/test_storage_batch_operations.py index 529d35ff1e38..ac4ac6794b9f 100755 --- a/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/tests/unit/gapic/storagebatchoperations_v1/test_storage_batch_operations.py +++ b/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/tests/unit/gapic/storagebatchoperations_v1/test_storage_batch_operations.py @@ -8459,8 +8459,7 @@ def test_api_key_credentials(client_class, transport_class): ) -def test_storage_batch_operations_base_transport_wrap_method_modern(monkeypatch): - """Test wrap_method with modern google-api-core (supports tracing).""" +def test_storage_batch_operations_base_transport_wrap_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc" with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -8483,8 +8482,7 @@ def test_storage_batch_operations_base_transport_wrap_method_modern(monkeypatch) assert "client_options" in mock_wrap.call_args.kwargs -def test_storage_batch_operations_base_transport_wrap_method_fallbacks(monkeypatch): - """Test wrap_method defensive fallbacks with older google-api-core versions.""" +def test_storage_batch_operations_base_transport_wrap_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method"): transport = transports.StorageBatchOperationsGrpcTransport( @@ -8507,6 +8505,23 @@ def test_storage_batch_operations_base_transport_wrap_method_fallbacks(monkeypat assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.StorageBatchOperationsTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: @@ -8523,9 +8538,25 @@ def test_storage_batch_operations_base_transport_wrap_method_fallbacks(monkeypat assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method, "wrap_method") as mock_wrap: + base_transport = transports.StorageBatchOperationsTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + -def test_storage_batch_operations_base_transport_wrap_async_method_modern(monkeypatch): - """Test _wrap_async_method with modern google-api-core (supports tracing).""" +def test_storage_batch_operations_base_transport_wrap_async_method_modern_api_core(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", True) # 1. Concrete transport: passes client_options=None and kind="grpc_asyncio" with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -8548,8 +8579,7 @@ def test_storage_batch_operations_base_transport_wrap_async_method_modern(monkey assert "client_options" in mock_wrap.call_args.kwargs -def test_storage_batch_operations_base_transport_wrap_async_method_fallbacks(monkeypatch): - """Test _wrap_async_method defensive fallbacks with older google-api-core versions.""" +def test_storage_batch_operations_base_transport_wrap_async_method_older_api_core_fallbacks(monkeypatch): monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_TRACING", False) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method"): transport = transports.StorageBatchOperationsGrpcAsyncIOTransport( @@ -8572,6 +8602,23 @@ def test_storage_batch_operations_base_transport_wrap_async_method_fallbacks(mon assert "method_name" not in kwargs assert "is_streaming" not in kwargs + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.StorageBatchOperationsTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs + # Era 2: Intermediate google-api-core (>= 2.29.0, < 2.36.0: can be removed once google-api-core < 2.36.0 is no longer supported) monkeypatch.setattr(transports.base, "_ASYNC_WRAP_METHOD_SUPPORTS_KIND", True) with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: @@ -8587,3 +8634,20 @@ def test_storage_batch_operations_base_transport_wrap_async_method_fallbacks(mon assert "client_options" not in kwargs assert "method_name" not in kwargs assert "is_streaming" not in kwargs + + with mock.patch.object(transports.base.gapic_v1.method_async, "wrap_method") as mock_wrap: + base_transport = transports.StorageBatchOperationsTransport( + credentials=ga_credentials.AnonymousCredentials() + ) + func = mock.MagicMock() + base_transport._wrap_async_method( + func, + client_options="fake_options", + method_name="fake_method", + is_streaming=False, + ) + kwargs = mock_wrap.call_args.kwargs + assert "kind" not in kwargs + assert "client_options" not in kwargs + assert "method_name" not in kwargs + assert "is_streaming" not in kwargs