123 lines
3.7 KiB
Python
123 lines
3.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
Configuration file core loading functions
|
|
"""
|
|
|
|
# Import python libs
|
|
import os
|
|
import glob
|
|
import fnmatch
|
|
import dict_tools.update
|
|
|
|
|
|
def parse(hub, raw, cli, os_vars, cli_args, loader):
|
|
"""
|
|
Determine if a config file or a config dir has been set up and load it up!
|
|
"""
|
|
# This function is the entry point for the config.file sub
|
|
# Figure out what config file value to use in this priority
|
|
default = raw[cli]["CONFIG"].get("config", {}).get("default")
|
|
default_dir = raw[cli]["CONFIG"].get("config_dir", {}).get("default")
|
|
os_conf = os_vars.get("config", default)
|
|
os_dir = os_vars.get("config_dir", default_dir)
|
|
conf = cli_args.get("config", os_conf)
|
|
dir_ = cli_args.get("config_dir", os_dir)
|
|
file_opts = {}
|
|
dir_opts = {}
|
|
if dir_:
|
|
file_opts = hub.config.file.init.load_dir(dir_, loader)
|
|
if conf:
|
|
dir_opts = hub.config.file.init.load(conf, loader)
|
|
ret = dict_tools.update.update(dir_opts, file_opts)
|
|
return ret
|
|
|
|
|
|
def load(hub, paths, loader, includes=True):
|
|
"""
|
|
Load a single configuration file
|
|
"""
|
|
opts = {}
|
|
if not isinstance(paths, list):
|
|
paths = [paths]
|
|
add = []
|
|
for fn in paths:
|
|
add.extend(glob.glob(fn))
|
|
paths.extend(add)
|
|
for fn in paths:
|
|
fn_data = hub.config.render.init.load_file(loader, fn)
|
|
if includes:
|
|
fn_data = hub.config.file.init.proc_include(fn, fn_data, loader)
|
|
dict_tools.update.update(opts, fn_data)
|
|
return opts
|
|
|
|
|
|
def load_dir(
|
|
hub,
|
|
confdir,
|
|
loader,
|
|
includes=True,
|
|
recurse=True,
|
|
):
|
|
"""
|
|
Load takes a directory location to scan for configuration files. These
|
|
files will be read in.
|
|
"""
|
|
opts = {}
|
|
if not isinstance(confdir, list):
|
|
confdir = [confdir]
|
|
confdirs = []
|
|
for dirs in confdir:
|
|
if not isinstance(dirs, (list, tuple)):
|
|
dirs = [dirs]
|
|
for dir_ in dirs:
|
|
confdirs.extend(glob.glob(dir_))
|
|
paths = []
|
|
for dir_ in confdirs:
|
|
dirpaths = []
|
|
if os.path.isdir(dir_):
|
|
if not recurse:
|
|
for fn_ in os.listdir(dir_):
|
|
path = os.path.join(dir_, fn_)
|
|
if os.path.isdir(path):
|
|
# Don't process directories
|
|
continue
|
|
dirpaths.append(path)
|
|
else:
|
|
for root, dirs, files in os.walk(dir_):
|
|
for fn_ in files:
|
|
path = os.path.join(root, fn_)
|
|
dirpaths.append(path)
|
|
|
|
# Sort confdir directory paths like:
|
|
# /b.txt
|
|
# /c.txt
|
|
# /a/x.txt
|
|
# /b/x.txt
|
|
paths.extend(sorted(dirpaths, key=lambda p: (p.count(os.path.sep), p)))
|
|
opts = dict_tools.update.update(
|
|
opts, hub.config.file.init.load(paths, loader, includes)
|
|
)
|
|
return opts
|
|
|
|
|
|
def proc_include(hub, fn, opts, loader):
|
|
"""
|
|
Process include and include_dir
|
|
"""
|
|
dirname = os.path.dirname(fn)
|
|
if opts.get("include_dir"):
|
|
idir = opts.pop("include_dir")
|
|
if not idir.startswith(os.path.abspath(os.sep)):
|
|
idir = os.path.join(dirname, idir)
|
|
opts = dict_tools.update.update(
|
|
opts, hub.config.file.init.load_dir(idir, loader)
|
|
)
|
|
hub.config.file.init.proc_include(os.path.join(idir, "f"), opts, loader)
|
|
if opts.get("include"):
|
|
ifn = opts.pop("include")
|
|
if not ifn.startswith(os.path.abspath(os.sep)):
|
|
ifn = os.path.join(dirname, ifn)
|
|
opts = dict_tools.update.update(opts, hub.config.file.init.load(ifn, loader))
|
|
hub.config.file.init.proc_include(ifn, opts, loader)
|
|
return opts
|