diff options
Diffstat (limited to 'silx/gui/hdf5')
-rw-r--r-- | silx/gui/hdf5/Hdf5Item.py | 41 | ||||
-rw-r--r-- | silx/gui/hdf5/Hdf5LoadingItem.py | 11 | ||||
-rw-r--r-- | silx/gui/hdf5/Hdf5Node.py | 9 | ||||
-rw-r--r-- | silx/gui/hdf5/Hdf5TreeModel.py | 15 | ||||
-rw-r--r-- | silx/gui/hdf5/NexusSortFilterProxyModel.py | 20 | ||||
-rw-r--r-- | silx/gui/hdf5/_utils.py | 11 | ||||
-rw-r--r-- | silx/gui/hdf5/test/test_hdf5.py | 122 |
7 files changed, 155 insertions, 74 deletions
diff --git a/silx/gui/hdf5/Hdf5Item.py b/silx/gui/hdf5/Hdf5Item.py index 9804907..b3c313e 100644 --- a/silx/gui/hdf5/Hdf5Item.py +++ b/silx/gui/hdf5/Hdf5Item.py @@ -1,7 +1,7 @@ # coding: utf-8 # /*########################################################################## # -# Copyright (c) 2016-2017 European Synchrotron Radiation Facility +# Copyright (c) 2016-2018 European Synchrotron Radiation Facility # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -25,7 +25,7 @@ __authors__ = ["V. Valls"] __license__ = "MIT" -__date__ = "10/10/2017" +__date__ = "03/09/2018" import logging @@ -37,9 +37,8 @@ from .Hdf5Node import Hdf5Node import silx.io.utils from silx.gui.data.TextFormatter import TextFormatter from ..hdf5.Hdf5Formatter import Hdf5Formatter - +from ...third_party import six _logger = logging.getLogger(__name__) - _formatter = TextFormatter() _hdf5Formatter = Hdf5Formatter(textFormatter=_formatter) # FIXME: The formatter should be an attribute of the Hdf5Model @@ -63,8 +62,16 @@ class Hdf5Item(Hdf5Node): self.__error = None self.__text = text self.__linkClass = linkClass + self.__nx_class = None Hdf5Node.__init__(self, parent, populateAll=populateAll) + def _getCanonicalName(self): + parent = self.parent + if parent is None: + return self.__text + else: + return "%s/%s" % (parent._getCanonicalName(), self.__text) + @property def obj(self): if self.__key: @@ -152,8 +159,7 @@ class Hdf5Item(Hdf5Node): try: obj = parent_obj.get(self.__key) except Exception as e: - lib_name = self.obj.__class__.__module__.split(".")[0] - _logger.debug("Internal %s error", lib_name, exc_info=True) + _logger.error("Internal error while reaching HDF5 object: %s", str(e)) _logger.debug("Backtrace", exc_info=True) try: self.__obj = parent_obj.get(self.__key, getlink=True) @@ -184,7 +190,7 @@ class Hdf5Item(Hdf5Node): elif class_ == silx.io.utils.H5Type.SOFT_LINK: message = "Soft link broken. Path %s does not exist" % (self.__obj.path) else: - name = self.obj.__class__.__name__.split(".")[-1].capitalize() + name = self.__obj.__class__.__name__.split(".")[-1].capitalize() message = "%s broken" % (name) self.__error = message self.__isBroken = True @@ -293,6 +299,8 @@ class Hdf5Item(Hdf5Node): attributeDict["Data type"] = self._getFormatter().humanReadableType(self.obj, full=True) elif self.h5Class == silx.io.utils.H5Type.GROUP: attributeDict["#Title"] = "HDF5 Group" + if self.nexusClassName: + attributeDict["NX_class"] = self.nexusClassName attributeDict["Name"] = self.basename attributeDict["Path"] = self.obj.name elif self.h5Class == silx.io.utils.H5Type.FILE: @@ -332,6 +340,20 @@ class Hdf5Item(Hdf5Node): return tooltip + @property + def nexusClassName(self): + """Returns the Nexus class name""" + if self.__nx_class is None: + self.__nx_class = self.obj.attrs.get("NX_class", None) + if self.__nx_class is None: + self.__nx_class = "" + else: + if six.PY2: + self.__nx_class = self.__nx_class.decode() + elif not isinstance(self.__nx_class, str): + self.__nx_class = str(self.__nx_class, "UTF-8") + return self.__nx_class + def dataName(self, role): """Data for the name column""" if role == qt.Qt.TextAlignmentRole: @@ -354,12 +376,13 @@ class Hdf5Item(Hdf5Node): if self.__error is not None: return "" class_ = self.h5Class - if class_ == silx.io.utils.H5Type.DATASET: + if self.isGroupObj(): + text = self.nexusClassName + elif class_ == silx.io.utils.H5Type.DATASET: text = self._getFormatter().humanReadableType(self.obj) else: text = "" return text - return None def dataShape(self, role): diff --git a/silx/gui/hdf5/Hdf5LoadingItem.py b/silx/gui/hdf5/Hdf5LoadingItem.py index 4467366..f11d252 100644 --- a/silx/gui/hdf5/Hdf5LoadingItem.py +++ b/silx/gui/hdf5/Hdf5LoadingItem.py @@ -25,11 +25,12 @@ __authors__ = ["V. Valls"] __license__ = "MIT" -__date__ = "23/09/2016" +__date__ = "06/07/2018" from .. import qt from .Hdf5Node import Hdf5Node +import silx.io.utils class Hdf5LoadingItem(Hdf5Node): @@ -49,6 +50,14 @@ class Hdf5LoadingItem(Hdf5Node): def obj(self): return None + @property + def h5Class(self): + """Returns the class of the stored object. + + :rtype: silx.io.utils.H5Type + """ + return silx.io.utils.H5Type.FILE + def dataName(self, role): if role == qt.Qt.DecorationRole: return self.__animatedIcon.currentIcon() diff --git a/silx/gui/hdf5/Hdf5Node.py b/silx/gui/hdf5/Hdf5Node.py index 0fcb407..be16535 100644 --- a/silx/gui/hdf5/Hdf5Node.py +++ b/silx/gui/hdf5/Hdf5Node.py @@ -25,7 +25,7 @@ __authors__ = ["V. Valls"] __license__ = "MIT" -__date__ = "16/06/2017" +__date__ = "24/07/2018" import weakref @@ -52,6 +52,13 @@ class Hdf5Node(object): self.__child = [] self._populateChild(populateAll=True) + def _getCanonicalName(self): + parent = self.parent + if parent is None: + return "root" + else: + return "%s/?" % (parent._getCanonicalName()) + @property def parent(self): """Parent of the node, or None if the node is a root diff --git a/silx/gui/hdf5/Hdf5TreeModel.py b/silx/gui/hdf5/Hdf5TreeModel.py index 835708a..438200b 100644 --- a/silx/gui/hdf5/Hdf5TreeModel.py +++ b/silx/gui/hdf5/Hdf5TreeModel.py @@ -25,7 +25,7 @@ __authors__ = ["V. Valls"] __license__ = "MIT" -__date__ = "11/06/2018" +__date__ = "08/10/2018" import os @@ -591,6 +591,13 @@ class Hdf5TreeModel(qt.QAbstractItemModel): filename = node.obj.filename self.insertFileAsync(filename, index.row(), synchronizingNode=node) + def h5pyObjectRow(self, h5pyObject): + for row in range(self.__root.childCount()): + item = self.__root.child(row) + if item.obj == h5pyObject: + return row + return -1 + def synchronizeH5pyObject(self, h5pyObject): """ Synchronize a h5py object in all the tree. @@ -602,7 +609,7 @@ class Hdf5TreeModel(qt.QAbstractItemModel): index = 0 while index < self.__root.childCount(): item = self.__root.child(index) - if item.obj is h5pyObject: + if item.obj == h5pyObject: qindex = self.index(index, 0, qt.QModelIndex()) self.synchronizeIndex(qindex) index += 1 @@ -614,7 +621,7 @@ class Hdf5TreeModel(qt.QAbstractItemModel): :param qt.QModelIndex index: Index of the item to remove """ node = self.nodeFromIndex(index) - if node.parent is not self.__root: + if node.parent != self.__root: return self._closeFileIfOwned(node) self.beginRemoveRows(qt.QModelIndex(), index.row(), index.row()) @@ -632,7 +639,7 @@ class Hdf5TreeModel(qt.QAbstractItemModel): index = 0 while index < self.__root.childCount(): item = self.__root.child(index) - if item.obj is h5pyObject: + if item.obj == h5pyObject: qindex = self.index(index, 0, qt.QModelIndex()) self.removeIndex(qindex) else: diff --git a/silx/gui/hdf5/NexusSortFilterProxyModel.py b/silx/gui/hdf5/NexusSortFilterProxyModel.py index 3f2cf8d..216e992 100644 --- a/silx/gui/hdf5/NexusSortFilterProxyModel.py +++ b/silx/gui/hdf5/NexusSortFilterProxyModel.py @@ -25,7 +25,7 @@ __authors__ = ["V. Valls"] __license__ = "MIT" -__date__ = "25/06/2018" +__date__ = "24/07/2018" import logging @@ -48,6 +48,24 @@ class NexusSortFilterProxyModel(qt.QSortFilterProxyModel): self.__split = re.compile("(\\d+|\\D+)") self.__iconCache = {} + def hasChildren(self, parent): + """Returns true if parent has any children; otherwise returns false. + + :param qt.QModelIndex parent: Index of the item to check + :rtype: bool + """ + parent = self.mapToSource(parent) + return self.sourceModel().hasChildren(parent) + + def rowCount(self, parent): + """Returns the number of rows under the given parent. + + :param qt.QModelIndex parent: Index of the item to check + :rtype: int + """ + parent = self.mapToSource(parent) + return self.sourceModel().rowCount(parent) + def lessThan(self, sourceLeft, sourceRight): """Returns True if the value of the item referred to by the given index `sourceLeft` is less than the value of the item referred to by diff --git a/silx/gui/hdf5/_utils.py b/silx/gui/hdf5/_utils.py index 8385129..6a34933 100644 --- a/silx/gui/hdf5/_utils.py +++ b/silx/gui/hdf5/_utils.py @@ -178,10 +178,11 @@ class H5Node(object): elif obj.name.startswith("/"): elements.pop(0) path = "" + subpath = "" while len(elements) > 0: e = elements.pop(0) - path = path + "/" + e - link = obj.parent.get(path, getlink=True) + subpath = path + "/" + e + link = obj.parent.get(subpath, getlink=True) classlink = silx.io.utils.get_h5_class(link) if classlink == silx.io.utils.H5Type.EXTERNAL_LINK: @@ -190,14 +191,18 @@ class H5Node(object): return self.__get_target(external_obj) elif classlink == silx.io.utils.H5Type.SOFT_LINK: # Restart from this stat - path = "" root_elements = link.path.split("/") if link.path == "/": + path = "" root_elements = [] elif link.path.startswith("/"): + path = "" root_elements.pop(0) + for name in reversed(root_elements): elements.insert(0, name) + else: + path = subpath return obj.file[path] diff --git a/silx/gui/hdf5/test/test_hdf5.py b/silx/gui/hdf5/test/test_hdf5.py index fc27f6b..1751a21 100644 --- a/silx/gui/hdf5/test/test_hdf5.py +++ b/silx/gui/hdf5/test/test_hdf5.py @@ -37,9 +37,9 @@ import numpy import shutil from contextlib import contextmanager from silx.gui import qt -from silx.gui.test.utils import TestCaseQt +from silx.gui.utils.testutils import TestCaseQt from silx.gui import hdf5 -from silx.gui.test.utils import SignalListener +from silx.gui.utils.testutils import SignalListener from silx.io import commonh5 import weakref @@ -123,9 +123,9 @@ class TestHdf5TreeModel(TestCaseQt): def testAppendFilename(self): filename = _tmpDirectory + "/data.h5" model = hdf5.Hdf5TreeModel() - self.assertEquals(model.rowCount(qt.QModelIndex()), 0) + self.assertEqual(model.rowCount(qt.QModelIndex()), 0) model.appendFile(filename) - self.assertEquals(model.rowCount(qt.QModelIndex()), 1) + self.assertEqual(model.rowCount(qt.QModelIndex()), 1) # clean up index = model.index(0, 0, qt.QModelIndex()) h5File = model.data(index, hdf5.Hdf5TreeModel.H5PY_OBJECT_ROLE) @@ -141,9 +141,9 @@ class TestHdf5TreeModel(TestCaseQt): filename = _tmpDirectory + "/data.h5" try: model = hdf5.Hdf5TreeModel() - self.assertEquals(model.rowCount(qt.QModelIndex()), 0) + self.assertEqual(model.rowCount(qt.QModelIndex()), 0) model.insertFile(filename) - self.assertEquals(model.rowCount(qt.QModelIndex()), 1) + self.assertEqual(model.rowCount(qt.QModelIndex()), 1) # clean up index = model.index(0, 0, qt.QModelIndex()) h5File = model.data(index, hdf5.Hdf5TreeModel.H5PY_OBJECT_ROLE) @@ -157,7 +157,7 @@ class TestHdf5TreeModel(TestCaseQt): filename = _tmpDirectory + "/data.h5" try: model = hdf5.Hdf5TreeModel() - self.assertEquals(model.rowCount(qt.QModelIndex()), 0) + self.assertEqual(model.rowCount(qt.QModelIndex()), 0) model.insertFileAsync(filename) index = model.index(0, 0, qt.QModelIndex()) self.assertIsInstance(model.nodeFromIndex(index), hdf5.Hdf5LoadingItem.Hdf5LoadingItem) @@ -172,25 +172,25 @@ class TestHdf5TreeModel(TestCaseQt): def testInsertObject(self): h5 = commonh5.File("/foo/bar/1.mock", "w") model = hdf5.Hdf5TreeModel() - self.assertEquals(model.rowCount(qt.QModelIndex()), 0) + self.assertEqual(model.rowCount(qt.QModelIndex()), 0) model.insertH5pyObject(h5) - self.assertEquals(model.rowCount(qt.QModelIndex()), 1) + self.assertEqual(model.rowCount(qt.QModelIndex()), 1) def testRemoveObject(self): h5 = commonh5.File("/foo/bar/1.mock", "w") model = hdf5.Hdf5TreeModel() - self.assertEquals(model.rowCount(qt.QModelIndex()), 0) + self.assertEqual(model.rowCount(qt.QModelIndex()), 0) model.insertH5pyObject(h5) - self.assertEquals(model.rowCount(qt.QModelIndex()), 1) + self.assertEqual(model.rowCount(qt.QModelIndex()), 1) model.removeH5pyObject(h5) - self.assertEquals(model.rowCount(qt.QModelIndex()), 0) + self.assertEqual(model.rowCount(qt.QModelIndex()), 0) def testSynchronizeObject(self): filename = _tmpDirectory + "/data.h5" h5 = h5py.File(filename) model = hdf5.Hdf5TreeModel() model.insertH5pyObject(h5) - self.assertEquals(model.rowCount(qt.QModelIndex()), 1) + self.assertEqual(model.rowCount(qt.QModelIndex()), 1) index = model.index(0, 0, qt.QModelIndex()) node1 = model.nodeFromIndex(index) model.synchronizeH5pyObject(h5) @@ -220,15 +220,15 @@ class TestHdf5TreeModel(TestCaseQt): def testFileMoveState(self): model = hdf5.Hdf5TreeModel() - self.assertEquals(model.isFileMoveEnabled(), True) + self.assertEqual(model.isFileMoveEnabled(), True) model.setFileMoveEnabled(False) - self.assertEquals(model.isFileMoveEnabled(), False) + self.assertEqual(model.isFileMoveEnabled(), False) def testFileDropState(self): model = hdf5.Hdf5TreeModel() - self.assertEquals(model.isFileDropEnabled(), True) + self.assertEqual(model.isFileDropEnabled(), True) model.setFileDropEnabled(False) - self.assertEquals(model.isFileDropEnabled(), False) + self.assertEqual(model.isFileDropEnabled(), False) def testSupportedDrop(self): model = hdf5.Hdf5TreeModel() @@ -236,7 +236,7 @@ class TestHdf5TreeModel(TestCaseQt): model.setFileMoveEnabled(False) model.setFileDropEnabled(False) - self.assertEquals(model.supportedDropActions(), 0) + self.assertEqual(model.supportedDropActions(), 0) model.setFileMoveEnabled(False) model.setFileDropEnabled(True) @@ -252,7 +252,7 @@ class TestHdf5TreeModel(TestCaseQt): mimeData = qt.QMimeData() mimeData.setUrls([qt.QUrl.fromLocalFile(filename)]) model.dropMimeData(mimeData, qt.Qt.CopyAction, 0, 0, qt.QModelIndex()) - self.assertEquals(model.rowCount(qt.QModelIndex()), 1) + self.assertEqual(model.rowCount(qt.QModelIndex()), 1) # after sync self.waitForPendingOperations(model) index = model.index(0, 0, qt.QModelIndex()) @@ -285,13 +285,13 @@ class TestHdf5TreeModel(TestCaseQt): model = hdf5.Hdf5TreeModel() model.insertH5pyObject(h5) displayed = self.getRowDataAsDict(model, row=0) - self.assertEquals(displayed[hdf5.Hdf5TreeModel.NAME_COLUMN, qt.Qt.DisplayRole], "1.mock") + self.assertEqual(displayed[hdf5.Hdf5TreeModel.NAME_COLUMN, qt.Qt.DisplayRole], "1.mock") self.assertIsInstance(displayed[hdf5.Hdf5TreeModel.NAME_COLUMN, qt.Qt.DecorationRole], qt.QIcon) - self.assertEquals(displayed[hdf5.Hdf5TreeModel.TYPE_COLUMN, qt.Qt.DisplayRole], "") - self.assertEquals(displayed[hdf5.Hdf5TreeModel.SHAPE_COLUMN, qt.Qt.DisplayRole], "") - self.assertEquals(displayed[hdf5.Hdf5TreeModel.VALUE_COLUMN, qt.Qt.DisplayRole], "") - self.assertEquals(displayed[hdf5.Hdf5TreeModel.DESCRIPTION_COLUMN, qt.Qt.DisplayRole], "") - self.assertEquals(displayed[hdf5.Hdf5TreeModel.NODE_COLUMN, qt.Qt.DisplayRole], "File") + self.assertEqual(displayed[hdf5.Hdf5TreeModel.TYPE_COLUMN, qt.Qt.DisplayRole], "") + self.assertEqual(displayed[hdf5.Hdf5TreeModel.SHAPE_COLUMN, qt.Qt.DisplayRole], "") + self.assertEqual(displayed[hdf5.Hdf5TreeModel.VALUE_COLUMN, qt.Qt.DisplayRole], "") + self.assertEqual(displayed[hdf5.Hdf5TreeModel.DESCRIPTION_COLUMN, qt.Qt.DisplayRole], "") + self.assertEqual(displayed[hdf5.Hdf5TreeModel.NODE_COLUMN, qt.Qt.DisplayRole], "File") def testGroupData(self): h5 = commonh5.File("/foo/bar/1.mock", "w") @@ -301,13 +301,13 @@ class TestHdf5TreeModel(TestCaseQt): model = hdf5.Hdf5TreeModel() model.insertH5pyObject(d) displayed = self.getRowDataAsDict(model, row=0) - self.assertEquals(displayed[hdf5.Hdf5TreeModel.NAME_COLUMN, qt.Qt.DisplayRole], "1.mock::foo") + self.assertEqual(displayed[hdf5.Hdf5TreeModel.NAME_COLUMN, qt.Qt.DisplayRole], "1.mock::foo") self.assertIsInstance(displayed[hdf5.Hdf5TreeModel.NAME_COLUMN, qt.Qt.DecorationRole], qt.QIcon) - self.assertEquals(displayed[hdf5.Hdf5TreeModel.TYPE_COLUMN, qt.Qt.DisplayRole], "") - self.assertEquals(displayed[hdf5.Hdf5TreeModel.SHAPE_COLUMN, qt.Qt.DisplayRole], "") - self.assertEquals(displayed[hdf5.Hdf5TreeModel.VALUE_COLUMN, qt.Qt.DisplayRole], "") - self.assertEquals(displayed[hdf5.Hdf5TreeModel.DESCRIPTION_COLUMN, qt.Qt.DisplayRole], "fooo") - self.assertEquals(displayed[hdf5.Hdf5TreeModel.NODE_COLUMN, qt.Qt.DisplayRole], "Group") + self.assertEqual(displayed[hdf5.Hdf5TreeModel.TYPE_COLUMN, qt.Qt.DisplayRole], "") + self.assertEqual(displayed[hdf5.Hdf5TreeModel.SHAPE_COLUMN, qt.Qt.DisplayRole], "") + self.assertEqual(displayed[hdf5.Hdf5TreeModel.VALUE_COLUMN, qt.Qt.DisplayRole], "") + self.assertEqual(displayed[hdf5.Hdf5TreeModel.DESCRIPTION_COLUMN, qt.Qt.DisplayRole], "fooo") + self.assertEqual(displayed[hdf5.Hdf5TreeModel.NODE_COLUMN, qt.Qt.DisplayRole], "Group") def testDatasetData(self): h5 = commonh5.File("/foo/bar/1.mock", "w") @@ -317,13 +317,13 @@ class TestHdf5TreeModel(TestCaseQt): model = hdf5.Hdf5TreeModel() model.insertH5pyObject(d) displayed = self.getRowDataAsDict(model, row=0) - self.assertEquals(displayed[hdf5.Hdf5TreeModel.NAME_COLUMN, qt.Qt.DisplayRole], "1.mock::foo") + self.assertEqual(displayed[hdf5.Hdf5TreeModel.NAME_COLUMN, qt.Qt.DisplayRole], "1.mock::foo") self.assertIsInstance(displayed[hdf5.Hdf5TreeModel.NAME_COLUMN, qt.Qt.DecorationRole], qt.QIcon) - self.assertEquals(displayed[hdf5.Hdf5TreeModel.TYPE_COLUMN, qt.Qt.DisplayRole], value.dtype.name) - self.assertEquals(displayed[hdf5.Hdf5TreeModel.SHAPE_COLUMN, qt.Qt.DisplayRole], "3") - self.assertEquals(displayed[hdf5.Hdf5TreeModel.VALUE_COLUMN, qt.Qt.DisplayRole], "[1 2 3]") - self.assertEquals(displayed[hdf5.Hdf5TreeModel.DESCRIPTION_COLUMN, qt.Qt.DisplayRole], "") - self.assertEquals(displayed[hdf5.Hdf5TreeModel.NODE_COLUMN, qt.Qt.DisplayRole], "Dataset") + self.assertEqual(displayed[hdf5.Hdf5TreeModel.TYPE_COLUMN, qt.Qt.DisplayRole], value.dtype.name) + self.assertEqual(displayed[hdf5.Hdf5TreeModel.SHAPE_COLUMN, qt.Qt.DisplayRole], "3") + self.assertEqual(displayed[hdf5.Hdf5TreeModel.VALUE_COLUMN, qt.Qt.DisplayRole], "[1 2 3]") + self.assertEqual(displayed[hdf5.Hdf5TreeModel.DESCRIPTION_COLUMN, qt.Qt.DisplayRole], "") + self.assertEqual(displayed[hdf5.Hdf5TreeModel.NODE_COLUMN, qt.Qt.DisplayRole], "Dataset") def testDropLastAsFirst(self): model = hdf5.Hdf5TreeModel() @@ -331,13 +331,13 @@ class TestHdf5TreeModel(TestCaseQt): h5_2 = commonh5.File("/foo/bar/2.mock", "w") model.insertH5pyObject(h5_1) model.insertH5pyObject(h5_2) - self.assertEquals(self.getItemName(model, 0), "1.mock") - self.assertEquals(self.getItemName(model, 1), "2.mock") + self.assertEqual(self.getItemName(model, 0), "1.mock") + self.assertEqual(self.getItemName(model, 1), "2.mock") index = model.index(1, 0, qt.QModelIndex()) mimeData = model.mimeData([index]) model.dropMimeData(mimeData, qt.Qt.MoveAction, 0, 0, qt.QModelIndex()) - self.assertEquals(self.getItemName(model, 0), "2.mock") - self.assertEquals(self.getItemName(model, 1), "1.mock") + self.assertEqual(self.getItemName(model, 0), "2.mock") + self.assertEqual(self.getItemName(model, 1), "1.mock") def testDropFirstAsLast(self): model = hdf5.Hdf5TreeModel() @@ -345,13 +345,13 @@ class TestHdf5TreeModel(TestCaseQt): h5_2 = commonh5.File("/foo/bar/2.mock", "w") model.insertH5pyObject(h5_1) model.insertH5pyObject(h5_2) - self.assertEquals(self.getItemName(model, 0), "1.mock") - self.assertEquals(self.getItemName(model, 1), "2.mock") + self.assertEqual(self.getItemName(model, 0), "1.mock") + self.assertEqual(self.getItemName(model, 1), "2.mock") index = model.index(0, 0, qt.QModelIndex()) mimeData = model.mimeData([index]) model.dropMimeData(mimeData, qt.Qt.MoveAction, 2, 0, qt.QModelIndex()) - self.assertEquals(self.getItemName(model, 0), "2.mock") - self.assertEquals(self.getItemName(model, 1), "1.mock") + self.assertEqual(self.getItemName(model, 0), "2.mock") + self.assertEqual(self.getItemName(model, 1), "1.mock") def testRootParent(self): model = hdf5.Hdf5TreeModel() @@ -359,7 +359,7 @@ class TestHdf5TreeModel(TestCaseQt): model.insertH5pyObject(h5_1) index = model.index(0, 0, qt.QModelIndex()) index = model.parent(index) - self.assertEquals(index, qt.QModelIndex()) + self.assertEqual(index, qt.QModelIndex()) class TestHdf5TreeModelSignals(TestCaseQt): @@ -397,27 +397,27 @@ class TestHdf5TreeModelSignals(TestCaseQt): filename = _tmpDirectory + "/data.h5" h5 = h5py.File(filename) self.model.insertH5pyObject(h5) - self.assertEquals(self.listener.callCount(), 0) + self.assertEqual(self.listener.callCount(), 0) def testLoaded(self): filename = _tmpDirectory + "/data.h5" self.model.insertFile(filename) - self.assertEquals(self.listener.callCount(), 1) - self.assertEquals(self.listener.karguments(argumentName="signal")[0], "loaded") + self.assertEqual(self.listener.callCount(), 1) + self.assertEqual(self.listener.karguments(argumentName="signal")[0], "loaded") self.assertIsNot(self.listener.arguments(callIndex=0)[0], self.h5) - self.assertEquals(self.listener.arguments(callIndex=0)[0].filename, filename) + self.assertEqual(self.listener.arguments(callIndex=0)[0].filename, filename) def testRemoved(self): self.model.removeH5pyObject(self.h5) - self.assertEquals(self.listener.callCount(), 1) - self.assertEquals(self.listener.karguments(argumentName="signal")[0], "removed") + self.assertEqual(self.listener.callCount(), 1) + self.assertEqual(self.listener.karguments(argumentName="signal")[0], "removed") self.assertIs(self.listener.arguments(callIndex=0)[0], self.h5) def testSynchonized(self): self.model.synchronizeH5pyObject(self.h5) self.waitForPendingOperations(self.model) - self.assertEquals(self.listener.callCount(), 1) - self.assertEquals(self.listener.karguments(argumentName="signal")[0], "synchronized") + self.assertEqual(self.listener.callCount(), 1) + self.assertEqual(self.listener.karguments(argumentName="signal")[0], "synchronized") self.assertIs(self.listener.arguments(callIndex=0)[0], self.h5) self.assertIsNot(self.listener.arguments(callIndex=0)[1], self.h5) @@ -595,6 +595,7 @@ class TestH5Node(TestCaseQt): h5["link/soft_link_to_group"] = h5py.SoftLink("/group") h5["link/soft_link_to_link"] = h5py.SoftLink("/link/soft_link") h5["link/soft_link_to_file"] = h5py.SoftLink("/") + h5["group/soft_link_relative"] = h5py.SoftLink("dataset") h5["link/external_link"] = h5py.ExternalLink(externalFilename, "/target/dataset") h5["link/external_link_to_link"] = h5py.ExternalLink(externalFilename, "/target/link") h5["broken_link/external_broken_file"] = h5py.ExternalLink(externalFilename + "_not_exists", "/target/link") @@ -697,6 +698,17 @@ class TestH5Node(TestCaseQt): self.assertEqual(h5node.local_basename, "soft_link_to_link") self.assertEqual(h5node.local_name, "/link/soft_link_to_link") + def testSoftLinkRelative(self): + path = ["base.h5", "group", "soft_link_relative"] + h5node = self.getH5NodeFromPath(self.model, path) + + self.assertEqual(h5node.physical_filename, h5node.local_filename) + self.assertIn("base.h5", h5node.physical_filename) + self.assertEqual(h5node.physical_basename, "dataset") + self.assertEqual(h5node.physical_name, "/group/dataset") + self.assertEqual(h5node.local_basename, "soft_link_relative") + self.assertEqual(h5node.local_name, "/group/soft_link_relative") + def testExternalLink(self): path = ["base.h5", "link", "external_link"] h5node = self.getH5NodeFromPath(self.model, path) @@ -895,7 +907,7 @@ class TestHdf5TreeView(TestCaseQt): view.setSelectedH5Node(tree) selection = list(view.selectedH5Nodes()) - self.assertEquals(len(selection), 0) + self.assertEqual(len(selection), 0) def testSelection_Tree(self): tree1 = commonh5.File("/foo/bar/1.mock", "w") |