google-cloud-securesourcemanager 0.1.17__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. {google_cloud_securesourcemanager-0.1.17/google_cloud_securesourcemanager.egg-info → google_cloud_securesourcemanager-0.3.0}/PKG-INFO +5 -2
  2. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/README.rst +1 -1
  3. google_cloud_securesourcemanager-0.3.0/google/cloud/securesourcemanager/gapic_version.py +16 -0
  4. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google/cloud/securesourcemanager_v1/__init__.py +104 -0
  5. google_cloud_securesourcemanager-0.3.0/google/cloud/securesourcemanager_v1/gapic_version.py +16 -0
  6. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google/cloud/securesourcemanager_v1/services/secure_source_manager/async_client.py +13 -13
  7. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google/cloud/securesourcemanager_v1/services/secure_source_manager/client.py +45 -27
  8. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google/cloud/securesourcemanager_v1/services/secure_source_manager/transports/base.py +3 -2
  9. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google/cloud/securesourcemanager_v1/services/secure_source_manager/transports/grpc.py +5 -3
  10. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google/cloud/securesourcemanager_v1/services/secure_source_manager/transports/grpc_asyncio.py +5 -3
  11. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google/cloud/securesourcemanager_v1/services/secure_source_manager/transports/rest.py +3 -2
  12. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google/cloud/securesourcemanager_v1/types/secure_source_manager.py +7 -7
  13. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0/google_cloud_securesourcemanager.egg-info}/PKG-INFO +5 -2
  14. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google_cloud_securesourcemanager.egg-info/requires.txt +4 -0
  15. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/setup.py +3 -0
  16. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/tests/unit/gapic/securesourcemanager_v1/test_secure_source_manager.py +226 -29
  17. google_cloud_securesourcemanager-0.1.17/google/cloud/securesourcemanager/gapic_version.py +0 -16
  18. google_cloud_securesourcemanager-0.1.17/google/cloud/securesourcemanager_v1/gapic_version.py +0 -16
  19. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/LICENSE +0 -0
  20. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/MANIFEST.in +0 -0
  21. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google/cloud/securesourcemanager/__init__.py +0 -0
  22. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google/cloud/securesourcemanager/py.typed +0 -0
  23. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google/cloud/securesourcemanager_v1/gapic_metadata.json +0 -0
  24. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google/cloud/securesourcemanager_v1/py.typed +0 -0
  25. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google/cloud/securesourcemanager_v1/services/__init__.py +0 -0
  26. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google/cloud/securesourcemanager_v1/services/secure_source_manager/__init__.py +0 -0
  27. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google/cloud/securesourcemanager_v1/services/secure_source_manager/pagers.py +0 -0
  28. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google/cloud/securesourcemanager_v1/services/secure_source_manager/transports/__init__.py +0 -0
  29. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google/cloud/securesourcemanager_v1/services/secure_source_manager/transports/rest_base.py +0 -0
  30. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google/cloud/securesourcemanager_v1/types/__init__.py +0 -0
  31. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google_cloud_securesourcemanager.egg-info/SOURCES.txt +0 -0
  32. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google_cloud_securesourcemanager.egg-info/dependency_links.txt +0 -0
  33. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google_cloud_securesourcemanager.egg-info/not-zip-safe +0 -0
  34. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/google_cloud_securesourcemanager.egg-info/top_level.txt +0 -0
  35. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/setup.cfg +0 -0
  36. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/tests/__init__.py +0 -0
  37. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/tests/unit/__init__.py +0 -0
  38. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/tests/unit/gapic/__init__.py +0 -0
  39. {google_cloud_securesourcemanager-0.1.17 → google_cloud_securesourcemanager-0.3.0}/tests/unit/gapic/securesourcemanager_v1/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: google-cloud-securesourcemanager
3
- Version: 0.1.17
3
+ Version: 0.3.0
4
4
  Summary: Google Cloud Securesourcemanager API client library
5
5
  Home-page: https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-securesourcemanager
6
6
  Author: Google LLC
@@ -19,12 +19,15 @@ Classifier: Programming Language :: Python :: 3.10
19
19
  Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Programming Language :: Python :: 3.14
22
23
  Classifier: Operating System :: OS Independent
23
24
  Classifier: Topic :: Internet
24
25
  Requires-Python: >=3.7
25
26
  License-File: LICENSE
26
27
  Requires-Dist: google-api-core[grpc]!=2.0.*,!=2.1.*,!=2.10.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,<3.0.0,>=1.34.1
27
28
  Requires-Dist: google-auth!=2.24.0,!=2.25.0,<3.0.0,>=2.14.1
29
+ Requires-Dist: grpcio<2.0.0,>=1.33.2
30
+ Requires-Dist: grpcio<2.0.0,>=1.75.1; python_version >= "3.14"
28
31
  Requires-Dist: proto-plus<2.0.0,>=1.22.3
29
32
  Requires-Dist: proto-plus<2.0.0,>=1.25.0; python_version >= "3.13"
30
33
  Requires-Dist: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<7.0.0,>=3.20.2
@@ -104,7 +107,7 @@ Supported Python Versions
104
107
  Our client libraries are compatible with all current `active`_ and `maintenance`_ versions of
105
108
  Python.
106
109
 
107
- Python >= 3.7
110
+ Python >= 3.7, including 3.14
108
111
 
109
112
  .. _active: https://devguide.python.org/devcycle/#in-development-main-branch
110
113
  .. _maintenance: https://devguide.python.org/devcycle/#maintenance-branches
@@ -61,7 +61,7 @@ Supported Python Versions
61
61
  Our client libraries are compatible with all current `active`_ and `maintenance`_ versions of
62
62
  Python.
63
63
 
64
- Python >= 3.7
64
+ Python >= 3.7, including 3.14
65
65
 
66
66
  .. _active: https://devguide.python.org/devcycle/#in-development-main-branch
67
67
  .. _maintenance: https://devguide.python.org/devcycle/#maintenance-branches
@@ -0,0 +1,16 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright 2025 Google LLC
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ __version__ = "0.3.0" # {x-release-please-version}
@@ -13,10 +13,20 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
+ import sys
17
+
18
+ import google.api_core as api_core
19
+
16
20
  from google.cloud.securesourcemanager_v1 import gapic_version as package_version
17
21
 
18
22
  __version__ = package_version.__version__
19
23
 
