Commit 6e3589c0 authored by Paul McCarthy's avatar Paul McCarthy 🚵
Browse files

ENH: New FileTreeQuery class, for searching for files in a FileTree

parent e2bfd0d9
#!/usr/bin/env python
# -
# Author: Paul McCarthy <>
# Author: Michiel Cottaar <>
import logging
import collections
from typing import Dict, Set, List
log = logging.getLogger(__name__)
class FileTreeQuery(object):
def __init__(self, tree):
self.__tree = tree
self.__matches = self.__tree.scan()
self.__variables = Match.allVariables(self.__tree, self.__matches)
def variables(self) -> Dict[str, Set]:
"""Return a dict of ``{variable : [values]}`` mappings.
This dict describes all variables and their possible values in
the tree.
return dict(self.__variables)
def query(self, **variables) -> List[str]:
hits = []
for m in self.__matches:
if all([m.variables.get(n, None) == v
for n, v in variables.items()]):
return hits
class Match(object):
Filename matching a template in the file tree
def allVariables(tree, matches) -> Dict(str, Set):
allvars = collections.defaultdict(set)
for m in matches:
for var, val in m.variables.items():
return allvars
def scan(tree):
Scans the disk to find any matches
:return: list of :class:`Match` objects
matches = []
for template in tree.templates:
for filename in tree.get_all(template, glob_vars='all'):
variables = tree.extract_variables(template, filename)
match = Match(filename, template, variables)
for tree_name, sub_tree in tree.sub_trees:
return matches
def __init__(self, filename, short_name, variables):
Defines a new match
:param filename: name of existing file
:param short_name: template identifier
:param variables: variable values
self.filename = filename
self.short_name = short_name
self.variables = dict(variables)
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment