Mercurial > hgrepos > Python > libs > ConfigMix
annotate configmix/py.py @ 428:090a25f36a3d
FIX: Allow jailed configurations to use correctly use base configurations that use a different "default" marker object.
Jailed configurations assumed that their "default" marker object is
identical to the "default" marker object in the unjailed base
configuration. This is not always true, especially if
"_JailedConfiguration.rebind()" is used.
Removed the explicit "default" keyword argument and passed the complete
keywords argument dictionary to the base instead. This triggers correct
default handling in the base.
| author | Franz Glasner <f.glasner@feldmann-mg.com> |
|---|---|
| date | Thu, 09 Dec 2021 13:02:17 +0100 |
| parents | eed16a1ec8f3 |
| children | f454889e41fa |
| rev | line source |
|---|---|
|
6
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1 # -*- coding: utf-8 -*- |
|
208
bbe8513ea649
Handle flake8 E265 "block comment should start with '# ': use '# :-' instead of '#-' to mark copyright and license comments
Franz Glasner <fzglas.hg@dom66.de>
parents:
207
diff
changeset
|
2 # :- |
|
237
13711ba8e81e
Adjust copyright year to 2020
Franz Glasner <fzglas.hg@dom66.de>
parents:
208
diff
changeset
|
3 # :Copyright: (c) 2015-2020, Franz Glasner. All rights reserved. |
|
296
eed16a1ec8f3
Use SPDX license identifiers (either full or short) all over the package
Franz Glasner <fzglas.hg@dom66.de>
parents:
250
diff
changeset
|
4 # :License: BSD-3-Clause. See LICENSE.txt for details. |
|
208
bbe8513ea649
Handle flake8 E265 "block comment should start with '# ': use '# :-' instead of '#-' to mark copyright and license comments
Franz Glasner <fzglas.hg@dom66.de>
parents:
207
diff
changeset
|
5 # :- |
|
82
218807d7d883
Remove header markup from the Python files and put them into the doc .rst files
Franz Glasner <hg@dom66.de>
parents:
79
diff
changeset
|
6 """Read configuration settings from Python files. |
|
6
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
7 |
|
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
8 """ |
|
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
9 |
|
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
10 from __future__ import division, absolute_import, print_function |
|
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
11 |
|
250
ff964825a75a
Style: placement of "__all__"
Franz Glasner <fzglas.hg@dom66.de>
parents:
237
diff
changeset
|
12 |
|
ff964825a75a
Style: placement of "__all__"
Franz Glasner <fzglas.hg@dom66.de>
parents:
237
diff
changeset
|
13 __all__ = ["load"] |
|
ff964825a75a
Style: placement of "__all__"
Franz Glasner <fzglas.hg@dom66.de>
parents:
237
diff
changeset
|
14 |
|
ff964825a75a
Style: placement of "__all__"
Franz Glasner <fzglas.hg@dom66.de>
parents:
237
diff
changeset
|
15 |
|
19
04505a8dbfc0
Use ordered dictionaries (if available) when reading Python configuration files
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
6
diff
changeset
|
16 try: |
|
04505a8dbfc0
Use ordered dictionaries (if available) when reading Python configuration files
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
6
diff
changeset
|
17 from collections import OrderedDict as DictImpl |
|
04505a8dbfc0
Use ordered dictionaries (if available) when reading Python configuration files
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
6
diff
changeset
|
18 except ImportError: |
|
04505a8dbfc0
Use ordered dictionaries (if available) when reading Python configuration files
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
6
diff
changeset
|
19 try: |
|
04505a8dbfc0
Use ordered dictionaries (if available) when reading Python configuration files
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
6
diff
changeset
|
20 from ordereddict import OrderedDict as DictImpl |
|
04505a8dbfc0
Use ordered dictionaries (if available) when reading Python configuration files
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
6
diff
changeset
|
21 except ImportError: |
|
04505a8dbfc0
Use ordered dictionaries (if available) when reading Python configuration files
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
6
diff
changeset
|
22 DictImpl = dict |
|
6
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
23 |
|
166
b5ce9a8461bf
Use the filesystem encoding explicitely where appropriate.
Franz Glasner <fzglas.hg@dom66.de>
parents:
156
diff
changeset
|
24 from .compat import PY2, u2fs |
|
6
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
25 |
|
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
26 |
|
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
27 def load(filename, extract=None): |
|
125
c11dd36279d9
More documentation for the configmix.py module
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
82
diff
changeset
|
28 """Load Python-style configuration files. |
|
c11dd36279d9
More documentation for the configmix.py module
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
82
diff
changeset
|
29 |
|
c11dd36279d9
More documentation for the configmix.py module
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
82
diff
changeset
|
30 Files are loaded and **executed** with :func:`exec` using an empty |
|
c11dd36279d9
More documentation for the configmix.py module
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
82
diff
changeset
|
31 dict as global and local context.# |
|
c11dd36279d9
More documentation for the configmix.py module
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
82
diff
changeset
|
32 |
|
c11dd36279d9
More documentation for the configmix.py module
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
82
diff
changeset
|
33 :param filename: the path to the configuration file |
|
c11dd36279d9
More documentation for the configmix.py module
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
82
diff
changeset
|
34 :param extract: an optional list of variable names (keys) to extract |
|
c11dd36279d9
More documentation for the configmix.py module
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
82
diff
changeset
|
35 into the resulting configuration dictionary |
|
c11dd36279d9
More documentation for the configmix.py module
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
82
diff
changeset
|
36 :returns: the configuration as dictionary |
|
c11dd36279d9
More documentation for the configmix.py module
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
82
diff
changeset
|
37 :rtype: collections.OrderedDict or ordereddict.OrderedDict or dict |
|
c11dd36279d9
More documentation for the configmix.py module
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
82
diff
changeset
|
38 |
|
c11dd36279d9
More documentation for the configmix.py module
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
82
diff
changeset
|
39 """ |
|
6
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
40 if extract is not None: |
|
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
41 if not isinstance(extract, (type([]), type(tuple()), type(set()), )): |
|
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
42 raise TypeError("`extract' must be a sequence") |
|
19
04505a8dbfc0
Use ordered dictionaries (if available) when reading Python configuration files
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
6
diff
changeset
|
43 gcontext = DictImpl() |
|
04505a8dbfc0
Use ordered dictionaries (if available) when reading Python configuration files
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
6
diff
changeset
|
44 lcontext = DictImpl() |
|
6
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
45 if PY2: |
|
207
b3b5ed34d180
Handle most flake8 errors and warnings.
Franz Glasner <fzglas.hg@dom66.de>
parents:
166
diff
changeset
|
46 execfile(u2fs(filename, True), gcontext, lcontext) # noqa: F821 |
|
6
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
47 else: |
|
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
48 # "rb" mode allows Python to derive the encoding automatically |
|
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
49 with open(filename, "rb") as vf: |
|
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
50 code = compile(vf.read(), filename, "exec") |
|
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
51 exec(code, gcontext, lcontext) |
|
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
52 if extract is None: |
|
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
53 if "__all__" in lcontext: |
|
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
54 extract = lcontext["__all__"] |
|
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
55 else: |
|
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
56 extract = [k for k in lcontext if not k.startswith('_')] |
|
19
04505a8dbfc0
Use ordered dictionaries (if available) when reading Python configuration files
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
6
diff
changeset
|
57 # |
|
04505a8dbfc0
Use ordered dictionaries (if available) when reading Python configuration files
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
6
diff
changeset
|
58 # Don't bail on non-existing keys and (implicitly) convert to an |
|
04505a8dbfc0
Use ordered dictionaries (if available) when reading Python configuration files
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
6
diff
changeset
|
59 # ordered list |
|
04505a8dbfc0
Use ordered dictionaries (if available) when reading Python configuration files
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
6
diff
changeset
|
60 # |
|
6
caaaddb11db1
Evaluating Python configuration files
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
61 extract = [v for v in extract if v in lcontext] |
|
19
04505a8dbfc0
Use ordered dictionaries (if available) when reading Python configuration files
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
6
diff
changeset
|
62 return DictImpl(zip(extract, [lcontext[v] for v in extract])) |
