Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/google/cloud/firestore_v1/services/firestore/client.py: 29%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

440 statements  

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# 

16from collections import OrderedDict 

17from http import HTTPStatus 

18import json 

19import logging as std_logging 

20import os 

21import re 

22from typing import ( 

23 Dict, 

24 Callable, 

25 Mapping, 

26 MutableMapping, 

27 MutableSequence, 

28 Optional, 

29 Iterable, 

30 Iterator, 

31 Sequence, 

32 Tuple, 

33 Type, 

34 Union, 

35 cast, 

36) 

37import warnings 

38 

39from google.cloud.firestore_v1 import gapic_version as package_version 

40 

41from google.api_core import client_options as client_options_lib 

42from google.api_core import exceptions as core_exceptions 

43from google.api_core import gapic_v1 

44from google.api_core import retry as retries 

45from google.auth import credentials as ga_credentials # type: ignore 

46from google.auth.transport import mtls # type: ignore 

47from google.auth.transport.grpc import SslCredentials # type: ignore 

48from google.auth.exceptions import MutualTLSChannelError # type: ignore 

49from google.oauth2 import service_account # type: ignore 

50import google.protobuf 

51 

52try: 

53 OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] 

54except AttributeError: # pragma: NO COVER 

55 OptionalRetry = Union[retries.Retry, object, None] # type: ignore 

56 

57try: 

58 from google.api_core import client_logging # type: ignore 

59 

60 CLIENT_LOGGING_SUPPORTED = True # pragma: NO COVER 

61except ImportError: # pragma: NO COVER 

62 CLIENT_LOGGING_SUPPORTED = False 

63 

64_LOGGER = std_logging.getLogger(__name__) 

65 

66from google.cloud.firestore_v1.services.firestore import pagers 

67from google.cloud.firestore_v1.types import aggregation_result 

68from google.cloud.firestore_v1.types import common 

69from google.cloud.firestore_v1.types import document 

70from google.cloud.firestore_v1.types import document as gf_document 

71from google.cloud.firestore_v1.types import firestore 

72from google.cloud.firestore_v1.types import query 

73from google.cloud.firestore_v1.types import query_profile 

74from google.cloud.firestore_v1.types import write as gf_write 

75from google.cloud.location import locations_pb2 # type: ignore 

76from google.longrunning import operations_pb2 # type: ignore 

77from google.protobuf import timestamp_pb2 # type: ignore 

78from google.rpc import status_pb2 # type: ignore 

79from .transports.base import FirestoreTransport, DEFAULT_CLIENT_INFO 

80from .transports.grpc import FirestoreGrpcTransport 

81from .transports.grpc_asyncio import FirestoreGrpcAsyncIOTransport 

82from .transports.rest import FirestoreRestTransport 

83 

84 

85class FirestoreClientMeta(type): 

86 """Metaclass for the Firestore client. 

87 

88 This provides class-level methods for building and retrieving 

89 support objects (e.g. transport) without polluting the client instance 

90 objects. 

91 """ 

92 

93 _transport_registry = OrderedDict() # type: Dict[str, Type[FirestoreTransport]] 

94 _transport_registry["grpc"] = FirestoreGrpcTransport 

95 _transport_registry["grpc_asyncio"] = FirestoreGrpcAsyncIOTransport 

96 _transport_registry["rest"] = FirestoreRestTransport 

97 

98 def get_transport_class( 

99 cls, 

100 label: Optional[str] = None, 

101 ) -> Type[FirestoreTransport]: 

102 """Returns an appropriate transport class. 

103 

104 Args: 

105 label: The name of the desired transport. If none is 

106 provided, then the first transport in the registry is used. 

107 

108 Returns: 

109 The transport class to use. 

110 """ 

111 # If a specific transport is requested, return that one. 

112 if label: 

113 return cls._transport_registry[label] 

114 

115 # No transport is requested; return the default (that is, the first one 

116 # in the dictionary). 

117 return next(iter(cls._transport_registry.values())) 

118 

119 

120class FirestoreClient(metaclass=FirestoreClientMeta): 

121 """The Cloud Firestore service. 

122 

123 Cloud Firestore is a fast, fully managed, serverless, 

124 cloud-native NoSQL document database that simplifies storing, 

125 syncing, and querying data for your mobile, web, and IoT apps at 

126 global scale. Its client libraries provide live synchronization 

127 and offline support, while its security features and 

128 integrations with Firebase and Google Cloud Platform accelerate 

129 building truly serverless apps. 

130 """ 

131 

132 @staticmethod 

133 def _get_default_mtls_endpoint(api_endpoint): 

134 """Converts api endpoint to mTLS endpoint. 

135 

136 Convert "*.sandbox.googleapis.com" and "*.googleapis.com" to 

137 "*.mtls.sandbox.googleapis.com" and "*.mtls.googleapis.com" respectively. 

138 Args: 

139 api_endpoint (Optional[str]): the api endpoint to convert. 

140 Returns: 

141 str: converted mTLS api endpoint. 

142 """ 

143 if not api_endpoint: 

144 return api_endpoint 

145 

146 mtls_endpoint_re = re.compile( 

147 r"(?P<name>[^.]+)(?P<mtls>\.mtls)?(?P<sandbox>\.sandbox)?(?P<googledomain>\.googleapis\.com)?" 

148 ) 

149 

150 m = mtls_endpoint_re.match(api_endpoint) 

151 name, mtls, sandbox, googledomain = m.groups() 

152 if mtls or not googledomain: 

153 return api_endpoint 

154 

155 if sandbox: 

156 return api_endpoint.replace( 

157 "sandbox.googleapis.com", "mtls.sandbox.googleapis.com" 

158 ) 

159 

160 return api_endpoint.replace(".googleapis.com", ".mtls.googleapis.com") 

161 

162 # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. 

163 DEFAULT_ENDPOINT = "firestore.googleapis.com" 

164 DEFAULT_MTLS_ENDPOINT = _get_default_mtls_endpoint.__func__( # type: ignore 

165 DEFAULT_ENDPOINT 

166 ) 

167 

168 _DEFAULT_ENDPOINT_TEMPLATE = "firestore.{UNIVERSE_DOMAIN}" 

169 _DEFAULT_UNIVERSE = "googleapis.com" 

170 

171 @classmethod 

172 def from_service_account_info(cls, info: dict, *args, **kwargs): 

173 """Creates an instance of this client using the provided credentials 

174 info. 

175 

176 Args: 

177 info (dict): The service account private key info. 

178 args: Additional arguments to pass to the constructor. 

179 kwargs: Additional arguments to pass to the constructor. 

180 

181 Returns: 

182 FirestoreClient: The constructed client. 

183 """ 

184 credentials = service_account.Credentials.from_service_account_info(info) 

185 kwargs["credentials"] = credentials 

186 return cls(*args, **kwargs) 

187 

188 @classmethod 

189 def from_service_account_file(cls, filename: str, *args, **kwargs): 

190 """Creates an instance of this client using the provided credentials 

191 file. 

192 

193 Args: 

194 filename (str): The path to the service account private key json 

195 file. 

196 args: Additional arguments to pass to the constructor. 

197 kwargs: Additional arguments to pass to the constructor. 

198 

199 Returns: 

200 FirestoreClient: The constructed client. 

201 """ 

202 credentials = service_account.Credentials.from_service_account_file(filename) 

203 kwargs["credentials"] = credentials 

204 return cls(*args, **kwargs) 

205 

206 from_service_account_json = from_service_account_file 

207 

208 @property 

209 def transport(self) -> FirestoreTransport: 

210 """Returns the transport used by the client instance. 

211 

212 Returns: 

213 FirestoreTransport: The transport used by the client 

214 instance. 

215 """ 

216 return self._transport 

217 

218 @staticmethod 

219 def common_billing_account_path( 

220 billing_account: str, 

221 ) -> str: 

222 """Returns a fully-qualified billing_account string.""" 

223 return "billingAccounts/{billing_account}".format( 

224 billing_account=billing_account, 

225 ) 

226 

227 @staticmethod 

228 def parse_common_billing_account_path(path: str) -> Dict[str, str]: 

229 """Parse a billing_account path into its component segments.""" 

230 m = re.match(r"^billingAccounts/(?P<billing_account>.+?)$", path) 

231 return m.groupdict() if m else {} 

232 

233 @staticmethod 

234 def common_folder_path( 

235 folder: str, 

236 ) -> str: 

237 """Returns a fully-qualified folder string.""" 

238 return "folders/{folder}".format( 

239 folder=folder, 

240 ) 

241 

242 @staticmethod 

243 def parse_common_folder_path(path: str) -> Dict[str, str]: 

244 """Parse a folder path into its component segments.""" 

245 m = re.match(r"^folders/(?P<folder>.+?)$", path) 

246 return m.groupdict() if m else {} 

247 

248 @staticmethod 

249 def common_organization_path( 

250 organization: str, 

251 ) -> str: 

252 """Returns a fully-qualified organization string.""" 

253 return "organizations/{organization}".format( 

254 organization=organization, 

255 ) 

256 

257 @staticmethod 

258 def parse_common_organization_path(path: str) -> Dict[str, str]: 

259 """Parse a organization path into its component segments.""" 

260 m = re.match(r"^organizations/(?P<organization>.+?)$", path) 

261 return m.groupdict() if m else {} 

262 

263 @staticmethod 

264 def common_project_path( 

265 project: str, 

266 ) -> str: 

267 """Returns a fully-qualified project string.""" 

268 return "projects/{project}".format( 

269 project=project, 

270 ) 

271 

272 @staticmethod 

273 def parse_common_project_path(path: str) -> Dict[str, str]: 

274 """Parse a project path into its component segments.""" 

275 m = re.match(r"^projects/(?P<project>.+?)$", path) 

276 return m.groupdict() if m else {} 

277 

278 @staticmethod 

279 def common_location_path( 

280 project: str, 

281 location: str, 

282 ) -> str: 

283 """Returns a fully-qualified location string.""" 

284 return "projects/{project}/locations/{location}".format( 

285 project=project, 

286 location=location, 

287 ) 

288 

289 @staticmethod 

290 def parse_common_location_path(path: str) -> Dict[str, str]: 

291 """Parse a location path into its component segments.""" 

292 m = re.match(r"^projects/(?P<project>.+?)/locations/(?P<location>.+?)$", path) 

293 return m.groupdict() if m else {} 

294 

295 @classmethod 

296 def get_mtls_endpoint_and_cert_source( 

297 cls, client_options: Optional[client_options_lib.ClientOptions] = None 

298 ): 

299 """Deprecated. Return the API endpoint and client cert source for mutual TLS. 

300 

301 The client cert source is determined in the following order: 

302 (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the 

303 client cert source is None. 

304 (2) if `client_options.client_cert_source` is provided, use the provided one; if the 

305 default client cert source exists, use the default one; otherwise the client cert 

306 source is None. 

307 

308 The API endpoint is determined in the following order: 

309 (1) if `client_options.api_endpoint` if provided, use the provided one. 

310 (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the 

311 default mTLS endpoint; if the environment variable is "never", use the default API 

312 endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise 

313 use the default API endpoint. 

314 

315 More details can be found at https://google.aip.dev/auth/4114. 

316 

317 Args: 

318 client_options (google.api_core.client_options.ClientOptions): Custom options for the 

319 client. Only the `api_endpoint` and `client_cert_source` properties may be used 

320 in this method. 

321 

322 Returns: 

323 Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the 

324 client cert source to use. 

325 

326 Raises: 

327 google.auth.exceptions.MutualTLSChannelError: If any errors happen. 

328 """ 

329 

