From 428f9bebc5d4d0156d9b4f16fe80ded70c878ba7 Mon Sep 17 00:00:00 2001 From: Hollow Man Date: Wed, 5 May 2021 21:45:49 +0800 Subject: [PATCH 1/2] Add sorting parameter for show() and save2file() Signed-off-by: Hollow Man --- treelib/tree.py | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/treelib/tree.py b/treelib/tree.py index 285b8c0..8718fde 100644 --- a/treelib/tree.py +++ b/treelib/tree.py @@ -162,6 +162,7 @@ def __print_backend( reverse=False, line_type="ascii-ex", data_property=None, + sorting=True, func=print, ): """ @@ -215,17 +216,17 @@ def get_label(node): return "%s[%s]" % (node.tag, node.identifier) # legacy ordering - if key is None: + if sorting and key is None: def key(node): return node # iter with func - for pre, node in self.__get(nid, level, filter, key, reverse, line_type): + for pre, node in self.__get(nid, level, filter, key, reverse, line_type, sorting): label = get_label(node) func("{0}{1}".format(pre, label).encode("utf-8")) - def __get(self, nid, level, filter_, key, reverse, line_type): + def __get(self, nid, level, filter_, key, reverse, line_type, sorting): # default filter if filter_ is None: @@ -242,9 +243,9 @@ def filter_(node): "ascii-emh": ("\u2502", "\u255e\u2550\u2550 ", "\u2558\u2550\u2550 "), }[line_type] - return self.__get_iter(nid, level, filter_, key, reverse, dt, []) + return self.__get_iter(nid, level, filter_, key, reverse, dt, [], sorting) - def __get_iter(self, nid, level, filter_, key, reverse, dt, is_last): + def __get_iter(self, nid, level, filter_, key, reverse, dt, is_last, sorting): dt_vertical_line, dt_line_box, dt_line_corner = dt nid = self.root if nid is None else nid @@ -267,15 +268,16 @@ def __get_iter(self, nid, level, filter_, key, reverse, dt, is_last): self[i] for i in node.successors(self._identifier) if filter_(self[i]) ] idxlast = len(children) - 1 - if key: - children.sort(key=key, reverse=reverse) - elif reverse: - children = reversed(children) + if sorting: + if key: + children.sort(key=key, reverse=reverse) + elif reverse: + children = reversed(children) level += 1 for idx, child in enumerate(children): is_last.append(idx == idxlast) for item in self.__get_iter( - child.identifier, level, filter_, key, reverse, dt, is_last + child.identifier, level, filter_, key, reverse, dt, is_last, sorting ): yield item is_last.pop() @@ -838,6 +840,7 @@ def save2file( reverse=False, line_type="ascii-ex", data_property=None, + sorting=True, ): """ Save the tree into file for offline analysis. @@ -858,6 +861,7 @@ def handler(x): reverse, line_type, data_property, + sorting, func=handler, ) @@ -872,6 +876,7 @@ def show( line_type="ascii-ex", data_property=None, stdout=True, + sorting=True, ): """ Print the tree structure in hierarchy style. @@ -893,6 +898,9 @@ def show( :param reverse: the ``reverse`` param for sorting :class:`Node` objects in the same level. :param line_type: :param data_property: the property on the node data object to be printed. + :param sorting: if True perform node sorting, if False return + nodes in original insertion order. In latter case @key and + @reverse parameters are ignored. :return: None """ self._reader = "" @@ -910,6 +918,7 @@ def write(line): reverse, line_type, data_property, + sorting, func=write, ) except NodeIDAbsentError: From 3c1f9fb3d2deeff326a0b0eb0d294143378e55ff Mon Sep 17 00:00:00 2001 From: Hollow Man Date: Mon, 27 Mar 2023 21:14:32 +0300 Subject: [PATCH 2/2] Add the test case Signed-off-by: Hollow Man --- tests/test_tree.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/test_tree.py b/tests/test_tree.py index 308b6c5..e83a76b 100644 --- a/tests/test_tree.py +++ b/tests/test_tree.py @@ -559,6 +559,23 @@ def tearDown(self): self.tree = None self.copytree = None + def test_show_without_sorting(self): + t = Tree() + t.create_node('Students', 'Students', parent=None) + Node(tag='Students', identifier='Students', data=None) + t.create_node('Ben', 'Ben',parent='Students') + Node(tag='Ben', identifier='Ben', data=None) + t.create_node('Annie', 'Annie',parent='Students') + Node(tag='Annie', identifier='Annie', data=None) + t.show() + self.assertEqual( + t.show(sorting=False, stdout=False), + """Students +├── Ben +└── Annie +""", + ) + def test_all_nodes_itr(self): """ tests: Tree.all_nodes_iter