89 lines
1.9 KiB
Python
89 lines
1.9 KiB
Python
#!/usr/bin/env python
|
|
|
|
"""
|
|
Example of treelib usage to generate recursive tree of directories.
|
|
It could be useful to implement Directory Tree data structure
|
|
|
|
2016 samuelsh
|
|
"""
|
|
|
|
import treelib
|
|
import random
|
|
import hashlib
|
|
from string import digits, letters
|
|
import sys
|
|
|
|
|
|
MAX_FILES_PER_DIR = 10
|
|
|
|
|
|
def range2(stop):
|
|
if sys.version_info[0] < 3:
|
|
return xrange(stop) # noqa: F821
|
|
else:
|
|
return range(stop)
|
|
|
|
|
|
def get_random_string(length):
|
|
return "".join(random.choice(digits + letters) for _ in range2(length))
|
|
|
|
|
|
def build_recursive_tree(tree, base, depth, width):
|
|
"""
|
|
Args:
|
|
tree: Tree
|
|
base: Node
|
|
depth: int
|
|
width: int
|
|
|
|
Returns:
|
|
|
|
"""
|
|
if depth >= 0:
|
|
depth -= 1
|
|
for i in range2(width):
|
|
directory = Directory()
|
|
tree.create_node(
|
|
"{0}".format(directory.name),
|
|
"{0}".format(hashlib.md5(directory.name)),
|
|
parent=base.identifier,
|
|
data=directory,
|
|
) # node identifier is md5 hash of it's name
|
|
dirs_nodes = tree.children(base.identifier)
|
|
for dir in dirs_nodes:
|
|
newbase = tree.get_node(dir.identifier)
|
|
build_recursive_tree(tree, newbase, depth, width)
|
|
else:
|
|
return
|
|
|
|
|
|
class Directory(object):
|
|
def __init__(self):
|
|
self._name = get_random_string(64)
|
|
self._files = [
|
|
File() for _ in range2(MAX_FILES_PER_DIR)
|
|
] # Each directory contains 1000 files
|
|
|
|
@property
|
|
def name(self):
|
|
return self._name
|
|
|
|
@property
|
|
def files(self):
|
|
return self._files
|
|
|
|
|
|
class File(object):
|
|
def __init__(self):
|
|
self._name = get_random_string(64)
|
|
|
|
@property
|
|
def name(self):
|
|
return self._name
|
|
|
|
|
|
tree = treelib.Tree()
|
|
base = tree.create_node("Root", "root")
|
|
build_recursive_tree(tree, base, 2, 10)
|
|
|
|
tree.show()
|