330 warnings.warn( 

331 "get_mtls_endpoint_and_cert_source is deprecated. Use the api_endpoint property instead.", 

332 DeprecationWarning, 

333 ) 

334 if client_options is None: 

335 client_options = client_options_lib.ClientOptions() 

336 use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false") 

337 use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto") 

338 if use_client_cert not in ("true", "false"): 

339 raise ValueError( 

340 "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" 

341 ) 

342 if use_mtls_endpoint not in ("auto", "never", "always"): 

343 raise MutualTLSChannelError( 

344 "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" 

345 ) 

346 

347 # Figure out the client cert source to use. 

348 client_cert_source = None 

349 if use_client_cert == "true": 

350 if client_options.client_cert_source: 

351 client_cert_source = client_options.client_cert_source 

352 elif mtls.has_default_client_cert_source(): 

353 client_cert_source = mtls.default_client_cert_source() 

354 

355 # Figure out which api endpoint to use. 

356 if client_options.api_endpoint is not None: 

357 api_endpoint = client_options.api_endpoint 

358 elif use_mtls_endpoint == "always" or ( 

359 use_mtls_endpoint == "auto" and client_cert_source 

360 ): 

361 api_endpoint = cls.DEFAULT_MTLS_ENDPOINT 

362 else: 

363 api_endpoint = cls.DEFAULT_ENDPOINT 

364 

365 return api_endpoint, client_cert_source 

366 

367 @staticmethod 

368 def _read_environment_variables(): 

369 """Returns the environment variables used by the client. 

370 

371 Returns: 

372 Tuple[bool, str, str]: returns the GOOGLE_API_USE_CLIENT_CERTIFICATE, 

373 GOOGLE_API_USE_MTLS_ENDPOINT, and GOOGLE_CLOUD_UNIVERSE_DOMAIN environment variables. 

374 

375 Raises: 

376 ValueError: If GOOGLE_API_USE_CLIENT_CERTIFICATE is not 

377 any of ["true", "false"]. 

378 google.auth.exceptions.MutualTLSChannelError: If GOOGLE_API_USE_MTLS_ENDPOINT 

379 is not any of ["auto", "never", "always"]. 

380 """ 

381 use_client_cert = os.getenv( 

382 "GOOGLE_API_USE_CLIENT_CERTIFICATE", "false" 

383 ).lower() 

384 use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto").lower() 

385 universe_domain_env = os.getenv("GOOGLE_CLOUD_UNIVERSE_DOMAIN") 

386 if use_client_cert not in ("true", "false"): 

387 raise ValueError( 

388 "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" 

389 ) 

390 if use_mtls_endpoint not in ("auto", "never", "always"): 

391 raise MutualTLSChannelError( 

392 "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" 

393 ) 

394 return use_client_cert == "true", use_mtls_endpoint, universe_domain_env 

395 

396 @staticmethod 

397 def _get_client_cert_source(provided_cert_source, use_cert_flag): 

398 """Return the client cert source to be used by the client. 

399 

400 Args: 

401 provided_cert_source (bytes): The client certificate source provided. 

402 use_cert_flag (bool): A flag indicating whether to use the client certificate. 

403 

404 Returns: 

405 bytes or None: The client cert source to be used by the client. 

406 """ 

407 client_cert_source = None 

408 if use_cert_flag: 

409 if provided_cert_source: 

410 client_cert_source = provided_cert_source 

411 elif mtls.has_default_client_cert_source(): 

412 client_cert_source = mtls.default_client_cert_source() 

413 return client_cert_source 

414 

415 @staticmethod 

416 def _get_api_endpoint( 

417 api_override, client_cert_source, universe_domain, use_mtls_endpoint 

418 ): 

419 """Return the API endpoint used by the client. 

420 

421 Args: 

422 api_override (str): The API endpoint override. If specified, this is always 

423 the return value of this function and the other arguments are not used. 

424 client_cert_source (bytes): The client certificate source used by the client. 

425 universe_domain (str): The universe domain used by the client. 

426 use_mtls_endpoint (str): How to use the mTLS endpoint, which depends also on the other parameters. 

427 Possible values are "always", "auto", or "never". 

428 

429 Returns: 

430 str: The API endpoint to be used by the client. 

431 """ 

432 if api_override is not None: 

433 api_endpoint = api_override 

434 elif use_mtls_endpoint == "always" or ( 

435 use_mtls_endpoint == "auto" and client_cert_source 

436 ): 

437 _default_universe = FirestoreClient._DEFAULT_UNIVERSE 

438 if universe_domain != _default_universe: 

439 raise MutualTLSChannelError( 

440 f"mTLS is not supported in any universe other than {_default_universe}." 

441 ) 

442 api_endpoint = FirestoreClient.DEFAULT_MTLS_ENDPOINT 

443 else: 

444 api_endpoint = FirestoreClient._DEFAULT_ENDPOINT_TEMPLATE.format( 

445 UNIVERSE_DOMAIN=universe_domain 

446 ) 

447 return api_endpoint 

448 

449 @staticmethod 

450 def _get_universe_domain( 

451 client_universe_domain: Optional[str], universe_domain_env: Optional[str] 

452 ) -> str: 

453 """Return the universe domain used by the client. 

454 

455 Args: 

456 client_universe_domain (Optional[str]): The universe domain configured via the client options. 

457 universe_domain_env (Optional[str]): The universe domain configured via the "GOOGLE_CLOUD_UNIVERSE_DOMAIN" environment variable. 

458 

459 Returns: 

460 str: The universe domain to be used by the client. 

461 

462 Raises: 

463 ValueError: If the universe domain is an empty string. 

464 """ 

465 universe_domain = FirestoreClient._DEFAULT_UNIVERSE 

466 if client_universe_domain is not None: 

467 universe_domain = client_universe_domain 

468 elif universe_domain_env is not None: 

469 universe_domain = universe_domain_env 

470 if len(universe_domain.strip()) == 0: 

471 raise ValueError("Universe Domain cannot be an empty string.") 

472 return universe_domain 

473 

474 def _validate_universe_domain(self): 

475 """Validates client's and credentials' universe domains are consistent. 

476 

477 Returns: 

478 bool: True iff the configured universe domain is valid. 

479 

480 Raises: 

481 ValueError: If the configured universe domain is not valid. 

482 """ 

483 

484 # NOTE (b/349488459): universe validation is disabled until further notice. 

485 return True 

486 

487 def _add_cred_info_for_auth_errors( 

488 self, error: core_exceptions.GoogleAPICallError 

489 ) -> None: 

490 """Adds credential info string to error details for 401/403/404 errors. 

491 

492 Args: 

493 error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. 

494 """ 

495 if error.code not in [ 

496 HTTPStatus.UNAUTHORIZED, 

497 HTTPStatus.FORBIDDEN, 

498 HTTPStatus.NOT_FOUND, 

499 ]: 

500 return 

501 

502 cred = self._transport._credentials 

503 

504 # get_cred_info is only available in google-auth>=2.35.0 

505 if not hasattr(cred, "get_cred_info"): 

506 return 

507 

508 # ignore the type check since pypy test fails when get_cred_info 

509 # is not available 

510 cred_info = cred.get_cred_info() # type: ignore 

511 if cred_info and hasattr(error._details, "append"): 

512 error._details.append(json.dumps(cred_info)) 

513 

514 @property 

515 def api_endpoint(self): 

516 """Return the API endpoint used by the client instance. 

517 

518 Returns: 

519 str: The API endpoint used by the client instance. 

520 """ 

521 return self._api_endpoint 

522 

523 @property 

524 def universe_domain(self) -> str: 

525 """Return the universe domain used by the client instance. 

526 

527 Returns: 

528 str: The universe domain used by the client instance. 

529 """ 

530 return self._universe_domain 

531 

532 def __init__( 

533 self, 

534 *, 

535 credentials: Optional[ga_credentials.Credentials] = None, 

536 transport: Optional[ 

537 Union[str, FirestoreTransport, Callable[..., FirestoreTransport]] 

538 ] = None, 

539 client_options: Optional[Union[client_options_lib.ClientOptions, dict]] = None, 

540 client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, 

541 ) -> None: 

542 """Instantiates the firestore client. 

543 

544 Args: 

545 credentials (Optional[google.auth.credentials.Credentials]): The 

546 authorization credentials to attach to requests. These 

547 credentials identify the application to the service; if none 

548 are specified, the client will attempt to ascertain the 

549 credentials from the environment. 

550 transport (Optional[Union[str,FirestoreTransport,Callable[..., FirestoreTransport]]]): 

551 The transport to use, or a Callable that constructs and returns a new transport. 

552 If a Callable is given, it will be called with the same set of initialization 

553 arguments as used in the FirestoreTransport constructor. 

554 If set to None, a transport is chosen automatically. 

555 client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): 

556 Custom options for the client. 

557 

558 1. The ``api_endpoint`` property can be used to override the 

559 default endpoint provided by the client when ``transport`` is 

560 not explicitly provided. Only if this property is not set and 

561 ``transport`` was not explicitly provided, the endpoint is 

562 determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment 

563 variable, which have one of the following values: 

564 "always" (always use the default mTLS endpoint), "never" (always 

565 use the default regular endpoint) and "auto" (auto-switch to the 

566 default mTLS endpoint if client certificate is present; this is 

567 the default value). 

568 

569 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable 

570 is "true", then the ``client_cert_source`` property can be used 

571 to provide a client certificate for mTLS transport. If 

572 not provided, the default SSL client certificate will be used if 

573 present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not 

574 set, no client certificate will be used. 

575 

576 3. The ``universe_domain`` property can be used to override the 

577 default "googleapis.com" universe. Note that the ``api_endpoint`` 

578 property still takes precedence; and ``universe_domain`` is 

579 currently not supported for mTLS. 

580 

581 client_info (google.api_core.gapic_v1.client_info.ClientInfo): 

582 The client info used to send a user-agent string along with 

583 API requests. If ``None``, then default info will be used. 

584 Generally, you only need to set this if you're developing 

585 your own client library. 

586 

587 Raises: 

588 google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport 

589 creation failed for any reason. 

590 """ 

591 self._client_options = client_options 

592 if isinstance(self._client_options, dict): 

593 self._client_options = client_options_lib.from_dict(self._client_options) 

594 if self._client_options is None: 

595 self._client_options = client_options_lib.ClientOptions() 

596 self._client_options = cast( 

597 client_options_lib.ClientOptions, self._client_options 

598 ) 

599 

600 universe_domain_opt = getattr(self._client_options, "universe_domain", None) 

601 

602 ( 

603 self._use_client_cert, 

604 self._use_mtls_endpoint, 

605 self._universe_domain_env, 

606 ) = FirestoreClient._read_environment_variables() 

607 self._client_cert_source = FirestoreClient._get_client_cert_source( 

608 self._client_options.client_cert_source, self._use_client_cert 

609 ) 

610 self._universe_domain = FirestoreClient._get_universe_domain( 

611 universe_domain_opt, self._universe_domain_env 

612 ) 

613 self._api_endpoint = None # updated below, depending on `transport` 

614 

615 # Initialize the universe domain validation. 

616 self._is_universe_domain_valid = False 

617 

618 if CLIENT_LOGGING_SUPPORTED: # pragma: NO COVER 

619 # Setup logging. 

620 client_logging.initialize_logging() 

621 

622 api_key_value = getattr(self._client_options, "api_key", None) 

623 if api_key_value and credentials: 

624 raise ValueError( 

625 "client_options.api_key and credentials are mutually exclusive" 

626 ) 

627 

628 # Save or instantiate the transport. 

629 # Ordinarily, we provide the transport, but allowing a custom transport 

630 # instance provides an extensibility point for unusual situations. 

