Skip to content

Commit c87d7de

Browse files
committed
fix: correctly handle dataset IDs and names in DBExtract
1 parent 7b256b6 commit c87d7de

3 files changed

Lines changed: 57 additions & 17 deletions

File tree

CHANGELOG

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
0.17.4
2+
- fix: correctly handle dataset IDs and names in `DBExtract`
23
- ref: decorate PyQtSlots
34
0.17.3
45
- fix: drag'n'drop to DCscope broken since 0.17.0 (#88)

dcoraid/dbmodel/extract.py

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -38,32 +38,28 @@ def __contains__(self, item):
3838
The dataset dictionary or the name or the id of the dataset
3939
"""
4040
if isinstance(item, dict):
41-
id_name = item["id"]
41+
name_or_id = item["id"]
4242
else:
43-
id_name = item
44-
if len(id_name) == 36: # minor optimization
45-
# we probably have a UUID
46-
return id_name in self.registry_id or id_name in self.registry
47-
else:
48-
return id_name in self.registry
43+
name_or_id = item
44+
return name_or_id in self.registry_id or name_or_id in self.registry
4945

50-
def __getitem__(self, idx_or_name):
51-
if isinstance(idx_or_name, numbers.Integral):
52-
return self.datasets[idx_or_name]
46+
def __getitem__(self, idx_or_name_or_id):
47+
if isinstance(idx_or_name_or_id, numbers.Integral):
48+
return self.datasets[idx_or_name_or_id]
5349
else:
54-
return self.get_dataset_dict(idx_or_name)
50+
return self.get_dataset_dict(idx_or_name_or_id)
5551

5652
def __len__(self):
5753
return len(self.datasets)
5854

5955
def __iter__(self):
6056
return iter(self.datasets)
6157

62-
def add_datasets(self, datasets):
58+
def add_datasets(self, datasets: list[dict]):
6359
for dd in datasets:
64-
name = dd["name"]
65-
if name not in self.registry: # datasets must only be added once
66-
self.registry[name] = dd
60+
if dd not in self: # dataset must only be added once
61+
self.registry_id[dd["id"]] = dd
62+
self.registry[dd["name"]] = dd
6763
self.datasets.append(dd)
6864

6965
@property
@@ -97,5 +93,10 @@ def collections(self):
9793
coll_list, key=lambda x: x.get("title") or x["name"])
9894
return self._collections
9995

100-
def get_dataset_dict(self, dataset_name):
101-
return self.registry[dataset_name]
96+
def get_dataset_dict(self, name_or_id):
97+
if name_or_id in self.registry:
98+
return self.registry[name_or_id]
99+
elif name_or_id in self.registry_id:
100+
return self.registry_id[name_or_id]
101+
else:
102+
raise KeyError(f"Could not find name or id '{name_or_id}")

tests/test_dbmodel_extract.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from dcoraid.dbmodel import DBExtract
2+
3+
4+
def test_dbmodel_add_same():
5+
de = DBExtract()
6+
de.add_datasets([{"name": "peter", "id": "hans"}])
7+
assert len(de) == 1
8+
de.add_datasets([{"name": "peter", "id": "hans"}])
9+
assert len(de) == 1
10+
11+
12+
def test_dbmodel_contains():
13+
de = DBExtract()
14+
de.add_datasets([{"name": "peter", "id": "hans"}])
15+
assert "peter" in de
16+
assert "hans" in de
17+
assert {"name": "peter", "id": "hans"} in de
18+
19+
20+
def test_dbmodel_get_dataset_dict():
21+
de = DBExtract()
22+
de.add_datasets([{"name": "peter", "id": "hans"}])
23+
24+
assert de.get_dataset_dict("peter") == {"name": "peter", "id": "hans"}
25+
assert de.get_dataset_dict("hans") == {"name": "peter", "id": "hans"}
26+
27+
28+
def test_dbmodel_get_item():
29+
de = DBExtract()
30+
de.add_datasets([{"name": "peter", "id": "hans"}])
31+
de.add_datasets([{"name": "flink", "id": "flank"}])
32+
33+
assert de["flink"] == {"name": "flink", "id": "flank"}
34+
assert de["flank"] == {"name": "flink", "id": "flank"}
35+
assert de["hans"] == {"name": "peter", "id": "hans"}
36+
assert de["peter"] == {"name": "peter", "id": "hans"}
37+
assert de[0] == {"name": "peter", "id": "hans"}
38+
assert de[1] == {"name": "flink", "id": "flank"}

0 commit comments

Comments
 (0)