Skip to content

vortec/libtree

Repository files navigation

libtree

Build Status Coverage Status Scrutinizer Code Quality Documentation Status

libtree is a Python library which assists you in dealing with large, hierarchical data sets. It runs on top of PostgreSQL 9.5 and is compatible with all major Python interpreters (2.7, 3.3-3.5, PyPy2 and PyPy3).

Why use libtree? Because...

  • the usage is super simple
  • it scales up to billions of nodes
  • the reads and writes are blazingly fast
  • it supports attribute inheritance

But there's even more, libtree...

  • offers thread-safety by working inside transactions
  • enforces integrity by moving tree logic to inside the database
  • provides a convenient high level API and fast low level functions
  • core is fully integration tested, the testsuite covers >90% of the code

Installation

Install libtree directly via pip:

$ pip install libtree

Upgrading

We respect semantic versioning. Please read the CHANGELOG to find out which breaking changes we made!

Quickstart

Start the interactive Python interpreter of your choice to start working with libtree:

# Imports
from libtree import Tree
import psycopg2

# Connect to PostgreSQL
connection = psycopg2.connect("dbname=test_tree user=vortec")
tree = Tree(connection)

# Start working with libtree inside a database transaction
with tree(write=True) as transaction:

    # Create tables
    transaction.install()

    # Create nodes
    root = transaction.insert_root_node()
    binx = root.insert_child({'title': 'Binary folder'})
    bash = binx.insert_child({'title': 'Bash executable', 'chmod': 755})
    etc = root.insert_child({'title': 'Config folder'})
    hosts = etc.insert_child({'title': 'Hosts file'})
    passwd = etc.insert_child({'title': 'Password file', 'chmod': 644})

    # Direct attribute access
    root.children  # => binx, etc
    len(root)  # => 2
    binx.parent  # => root
    bash.ancestors  # => binx, root
    root.descendants  # => binx, bash, etc, hosts, passwd

    # Query by property
    transaction.get_nodes_by_property_key('chmod')  # bash, passwd
    transaction.get_nodes_by_property_dict({'chmod': 644})  # passwd

    # Move bash node into etc node
    bash.move(etc)
    etc.children  # => hosts, passwd, bash
    bash.set_position(1)
    etc.children  # => hosts, bash, passwd

    # Print entire tree
    transaction.print_tree()
    # Output:
    # <NodeData id='0301770b-fe53-4447-88cc-87ce313e8d9a'>
    #   <NodeData id='726241b7-d1d0-4f50-8db4-1f45e133b52c', title='Binary folder'>
    #   <NodeData id='1afce8e3-975a-4daa-93e7-88d879c05224', title='Config folder'>
    #     <NodeData id='4db559b8-97b0-4b67-ad69-20644fcc3cfe', title='Hosts file'>
    #     <NodeData id='8f458921-d6db-4f34-8ee4-211c15e78471', title='Bash executable'>
    #     <NodeData id='4312a7bf-53c9-4c14-80a3-5f7dd385b25c', title='Password file'>

Documentation

The full documentation including API reference and database model description can be found at ReadTheDocs.org.

Authors

libtree is written and maintained by Fabian Kochem.