631 transport_provided = isinstance(transport, FirestoreTransport) 

632 if transport_provided: 

633 # transport is a FirestoreTransport instance. 

634 if credentials or self._client_options.credentials_file or api_key_value: 

635 raise ValueError( 

636 "When providing a transport instance, " 

637 "provide its credentials directly." 

638 ) 

639 if self._client_options.scopes: 

640 raise ValueError( 

641 "When providing a transport instance, provide its scopes " 

642 "directly." 

643 ) 

644 self._transport = cast(FirestoreTransport, transport) 

645 self._api_endpoint = self._transport.host 

646 

647 self._api_endpoint = self._api_endpoint or FirestoreClient._get_api_endpoint( 

648 self._client_options.api_endpoint, 

649 self._client_cert_source, 

650 self._universe_domain, 

651 self._use_mtls_endpoint, 

652 ) 

653 

654 if not transport_provided: 

655 import google.auth._default # type: ignore 

656 

657 if api_key_value and hasattr( 

658 google.auth._default, "get_api_key_credentials" 

659 ): 

660 credentials = google.auth._default.get_api_key_credentials( 

661 api_key_value 

662 ) 

663 

664 transport_init: Union[ 

665 Type[FirestoreTransport], Callable[..., FirestoreTransport] 

666 ] = ( 

667 FirestoreClient.get_transport_class(transport) 

668 if isinstance(transport, str) or transport is None 

669 else cast(Callable[..., FirestoreTransport], transport) 

670 ) 

671 # initialize with the provided callable or the passed in class 

672 self._transport = transport_init( 

673 credentials=credentials, 

674 credentials_file=self._client_options.credentials_file, 

675 host=self._api_endpoint, 

676 scopes=self._client_options.scopes, 

677 client_cert_source_for_mtls=self._client_cert_source, 

678 quota_project_id=self._client_options.quota_project_id, 

679 client_info=client_info, 

680 always_use_jwt_access=True, 

681 api_audience=self._client_options.api_audience, 

682 ) 

683 

684 if "async" not in str(self._transport): 

685 if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( 

686 std_logging.DEBUG 

687 ): # pragma: NO COVER 

688 _LOGGER.debug( 

689 "Created client `google.firestore_v1.FirestoreClient`.", 

690 extra={ 

691 "serviceName": "google.firestore.v1.Firestore", 

692 "universeDomain": getattr( 

693 self._transport._credentials, "universe_domain", "" 

694 ), 

695 "credentialsType": f"{type(self._transport._credentials).__module__}.{type(self._transport._credentials).__qualname__}", 

696 "credentialsInfo": getattr( 

697 self.transport._credentials, "get_cred_info", lambda: None 

698 )(), 

699 } 

700 if hasattr(self._transport, "_credentials") 

701 else { 

702 "serviceName": "google.firestore.v1.Firestore", 

703 "credentialsType": None, 

704 }, 

705 ) 

706 

707 def get_document( 

708 self, 

709 request: Optional[Union[firestore.GetDocumentRequest, dict]] = None, 

710 *, 

711 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

712 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

713 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

714 ) -> document.Document: 

715 r"""Gets a single document. 

716 

717 .. code-block:: python 

718 

719 # This snippet has been automatically generated and should be regarded as a 

720 # code template only. 

721 # It will require modifications to work: 

722 # - It may require correct/in-range values for request initialization. 

723 # - It may require specifying regional endpoints when creating the service 

724 # client as shown in: 

725 # https://googleapis.dev/python/google-api-core/latest/client_options.html 

726 from google.cloud import firestore_v1 

727 

728 def sample_get_document(): 

729 # Create a client 

730 client = firestore_v1.FirestoreClient() 

731 

732 # Initialize request argument(s) 

733 request = firestore_v1.GetDocumentRequest( 

734 transaction=b'transaction_blob', 

735 name="name_value", 

736 ) 

737 

738 # Make the request 

739 response = client.get_document(request=request) 

740 

741 # Handle the response 

742 print(response) 

743 

744 Args: 

745 request (Union[google.cloud.firestore_v1.types.GetDocumentRequest, dict]): 

746 The request object. The request for 

747 [Firestore.GetDocument][google.firestore.v1.Firestore.GetDocument]. 

748 retry (google.api_core.retry.Retry): Designation of what errors, if any, 

749 should be retried. 

750 timeout (float): The timeout for this request. 

751 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

752 sent along with the request as metadata. Normally, each value must be of type `str`, 

753 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

754 be of type `bytes`. 

755 

756 Returns: 

757 google.cloud.firestore_v1.types.Document: 

758 A Firestore document. 

759 

760 Must not exceed 1 MiB - 4 bytes. 

761 

762 """ 

763 # Create or coerce a protobuf request object. 

764 # - Use the request object if provided (there's no risk of modifying the input as 

765 # there are no flattened fields), or create one. 

766 if not isinstance(request, firestore.GetDocumentRequest): 

767 request = firestore.GetDocumentRequest(request) 

768 

769 # Wrap the RPC method; this adds retry and timeout information, 

770 # and friendly error handling. 

771 rpc = self._transport._wrapped_methods[self._transport.get_document] 

772 

773 # Certain fields should be provided within the metadata header; 

774 # add these here. 

775 metadata = tuple(metadata) + ( 

776 gapic_v1.routing_header.to_grpc_metadata((("name", request.name),)), 

777 ) 

778 

779 # Validate the universe domain. 

780 self._validate_universe_domain() 

781 

782 # Send the request. 

783 response = rpc( 

784 request, 

785 retry=retry, 

786 timeout=timeout, 

787 metadata=metadata, 

788 ) 

789 

790 # Done; return the response. 

791 return response 

792 

793 def list_documents( 

794 self, 

795 request: Optional[Union[firestore.ListDocumentsRequest, dict]] = None, 

796 *, 

797 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

798 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

799 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

800 ) -> pagers.ListDocumentsPager: 

801 r"""Lists documents. 

802 

803 .. code-block:: python 

804 

805 # This snippet has been automatically generated and should be regarded as a 

806 # code template only. 

807 # It will require modifications to work: 

808 # - It may require correct/in-range values for request initialization. 

809 # - It may require specifying regional endpoints when creating the service 

810 # client as shown in: 

811 # https://googleapis.dev/python/google-api-core/latest/client_options.html 

812 from google.cloud import firestore_v1 

813 

814 def sample_list_documents(): 

815 # Create a client 

816 client = firestore_v1.FirestoreClient() 

817 

818 # Initialize request argument(s) 

819 request = firestore_v1.ListDocumentsRequest( 

820 transaction=b'transaction_blob', 

821 parent="parent_value", 

822 ) 

823 

824 # Make the request 

825 page_result = client.list_documents(request=request) 

826 

827 # Handle the response 

828 for response in page_result: 

829 print(response) 

830 

831 Args: 

832 request (Union[google.cloud.firestore_v1.types.ListDocumentsRequest, dict]): 

833 The request object. The request for 

834 [Firestore.ListDocuments][google.firestore.v1.Firestore.ListDocuments]. 

835 retry (google.api_core.retry.Retry): Designation of what errors, if any, 

836 should be retried. 

837 timeout (float): The timeout for this request. 

838 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

839 sent along with the request as metadata. Normally, each value must be of type `str`, 

840 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

841 be of type `bytes`. 

842 

843 Returns: 

844 google.cloud.firestore_v1.services.firestore.pagers.ListDocumentsPager: 

845 The response for 

846 [Firestore.ListDocuments][google.firestore.v1.Firestore.ListDocuments]. 

847 

848 Iterating over this object will yield results and 

849 resolve additional pages automatically. 

850 

851 """ 

852 # Create or coerce a protobuf request object. 

853 # - Use the request object if provided (there's no risk of modifying the input as 

854 # there are no flattened fields), or create one. 

855 if not isinstance(request, firestore.ListDocumentsRequest): 

856 request = firestore.ListDocumentsRequest(request) 

857 

858 # Wrap the RPC method; this adds retry and timeout information, 

859 # and friendly error handling. 

860 rpc = self._transport._wrapped_methods[self._transport.list_documents] 

861 

862 # Certain fields should be provided within the metadata header; 

863 # add these here. 

864 metadata = tuple(metadata) + ( 

865 gapic_v1.routing_header.to_grpc_metadata( 

866 ( 

867 ("parent", request.parent), 

868 ("collection_id", request.collection_id), 

869 ) 

870 ), 

871 ) 

872 

873 # Validate the universe domain. 

874 self._validate_universe_domain() 

875 

876 # Send the request. 

877 response = rpc( 

878 request, 

879 retry=retry, 

880 timeout=timeout, 

881 metadata=metadata, 

882 ) 

883 

884 # This method is paged; wrap the response in a pager, which provides 

885 # an `__iter__` convenience method. 

886 response = pagers.ListDocumentsPager( 

887 method=rpc, 

888 request=request, 

889 response=response, 

890 retry=retry, 

891 timeout=timeout, 

892 metadata=metadata, 

893 ) 

894 

895 # Done; return the response. 

896 return response 

897 

898 def update_document( 

899 self, 

900 request: Optional[Union[firestore.UpdateDocumentRequest, dict]] = None, 

901 *, 

902 document: Optional[gf_document.Document] = None, 

903 update_mask: Optional[common.DocumentMask] = None, 

904 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

905 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

906 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

907 ) -> gf_document.Document: 

908 r"""Updates or inserts a document. 

909 

910 .. code-block:: python 

911 

912 # This snippet has been automatically generated and should be regarded as a 

913 # code template only. 

914 # It will require modifications to work: 

915 # - It may require correct/in-range values for request initialization. 

916 # - It may require specifying regional endpoints when creating the service 

917 # client as shown in: 

918 # https://googleapis.dev/python/google-api-core/latest/client_options.html 

919 from google.cloud import firestore_v1 

920 

921 def sample_update_document(): 

922 # Create a client 

923 client = firestore_v1.FirestoreClient() 

924 

925 # Initialize request argument(s) 

926 request = firestore_v1.UpdateDocumentRequest( 

927 ) 

928 

929 # Make the request 

930 response = client.update_document(request=request) 

931 

932 # Handle the response 

933 print(response) 

934 

935 Args: 

936 request (Union[google.cloud.firestore_v1.types.UpdateDocumentRequest, dict]): 

937 The request object. The request for 

938 [Firestore.UpdateDocument][google.firestore.v1.Firestore.UpdateDocument]. 

939 document (google.cloud.firestore_v1.types.Document): 

940 Required. The updated document. 

941 Creates the document if it does not 

942 already exist. 

943 

944 This corresponds to the ``document`` field 

945 on the ``request`` instance; if ``request`` is provided, this 

946 should not be set. 

947 update_mask (google.cloud.firestore_v1.types.DocumentMask): 

948 The fields to update. 

949 None of the field paths in the mask may 

950 contain a reserved name. 

951 

952 If the document exists on the server and 

953 has fields not referenced in the mask, 

954 they are left unchanged. 

955 Fields referenced in the mask, but not 

956 present in the input document, are 

957 deleted from the document on the server. 

958 

959 This corresponds to the ``update_mask`` field 

960 on the ``request`` instance; if ``request`` is provided, this 

961 should not be set. 

962 retry (google.api_core.retry.Retry): Designation of what errors, if any, 

963 should be retried. 

964 timeout (float): The timeout for this request. 

965 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

966 sent along with the request as metadata. Normally, each value must be of type `str`, 

967 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

968 be of type `bytes`. 

969 

970 Returns: 

971 google.cloud.firestore_v1.types.Document: 

972 A Firestore document. 

973 

974 Must not exceed 1 MiB - 4 bytes. 

975 

976 """ 

