Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .github/workflows/tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ jobs:
# TODO(https://github.com/googleapis/gapic-generator-python/issues/2121) Remove `showcase_w_rest_async` target when async rest is GA.
python: ["3.7", "3.13"]
target: [showcase, showcase_alternative_templates, showcase_w_rest_async]
logging_scope: ["", "google"]

runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
Expand Down Expand Up @@ -90,6 +92,9 @@ jobs:
unzip protoc-${PROTOC_VERSION}.zip
sudo ln -s /usr/src/protoc/bin/protoc /usr/local/bin/protoc
- name: Run showcase tests.
env:
# TODO(https://github.com/googleapis/gapic-generator-python/issues/2286): Construct nox sessions with logging enabled.
GOOGLE_SDK_PYTHON_LOGGING_SCOPE: ${{ matrix.logging_scope }}
run: nox -s ${{ matrix.target }}-${{ matrix.python }}
showcase-mtls:
if: ${{ false }} # TODO(dovs): reenable when #1218 is fixed
Expand Down Expand Up @@ -143,6 +148,7 @@ jobs:
python: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
# TODO(https://github.com/googleapis/gapic-generator-python/issues/2121) Remove `_w_rest_async` variant when async rest is GA.
variant: ['', _alternative_templates, _mixins, _alternative_templates_mixins, _w_rest_async]
logging_scope: ["", "google"]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
Expand All @@ -166,6 +172,9 @@ jobs:
- name: Install nox.
run: python -m pip install nox
- name: Run unit tests.
env:
# TODO(https://github.com/googleapis/gapic-generator-python/issues/2286): Construct nox sessions with logging enabled.
GOOGLE_SDK_PYTHON_LOGGING_SCOPE: ${{ matrix.logging_scope }}
run: nox -s showcase_unit${{ matrix.variant }}-${{ matrix.python }}
showcase-unit-add-iam-methods:
runs-on: ubuntu-latest
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ def test_{{ name|snake_case }}_rest_bad_request(transport: str = 'rest', request
response_value.status_code = 400
response_value.request = Request()
req.return_value = response_value
req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"}
client.{{ name|snake_case }}(request)

@pytest.mark.parametrize("request_type", [
Expand Down Expand Up @@ -50,6 +51,7 @@ def test_{{ name|snake_case }}_rest(request_type):

response_value._content = json_return_value.encode('UTF-8')
req.return_value = response_value
req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"}

response = client.{{ name|snake_case }}(request)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1096,6 +1096,7 @@ def test_{{ method_name }}_rest(request_type, transport: str = 'rest'):
req.return_value = Response()
req.return_value.status_code = 500
req.return_value.request = PreparedRequest()
req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"}
{% if method.void %}
json_return_value = ''
{% elif method.server_streaming %}
Expand Down Expand Up @@ -1249,6 +1250,7 @@ def test_{{ method.name|snake_case }}_rest(request_type):

response_value._content = json_return_value.encode('UTF-8')
req.return_value = response_value
req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"}
{% if method.client_streaming %}
response = client.{{ method.safe_name|snake_case }}(iter(requests))
{% elif method.server_streaming %}
Expand Down Expand Up @@ -1495,6 +1497,7 @@ def test_{{ method_name }}_rest_interceptors(null_interceptor):
}

req.return_value = Response()
req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"}
req.return_value.status_code = 200
req.return_value.request = PreparedRequest()
{% if not method.void %}
Expand Down Expand Up @@ -1545,6 +1548,7 @@ def test_{{ method_name }}_rest_bad_request(transport: str = 'rest', request_typ
response_value.status_code = 400
response_value.request = Request()
req.return_value = response_value
req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"}
{% if method.client_streaming %}
client.{{ method.safe_name|snake_case }}(iter(requests))
{% else %}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ def _get_http_options():
method_name (str): The method name.
service: The service.
is_async (bool): Used to determine the code path i.e. whether for sync or async call. #}
{% macro rest_call_method_common(body_spec, method_name, service, is_async=False) %}
{% macro rest_call_method_common(body_spec, method_name, service, is_async=False, is_proto_plus_type=False) %}
{% set service_name = service.name %}
{% set await_prefix = "await " if is_async else "" %}
{% set async_class_prefix = "Async" if is_async else "" %}
Expand All @@ -217,8 +217,14 @@ def _get_http_options():
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(logging.DEBUG): # pragma: NO COVER
request_url = "{host}{uri}".format(host=self._host, uri=transcoded_request['uri'])
method = transcoded_request['method']
try:
request_payload = {% if is_proto_plus_type %}type(request).to_json(request){% else %}json_format.MessageToJson(request){% endif %}

except:
{# TODO(https://github.com/googleapis/gapic-generator-python/issues/2282): Remove try/except and correctly parse request payload. #}
request_payload = None
http_request = {
"payload": type(request).to_json(request),
"payload": request_payload,
"requestMethod": method,
"requestUrl": request_url,
"headers": dict(metadata),
Expand Down Expand Up @@ -470,8 +476,13 @@ class _{{ name }}(_Base{{ service.name }}RestTransport._Base{{name}}, {{ async_m
resp = json_format.Parse(content, resp)
resp = {{ await_prefix }}self._interceptor.post_{{ name|snake_case }}(resp)
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(logging.DEBUG): # pragma: NO COVER
try:
response_payload = json_format.MessageToJson(resp)
except:
{# TODO(https://github.com/googleapis/gapic-generator-python/issues/2283): Remove try/except once unit tests are updated. #}
response_payload = None
http_response = {
"payload": json_format.MessageToJson(response),
"payload": response_payload,
"headers": dict(response.headers),
"status": response.status_code,
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,10 @@ from .transports.base import {{ service.name }}Transport, DEFAULT_CLIENT_INFO
from .transports.grpc_asyncio import {{ service.grpc_asyncio_transport_name }}
from .client import {{ service.client_name }}

try: # pragma: NO COVER
try:
from google.api_core import client_logging # type: ignore
CLIENT_LOGGING_SUPPORTED = True
except ImportError:
CLIENT_LOGGING_SUPPORTED = True # pragma: NO COVER
except ImportError: # pragma: NO COVER
CLIENT_LOGGING_SUPPORTED = False

_LOGGER = std_logging.getLogger(__name__)
Expand Down Expand Up @@ -257,9 +257,12 @@ class {{ service.async_client_name }}:
extra = {
"serviceName": "{{ service.meta.address.proto }}",
"universeDomain": getattr(self._client._transport._credentials, "universe_domain", ""),
"credentialType": f"{type(self._client._transport._credentials).__module__}.{type(self._client._transport._credentials).__qualname__}",
"credentialInfo": getattr(self.transport._credentials, "get_cred_info", lambda: None)(),
},
"credentialsType": f"{type(self._client._transport._credentials).__module__}.{type(self._client._transport._credentials).__qualname__}",
"credentialsInfo": getattr(self.transport._credentials, "get_cred_info", lambda: None)(),
} if hasattr(self._client._transport, "_credentials") else {
"serviceName": "{{ service.meta.address.proto }}",
"credentialsType": None,
}
)

{% for method in service.methods.values() %}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,10 @@ try:
except AttributeError: # pragma: NO COVER
OptionalRetry = Union[retries.Retry, object, None] # type: ignore

try: # pragma: NO COVER
try:
from google.api_core import client_logging # type: ignore
CLIENT_LOGGING_SUPPORTED = True
except ImportError:
CLIENT_LOGGING_SUPPORTED = True # pragma: NO COVER
except ImportError: # pragma: NO COVER
CLIENT_LOGGING_SUPPORTED = False

_LOGGER = std_logging.getLogger(__name__)
Expand Down Expand Up @@ -619,7 +619,10 @@ class {{ service.client_name }}(metaclass={{ service.client_name }}Meta):
"universeDomain": getattr(self._transport._credentials, "universe_domain", ""),
"credentialsType": f"{type(self._transport._credentials).__module__}.{type(self._transport._credentials).__qualname__}",
"credentialsInfo": getattr(self.transport._credentials, "get_cred_info", lambda: None)(),
},
} if hasattr(self._transport, "_credentials") else {
"serviceName": "{{ service.meta.address.proto }}",
"credentialsType": None,
}
)


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,10 @@ try:
except AttributeError: # pragma: NO COVER
OptionalRetry = Union[retries.Retry, object, None] # type: ignore

try: # pragma: NO COVER
try:
from google.api_core import client_logging # type: ignore
CLIENT_LOGGING_SUPPORTED = True
except ImportError:
CLIENT_LOGGING_SUPPORTED = True # pragma: NO COVER
except ImportError: # pragma: NO COVER
CLIENT_LOGGING_SUPPORTED = False

_LOGGER = logging.getLogger(__name__)
Expand Down Expand Up @@ -235,7 +235,7 @@ class {{service.name}}RestTransport(_Base{{ service.name }}RestTransport):
{% endif %}
"""

{{ shared_macros.rest_call_method_common(body_spec, method.name, service)|indent(8) }}
{{ shared_macros.rest_call_method_common(body_spec, method.name, service, False, method.output.ident.is_proto_plus_type)|indent(8) }}

{% if not method.void %}
# Return the response
Expand All @@ -259,8 +259,14 @@ class {{service.name}}RestTransport(_Base{{ service.name }}RestTransport):
{# TODO(https://github.com/googleapis/gapic-generator-python/issues/2279): Add logging support for rest streaming. #}
{% if not method.server_streaming %}
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(logging.DEBUG): # pragma: NO COVER
try:
response_payload = {% if method.output.ident.is_proto_plus_type %}{{ method.output.ident }}.to_json(response){% else %}json_format.MessageToJson(resp){% endif %}

except:
{# TODO(https://github.com/googleapis/gapic-generator-python/issues/2283): Remove try/except once unit tests are updated. #}
response_payload = None
http_response = {
"payload": {% if method.output.ident.is_proto_plus_type %}{{ method.output.ident }}.to_json(resp){% else %}json_format.MessageToJson(resp){% endif %},
"payload": response_payload,
"headers": dict(response.headers),
"status": response.status_code,
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,10 @@ from .base import DEFAULT_CLIENT_INFO as BASE_DEFAULT_CLIENT_INFO

import logging

try: # pragma: NO COVER
try:
from google.api_core import client_logging # type: ignore
CLIENT_LOGGING_SUPPORTED = True
except ImportError:
CLIENT_LOGGING_SUPPORTED = True # pragma: NO COVER
except ImportError: # pragma: NO COVER
CLIENT_LOGGING_SUPPORTED = False

_LOGGER = logging.getLogger(__name__)
Expand Down Expand Up @@ -199,7 +199,7 @@ class Async{{service.name}}RestTransport(_Base{{ service.name }}RestTransport):
{% endif %}
"""

{{ shared_macros.rest_call_method_common(body_spec, method.name, service, is_async=True)|indent(8) }}
{{ shared_macros.rest_call_method_common(body_spec, method.name, service, True, method.output.ident.is_proto_plus_type)|indent(8) }}

{% if not method.void %}
# Return the response
Expand All @@ -220,8 +220,14 @@ class Async{{service.name}}RestTransport(_Base{{ service.name }}RestTransport):
{# TODO(https://github.com/googleapis/gapic-generator-python/issues/2279): Add logging support for rest streaming. #}
{% if not method.server_streaming %}
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(logging.DEBUG): # pragma: NO COVER
try:
response_payload = {% if method.output.ident.is_proto_plus_type %}{{ method.output.ident }}.to_json(response){% else %}json_format.MessageToJson(resp){% endif %}

except:
{# TODO(https://github.com/googleapis/gapic-generator-python/issues/2283): Remove try/except once unit tests are updated. #}
response_payload = None
http_response = {
"payload": {% if method.output.ident.is_proto_plus_type %}{{ method.output.ident }}.to_json(response){% else %}json_format.MessageToJson(response){% endif %},
"payload": response_payload,
"headers": str(dict(response.headers)),
"status": "OK", # need to obtain this properly
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1171,6 +1171,7 @@ def test_{{ method_name }}_rest_required_fields(request_type={{ method.input.ide

response_value._content = json_return_value.encode('UTF-8')
req.return_value = response_value
req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"}

{% if method.client_streaming %}
response = client.{{ method_name }}(iter(requests))
Expand Down Expand Up @@ -1263,6 +1264,7 @@ def test_{{ method_name }}_rest_flattened():
{% endif %}
response_value._content = json_return_value.encode('UTF-8')
req.return_value = response_value
req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"}

{% if method.server_streaming %}
with mock.patch.object(response_value, 'iter_content') as iter_content:
Expand Down Expand Up @@ -1796,6 +1798,7 @@ def test_initialize_client_w_{{transport_name}}():
response_value.status_code = 400
response_value.request = mock.Mock()
req.return_value = response_value
req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"}
{{ await_prefix }}client.{{ method_name }}(request)

{% endif %}{# if 'grpc' in transport #}
Expand Down Expand Up @@ -1846,6 +1849,7 @@ def test_initialize_client_w_{{transport_name}}():
response_value.request = Request()
{% endif %}
req.return_value = response_value
req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"}
{{ await_prefix }}client.{{ method_name }}(request)
{% endif %}{# if 'grpc' in transport #}
{% endmacro %}
Expand Down Expand Up @@ -2029,6 +2033,7 @@ def test_initialize_client_w_{{transport_name}}():
{% endif %}{# is_async #}
{% endif %}{# method.server_streaming #}
req.return_value = response_value
req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"}
response = {{ await_prefix }}client.{{ method_name }}(request)
{% if "next_page_token" in method_output.fields.values()|map(attribute='name', default="") and not method.paged_result_field %}
{# TODO(https://github.com/googleapis/gapic-generator-python/issues/2199): The following assert statement is added to force
Expand Down Expand Up @@ -2139,6 +2144,7 @@ def test_initialize_client_w_{{transport_name}}():
{% endif %}

req.return_value = response_value
req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"}

response = {{ await_prefix }}client.{{ method_name }}(request)

Expand Down Expand Up @@ -2232,6 +2238,7 @@ def test_initialize_client_w_{{transport_name}}():

req.return_value = mock.Mock()
req.return_value.status_code = 200
req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"}
{% if not method.void %}
return_value = {% if method.output.ident.is_proto_plus_type %}{{ method.output.ident }}.to_json({{ method.output.ident }}()){% else %}json_format.MessageToJson({{ method.output.ident }}()){% endif %}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,10 @@
from .transports.grpc_asyncio import AssetServiceGrpcAsyncIOTransport
from .client import AssetServiceClient

try: # pragma: NO COVER
try:
from google.api_core import client_logging # type: ignore
CLIENT_LOGGING_SUPPORTED = True
except ImportError:
CLIENT_LOGGING_SUPPORTED = True # pragma: NO COVER
except ImportError: # pragma: NO COVER
CLIENT_LOGGING_SUPPORTED = False

_LOGGER = std_logging.getLogger(__name__)
Expand Down Expand Up @@ -261,9 +261,12 @@ def __init__(self, *,
extra = {
"serviceName": "google.cloud.asset.v1.AssetService",
"universeDomain": getattr(self._client._transport._credentials, "universe_domain", ""),
"credentialType": f"{type(self._client._transport._credentials).__module__}.{type(self._client._transport._credentials).__qualname__}",
"credentialInfo": getattr(self.transport._credentials, "get_cred_info", lambda: None)(),
},
"credentialsType": f"{type(self._client._transport._credentials).__module__}.{type(self._client._transport._credentials).__qualname__}",
"credentialsInfo": getattr(self.transport._credentials, "get_cred_info", lambda: None)(),
} if hasattr(self._client._transport, "_credentials") else {
"serviceName": "google.cloud.asset.v1.AssetService",
"credentialsType": None,
}
)

async def export_assets(self,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,10 @@
except AttributeError: # pragma: NO COVER
OptionalRetry = Union[retries.Retry, object, None] # type: ignore

try: # pragma: NO COVER
try:
from google.api_core import client_logging # type: ignore
CLIENT_LOGGING_SUPPORTED = True
except ImportError:
CLIENT_LOGGING_SUPPORTED = True # pragma: NO COVER
except ImportError: # pragma: NO COVER
CLIENT_LOGGING_SUPPORTED = False

_LOGGER = std_logging.getLogger(__name__)
Expand Down Expand Up @@ -640,7 +640,10 @@ def __init__(self, *,
"universeDomain": getattr(self._transport._credentials, "universe_domain", ""),
"credentialsType": f"{type(self._transport._credentials).__module__}.{type(self._transport._credentials).__qualname__}",
"credentialsInfo": getattr(self.transport._credentials, "get_cred_info", lambda: None)(),
},
} if hasattr(self._transport, "_credentials") else {
"serviceName": "google.cloud.asset.v1.AssetService",
"credentialsType": None,
}
)

def export_assets(self,
Expand Down
Loading
Loading