Skip to content

Commit

Permalink
Add sorting parameter for show() and save2file() (#180)
Browse files Browse the repository at this point in the history
* Add sorting parameter for show() and save2file()

Signed-off-by: Hollow Man <hollowman@hollowman.ml>

* Add the test case

Signed-off-by: Hollow Man <hollowman@opensuse.org>

---------

Signed-off-by: Hollow Man <hollowman@hollowman.ml>
Signed-off-by: Hollow Man <hollowman@opensuse.org>
  • Loading branch information
HollowMan6 committed Mar 28, 2023
1 parent 545e05b commit 781e38d
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 10 deletions.
17 changes: 17 additions & 0 deletions tests/test_tree.py
Original file line number Diff line number Diff line change
Expand Up @@ -553,6 +553,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
Expand Down
29 changes: 19 additions & 10 deletions treelib/tree.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ def __print_backend(
reverse=False,
line_type="ascii-ex",
data_property=None,
sorting=True,
func=print,
):
"""
Expand Down Expand Up @@ -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:

Expand All @@ -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
Expand All @@ -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()
Expand Down Expand Up @@ -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.
Expand All @@ -858,6 +861,7 @@ def handler(x):
reverse,
line_type,
data_property,
sorting,
func=handler,
)

Expand All @@ -872,6 +876,7 @@ def show(
line_type="ascii-ex",
data_property=None,
stdout=True,
sorting=True,
):
"""
Print the tree structure in hierarchy style.
Expand All @@ -895,6 +900,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 = ""
Expand All @@ -912,6 +920,7 @@ def write(line):
reverse,
line_type,
data_property,
sorting,
func=write,
)
except NodeIDAbsentError:
Expand Down

0 comments on commit 781e38d

Please sign in to comment.