977 # Create or coerce a protobuf request object. 

978 # - Quick check: If we got a request object, we should *not* have 

979 # gotten any keyword arguments that map to the request. 

980 flattened_params = [document, update_mask] 

981 has_flattened_params = ( 

982 len([param for param in flattened_params if param is not None]) > 0 

983 ) 

984 if request is not None and has_flattened_params: 

985 raise ValueError( 

986 "If the `request` argument is set, then none of " 

987 "the individual field arguments should be set." 

988 ) 

989 

990 # - Use the request object if provided (there's no risk of modifying the input as 

991 # there are no flattened fields), or create one. 

992 if not isinstance(request, firestore.UpdateDocumentRequest): 

993 request = firestore.UpdateDocumentRequest(request) 

994 # If we have keyword arguments corresponding to fields on the 

995 # request, apply these. 

996 if document is not None: 

997 request.document = document 

998 if update_mask is not None: 

999 request.update_mask = update_mask 

1000 

1001 # Wrap the RPC method; this adds retry and timeout information, 

1002 # and friendly error handling. 

1003 rpc = self._transport._wrapped_methods[self._transport.update_document] 

1004 

1005 # Certain fields should be provided within the metadata header; 

1006 # add these here. 

1007 metadata = tuple(metadata) + ( 

1008 gapic_v1.routing_header.to_grpc_metadata( 

1009 (("document.name", request.document.name),) 

1010 ), 

1011 ) 

1012 

1013 # Validate the universe domain. 

1014 self._validate_universe_domain() 

1015 

1016 # Send the request. 

1017 response = rpc( 

1018 request, 

1019 retry=retry, 

1020 timeout=timeout, 

1021 metadata=metadata, 

1022 ) 

1023 

1024 # Done; return the response. 

1025 return response 

1026 

1027 def delete_document( 

1028 self, 

1029 request: Optional[Union[firestore.DeleteDocumentRequest, dict]] = None, 

1030 *, 

1031 name: Optional[str] = None, 

1032 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

1033 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

1034 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

1035 ) -> None: 

1036 r"""Deletes a document. 

1037 

1038 .. code-block:: python 

1039 

1040 # This snippet has been automatically generated and should be regarded as a 

1041 # code template only. 

1042 # It will require modifications to work: 

1043 # - It may require correct/in-range values for request initialization. 

1044 # - It may require specifying regional endpoints when creating the service 

1045 # client as shown in: 

1046 # https://googleapis.dev/python/google-api-core/latest/client_options.html 

1047 from google.cloud import firestore_v1 

1048 

1049 def sample_delete_document(): 

1050 # Create a client 

1051 client = firestore_v1.FirestoreClient() 

1052 

1053 # Initialize request argument(s) 

1054 request = firestore_v1.DeleteDocumentRequest( 

1055 name="name_value", 

1056 ) 

1057 

1058 # Make the request 

1059 client.delete_document(request=request) 

1060 

1061 Args: 

1062 request (Union[google.cloud.firestore_v1.types.DeleteDocumentRequest, dict]): 

1063 The request object. The request for 

1064 [Firestore.DeleteDocument][google.firestore.v1.Firestore.DeleteDocument]. 

1065 name (str): 

1066 Required. The resource name of the Document to delete. 

1067 In the format: 

1068 ``projects/{project_id}/databases/{database_id}/documents/{document_path}``. 

1069 

1070 This corresponds to the ``name`` field 

1071 on the ``request`` instance; if ``request`` is provided, this 

1072 should not be set. 

1073 retry (google.api_core.retry.Retry): Designation of what errors, if any, 

1074 should be retried. 

1075 timeout (float): The timeout for this request. 

1076 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

1077 sent along with the request as metadata. Normally, each value must be of type `str`, 

1078 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

1079 be of type `bytes`. 

1080 """ 

1081 # Create or coerce a protobuf request object. 

1082 # - Quick check: If we got a request object, we should *not* have 

1083 # gotten any keyword arguments that map to the request. 

1084 flattened_params = [name] 

1085 has_flattened_params = ( 

1086 len([param for param in flattened_params if param is not None]) > 0 

1087 ) 

1088 if request is not None and has_flattened_params: 

1089 raise ValueError( 

1090 "If the `request` argument is set, then none of " 

1091 "the individual field arguments should be set." 

1092 ) 

1093 

1094 # - Use the request object if provided (there's no risk of modifying the input as 

1095 # there are no flattened fields), or create one. 

1096 if not isinstance(request, firestore.DeleteDocumentRequest): 

1097 request = firestore.DeleteDocumentRequest(request) 

1098 # If we have keyword arguments corresponding to fields on the 

1099 # request, apply these. 

1100 if name is not None: 

1101 request.name = name 

1102 

1103 # Wrap the RPC method; this adds retry and timeout information, 

1104 # and friendly error handling. 

1105 rpc = self._transport._wrapped_methods[self._transport.delete_document] 

1106 

1107 # Certain fields should be provided within the metadata header; 

1108 # add these here. 

1109 metadata = tuple(metadata) + ( 

1110 gapic_v1.routing_header.to_grpc_metadata((("name", request.name),)), 

1111 ) 

1112 

1113 # Validate the universe domain. 

1114 self._validate_universe_domain() 

1115 

1116 # Send the request. 

1117 rpc( 

1118 request, 

1119 retry=retry, 

1120 timeout=timeout, 

1121 metadata=metadata, 

1122 ) 

1123 

1124 def batch_get_documents( 

1125 self, 

1126 request: Optional[Union[firestore.BatchGetDocumentsRequest, dict]] = None, 

1127 *, 

1128 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

1129 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

1130 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

1131 ) -> Iterable[firestore.BatchGetDocumentsResponse]: 

1132 r"""Gets multiple documents. 

1133 

1134 Documents returned by this method are not guaranteed to 

1135 be returned in the same order that they were requested. 

1136 

1137 .. code-block:: python 

1138 

1139 # This snippet has been automatically generated and should be regarded as a 

1140 # code template only. 

1141 # It will require modifications to work: 

1142 # - It may require correct/in-range values for request initialization. 

1143 # - It may require specifying regional endpoints when creating the service 

1144 # client as shown in: 

1145 # https://googleapis.dev/python/google-api-core/latest/client_options.html 

1146 from google.cloud import firestore_v1 

1147 

1148 def sample_batch_get_documents(): 

1149 # Create a client 

1150 client = firestore_v1.FirestoreClient() 

1151 

1152 # Initialize request argument(s) 

1153 request = firestore_v1.BatchGetDocumentsRequest( 

1154 transaction=b'transaction_blob', 

1155 database="database_value", 

1156 ) 

1157 

1158 # Make the request 

1159 stream = client.batch_get_documents(request=request) 

1160 

1161 # Handle the response 

1162 for response in stream: 

1163 print(response) 

1164 

1165 Args: 

1166 request (Union[google.cloud.firestore_v1.types.BatchGetDocumentsRequest, dict]): 

1167 The request object. The request for 

1168 [Firestore.BatchGetDocuments][google.firestore.v1.Firestore.BatchGetDocuments]. 

1169 retry (google.api_core.retry.Retry): Designation of what errors, if any, 

1170 should be retried. 

1171 timeout (float): The timeout for this request. 

1172 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

1173 sent along with the request as metadata. Normally, each value must be of type `str`, 

1174 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

1175 be of type `bytes`. 

1176 

1177 Returns: 

1178 Iterable[google.cloud.firestore_v1.types.BatchGetDocumentsResponse]: 

1179 The streamed response for 

1180 [Firestore.BatchGetDocuments][google.firestore.v1.Firestore.BatchGetDocuments]. 

1181 

1182 """ 

1183 # Create or coerce a protobuf request object. 

1184 # - Use the request object if provided (there's no risk of modifying the input as 

1185 # there are no flattened fields), or create one. 

1186 if not isinstance(request, firestore.BatchGetDocumentsRequest): 

1187 request = firestore.BatchGetDocumentsRequest(request) 

1188 

1189 # Wrap the RPC method; this adds retry and timeout information, 

1190 # and friendly error handling. 

1191 rpc = self._transport._wrapped_methods[self._transport.batch_get_documents] 

1192 

1193 # Certain fields should be provided within the metadata header; 

1194 # add these here. 

1195 metadata = tuple(metadata) + ( 

1196 gapic_v1.routing_header.to_grpc_metadata((("database", request.database),)), 

1197 ) 

1198 

1199 # Validate the universe domain. 

1200 self._validate_universe_domain() 

1201 

1202 # Send the request. 

1203 response = rpc( 

1204 request, 

1205 retry=retry, 

1206 timeout=timeout, 

1207 metadata=metadata, 

1208 ) 

1209 

1210 # Done; return the response. 

1211 return response 

1212 

1213 def begin_transaction( 

1214 self, 

1215 request: Optional[Union[firestore.BeginTransactionRequest, dict]] = None, 

1216 *, 

1217 database: Optional[str] = None, 

1218 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

1219 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

1220 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

1221 ) -> firestore.BeginTransactionResponse: 

1222 r"""Starts a new transaction. 

1223 

1224 .. code-block:: python 

1225 

1226 # This snippet has been automatically generated and should be regarded as a 

1227 # code template only. 

1228 # It will require modifications to work: 

1229 # - It may require correct/in-range values for request initialization. 

1230 # - It may require specifying regional endpoints when creating the service 

1231 # client as shown in: 

1232 # https://googleapis.dev/python/google-api-core/latest/client_options.html 

1233 from google.cloud import firestore_v1 

1234 

1235 def sample_begin_transaction(): 

1236 # Create a client 

1237 client = firestore_v1.FirestoreClient() 

1238 

1239 # Initialize request argument(s) 

1240 request = firestore_v1.BeginTransactionRequest( 

1241 database="database_value", 

1242 ) 

1243 

1244 # Make the request 

1245 response = client.begin_transaction(request=request) 

1246 

1247 # Handle the response 

1248 print(response) 

1249 

1250 Args: 

1251 request (Union[google.cloud.firestore_v1.types.BeginTransactionRequest, dict]): 

1252 The request object. The request for 

1253 [Firestore.BeginTransaction][google.firestore.v1.Firestore.BeginTransaction]. 

1254 database (str): 

1255 Required. The database name. In the format: 

1256 ``projects/{project_id}/databases/{database_id}``. 

1257 

1258 This corresponds to the ``database`` field 

1259 on the ``request`` instance; if ``request`` is provided, this 

1260 should not be set. 

1261 retry (google.api_core.retry.Retry): Designation of what errors, if any, 

1262 should be retried. 

1263 timeout (float): The timeout for this request. 

1264 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

1265 sent along with the request as metadata. Normally, each value must be of type `str`, 

1266 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

1267 be of type `bytes`. 

1268 

1269 Returns: 

1270 google.cloud.firestore_v1.types.BeginTransactionResponse: 

1271 The response for 

1272 [Firestore.BeginTransaction][google.firestore.v1.Firestore.BeginTransaction]. 

1273 

1274 """ 

1275 # Create or coerce a protobuf request object. 

1276 # - Quick check: If we got a request object, we should *not* have 

1277 # gotten any keyword arguments that map to the request. 

1278 flattened_params = [database] 

1279 has_flattened_params = ( 

1280 len([param for param in flattened_params if param is not None]) > 0 

1281 ) 

1282 if request is not None and has_flattened_params: 

1283 raise ValueError( 

1284 "If the `request` argument is set, then none of " 

1285 "the individual field arguments should be set." 

1286 ) 

1287 

1288 # - Use the request object if provided (there's no risk of modifying the input as 

1289 # there are no flattened fields), or create one. 

1290 if not isinstance(request, firestore.BeginTransactionRequest): 

