diff --git a/meshroom/common/core.py b/meshroom/common/core.py index 766480e6..e9e20579 100644 --- a/meshroom/common/core.py +++ b/meshroom/common/core.py @@ -9,6 +9,9 @@ class CoreDictModel: def __len__(self): return len(self._objects) + def __bool__(self): + return bool(self._objects) + def __iter__(self): """ Enables iteration over the list of objects. """ return iter(self._objects.values()) @@ -26,12 +29,18 @@ class CoreDictModel: def objects(self): return self._objects - # TODO: operator[] def get(self, key): """ - Raises a KeyError if key is not in the map. :param key: - :return: + :return: the value or None if not found + """ + return self._objects.get(key) + + def getr(self, key): + """ + Get or raise an error if the key does not exists. + :param key: + :return: the value """ return self._objects[key] diff --git a/meshroom/common/qt.py b/meshroom/common/qt.py index 8b6e324a..26f51270 100644 --- a/meshroom/common/qt.py +++ b/meshroom/common/qt.py @@ -43,7 +43,9 @@ class QObjectListModel(QtCore.QAbstractListModel): return self.size() > 0 def __getitem__(self, index): - """ Enables the [] operator """ + """ Enables the [] operator. + Only accepts index (integer). + """ return self._objects[index] def data(self, index, role): @@ -96,9 +98,17 @@ class QObjectListModel(QtCore.QAbstractListModel): @QtCore.Slot(str, result=QtCore.QObject) def get(self, key): """ - Raises a KeyError if key is not in the map. :param key: - :return: + :return: the value or None if not found + """ + return self._objectByKey.get(key) + + @QtCore.Slot(str, result=QtCore.QObject) + def getr(self, key): + """ + Get or raise an error if the key does not exists. + :param key: + :return: the value """ return self._objectByKey[key] diff --git a/meshroom/core/node.py b/meshroom/core/node.py index aceee3f7..ac4cc788 100644 --- a/meshroom/core/node.py +++ b/meshroom/core/node.py @@ -608,7 +608,7 @@ class BaseNode(BaseObject): assert isinstance(att, ListAttribute) att = att.value.at(int(idx)) else: - att = self._attributes.get(name) + att = self._attributes.getr(name) return att @Slot(str, result=Attribute) diff --git a/tests/test_model.py b/tests/test_model.py index 6c6c784a..18492123 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -18,26 +18,24 @@ class DummyNode(QObject): name = Property(str, getName) -def test_coreModel_add_remove(): - m = CoreDictModel(keyAttrName='name') - node = DummyNode("DummyNode_1") - m.add(node) - assert len(m) == 1 - assert m.get("DummyNode_1") == node +def test_DictModel_add_remove(): + for DictModel in (CoreDictModel, QObjectListModel): + m = DictModel(keyAttrName='name') + node = DummyNode("DummyNode_1") + m.add(node) + assert len(m) == 1 + assert len(m.keys()) == 1 + assert len(m.values()) == 1 + assert m.get("DummyNode_1") == node - m.pop("DummyNode_1") - assert len(m) == 0 + assert m.get("something") == None + with pytest.raises(KeyError): + m.getr("something") - -def test_listModel_add_remove(): - m = QObjectListModel(keyAttrName='name') - node = DummyNode("DummyNode_1") - m.add(node) - assert len(m) == 1 - assert m.get("DummyNode_1") == node - - m.remove(node) - assert len(m) == 0 + m.pop("DummyNode_1") + assert len(m) == 0 + assert len(m.keys()) == 0 + assert len(m.values()) == 0 def test_listModel_typed_add():