Source code for pkglts.manage_tools

""" Specific helper function for manage script
"""

import logging

from .hash_management import compute_hash, pth_as_key
from .local import init_namespace_dir
from .option_tools import available_options, get_user_permission
from .templating import Template

LOGGER = logging.getLogger(__name__)

TPL_SRC_NAME = "{" + "{ base.pkgname }" + "}"


[docs] def check_option_parameters(name, cfg): """Check that the parameters associated to an option are valid. Args: name (str): option name cfg (Config): current package configuration """ opt = available_options[name] return opt.check(cfg)
[docs] def update_opt(name, cfg): """Update an option of this package. Notes: If the option does not exists yet, add it first. See the list of available option online Args: name (str): name of option to add cfg (Config): current package configuration """ LOGGER.info("update option %s", name) # test existence of option try: opt = available_options[name] except KeyError: raise KeyError(f"option '{name}' does not exists") # find other option requirements in repository for option_name in opt.require_option(cfg): if option_name not in cfg.installed_options(): LOGGER.info("need to install option '%s' first", option_name) if (cfg["_pkglts"]['auto_install'] or get_user_permission("install")): cfg = update_opt(option_name, cfg) else: return cfg # find parameters required by option config opt.update_parameters(cfg.template()) cfg.resolve() return cfg
[docs] def find_templates(src_dir, tgt_dir, cfg, rg_tree): """Find all template files associated to an option Warnings: modify rg_tree in place Args: src_dir (Path): path to reference files tgt_dir (Path): path to target where files will be written cfg (Config): current package configuration rg_tree (dict): Structure to store path to templates found Returns: None """ LOGGER.debug("find_templates in %s", src_dir) for src_pth in src_dir.glob("*"): tgt_name = cfg.render(src_pth.name) if tgt_name.endswith(".tpl"): tgt_name = tgt_name[:-4] tgt_pth = tgt_dir / tgt_name # handle namespace if src_pth.is_dir() and src_dir.name == 'src' and src_pth.name == TPL_SRC_NAME: namespace = cfg['base']['namespace'] if namespace is not None: ns_pth = tgt_dir / namespace init_namespace_dir(ns_pth, rg_tree) tgt_pth = ns_pth / tgt_name if src_pth.is_dir(): if tgt_name in ("", "_"): # do nothing pass else: find_templates(src_pth, tgt_pth, cfg, rg_tree) else: if tgt_name.split('.')[0] == "_": pass else: try: rg_tree[pth_as_key(tgt_pth)].append(src_pth) except KeyError: rg_tree[pth_as_key(tgt_pth)] = [src_pth]
[docs] def render_template(src_pths, tgt_pth, cfg, overwrite_file): """Render template and write it in tgt_pth Args: src_pths (list): list of reference templates tgt_pth (Path): path to created file cfg (Config): current package configuration overwrite_file (dict): which files to overwrite Returns: (dict|None): bid, hash of block content """ LOGGER.debug("render file '%s'", tgt_pth) if not overwrite_file.get(pth_as_key(tgt_pth), True): LOGGER.debug("no overwrite") return None tpl = Template() for src_pth in src_pths: tpl.parse(src_pth) blocks = tpl.render(cfg, tgt_pth) if blocks is None: return None else: # non binary file return dict((bid, compute_hash(cnt)) for bid, cnt in blocks)