Skip to content

Commit 2001c79

Browse files
committed
feat(generator): add _compat.py fallback for setup_request_id
1 parent 31ae5ec commit 2001c79

4 files changed

Lines changed: 39 additions & 3 deletions

File tree

packages/gapic-generator/gapic/generator/generator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ def get_response(self, api_schema: api.API, opts: Options) -> CodeGeneratorRespo
120120
for template_name in client_templates:
121121
# Quick check: Skip "private" templates.
122122
filename = template_name.split("/")[-1]
123-
if filename.startswith("_") and filename != "__init__.py.j2":
123+
if filename.startswith("_") and filename not in ("__init__.py.j2", "_compat.py.j2"):
124124
continue
125125

126126
# Append to the output files dictionary.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# {% include '_license.j2' %}
2+
3+
import uuid
4+
5+
try:
6+
from google.api_core.gapic_v1.requests import setup_request_id
7+
except ImportError:
8+
# TODO: Remove this fallback when google-api-core >= 2.18.0 is the minimum required version.
9+
def setup_request_id(request, field_name: str, is_proto3_optional: bool):
10+
"""Populate a UUID4 field in the request if it is not already set.
11+
12+
Args:
13+
request (Union[google.protobuf.message.Message, dict]): The request object.
14+
field_name (str): The name of the field to populate.
15+
is_proto3_optional (bool): Whether the field is proto3 optional.
16+
"""
17+
if isinstance(request, dict):
18+
if is_proto3_optional:
19+
if field_name not in request:
20+
request[field_name] = str(uuid.uuid4())
21+
elif not request.get(field_name):
22+
request[field_name] = str(uuid.uuid4())
23+
return
24+
25+
if is_proto3_optional:
26+
try:
27+
# Pure protobuf messages
28+
if not request.HasField(field_name):
29+
setattr(request, field_name, str(uuid.uuid4()))
30+
except (AttributeError, ValueError):
31+
# Proto-plus messages or other objects
32+
if field_name not in request:
33+
setattr(request, field_name, str(uuid.uuid4()))
34+
else:
35+
if not getattr(request, field_name):
36+
setattr(request, field_name, str(uuid.uuid4()))

packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/async_client.py.j2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ from google.api_core.client_options import ClientOptions
2727
from google.api_core import exceptions as core_exceptions
2828
from google.api_core import gapic_v1
2929
{% if has_auto_populated_fields.value %}
30-
from google.api_core.gapic_v1.requests import setup_request_id
30+
from {{package_path}}._compat import setup_request_id
3131
{% endif %}
3232
from google.api_core import retry_async as retries
3333
from google.auth import credentials as ga_credentials # type: ignore

packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/client.py.j2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ from google.api_core import extended_operation
3636
{% endif %}
3737
from google.api_core import gapic_v1
3838
{% if has_auto_populated_fields.value %}
39-
from google.api_core.gapic_v1.requests import setup_request_id
39+
from {{package_path}}._compat import setup_request_id
4040
{% endif %}
4141
from google.api_core import retry as retries
4242
from google.auth import credentials as ga_credentials # type: ignore

0 commit comments

Comments
 (0)