summaryrefslogtreecommitdiff
path: root/silx/gui/hdf5
diff options
context:
space:
mode:
Diffstat (limited to 'silx/gui/hdf5')
-rw-r--r--silx/gui/hdf5/Hdf5Item.py41
-rw-r--r--silx/gui/hdf5/Hdf5LoadingItem.py11
-rw-r--r--silx/gui/hdf5/Hdf5Node.py9
-rw-r--r--silx/gui/hdf5/Hdf5TreeModel.py15
-rw-r--r--silx/gui/hdf5/NexusSortFilterProxyModel.py20
-rw-r--r--silx/gui/hdf5/_utils.py11
-rw-r--r--silx/gui/hdf5/test/test_hdf5.py122
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")