Mercurial > hgrepos > Python > libs > ConfigMix
annotate configmix/config.py @ 654:0d6673d06c2c
Add support for using "tomllib" (in Python's stdlib since 3.11) and "tomli" TOML packages.
They are preferred if they are found to be installed.
But note that the declared dependency for the "toml" extra nevertheless
is the "toml" package. Because it is available for all supported Python
versions.
So use Python 3.11+ or install "tomli" manually if you want to use the
alternate packages.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Thu, 19 May 2022 22:10:59 +0200 |
| parents | e8f3e970e411 |
| children | b74f20e19c01 |
| rev | line source |
|---|---|
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
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 # :- |
|
593
f454889e41fa
Adjust copyright year (the end) to 2022
Franz Glasner <fzglas.hg@dom66.de>
parents:
554
diff
changeset
|
3 # :Copyright: (c) 2015-2022, 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:
251
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 """The unified configuration dictionary with attribute support or |
|
54
aa8345dae995
Generate readable HTML documentation and an API documentation
Franz Glasner <hg@dom66.de>
parents:
40
diff
changeset
|
7 variable substitution. |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
8 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
9 """ |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
10 |
|
482
8b8ffb74d452
Remove unneeded __future__ import because we are on Python 2.6+
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
481
diff
changeset
|
11 from __future__ import division, absolute_import, print_function |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
12 |
|
250
ff964825a75a
Style: placement of "__all__"
Franz Glasner <fzglas.hg@dom66.de>
parents:
249
diff
changeset
|
13 |
|
ff964825a75a
Style: placement of "__all__"
Franz Glasner <fzglas.hg@dom66.de>
parents:
249
diff
changeset
|
14 __all__ = ["Configuration"] |
|
ff964825a75a
Style: placement of "__all__"
Franz Glasner <fzglas.hg@dom66.de>
parents:
249
diff
changeset
|
15 |
|
ff964825a75a
Style: placement of "__all__"
Franz Glasner <fzglas.hg@dom66.de>
parents:
249
diff
changeset
|
16 |
|
39
8715e5cc59ac
Print a warning if a variable cannot be expanded.
Franz Glasner <hg@dom66.de>
parents:
36
diff
changeset
|
17 import warnings |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
18 try: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
19 from collections import OrderedDict as ConfigurationBase |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
20 except ImportError: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
21 try: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
22 from ordereddict import OrderedDict as ConfigurationBase |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
23 except ImportError: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
24 ConfigurationBase = dict |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
25 try: |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
26 from urllib.parse import urlsplit |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
27 except ImportError: |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
28 from urlparse import urlsplit |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
29 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
30 from .variables import lookup_varns, lookup_filter |
|
487
d7f6f2afcee2
Instead of using u(str(v)) use specialized functions for PY2 and PY3
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
485
diff
changeset
|
31 from .compat import u, uchr, n, str_and_u, PY2 |
|
637
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
610
diff
changeset
|
32 from .constants import REF_NAMESPACE, NONE_FILTER, EMPTY_FILTER, DEL_VALUE |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
33 try: |
|
550
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
548
diff
changeset
|
34 from ._speedups import (fast_unquote, fast_quote, fast_pathstr2path, |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
35 _fast_split_ns, _fast_split_filters, |
|
610
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
36 _fast_getvarl, _fast_getvarl_s, |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
37 _fast_getvar, _fast_getvar_s, |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
38 _fast_interpolate_variables, |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
39 _sync_MISSING, _sync_MARKER) |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
40 except ImportError: |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
41 fast_unquote = None |
|
550
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
548
diff
changeset
|
42 fast_quote = None |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
43 fast_pathstr2path = None |
|
543
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
44 _fast_split_ns = None |
|
552
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
551
diff
changeset
|
45 _fast_split_filters = None |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
46 _fast_getvarl = None |
|
610
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
47 _fast_getvarl_s = None |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
48 _fast_getvar = None |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
49 _fast_getvar_s = None |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
50 _fast_interpolate_variables = None |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
51 _sync_MISSING = None |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
52 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
53 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
54 _MARKER = object() |
|
499
f46932e8a84c
Configuration._lookupvar() now uses an internal cache (positive and negative).
Franz Glasner <fzglas.hg@dom66.de>
parents:
497
diff
changeset
|
55 _MISSING = object() |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
56 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
57 |
|
17
94b5e94fae44
Make the AttributeDict "private" (-> "_AttributeDict")
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
16
diff
changeset
|
58 class _AttributeDict(ConfigurationBase): |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
59 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
60 def __getattr__(self, name): |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
61 try: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
62 v = self[name] |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
63 except KeyError: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
64 raise AttributeError("%s has no attribute %r" % (type(self), name)) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
65 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
66 # Wrap a dict into another dict with attribute access support |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
67 if isinstance(v, dict): |
|
29
17af7a78710c
FIX: Renaming a class was not really complete
Franz Glasner <hg@dom66.de>
parents:
25
diff
changeset
|
68 return _AttributeDict(v) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
69 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
70 return v |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
71 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
72 |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
73 class CoercingMethodsMixin(object): |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
74 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
75 """Mixin to provide some common implementations for retrieval |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
76 methods that convert return values to a fixed type (int, bool, |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
77 float). |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
78 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
79 Both :class:`~.Configuration` and :class:`~._JailedConfiguration` use |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
80 this mixin. |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
81 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
82 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
83 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
84 def getintvarl_s(self, *path, **kwds): |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
85 """Get a (possibly substituted) variable and coerce text to a |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
86 number. |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
87 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
88 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
89 s = self.getvarl_s(*path, **kwds) |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
90 if isinstance(s, _TEXTTYPE): |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
91 return int(s, 0) |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
92 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
93 return s |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
94 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
95 def getfirstintvarl_s(self, *paths, **kwds): |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
96 """Get a (possibly substituted) variable and coerce text to a |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
97 number. |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
98 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
99 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
100 s = self.getfirstvarl_s(*paths, **kwds) |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
101 if isinstance(s, _TEXTTYPE): |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
102 return int(s, 0) |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
103 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
104 return s |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
105 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
106 def getintvar_s(self, varname, default=_MARKER): |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
107 """Get a (possibly substituted) variable and coerce text to a |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
108 number. |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
109 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
110 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
111 s = self.getvar_s(varname, default=default) |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
112 if isinstance(s, _TEXTTYPE): |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
113 return int(s, 0) |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
114 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
115 return s |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
116 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
117 def getfirstintvar_s(self, *varnames, **kwds): |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
118 """A variant of :meth:`~.getintvar_s` that returns the first found |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
119 variable in the list of given variables in `varnames`. |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
120 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
121 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
122 s = self.getfirstvar_s(*varnames, **kwds) |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
123 if isinstance(s, _TEXTTYPE): |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
124 return int(s, 0) |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
125 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
126 return s |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
127 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
128 def getboolvarl_s(self, *path, **kwds): |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
129 """Get a (possibly substituted) variable and convert text to a |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
130 boolean |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
131 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
132 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
133 s = self.getvarl_s(*path, **kwds) |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
134 if isinstance(s, _TEXTTYPE): |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
135 sl = s.strip().lower() |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
136 if sl not in self._BOOL_CVT: |
|
450
12f25ac6a13b
Make exception formatting more robuts: pack all %-style formatting args explicitely into tuples
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
449
diff
changeset
|
137 raise ValueError("Not a boolean: %r" % (s, )) |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
138 return self._BOOL_CVT[sl] |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
139 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
140 return s |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
141 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
142 def getfirstboolvarl_s(self, *paths, **kwds): |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
143 """Get a (possibly substituted) variable and convert text to a |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
144 boolean |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
145 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
146 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
147 s = self.getfirstvarl_s(*paths, **kwds) |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
148 if isinstance(s, _TEXTTYPE): |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
149 sl = s.strip().lower() |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
150 if sl not in self._BOOL_CVT: |
|
450
12f25ac6a13b
Make exception formatting more robuts: pack all %-style formatting args explicitely into tuples
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
449
diff
changeset
|
151 raise ValueError("Not a boolean: %r" % (s, )) |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
152 return self._BOOL_CVT[sl] |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
153 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
154 return s |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
155 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
156 def getboolvar_s(self, varname, default=_MARKER): |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
157 """Get a (possibly substituted) variable and convert text to a |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
158 boolean |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
159 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
160 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
161 s = self.getvar_s(varname, default=default) |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
162 if isinstance(s, _TEXTTYPE): |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
163 sl = s.strip().lower() |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
164 if sl not in self._BOOL_CVT: |
|
450
12f25ac6a13b
Make exception formatting more robuts: pack all %-style formatting args explicitely into tuples
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
449
diff
changeset
|
165 raise ValueError("Not a boolean: %r" % (s, )) |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
166 return self._BOOL_CVT[sl] |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
167 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
168 return s |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
169 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
170 def getfirstboolvar_s(self, *varnames, **kwds): |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
171 """A variant of :meth:`~.getboolvar_s` that returns the first found |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
172 variable in the list of given variables in `varnames`. |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
173 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
174 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
175 s = self.getfirstvar_s(*varnames, **kwds) |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
176 if isinstance(s, _TEXTTYPE): |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
177 sl = s.strip().lower() |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
178 if sl not in self._BOOL_CVT: |
|
450
12f25ac6a13b
Make exception formatting more robuts: pack all %-style formatting args explicitely into tuples
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
449
diff
changeset
|
179 raise ValueError("Not a boolean: %r" % (s, )) |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
180 return self._BOOL_CVT[sl] |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
181 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
182 return s |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
183 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
184 # Conversion of booleans |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
185 _BOOL_CVT = { |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
186 u('1'): True, u('yes'): True, u('true'): True, u('on'): True, |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
187 u('0'): False, u('no'): False, u('false'): False, u('off'): False |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
188 } |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
189 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
190 def getfloatvarl_s(self, *path, **kwds): |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
191 """Get a (possibly substituted) variable and convert text to a |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
192 float |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
193 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
194 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
195 s = self.getvarl_s(*path, **kwds) |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
196 if isinstance(s, _TEXTTYPE): |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
197 return float(s) |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
198 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
199 return s |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
200 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
201 def getfirstfloatvarl_s(self, *path, **kwds): |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
202 """Get a (possibly substituted) variable and convert text to a |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
203 float |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
204 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
205 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
206 s = self.getfirstvarl_s(*path, **kwds) |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
207 if isinstance(s, _TEXTTYPE): |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
208 return float(s) |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
209 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
210 return s |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
211 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
212 def getfloatvar_s(self, varname, default=_MARKER): |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
213 """Get a (possibly substituted) variable and convert text to a |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
214 float |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
215 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
216 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
217 s = self.getvar_s(varname, default) |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
218 if isinstance(s, _TEXTTYPE): |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
219 return float(s) |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
220 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
221 return s |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
222 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
223 def getfirstfloatvar_s(self, varname, default=_MARKER): |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
224 """Get a (possibly substituted) variable and convert text to a |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
225 float |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
226 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
227 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
228 s = self.getfirstvar_s(varname, default) |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
229 if isinstance(s, _TEXTTYPE): |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
230 return float(s) |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
231 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
232 return s |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
233 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
234 |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
235 # Speed |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
236 _EMPTY_STR = u("") |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
237 _TEXTTYPE = type(_EMPTY_STR) |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
238 _STARTTOK = u(b"{{") |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
239 _ENDTOK = u(b"}}") |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
240 _HIER_SEPARATOR = u(b'.') |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
241 _NS_SEPARATOR = u(b':') |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
242 _FILTER_SEPARATOR = u(b'|') |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
243 _STARTTOK_REF = _STARTTOK + REF_NAMESPACE + _NS_SEPARATOR |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
244 _ENDTOK_REF = _ENDTOK |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
245 _DOT = u(b'.') |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
246 _QUOTE = u(b'%') |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
247 _QUOTE_x = u(b'x') |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
248 _QUOTE_u = u(b'u') |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
249 _QUOTE_U = u(b'U') |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
250 _COMMENT = u(b'#') |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
251 _QUOTE_MAP = { |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
252 0x25: u(b'%x25'), # _QUOTE |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
253 0x2e: u(b'%x2e'), # _DOT |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
254 0x3a: u(b'%x3a'), # _NS_SEPARATOR |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
255 0x23: u(b'%x23'), # _COMMENT / anchor |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
256 0x7c: u(b'%x7c'), # _FILTER_SEPARATOR |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
257 0x22: u(b'%x22'), |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
258 0x27: u(b'%x27'), |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
259 0x7b: u(b'%x7b'), |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
260 0x7d: u(b'%x7d'), |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
261 0x5b: u(b'%x5b'), |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
262 0x5d: u(b'%x5d'), |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
263 } |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
264 _QUOTE_SAFE = u(b'abcdefghijklmnopqrstuvwxyz' |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
265 b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
266 b'0123456789' |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
267 b'-_@!$&/\\()=?*+~;,<>^') |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
268 """Mostly used configuration key characters that do not need any quoting |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
269 |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
270 """ |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
271 |
|
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
272 |
|
550
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
548
diff
changeset
|
273 def py_quote(s): |
|
502
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
274 """Replace important special characters in string `s` by replacing |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
275 them with ``%xNN`` where `NN` are the two hexadecimal digits of the |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
276 characters unicode codepoint value. |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
277 |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
278 Handled are the important special chars: ``%``, ``.``, ``:``, |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
279 ``#``; ``'``, ``"``, ``|``, ``{``, ``}``, ``[`` and ``]``. |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
280 |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
281 See also the :ref:`quoting` section. |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
282 |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
283 """ |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
284 # Quick check whether all of the chars are in _QUOTE_SAFE |
|
504
4dbc16ff2670
.lstrip() seems to be a little bit faster than .rstrip() when testing whether quoting is needed
Franz Glasner <fzglas.hg@dom66.de>
parents:
503
diff
changeset
|
285 if not s.lstrip(_QUOTE_SAFE): |
|
502
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
286 return s |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
287 |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
288 # Slow path |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
289 re_encode = False |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
290 if PY2: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
291 # Use the Unicode translation variant in PY2 |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
292 if isinstance(s, str): |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
293 s = s.decode("latin1") |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
294 re_encode = True |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
295 s = s.translate(_QUOTE_MAP) |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
296 if re_encode: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
297 return s.encode("latin1") |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
298 else: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
299 return s |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
300 |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
301 |
|
550
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
548
diff
changeset
|
302 if fast_quote: |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
548
diff
changeset
|
303 quote = fast_quote |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
548
diff
changeset
|
304 else: |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
548
diff
changeset
|
305 quote = py_quote |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
548
diff
changeset
|
306 |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
548
diff
changeset
|
307 |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
308 def py_unquote(s): |
|
502
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
309 """Unquote the content of `s`: handle all patterns ``%xNN``, |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
310 ``%uNNNN`` or ``%UNNNNNNNN``. |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
311 |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
312 This is the inverse of :func:`.quote`. |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
313 |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
314 """ |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
315 if _QUOTE not in s: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
316 return s |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
317 parts = s.split(_QUOTE) |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
318 res = [parts[0]] |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
319 res_append = res.append |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
320 for p in parts[1:]: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
321 try: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
322 qc = p[0] |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
323 except IndexError: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
324 raise ValueError("unknown quote syntax string: {}".format(s)) |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
325 if qc == _QUOTE_x: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
326 if len(p) < 3: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
327 raise ValueError("quote syntax: length too small") |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
328 res_append(uchr(int(p[1:3], 16))) |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
329 res_append(p[3:]) |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
330 elif qc == _QUOTE_u: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
331 if len(p) < 5: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
332 raise ValueError("quote syntax: length too small") |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
333 res_append(uchr(int(p[1:5], 16))) |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
334 res_append(p[5:]) |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
335 elif qc == _QUOTE_U: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
336 if len(p) < 9: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
337 raise ValueError("quote syntax: length too small") |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
338 res_append(uchr(int(p[1:9], 16))) |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
339 res_append(p[9:]) |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
340 else: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
341 raise ValueError("unknown quote syntax string: {}".format(s)) |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
342 return _EMPTY_STR.join(res) |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
343 |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
344 |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
345 if fast_unquote: |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
346 unquote = fast_unquote |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
347 else: |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
348 unquote = py_unquote |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
349 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
350 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
351 def py_pathstr2path(varname): |
|
539
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
352 """Parse a dot-separated path string `varname` into a tuple of |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
353 unquoted path items |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
354 |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
355 :param str varname: The quoted and dot-separated path string |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
356 :return: The unquoted and parsed path items |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
357 :rtype: tuple |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
358 |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
359 Used e.g. by :meth:`~.Configuration.getvar`, |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
360 :meth:`~.Configuration.getvar_s` and :meth:`~.Configuration.jailed`. |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
361 |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
362 The returned value is suitable as input for |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
363 :meth:`~.Configuration.getvarl`, :meth:`~.Configuration.getvarl_s` and |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
364 friends. |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
365 |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
366 An empty `varname` returns an empty tuple. |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
367 |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
368 """ |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
369 # |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
370 # Because str.split yields a non-empty list for an empty string handle |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
371 # the empty string separately. |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
372 # |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
373 if varname: |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
374 return tuple([unquote(p) for p in varname.split(_HIER_SEPARATOR)]) |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
375 else: |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
376 return tuple() |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
377 |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
378 |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
379 if fast_pathstr2path: |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
380 pathstr2path = fast_pathstr2path |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
381 else: |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
382 pathstr2path = py_pathstr2path |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
383 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
384 |
|
543
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
385 def _py_split_ns(varname): |
|
541
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
386 """Split the variable name string `varname` into the namespace and |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
387 the namespace-specific name |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
388 |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
389 :type varname: str |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
390 :return: A tuple containing the namespace (or `None`) and the |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
391 namespace-specific (variable-)name |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
392 :rtype: tuple(str or None, str) |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
393 |
|
543
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
394 .. note:: The returned namespace may be an empty string if the namespace |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
395 separator is found. |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
396 |
|
541
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
397 """ |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
398 ns, sep, rest = varname.partition(_NS_SEPARATOR) |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
399 if sep: |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
400 return (unquote(ns), rest) |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
401 else: |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
402 return (None, ns) |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
403 |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
404 |
|
543
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
405 if _fast_split_ns: |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
406 _split_ns = _fast_split_ns |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
407 else: |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
408 _split_ns = _py_split_ns |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
409 |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
410 |
|
552
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
551
diff
changeset
|
411 def _py_split_filters(varname): |
|
541
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
412 """Split off the filter part from the `varname` string |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
413 |
|
542
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
414 :type varname: str |
|
541
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
415 :return: The tuple of the variable name without the filters and a list |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
416 of filters |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
417 :rtype: tuple(str, list) |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
418 |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
419 """ |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
420 name, sep, filters = varname.partition(_FILTER_SEPARATOR) |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
421 if sep: |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
422 filters = filters.strip() |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
423 if filters: |
|
553
9d2bd411f5c5
Do not rstrip() the remaining variable name when parsing out filters from variable names
Franz Glasner <fzglas.hg@dom66.de>
parents:
552
diff
changeset
|
424 return (name, filters.split(_FILTER_SEPARATOR)) |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
425 else: |
|
553
9d2bd411f5c5
Do not rstrip() the remaining variable name when parsing out filters from variable names
Franz Glasner <fzglas.hg@dom66.de>
parents:
552
diff
changeset
|
426 return (name, []) |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
427 else: |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
428 return (name, []) |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
429 |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
430 |
|
552
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
551
diff
changeset
|
431 if _fast_split_filters: |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
551
diff
changeset
|
432 _split_filters = _fast_split_filters |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
551
diff
changeset
|
433 else: |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
551
diff
changeset
|
434 _split_filters = _py_split_filters |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
551
diff
changeset
|
435 |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
551
diff
changeset
|
436 |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
437 class Configuration(CoercingMethodsMixin, _AttributeDict): |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
438 |
| 18 | 439 """The configuration dictionary with attribute support or |
| 440 variable substitution. | |
| 441 | |
| 322 | 442 .. note:: When retrieving by attribute names variables will *not* |
| 18 | 443 substituted. |
| 444 | |
| 445 """ | |
| 446 | |
|
404
6a5aea02f3d0
Implement a ".is_jail" flag for configuration objects: to test/assert whether we expect a jail configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
400
diff
changeset
|
447 is_jail = False |
|
6a5aea02f3d0
Implement a ".is_jail" flag for configuration objects: to test/assert whether we expect a jail configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
400
diff
changeset
|
448 """Flag to show that this is not a jail for another configuration""" |
|
6a5aea02f3d0
Implement a ".is_jail" flag for configuration objects: to test/assert whether we expect a jail configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
400
diff
changeset
|
449 |
|
499
f46932e8a84c
Configuration._lookupvar() now uses an internal cache (positive and negative).
Franz Glasner <fzglas.hg@dom66.de>
parents:
497
diff
changeset
|
450 def __init__(self, *args, **kwds): |
|
f46932e8a84c
Configuration._lookupvar() now uses an internal cache (positive and negative).
Franz Glasner <fzglas.hg@dom66.de>
parents:
497
diff
changeset
|
451 # |
|
f46932e8a84c
Configuration._lookupvar() now uses an internal cache (positive and negative).
Franz Glasner <fzglas.hg@dom66.de>
parents:
497
diff
changeset
|
452 # PY2.7 compat: must be set before calling the superclass' __init__ |
|
f46932e8a84c
Configuration._lookupvar() now uses an internal cache (positive and negative).
Franz Glasner <fzglas.hg@dom66.de>
parents:
497
diff
changeset
|
453 # |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
454 self.enable_cache() |
|
499
f46932e8a84c
Configuration._lookupvar() now uses an internal cache (positive and negative).
Franz Glasner <fzglas.hg@dom66.de>
parents:
497
diff
changeset
|
455 super(Configuration, self).__init__(*args, **kwds) |
|
f46932e8a84c
Configuration._lookupvar() now uses an internal cache (positive and negative).
Franz Glasner <fzglas.hg@dom66.de>
parents:
497
diff
changeset
|
456 |
|
506
dffa692751b1
Implement clear_cache() for the configuration
Franz Glasner <fzglas.hg@dom66.de>
parents:
504
diff
changeset
|
457 def clear_cache(self): |
| 529 | 458 """Clear the internal lookup cache and the interpolation cache""" |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
459 if self.__lookup_cache is not None: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
460 self.__lookup_cache.clear() |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
461 if self.__interpolation_cache is not None: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
462 self.__interpolation_cache.clear() |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
463 |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
464 def disable_cache(self): |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
465 self.__lookup_cache = None |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
466 self.__interpolation_cache = None |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
467 |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
468 def enable_cache(self): |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
469 self.__lookup_cache = {} |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
470 self.__interpolation_cache = {} |
|
506
dffa692751b1
Implement clear_cache() for the configuration
Franz Glasner <fzglas.hg@dom66.de>
parents:
504
diff
changeset
|
471 |
|
437
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
472 def __getitem__(self, key): |
| 469 | 473 """Mapping and list interface that forwards to :meth:`~.getvarl_s` |
|
437
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
474 |
|
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
475 """ |
|
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
476 if isinstance(key, (tuple, list)): |
|
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
477 return self.getvarl_s(*key) |
|
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
478 else: |
|
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
479 return self.getvarl_s(key) |
|
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
480 |
|
442
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
481 def get(self, key, default=None): |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
482 """Mapping interface that forwards to :meth:`~.getvarl_s` |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
483 |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
484 """ |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
485 if isinstance(key, (tuple, list)): |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
486 return self.getvarl_s(*key, default=default) |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
487 else: |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
488 return self.getvarl_s(key, default=default) |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
489 |
|
439
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
490 def __contains__(self, key): |
| 469 | 491 """Containment test""" |
|
439
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
492 if isinstance(key, (tuple, list)): |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
493 # No namespace and quoting support here |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
494 try: |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
495 self._lookupvar(*key) |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
496 except KeyError: |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
497 return False |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
498 else: |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
499 return True |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
500 else: |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
501 return super(Configuration, self).__contains__(key) |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
502 |
|
443
23941c014130
FIX: Merge properly when the configuration's __getitem__ do now interpolate: prohibit duplicate interpolation and interpolation while merging
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
503 def getitem_ns(self, key): |
|
23941c014130
FIX: Merge properly when the configuration's __getitem__ do now interpolate: prohibit duplicate interpolation and interpolation while merging
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
504 """Just forward to the *original* :meth:`dict.__getitem__`. |
|
23941c014130
FIX: Merge properly when the configuration's __getitem__ do now interpolate: prohibit duplicate interpolation and interpolation while merging
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
505 |
|
23941c014130
FIX: Merge properly when the configuration's __getitem__ do now interpolate: prohibit duplicate interpolation and interpolation while merging
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
506 No variable interpolation and key path access. |
|
23941c014130
FIX: Merge properly when the configuration's __getitem__ do now interpolate: prohibit duplicate interpolation and interpolation while merging
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
507 |
|
23941c014130
FIX: Merge properly when the configuration's __getitem__ do now interpolate: prohibit duplicate interpolation and interpolation while merging
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
508 """ |
|
23941c014130
FIX: Merge properly when the configuration's __getitem__ do now interpolate: prohibit duplicate interpolation and interpolation while merging
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
509 return super(Configuration, self).__getitem__(key) |
|
23941c014130
FIX: Merge properly when the configuration's __getitem__ do now interpolate: prohibit duplicate interpolation and interpolation while merging
Franz Glasner <fzglas.hg@dom66.de>
parents:
442
diff
changeset
|
510 |
|
517
328af767f5f8
Implement Configuration.items() and Configuration.values() without interpolating the values
Franz Glasner <fzglas.hg@dom66.de>
parents:
516
diff
changeset
|
511 def items(self): |
|
328af767f5f8
Implement Configuration.items() and Configuration.values() without interpolating the values
Franz Glasner <fzglas.hg@dom66.de>
parents:
516
diff
changeset
|
512 """Items without interpolation""" |
|
328af767f5f8
Implement Configuration.items() and Configuration.values() without interpolating the values
Franz Glasner <fzglas.hg@dom66.de>
parents:
516
diff
changeset
|
513 for k in self: |
|
328af767f5f8
Implement Configuration.items() and Configuration.values() without interpolating the values
Franz Glasner <fzglas.hg@dom66.de>
parents:
516
diff
changeset
|
514 yield (k, self.getitem_ns(k)) |
|
328af767f5f8
Implement Configuration.items() and Configuration.values() without interpolating the values
Franz Glasner <fzglas.hg@dom66.de>
parents:
516
diff
changeset
|
515 |
|
328af767f5f8
Implement Configuration.items() and Configuration.values() without interpolating the values
Franz Glasner <fzglas.hg@dom66.de>
parents:
516
diff
changeset
|
516 def values(self): |
|
328af767f5f8
Implement Configuration.items() and Configuration.values() without interpolating the values
Franz Glasner <fzglas.hg@dom66.de>
parents:
516
diff
changeset
|
517 """Values without interpolation""" |
|
328af767f5f8
Implement Configuration.items() and Configuration.values() without interpolating the values
Franz Glasner <fzglas.hg@dom66.de>
parents:
516
diff
changeset
|
518 for k in self: |
|
328af767f5f8
Implement Configuration.items() and Configuration.values() without interpolating the values
Franz Glasner <fzglas.hg@dom66.de>
parents:
516
diff
changeset
|
519 yield self.getitem_ns(k) |
|
328af767f5f8
Implement Configuration.items() and Configuration.values() without interpolating the values
Franz Glasner <fzglas.hg@dom66.de>
parents:
516
diff
changeset
|
520 |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
521 def py_getvarl(self, *path, **kwds): |
|
382
24db29162d09
Renamed "names" arguments into the more proper "path"
Franz Glasner <fzglas.hg@dom66.de>
parents:
381
diff
changeset
|
522 """Get a variable where the hierarchy is given in `path` as sequence |
|
380
bb4a90fb58e0
Docu: "namespace" in getvarl() is a keyword argument
Franz Glasner <fzglas.hg@dom66.de>
parents:
374
diff
changeset
|
523 and the namespace is given in the `namespace` keyword argument. |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
524 |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
525 No variable interpolation is done and no filters are applied. |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
526 |
|
382
24db29162d09
Renamed "names" arguments into the more proper "path"
Franz Glasner <fzglas.hg@dom66.de>
parents:
381
diff
changeset
|
527 Quoting of `path` and `namespace` is *not* needed and wrong. |
| 333 | 528 |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
529 """ |
|
321
7a0f3c256cf4
FIX: Python2 compatibility: keyword arguments after *args not allowed: use **kwds and manual retrieval with .pop() instead
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
320
diff
changeset
|
530 default = kwds.pop("default", _MARKER) |
|
7a0f3c256cf4
FIX: Python2 compatibility: keyword arguments after *args not allowed: use **kwds and manual retrieval with .pop() instead
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
320
diff
changeset
|
531 namespace = kwds.pop("namespace", None) |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
532 try: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
533 if not namespace: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
534 lookupfn = self._lookupvar |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
535 else: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
536 if namespace == REF_NAMESPACE: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
537 lookupfn = self._lookupref |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
538 else: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
539 lookupfn = lookup_varns(namespace) |
|
382
24db29162d09
Renamed "names" arguments into the more proper "path"
Franz Glasner <fzglas.hg@dom66.de>
parents:
381
diff
changeset
|
540 varvalue = lookupfn(*path) |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
541 except KeyError: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
542 if default is _MARKER: |
|
382
24db29162d09
Renamed "names" arguments into the more proper "path"
Franz Glasner <fzglas.hg@dom66.de>
parents:
381
diff
changeset
|
543 raise KeyError("Variable %r not found" % (path,)) |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
544 else: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
545 return default |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
546 else: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
547 return varvalue |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
548 |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
549 if _fast_getvarl: |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
550 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
551 def fast_getvarl(self, *args, **kwds): |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
552 return _fast_getvarl(self, args, **kwds) |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
553 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
554 getvarl = fast_getvarl |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
555 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
556 else: |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
557 getvarl = py_getvarl |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
558 |
|
418
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
559 def getkeysl(self, *path, **kwds): |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
560 """Yield the keys of a variable value. |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
561 |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
562 :rtype: A generator |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
563 :raise KeyError: |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
564 |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
565 .. note:: Dictionary keys are not subject to interpolation. |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
566 |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
567 """ |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
568 if "default" in kwds: |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
569 raise TypeError("got unexpected keyword argument: default") |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
570 for k in self.getvarl(*path, **kwds).keys(): |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
571 yield k |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
572 |
|
381
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
573 def getfirstvarl(self, *paths, **kwds): |
|
385
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
574 """A variant of :meth:`~.getvarl` that returns the first found |
|
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
575 variable in the `paths` list. |
|
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
576 |
|
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
577 Every item in `paths` is either a `tuple` or `list` or a `dict`. |
|
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
578 If the path item is a `dict` then it must have two keys "namespace" |
|
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
579 and "path". |
|
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
580 If the path item is a `list` or `tuple` then the namespace is assumed |
|
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
581 to be `None`. |
|
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
582 |
| 389 | 583 Note that a caller that wants to use variables from a non-default |
| 584 namespace must use a sequence of dicts. | |
| 585 | |
|
385
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
586 No variable interpolation is done and no filters are applied. |
|
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
587 |
|
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
588 Quoting of anything in `paths` is *not* needed and wrong. |
|
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
589 |
|
395
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
590 """ |
|
381
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
591 default = kwds.pop("default", _MARKER) |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
592 for path in paths: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
593 if isinstance(path, (list, tuple)): |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
594 try: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
595 varvalue = self.getvarl(*path) |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
596 except KeyError: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
597 pass |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
598 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
599 return varvalue |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
600 elif isinstance(path, dict): |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
601 try: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
602 namespace = path["namespace"] |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
603 p = path["path"] |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
604 except KeyError: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
605 raise TypeError("a paths dict item must have a `path'" |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
606 " and a `namespace' key") |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
607 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
608 try: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
609 varvalue = self.getvarl(*p, namespace=namespace) |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
610 except KeyError: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
611 pass |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
612 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
613 return varvalue |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
614 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
615 raise TypeError("a paths item must be a dict, list or tuple") |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
616 if default is _MARKER: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
617 raise KeyError( |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
618 "none of the given variables found: %r" % (paths,)) |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
619 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
620 return default |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
621 |
|
610
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
622 def py_getvar(self, varname, default=_MARKER): |
|
115
a5339d39af5c
Begin the documentation of variables and its expansion
Franz Glasner <hg@dom66.de>
parents:
104
diff
changeset
|
623 """Get a variable of the form ``[ns:][[key1.]key2.]name`` - including |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
624 variables from other namespaces. |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
625 |
|
202
2e66178a09d8
Docu: Ban "keyword expansion" -- use "variable interpolation" instead
Franz Glasner <fzglas.hg@dom66.de>
parents:
156
diff
changeset
|
626 No variable interpolation is done and no filters are applied. |
|
115
a5339d39af5c
Begin the documentation of variables and its expansion
Franz Glasner <hg@dom66.de>
parents:
104
diff
changeset
|
627 |
| 333 | 628 Special characters (e.g. ``:`` and ``.``) must be quoted when using |
| 629 the default namespace. | |
| 630 | |
|
502
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
631 See also :func:`.quote`. |
| 333 | 632 |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
633 """ |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
634 varns, varname = _split_ns(varname) |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
635 if not varns: |
|
539
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
636 return self.getvarl(*pathstr2path(varname), default=default) |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
637 else: |
|
539
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
638 return self.getvarl(varname, namespace=varns, default=default) |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
639 |
|
610
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
640 if _fast_getvar: |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
641 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
642 def fast_getvar(self, varname, default=_MARKER): |
|
640
d35f41e15404
Style: remove trailing semicolon in Python script
Franz Glasner <fzglas.hg@dom66.de>
parents:
637
diff
changeset
|
643 return _fast_getvar(self, varname, default) |
|
610
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
644 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
645 getvar = fast_getvar |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
646 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
647 else: |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
648 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
649 getvar = py_getvar |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
650 |
|
418
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
651 def getkeys(self, varname): |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
652 """Yield all the keys of a variable value. |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
653 |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
654 :rtype: A generator |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
655 :raise KeyError: |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
656 |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
657 .. note:: Dictionary keys are not subject to interpolation. |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
658 |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
659 """ |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
660 for k in self.getvar(varname).keys(): |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
661 yield k |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
662 |
|
368
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
663 def getfirstvar(self, *varnames, **kwds): |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
664 """A variant of :meth:`~.getvar` that returns the first found variable |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
665 in the list of given variables in `varnames`. |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
666 |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
667 """ |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
668 default = kwds.pop("default", _MARKER) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
669 for varname in varnames: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
670 try: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
671 varvalue = self.getvar(varname) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
672 except KeyError: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
673 pass |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
674 else: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
675 return varvalue |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
676 if default is _MARKER: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
677 raise KeyError( |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
678 "none of the given variables found: %r" % (varnames,)) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
679 else: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
680 return default |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
681 |
|
610
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
682 def py_getvarl_s(self, *path, **kwds): |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
683 """Get a variable - including variables from other namespaces. |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
684 |
|
382
24db29162d09
Renamed "names" arguments into the more proper "path"
Franz Glasner <fzglas.hg@dom66.de>
parents:
381
diff
changeset
|
685 `path` and `namespace` are interpreted as in |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
686 :meth:`.getvarl`. But variables will be interpolated |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
687 recursively within the variable values and filters are |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
688 applied. |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
689 |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
690 For more details see chapter :ref:`variable-interpolation`. |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
691 |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
692 """ |
|
321
7a0f3c256cf4
FIX: Python2 compatibility: keyword arguments after *args not allowed: use **kwds and manual retrieval with .pop() instead
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
320
diff
changeset
|
693 default = kwds.pop("default", _MARKER) |
|
7a0f3c256cf4
FIX: Python2 compatibility: keyword arguments after *args not allowed: use **kwds and manual retrieval with .pop() instead
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
320
diff
changeset
|
694 namespace = kwds.pop("namespace", None) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
695 try: |
|
382
24db29162d09
Renamed "names" arguments into the more proper "path"
Franz Glasner <fzglas.hg@dom66.de>
parents:
381
diff
changeset
|
696 obj = self.getvarl(*path, namespace=namespace) |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
697 return self.substitute_variables_in_obj(obj) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
698 except KeyError: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
699 if default is _MARKER: |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
700 raise |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
701 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
702 return default |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
703 |
|
610
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
704 if _fast_getvarl_s: |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
705 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
706 def fast_getvarl_s(self, *path, **kwds): |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
707 return _fast_getvarl_s(self, path, **kwds) |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
708 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
709 getvarl_s = fast_getvarl_s |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
710 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
711 else: |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
712 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
713 getvarl_s = py_getvarl_s |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
714 |
|
381
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
715 def getfirstvarl_s(self, *paths, **kwds): |
|
388
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
716 """A variant of :meth:`~.getfirstvarl` that does variable |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
717 interpolation. |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
718 |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
719 `paths` and `kwds` are interpreted as in :meth:`.getfirstvarl`. |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
720 But variables will be interpolated |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
721 recursively within the variable values and filters are |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
722 applied. |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
723 |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
724 For more details see chapter :ref:`variable-interpolation`. |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
725 |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
726 """ |
|
381
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
727 default = kwds.pop("default", _MARKER) |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
728 for path in paths: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
729 if isinstance(path, (list, tuple)): |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
730 try: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
731 obj = self.getvarl(*path) |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
732 except KeyError: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
733 pass |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
734 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
735 return self.substitute_variables_in_obj(obj) |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
736 |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
737 elif isinstance(path, dict): |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
738 try: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
739 namespace = path["namespace"] |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
740 p = path["path"] |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
741 except KeyError: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
742 raise TypeError("a paths dict item must have a `path'" |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
743 " and a `namespace' key") |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
744 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
745 try: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
746 obj = self.getvarl(*p, namespace=namespace) |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
747 except KeyError: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
748 pass |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
749 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
750 return self.substitute_variables_in_obj(obj) |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
751 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
752 raise TypeError("a paths item must be a dict, list or tuple") |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
753 if default is _MARKER: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
754 raise KeyError( |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
755 "none of the given variables found: %r" % (paths,)) |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
756 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
757 return default |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
758 |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
759 def py_getvar_s(self, varname, default=_MARKER): |
|
24
fa65adab0b71
FIX: Typo in comment
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
23
diff
changeset
|
760 """Get a variable - including variables from other namespaces. |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
761 |
|
115
a5339d39af5c
Begin the documentation of variables and its expansion
Franz Glasner <hg@dom66.de>
parents:
104
diff
changeset
|
762 `varname` is interpreted as in :meth:`.getvar`. But variables |
|
202
2e66178a09d8
Docu: Ban "keyword expansion" -- use "variable interpolation" instead
Franz Glasner <fzglas.hg@dom66.de>
parents:
156
diff
changeset
|
763 will be interpolated recursively within the variable values |
|
2e66178a09d8
Docu: Ban "keyword expansion" -- use "variable interpolation" instead
Franz Glasner <fzglas.hg@dom66.de>
parents:
156
diff
changeset
|
764 and filters are applied. |
|
115
a5339d39af5c
Begin the documentation of variables and its expansion
Franz Glasner <hg@dom66.de>
parents:
104
diff
changeset
|
765 |
|
202
2e66178a09d8
Docu: Ban "keyword expansion" -- use "variable interpolation" instead
Franz Glasner <fzglas.hg@dom66.de>
parents:
156
diff
changeset
|
766 For more details see chapter :ref:`variable-interpolation`. |
|
115
a5339d39af5c
Begin the documentation of variables and its expansion
Franz Glasner <hg@dom66.de>
parents:
104
diff
changeset
|
767 |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
768 """ |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
769 varns, varname = _split_ns(varname) |
|
539
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
770 try: |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
771 if not varns: |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
772 return self.substitute_variables_in_obj( |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
773 self.getvarl(*pathstr2path(varname))) |
|
524
09b8e28b7a44
Implement Configuration.getvar_s() by using Configuration.getvarl() instead of Configuration.getvar().
Franz Glasner <fzglas.hg@dom66.de>
parents:
523
diff
changeset
|
774 else: |
|
539
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
775 return self.substitute_variables_in_obj( |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
776 self.getvarl(varname, namespace=varns)) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
777 except KeyError: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
778 if default is _MARKER: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
779 raise |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
780 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
781 return default |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
782 |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
783 if _fast_getvar_s: |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
784 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
785 def fast_getvar_s(self, varname, default=_MARKER): |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
786 return _fast_getvar_s(self, varname, default) |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
787 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
788 getvar_s = fast_getvar_s |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
789 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
790 else: |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
791 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
792 getvar_s = py_getvar_s |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
793 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
794 def _py_getvar_s_with_cache_info(self, varname): |
|
530
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
795 """Internal variant of :meth:`~.getvar_s` that returns some information |
|
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
796 whether caching of interpolated values is allowed |
|
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
797 |
|
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
798 Caching is currently not allowed when namespaces are used. |
|
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
799 |
|
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
800 Currently used by :meth:`~.interpolate_variables`. |
|
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
801 |
|
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
802 """ |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
803 varns, varname = _split_ns(varname) |
|
530
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
804 if not varns: |
|
539
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
805 # no namespace -> cacheable |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
806 return ( |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
807 self.substitute_variables_in_obj( |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
808 self.getvarl(*pathstr2path(varname))), |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
809 True |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
810 ) |
|
530
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
811 else: |
|
539
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
812 # results from namespaced lookups are currently not cacheable |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
813 return ( |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
814 self.substitute_variables_in_obj( |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
815 self.getvarl(varname, namespace=varns)), |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
816 False |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
817 ) |
|
530
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
818 |
|
368
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
819 def getfirstvar_s(self, *varnames, **kwds): |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
820 """A variant of :meth:`~.getvar_s` that returns the first found |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
821 variable in the list of given variables in `varnames`. |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
822 |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
823 """ |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
824 default = kwds.pop("default", _MARKER) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
825 for varname in varnames: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
826 try: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
827 obj = self.getvar(varname) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
828 except KeyError: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
829 pass |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
830 else: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
831 return self.substitute_variables_in_obj(obj) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
832 if default is _MARKER: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
833 raise KeyError( |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
834 "none of the given variables found: %r" % (varnames,)) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
835 else: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
836 return default |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
837 |
|
489
b49164db1273
Remove unused keyword params for ._lookupvar().
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
488
diff
changeset
|
838 def _lookupvar(self, *path): |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
839 """Lookup a variable within a hierarchy. |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
840 |
|
489
b49164db1273
Remove unused keyword params for ._lookupvar().
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
488
diff
changeset
|
841 :raise KeyError: An unexisting `path` raises a `KeyError` |
|
b49164db1273
Remove unused keyword params for ._lookupvar().
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
488
diff
changeset
|
842 |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
843 """ |
|
419
079a82129110
Allow the empty variable name to retrieve the root configuration object
Franz Glasner <fzglas.hg@dom66.de>
parents:
418
diff
changeset
|
844 if not path: |
|
079a82129110
Allow the empty variable name to retrieve the root configuration object
Franz Glasner <fzglas.hg@dom66.de>
parents:
418
diff
changeset
|
845 return self |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
846 use_cache = self.__lookup_cache is not None |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
847 if use_cache: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
848 v = self.__lookup_cache.get(path, _MARKER) |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
849 if v is not _MARKER: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
850 if v is _MISSING: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
851 raise KeyError( |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
852 "Configuration variable %r not found" |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
853 " (negative internal cache value)" % (path,)) |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
854 else: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
855 return v |
|
493
6a0f761ff35b
Remove default (i.e. all keyword arguments) from .expand_if_reference() because no-one uses it
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
491
diff
changeset
|
856 eiref = self.expand_if_reference |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
857 try: |
|
493
6a0f761ff35b
Remove default (i.e. all keyword arguments) from .expand_if_reference() because no-one uses it
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
491
diff
changeset
|
858 v = eiref(super(Configuration, self).__getitem__(path[0])) |
|
382
24db29162d09
Renamed "names" arguments into the more proper "path"
Franz Glasner <fzglas.hg@dom66.de>
parents:
381
diff
changeset
|
859 for p in path[1:]: |
|
493
6a0f761ff35b
Remove default (i.e. all keyword arguments) from .expand_if_reference() because no-one uses it
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
491
diff
changeset
|
860 v = eiref(v[p]) |
|
104
d9f9a06e0c49
Make a better error message for "TypeError" exceptions when looking up variables.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
82
diff
changeset
|
861 except TypeError: |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
862 if use_cache: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
863 self.__lookup_cache[path] = _MISSING |
|
207
b3b5ed34d180
Handle most flake8 errors and warnings.
Franz Glasner <fzglas.hg@dom66.de>
parents:
202
diff
changeset
|
864 raise KeyError( |
|
b3b5ed34d180
Handle most flake8 errors and warnings.
Franz Glasner <fzglas.hg@dom66.de>
parents:
202
diff
changeset
|
865 "Configuration variable %r not found" |
|
382
24db29162d09
Renamed "names" arguments into the more proper "path"
Franz Glasner <fzglas.hg@dom66.de>
parents:
381
diff
changeset
|
866 "(missing intermediate keys?)" % (path,)) |
|
499
f46932e8a84c
Configuration._lookupvar() now uses an internal cache (positive and negative).
Franz Glasner <fzglas.hg@dom66.de>
parents:
497
diff
changeset
|
867 except KeyError: |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
868 if use_cache: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
869 self.__lookup_cache[path] = _MISSING |
|
499
f46932e8a84c
Configuration._lookupvar() now uses an internal cache (positive and negative).
Franz Glasner <fzglas.hg@dom66.de>
parents:
497
diff
changeset
|
870 raise |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
871 if use_cache: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
872 self.__lookup_cache[path] = v |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
873 return v |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
874 |
|
518
55b8aed70f7d
Remove unneeded "default" keyword argument for Configuration._lookupref() and Configuration.expand_ref_uri()
Franz Glasner <fzglas.hg@dom66.de>
parents:
517
diff
changeset
|
875 def _lookupref(self, key): |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
876 """ |
| 311 | 877 |
| 878 `key` must be a configuration reference URI without any | |
| 879 (namespace) prefixes and suffixes | |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
880 |
| 519 | 881 :raise KeyError: If the reference is not found |
| 882 | |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
883 """ |
|
518
55b8aed70f7d
Remove unneeded "default" keyword argument for Configuration._lookupref() and Configuration.expand_ref_uri()
Franz Glasner <fzglas.hg@dom66.de>
parents:
517
diff
changeset
|
884 return self.expand_ref_uri(key) |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
885 |
|
493
6a0f761ff35b
Remove default (i.e. all keyword arguments) from .expand_if_reference() because no-one uses it
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
491
diff
changeset
|
886 def expand_if_reference(self, v): |
| 311 | 887 """Check whether `v` is a configuration reference and -- if true -- |
| 888 then expand it. | |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
889 |
| 310 | 890 `v` must match the pattern ``{{ref:<REFERENCE>}}`` |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
891 |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
892 All non-matching texttypes and all non-texttypes are returned |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
893 unchanged. |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
894 |
|
493
6a0f761ff35b
Remove default (i.e. all keyword arguments) from .expand_if_reference() because no-one uses it
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
491
diff
changeset
|
895 :raise KeyError: If the reverence cannot found |
|
6a0f761ff35b
Remove default (i.e. all keyword arguments) from .expand_if_reference() because no-one uses it
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
491
diff
changeset
|
896 |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
897 """ |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
898 if not isinstance(v, _TEXTTYPE): |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
899 return v |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
900 if v.startswith(_STARTTOK_REF) and v.endswith(_ENDTOK_REF): |
|
488
298510ec8171
Simplify logic by not using many negations
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
487
diff
changeset
|
901 return self.expand_ref_uri( |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
902 v[len(_STARTTOK_REF):-len(_ENDTOK_REF)]) |
|
488
298510ec8171
Simplify logic by not using many negations
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
487
diff
changeset
|
903 else: |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
904 return v |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
905 |
|
518
55b8aed70f7d
Remove unneeded "default" keyword argument for Configuration._lookupref() and Configuration.expand_ref_uri()
Franz Glasner <fzglas.hg@dom66.de>
parents:
517
diff
changeset
|
906 def expand_ref_uri(self, uri): |
| 519 | 907 """ |
| 908 | |
| 909 :raises KeyError: If the reference URI is not found | |
| 910 | |
| 911 """ | |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
912 pu = urlsplit(uri) |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
913 if pu.scheme or pu.netloc or pu.path or pu.query: |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
914 raise ValueError("only fragment-only URIs are supported") |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
915 if not pu.fragment: |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
916 return self |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
917 if pu.fragment.startswith(_DOT): |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
918 raise ValueError("relative refs not supported") |
|
518
55b8aed70f7d
Remove unneeded "default" keyword argument for Configuration._lookupref() and Configuration.expand_ref_uri()
Franz Glasner <fzglas.hg@dom66.de>
parents:
517
diff
changeset
|
919 return self.getvar(pu.fragment) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
920 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
921 def substitute_variables_in_obj(self, obj): |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
922 """Recursively expand variables in the object tree `obj`.""" |
|
491
de776953337b
Remove repeated type(obj) calls
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
490
diff
changeset
|
923 ty = type(obj) |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
924 if issubclass(ty, _TEXTTYPE): |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
925 # a string - really replace the value |
|
525
be6ef72c55d5
Change Configuration.expand_variable() to Configuration.interpolate_variables()
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
524
diff
changeset
|
926 return self.interpolate_variables(obj) |
|
491
de776953337b
Remove repeated type(obj) calls
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
490
diff
changeset
|
927 elif issubclass(ty, dict): |
|
de776953337b
Remove repeated type(obj) calls
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
490
diff
changeset
|
928 newdict = ty() |
|
497
8e516f17cf95
Optimize .substitute_variables_in_obj: use dict.items() to avoid one dict lookup
Franz Glasner <fzglas.hg@dom66.de>
parents:
495
diff
changeset
|
929 for k, v in obj.items(): |
|
8e516f17cf95
Optimize .substitute_variables_in_obj: use dict.items() to avoid one dict lookup
Franz Glasner <fzglas.hg@dom66.de>
parents:
495
diff
changeset
|
930 newdict[k] = self.substitute_variables_in_obj(v) |
|
490
ea4b7fac02d6
Reorder type comparisons by usage
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
489
diff
changeset
|
931 return newdict |
|
491
de776953337b
Remove repeated type(obj) calls
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
490
diff
changeset
|
932 elif issubclass(ty, list): |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
933 return [self.substitute_variables_in_obj(i) for i in obj] |
|
491
de776953337b
Remove repeated type(obj) calls
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
490
diff
changeset
|
934 elif issubclass(ty, tuple): |
|
512
bf8a1b1498db
Remove a temporary variable usage
Franz Glasner <fzglas.hg@dom66.de>
parents:
511
diff
changeset
|
935 return ty([self.substitute_variables_in_obj(i) for i in obj]) |
|
491
de776953337b
Remove repeated type(obj) calls
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
490
diff
changeset
|
936 elif issubclass(ty, set): |
|
de776953337b
Remove repeated type(obj) calls
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
490
diff
changeset
|
937 newset = ty() |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
938 for i in obj: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
939 newset.add(self.substitute_variables_in_obj(i)) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
940 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
941 return obj |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
942 |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
943 def py_interpolate_variables(self, s): |
|
525
be6ef72c55d5
Change Configuration.expand_variable() to Configuration.interpolate_variables()
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
524
diff
changeset
|
944 """Expand all variables in the single string `s`""" |
|
551
4c968c5cfce6
Try to interpolate only if the length of the source string exceeds a minimum length
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
945 len_s = len(s) |
|
4c968c5cfce6
Try to interpolate only if the length of the source string exceeds a minimum length
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
946 if len_s < 4: |
|
4c968c5cfce6
Try to interpolate only if the length of the source string exceeds a minimum length
Franz Glasner <fzglas.hg@dom66.de>
parents:
550
diff
changeset
|
947 return s |
|
637
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
610
diff
changeset
|
948 if s == DEL_VALUE: |
|
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
610
diff
changeset
|
949 return s |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
950 start = s.find(_STARTTOK, 0) |
|
484
0259bd521729
Avoid repeaded string concatenations in .expand_variable(): use a list of string parts and proper indexes into the source string
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
483
diff
changeset
|
951 if start < 0: |
|
0259bd521729
Avoid repeaded string concatenations in .expand_variable(): use a list of string parts and proper indexes into the source string
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
483
diff
changeset
|
952 return s |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
953 use_cache = self.__interpolation_cache is not None |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
954 if use_cache: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
955 res = self.__interpolation_cache.get(s, _MARKER) |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
956 if res is not _MARKER: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
957 if res is _MISSING: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
958 warnings.warn("Cannot interpolate variables in string " |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
959 "%r (cached)" % (s, ), |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
960 UserWarning, |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
961 stacklevel=1) |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
962 raise KeyError("Cannot interpolate variables in string " |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
963 "%r (cached)" % (s, )) |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
964 else: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
965 return res |
|
484
0259bd521729
Avoid repeaded string concatenations in .expand_variable(): use a list of string parts and proper indexes into the source string
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
483
diff
changeset
|
966 res = [] |
|
0259bd521729
Avoid repeaded string concatenations in .expand_variable(): use a list of string parts and proper indexes into the source string
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
483
diff
changeset
|
967 res_append = res.append |
|
0259bd521729
Avoid repeaded string concatenations in .expand_variable(): use a list of string parts and proper indexes into the source string
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
483
diff
changeset
|
968 rest = 0 |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
969 cacheable = True |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
970 while start != -1: |
|
484
0259bd521729
Avoid repeaded string concatenations in .expand_variable(): use a list of string parts and proper indexes into the source string
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
483
diff
changeset
|
971 res_append(s[rest:start]) |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
972 end = s.find(_ENDTOK, start) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
973 if end < 0: |
|
484
0259bd521729
Avoid repeaded string concatenations in .expand_variable(): use a list of string parts and proper indexes into the source string
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
483
diff
changeset
|
974 rest = start |
|
0259bd521729
Avoid repeaded string concatenations in .expand_variable(): use a list of string parts and proper indexes into the source string
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
483
diff
changeset
|
975 break |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
976 varname, filters = _split_filters( |
|
539
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
977 s[start+2:end]) # noqa: E226 |
|
39
8715e5cc59ac
Print a warning if a variable cannot be expanded.
Franz Glasner <hg@dom66.de>
parents:
36
diff
changeset
|
978 try: |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
979 varvalue, cacheable = self._py_getvar_s_with_cache_info(varname) |
|
528
54a8d020f5d5
Apply None and Empty interpolation filters only on KeyErrors
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
527
diff
changeset
|
980 except KeyError: |
|
530
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
981 cacheable = True |
|
528
54a8d020f5d5
Apply None and Empty interpolation filters only on KeyErrors
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
527
diff
changeset
|
982 if NONE_FILTER in filters: |
|
54a8d020f5d5
Apply None and Empty interpolation filters only on KeyErrors
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
527
diff
changeset
|
983 varvalue = None |
|
54a8d020f5d5
Apply None and Empty interpolation filters only on KeyErrors
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
527
diff
changeset
|
984 elif EMPTY_FILTER in filters: |
|
54a8d020f5d5
Apply None and Empty interpolation filters only on KeyErrors
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
527
diff
changeset
|
985 varvalue = _EMPTY_STR |
|
349
83f76a41cf7c
Implement a special filter named "None" that suppresses "KeyErrors" from interpolation lookups and returns a Python "None" instead
Franz Glasner <fzglas.hg@dom66.de>
parents:
334
diff
changeset
|
986 else: |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
987 if use_cache and cacheable: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
988 self.__interpolation_cache[s] = _MISSING |
|
530
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
989 warnings.warn("Cannot interpolate variable %r in string " |
|
528
54a8d020f5d5
Apply None and Empty interpolation filters only on KeyErrors
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
527
diff
changeset
|
990 "%r" % (varname, s, ), |
|
54a8d020f5d5
Apply None and Empty interpolation filters only on KeyErrors
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
527
diff
changeset
|
991 UserWarning, |
|
54a8d020f5d5
Apply None and Empty interpolation filters only on KeyErrors
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
527
diff
changeset
|
992 stacklevel=1) |
|
54a8d020f5d5
Apply None and Empty interpolation filters only on KeyErrors
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
527
diff
changeset
|
993 raise |
|
530
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
994 if not cacheable: |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
995 cacheable = False |
|
528
54a8d020f5d5
Apply None and Empty interpolation filters only on KeyErrors
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
527
diff
changeset
|
996 varvalue = self._apply_filters(filters, varvalue) |
|
515
3387a9d5fb12
Performance: compute the length of the constant input strinc only once and compute the new rest earlier and use the computed value also in comparisons
Franz Glasner <fzglas.hg@dom66.de>
parents:
513
diff
changeset
|
997 rest = end + 2 |
|
251
2a8dcab2de8c
Do not implicitely convert a configuration value to text if the value is the result of just a variable expansion.
Franz Glasner <fzglas.hg@dom66.de>
parents:
250
diff
changeset
|
998 # |
|
350
9d729c479dc2
FIX: Do not apply the type convertion None -> "" if the expansions comprises the whole expression
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
349
diff
changeset
|
999 # Dont apply and type conversions to the variable value if |
|
9d729c479dc2
FIX: Do not apply the type convertion None -> "" if the expansions comprises the whole expression
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
349
diff
changeset
|
1000 # the whole `s` is just one expansion |
|
251
2a8dcab2de8c
Do not implicitely convert a configuration value to text if the value is the result of just a variable expansion.
Franz Glasner <fzglas.hg@dom66.de>
parents:
250
diff
changeset
|
1001 # |
|
515
3387a9d5fb12
Performance: compute the length of the constant input strinc only once and compute the new rest earlier and use the computed value also in comparisons
Franz Glasner <fzglas.hg@dom66.de>
parents:
513
diff
changeset
|
1002 if (start == 0) and (rest == len_s): |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
1003 if use_cache and cacheable: |
|
530
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
1004 self.__interpolation_cache[s] = varvalue |
|
251
2a8dcab2de8c
Do not implicitely convert a configuration value to text if the value is the result of just a variable expansion.
Franz Glasner <fzglas.hg@dom66.de>
parents:
250
diff
changeset
|
1005 return varvalue |
|
516
ad1e630ba736
FIX: Do not filter-out all False values then interpolating (zero int, boolean False)
Franz Glasner <fzglas.hg@dom66.de>
parents:
515
diff
changeset
|
1006 if varvalue is None: |
|
484
0259bd521729
Avoid repeaded string concatenations in .expand_variable(): use a list of string parts and proper indexes into the source string
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
483
diff
changeset
|
1007 pass |
|
0259bd521729
Avoid repeaded string concatenations in .expand_variable(): use a list of string parts and proper indexes into the source string
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
483
diff
changeset
|
1008 else: |
|
487
d7f6f2afcee2
Instead of using u(str(v)) use specialized functions for PY2 and PY3
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
485
diff
changeset
|
1009 res_append(str_and_u(varvalue)) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1010 # don't re-evaluate because `self.getvar_s()` expands already |
|
495
3f0c932588fc
Performance: module-level variable lookup is much faster (similar to local) than class-level (either via CLASS.VARIABLE or self.VARIABLE).
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
493
diff
changeset
|
1011 start = s.find(_STARTTOK, rest) |
|
484
0259bd521729
Avoid repeaded string concatenations in .expand_variable(): use a list of string parts and proper indexes into the source string
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
483
diff
changeset
|
1012 res_append(s[rest:]) |
|
527
08924499db3c
Implement a simple interpolation cache for text types
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
526
diff
changeset
|
1013 res = _EMPTY_STR.join(res) |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
1014 if use_cache and cacheable: |
|
530
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
1015 self.__interpolation_cache[s] = res |
|
527
08924499db3c
Implement a simple interpolation cache for text types
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
526
diff
changeset
|
1016 return res |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1017 |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1018 if _fast_interpolate_variables: |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1019 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1020 def fast_interpolate_variables(self, s): |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1021 return _fast_interpolate_variables( |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1022 self, s, self.__interpolation_cache) |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1023 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1024 interpolate_variables = fast_interpolate_variables |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1025 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1026 else: |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1027 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1028 interpolate_variables = py_interpolate_variables |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1029 |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1030 def _apply_filters(self, filters, value): |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1031 for name in filters: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1032 try: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1033 filterfn = lookup_filter(name) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1034 except KeyError: |
|
40
8d66aef2f7fb
Comment about exceptions when filters are missing.
Franz Glasner <hg@dom66.de>
parents:
39
diff
changeset
|
1035 # |
|
8d66aef2f7fb
Comment about exceptions when filters are missing.
Franz Glasner <hg@dom66.de>
parents:
39
diff
changeset
|
1036 # Convert to NameError because we find a missing filters |
|
8d66aef2f7fb
Comment about exceptions when filters are missing.
Franz Glasner <hg@dom66.de>
parents:
39
diff
changeset
|
1037 # a very serious error. |
|
8d66aef2f7fb
Comment about exceptions when filters are missing.
Franz Glasner <hg@dom66.de>
parents:
39
diff
changeset
|
1038 # |
|
521
1001701be682
Formatting of NameErrors in ._apply_filters(): put "name" into a tuple explicitely
Franz Glasner <fzglas.hg@dom66.de>
parents:
519
diff
changeset
|
1039 raise NameError("Filter %r not found" % (name, )) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1040 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1041 value = filterfn(self, value) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1042 return value |
|
320
98490375d90c
Allow variable name quoting to be used in .getvar() and .getvar_s() and references
Franz Glasner <fzglas.hg@dom66.de>
parents:
314
diff
changeset
|
1043 |
|
411
3c95faa91dad
Optimize the creation of a jailed config.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
406
diff
changeset
|
1044 def jailed(self, rootpath=None, root=None, bind_root=True): |
| 399 | 1045 """Return a "jailed" configuration of the current configuration. |
|
395
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1046 |
| 399 | 1047 :param rootpath: a sequence of strings that shall emcompass |
| 1048 the chroot-like jail of the returned | |
| 1049 configuration | |
| 1050 :type rootpath: list or tuple | |
| 1051 :param str root: a string path expression that shall encompass | |
| 1052 the chroot-like jail of the returned configuration | |
|
411
3c95faa91dad
Optimize the creation of a jailed config.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
406
diff
changeset
|
1053 :param bool bind_root: if you do a :meth:`~.rebind` just after |
|
3c95faa91dad
Optimize the creation of a jailed config.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
406
diff
changeset
|
1054 creation of a jailed config you can set |
|
3c95faa91dad
Optimize the creation of a jailed config.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
406
diff
changeset
|
1055 `bind_root` to `False`; otherwise use |
|
3c95faa91dad
Optimize the creation of a jailed config.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
406
diff
changeset
|
1056 the default |
| 397 | 1057 :return: a jailed (aka restricted) configuration |
| 1058 :rtype: _JailedConfiguration | |
| 1059 | |
| 399 | 1060 Exactly one of `rootpath` or `root` must be given. |
| 1061 | |
|
395
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1062 """ |
|
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1063 if rootpath is not None and root is not None: |
|
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1064 raise ValueError("only one of `rootpath' or `root' can be given") |
|
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1065 if rootpath is None and root is None: |
|
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1066 raise ValueError("one of `rootpath' or `root' must be given") |
|
416
2abde0d3c735
FIX: Handle .jailed() with an empty "root" properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
412
diff
changeset
|
1067 if rootpath is not None and not isinstance(rootpath, (list, tuple)): |
|
2abde0d3c735
FIX: Handle .jailed() with an empty "root" properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
412
diff
changeset
|
1068 raise TypeError("`rootpath' must be a list or a tuple") |
|
395
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1069 if root is not None: |
|
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1070 # convert to path |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
1071 varns, varname = _split_ns(root) |
|
395
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1072 if varns: |
|
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1073 raise ValueError( |
|
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1074 "jailed configurations do not support namespaces") |
|
539
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
1075 rootpath = pathstr2path(root) |
|
411
3c95faa91dad
Optimize the creation of a jailed config.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
406
diff
changeset
|
1076 jc = _JailedConfiguration(*rootpath) |
|
3c95faa91dad
Optimize the creation of a jailed config.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
406
diff
changeset
|
1077 if bind_root: |
|
3c95faa91dad
Optimize the creation of a jailed config.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
406
diff
changeset
|
1078 jc.rebind(self) |
|
3c95faa91dad
Optimize the creation of a jailed config.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
406
diff
changeset
|
1079 return jc |
|
395
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1080 |
|
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1081 |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
1082 class _JailedConfiguration(CoercingMethodsMixin): |
|
395
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1083 |
| 397 | 1084 """A jailed and restricted variant of :class:`Configuration`. |
| 1085 | |
| 399 | 1086 Restriction is two-fold: |
| 1087 | |
| 1088 - The access to configuration variables in `config` is restricted | |
| 1089 to the configuration sub-tree that is configured in `path`. | |
| 1090 | |
| 1091 - Not all access-methods of :class:`Configuration` are implemented | |
| 1092 yet. | |
| 1093 | |
| 400 | 1094 .. seealso:: :ref:`jailed-configuration` |
| 1095 | |
| 399 | 1096 .. note:: There is no namespace support. |
| 1097 | |
| 1098 .. note:: Do not call the constructor directly. Instantiate a jailed | |
| 1099 configuration from the parent configuration's | |
| 1100 :meth:`~.Configuration.jailed` factory method. | |
| 397 | 1101 |
| 1102 """ | |
|
395
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1103 |
|
503
a56f1d97a3f3
Use generator comprehensions where possible instead of list comprehensions that are converted to tuples
Franz Glasner <fzglas.hg@dom66.de>
parents:
502
diff
changeset
|
1104 __slots__ = ("_base", "_path", "_path_string") |
|
395
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1105 |
|
404
6a5aea02f3d0
Implement a ".is_jail" flag for configuration objects: to test/assert whether we expect a jail configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
400
diff
changeset
|
1106 is_jail = True |
|
6a5aea02f3d0
Implement a ".is_jail" flag for configuration objects: to test/assert whether we expect a jail configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
400
diff
changeset
|
1107 """Flag to show that this is a jail for another configuration""" |
|
6a5aea02f3d0
Implement a ".is_jail" flag for configuration objects: to test/assert whether we expect a jail configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
400
diff
changeset
|
1108 |
|
411
3c95faa91dad
Optimize the creation of a jailed config.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
406
diff
changeset
|
1109 def __init__(self, *path): |
|
395
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1110 super(_JailedConfiguration, self).__init__() |
|
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1111 self._path = path |
|
503
a56f1d97a3f3
Use generator comprehensions where possible instead of list comprehensions that are converted to tuples
Franz Glasner <fzglas.hg@dom66.de>
parents:
502
diff
changeset
|
1112 self._path_string = None |
|
a56f1d97a3f3
Use generator comprehensions where possible instead of list comprehensions that are converted to tuples
Franz Glasner <fzglas.hg@dom66.de>
parents:
502
diff
changeset
|
1113 |
|
a56f1d97a3f3
Use generator comprehensions where possible instead of list comprehensions that are converted to tuples
Franz Glasner <fzglas.hg@dom66.de>
parents:
502
diff
changeset
|
1114 @property |
|
a56f1d97a3f3
Use generator comprehensions where possible instead of list comprehensions that are converted to tuples
Franz Glasner <fzglas.hg@dom66.de>
parents:
502
diff
changeset
|
1115 def _pathstr(self): |
|
a56f1d97a3f3
Use generator comprehensions where possible instead of list comprehensions that are converted to tuples
Franz Glasner <fzglas.hg@dom66.de>
parents:
502
diff
changeset
|
1116 v = self._path_string |
|
a56f1d97a3f3
Use generator comprehensions where possible instead of list comprehensions that are converted to tuples
Franz Glasner <fzglas.hg@dom66.de>
parents:
502
diff
changeset
|
1117 if v is None: |
|
a56f1d97a3f3
Use generator comprehensions where possible instead of list comprehensions that are converted to tuples
Franz Glasner <fzglas.hg@dom66.de>
parents:
502
diff
changeset
|
1118 if self._path: |
|
513
599e8ade567c
str.join(): use a list comprehension instead of a generator expression for performance reasons
Franz Glasner <fzglas.hg@dom66.de>
parents:
512
diff
changeset
|
1119 v = _HIER_SEPARATOR.join([quote(p) for p in self._path]) \ |
|
503
a56f1d97a3f3
Use generator comprehensions where possible instead of list comprehensions that are converted to tuples
Franz Glasner <fzglas.hg@dom66.de>
parents:
502
diff
changeset
|
1120 + _HIER_SEPARATOR |
|
a56f1d97a3f3
Use generator comprehensions where possible instead of list comprehensions that are converted to tuples
Franz Glasner <fzglas.hg@dom66.de>
parents:
502
diff
changeset
|
1121 else: |
|
a56f1d97a3f3
Use generator comprehensions where possible instead of list comprehensions that are converted to tuples
Franz Glasner <fzglas.hg@dom66.de>
parents:
502
diff
changeset
|
1122 v = _EMPTY_STR |
|
548
325008573bc6
FIX: Assign to _JailedConfiguration._path_string only if not yet done
Franz Glasner <fzglas.hg@dom66.de>
parents:
543
diff
changeset
|
1123 self._path_string = v |
|
503
a56f1d97a3f3
Use generator comprehensions where possible instead of list comprehensions that are converted to tuples
Franz Glasner <fzglas.hg@dom66.de>
parents:
502
diff
changeset
|
1124 return v |
|
405
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1125 |
|
406
5286df5aeefe
Allow a jailed configuration to return its base configuration via a property
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
405
diff
changeset
|
1126 @property |
|
5286df5aeefe
Allow a jailed configuration to return its base configuration via a property
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
405
diff
changeset
|
1127 def base(self): |
|
426
84d4f82ffe59
Docs: more on jails and sub-jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
419
diff
changeset
|
1128 """Ask for the base (aka parent) configuration". |
|
84d4f82ffe59
Docs: more on jails and sub-jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
419
diff
changeset
|
1129 |
|
84d4f82ffe59
Docs: more on jails and sub-jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
419
diff
changeset
|
1130 This configuration is always unjailed. |
|
84d4f82ffe59
Docs: more on jails and sub-jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
419
diff
changeset
|
1131 |
|
84d4f82ffe59
Docs: more on jails and sub-jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
419
diff
changeset
|
1132 """ |
|
406
5286df5aeefe
Allow a jailed configuration to return its base configuration via a property
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
405
diff
changeset
|
1133 return self._base |
|
5286df5aeefe
Allow a jailed configuration to return its base configuration via a property
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
405
diff
changeset
|
1134 |
|
405
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1135 def rebind(self, new_base): |
|
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1136 """Bind the jail to a new unjailed configuration `new_base`. |
|
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1137 |
|
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1138 The new configuration base also must have an existing path to |
|
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1139 the root. |
|
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1140 |
|
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1141 :param Configuration new_base: the new base |
|
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1142 |
|
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1143 """ |
|
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1144 if new_base.is_jail: |
|
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1145 raise TypeError("can only bind to an unjailed configuration") |
|
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1146 self._base = new_base |
|
395
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1147 # |
|
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1148 # Early error out if the chroot does not exist but allow |
|
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1149 # degenerated case if `self._path` is empty. |
|
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1150 # |
|
449
5864977bb44f
FIX: KeyError formatting.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
448
diff
changeset
|
1151 if self._path and self._path not in new_base: |
|
5864977bb44f
FIX: KeyError formatting.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
448
diff
changeset
|
1152 raise KeyError( |
|
5864977bb44f
FIX: KeyError formatting.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
448
diff
changeset
|
1153 "base key path %r not available in the new base" |
|
5864977bb44f
FIX: KeyError formatting.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
448
diff
changeset
|
1154 % (self._path, )) |
|
395
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1155 |
|
448
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1156 def __getattr__(self, name): |
| 469 | 1157 """Attribute-style access. |
| 1158 | |
| 1159 Result values are interpolated (i.e. forwarded to | |
| 1160 :meth:`~.getvarl_s`) | |
| 1161 | |
| 1162 """ | |
|
448
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1163 try: |
|
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1164 v = self._base.getvarl_s(*(self._path + (name, ))) |
|
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1165 except KeyError: |
|
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1166 raise AttributeError("%s has no attribute %r" % (type(self), name)) |
|
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1167 else: |
|
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1168 # Wrap a dict into another dict with attribute access support |
|
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1169 if isinstance(v, dict): |
|
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1170 return _AttributeDict(v) |
|
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1171 else: |
|
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1172 return v |
|
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1173 |
|
437
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
1174 def __getitem__(self, key): |
| 469 | 1175 """Mapping and list interface that forwards to :meth:`~.getvarl_s` |
|
437
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
1176 |
|
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
1177 """ |
|
441
9d20fab53a19
FIX: Handle "list"-type keys in __contains__ and __getitem__ properly: convert to tuples for contatenation with tuple
Franz Glasner <fzglas.hg@dom66.de>
parents:
440
diff
changeset
|
1178 if isinstance(key, tuple): |
|
440
f297c23f78f0
Optimize __getitem__() in jailed configurations: call base directly
Franz Glasner <fzglas.hg@dom66.de>
parents:
439
diff
changeset
|
1179 return self._base.getvarl_s(*(self._path + key)) |
|
441
9d20fab53a19
FIX: Handle "list"-type keys in __contains__ and __getitem__ properly: convert to tuples for contatenation with tuple
Franz Glasner <fzglas.hg@dom66.de>
parents:
440
diff
changeset
|
1180 elif isinstance(key, list): |
|
9d20fab53a19
FIX: Handle "list"-type keys in __contains__ and __getitem__ properly: convert to tuples for contatenation with tuple
Franz Glasner <fzglas.hg@dom66.de>
parents:
440
diff
changeset
|
1181 return self._base.getvarl_s(*(self._path + tuple(key))) |
|
437
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
1182 else: |
|
468
95df1a10259a
Index list-access for jailed configurations: be more generic by calling also __getitem__ in the base
Franz Glasner <fzglas.hg@dom66.de>
parents:
467
diff
changeset
|
1183 return self._base.getvarl_s(*self._path)[key] |
|
437
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
1184 |
|
442
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
1185 def get(self, key, default=None): |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
1186 if isinstance(key, tuple): |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
1187 return self._base.get(self._path + key, default=default) |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
1188 elif isinstance(key, list): |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
1189 return self._base.get(self._path + tuple(key), default=default) |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
1190 else: |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
1191 return self._base.get(self._path + (key, ), default=default) |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
1192 |
|
439
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
1193 def __contains__(self, key): |
| 469 | 1194 """Containment support for containers""" |
|
441
9d20fab53a19
FIX: Handle "list"-type keys in __contains__ and __getitem__ properly: convert to tuples for contatenation with tuple
Franz Glasner <fzglas.hg@dom66.de>
parents:
440
diff
changeset
|
1195 if isinstance(key, tuple): |
|
439
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
1196 return (self._path + key) in self._base |
|
441
9d20fab53a19
FIX: Handle "list"-type keys in __contains__ and __getitem__ properly: convert to tuples for contatenation with tuple
Franz Glasner <fzglas.hg@dom66.de>
parents:
440
diff
changeset
|
1197 elif isinstance(key, list): |
|
9d20fab53a19
FIX: Handle "list"-type keys in __contains__ and __getitem__ properly: convert to tuples for contatenation with tuple
Franz Glasner <fzglas.hg@dom66.de>
parents:
440
diff
changeset
|
1198 return (self._path + tuple(key)) in self._base |
|
439
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
1199 else: |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
1200 return (self._path + (key, )) in self._base |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
1201 |
|
395
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1202 def getvarl(self, *path, **kwds): |
|
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1203 return self._base.getvarl(*(self._path + path), **kwds) |
|
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1204 |
|
418
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
1205 def getkeysl(self, *path, **kwds): |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
1206 for k in self._base.getkeysl(*(self._path + path), **kwds): |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
1207 yield k |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
1208 |
|
398
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1209 def getfirstvarl(self, *paths, **kwds): |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1210 real_paths = [] |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1211 for path in paths: |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1212 if isinstance(path, (list, tuple)): |
|
509
4c2517e18af0
FIX: Convert a list ito a tuple before appending it to another tuple
Franz Glasner <fzglas.hg@dom66.de>
parents:
507
diff
changeset
|
1213 real_paths.append(self._path + tuple(path)) |
|
398
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1214 elif isinstance(path, dict): |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1215 raise TypeError( |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1216 "a `dict' is not supported in a jailed configuration") |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1217 else: |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1218 raise TypeError("a paths item must be a list or tuple") |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1219 return self._base.getfirstvarl(*real_paths, **kwds) |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1220 |
|
395
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1221 def getvarl_s(self, *path, **kwds): |
|
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1222 return self._base.getvarl_s(*(self._path + path), **kwds) |
|
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1223 |
|
398
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1224 def getfirstvarl_s(self, *paths, **kwds): |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1225 real_paths = [] |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1226 for path in paths: |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1227 if isinstance(path, (list, tuple)): |
|
510
acf1e8696d68
FIX: Some other lists that need to converted to tuples
Franz Glasner <fzglas.hg@dom66.de>
parents:
509
diff
changeset
|
1228 real_paths.append(self._path + tuple(path)) |
|
398
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1229 elif isinstance(path, dict): |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1230 raise TypeError( |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1231 "a `dict' is not supported in a jailed configuration") |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1232 else: |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1233 raise TypeError("a paths item must be a list or tuple") |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1234 return self._base.getfirstvarl_s(*real_paths, **kwds) |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1235 |
|
428
090a25f36a3d
FIX: Allow jailed configurations to use correctly use base configurations that use a different "default" marker object.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
426
diff
changeset
|
1236 def getvar(self, varname, **kwds): |
|
539
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
1237 return self._base.getvarl(*(self._path + pathstr2path(varname)), |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
1238 **kwds) |
|
395
0b3ffc34fa5c
Begin a jailed configuration with access to a sub-tree of the original configuration
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
389
diff
changeset
|
1239 |
|
418
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
1240 def getkeys(self, varname): |
|
539
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
1241 for k in self._base.getkeysl(*(self._path + pathstr2path(varname))): |
|
418
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
1242 yield k |
|
bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
Franz Glasner <fzglas.hg@dom66.de>
parents:
417
diff
changeset
|
1243 |
|
398
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1244 def getfirstvar(self, *varnames, **kwds): |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1245 real_varnames = [self._pathstr + vn for vn in varnames] |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1246 return self._base.getfirstvar(*real_varnames, **kwds) |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1247 |
|
428
090a25f36a3d
FIX: Allow jailed configurations to use correctly use base configurations that use a different "default" marker object.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
426
diff
changeset
|
1248 def getvar_s(self, varname, **kwds): |
|
539
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
1249 return self._base.getvarl_s(*(self._path + pathstr2path(varname)), |
|
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
1250 **kwds) |
|
398
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1251 |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1252 def getfirstvar_s(self, *varnames, **kwds): |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1253 real_varnames = [self._pathstr + vn for vn in varnames] |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1254 return self._base.getfirstvar_s(*real_varnames, **kwds) |
|
417
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1255 |
|
459
9dc9cef1b9cd
Implement proper iteration support for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
455
diff
changeset
|
1256 def __iter__(self): |
| 469 | 1257 """Iteration support for containers""" |
|
459
9dc9cef1b9cd
Implement proper iteration support for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
455
diff
changeset
|
1258 return iter(self._base.getvarl_s(*self._path)) |
|
9dc9cef1b9cd
Implement proper iteration support for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
455
diff
changeset
|
1259 |
|
467
9fcdc42a0457
len-support for jailed configurations: implement a proper __len__() method
Franz Glasner <fzglas.hg@dom66.de>
parents:
460
diff
changeset
|
1260 def __len__(self): |
| 469 | 1261 """Length support for containers""" |
|
648
e8f3e970e411
__len__() for jails also now internally expands: this is for consistency with __bool__ when applyint to non-container jails (which are possible)
Franz Glasner <fzglas.hg@dom66.de>
parents:
647
diff
changeset
|
1262 return len(self._base.getvarl_s(*self._path)) |
|
467
9fcdc42a0457
len-support for jailed configurations: implement a proper __len__() method
Franz Glasner <fzglas.hg@dom66.de>
parents:
460
diff
changeset
|
1263 |
|
460
d22985d6806e
Proper boolean context for jailed configurations: __bool__()/__nonzero__()
Franz Glasner <fzglas.hg@dom66.de>
parents:
459
diff
changeset
|
1264 if PY2: |
|
d22985d6806e
Proper boolean context for jailed configurations: __bool__()/__nonzero__()
Franz Glasner <fzglas.hg@dom66.de>
parents:
459
diff
changeset
|
1265 |
|
d22985d6806e
Proper boolean context for jailed configurations: __bool__()/__nonzero__()
Franz Glasner <fzglas.hg@dom66.de>
parents:
459
diff
changeset
|
1266 def __nonzero__(self): |
| 469 | 1267 """Map- and list-style evaluation in boolean context""" |
|
460
d22985d6806e
Proper boolean context for jailed configurations: __bool__()/__nonzero__()
Franz Glasner <fzglas.hg@dom66.de>
parents:
459
diff
changeset
|
1268 return bool(self._base.getvarl_s(*self._path)) |
|
d22985d6806e
Proper boolean context for jailed configurations: __bool__()/__nonzero__()
Franz Glasner <fzglas.hg@dom66.de>
parents:
459
diff
changeset
|
1269 |
|
d22985d6806e
Proper boolean context for jailed configurations: __bool__()/__nonzero__()
Franz Glasner <fzglas.hg@dom66.de>
parents:
459
diff
changeset
|
1270 else: |
|
d22985d6806e
Proper boolean context for jailed configurations: __bool__()/__nonzero__()
Franz Glasner <fzglas.hg@dom66.de>
parents:
459
diff
changeset
|
1271 |
|
d22985d6806e
Proper boolean context for jailed configurations: __bool__()/__nonzero__()
Franz Glasner <fzglas.hg@dom66.de>
parents:
459
diff
changeset
|
1272 def __bool__(self): |
| 469 | 1273 """Map- and list-style evaluation in boolean context""" |
|
460
d22985d6806e
Proper boolean context for jailed configurations: __bool__()/__nonzero__()
Franz Glasner <fzglas.hg@dom66.de>
parents:
459
diff
changeset
|
1274 return bool(self._base.getvarl_s(*self._path)) |
|
d22985d6806e
Proper boolean context for jailed configurations: __bool__()/__nonzero__()
Franz Glasner <fzglas.hg@dom66.de>
parents:
459
diff
changeset
|
1275 |
|
417
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1276 def jailed(self, rootpath=None, root=None, bind_root=True): |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1277 """Return a "jailed" configuration that effectively is a |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1278 subjail of the current jail |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1279 |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1280 For a more complete description see :meth:`.Configuration.jailed`. |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1281 |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1282 """ |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1283 if rootpath is not None and root is not None: |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1284 raise ValueError("only one of `rootpath' or `root' can be given") |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1285 if rootpath is None and root is None: |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1286 raise ValueError("one of `rootpath' or `root' must be given") |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1287 if rootpath is not None and not isinstance(rootpath, (list, tuple)): |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1288 raise TypeError("`rootpath' must be a list or a tuple") |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1289 if root is not None: |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1290 # convert to path |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
1291 varns, varname = _split_ns(root) |
|
417
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1292 if varns: |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1293 raise ValueError( |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1294 "sub-jails do not support namespaces") |
|
539
9546d38cd3f8
Refactor: the parsing of the quoted and dot-separated path string is put into a function that handles also empty inputs properly
Franz Glasner <fzglas.hg@dom66.de>
parents:
531
diff
changeset
|
1295 rootpath = pathstr2path(varname) |
|
417
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1296 if self._path: |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1297 new_rootpath = self._path + tuple(rootpath) |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1298 else: |
|
510
acf1e8696d68
FIX: Some other lists that need to converted to tuples
Franz Glasner <fzglas.hg@dom66.de>
parents:
509
diff
changeset
|
1299 new_rootpath = tuple(rootpath) |
|
417
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1300 sjc = _JailedConfiguration(*new_rootpath) |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1301 if bind_root: |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1302 sjc.rebind(self._base) |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1303 return sjc |
|
432
b96f49c9c76b
Proper "repr()" for a jailed configuration: put the root path into the output
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
1304 |
|
b96f49c9c76b
Proper "repr()" for a jailed configuration: put the root path into the output
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
1305 def __repr__(self): |
|
b96f49c9c76b
Proper "repr()" for a jailed configuration: put the root path into the output
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
1306 r = "_JailedConfiguration(rootpath=%s)" % n(repr(self._path)) |
|
b96f49c9c76b
Proper "repr()" for a jailed configuration: put the root path into the output
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
1307 return r |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1308 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1309 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1310 if _sync_MISSING: |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1311 _sync_MISSING(_MISSING) |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
1312 _sync_MARKER(_MARKER) |
