Source code for pipe_tree.datalad
"""Define interface of pipe-tree with datalad."""
from typing import IO
from file_tree import FileTree
import os.path as op
from functools import lru_cache
[docs]def get_tree(relative_dir='.', full_dir=None):
"""Get FileTree defined as "data.tree" at the top-level of datalad dataset."""
import datalad.api as dl
if full_dir is None:
full_dir = relative_dir
ds = get_dataset(full_dir)
if ds is None:
raise IOError(f"No dataset found in {full_dir}")
if op.isfile(op.join(full_dir, 'data.tree')):
tree = FileTree.read(op.join(full_dir, 'data.tree'), top_level=relative_dir)
else:
tree = FileTree.empty(top_level=relative_dir)
for sub_ds in dl.subdatasets(dataset=ds):
sub_path = sub_ds['gitmodule_name']
tree_name = op.split(sub_path)[-1]
tree.add_template(sub_path, "__" + tree_name)
tree.add_subtree(get_tree(sub_path, sub_ds['path']), tree_name, "__" + tree_name)
return tree
[docs]@lru_cache(None)
def get_dataset(directory='.'):
"""Get datalad dataset containing given directory (default: current directory)."""
import datalad.api as dl
ds = dl.Dataset(directory)
if not ds.is_installed():
return None
return ds