1291 request = firestore.BeginTransactionRequest(request) 

1292 # If we have keyword arguments corresponding to fields on the 

1293 # request, apply these. 

1294 if database is not None: 

1295 request.database = database 

1296 

1297 # Wrap the RPC method; this adds retry and timeout information, 

1298 # and friendly error handling. 

1299 rpc = self._transport._wrapped_methods[self._transport.begin_transaction] 

1300 

1301 # Certain fields should be provided within the metadata header; 

1302 # add these here. 

1303 metadata = tuple(metadata) + ( 

1304 gapic_v1.routing_header.to_grpc_metadata((("database", request.database),)), 

1305 ) 

1306 

1307 # Validate the universe domain. 

1308 self._validate_universe_domain() 

1309 

1310 # Send the request. 

1311 response = rpc( 

1312 request, 

1313 retry=retry, 

1314 timeout=timeout, 

1315 metadata=metadata, 

1316 ) 

1317 

1318 # Done; return the response. 

1319 return response 

1320 

1321 def commit( 

1322 self, 

1323 request: Optional[Union[firestore.CommitRequest, dict]] = None, 

1324 *, 

1325 database: Optional[str] = None, 

1326 writes: Optional[MutableSequence[gf_write.Write]] = None, 

1327 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

1328 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

1329 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

1330 ) -> firestore.CommitResponse: 

1331 r"""Commits a transaction, while optionally updating 

1332 documents. 

1333 

1334 .. code-block:: python 

1335 

1336 # This snippet has been automatically generated and should be regarded as a 

1337 # code template only. 

1338 # It will require modifications to work: 

1339 # - It may require correct/in-range values for request initialization. 

1340 # - It may require specifying regional endpoints when creating the service 

1341 # client as shown in: 

1342 # https://googleapis.dev/python/google-api-core/latest/client_options.html 

1343 from google.cloud import firestore_v1 

1344 

1345 def sample_commit(): 

1346 # Create a client 

1347 client = firestore_v1.FirestoreClient() 

1348 

1349 # Initialize request argument(s) 

1350 request = firestore_v1.CommitRequest( 

1351 database="database_value", 

1352 ) 

1353 

1354 # Make the request 

1355 response = client.commit(request=request) 

1356 

1357 # Handle the response 

1358 print(response) 

1359 

1360 Args: 

1361 request (Union[google.cloud.firestore_v1.types.CommitRequest, dict]): 

1362 The request object. The request for 

1363 [Firestore.Commit][google.firestore.v1.Firestore.Commit]. 

1364 database (str): 

1365 Required. The database name. In the format: 

1366 ``projects/{project_id}/databases/{database_id}``. 

1367 

1368 This corresponds to the ``database`` field 

1369 on the ``request`` instance; if ``request`` is provided, this 

1370 should not be set. 

1371 writes (MutableSequence[google.cloud.firestore_v1.types.Write]): 

1372 The writes to apply. 

1373 

1374 Always executed atomically and in order. 

1375 

1376 This corresponds to the ``writes`` field 

1377 on the ``request`` instance; if ``request`` is provided, this 

1378 should not be set. 

1379 retry (google.api_core.retry.Retry): Designation of what errors, if any, 

1380 should be retried. 

1381 timeout (float): The timeout for this request. 

1382 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

1383 sent along with the request as metadata. Normally, each value must be of type `str`, 

1384 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

1385 be of type `bytes`. 

1386 

1387 Returns: 

1388 google.cloud.firestore_v1.types.CommitResponse: 

1389 The response for 

1390 [Firestore.Commit][google.firestore.v1.Firestore.Commit]. 

1391 

1392 """ 

1393 # Create or coerce a protobuf request object. 

1394 # - Quick check: If we got a request object, we should *not* have 

1395 # gotten any keyword arguments that map to the request. 

1396 flattened_params = [database, writes] 

1397 has_flattened_params = ( 

1398 len([param for param in flattened_params if param is not None]) > 0 

1399 ) 

1400 if request is not None and has_flattened_params: 

1401 raise ValueError( 

1402 "If the `request` argument is set, then none of " 

1403 "the individual field arguments should be set." 

1404 ) 

1405 

1406 # - Use the request object if provided (there's no risk of modifying the input as 

1407 # there are no flattened fields), or create one. 

1408 if not isinstance(request, firestore.CommitRequest): 

1409 request = firestore.CommitRequest(request) 

1410 # If we have keyword arguments corresponding to fields on the 

1411 # request, apply these. 

1412 if database is not None: 

1413 request.database = database 

1414 if writes is not None: 

1415 request.writes = writes 

1416 

1417 # Wrap the RPC method; this adds retry and timeout information, 

1418 # and friendly error handling. 

1419 rpc = self._transport._wrapped_methods[self._transport.commit] 

1420 

1421 # Certain fields should be provided within the metadata header; 

1422 # add these here. 

1423 metadata = tuple(metadata) + ( 

1424 gapic_v1.routing_header.to_grpc_metadata((("database", request.database),)), 

1425 ) 

1426 

1427 # Validate the universe domain. 

1428 self._validate_universe_domain() 

1429 

1430 # Send the request. 

1431 response = rpc( 

1432 request, 

1433 retry=retry, 

1434 timeout=timeout, 

1435 metadata=metadata, 

1436 ) 

1437 

1438 # Done; return the response. 

1439 return response 

1440 

1441 def rollback( 

1442 self, 

1443 request: Optional[Union[firestore.RollbackRequest, dict]] = None, 

1444 *, 

1445 database: Optional[str] = None, 

1446 transaction: Optional[bytes] = None, 

1447 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

1448 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

1449 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

1450 ) -> None: 

1451 r"""Rolls back a transaction. 

1452 

1453 .. code-block:: python 

1454 

1455 # This snippet has been automatically generated and should be regarded as a 

1456 # code template only. 

1457 # It will require modifications to work: 

1458 # - It may require correct/in-range values for request initialization. 

1459 # - It may require specifying regional endpoints when creating the service 

1460 # client as shown in: 

1461 # https://googleapis.dev/python/google-api-core/latest/client_options.html 

1462 from google.cloud import firestore_v1 

1463 

1464 def sample_rollback(): 

1465 # Create a client 

1466 client = firestore_v1.FirestoreClient() 

1467 

1468 # Initialize request argument(s) 

1469 request = firestore_v1.RollbackRequest( 

1470 database="database_value", 

1471 transaction=b'transaction_blob', 

1472 ) 

1473 

1474 # Make the request 

1475 client.rollback(request=request) 

1476 

1477 Args: 

1478 request (Union[google.cloud.firestore_v1.types.RollbackRequest, dict]): 

1479 The request object. The request for 

1480 [Firestore.Rollback][google.firestore.v1.Firestore.Rollback]. 

1481 database (str): 

1482 Required. The database name. In the format: 

1483 ``projects/{project_id}/databases/{database_id}``. 

1484 

1485 This corresponds to the ``database`` field 

1486 on the ``request`` instance; if ``request`` is provided, this 

1487 should not be set. 

1488 transaction (bytes): 

1489 Required. The transaction to roll 

1490 back. 

1491 

1492 This corresponds to the ``transaction`` field 

1493 on the ``request`` instance; if ``request`` is provided, this 

1494 should not be set. 

1495 retry (google.api_core.retry.Retry): Designation of what errors, if any, 

1496 should be retried. 

1497 timeout (float): The timeout for this request. 

1498 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

1499 sent along with the request as metadata. Normally, each value must be of type `str`, 

1500 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

1501 be of type `bytes`. 

1502 """ 

1503 # Create or coerce a protobuf request object. 

1504 # - Quick check: If we got a request object, we should *not* have 

1505 # gotten any keyword arguments that map to the request. 

1506 flattened_params = [database, transaction] 

1507 has_flattened_params = ( 

1508 len([param for param in flattened_params if param is not None]) > 0 

1509 ) 

1510 if request is not None and has_flattened_params: 

1511 raise ValueError( 

1512 "If the `request` argument is set, then none of " 

1513 "the individual field arguments should be set." 

1514 ) 

1515 

1516 # - Use the request object if provided (there's no risk of modifying the input as 

1517 # there are no flattened fields), or create one. 

1518 if not isinstance(request, firestore.RollbackRequest): 

1519 request = firestore.RollbackRequest(request) 

1520 # If we have keyword arguments corresponding to fields on the 

1521 # request, apply these. 

1522 if database is not None: 

1523 request.database = database 

1524 if transaction is not None: 

1525 request.transaction = transaction 

1526 

1527 # Wrap the RPC method; this adds retry and timeout information, 

1528 # and friendly error handling. 

1529 rpc = self._transport._wrapped_methods[self._transport.rollback] 

1530 

1531 # Certain fields should be provided within the metadata header; 

1532 # add these here. 

1533 metadata = tuple(metadata) + ( 

1534 gapic_v1.routing_header.to_grpc_metadata((("database", request.database),)), 

1535 ) 

1536 

1537 # Validate the universe domain. 

1538 self._validate_universe_domain() 

1539 

1540 # Send the request. 

1541 rpc( 

1542 request, 

1543 retry=retry, 

1544 timeout=timeout, 

1545 metadata=metadata, 

1546 ) 

1547 

1548 def run_query( 

1549 self, 

1550 request: Optional[Union[firestore.RunQueryRequest, dict]] = None, 

1551 *, 

1552 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

1553 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

1554 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

1555 ) -> Iterable[firestore.RunQueryResponse]: 

1556 r"""Runs a query. 

1557 

1558 .. code-block:: python 

1559 

1560 # This snippet has been automatically generated and should be regarded as a 

1561 # code template only. 

1562 # It will require modifications to work: 

1563 # - It may require correct/in-range values for request initialization. 

1564 # - It may require specifying regional endpoints when creating the service 

1565 # client as shown in: 

1566 # https://googleapis.dev/python/google-api-core/latest/client_options.html 

1567 from google.cloud import firestore_v1 

1568 

1569 def sample_run_query(): 

1570 # Create a client 

1571 client = firestore_v1.FirestoreClient() 

1572 

1573 # Initialize request argument(s) 

1574 request = firestore_v1.RunQueryRequest( 

1575 transaction=b'transaction_blob', 

1576 parent="parent_value", 

1577 ) 

1578 

1579 # Make the request 

1580 stream = client.run_query(request=request) 

1581 

1582 # Handle the response 

1583 for response in stream: 

1584 print(response) 

1585 

1586 Args: 

1587 request (Union[google.cloud.firestore_v1.types.RunQueryRequest, dict]): 

1588 The request object. The request for 

1589 [Firestore.RunQuery][google.firestore.v1.Firestore.RunQuery]. 

1590 retry (google.api_core.retry.Retry): Designation of what errors, if any, 

1591 should be retried. 

1592 timeout (float): The timeout for this request. 

1593 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

1594 sent along with the request as metadata. Normally, each value must be of type `str`, 

1595 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

1596 be of type `bytes`. 

1597 

1598 Returns: 

1599 Iterable[google.cloud.firestore_v1.types.RunQueryResponse]: 

1600 The response for 

1601 [Firestore.RunQuery][google.firestore.v1.Firestore.RunQuery]. 

1602 

1603 """ 

1604 # Create or coerce a protobuf request object. 

1605 # - Use the request object if provided (there's no risk of modifying the input as 

1606 # there are no flattened fields), or create one. 

1607 if not isinstance(request, firestore.RunQueryRequest): 

1608 request = firestore.RunQueryRequest(request) 

1609 

1610 # Wrap the RPC method; this adds retry and timeout information, 

1611 # and friendly error handling. 

1612 rpc = self._transport._wrapped_methods[self._transport.run_query] 

