Mercurial > piecrust2
view piecrust/pathutil.py @ 1157:40a40305c4e1
config: Support environment variables in theme directories.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Tue, 11 Jun 2019 15:14:20 -0700 |
parents | 8af2ea1f5c34 |
children |
line wrap: on
line source
import re import os import os.path import fnmatch from piecrust import CONFIG_PATH, THEME_CONFIG_PATH re_terminal_path = re.compile(r'^(\w\:)?[/\\]$') class SiteNotFoundError(Exception): def __init__(self, root=None, msg=None, theme=False): if not root: root = os.getcwd() cfg_name = CONFIG_PATH if theme: cfg_name = THEME_CONFIG_PATH full_msg = ("No PieCrust website in '%s' " "('%s' not found!)" % (root, cfg_name)) if msg: full_msg += ": " + msg else: full_msg += "." Exception.__init__(self, full_msg) def find_app_root(cwd=None, theme=False): if cwd is None: cwd = os.getcwd() cfg_name = CONFIG_PATH if theme: cfg_name = THEME_CONFIG_PATH while not os.path.isfile(os.path.join(cwd, cfg_name)): cwd = os.path.dirname(cwd) if not cwd or re_terminal_path.match(cwd): raise SiteNotFoundError(cwd, theme=theme) return cwd def multi_fnmatch_filter(names, patterns, modifier=None, inverse=True): res = [] for n in names: matches = False test_n = modifier(n) if modifier else n for p in patterns: if fnmatch.fnmatch(test_n, p): matches = True break if matches and not inverse: res.append(n) elif not matches and inverse: res.append(n) return res def ensure_dir(path, mode=0o755): try: os.makedirs(path, mode=mode, exist_ok=True) except OSError: pass def expandall(path): path = os.path.expandvars(path) path = os.path.expanduser(path) return path