Skip to content

Commit 4953046

Browse files
authored
chore: restore coverage (almost) to 100% (#225)
Note that the synthtool-generated `.coveragerc` (see #224) does *not* include all changes needed for 100% coverage: see: - googleapis/gapic-generator-python#171 - googleapis/gapic-generator-python#437 Closes #92. Closes #195.
1 parent 8b005f6 commit 4953046

File tree

14 files changed

+37
-212
lines changed

14 files changed

+37
-212
lines changed

packages/google-cloud-firestore/google/cloud/firestore_v1/_helpers.py

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -644,20 +644,6 @@ def __init__(self, document_data) -> None:
644644
self.transform_merge = []
645645
self.merge = []
646646

647-
@property
648-
def has_updates(self):
649-
# for whatever reason, the conformance tests want to see the parent
650-
# of nested transform paths in the update mask
651-
# (see set-st-merge-nonleaf-alone.textproto)
652-
update_paths = set(self.data_merge)
653-
654-
for transform_path in self.transform_paths:
655-
if len(transform_path.parts) > 1:
656-
parent_fp = FieldPath(*transform_path.parts[:-1])
657-
update_paths.add(parent_fp)
658-
659-
return bool(update_paths)
660-
661647
def _apply_merge_all(self) -> None:
662648
self.data_merge = sorted(self.field_paths + self.deleted_fields)
663649
# TODO: other transforms
@@ -771,8 +757,7 @@ def _get_update_mask(
771757
if field_path not in self.transform_merge
772758
]
773759

774-
if mask_paths or allow_empty_mask:
775-
return common.DocumentMask(field_paths=mask_paths)
760+
return common.DocumentMask(field_paths=mask_paths)
776761

777762

778763
def pbs_for_set_with_merge(
@@ -794,10 +779,8 @@ def pbs_for_set_with_merge(
794779
extractor = DocumentExtractorForMerge(document_data)
795780
extractor.apply_merge(merge)
796781

797-
merge_empty = not document_data
798-
allow_empty_mask = merge_empty or extractor.transform_paths
782+
set_pb = extractor.get_update_pb(document_path)
799783

800-
set_pb = extractor.get_update_pb(document_path, allow_empty_mask=allow_empty_mask)
801784
if extractor.transform_paths:
802785
field_transform_pbs = extractor.get_field_transform_pbs(document_path)
803786
set_pb.update_transforms.extend(field_transform_pbs)

packages/google-cloud-firestore/google/cloud/firestore_v1/async_client.py

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -284,24 +284,8 @@ async def collections(
284284
request=request, metadata=self._rpc_metadata, **kwargs,
285285
)
286286

287-
while True:
288-
for i in iterator.collection_ids:
289-
yield self.collection(i)
290-
if iterator.next_page_token:
291-
next_request = request.copy()
292-
next_request["page_token"] = iterator.next_page_token
293-
iterator = await self._firestore_api.list_collection_ids(
294-
request=next_request, metadata=self._rpc_metadata, **kwargs,
295-
)
296-
else:
297-
return
298-
299-
# TODO(microgen): currently this method is rewritten to iterate/page itself.
300-
# https://github.com/googleapis/gapic-generator-python/issues/516
301-
# it seems the generator ought to be able to do this itself.
302-
# iterator.client = self
303-
# iterator.item_to_value = _item_to_collection_ref
304-
# return iterator
287+
async for collection_id in iterator:
288+
yield self.collection(collection_id)
305289

306290
def batch(self) -> AsyncWriteBatch:
307291
"""Get a batch instance from this client.

packages/google-cloud-firestore/google/cloud/firestore_v1/async_document.py

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -407,20 +407,5 @@ async def collections(
407407
request=request, metadata=self._client._rpc_metadata, **kwargs,
408408
)
409409

410-
while True:
411-
for i in iterator.collection_ids:
412-
yield self.collection(i)
413-
if iterator.next_page_token:
414-
next_request = request.copy()
415-
next_request["page_token"] = iterator.next_page_token
416-
iterator = await self._client._firestore_api.list_collection_ids(
417-
request=request, metadata=self._client._rpc_metadata, **kwargs
418-
)
419-
else:
420-
return
421-
422-
# TODO(microgen): currently this method is rewritten to iterate/page itself.
423-
# it seems the generator ought to be able to do this itself.
424-
# iterator.document = self
425-
# iterator.item_to_value = _item_to_collection_ref
426-
# return iterator
410+
async for collection_id in iterator:
411+
yield self.collection(collection_id)

packages/google-cloud-firestore/google/cloud/firestore_v1/base_client.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -536,17 +536,6 @@ def _get_doc_mask(field_paths: Iterable[str]) -> Optional[types.common.DocumentM
536536
return types.DocumentMask(field_paths=field_paths)
537537

538538

539-
def _item_to_collection_ref(iterator, item: str) -> Any:
540-
"""Convert collection ID to collection ref.
541-
542-
Args:
543-
iterator (google.api_core.page_iterator.GRPCIterator):
544-
iterator response
545-
item (str): ID of the collection
546-
"""
547-
return iterator.client.collection(item)
548-
549-
550539
def _path_helper(path: tuple) -> Any:
551540
"""Standardize path into a tuple of path segments.
552541

packages/google-cloud-firestore/google/cloud/firestore_v1/base_document.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -567,14 +567,3 @@ def _first_write_result(write_results: list) -> Any:
567567
raise ValueError("Expected at least one write result")
568568

569569
return write_results[0]
570-
571-
572-
def _item_to_collection_ref(iterator, item: str) -> Any:
573-
"""Convert collection ID to collection ref.
574-
575-
Args:
576-
iterator (google.api_core.page_iterator.GRPCIterator):
577-
iterator response
578-
item (str): ID of the collection
579-
"""
580-
return iterator.document.collection(item)

packages/google-cloud-firestore/google/cloud/firestore_v1/client.py

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -280,24 +280,8 @@ def collections(
280280
request=request, metadata=self._rpc_metadata, **kwargs,
281281
)
282282

283-
while True:
284-
for i in iterator.collection_ids:
285-
yield self.collection(i)
286-
if iterator.next_page_token:
287-
next_request = request.copy()
288-
next_request["page_token"] = iterator.next_page_token
289-
iterator = self._firestore_api.list_collection_ids(
290-
request=next_request, metadata=self._rpc_metadata, **kwargs,
291-
)
292-
else:
293-
return
294-
295-
# TODO(microgen): currently this method is rewritten to iterate/page itself.
296-
# https://github.com/googleapis/gapic-generator-python/issues/516
297-
# it seems the generator ought to be able to do this itself.
298-
# iterator.client = self
299-
# iterator.item_to_value = _item_to_collection_ref
300-
# return iterator
283+
for collection_id in iterator:
284+
yield self.collection(collection_id)
301285

302286
def batch(self) -> WriteBatch:
303287
"""Get a batch instance from this client.

packages/google-cloud-firestore/google/cloud/firestore_v1/document.py

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -408,23 +408,8 @@ def collections(
408408
request=request, metadata=self._client._rpc_metadata, **kwargs,
409409
)
410410

411-
while True:
412-
for i in iterator.collection_ids:
413-
yield self.collection(i)
414-
if iterator.next_page_token:
415-
next_request = request.copy()
416-
next_request["page_token"] = iterator.next_page_token
417-
iterator = self._client._firestore_api.list_collection_ids(
418-
request=request, metadata=self._client._rpc_metadata, **kwargs
419-
)
420-
else:
421-
return
422-
423-
# TODO(microgen): currently this method is rewritten to iterate/page itself.
424-
# it seems the generator ought to be able to do this itself.
425-
# iterator.document = self
426-
# iterator.item_to_value = _item_to_collection_ref
427-
# return iterator
411+
for collection_id in iterator:
412+
yield self.collection(collection_id)
428413

429414
def on_snapshot(self, callback: Callable) -> Watch:
430415
"""Watch this document.

packages/google-cloud-firestore/tests/unit/v1/test__helpers.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1728,7 +1728,6 @@ def test_apply_merge_all_w_empty_document(self):
17281728
self.assertEqual(inst.data_merge, [])
17291729
self.assertEqual(inst.transform_merge, [])
17301730
self.assertEqual(inst.merge, [])
1731-
self.assertFalse(inst.has_updates)
17321731

17331732
def test_apply_merge_all_w_delete(self):
17341733
from google.cloud.firestore_v1.transforms import DELETE_FIELD
@@ -1745,7 +1744,6 @@ def test_apply_merge_all_w_delete(self):
17451744
self.assertEqual(inst.data_merge, expected_data_merge)
17461745
self.assertEqual(inst.transform_merge, [])
17471746
self.assertEqual(inst.merge, expected_data_merge)
1748-
self.assertTrue(inst.has_updates)
17491747

17501748
def test_apply_merge_all_w_server_timestamp(self):
17511749
from google.cloud.firestore_v1.transforms import SERVER_TIMESTAMP
@@ -1761,7 +1759,6 @@ def test_apply_merge_all_w_server_timestamp(self):
17611759
self.assertEqual(inst.data_merge, expected_data_merge)
17621760
self.assertEqual(inst.transform_merge, expected_transform_merge)
17631761
self.assertEqual(inst.merge, expected_merge)
1764-
self.assertTrue(inst.has_updates)
17651762

17661763
def test_apply_merge_list_fields_w_empty_document(self):
17671764
document_data = {}
@@ -1800,7 +1797,6 @@ def test_apply_merge_list_fields_w_delete(self):
18001797
expected_deleted_fields = [_make_field_path("delete_me")]
18011798
self.assertEqual(inst.set_fields, expected_set_fields)
18021799
self.assertEqual(inst.deleted_fields, expected_deleted_fields)
1803-
self.assertTrue(inst.has_updates)
18041800

18051801
def test_apply_merge_list_fields_w_prefixes(self):
18061802

@@ -1827,7 +1823,6 @@ def test_apply_merge_list_fields_w_non_merge_field(self):
18271823

18281824
expected_set_fields = {"write_me": "value"}
18291825
self.assertEqual(inst.set_fields, expected_set_fields)
1830-
self.assertTrue(inst.has_updates)
18311826

18321827
def test_apply_merge_list_fields_w_server_timestamp(self):
18331828
from google.cloud.firestore_v1.transforms import SERVER_TIMESTAMP
@@ -1849,7 +1844,6 @@ def test_apply_merge_list_fields_w_server_timestamp(self):
18491844
self.assertEqual(inst.merge, expected_merge)
18501845
expected_server_timestamps = [_make_field_path("timestamp")]
18511846
self.assertEqual(inst.server_timestamps, expected_server_timestamps)
1852-
self.assertTrue(inst.has_updates)
18531847

18541848
def test_apply_merge_list_fields_w_array_remove(self):
18551849
from google.cloud.firestore_v1.transforms import ArrayRemove
@@ -1872,7 +1866,6 @@ def test_apply_merge_list_fields_w_array_remove(self):
18721866
self.assertEqual(inst.merge, expected_merge)
18731867
expected_array_removes = {_make_field_path("remove_me"): values}
18741868
self.assertEqual(inst.array_removes, expected_array_removes)
1875-
self.assertTrue(inst.has_updates)
18761869

18771870
def test_apply_merge_list_fields_w_array_union(self):
18781871
from google.cloud.firestore_v1.transforms import ArrayUnion
@@ -1895,7 +1888,6 @@ def test_apply_merge_list_fields_w_array_union(self):
18951888
self.assertEqual(inst.merge, expected_merge)
18961889
expected_array_unions = {_make_field_path("union_me"): values}
18971890
self.assertEqual(inst.array_unions, expected_array_unions)
1898-
self.assertTrue(inst.has_updates)
18991891

19001892

19011893
class Test_pbs_for_set_with_merge(unittest.TestCase):

packages/google-cloud-firestore/tests/unit/v1/test_async_client.py

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -196,33 +196,23 @@ def test_document_factory_w_nested_path(self):
196196
self.assertIsInstance(document2, AsyncDocumentReference)
197197

198198
async def _collections_helper(self, retry=None, timeout=None):
199-
from google.api_core.page_iterator import Iterator
200-
from google.api_core.page_iterator import Page
201199
from google.cloud.firestore_v1.async_collection import AsyncCollectionReference
202200
from google.cloud.firestore_v1 import _helpers
203201

204202
collection_ids = ["users", "projects"]
205-
client = self._make_default_one()
206-
firestore_api = AsyncMock()
207-
firestore_api.mock_add_spec(spec=["list_collection_ids"])
208-
client._firestore_api_internal = firestore_api
209203

210-
# TODO(microgen): list_collection_ids isn't a pager.
211-
# https://github.com/googleapis/gapic-generator-python/issues/516
212-
class _Iterator(Iterator):
213-
def __init__(self, pages):
214-
super(_Iterator, self).__init__(client=None)
215-
self._pages = pages
216-
self.collection_ids = pages[0]
204+
class Pager(object):
205+
async def __aiter__(self, **_):
206+
for collection_id in collection_ids:
207+
yield collection_id
217208

218-
def _next_page(self):
219-
if self._pages:
220-
page, self._pages = self._pages[0], self._pages[1:]
221-
return Page(self, page, self.item_to_value)
209+
firestore_api = AsyncMock()
210+
firestore_api.mock_add_spec(spec=["list_collection_ids"])
211+
firestore_api.list_collection_ids.return_value = Pager()
222212

213+
client = self._make_default_one()
214+
client._firestore_api_internal = firestore_api
223215
kwargs = _helpers.make_retry_timeout_kwargs(retry, timeout)
224-
iterator = _Iterator(pages=[collection_ids])
225-
firestore_api.list_collection_ids.return_value = iterator
226216

227217
collections = [c async for c in client.collections(**kwargs)]
228218

packages/google-cloud-firestore/tests/unit/v1/test_async_document.py

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -497,27 +497,18 @@ async def test_get_with_transaction(self):
497497
@pytest.mark.asyncio
498498
async def _collections_helper(self, page_size=None, retry=None, timeout=None):
499499
from google.cloud.firestore_v1 import _helpers
500-
from google.api_core.page_iterator import Iterator
501-
from google.api_core.page_iterator import Page
502500
from google.cloud.firestore_v1.async_collection import AsyncCollectionReference
503501

504-
# TODO(microgen): https://github.com/googleapis/gapic-generator-python/issues/516
505-
class _Iterator(Iterator):
506-
def __init__(self, pages):
507-
super(_Iterator, self).__init__(client=None)
508-
self._pages = pages
509-
self.collection_ids = pages[0]
502+
collection_ids = ["coll-1", "coll-2"]
510503

511-
def _next_page(self):
512-
if self._pages:
513-
page, self._pages = self._pages[0], self._pages[1:]
514-
return Page(self, page, self.item_to_value)
504+
class Pager(object):
505+
async def __aiter__(self, **_):
506+
for collection_id in collection_ids:
507+
yield collection_id
515508

516-
collection_ids = ["coll-1", "coll-2"]
517-
iterator = _Iterator(pages=[collection_ids])
518509
firestore_api = AsyncMock()
519510
firestore_api.mock_add_spec(spec=["list_collection_ids"])
520-
firestore_api.list_collection_ids.return_value = iterator
511+
firestore_api.list_collection_ids.return_value = Pager()
521512

522513
client = _make_client()
523514
client._firestore_api_internal = firestore_api

0 commit comments

Comments
 (0)