view configmix/py.py @ 60:6c5e44dc74db

Use the "haiku" theme instead of "alabaster" for the mosly API documentation
author Franz Glasner <hg@dom66.de>
date Wed, 28 Feb 2018 09:15:02 +0100
parents aa8345dae995
children a43749f751e0
line wrap: on
line source

# -*- coding: utf-8 -*-
r"""
configmix.py
^^^^^^^^^^^^

Read configuration settings from Python files

"""

from __future__ import division, absolute_import, print_function

import locale
try:
    from collections import OrderedDict as DictImpl
except ImportError:
    try:
        from ordereddict import OrderedDict as DictImpl
    except ImportError:
        DictImpl = dict

from .compat import PY2


__all__ = ["load"]


def load(filename, extract=None):
    if extract is not None:
        if not isinstance(extract, (type([]), type(tuple()), type(set()), )):
            raise TypeError("`extract' must be a sequence")
    gcontext = DictImpl()
    lcontext = DictImpl()
    if PY2:
        filename2 = filename.encode(locale.getpreferredencoding())
    if PY2:
        execfile(filename2, gcontext, lcontext)
    else:
        # "rb" mode allows Python to derive the encoding automatically
        with open(filename, "rb") as vf:
            code = compile(vf.read(), filename, "exec")
            exec(code, gcontext, lcontext)
    if extract is None:
        if "__all__" in lcontext:
            extract = lcontext["__all__"]
        else:
            extract = [k for k in lcontext if not k.startswith('_')]
    #
    # Don't bail on non-existing keys and (implicitly) convert to an
    # ordered list
    #
    extract = [v for v in extract if v in lcontext]
    return DictImpl(zip(extract, [lcontext[v] for v in extract]))