1613 

1614 # Certain fields should be provided within the metadata header; 

1615 # add these here. 

1616 metadata = tuple(metadata) + ( 

1617 gapic_v1.routing_header.to_grpc_metadata((("parent", request.parent),)), 

1618 ) 

1619 

1620 # Validate the universe domain. 

1621 self._validate_universe_domain() 

1622 

1623 # Send the request. 

1624 response = rpc( 

1625 request, 

1626 retry=retry, 

1627 timeout=timeout, 

1628 metadata=metadata, 

1629 ) 

1630 

1631 # Done; return the response. 

1632 return response 

1633 

1634 def run_aggregation_query( 

1635 self, 

1636 request: Optional[Union[firestore.RunAggregationQueryRequest, dict]] = None, 

1637 *, 

1638 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

1639 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

1640 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

1641 ) -> Iterable[firestore.RunAggregationQueryResponse]: 

1642 r"""Runs an aggregation query. 

1643 

1644 Rather than producing [Document][google.firestore.v1.Document] 

1645 results like 

1646 [Firestore.RunQuery][google.firestore.v1.Firestore.RunQuery], 

1647 this API allows running an aggregation to produce a series of 

1648 [AggregationResult][google.firestore.v1.AggregationResult] 

1649 server-side. 

1650 

1651 High-Level Example: 

1652 

1653 :: 

1654 

1655 -- Return the number of documents in table given a filter. 

1656 SELECT COUNT(*) FROM ( SELECT * FROM k where a = true ); 

1657 

1658 .. code-block:: python 

1659 

1660 # This snippet has been automatically generated and should be regarded as a 

1661 # code template only. 

1662 # It will require modifications to work: 

1663 # - It may require correct/in-range values for request initialization. 

1664 # - It may require specifying regional endpoints when creating the service 

1665 # client as shown in: 

1666 # https://googleapis.dev/python/google-api-core/latest/client_options.html 

1667 from google.cloud import firestore_v1 

1668 

1669 def sample_run_aggregation_query(): 

1670 # Create a client 

1671 client = firestore_v1.FirestoreClient() 

1672 

1673 # Initialize request argument(s) 

1674 request = firestore_v1.RunAggregationQueryRequest( 

1675 transaction=b'transaction_blob', 

1676 parent="parent_value", 

1677 ) 

1678 

1679 # Make the request 

1680 stream = client.run_aggregation_query(request=request) 

1681 

1682 # Handle the response 

1683 for response in stream: 

1684 print(response) 

1685 

1686 Args: 

1687 request (Union[google.cloud.firestore_v1.types.RunAggregationQueryRequest, dict]): 

1688 The request object. The request for 

1689 [Firestore.RunAggregationQuery][google.firestore.v1.Firestore.RunAggregationQuery]. 

1690 retry (google.api_core.retry.Retry): Designation of what errors, if any, 

1691 should be retried. 

1692 timeout (float): The timeout for this request. 

1693 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

1694 sent along with the request as metadata. Normally, each value must be of type `str`, 

1695 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

1696 be of type `bytes`. 

1697 

1698 Returns: 

1699 Iterable[google.cloud.firestore_v1.types.RunAggregationQueryResponse]: 

1700 The response for 

1701 [Firestore.RunAggregationQuery][google.firestore.v1.Firestore.RunAggregationQuery]. 

1702 

1703 """ 

1704 # Create or coerce a protobuf request object. 

1705 # - Use the request object if provided (there's no risk of modifying the input as 

1706 # there are no flattened fields), or create one. 

1707 if not isinstance(request, firestore.RunAggregationQueryRequest): 

1708 request = firestore.RunAggregationQueryRequest(request) 

1709 

1710 # Wrap the RPC method; this adds retry and timeout information, 

1711 # and friendly error handling. 

1712 rpc = self._transport._wrapped_methods[self._transport.run_aggregation_query] 

1713 

1714 # Certain fields should be provided within the metadata header; 

1715 # add these here. 

1716 metadata = tuple(metadata) + ( 

1717 gapic_v1.routing_header.to_grpc_metadata((("parent", request.parent),)), 

1718 ) 

1719 

1720 # Validate the universe domain. 

1721 self._validate_universe_domain() 

1722 

1723 # Send the request. 

1724 response = rpc( 

1725 request, 

1726 retry=retry, 

1727 timeout=timeout, 

1728 metadata=metadata, 

1729 ) 

1730 

1731 # Done; return the response. 

1732 return response 

1733 

1734 def partition_query( 

1735 self, 

1736 request: Optional[Union[firestore.PartitionQueryRequest, dict]] = None, 

1737 *, 

1738 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

1739 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

1740 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

1741 ) -> pagers.PartitionQueryPager: 

1742 r"""Partitions a query by returning partition cursors 

1743 that can be used to run the query in parallel. The 

1744 returned partition cursors are split points that can be 

1745 used by RunQuery as starting/end points for the query 

1746 results. 

1747 

1748 .. code-block:: python 

1749 

1750 # This snippet has been automatically generated and should be regarded as a 

1751 # code template only. 

1752 # It will require modifications to work: 

1753 # - It may require correct/in-range values for request initialization. 

1754 # - It may require specifying regional endpoints when creating the service 

1755 # client as shown in: 

1756 # https://googleapis.dev/python/google-api-core/latest/client_options.html 

1757 from google.cloud import firestore_v1 

1758 

1759 def sample_partition_query(): 

1760 # Create a client 

1761 client = firestore_v1.FirestoreClient() 

1762 

1763 # Initialize request argument(s) 

1764 request = firestore_v1.PartitionQueryRequest( 

1765 parent="parent_value", 

1766 ) 

1767 

1768 # Make the request 

1769 page_result = client.partition_query(request=request) 

1770 

1771 # Handle the response 

1772 for response in page_result: 

1773 print(response) 

1774 

1775 Args: 

1776 request (Union[google.cloud.firestore_v1.types.PartitionQueryRequest, dict]): 

1777 The request object. The request for 

1778 [Firestore.PartitionQuery][google.firestore.v1.Firestore.PartitionQuery]. 

1779 retry (google.api_core.retry.Retry): Designation of what errors, if any, 

1780 should be retried. 

1781 timeout (float): The timeout for this request. 

1782 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

1783 sent along with the request as metadata. Normally, each value must be of type `str`, 

1784 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

1785 be of type `bytes`. 

1786 

1787 Returns: 

1788 google.cloud.firestore_v1.services.firestore.pagers.PartitionQueryPager: 

1789 The response for 

1790 [Firestore.PartitionQuery][google.firestore.v1.Firestore.PartitionQuery]. 

1791 

1792 Iterating over this object will yield results and 

1793 resolve additional pages automatically. 

1794 

1795 """ 

1796 # Create or coerce a protobuf request object. 

1797 # - Use the request object if provided (there's no risk of modifying the input as 

1798 # there are no flattened fields), or create one. 

1799 if not isinstance(request, firestore.PartitionQueryRequest): 

1800 request = firestore.PartitionQueryRequest(request) 

1801 

1802 # Wrap the RPC method; this adds retry and timeout information, 

1803 # and friendly error handling. 

1804 rpc = self._transport._wrapped_methods[self._transport.partition_query] 

1805 

1806 # Certain fields should be provided within the metadata header; 

1807 # add these here. 

1808 metadata = tuple(metadata) + ( 

1809 gapic_v1.routing_header.to_grpc_metadata((("parent", request.parent),)), 

1810 ) 

1811 

1812 # Validate the universe domain. 

1813 self._validate_universe_domain() 

1814 

1815 # Send the request. 

1816 response = rpc( 

1817 request, 

1818 retry=retry, 

1819 timeout=timeout, 

1820 metadata=metadata, 

1821 ) 

1822 

1823 # This method is paged; wrap the response in a pager, which provides 

1824 # an `__iter__` convenience method. 

1825 response = pagers.PartitionQueryPager( 

1826 method=rpc, 

1827 request=request, 

1828 response=response, 

1829 retry=retry, 

1830 timeout=timeout, 

1831 metadata=metadata, 

1832 ) 

1833 

1834 # Done; return the response. 

1835 return response 

1836 

1837 def write( 

1838 self, 

1839 requests: Optional[Iterator[firestore.WriteRequest]] = None, 

1840 *, 

1841 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

1842 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

1843 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

1844 ) -> Iterable[firestore.WriteResponse]: 

1845 r"""Streams batches of document updates and deletes, in 

1846 order. This method is only available via gRPC or 

1847 WebChannel (not REST). 

1848 

1849 .. code-block:: python 

1850 

1851 # This snippet has been automatically generated and should be regarded as a 

1852 # code template only. 

1853 # It will require modifications to work: 

1854 # - It may require correct/in-range values for request initialization. 

1855 # - It may require specifying regional endpoints when creating the service 

1856 # client as shown in: 

1857 # https://googleapis.dev/python/google-api-core/latest/client_options.html 

1858 from google.cloud import firestore_v1 

1859 

1860 def sample_write(): 

1861 # Create a client 

1862 client = firestore_v1.FirestoreClient() 

1863 

1864 # Initialize request argument(s) 

1865 request = firestore_v1.WriteRequest( 

1866 database="database_value", 

1867 ) 

1868 

1869 # This method expects an iterator which contains 

1870 # 'firestore_v1.WriteRequest' objects 

1871 # Here we create a generator that yields a single `request` for 

1872 # demonstrative purposes. 

1873 requests = [request] 

1874 

1875 def request_generator(): 

1876 for request in requests: 

1877 yield request 

1878 

1879 # Make the request 

1880 stream = client.write(requests=request_generator()) 

1881 

1882 # Handle the response 

1883 for response in stream: 

1884 print(response) 

1885 

1886 Args: 

1887 requests (Iterator[google.cloud.firestore_v1.types.WriteRequest]): 

1888 The request object iterator. The request for 

1889 [Firestore.Write][google.firestore.v1.Firestore.Write]. 

1890 

1891 The first request creates a stream, or resumes an 

1892 existing one from a token. 

1893 

1894 When creating a new stream, the server replies with a 

1895 response containing only an ID and a token, to use in 

1896 the next request. 

1897 

1898 When resuming a stream, the server first streams any 

1899 responses later than the given token, then a response 

1900 containing only an up-to-date token, to use in the next 

1901 request. 

1902 retry (google.api_core.retry.Retry): Designation of what errors, if any, 

1903 should be retried. 

1904 timeout (float): The timeout for this request. 

1905 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

1906 sent along with the request as metadata. Normally, each value must be of type `str`, 

1907 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

1908 be of type `bytes`. 

1909 

1910 Returns: 

1911 Iterable[google.cloud.firestore_v1.types.WriteResponse]: 

1912 The response for 

1913 [Firestore.Write][google.firestore.v1.Firestore.Write]. 

1914 

1915 """ 

1916 

1917 # Wrap the RPC method; this adds retry and timeout information, 

1918 # and friendly error handling. 

1919 rpc = self._transport._wrapped_methods[self._transport.write] 

1920 

1921 # Certain fields should be provided within the metadata header; 

1922 # add these here. 

1923 metadata = tuple(metadata) + (gapic_v1.routing_header.to_grpc_metadata(()),) 

1924 

1925 # Validate the universe domain. 

1926 self._validate_universe_domain() 

1927 

1928 # Send the request. 

1929 response = rpc( 

1930 requests, 

1931 retry=retry, 

1932 timeout=timeout, 

1933 metadata=metadata, 

1934 ) 

1935 

1936 # Done; return the response. 

1937 return response 

1938 

1939 def listen( 

1940 self, 

1941 requests: Optional[Iterator[firestore.ListenRequest]] = None, 

1942 *, 

1943 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

1944 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

1945 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

1946 ) -> Iterable[firestore.ListenResponse]: 

