Skip to content

Commit aab30b2

Browse files
committed
get_by_uids() should raise ObjectNotFound when appropriate
1 parent a8f8e39 commit aab30b2

File tree

3 files changed

+26
-13
lines changed

3 files changed

+26
-13
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## Unreleased
44

5+
- `DiffSync.get_by_uids()` now raises `ObjectNotFound` if any of the provided uids cannot be located.
56
- #34 - in diff dicts, change keys `src`/`dst`/`_src`/`_dst` to `-` and `+`
67
- #37 - add `sync_complete` callback, triggered on `sync_from` completion with changes.
78
- #41 - add `summary` API for Diff and DiffElement objects.

diffsync/__init__.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -688,17 +688,20 @@ def get_by_uids(
688688
Args:
689689
uids: List of unique id / key identifying object in the database.
690690
obj: DiffSyncModel class or instance, or modelname string, that defines the type of the objects to retrieve
691+
692+
Raises:
693+
ObjectNotFound: if any of the requested UIDs are not found in the store
691694
"""
692695
if isinstance(obj, str):
693696
modelname = obj
694697
else:
695698
modelname = obj.get_type()
696699

697-
# TODO: should this raise an exception if any or all of the uids are not found?
698700
results = []
699701
for uid in uids:
700-
if uid in self._data[modelname]:
701-
results.append(self._data[modelname][uid])
702+
if uid not in self._data[modelname]:
703+
raise ObjectNotFound(f"{modelname} {uid} not present")
704+
results.append(self._data[modelname][uid])
702705
return results
703706

704707
def add(self, obj: DiffSyncModel):
@@ -735,7 +738,7 @@ def remove(self, obj: DiffSyncModel, remove_children: bool = False):
735738
uid = obj.get_unique_id()
736739

737740
if uid not in self._data[modelname]:
738-
raise ObjectNotFound(f"Object {uid} not present")
741+
raise ObjectNotFound(f"{modelname} {uid} not present")
739742

740743
if obj.diffsync is self:
741744
obj.diffsync = None

tests/unit/test_diffsync.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,13 @@ def test_diffsync_get_all_with_no_data_is_empty_list(generic_diffsync):
6666
assert list(generic_diffsync.get_all(DiffSyncModel)) == []
6767

6868

69-
def test_diffsync_get_by_uids_with_no_data_is_empty_list(generic_diffsync):
70-
assert generic_diffsync.get_by_uids(["any", "another"], "anything") == []
71-
assert generic_diffsync.get_by_uids(["any", "another"], DiffSyncModel) == []
69+
def test_diffsync_get_by_uids_with_no_data(generic_diffsync):
70+
assert generic_diffsync.get_by_uids([], "anything") == []
71+
assert generic_diffsync.get_by_uids([], DiffSyncModel) == []
72+
with pytest.raises(ObjectNotFound):
73+
generic_diffsync.get_by_uids(["any", "another"], "anything")
74+
with pytest.raises(ObjectNotFound):
75+
generic_diffsync.get_by_uids(["any", "another"], DiffSyncModel)
7276

7377

7478
def test_diffsync_add(generic_diffsync, generic_diffsync_model):
@@ -104,9 +108,11 @@ def test_diffsync_get_by_uids_with_generic_model(generic_diffsync, generic_diffs
104108
assert generic_diffsync.get_by_uids([""], DiffSyncModel) == [generic_diffsync_model]
105109
assert generic_diffsync.get_by_uids([""], DiffSyncModel.get_type()) == [generic_diffsync_model]
106110
# Wrong unique-id - no match
107-
assert generic_diffsync.get_by_uids(["myname"], DiffSyncModel) == []
108-
# Valid unique-id mixed in with unknown ones - return the successful matches?
109-
assert generic_diffsync.get_by_uids(["aname", "", "anothername"], DiffSyncModel) == [generic_diffsync_model]
111+
with pytest.raises(ObjectNotFound):
112+
generic_diffsync.get_by_uids(["myname"], DiffSyncModel)
113+
# Valid unique-id mixed in with unknown ones
114+
with pytest.raises(ObjectNotFound):
115+
generic_diffsync.get_by_uids(["aname", "", "anothername"], DiffSyncModel)
110116

111117

112118
def test_diffsync_remove_with_generic_model(generic_diffsync, generic_diffsync_model):
@@ -117,7 +123,8 @@ def test_diffsync_remove_with_generic_model(generic_diffsync, generic_diffsync_m
117123

118124
assert generic_diffsync.get(DiffSyncModel, "") is None
119125
assert list(generic_diffsync.get_all(DiffSyncModel)) == []
120-
assert generic_diffsync.get_by_uids([""], DiffSyncModel) == []
126+
with pytest.raises(ObjectNotFound):
127+
generic_diffsync.get_by_uids([""], DiffSyncModel)
121128

122129

123130
def test_diffsync_subclass_validation():
@@ -317,8 +324,10 @@ def test_diffsync_sync_from(backend_a, backend_b):
317324

318325
assert backend_a.get_by_uids(["nyc", "sfo"], Site) == [site_nyc_a, site_sfo_a]
319326
assert backend_a.get_by_uids(["sfo", "nyc"], "site") == [site_sfo_a, site_nyc_a]
320-
assert backend_a.get_by_uids(["nyc", "sfo"], Device) == []
321-
assert backend_a.get_by_uids(["nyc", "sfo"], "device") == []
327+
with pytest.raises(ObjectNotFound):
328+
backend_a.get_by_uids(["nyc", "sfo"], Device)
329+
with pytest.raises(ObjectNotFound):
330+
backend_a.get_by_uids(["nyc", "sfo"], "device")
322331

323332

324333
def test_diffsync_subclass_default_name_type(backend_a):

0 commit comments

Comments
 (0)