diff --git a/catcli/noder.py b/catcli/noder.py index d0ab9d4..68eb1b3 100644 --- a/catcli/noder.py +++ b/catcli/noder.py @@ -14,7 +14,8 @@ import anytree # type: ignore # local imports from catcli import nodes from catcli.nodes import NodeAny, NodeStorage, \ - NodeTop, NodeFile, NodeArchived, NodeDir, NodeMeta + NodeTop, NodeFile, NodeArchived, NodeDir, NodeMeta, \ + typcast_node from catcli.utils import size_to_str, epoch_to_str, md5sum, fix_badchars from catcli.logger import Logger from catcli.nodeprinter import NodePrinter @@ -86,7 +87,8 @@ class Noder: try: bpath = os.path.basename(path) the_node = resolv.get(top, bpath) - return cast(NodeAny, the_node) + node = typcast_node(the_node) + return cast(NodeAny, node) except anytree.resolver.ChildResolverError: if not quiet: Logger.err(f'No node at path \"{bpath}\"') @@ -296,6 +298,7 @@ class Noder: """remove any node not flagged and clean flags""" cnt = 0 for node in anytree.PreOrderIter(top): + node = typcast_node(node) if node.type not in [nodes.TYPE_DIR, nodes.TYPE_FILE]: continue if self._clean(node): diff --git a/catcli/nodes.py b/catcli/nodes.py index eb42e81..d2a2772 100644 --- a/catcli/nodes.py +++ b/catcli/nodes.py @@ -21,6 +21,50 @@ NAME_TOP = 'top' NAME_META = 'meta' +def typcast_node(node: Any) -> Any: + """typecast node to its sub type""" + if node.type == TYPE_TOP: + return NodeTop(node.name, node.children) + if node.type == TYPE_FILE: + return NodeFile(node.name, + node.relpath, + node.nodesize, + node.md5, + node.maccess, + node.parent, + node.children) + if node.type == TYPE_DIR: + return NodeDir(node.name, + node.relpath, + node.nodesize, + node.maccess, + node.parent, + node.children) + if node.type == TYPE_ARCHIVED: + return NodeArchived(node.name, + node.relpath, + node.nodesize, + node.md5, + node.archive, + node.parent, + node.children) + if node.type == TYPE_STORAGE: + return NodeStorage(node.name, + node.free, + node.total, + node.nodesize, + node.ts, + node.attr, + node.parent, + node.children) + if node.type == TYPE_META: + return NodeMeta(node.name, + node.attr, + node.parent, + node.children) + return node + + class NodeAny(NodeMixin): # type: ignore """generic node""" diff --git a/tests/test_update.py b/tests/test_update.py index 1107b45..6f75610 100644 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -123,7 +123,7 @@ class TestUpdate(unittest.TestCase): noder.print_tree(top) # explore the top node to find all nodes - self.assertTrue(len(top.children) == 1) + self.assertEqual(len(top.children), 1) storage = top.children[0] self.assertTrue(len(storage.children) == 8)