Skip to content

Commit c8e0760

Browse files
feat: [Many APIs] Add REST Interceptors which support reading metadata (#13500)
BEGIN_COMMIT_OVERRIDE feat: Add REST Interceptors which support reading metadata feat: Add support for reading selective GAPIC generation methods from service YAML chore: Update gapic-generator-python to v1.22.0 END_COMMIT_OVERRIDE - [ ] Regenerate this pull request now. feat: Add support for reading selective GAPIC generation methods from service YAML chore: Update gapic-generator-python to v1.22.0 PiperOrigin-RevId: 724026024 Source-Link: googleapis/googleapis@ad99638 Source-Link: googleapis/googleapis-gen@e291c4d Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXBhcmFtZXRlcm1hbmFnZXIvLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXBoaXNoaW5nLXByb3RlY3Rpb24vLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXBvbGljeS10cm91Ymxlc2hvb3Rlci8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXBvbGljeXNpbXVsYXRvci8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXBvbGljeXRyb3VibGVzaG9vdGVyLWlhbS8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXByaXZhdGUtY2EvLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXByaXZhdGUtY2F0YWxvZy8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXByaXZpbGVnZWRhY2Nlc3NtYW5hZ2VyLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXB1YmxpYy1jYS8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXF1b3Rhcy8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXJhcGlkbWlncmF0aW9uYXNzZXNzbWVudC8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXJlY2FwdGNoYS1lbnRlcnByaXNlLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXJlY29tbWVuZGF0aW9ucy1haS8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXJlY29tbWVuZGVyLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXJlZGlzLWNsdXN0ZXIvLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXJlZGlzLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXJlc291cmNlLW1hbmFnZXIvLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXJlc291cmNlLXNldHRpbmdzLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXJldGFpbC8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXNjaGVkdWxlci8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 --------- Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com> Co-authored-by: Anthonios Partheniou <[email protected]>
1 parent 5dabf55 commit c8e0760

File tree

265 files changed

+19165
-1656
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

265 files changed

+19165
-1656
lines changed

packages/google-cloud-phishing-protection/README.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps:
2626
1. `Select or create a Cloud Platform project.`_
2727
2. `Enable billing for your project.`_
2828
3. `Enable the Phishing Protection.`_
29-
4. `Setup Authentication.`_
29+
4. `Set up Authentication.`_
3030

3131
.. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project
3232
.. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project
3333
.. _Enable the Phishing Protection.: https://cloud.google.com/phishing-protection/docs/
34-
.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html
34+
.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html
3535

3636
Installation
3737
~~~~~~~~~~~~

packages/google-cloud-phishing-protection/google/cloud/phishingprotection/gapic_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515
#
16-
__version__ = "1.13.0" # {x-release-please-version}
16+
__version__ = "0.0.0" # {x-release-please-version}

packages/google-cloud-phishing-protection/google/cloud/phishingprotection_v1beta1/gapic_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515
#
16-
__version__ = "1.13.0" # {x-release-please-version}
16+
__version__ = "0.0.0" # {x-release-please-version}

packages/google-cloud-phishing-protection/google/cloud/phishingprotection_v1beta1/services/phishing_protection_service_v1_beta1/client.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
# limitations under the License.
1515
#
1616
from collections import OrderedDict
17+
from http import HTTPStatus
18+
import json
1719
import logging as std_logging
1820
import os
1921
import re
@@ -470,6 +472,33 @@ def _validate_universe_domain(self):
470472
# NOTE (b/349488459): universe validation is disabled until further notice.
471473
return True
472474

475+
def _add_cred_info_for_auth_errors(
476+
self, error: core_exceptions.GoogleAPICallError
477+
) -> None:
478+
"""Adds credential info string to error details for 401/403/404 errors.
479+
480+
Args:
481+
error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info.
482+
"""
483+
if error.code not in [
484+
HTTPStatus.UNAUTHORIZED,
485+
HTTPStatus.FORBIDDEN,
486+
HTTPStatus.NOT_FOUND,
487+
]:
488+
return
489+
490+
cred = self._transport._credentials
491+
492+
# get_cred_info is only available in google-auth>=2.35.0
493+
if not hasattr(cred, "get_cred_info"):
494+
return
495+
496+
# ignore the type check since pypy test fails when get_cred_info
497+
# is not available
498+
cred_info = cred.get_cred_info() # type: ignore
499+
if cred_info and hasattr(error._details, "append"):
500+
error._details.append(json.dumps(cred_info))
501+
473502
@property
474503
def api_endpoint(self):
475504
"""Return the API endpoint used by the client instance.

packages/google-cloud-phishing-protection/google/cloud/phishingprotection_v1beta1/services/phishing_protection_service_v1_beta1/transports/rest.py

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,38 @@ def post_report_phishing(
102102
) -> phishingprotection.ReportPhishingResponse:
103103
"""Post-rpc interceptor for report_phishing
104104
105-
Override in a subclass to manipulate the response
105+
DEPRECATED. Please use the `post_report_phishing_with_metadata`
106+
interceptor instead.
107+
108+
Override in a subclass to read or manipulate the response
106109
after it is returned by the PhishingProtectionServiceV1Beta1 server but before
107-
it is returned to user code.
110+
it is returned to user code. This `post_report_phishing` interceptor runs
111+
before the `post_report_phishing_with_metadata` interceptor.
108112
"""
109113
return response
110114

115+
def post_report_phishing_with_metadata(
116+
self,
117+
response: phishingprotection.ReportPhishingResponse,
118+
metadata: Sequence[Tuple[str, Union[str, bytes]]],
119+
) -> Tuple[
120+
phishingprotection.ReportPhishingResponse,
121+
Sequence[Tuple[str, Union[str, bytes]]],
122+
]:
123+
"""Post-rpc interceptor for report_phishing
124+
125+
Override in a subclass to read or manipulate the response or metadata after it
126+
is returned by the PhishingProtectionServiceV1Beta1 server but before it is returned to user code.
127+
128+
We recommend only using this `post_report_phishing_with_metadata`
129+
interceptor in new development instead of the `post_report_phishing` interceptor.
130+
When both interceptors are used, this `post_report_phishing_with_metadata` interceptor runs after the
131+
`post_report_phishing` interceptor. The (possibly modified) response returned by
132+
`post_report_phishing` will be passed to
133+
`post_report_phishing_with_metadata`.
134+
"""
135+
return response, metadata
136+
111137

112138
@dataclasses.dataclass
113139
class PhishingProtectionServiceV1Beta1RestStub:
@@ -325,6 +351,10 @@ def __call__(
325351
json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True)
326352

327353
resp = self._interceptor.post_report_phishing(resp)
354+
response_metadata = [(k, str(v)) for k, v in response.headers.items()]
355+
resp, _ = self._interceptor.post_report_phishing_with_metadata(
356+
resp, response_metadata
357+
)
328358
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(
329359
logging.DEBUG
330360
): # pragma: NO COVER

packages/google-cloud-phishing-protection/noxfile.py

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -382,20 +382,29 @@ def docfx(session):
382382
["python", "upb", "cpp"],
383383
)
384384
def prerelease_deps(session, protobuf_implementation):
385-
"""Run all tests with prerelease versions of dependencies installed."""
385+
"""
386+
Run all tests with pre-release versions of dependencies installed
387+
rather than the standard non pre-release versions.
388+
Pre-releases versions can be installed using
389+
`pip install --pre <package>`.
390+
"""
386391

387392
if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"):
388393
session.skip("cpp implementation is not supported in python 3.11+")
389394

390395
# Install all dependencies
391-
session.install("-e", ".[all, tests, tracing]")
396+
session.install("-e", ".")
397+
392398
unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES
399+
# Install dependencies for the unit test environment
393400
session.install(*unit_deps_all)
401+
394402
system_deps_all = (
395403
SYSTEM_TEST_STANDARD_DEPENDENCIES
396404
+ SYSTEM_TEST_EXTERNAL_DEPENDENCIES
397405
+ SYSTEM_TEST_EXTRAS
398406
)
407+
# Install dependencies for the system test environment
399408
session.install(*system_deps_all)
400409

401410
# Because we test minimum dependency versions on the minimum Python
@@ -417,6 +426,7 @@ def prerelease_deps(session, protobuf_implementation):
417426
)
418427
]
419428

429+
# Install dependencies specified in `testing/constraints-X.txt`.
420430
session.install(*constraints_deps)
421431

422432
prerel_deps = [
@@ -458,3 +468,70 @@ def prerelease_deps(session, protobuf_implementation):
458468
"PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation,
459469
},
460470
)
471+
472+
473+
@nox.session(python="3.13")
474+
@nox.parametrize(
475+
"protobuf_implementation",
476+
["python", "upb"],
477+
)
478+
def core_deps_from_source(session, protobuf_implementation):
479+
"""Run all tests with local versions of core dependencies installed,
480+
rather than pulling core dependencies from PyPI.
481+
"""
482+
483+
# Install all dependencies
484+
session.install(".")
485+
486+
# Install dependencies for the unit test environment
487+
unit_deps_all = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_EXTERNAL_DEPENDENCIES
488+
session.install(*unit_deps_all)
489+
490+
# Install dependencies for the system test environment
491+
system_deps_all = (
492+
SYSTEM_TEST_STANDARD_DEPENDENCIES
493+
+ SYSTEM_TEST_EXTERNAL_DEPENDENCIES
494+
+ SYSTEM_TEST_EXTRAS
495+
)
496+
session.install(*system_deps_all)
497+
498+
# Because we test minimum dependency versions on the minimum Python
499+
# version, the first version we test with in the unit tests sessions has a
500+
# constraints file containing all dependencies and extras that should be installed.
501+
with open(
502+
CURRENT_DIRECTORY
503+
/ "testing"
504+
/ f"constraints-{UNIT_TEST_PYTHON_VERSIONS[0]}.txt",
505+
encoding="utf-8",
506+
) as constraints_file:
507+
constraints_text = constraints_file.read()
508+
509+
# Ignore leading whitespace and comment lines.
510+
constraints_deps = [
511+
match.group(1)
512+
for match in re.finditer(
513+
r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE
514+
)
515+
]
516+
517+
# Install dependencies specified in `testing/constraints-X.txt`.
518+
session.install(*constraints_deps)
519+
520+
core_dependencies_from_source = [
521+
"google-api-core @ git+https://github.com/googleapis/python-api-core.git",
522+
"google-auth @ git+https://github.com/googleapis/google-auth-library-python.git",
523+
f"{CURRENT_DIRECTORY}/../googleapis-common-protos",
524+
f"{CURRENT_DIRECTORY}/../grpc-google-iam-v1",
525+
"proto-plus @ git+https://github.com/googleapis/proto-plus-python.git",
526+
]
527+
528+
for dep in core_dependencies_from_source:
529+
session.install(dep, "--ignore-installed", "--no-deps")
530+
531+
session.run(
532+
"py.test",
533+
"tests/unit",
534+
env={
535+
"PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation,
536+
},
537+
)

packages/google-cloud-phishing-protection/samples/generated_samples/snippet_metadata_google.cloud.phishingprotection.v1beta1.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
],
99
"language": "PYTHON",
1010
"name": "google-cloud-phishing-protection",
11-
"version": "1.13.0"
11+
"version": "0.1.0"
1212
},
1313
"snippets": [
1414
{

packages/google-cloud-phishing-protection/tests/unit/gapic/phishingprotection_v1beta1/test_phishing_protection_service_v1_beta1.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@
5959
)
6060
from google.cloud.phishingprotection_v1beta1.types import phishingprotection
6161

62+
CRED_INFO_JSON = {
63+
"credential_source": "/path/to/file",
64+
"credential_type": "service account credentials",
65+
"principal": "[email protected]",
66+
}
67+
CRED_INFO_STRING = json.dumps(CRED_INFO_JSON)
68+
6269

6370
async def mock_async_gen(data, chunk_size=1):
6471
for i in range(0, len(data)): # pragma: NO COVER
@@ -353,6 +360,49 @@ def test__get_universe_domain():
353360
assert str(excinfo.value) == "Universe Domain cannot be an empty string."
354361

355362

363+
@pytest.mark.parametrize(
364+
"error_code,cred_info_json,show_cred_info",
365+
[
366+
(401, CRED_INFO_JSON, True),
367+
(403, CRED_INFO_JSON, True),
368+
(404, CRED_INFO_JSON, True),
369+
(500, CRED_INFO_JSON, False),
370+
(401, None, False),
371+
(403, None, False),
372+
(404, None, False),
373+
(500, None, False),
374+
],
375+
)
376+
def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info):
377+
cred = mock.Mock(["get_cred_info"])
378+
cred.get_cred_info = mock.Mock(return_value=cred_info_json)
379+
client = PhishingProtectionServiceV1Beta1Client(credentials=cred)
380+
client._transport._credentials = cred
381+
382+
error = core_exceptions.GoogleAPICallError("message", details=["foo"])
383+
error.code = error_code
384+
385+
client._add_cred_info_for_auth_errors(error)
386+
if show_cred_info:
387+
assert error.details == ["foo", CRED_INFO_STRING]
388+
else:
389+
assert error.details == ["foo"]
390+
391+
392+
@pytest.mark.parametrize("error_code", [401, 403, 404, 500])
393+
def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code):
394+
cred = mock.Mock([])
395+
assert not hasattr(cred, "get_cred_info")
396+
client = PhishingProtectionServiceV1Beta1Client(credentials=cred)
397+
client._transport._credentials = cred
398+
399+
error = core_exceptions.GoogleAPICallError("message", details=[])
400+
error.code = error_code
401+
402+
client._add_cred_info_for_auth_errors(error)
403+
assert error.details == []
404+
405+
356406
@pytest.mark.parametrize(
357407
"client_class,transport_name",
358408
[
@@ -1936,11 +1986,15 @@ def test_report_phishing_rest_interceptors(null_interceptor):
19361986
transports.PhishingProtectionServiceV1Beta1RestInterceptor,
19371987
"post_report_phishing",
19381988
) as post, mock.patch.object(
1989+
transports.PhishingProtectionServiceV1Beta1RestInterceptor,
1990+
"post_report_phishing_with_metadata",
1991+
) as post_with_metadata, mock.patch.object(
19391992
transports.PhishingProtectionServiceV1Beta1RestInterceptor,
19401993
"pre_report_phishing",
19411994
) as pre:
19421995
pre.assert_not_called()
19431996
post.assert_not_called()
1997+
post_with_metadata.assert_not_called()
19441998
pb_message = phishingprotection.ReportPhishingRequest.pb(
19451999
phishingprotection.ReportPhishingRequest()
19462000
)
@@ -1966,6 +2020,10 @@ def test_report_phishing_rest_interceptors(null_interceptor):
19662020
]
19672021
pre.return_value = request, metadata
19682022
post.return_value = phishingprotection.ReportPhishingResponse()
2023+
post_with_metadata.return_value = (
2024+
phishingprotection.ReportPhishingResponse(),
2025+
metadata,
2026+
)
19692027

19702028
client.report_phishing(
19712029
request,
@@ -1977,6 +2035,7 @@ def test_report_phishing_rest_interceptors(null_interceptor):
19772035

19782036
pre.assert_called_once()
19792037
post.assert_called_once()
2038+
post_with_metadata.assert_called_once()
19802039

19812040

19822041
def test_initialize_client_w_rest():

packages/google-cloud-private-catalog/README.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ In order to use this library, you first need to go through the following steps:
2626
1. `Select or create a Cloud Platform project.`_
2727
2. `Enable billing for your project.`_
2828
3. `Enable the Private Catalog.`_
29-
4. `Setup Authentication.`_
29+
4. `Set up Authentication.`_
3030

3131
.. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project
3232
.. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project
3333
.. _Enable the Private Catalog.: https://cloud.google.com/private-catalog/
34-
.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html
34+
.. _Set up Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html
3535

3636
Installation
3737
~~~~~~~~~~~~

packages/google-cloud-private-catalog/google/cloud/privatecatalog/gapic_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515
#
16-
__version__ = "0.9.15" # {x-release-please-version}
16+
__version__ = "0.0.0" # {x-release-please-version}

0 commit comments

Comments
 (0)