def test_paths(self): from google.cloud.firestore_v1.proto import common_pb2 field_paths = ["a.b", "c"] result = self._call_fut(field_paths) expected = common_pb2.DocumentMask(field_paths=field_paths) self.assertEqual(result, expected)
def _get_update_mask(self, allow_empty_mask=False): mask_paths = [] for field_path in self.top_level_paths: if field_path not in self.transform_paths: mask_paths.append(field_path.to_api_repr()) return common_pb2.DocumentMask(field_paths=mask_paths)
def _get_update_mask(self, allow_empty_mask=False): # Mask uses dotted / quoted paths. mask_paths = [ field_path.to_api_repr() for field_path in self.merge if field_path not in self.transform_merge ] if mask_paths or allow_empty_mask: return common_pb2.DocumentMask(field_paths=mask_paths)
def _get_update_mask(self, allow_empty_mask=False): mask_paths = [] for field_path in self.top_level_paths: if field_path not in self.transform_paths: mask_paths.append(field_path.to_api_repr()) else: prefix = FieldPath(*field_path.parts[:-1]) if prefix.parts: mask_paths.append(prefix.to_api_repr()) return common_pb2.DocumentMask(field_paths=mask_paths)
def test_get_all(self): from google.cloud.firestore_v1.proto import common_pb2 from google.cloud.firestore_v1.document import DocumentSnapshot data1 = {"a": u"cheese"} data2 = {"b": True, "c": 18} info = self._info_for_get_all(data1, data2) client, document1, document2, response1, response2 = info # Exercise the mocked ``batch_get_documents``. field_paths = ["a", "b"] snapshots = self._get_all_helper( client, [document1, document2], [response1, response2], field_paths=field_paths, ) self.assertEqual(len(snapshots), 2) snapshot1 = snapshots[0] self.assertIsInstance(snapshot1, DocumentSnapshot) self.assertIs(snapshot1._reference, document1) self.assertEqual(snapshot1._data, data1) snapshot2 = snapshots[1] self.assertIsInstance(snapshot2, DocumentSnapshot) self.assertIs(snapshot2._reference, document2) self.assertEqual(snapshot2._data, data2) # Verify the call to the mock. doc_paths = [document1._document_path, document2._document_path] mask = common_pb2.DocumentMask(field_paths=field_paths) client._firestore_api.batch_get_documents.assert_called_once_with( client._database_string, doc_paths, mask, transaction=None, metadata=client._rpc_metadata, )
def get(self, field_paths=None, transaction=None): """Retrieve a snapshot of the current document. See :meth:`~google.cloud.firestore_v1.client.Client.field_path` for more information on **field paths**. If a ``transaction`` is used and it already has write operations added, this method cannot be used (i.e. read-after-write is not allowed). Args: field_paths (Optional[Iterable[str, ...]]): An iterable of field paths (``.``-delimited list of field names) to use as a projection of document fields in the returned results. If no value is provided, all fields will be returned. transaction (Optional[:class:`~google.cloud.firestore_v1.transaction.Transaction`]): An existing transaction that this reference will be retrieved in. Returns: :class:`~google.cloud.firestore_v1.document.DocumentSnapshot`: A snapshot of the current document. If the document does not exist at the time of the snapshot is taken, the snapshot's :attr:`reference`, :attr:`data`, :attr:`update_time`, and :attr:`create_time` attributes will all be ``None`` and its :attr:`exists` attribute will be ``False``. """ if isinstance(field_paths, six.string_types): raise ValueError("'field_paths' must be a sequence of paths, not a string.") if field_paths is not None: mask = common_pb2.DocumentMask(field_paths=sorted(field_paths)) else: mask = None firestore_api = self._client._firestore_api try: document_pb = firestore_api.get_document( self._document_path, mask=mask, transaction=_helpers.get_transaction_id(transaction), metadata=self._client._rpc_metadata, ) except exceptions.NotFound: data = None exists = False create_time = None update_time = None else: data = _helpers.decode_dict(document_pb.fields, self._client) exists = True create_time = document_pb.create_time update_time = document_pb.update_time return DocumentSnapshot( reference=self, data=data, exists=exists, read_time=None, # No server read_time available create_time=create_time, update_time=update_time, )