def dump(data, path_or_stream, forced_type=None, **kwargs): """ Save `data` as `path_or_stream`. :param data: Config data object to dump :: anyconfig.mergeabledict.MergeableDict by default :param path_or_stream: Output file path or file / file-like object :param forced_type: Forced configuration parser type :param kwargs: Backend specific optional arguments, e.g. {"indent": 2} for JSON loader/dumper backend """ dumper = _find_dumper(path_or_stream, forced_type) if _is_path(path_or_stream): LOGGER.info("Dumping: %s", path_or_stream) else: LOGGER.info("Dumping: %s", get_path_from_stream(path_or_stream)) dumper.dump(data, path_or_stream, **kwargs)
def single_load( path_or_stream, forced_type=None, ignore_missing=False, ac_template=False, ac_context=None, ac_schema=None, **kwargs ): """ Load single config file. :param path_or_stream: Configuration file path or file / file-like object :param forced_type: Forced configuration parser type :param ignore_missing: Ignore and just return empty result if given file (``path_or_stream``) does not exist :param ac_template: Assume configuration file may be a template file and try to compile it AAR if True :param ac_context: A dict presents context to instantiate template :param ac_schema: JSON schema file path to validate given config file :param kwargs: Backend specific optional arguments, e.g. {"indent": 2} for JSON loader/dumper backend :return: Dict-like object (instance of anyconfig.mergeabledict.MergeableDict by default) supports merge operations. """ is_path_ = _is_path(path_or_stream) if is_path_: path_or_stream = anyconfig.utils.ensure_expandusr(path_or_stream) filepath = path_or_stream else: filepath = get_path_from_stream(path_or_stream) psr = find_loader(path_or_stream, forced_type, is_path_) if psr is None: return None if ac_schema is not None: kwargs["ac_schema"] = None # Avoid infinit loop format_checker = kwargs.get("format_checker", None) LOGGER.info("Loading schema: %s", ac_schema) schema = load( ac_schema, forced_type=forced_type, ignore_missing=ignore_missing, ac_template=ac_template, ac_context=ac_context, **kwargs ) LOGGER.info("Loading: %s", filepath) if ac_template and filepath is not None: try: LOGGER.debug("Compiling: %s", filepath) content = anyconfig.template.render(filepath, ac_context) cnf = psr.loads(content, ignore_missing=ignore_missing, **kwargs) if ac_schema is not None: if not _validate(cnf, schema, format_checker): return None return cnf except Exception as exc: LOGGER.debug("Exc=%s", str(exc)) LOGGER.warn("Failed to compile %s, fallback to no template " "mode", path_or_stream) cnf = psr.load(path_or_stream, ignore_missing=ignore_missing, **kwargs) if ac_schema is not None: if not _validate(cnf, schema, format_checker): return None return cnf