From b809850fa0959ee1bb5b8316f44827064fc8afcc Mon Sep 17 00:00:00 2001 From: deadc0de6 Date: Sat, 22 Jul 2023 22:25:27 +0200 Subject: [PATCH 1/4] fix for #39 --- catcli/noder.py | 7 +++++-- catcli/nodes.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ tests/test_update.py | 2 +- 3 files changed, 50 insertions(+), 3 deletions(-) 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) From 001c03ca28a9dc543518b85e8986f1293fdb56c5 Mon Sep 17 00:00:00 2001 From: deadc0de6 Date: Sat, 22 Jul 2023 22:48:20 +0200 Subject: [PATCH 2/4] fix casting --- catcli/noder.py | 6 +++--- catcli/nodes.py | 52 ++++++++++++------------------------------------- 2 files changed, 15 insertions(+), 43 deletions(-) diff --git a/catcli/noder.py b/catcli/noder.py index 68eb1b3..cfd21da 100644 --- a/catcli/noder.py +++ b/catcli/noder.py @@ -87,8 +87,8 @@ class Noder: try: bpath = os.path.basename(path) the_node = resolv.get(top, bpath) - node = typcast_node(the_node) - return cast(NodeAny, node) + typcast_node(the_node) + return cast(NodeAny, the_node) except anytree.resolver.ChildResolverError: if not quiet: Logger.err(f'No node at path \"{bpath}\"') @@ -298,7 +298,7 @@ class Noder: """remove any node not flagged and clean flags""" cnt = 0 for node in anytree.PreOrderIter(top): - node = typcast_node(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 d2a2772..b622410 100644 --- a/catcli/nodes.py +++ b/catcli/nodes.py @@ -21,48 +21,20 @@ NAME_TOP = 'top' NAME_META = 'meta' -def typcast_node(node: Any) -> Any: +def typcast_node(node: Any) -> None: """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 + node.__class__ = NodeTop + elif node.type == TYPE_FILE: + node.__class__ = NodeFile + elif node.type == TYPE_DIR: + node.__class__ = NodeDir + elif node.type == TYPE_ARCHIVED: + node.__class__ = NodeArchived + elif node.type == TYPE_STORAGE: + node.__class__ = NodeStorage + elif node.type == TYPE_META: + node.__class__ = NodeMeta class NodeAny(NodeMixin): # type: ignore From e2be5136d45ac8c401201314976fc874a1b69f22 Mon Sep 17 00:00:00 2001 From: deadc0de6 Date: Sat, 22 Jul 2023 22:25:27 +0200 Subject: [PATCH 3/4] fix for #39 --- catcli/noder.py | 7 +++++-- catcli/nodes.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ tests/test_update.py | 2 +- 3 files changed, 50 insertions(+), 3 deletions(-) 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) From b7bd2ecc5da0a6fac31225ff14a82538e0dcb55b Mon Sep 17 00:00:00 2001 From: deadc0de6 Date: Sat, 22 Jul 2023 22:48:20 +0200 Subject: [PATCH 4/4] fix casting --- catcli/noder.py | 6 +++--- catcli/nodes.py | 52 ++++++++++++------------------------------------- 2 files changed, 15 insertions(+), 43 deletions(-) diff --git a/catcli/noder.py b/catcli/noder.py index 68eb1b3..cfd21da 100644 --- a/catcli/noder.py +++ b/catcli/noder.py @@ -87,8 +87,8 @@ class Noder: try: bpath = os.path.basename(path) the_node = resolv.get(top, bpath) - node = typcast_node(the_node) - return cast(NodeAny, node) + typcast_node(the_node) + return cast(NodeAny, the_node) except anytree.resolver.ChildResolverError: if not quiet: Logger.err(f'No node at path \"{bpath}\"') @@ -298,7 +298,7 @@ class Noder: """remove any node not flagged and clean flags""" cnt = 0 for node in anytree.PreOrderIter(top): - node = typcast_node(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 d2a2772..b622410 100644 --- a/catcli/nodes.py +++ b/catcli/nodes.py @@ -21,48 +21,20 @@ NAME_TOP = 'top' NAME_META = 'meta' -def typcast_node(node: Any) -> Any: +def typcast_node(node: Any) -> None: """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 + node.__class__ = NodeTop + elif node.type == TYPE_FILE: + node.__class__ = NodeFile + elif node.type == TYPE_DIR: + node.__class__ = NodeDir + elif node.type == TYPE_ARCHIVED: + node.__class__ = NodeArchived + elif node.type == TYPE_STORAGE: + node.__class__ = NodeStorage + elif node.type == TYPE_META: + node.__class__ = NodeMeta class NodeAny(NodeMixin): # type: ignore