1947 r"""Listens to changes. This method is only available via 

1948 gRPC or WebChannel (not REST). 

1949 

1950 .. code-block:: python 

1951 

1952 # This snippet has been automatically generated and should be regarded as a 

1953 # code template only. 

1954 # It will require modifications to work: 

1955 # - It may require correct/in-range values for request initialization. 

1956 # - It may require specifying regional endpoints when creating the service 

1957 # client as shown in: 

1958 # https://googleapis.dev/python/google-api-core/latest/client_options.html 

1959 from google.cloud import firestore_v1 

1960 

1961 def sample_listen(): 

1962 # Create a client 

1963 client = firestore_v1.FirestoreClient() 

1964 

1965 # Initialize request argument(s) 

1966 add_target = firestore_v1.Target() 

1967 add_target.resume_token = b'resume_token_blob' 

1968 

1969 request = firestore_v1.ListenRequest( 

1970 add_target=add_target, 

1971 database="database_value", 

1972 ) 

1973 

1974 # This method expects an iterator which contains 

1975 # 'firestore_v1.ListenRequest' objects 

1976 # Here we create a generator that yields a single `request` for 

1977 # demonstrative purposes. 

1978 requests = [request] 

1979 

1980 def request_generator(): 

1981 for request in requests: 

1982 yield request 

1983 

1984 # Make the request 

1985 stream = client.listen(requests=request_generator()) 

1986 

1987 # Handle the response 

1988 for response in stream: 

1989 print(response) 

1990 

1991 Args: 

1992 requests (Iterator[google.cloud.firestore_v1.types.ListenRequest]): 

1993 The request object iterator. A request for 

1994 [Firestore.Listen][google.firestore.v1.Firestore.Listen] 

1995 retry (google.api_core.retry.Retry): Designation of what errors, if any, 

1996 should be retried. 

1997 timeout (float): The timeout for this request. 

1998 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

1999 sent along with the request as metadata. Normally, each value must be of type `str`, 

2000 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

2001 be of type `bytes`. 

2002 

2003 Returns: 

2004 Iterable[google.cloud.firestore_v1.types.ListenResponse]: 

2005 The response for 

2006 [Firestore.Listen][google.firestore.v1.Firestore.Listen]. 

2007 

2008 """ 

2009 

2010 # Wrap the RPC method; this adds retry and timeout information, 

2011 # and friendly error handling. 

2012 rpc = self._transport._wrapped_methods[self._transport.listen] 

2013 

2014 # Certain fields should be provided within the metadata header; 

2015 # add these here. 

2016 metadata = tuple(metadata) + (gapic_v1.routing_header.to_grpc_metadata(()),) 

2017 

2018 # Validate the universe domain. 

2019 self._validate_universe_domain() 

2020 

2021 # Send the request. 

2022 response = rpc( 

2023 requests, 

2024 retry=retry, 

2025 timeout=timeout, 

2026 metadata=metadata, 

2027 ) 

2028 

2029 # Done; return the response. 

2030 return response 

2031 

2032 def list_collection_ids( 

2033 self, 

2034 request: Optional[Union[firestore.ListCollectionIdsRequest, dict]] = None, 

2035 *, 

2036 parent: Optional[str] = None, 

2037 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

2038 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

2039 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

2040 ) -> pagers.ListCollectionIdsPager: 

2041 r"""Lists all the collection IDs underneath a document. 

2042 

2043 .. code-block:: python 

2044 

2045 # This snippet has been automatically generated and should be regarded as a 

2046 # code template only. 

2047 # It will require modifications to work: 

2048 # - It may require correct/in-range values for request initialization. 

2049 # - It may require specifying regional endpoints when creating the service 

2050 # client as shown in: 

2051 # https://googleapis.dev/python/google-api-core/latest/client_options.html 

2052 from google.cloud import firestore_v1 

2053 

2054 def sample_list_collection_ids(): 

2055 # Create a client 

2056 client = firestore_v1.FirestoreClient() 

2057 

2058 # Initialize request argument(s) 

2059 request = firestore_v1.ListCollectionIdsRequest( 

2060 parent="parent_value", 

2061 ) 

2062 

2063 # Make the request 

2064 page_result = client.list_collection_ids(request=request) 

2065 

2066 # Handle the response 

2067 for response in page_result: 

2068 print(response) 

2069 

2070 Args: 

2071 request (Union[google.cloud.firestore_v1.types.ListCollectionIdsRequest, dict]): 

2072 The request object. The request for 

2073 [Firestore.ListCollectionIds][google.firestore.v1.Firestore.ListCollectionIds]. 

2074 parent (str): 

2075 Required. The parent document. In the format: 

2076 ``projects/{project_id}/databases/{database_id}/documents/{document_path}``. 

2077 For example: 

2078 ``projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`` 

2079 

2080 This corresponds to the ``parent`` field 

2081 on the ``request`` instance; if ``request`` is provided, this 

2082 should not be set. 

2083 retry (google.api_core.retry.Retry): Designation of what errors, if any, 

2084 should be retried. 

2085 timeout (float): The timeout for this request. 

2086 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

2087 sent along with the request as metadata. Normally, each value must be of type `str`, 

2088 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

2089 be of type `bytes`. 

2090 

2091 Returns: 

2092 google.cloud.firestore_v1.services.firestore.pagers.ListCollectionIdsPager: 

2093 The response from 

2094 [Firestore.ListCollectionIds][google.firestore.v1.Firestore.ListCollectionIds]. 

2095 

2096 Iterating over this object will yield results and 

2097 resolve additional pages automatically. 

2098 

2099 """ 

2100 # Create or coerce a protobuf request object. 

2101 # - Quick check: If we got a request object, we should *not* have 

2102 # gotten any keyword arguments that map to the request. 

2103 flattened_params = [parent] 

2104 has_flattened_params = ( 

2105 len([param for param in flattened_params if param is not None]) > 0 

2106 ) 

2107 if request is not None and has_flattened_params: 

2108 raise ValueError( 

2109 "If the `request` argument is set, then none of " 

2110 "the individual field arguments should be set." 

2111 ) 

2112 

2113 # - Use the request object if provided (there's no risk of modifying the input as 

2114 # there are no flattened fields), or create one. 

2115 if not isinstance(request, firestore.ListCollectionIdsRequest): 

2116 request = firestore.ListCollectionIdsRequest(request) 

2117 # If we have keyword arguments corresponding to fields on the 

2118 # request, apply these. 

2119 if parent is not None: 

2120 request.parent = parent 

2121 

2122 # Wrap the RPC method; this adds retry and timeout information, 

2123 # and friendly error handling. 

2124 rpc = self._transport._wrapped_methods[self._transport.list_collection_ids] 

2125 

2126 # Certain fields should be provided within the metadata header; 

2127 # add these here. 

2128 metadata = tuple(metadata) + ( 

2129 gapic_v1.routing_header.to_grpc_metadata((("parent", request.parent),)), 

2130 ) 

2131 

2132 # Validate the universe domain. 

2133 self._validate_universe_domain() 

2134 

2135 # Send the request. 

2136 response = rpc( 

2137 request, 

2138 retry=retry, 

2139 timeout=timeout, 

2140 metadata=metadata, 

2141 ) 

2142 

2143 # This method is paged; wrap the response in a pager, which provides 

2144 # an `__iter__` convenience method. 

2145 response = pagers.ListCollectionIdsPager( 

2146 method=rpc, 

2147 request=request, 

2148 response=response, 

2149 retry=retry, 

2150 timeout=timeout, 

2151 metadata=metadata, 

2152 ) 

2153 

2154 # Done; return the response. 

2155 return response 

2156 

2157 def batch_write( 

2158 self, 

2159 request: Optional[Union[firestore.BatchWriteRequest, dict]] = None, 

2160 *, 

2161 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

2162 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

2163 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

2164 ) -> firestore.BatchWriteResponse: 

2165 r"""Applies a batch of write operations. 

2166 

2167 The BatchWrite method does not apply the write operations 

2168 atomically and can apply them out of order. Method does not 

2169 allow more than one write per document. Each write succeeds or 

2170 fails independently. See the 

2171 [BatchWriteResponse][google.firestore.v1.BatchWriteResponse] for 

2172 the success status of each write. 

2173 

2174 If you require an atomically applied set of writes, use 

2175 [Commit][google.firestore.v1.Firestore.Commit] instead. 

2176 

2177 .. code-block:: python 

2178 

2179 # This snippet has been automatically generated and should be regarded as a 

2180 # code template only. 

2181 # It will require modifications to work: 

2182 # - It may require correct/in-range values for request initialization. 

2183 # - It may require specifying regional endpoints when creating the service 

2184 # client as shown in: 

2185 # https://googleapis.dev/python/google-api-core/latest/client_options.html 

2186 from google.cloud import firestore_v1 

2187 

2188 def sample_batch_write(): 

2189 # Create a client 

2190 client = firestore_v1.FirestoreClient() 

2191 

2192 # Initialize request argument(s) 

2193 request = firestore_v1.BatchWriteRequest( 

2194 database="database_value", 

2195 ) 

2196 

2197 # Make the request 

2198 response = client.batch_write(request=request) 

2199 

2200 # Handle the response 

2201 print(response) 

2202 

2203 Args: 

2204 request (Union[google.cloud.firestore_v1.types.BatchWriteRequest, dict]): 

2205 The request object. The request for 

2206 [Firestore.BatchWrite][google.firestore.v1.Firestore.BatchWrite]. 

2207 retry (google.api_core.retry.Retry): Designation of what errors, if any, 

2208 should be retried. 

2209 timeout (float): The timeout for this request. 

2210 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

2211 sent along with the request as metadata. Normally, each value must be of type `str`, 

2212 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

2213 be of type `bytes`. 

2214 

2215 Returns: 

2216 google.cloud.firestore_v1.types.BatchWriteResponse: 

2217 The response from 

2218 [Firestore.BatchWrite][google.firestore.v1.Firestore.BatchWrite]. 

2219 

2220 """ 

2221 # Create or coerce a protobuf request object. 

2222 # - Use the request object if provided (there's no risk of modifying the input as 

2223 # there are no flattened fields), or create one. 

2224 if not isinstance(request, firestore.BatchWriteRequest): 

2225 request = firestore.BatchWriteRequest(request) 

2226 

2227 # Wrap the RPC method; this adds retry and timeout information, 

2228 # and friendly error handling. 

2229 rpc = self._transport._wrapped_methods[self._transport.batch_write] 

2230 

2231 # Certain fields should be provided within the metadata header; 

2232 # add these here. 

2233 metadata = tuple(metadata) + ( 

2234 gapic_v1.routing_header.to_grpc_metadata((("database", request.database),)), 

2235 ) 

2236 

2237 # Validate the universe domain. 

2238 self._validate_universe_domain() 

2239 

2240 # Send the request. 

2241 response = rpc( 

2242 request, 

2243 retry=retry, 

2244 timeout=timeout, 

2245 metadata=metadata, 

2246 ) 

2247 

2248 # Done; return the response. 

2249 return response 

2250 

2251 def create_document( 

2252 self, 

2253 request: Optional[Union[firestore.CreateDocumentRequest, dict]] = None, 

2254 *, 

2255 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

2256 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

2257 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

2258 ) -> document.Document: 