24
+ if sys.version_info >= (3, 8): # pragma: NO COVER
25
+ from importlib import metadata
26
+ else: # pragma: NO COVER
27
+ # TODO(https://github.com/googleapis/python-api-core/issues/835): Remove
28
+ # this code path once we drop support for Python 3.7
29
+ import importlib_metadata as metadata
20
30
 
21
31
  from .services.secure_source_manager import (
22
32
  SecureSourceManagerAsyncClient,
@@ -99,6 +109,100 @@ from .types.secure_source_manager import (
99
109
  UpdateRepositoryRequest,
100
110
  )
101
111
 
112
+ if hasattr(api_core, "check_python_version") and hasattr(
113
+ api_core, "check_dependency_versions"
114
+ ): # pragma: NO COVER
115
+ api_core.check_python_version("google.cloud.securesourcemanager_v1") # type: ignore
116
+ api_core.check_dependency_versions("google.cloud.securesourcemanager_v1") # type: ignore
117
+ else: # pragma: NO COVER
118
+ # An older version of api_core is installed which does not define the
119
+ # functions above. We do equivalent checks manually.
120
+ try:
121
+ import sys
122
+ import warnings
123
+
124
+ _py_version_str = sys.version.split()[0]
125
+ _package_label = "google.cloud.securesourcemanager_v1"
126
+ if sys.version_info < (3, 9):
127
+ warnings.warn(
128
+ "You are using a non-supported Python version "
129
+ + f"({_py_version_str}). Google will not post any further "
130
+ + f"updates to {_package_label} supporting this Python version. "
131
+ + "Please upgrade to the latest Python version, or at "
132
+ + f"least to Python 3.9, and then update {_package_label}.",
133
+ FutureWarning,
134
+ )
135
+ if sys.version_info[:2] == (3, 9):
136
+ warnings.warn(
137
+ f"You are using a Python version ({_py_version_str}) "
138
+ + f"which Google will stop supporting in {_package_label} in "
139
+ + "January 2026. Please "
140
+ + "upgrade to the latest Python version, or at "
141
+ + "least to Python 3.10, before then, and "
142
+ + f"then update {_package_label}.",
143
+ FutureWarning,
144
+ )
145
+
146
+ def parse_version_to_tuple(version_string: str):
147
+ """Safely converts a semantic version string to a comparable tuple of integers.
148
+ Example: "4.25.8" -> (4, 25, 8)
149
+ Ignores non-numeric parts and handles common version formats.
150
+ Args:
151
+ version_string: Version string in the format "x.y.z" or "x.y.z<suffix>"
152
+ Returns:
153
+ Tuple of integers for the parsed version string.
154
+ """
155
+ parts = []
156
+ for part in version_string.split("."):
157
+ try:
158
+ parts.append(int(part))
159
+ except ValueError:
160
+ # If it's a non-numeric part (e.g., '1.0.0b1' -> 'b1'), stop here.
161
+ # This is a simplification compared to 'packaging.parse_version', but sufficient
162
+ # for comparing strictly numeric semantic versions.
163
+ break
164
+ return tuple(parts)
165
+
166
+ def _get_version(dependency_name):
167
+ try:
168
+ version_string: str = metadata.version(dependency_name)
169
+ parsed_version = parse_version_to_tuple(version_string)
170
+ return (parsed_version, version_string)
171
+ except Exception:
172
+ # Catch exceptions from metadata.version() (e.g., PackageNotFoundError)
173
+ # or errors during parse_version_to_tuple
174
+ return (None, "--")
175
+
176
+ _dependency_package = "google.protobuf"
177
+ _next_supported_version = "4.25.8"
178
+ _next_supported_version_tuple = (4, 25, 8)
179
+ _recommendation = " (we recommend 6.x)"
180
+ (_version_used, _version_used_string) = _get_version(_dependency_package)
181
+ if _version_used and _version_used < _next_supported_version_tuple:
182
+ warnings.warn(
183
+ f"Package {_package_label} depends on "
184
+ + f"{_dependency_package}, currently installed at version "
185
+ + f"{_version_used_string}. Future updates to "
186
+ + f"{_package_label} will require {_dependency_package} at "
187
+ + f"version {_next_supported_version} or higher{_recommendation}."
188
+ + " Please ensure "
189
+ + "that either (a) your Python environment doesn't pin the "
190
+ + f"version of {_dependency_package}, so that updates to "
191
+ + f"{_package_label} can require the higher version, or "
192
+ + "(b) you manually update your Python environment to use at "
193
+ + f"least version {_next_supported_version} of "
194
+ + f"{_dependency_package}.",
195
+ FutureWarning,
196
+ )
197
+ except Exception:
198
+ warnings.warn(
199
+ "Could not determine the version of Python "
200
+ + "currently being used. To continue receiving "
201
+ + "updates for {_package_label}, ensure you are "
202
+ + "using a supported version of Python; see "
203
+ + "https://devguide.python.org/versions/"
204
+ )
205
+
102
206
  __all__ = (
103
207
  "SecureSourceManagerAsyncClient",
104
208
  "BatchCreatePullRequestCommentsRequest",
@@ -0,0 +1,16 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright 2025 Google LLC
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ __version__ = "0.3.0" # {x-release-please-version}
@@ -1984,7 +1984,7 @@ class SecureSourceManagerAsyncClient:
1984
1984
  overwritten in the hook resource by the update. The
1985
1985
  fields specified in the update_mask are relative to the
1986
1986
  resource, not the full request. A field will be
1987
- overwritten if it is in the mask. The special value "*"
1987
+ overwritten if it is in the mask. The special value "\*"
1988
1988
  means full replacement.
1989
1989
 
1990
1990
  This corresponds to the ``update_mask`` field
@@ -2278,19 +2278,19 @@ class SecureSourceManagerAsyncClient:
2278
2278
  constraints based on attributes of the request, the
2279
2279
  resource, or both. To learn which resources support
2280
2280
  conditions in their IAM policies, see the [IAM
2281
- documentation](\ https://cloud.google.com/iam/help/conditions/resource-policies).
2281
+ documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
2282
2282
 
2283
2283
  **JSON example:**
2284
2284
 
2285
- :literal:`\` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \`
2285
+ :literal:`` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \`
2286
2286
 
2287
2287
  **YAML example:**
2288
2288
 
2289
- :literal:`\` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \`
2289
+ :literal:`` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \`
2290
2290
 
2291
2291
  For a description of IAM and its features, see the
2292
2292
  [IAM
2293
- documentation](\ https://cloud.google.com/iam/docs/).
2293
+ documentation](https://cloud.google.com/iam/docs/).
2294
2294
 
2295
2295
  """
2296
2296
  # Create or coerce a protobuf request object.
@@ -2416,19 +2416,19 @@ class SecureSourceManagerAsyncClient:
2416
2416
  constraints based on attributes of the request, the
2417
2417
  resource, or both. To learn which resources support
2418
2418
  conditions in their IAM policies, see the [IAM
2419
- documentation](\ https://cloud.google.com/iam/help/conditions/resource-policies).
2419
+ documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
2420
2420
 
2421
2421
  **JSON example:**
2422
2422
 
2423
- :literal:`\` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \`
2423
+ :literal:`` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \`
2424
2424
 
2425
2425
  **YAML example:**
2426
2426
 
2427
- :literal:`\` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \`
2427
+ :literal:`` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \`
2428
2428
 
2429
2429
  For a description of IAM and its features, see the
2430
2430
  [IAM
2431
- documentation](\ https://cloud.google.com/iam/docs/).
2431
+ documentation](https://cloud.google.com/iam/docs/).
2432
2432
 
2433
2433
  """
2434
2434
  # Create or coerce a protobuf request object.
@@ -3031,7 +3031,7 @@ class SecureSourceManagerAsyncClient:
3031
3031
  overwritten in the branchRule resource by the update.
3032
3032
  The fields specified in the update_mask are relative to
3033
3033
  the resource, not the full request. A field will be
3034
- overwritten if it is in the mask. The special value "*"
3034
+ overwritten if it is in the mask. The special value "\*"
3035
3035
  means full replacement.
3036
3036
 
3037
3037
  This corresponds to the ``update_mask`` field
@@ -3697,7 +3697,7 @@ class SecureSourceManagerAsyncClient:
3697
3697
  overwritten in the pull request resource by the update.
3698
3698
  The fields specified in the update_mask are relative to
3699
3699
  the resource, not the full request. A field will be
3700
- overwritten if it is in the mask. The special value "*"
3700
+ overwritten if it is in the mask. The special value "\*"
3701
3701
  means full replacement.
3702
3702
 
3703
3703
  This corresponds to the ``update_mask`` field
@@ -4921,7 +4921,7 @@ class SecureSourceManagerAsyncClient:
4921
4921
  overwritten in the issue resource by the update. The
4922
4922
  fields specified in the update_mask are relative to the
4923
4923
  resource, not the full request. A field will be
4924
- overwritten if it is in the mask. The special value "*"
4924
+ overwritten if it is in the mask. The special value "\*"
4925
4925
  means full replacement.
4926
4926
 
4927
4927
  This corresponds to the ``update_mask`` field
@@ -6974,7 +6974,7 @@ class SecureSourceManagerAsyncClient:
6974
6974
  overwritten in the issue comment resource by the update.
6975
6975
  The fields specified in the update_mask are relative to
6976
6976
  the resource, not the full request. A field will be
6977
- overwritten if it is in the mask. The special value "*"
6977
+ overwritten if it is in the mask. The special value "\*"
6978
6978
  means full replacement.
6979
6979
 
6980
6980
  This corresponds to the ``update_mask`` field
@@ -163,6 +163,34 @@ class SecureSourceManagerClient(metaclass=SecureSourceManagerClientMeta):
163
163
  _DEFAULT_ENDPOINT_TEMPLATE = "securesourcemanager.{UNIVERSE_DOMAIN}"
164
164
  _DEFAULT_UNIVERSE = "googleapis.com"
165
165
 
166
+ @staticmethod
167
+ def _use_client_cert_effective():
168
+ """Returns whether client certificate should be used for mTLS if the
169
+ google-auth version supports should_use_client_cert automatic mTLS enablement.
170
+
171
+ Alternatively, read from the GOOGLE_API_USE_CLIENT_CERTIFICATE env var.
172
+
173
+ Returns:
174
+ bool: whether client certificate should be used for mTLS
175
+ Raises:
176
+ ValueError: (If using a version of google-auth without should_use_client_cert and
177
+ GOOGLE_API_USE_CLIENT_CERTIFICATE is set to an unexpected value.)
178
+ """
179
+ # check if google-auth version supports should_use_client_cert for automatic mTLS enablement
180
+ if hasattr(mtls, "should_use_client_cert"): # pragma: NO COVER
181
+ return mtls.should_use_client_cert()
182
+ else: # pragma: NO COVER
183
+ # if unsupported, fallback to reading from env var
184
+ use_client_cert_str = os.getenv(
185
+ "GOOGLE_API_USE_CLIENT_CERTIFICATE", "false"
186
+ ).lower()
187
+ if use_client_cert_str not in ("true", "false"):
188
+ raise ValueError(
189
+ "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be"
190
+ " either `true` or `false`"
191
+ )
192
+ return use_client_cert_str == "true"
193
+
166
194
  @classmethod
167
195
  def from_service_account_info(cls, info: dict, *args, **kwargs):
168
196
  """Creates an instance of this client using the provided credentials
@@ -590,12 +618,8 @@ class SecureSourceManagerClient(metaclass=SecureSourceManagerClientMeta):
590
618
  )
591
619
  if client_options is None:
592
620
  client_options = client_options_lib.ClientOptions()
593
- use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false")
621
+ use_client_cert = SecureSourceManagerClient._use_client_cert_effective()
594
622
  use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto")
595
- if use_client_cert not in ("true", "false"):
596
- raise ValueError(
597
- "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`"
598
- )
599
623
  if use_mtls_endpoint not in ("auto", "never", "always"):
600
624
  raise MutualTLSChannelError(
601
625
  "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`"
@@ -603,7 +627,7 @@ class SecureSourceManagerClient(metaclass=SecureSourceManagerClientMeta):
603
627
 
604
628
  # Figure out the client cert source to use.
605
629
  client_cert_source = None
606
- if use_client_cert == "true":
630
+ if use_client_cert:
607
631
  if client_options.client_cert_source:
608
632
  client_cert_source = client_options.client_cert_source
609
633
  elif mtls.has_default_client_cert_source():
@@ -635,20 +659,14 @@ class SecureSourceManagerClient(metaclass=SecureSourceManagerClientMeta):
635
659
  google.auth.exceptions.MutualTLSChannelError: If GOOGLE_API_USE_MTLS_ENDPOINT
636
660
  is not any of ["auto", "never", "always"].
637
661
  """
638
- use_client_cert = os.getenv(
639
- "GOOGLE_API_USE_CLIENT_CERTIFICATE", "false"
640
- ).lower()
662
+ use_client_cert = SecureSourceManagerClient._use_client_cert_effective()
641
663
  use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto").lower()
642
664
  universe_domain_env = os.getenv("GOOGLE_CLOUD_UNIVERSE_DOMAIN")
643
- if use_client_cert not in ("true", "false"):
644
- raise ValueError(
645
- "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`"
646
- )
647
665
  if use_mtls_endpoint not in ("auto", "never", "always"):
648
666
  raise MutualTLSChannelError(
649
667
  "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`"
650
668
  )
651
- return use_client_cert == "true", use_mtls_endpoint, universe_domain_env
669
+ return use_client_cert, use_mtls_endpoint, universe_domain_env
652
670
 
653
671
  @staticmethod
654
672
  def _get_client_cert_source(provided_cert_source, use_cert_flag):
@@ -2576,7 +2594,7 @@ class SecureSourceManagerClient(metaclass=SecureSourceManagerClientMeta):
2576
2594
  overwritten in the hook resource by the update. The
2577
2595
  fields specified in the update_mask are relative to the
2578
2596
  resource, not the full request. A field will be
2579
- overwritten if it is in the mask. The special value "*"
2597
+ overwritten if it is in the mask. The special value "\*"
2580
2598
  means full replacement.
2581
2599
 
2582
2600
  This corresponds to the ``update_mask`` field
@@ -2864,19 +2882,19 @@ class SecureSourceManagerClient(metaclass=SecureSourceManagerClientMeta):
2864
2882
  constraints based on attributes of the request, the
2865
2883
  resource, or both. To learn which resources support
2866
2884
  conditions in their IAM policies, see the [IAM
2867
- documentation](\ https://cloud.google.com/iam/help/conditions/resource-policies).
2885
+ documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
2868
2886
 
2869
2887
  **JSON example:**
2870
2888
 
2871
- :literal:`\` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \`
2889
+ :literal:`` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \`
2872
2890
 
2873
2891
  **YAML example:**
2874
2892
 
2875
- :literal:`\` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \`
2893
+ :literal:`` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \`
2876
2894
 
2877
2895
  For a description of IAM and its features, see the
2878
2896
  [IAM
2879
- documentation](\ https://cloud.google.com/iam/docs/).
2897
+ documentation](https://cloud.google.com/iam/docs/).
2880
2898
 
2881
2899
  """
2882
2900
  # Create or coerce a protobuf request object.
@@ -3003,19 +3021,19 @@ class SecureSourceManagerClient(metaclass=SecureSourceManagerClientMeta):
3003
3021
  constraints based on attributes of the request, the
3004
3022
  resource, or both. To learn which resources support
3005
3023
  conditions in their IAM policies, see the [IAM
3006
- documentation](\ https://cloud.google.com/iam/help/conditions/resource-policies).
3024
+ documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
3007
3025
 
3008
3026
  **JSON example:**
3009
3027
 
3010
- :literal:`\` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \`
3028
+ :literal:`` { "bindings": [ { "role": "roles/resourcemanager.organizationAdmin", "members": [ "user:mike@example.com", "group:admins@example.com", "domain:google.com", "serviceAccount:my-project-id@appspot.gserviceaccount.com" ] }, { "role": "roles/resourcemanager.organizationViewer", "members": [ "user:eve@example.com" ], "condition": { "title": "expirable access", "description": "Does not grant access after Sep 2020", "expression": "request.time < timestamp('2020-10-01T00:00:00.000Z')", } } ], "etag": "BwWWja0YfJA=", "version": 3 }`\ \`
3011
3029
 
3012
3030
  **YAML example:**
3013
3031
 
3014
- :literal:`\` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \`
3032
+ :literal:`` bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time < timestamp('2020-10-01T00:00:00.000Z') etag: BwWWja0YfJA= version: 3`\ \`
3015
3033
 
3016
3034
  For a description of IAM and its features, see the
3017
3035
  [IAM
3018
- documentation](\ https://cloud.google.com/iam/docs/).
3036
+ documentation](https://cloud.google.com/iam/docs/).
3019
3037
 
3020
3038
  """
3021
3039
  # Create or coerce a protobuf request object.
@@ -3613,7 +3631,7 @@ class SecureSourceManagerClient(metaclass=SecureSourceManagerClientMeta):
3613
3631
  overwritten in the branchRule resource by the update.
3614
3632
  The fields specified in the update_mask are relative to
3615
3633
  the resource, not the full request. A field will be
3616
- overwritten if it is in the mask. The special value "*"
3634
+ overwritten if it is in the mask. The special value "\*"
3617
3635
  means full replacement.
3618
3636
 
3619
3637
  This corresponds to the ``update_mask`` field
@@ -4264,7 +4282,7 @@ class SecureSourceManagerClient(metaclass=SecureSourceManagerClientMeta):
4264
4282
  overwritten in the pull request resource by the update.
4265
4283
  The fields specified in the update_mask are relative to
4266
4284
  the resource, not the full request. A field will be
4267
- overwritten if it is in the mask. The special value "*"
4285
+ overwritten if it is in the mask. The special value "\*"
4268
4286
  means full replacement.
4269
4287
 
4270
4288
  This corresponds to the ``update_mask`` field
@@ -5462,7 +5480,7 @@ class SecureSourceManagerClient(metaclass=SecureSourceManagerClientMeta):
5462
5480
  overwritten in the issue resource by the update. The
5463
5481
  fields specified in the update_mask are relative to the
5464
5482
  resource, not the full request. A field will be
5465
- overwritten if it is in the mask. The special value "*"
5483
+ overwritten if it is in the mask. The special value "\*"
5466
5484
  means full replacement.
5467
5485
 
5468
5486
  This corresponds to the ``update_mask`` field
@@ -7484,7 +7502,7 @@ class SecureSourceManagerClient(metaclass=SecureSourceManagerClientMeta):
7484
7502
  overwritten in the issue comment resource by the update.
7485
7503
  The fields specified in the update_mask are relative to
7486
7504
  the resource, not the full request. A field will be
7487
- overwritten if it is in the mask. The special value "*"
7505
+ overwritten if it is in the mask. The special value "\*"
7488
7506
  means full replacement.
7489
7507
 
7490
7508
  This corresponds to the ``update_mask`` field
@@ -70,9 +70,10 @@ class SecureSourceManagerTransport(abc.ABC):
70
70
  credentials identify the application to the service; if none
71
71
  are specified, the client will attempt to ascertain the
72
72
  credentials from the environment.
73
- credentials_file (Optional[str]): A file with credentials that can
73
+ credentials_file (Optional[str]): Deprecated. A file with credentials that can
74
74
  be loaded with :func:`google.auth.load_credentials_from_file`.
75
- This argument is mutually exclusive with credentials.
75
+ This argument is mutually exclusive with credentials. This argument will be
76
+ removed in the next major version of this library.
76
77
  scopes (Optional[Sequence[str]]): A list of scopes.
77
78
  quota_project_id (Optional[str]): An optional project to use for billing
78
79
  and quota.
@@ -157,9 +157,10 @@ class SecureSourceManagerGrpcTransport(SecureSourceManagerTransport):
157
157
  are specified, the client will attempt to ascertain the
158
158
  credentials from the environment.
159
159
  This argument is ignored if a ``channel`` instance is provided.
160
- credentials_file (Optional[str]): A file with credentials that can
160
+ credentials_file (Optional[str]): Deprecated. A file with credentials that can
161
161
  be loaded with :func:`google.auth.load_credentials_from_file`.
162
162
  This argument is ignored if a ``channel`` instance is provided.
163
+ This argument will be removed in the next major version of this library.
163
164
  scopes (Optional(Sequence[str])): A list of scopes. This argument is
164
165
  ignored if a ``channel`` instance is provided.
165
166
  channel (Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]]):
@@ -293,9 +294,10 @@ class SecureSourceManagerGrpcTransport(SecureSourceManagerTransport):
293
294
  credentials identify this application to the service. If
294
295
  none are specified, the client will attempt to ascertain
295
296
  the credentials from the environment.
296
- credentials_file (Optional[str]): A file with credentials that can
297
+ credentials_file (Optional[str]): Deprecated. A file with credentials that can
297
298
  be loaded with :func:`google.auth.load_credentials_from_file`.
298
- This argument is mutually exclusive with credentials.
299
+ This argument is mutually exclusive with credentials. This argument will be
300
+ removed in the next major version of this library.
299
301
  scopes (Optional[Sequence[str]]): A optional list of scopes needed for this
300
302
  service. These are only used when credentials are not specified and
301
303
  are passed to :func:`google.auth.default`.
@@ -154,8 +154,9 @@ class SecureSourceManagerGrpcAsyncIOTransport(SecureSourceManagerTransport):
154
154
  credentials identify this application to the service. If
155
155
  none are specified, the client will attempt to ascertain
156
156
  the credentials from the environment.
157
- credentials_file (Optional[str]): A file with credentials that can
158
- be loaded with :func:`google.auth.load_credentials_from_file`.
157
+ credentials_file (Optional[str]): Deprecated. A file with credentials that can
158
+ be loaded with :func:`google.auth.load_credentials_from_file`. This argument will be
159
+ removed in the next major version of this library.
159
160
  scopes (Optional[Sequence[str]]): A optional list of scopes needed for this
160
161
  service. These are only used when credentials are not specified and
161
162
  are passed to :func:`google.auth.default`.
@@ -206,9 +207,10 @@ class SecureSourceManagerGrpcAsyncIOTransport(SecureSourceManagerTransport):
206
207
  are specified, the client will attempt to ascertain the
207
208
  credentials from the environment.
208
209
  This argument is ignored if a ``channel`` instance is provided.
209
- credentials_file (Optional[str]): A file with credentials that can
210
+ credentials_file (Optional[str]): Deprecated. A file with credentials that can
210
211
  be loaded with :func:`google.auth.load_credentials_from_file`.
211
212
  This argument is ignored if a ``channel`` instance is provided.
213
+ This argument will be removed in the next major version of this library.
212
214
  scopes (Optional[Sequence[str]]): A optional list of scopes needed for this
213
215
  service. These are only used when credentials are not specified and
214
216
  are passed to :func:`google.auth.default`.
@@ -3344,9 +3344,10 @@ class SecureSourceManagerRestTransport(_BaseSecureSourceManagerRestTransport):
3344
3344
  are specified, the client will attempt to ascertain the
3345
3345
  credentials from the environment.
3346
3346
 
3347
- credentials_file (Optional[str]): A file with credentials that can
3347
+ credentials_file (Optional[str]): Deprecated. A file with credentials that can
3348
3348
  be loaded with :func:`google.auth.load_credentials_from_file`.
3349
- This argument is ignored if ``channel`` is provided.
3349
+ This argument is ignored if ``channel`` is provided. This argument will be
3350
+ removed in the next major version of this library.
3350
3351
  scopes (Optional(Sequence[str])): A list of scopes. This argument is
3351
3352
  ignored if ``channel`` is provided.
3352
3353
  client_cert_source_for_mtls (Callable[[], Tuple[bytes, bytes]]): Client
@@ -137,7 +137,7 @@ class Instance(proto.Message):
137
137
  kms_key (str):
138
138
  Optional. Immutable. Customer-managed encryption key name,
139
139
  in the format
140
- projects/\ */locations/*/keyRings/*/cryptoKeys/*.
140
+ projects/*/locations/*/keyRings/*/cryptoKeys/*.
141
141
  host_config (google.cloud.securesourcemanager_v1.types.Instance.HostConfig):
142
142
  Output only. A list of hostnames for this
143
143
  instance.
@@ -808,7 +808,7 @@ class BranchRule(proto.Message):
808
808
  include_pattern (str):
809
809
  Optional. The pattern of the branch that can match to this
810
810
  BranchRule. Specified as regex. .\* for all branches.
811
- Examples: main, (main|release.*). Current MVP phase only
811
+ Examples: main, (main|release.\*). Current MVP phase only
812
812
  support ``.*`` for wildcard.
813
813
  disabled (bool):
814
814
  Optional. Determines if the branch rule is
@@ -1937,7 +1937,7 @@ class UpdateHookRequest(proto.Message):
1937
1937
  overwritten in the hook resource by the update. The fields
1938
1938
  specified in the update_mask are relative to the resource,
1939
1939
  not the full request. A field will be overwritten if it is
1940
- in the mask. The special value "*" means full replacement.
1940
+ in the mask. The special value "\*" means full replacement.
1941
1941
  hook (google.cloud.securesourcemanager_v1.types.Hook):
1942
1942
  Required. The hook being updated.
1943
1943
  """
@@ -2079,7 +2079,7 @@ class UpdateBranchRuleRequest(proto.Message):
2079
2079
  overwritten in the branchRule resource by the update. The
2080
2080
  fields specified in the update_mask are relative to the
2081
2081
  resource, not the full request. A field will be overwritten
2082
- if it is in the mask. The special value "*" means full
2082
+ if it is in the mask. The special value "\*" means full
2083
2083
  replacement.
2084
2084
  """
2085
2085
 
@@ -2237,7 +2237,7 @@ class UpdatePullRequestRequest(proto.Message):
2237
2237
  overwritten in the pull request resource by the update. The
2238
2238
  fields specified in the update_mask are relative to the
2239
2239
  resource, not the full request. A field will be overwritten
2240
- if it is in the mask. The special value "*" means full
2240
+ if it is in the mask. The special value "\*" means full
2241
2241
  replacement.
2242
2242
  """
2243
2243
 
@@ -2472,7 +2472,7 @@ class UpdateIssueRequest(proto.Message):
2472
2472
  overwritten in the issue resource by the update. The fields
2473
2473
  specified in the update_mask are relative to the resource,
2474
2474
  not the full request. A field will be overwritten if it is
2475
- in the mask. The special value "*" means full replacement.
2475
+ in the mask. The special value "\*" means full replacement.
2476
2476
  """
2477
2477
 
2478
2478
  issue: "Issue" = proto.Field(
@@ -3134,7 +3134,7 @@ class UpdateIssueCommentRequest(proto.Message):
3134
3134
  overwritten in the issue comment resource by the update. The
3135
3135
  fields specified in the update_mask are relative to the
3136
3136
  resource, not the full request. A field will be overwritten
3137
- if it is in the mask. The special value "*" means full
3137
+ if it is in the mask. The special value "\*" means full
3138
3138
  replacement.
3139
3139
  """
3140
3140
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: google-cloud-securesourcemanager
3
- Version: 0.1.17
3
+ Version: 0.3.0
4
4
  Summary: Google Cloud Securesourcemanager API client library
5
5
  Home-page: https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-securesourcemanager
6
6
  Author: Google LLC
@@ -19,12 +19,15 @@ Classifier: Programming Language :: Python :: 3.10
19
19
  Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Programming Language :: Python :: 3.14
22
23
  Classifier: Operating System :: OS Independent
23
24
  Classifier: Topic :: Internet
24
25
  Requires-Python: >=3.7
25
26
  License-File: LICENSE
26
27
  Requires-Dist: google-api-core[grpc]!=2.0.*,!=2.1.*,!=2.10.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,<3.0.0,>=1.34.1
27
28
  Requires-Dist: google-auth!=2.24.0,!=2.25.0,<3.0.0,>=2.14.1
29
+ Requires-Dist: grpcio<2.0.0,>=1.33.2
30
+ Requires-Dist: grpcio<2.0.0,>=1.75.1; python_version >= "3.14"
28
31
  Requires-Dist: proto-plus<2.0.0,>=1.22.3
29
32
  Requires-Dist: proto-plus<2.0.0,>=1.25.0; python_version >= "3.13"
30
33
  Requires-Dist: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<7.0.0,>=3.20.2
@@ -104,7 +107,7 @@ Supported Python Versions
104
107
  Our client libraries are compatible with all current `active`_ and `maintenance`_ versions of
105
108
  Python.
106
109
 
107
- Python >= 3.7
110
+ Python >= 3.7, including 3.14
108
111
 
109
112
  .. _active: https://devguide.python.org/devcycle/#in-development-main-branch
110
113
  .. _maintenance: https://devguide.python.org/devcycle/#maintenance-branches
@@ -1,8 +1,12 @@
1
1
  google-api-core[grpc]!=2.0.*,!=2.1.*,!=2.10.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,<3.0.0,>=1.34.1
2
2
  google-auth!=2.24.0,!=2.25.0,<3.0.0,>=2.14.1
3
+ grpcio<2.0.0,>=1.33.2
3
4
  proto-plus<2.0.0,>=1.22.3
4
5
  protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<7.0.0,>=3.20.2
5
6
  grpc-google-iam-v1<1.0.0,>=0.14.0
6
7
 
7
8
  [:python_version >= "3.13"]
8
9
  proto-plus<2.0.0,>=1.25.0
10
+
11
+ [:python_version >= "3.14"]
12
+ grpcio<2.0.0,>=1.75.1
@@ -45,6 +45,8 @@ dependencies = [
45
45
  # Exclude incompatible versions of `google-auth`
46
46
  # See https://github.com/googleapis/google-cloud-python/issues/12364
47
47
  "google-auth >= 2.14.1, <3.0.0,!=2.24.0,!=2.25.0",
48
+ "grpcio >= 1.33.2, < 2.0.0",
49
+ "grpcio >= 1.75.1, < 2.0.0; python_version >= '3.14'",
48
50
  "proto-plus >= 1.22.3, <2.0.0",
49
51
  "proto-plus >= 1.25.0, <2.0.0; python_version >= '3.13'",
50
52
  "protobuf>=3.20.2,<7.0.0,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5",
@@ -87,6 +89,7 @@ setuptools.setup(
87
89
  "Programming Language :: Python :: 3.11",
88
90
  "Programming Language :: Python :: 3.12",
89
91
  "Programming Language :: Python :: 3.13",
92
+ "Programming Language :: Python :: 3.14",
90
93
  "Operating System :: OS Independent",
91
94
  "Topic :: Internet",
92
95
  ],
@@ -180,12 +180,19 @@ def test__read_environment_variables():
180
180
  with mock.patch.dict(
181
181
  os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}
182
182
  ):
183
- with pytest.raises(ValueError) as excinfo:
184
- SecureSourceManagerClient._read_environment_variables()
185
- assert (
186
- str(excinfo.value)
187
- == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`"
188
- )
183
+ if not hasattr(google.auth.transport.mtls, "should_use_client_cert"):
184
+ with pytest.raises(ValueError) as excinfo:
185
+ SecureSourceManagerClient._read_environment_variables()
186
+ assert (
187
+ str(excinfo.value)
188
+ == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`"
189
+ )
190
+ else:
191
+ assert SecureSourceManagerClient._read_environment_variables() == (
192
+ False,
193
+ "auto",
194
+ None,
195
+ )
189
196
 
190
197
  with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}):
191
198
  assert SecureSourceManagerClient._read_environment_variables() == (
@@ -224,6 +231,105 @@ def test__read_environment_variables():
224
231
  )
225
232
 
226
233
 
234
+ def test_use_client_cert_effective():
235
+ # Test case 1: Test when `should_use_client_cert` returns True.
236
+ # We mock the `should_use_client_cert` function to simulate a scenario where
237
+ # the google-auth library supports automatic mTLS and determines that a
238
+ # client certificate should be used.
239
+ if hasattr(google.auth.transport.mtls, "should_use_client_cert"):
240
+ with mock.patch(
241
+ "google.auth.transport.mtls.should_use_client_cert", return_value=True
242
+ ):
243
+ assert SecureSourceManagerClient._use_client_cert_effective() is True
244
+
245
+ # Test case 2: Test when `should_use_client_cert` returns False.
246
+ # We mock the `should_use_client_cert` function to simulate a scenario where
247
+ # the google-auth library supports automatic mTLS and determines that a
248
+ # client certificate should NOT be used.
249
+ if hasattr(google.auth.transport.mtls, "should_use_client_cert"):
250
+ with mock.patch(
251
+ "google.auth.transport.mtls.should_use_client_cert", return_value=False
252
+ ):
253
+ assert SecureSourceManagerClient._use_client_cert_effective() is False
254
+
255
+ # Test case 3: Test when `should_use_client_cert` is unavailable and the
256
+ # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is set to "true".
257
+ if not hasattr(google.auth.transport.mtls, "should_use_client_cert"):
258
+ with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}):
259
+ assert SecureSourceManagerClient._use_client_cert_effective() is True
260
+
261
+ # Test case 4: Test when `should_use_client_cert` is unavailable and the
262
+ # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is set to "false".
263
+ if not hasattr(google.auth.transport.mtls, "should_use_client_cert"):
264
+ with mock.patch.dict(
265
+ os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}
266
+ ):
267
+ assert SecureSourceManagerClient._use_client_cert_effective() is False
268
+
269
+ # Test case 5: Test when `should_use_client_cert` is unavailable and the
270
+ # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is set to "True".
271
+ if not hasattr(google.auth.transport.mtls, "should_use_client_cert"):
272
+ with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "True"}):
273
+ assert SecureSourceManagerClient._use_client_cert_effective() is True
274
+
275
+ # Test case 6: Test when `should_use_client_cert` is unavailable and the
276
+ # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is set to "False".
277
+ if not hasattr(google.auth.transport.mtls, "should_use_client_cert"):
278
+ with mock.patch.dict(
279
+ os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "False"}
280
+ ):
281
+ assert SecureSourceManagerClient._use_client_cert_effective() is False
282
+
283
+ # Test case 7: Test when `should_use_client_cert` is unavailable and the
284
+ # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is set to "TRUE".
285
+ if not hasattr(google.auth.transport.mtls, "should_use_client_cert"):
286
+ with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "TRUE"}):
287
+ assert SecureSourceManagerClient._use_client_cert_effective() is True
288
+
289
+ # Test case 8: Test when `should_use_client_cert` is unavailable and the
290
+ # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is set to "FALSE".
291
+ if not hasattr(google.auth.transport.mtls, "should_use_client_cert"):
292
+ with mock.patch.dict(
293
+ os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "FALSE"}
294
+ ):
295
+ assert SecureSourceManagerClient._use_client_cert_effective() is False
296
+
297
+ # Test case 9: Test when `should_use_client_cert` is unavailable and the
298
+ # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not set.
299
+ # In this case, the method should return False, which is the default value.
300
+ if not hasattr(google.auth.transport.mtls, "should_use_client_cert"):
301
+ with mock.patch.dict(os.environ, clear=True):
302
+ assert SecureSourceManagerClient._use_client_cert_effective() is False
303
+
304
+ # Test case 10: Test when `should_use_client_cert` is unavailable and the
305
+ # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is set to an invalid value.
306
+ # The method should raise a ValueError as the environment variable must be either
307
+ # "true" or "false".
308
+ if not hasattr(google.auth.transport.mtls, "should_use_client_cert"):
309
+ with mock.patch.dict(
310
+ os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "unsupported"}
311
+ ):
312
+ with pytest.raises(ValueError):
313
+ SecureSourceManagerClient._use_client_cert_effective()
314
+
315
+ # Test case 11: Test when `should_use_client_cert` is available and the
316
+ # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is set to an invalid value.
317
+ # The method should return False as the environment variable is set to an invalid value.
318
+ if hasattr(google.auth.transport.mtls, "should_use_client_cert"):
319
+ with mock.patch.dict(
320
+ os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "unsupported"}
321
+ ):
322
+ assert SecureSourceManagerClient._use_client_cert_effective() is False
323
+
324
+ # Test case 12: Test when `should_use_client_cert` is available and the
325
+ # `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is unset. Also,
326
+ # the GOOGLE_API_CONFIG environment variable is unset.
327
+ if hasattr(google.auth.transport.mtls, "should_use_client_cert"):
328
+ with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": ""}):
329
+ with mock.patch.dict(os.environ, {"GOOGLE_API_CERTIFICATE_CONFIG": ""}):
330
+ assert SecureSourceManagerClient._use_client_cert_effective() is False
331
+
332
+
227
333
  def test__get_client_cert_source():
228
334
  mock_provided_cert_source = mock.Mock()
229
335
  mock_default_cert_source = mock.Mock()
@@ -611,17 +717,6 @@ def test_secure_source_manager_client_client_options(
611
717
  == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`"
612
718
  )
613
719
 
614
- # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value.
615
- with mock.patch.dict(
616
- os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}
617
- ):
618
- with pytest.raises(ValueError) as excinfo:
619
- client = client_class(transport=transport_name)
620
- assert (
621
- str(excinfo.value)
622
- == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`"
623
- )
624
-
625
720
  # Check the case quota_project_id is provided
626
721
  options = client_options.ClientOptions(quota_project_id="octopus")
627
722
  with mock.patch.object(transport_class, "__init__") as patched:
@@ -857,6 +952,119 @@ def test_secure_source_manager_client_get_mtls_endpoint_and_cert_source(client_c
857
952
  assert api_endpoint == mock_api_endpoint
858
953
  assert cert_source is None
859
954
 
955
+ # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "Unsupported".
956
+ with mock.patch.dict(
957
+ os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}
958
+ ):
959
+ if hasattr(google.auth.transport.mtls, "should_use_client_cert"):
960
+ mock_client_cert_source = mock.Mock()
961
+ mock_api_endpoint = "foo"
962
+ options = client_options.ClientOptions(
963
+ client_cert_source=mock_client_cert_source,
964
+ api_endpoint=mock_api_endpoint,
965
+ )
966
+ api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source(
967
+ options
968
+ )
969
+ assert api_endpoint == mock_api_endpoint
970
+ assert cert_source is None
971
+
972
+ # Test cases for mTLS enablement when GOOGLE_API_USE_CLIENT_CERTIFICATE is unset.
973
+ test_cases = [
974
+ (
975
+ # With workloads present in config, mTLS is enabled.
976
+ {
977
+ "version": 1,
978
+ "cert_configs": {
979
+ "workload": {
980
+ "cert_path": "path/to/cert/file",
981
+ "key_path": "path/to/key/file",
982
+ }
983
+ },
984
+ },
985
+ mock_client_cert_source,
986
+ ),
987
+ (
988
+ # With workloads not present in config, mTLS is disabled.
989
+ {
990
+ "version": 1,
991
+ "cert_configs": {},
992
+ },
993
+ None,
994
+ ),
995
+ ]
996
+ if hasattr(google.auth.transport.mtls, "should_use_client_cert"):
997
+ for config_data, expected_cert_source in test_cases:
998
+ env = os.environ.copy()
999
+ env.pop("GOOGLE_API_USE_CLIENT_CERTIFICATE", None)
1000
+ with mock.patch.dict(os.environ, env, clear=True):
1001
+ config_filename = "mock_certificate_config.json"
1002
+ config_file_content = json.dumps(config_data)
1003
+ m = mock.mock_open(read_data=config_file_content)
1004
+ with mock.patch("builtins.open", m):
1005
+ with mock.patch.dict(
1006
+ os.environ, {"GOOGLE_API_CERTIFICATE_CONFIG": config_filename}
1007
+ ):
1008
+ mock_api_endpoint = "foo"
1009
+ options = client_options.ClientOptions(
1010
+ client_cert_source=mock_client_cert_source,
1011
+ api_endpoint=mock_api_endpoint,
1012
+ )
1013
+ (
1014
+ api_endpoint,
1015
+ cert_source,
1016
+ ) = client_class.get_mtls_endpoint_and_cert_source(options)
1017
+ assert api_endpoint == mock_api_endpoint
1018
+ assert cert_source is expected_cert_source
1019
+
1020
+ # Test cases for mTLS enablement when GOOGLE_API_USE_CLIENT_CERTIFICATE is unset(empty).
1021
+ test_cases = [
1022
+ (
1023
+ # With workloads present in config, mTLS is enabled.
1024
+ {
1025
+ "version": 1,
1026
+ "cert_configs": {
1027
+ "workload": {
1028
+ "cert_path": "path/to/cert/file",
1029
+ "key_path": "path/to/key/file",
1030
+ }
1031
+ },
1032
+ },
1033
+ mock_client_cert_source,
1034
+ ),
1035
+ (
1036
+ # With workloads not present in config, mTLS is disabled.
1037
+ {
1038
+ "version": 1,
1039
+ "cert_configs": {},
1040
+ },
1041
+ None,
1042
+ ),
1043
+ ]
1044
+ if hasattr(google.auth.transport.mtls, "should_use_client_cert"):
1045
+ for config_data, expected_cert_source in test_cases:
1046
+ env = os.environ.copy()
1047
+ env.pop("GOOGLE_API_USE_CLIENT_CERTIFICATE", "")
1048
+ with mock.patch.dict(os.environ, env, clear=True):
1049
+ config_filename = "mock_certificate_config.json"
1050
+ config_file_content = json.dumps(config_data)
1051
+ m = mock.mock_open(read_data=config_file_content)
1052
+ with mock.patch("builtins.open", m):
1053
+ with mock.patch.dict(
1054
+ os.environ, {"GOOGLE_API_CERTIFICATE_CONFIG": config_filename}
1055
+ ):
1056
+ mock_api_endpoint = "foo"
1057
+ options = client_options.ClientOptions(
1058
+ client_cert_source=mock_client_cert_source,
1059
+ api_endpoint=mock_api_endpoint,
1060
+ )
1061
+ (
1062
+ api_endpoint,
1063
+ cert_source,
1064
+ ) = client_class.get_mtls_endpoint_and_cert_source(options)
1065
+ assert api_endpoint == mock_api_endpoint
1066
+ assert cert_source is expected_cert_source
1067
+
860
1068
  # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "never".
861
1069
  with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}):
862
1070
  api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source()
@@ -907,18 +1115,6 @@ def test_secure_source_manager_client_get_mtls_endpoint_and_cert_source(client_c
907
1115
  == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`"
908
1116
  )
909
1117
 
910
- # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value.
911
- with mock.patch.dict(
912
- os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}
913
- ):
914
- with pytest.raises(ValueError) as excinfo:
915
- client_class.get_mtls_endpoint_and_cert_source()
916
-
917
- assert (
918
- str(excinfo.value)
919
- == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`"
920
- )
921
-
922
1118
 
923
1119
  @pytest.mark.parametrize(
924
1120
  "client_class", [SecureSourceManagerClient, SecureSourceManagerAsyncClient]
@@ -44504,6 +44700,7 @@ def test_secure_source_manager_grpc_asyncio_transport_channel():
44504
44700
 
44505
44701
  # Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are
44506
44702
  # removed from grpc/grpc_asyncio transport constructor.
44703
+ @pytest.mark.filterwarnings("ignore::FutureWarning")
44507
44704
  @pytest.mark.parametrize(
44508
44705
  "transport_class",
44509
44706
  [
@@ -1,16 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- # Copyright 2025 Google LLC
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
- #
16
- __version__ = "0.1.17" # {x-release-please-version}
@@ -1,16 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- # Copyright 2025 Google LLC
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
- #
16
- __version__ = "0.1.17" # {x-release-please-version}