asciitree

asciitree draws tree structures using characters.

ASCII Trees

asciitree
 +-- sometimes
 |   +-- you
 +-- just
 |   +-- want
 |       +-- to
 |       +-- draw
 +-- trees
 +-- in
     +-- your
         +-- terminal
from asciitree import LeftAligned
from collections import OrderedDict as OD

tree = {
    'asciitree': OD([
        ('sometimes',
            {'you': {}}),
        ('just',
            {'want': OD([
                ('to', {}),
                ('draw', {}),
            ])}),
        ('trees', {}),
        ('in', {
            'your': {
                'terminal': {}
            }
        })
    ])
}

tr = LeftAligned()
print(tr(tree))

Read the documentation at http://pythonhosted.org/asciitree

Fancier examples:

from collections import OrderedDict as OD
from copy import deepcopy

from asciitree import LeftAligned
from asciitree.drawing import BoxStyle, BOX_DOUBLE, BOX_BLANK

tr = LeftAligned()

# a basic tree
# OrderedDict is used in some places where node order is important, otherwise
# a normal dict is used for the sake of readabilitiy
tree = {
    'asciitree': OD([
        ('sometimes',
            {'you': {}}),
        ('just',
            {'want': OD([
                ('to', {}),
                ('draw', {}),
            ])}),
        ('trees', {}),
        ('in', {
            'your': {
                'terminal': {}
            }
        })
    ])
}

print(tr(tree))

# construct a more complex tree by copying the tree and grafting it onto itself
tree2 = deepcopy(tree)
tree2['asciitree']['trees'] = deepcopy(tree2['asciitree'])
print(tr(tree2))

# use a box style
box_tr = LeftAligned(draw=BoxStyle(gfx=BOX_DOUBLE, horiz_len=1))
print(box_tr(tree))

# more airy
air_tr = LeftAligned(draw=BoxStyle(gfx=BOX_BLANK,
                                   label_space=0,
                                   label_format='[{}]',
                                   indent=0))
print(air_tr(tree))

API

class asciitree.LeftAligned(**kwargs)

Creates a renderer for a left-aligned tree.

Any attributes of the resulting class instances can be set using constructor arguments.

__call__(tree)

Render the tree into string suitable for console output.

Parameters:tree – A tree.
draw = <asciitree.drawing.BoxStyle object>

The draw style used. See Style.

render(node)

Renders a node. This function is used internally, as it returns a list of lines. Use __call__() instead.

traverse = <asciitree.traversal.DictTraversal object>

Traversal method. See Traversal.

class asciitree.traversal.AttributeTraversal(**kwargs)

Attribute traversal.

Uses an attribute of a node as its list of children.

attribute = 'children'

Attribute to use.

class asciitree.traversal.DictTraversal(**kwargs)

Traversal suitable for a dictionary. Keys are tree labels, all values must be dictionaries as well.

class asciitree.traversal.Traversal(**kwargs)

Traversal method.

Used by the tree rendering functions like LeftAligned.

get_children(node)

Return a list of children of a node.

get_root(tree)

Return a node representing the tree root from the tree.

get_text(node)

Return the text associated with a node.

asciitree.drawing.BOX_ASCII = {'UP_AND_RIGHT': u'+', 'HORIZONTAL': u'-', 'VERTICAL': u'|', 'VERTICAL_AND_RIGHT': u'+'}

Unicode box-drawing glyphs, using only ascii |+- characters.

asciitree.drawing.BOX_BLANK = {'UP_AND_RIGHT': u' ', 'HORIZONTAL': u' ', 'VERTICAL': u' ', 'VERTICAL_AND_RIGHT': u' '}

Unicode box-drawing glyphs, using only spaces.

asciitree.drawing.BOX_DOUBLE = {'UP_AND_RIGHT': u'\u255a', 'HORIZONTAL': u'\u2550', 'VERTICAL': u'\u2551', 'VERTICAL_AND_RIGHT': u'\u2560'}

Unicode box-drawing glyphs, double-line style

asciitree.drawing.BOX_HEAVY = {'UP_AND_RIGHT': u'\u2517', 'HORIZONTAL': u'\u2501', 'VERTICAL': u'\u2503', 'VERTICAL_AND_RIGHT': u'\u2523'}

Unicode box-drawing glyphs, heavy style

asciitree.drawing.BOX_LIGHT = {'UP_AND_RIGHT': u'\u2514', 'HORIZONTAL': u'\u2500', 'VERTICAL': u'\u2502', 'VERTICAL_AND_RIGHT': u'\u251c'}

Unicode box-drawing glyphs, light style

class asciitree.drawing.BoxStyle(**kwargs)

A rendering style that uses box draw characters and a common layout.

gfx = {'UP_AND_RIGHT': u'+', 'HORIZONTAL': u'-', 'VERTICAL': u'|', 'VERTICAL_AND_RIGHT': u'+'}

Glyhps to use.

horiz_len = 2

Length of horizontal lines

indent = 1

Indent for subtrees

label_space = 1

Space between glyphs and label.

class asciitree.drawing.Style(**kwargs)

Rendering style for trees.

child_head(label)

Render a node label into final output.

child_tail(line)

Render a node line that is not a label into final output.

label_format = u'{}'

Format for labels.

last_child_head(label)

Like child_head() but only called for the last child.

last_child_tail(line)

Like child_tail() but only called for the last child.

node_label(text)

Render a node text into a label.