2259 r"""Creates a new document. 

2260 

2261 .. code-block:: python 

2262 

2263 # This snippet has been automatically generated and should be regarded as a 

2264 # code template only. 

2265 # It will require modifications to work: 

2266 # - It may require correct/in-range values for request initialization. 

2267 # - It may require specifying regional endpoints when creating the service 

2268 # client as shown in: 

2269 # https://googleapis.dev/python/google-api-core/latest/client_options.html 

2270 from google.cloud import firestore_v1 

2271 

2272 def sample_create_document(): 

2273 # Create a client 

2274 client = firestore_v1.FirestoreClient() 

2275 

2276 # Initialize request argument(s) 

2277 request = firestore_v1.CreateDocumentRequest( 

2278 parent="parent_value", 

2279 collection_id="collection_id_value", 

2280 ) 

2281 

2282 # Make the request 

2283 response = client.create_document(request=request) 

2284 

2285 # Handle the response 

2286 print(response) 

2287 

2288 Args: 

2289 request (Union[google.cloud.firestore_v1.types.CreateDocumentRequest, dict]): 

2290 The request object. The request for 

2291 [Firestore.CreateDocument][google.firestore.v1.Firestore.CreateDocument]. 

2292 retry (google.api_core.retry.Retry): Designation of what errors, if any, 

2293 should be retried. 

2294 timeout (float): The timeout for this request. 

2295 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

2296 sent along with the request as metadata. Normally, each value must be of type `str`, 

2297 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

2298 be of type `bytes`. 

2299 

2300 Returns: 

2301 google.cloud.firestore_v1.types.Document: 

2302 A Firestore document. 

2303 

2304 Must not exceed 1 MiB - 4 bytes. 

2305 

2306 """ 

2307 # Create or coerce a protobuf request object. 

2308 # - Use the request object if provided (there's no risk of modifying the input as 

2309 # there are no flattened fields), or create one. 

2310 if not isinstance(request, firestore.CreateDocumentRequest): 

2311 request = firestore.CreateDocumentRequest(request) 

2312 

2313 # Wrap the RPC method; this adds retry and timeout information, 

2314 # and friendly error handling. 

2315 rpc = self._transport._wrapped_methods[self._transport.create_document] 

2316 

2317 # Certain fields should be provided within the metadata header; 

2318 # add these here. 

2319 metadata = tuple(metadata) + ( 

2320 gapic_v1.routing_header.to_grpc_metadata( 

2321 ( 

2322 ("parent", request.parent), 

2323 ("collection_id", request.collection_id), 

2324 ) 

2325 ), 

2326 ) 

2327 

2328 # Validate the universe domain. 

2329 self._validate_universe_domain() 

2330 

2331 # Send the request. 

2332 response = rpc( 

2333 request, 

2334 retry=retry, 

2335 timeout=timeout, 

2336 metadata=metadata, 

2337 ) 

2338 

2339 # Done; return the response. 

2340 return response 

2341 

2342 def __enter__(self) -> "FirestoreClient": 

2343 return self 

2344 

2345 def __exit__(self, type, value, traceback): 

2346 """Releases underlying transport's resources. 

2347 

2348 .. warning:: 

2349 ONLY use as a context manager if the transport is NOT shared 

2350 with other clients! Exiting the with block will CLOSE the transport 

2351 and may cause errors in other clients! 

2352 """ 

2353 self.transport.close() 

2354 

2355 def list_operations( 

2356 self, 

2357 request: Optional[operations_pb2.ListOperationsRequest] = None, 

2358 *, 

2359 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

2360 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

2361 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

2362 ) -> operations_pb2.ListOperationsResponse: 

2363 r"""Lists operations that match the specified filter in the request. 

2364 

2365 Args: 

2366 request (:class:`~.operations_pb2.ListOperationsRequest`): 

2367 The request object. Request message for 

2368 `ListOperations` method. 

2369 retry (google.api_core.retry.Retry): Designation of what errors, 

2370 if any, should be retried. 

2371 timeout (float): The timeout for this request. 

2372 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

2373 sent along with the request as metadata. Normally, each value must be of type `str`, 

2374 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

2375 be of type `bytes`. 

2376 Returns: 

2377 ~.operations_pb2.ListOperationsResponse: 

2378 Response message for ``ListOperations`` method. 

2379 """ 

2380 # Create or coerce a protobuf request object. 

2381 # The request isn't a proto-plus wrapped type, 

2382 # so it must be constructed via keyword expansion. 

2383 if isinstance(request, dict): 

2384 request = operations_pb2.ListOperationsRequest(**request) 

2385 

2386 # Wrap the RPC method; this adds retry and timeout information, 

2387 # and friendly error handling. 

2388 rpc = self._transport._wrapped_methods[self._transport.list_operations] 

2389 

2390 # Certain fields should be provided within the metadata header; 

2391 # add these here. 

2392 metadata = tuple(metadata) + ( 

2393 gapic_v1.routing_header.to_grpc_metadata((("name", request.name),)), 

2394 ) 

2395 

2396 # Validate the universe domain. 

2397 self._validate_universe_domain() 

2398 

2399 try: 

2400 # Send the request. 

2401 response = rpc( 

2402 request, 

2403 retry=retry, 

2404 timeout=timeout, 

2405 metadata=metadata, 

2406 ) 

2407 

2408 # Done; return the response. 

2409 return response 

2410 except core_exceptions.GoogleAPICallError as e: 

2411 self._add_cred_info_for_auth_errors(e) 

2412 raise e 

2413 

2414 def get_operation( 

2415 self, 

2416 request: Optional[operations_pb2.GetOperationRequest] = None, 

2417 *, 

2418 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

2419 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

2420 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

2421 ) -> operations_pb2.Operation: 

2422 r"""Gets the latest state of a long-running operation. 

2423 

2424 Args: 

2425 request (:class:`~.operations_pb2.GetOperationRequest`): 

2426 The request object. Request message for 

2427 `GetOperation` method. 

2428 retry (google.api_core.retry.Retry): Designation of what errors, 

2429 if any, should be retried. 

2430 timeout (float): The timeout for this request. 

2431 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

2432 sent along with the request as metadata. Normally, each value must be of type `str`, 

2433 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

2434 be of type `bytes`. 

2435 Returns: 

2436 ~.operations_pb2.Operation: 

2437 An ``Operation`` object. 

2438 """ 

2439 # Create or coerce a protobuf request object. 

2440 # The request isn't a proto-plus wrapped type, 

2441 # so it must be constructed via keyword expansion. 

2442 if isinstance(request, dict): 

2443 request = operations_pb2.GetOperationRequest(**request) 

2444 

2445 # Wrap the RPC method; this adds retry and timeout information, 

2446 # and friendly error handling. 

2447 rpc = self._transport._wrapped_methods[self._transport.get_operation] 

2448 

2449 # Certain fields should be provided within the metadata header; 

2450 # add these here. 

2451 metadata = tuple(metadata) + ( 

2452 gapic_v1.routing_header.to_grpc_metadata((("name", request.name),)), 

2453 ) 

2454 

2455 # Validate the universe domain. 

2456 self._validate_universe_domain() 

2457 

2458 try: 

2459 # Send the request. 

2460 response = rpc( 

2461 request, 

2462 retry=retry, 

2463 timeout=timeout, 

2464 metadata=metadata, 

2465 ) 

2466 

2467 # Done; return the response. 

2468 return response 

2469 except core_exceptions.GoogleAPICallError as e: 

2470 self._add_cred_info_for_auth_errors(e) 

2471 raise e 

2472 

2473 def delete_operation( 

2474 self, 

2475 request: Optional[operations_pb2.DeleteOperationRequest] = None, 

2476 *, 

2477 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

2478 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

2479 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

2480 ) -> None: 

2481 r"""Deletes a long-running operation. 

2482 

2483 This method indicates that the client is no longer interested 

2484 in the operation result. It does not cancel the operation. 

2485 If the server doesn't support this method, it returns 

2486 `google.rpc.Code.UNIMPLEMENTED`. 

2487 

2488 Args: 

2489 request (:class:`~.operations_pb2.DeleteOperationRequest`): 

2490 The request object. Request message for 

2491 `DeleteOperation` method. 

2492 retry (google.api_core.retry.Retry): Designation of what errors, 

2493 if any, should be retried. 

2494 timeout (float): The timeout for this request. 

2495 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

2496 sent along with the request as metadata. Normally, each value must be of type `str`, 

2497 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

2498 be of type `bytes`. 

2499 Returns: 

2500 None 

2501 """ 

2502 # Create or coerce a protobuf request object. 

2503 # The request isn't a proto-plus wrapped type, 

2504 # so it must be constructed via keyword expansion. 

2505 if isinstance(request, dict): 

2506 request = operations_pb2.DeleteOperationRequest(**request) 

2507 

2508 # Wrap the RPC method; this adds retry and timeout information, 

2509 # and friendly error handling. 

2510 rpc = self._transport._wrapped_methods[self._transport.delete_operation] 

2511 

2512 # Certain fields should be provided within the metadata header; 

2513 # add these here. 

2514 metadata = tuple(metadata) + ( 

2515 gapic_v1.routing_header.to_grpc_metadata((("name", request.name),)), 

2516 ) 

2517 

2518 # Validate the universe domain. 

2519 self._validate_universe_domain() 

2520 

2521 # Send the request. 

2522 rpc( 

2523 request, 

2524 retry=retry, 

2525 timeout=timeout, 

2526 metadata=metadata, 

2527 ) 

2528 

2529 def cancel_operation( 

2530 self, 

2531 request: Optional[operations_pb2.CancelOperationRequest] = None, 

2532 *, 

2533 retry: OptionalRetry = gapic_v1.method.DEFAULT, 

2534 timeout: Union[float, object] = gapic_v1.method.DEFAULT, 

2535 metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), 

2536 ) -> None: 

2537 r"""Starts asynchronous cancellation on a long-running operation. 

2538 

2539 The server makes a best effort to cancel the operation, but success 

2540 is not guaranteed. If the server doesn't support this method, it returns 

2541 `google.rpc.Code.UNIMPLEMENTED`. 

2542 

2543 Args: 

2544 request (:class:`~.operations_pb2.CancelOperationRequest`): 

2545 The request object. Request message for 

2546 `CancelOperation` method. 

2547 retry (google.api_core.retry.Retry): Designation of what errors, 

2548 if any, should be retried. 

2549 timeout (float): The timeout for this request. 

2550 metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be 

2551 sent along with the request as metadata. Normally, each value must be of type `str`, 

2552 but for metadata keys ending with the suffix `-bin`, the corresponding values must 

2553 be of type `bytes`. 

2554 Returns: 

2555 None 

2556 """ 

2557 # Create or coerce a protobuf request object. 

2558 # The request isn't a proto-plus wrapped type, 

2559 # so it must be constructed via keyword expansion. 

2560 if isinstance(request, dict): 

2561 request = operations_pb2.CancelOperationRequest(**request) 

2562 

2563 # Wrap the RPC method; this adds retry and timeout information, 

2564 # and friendly error handling. 

2565 rpc = self._transport._wrapped_methods[self._transport.cancel_operation] 

2566 

2567 # Certain fields should be provided within the metadata header; 

2568 # add these here. 

2569 metadata = tuple(metadata) + ( 

2570 gapic_v1.routing_header.to_grpc_metadata((("name", request.name),)), 

2571 ) 

2572 

2573 # Validate the universe domain. 

2574 self._validate_universe_domain() 

2575 

2576 # Send the request. 

2577 rpc( 

2578 request, 

2579 retry=retry, 

2580 timeout=timeout, 

2581 metadata=metadata, 

2582 ) 

2583 

2584 

2585DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( 

2586 gapic_version=package_version.__version__ 

2587) 

2588 

2589if hasattr(DEFAULT_CLIENT_INFO, "protobuf_runtime_version"): # pragma: NO COVER 

2590 DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__ 

2591 

2592__all__ = ("FirestoreClient",)