Mercurial > hgrepos > Python > libs > ConfigMix
annotate configmix/config.py @ 769:4a4d1323b282 default tip
Doc what AWS partition is
| author | Franz Glasner <f.glasner@feldmann-mg.com> |
|---|---|
| date | Mon, 19 Feb 2024 16:11:48 +0100 |
| parents | 3eb2c451026b |
| children |
| 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 |
|
756
cabd1046d95f
Extract new config methods extract_new_config
Franz Glasner <fzglas.hg@dom66.de>
parents:
731
diff
changeset
|
25 import copy |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
26 try: |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
27 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
|
28 except ImportError: |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
29 from urlparse import urlsplit |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
30 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
31 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
|
32 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
|
33 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
|
34 try: |
|
550
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
548
diff
changeset
|
35 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
|
36 _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
|
37 _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
|
38 _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
|
39 _fast_interpolate_variables, |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
40 _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
|
41 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
|
42 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
|
43 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
|
44 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
|
45 _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
|
46 _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
|
47 _fast_getvarl = None |
|
610
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
48 _fast_getvarl_s = None |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
49 _fast_getvar = None |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
50 _fast_getvar_s = None |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
51 _fast_interpolate_variables = None |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
52 _sync_MISSING = None |
|
713
1832c5d1bd00
Handle _sync_MARKER exactly as _sync_MISSING.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
712
diff
changeset
|
53 _sync_MARKER = None |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
54 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
55 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
56 _MARKER = object() |
|
499
f46932e8a84c
Configuration._lookupvar() now uses an internal cache (positive and negative).
Franz Glasner <fzglas.hg@dom66.de>
parents:
497
diff
changeset
|
57 _MISSING = object() |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
58 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
59 |
|
17
94b5e94fae44
Make the AttributeDict "private" (-> "_AttributeDict")
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
16
diff
changeset
|
60 class _AttributeDict(ConfigurationBase): |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
61 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
62 def __getattr__(self, name): |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
63 try: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
64 v = self[name] |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
65 except KeyError: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
66 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
|
67 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
68 # 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
|
69 if isinstance(v, dict): |
|
29
17af7a78710c
FIX: Renaming a class was not really complete
Franz Glasner <hg@dom66.de>
parents:
25
diff
changeset
|
70 return _AttributeDict(v) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
71 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
72 return v |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
73 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
74 |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
75 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
|
76 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
77 """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
|
78 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
|
79 float). |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
80 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
81 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
|
82 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
|
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 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
85 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
86 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
|
87 """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
|
88 number. |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
89 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
90 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
91 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
|
92 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
|
93 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
|
94 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
95 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
|
96 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
97 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
|
98 """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
|
99 number. |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
100 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
101 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
102 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
|
103 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
|
104 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
|
105 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
106 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
|
107 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
108 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
|
109 """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
|
110 number. |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
111 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
112 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
113 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
|
114 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
|
115 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
|
116 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
117 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
|
118 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
119 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
|
120 """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
|
121 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
|
122 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
123 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
124 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
|
125 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
|
126 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
|
127 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
128 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
|
129 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
130 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
|
131 """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
|
132 boolean |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
133 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
134 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
135 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
|
136 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
|
137 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
|
138 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
|
139 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
|
140 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
|
141 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
142 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
|
143 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
144 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
|
145 """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
|
146 boolean |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
147 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
148 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
149 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
|
150 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
|
151 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
|
152 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
|
153 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
|
154 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
|
155 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
156 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
|
157 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
158 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
|
159 """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
|
160 boolean |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
161 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
162 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
163 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
|
164 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
|
165 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
|
166 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
|
167 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
|
168 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
|
169 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
170 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
|
171 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
172 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
|
173 """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
|
174 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
|
175 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
176 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
177 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
|
178 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
|
179 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
|
180 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
|
181 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
|
182 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
|
183 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
184 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
|
185 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
186 # 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
|
187 _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
|
188 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
|
189 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
|
190 } |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
191 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
192 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
|
193 """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
|
194 float |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
195 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
196 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
197 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
|
198 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
|
199 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
|
200 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
201 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
|
202 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
203 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
|
204 """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
|
205 float |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
206 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
207 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
208 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
|
209 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
|
210 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
|
211 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
212 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
|
213 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
214 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
|
215 """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
|
216 float |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
217 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
218 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
219 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
|
220 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
|
221 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
|
222 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
223 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
|
224 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
225 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
|
226 """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
|
227 float |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
228 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
229 """ |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
230 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
|
231 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
|
232 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
|
233 else: |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
234 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
|
235 |
|
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
236 |
|
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
|
237 # 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
|
238 _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
|
239 _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
|
240 _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
|
241 _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
|
242 _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
|
243 _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
|
244 _FILTER_SEPARATOR = u(b'|') |
|
707
10fbc23b4dba
Rename internal variable FILTER_SEPARATOR_REV -> FILTER_SEPARATOR_2
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
705
diff
changeset
|
245 _FILTER_SEPARATOR_2 = u(b',') |
|
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
|
246 _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
|
247 _ENDTOK_REF = _ENDTOK |
|
703
193a616e0b3c
Begin implementation of filter-only expansions (recursive with respect to expansion)
Franz Glasner <fzglas.hg@dom66.de>
parents:
702
diff
changeset
|
248 _ENDTOK_FILTER = _FILTER_SEPARATOR + _ENDTOK |
|
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
|
249 _DOT = u(b'.') |
|
656
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
250 _TILDE = u(b'~') |
|
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
|
251 _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
|
252 _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
|
253 _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
|
254 _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
|
255 _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
|
256 _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
|
257 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
|
258 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
|
259 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
|
260 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
|
261 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
|
262 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
|
263 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
|
264 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
|
265 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
|
266 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
|
267 0x5d: u(b'%x5d'), |
|
656
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
268 0x7e: u(b'%x7e'), # tilde `~` |
|
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
|
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 _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
|
271 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
|
272 b'0123456789' |
|
656
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
273 b'-_@!$&/\\()=?*+;,<>^') |
|
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
|
274 """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
|
275 |
|
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
|
276 """ |
|
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
|
277 |
|
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
|
278 |
|
550
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
548
diff
changeset
|
279 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
|
280 """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
|
281 them with ``%xNN`` where `NN` are the two hexadecimal digits of the |
| 702 | 282 character's unicode codepoint value. |
|
502
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 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
|
285 ``#``; ``'``, ``"``, ``|``, ``{``, ``}``, ``[`` and ``]``. |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
286 |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
287 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
|
288 |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
289 """ |
|
656
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
290 try: |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
291 # Quick check whether all of the chars are in _QUOTE_SAFE |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
292 if not s.lstrip(_QUOTE_SAFE): |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
293 return s |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
294 except AttributeError: |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
295 # |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
296 # Check whether s is an index (int) and return the special tag if |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
297 # it is so |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
298 # |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
299 if isinstance(s, int): |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
300 return "~%d~" % (s, ) |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
301 else: |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
302 raise |
|
502
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
303 |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
304 # Slow path |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
305 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
|
306 if PY2: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
307 # 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
|
308 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
|
309 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
|
310 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
|
311 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
|
312 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
|
313 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
|
314 else: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
315 return s |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
316 |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
317 |
|
550
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
548
diff
changeset
|
318 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
|
319 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
|
320 else: |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
548
diff
changeset
|
321 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
|
322 |
|
79db28e879f8
Provide a C-implementation of configmix.config.quote() also: fast_quote
Franz Glasner <fzglas.hg@dom66.de>
parents:
548
diff
changeset
|
323 |
|
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
|
324 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
|
325 """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
|
326 ``%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
|
327 |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
328 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
|
329 |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
330 """ |
|
656
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
331 s_len = len(s) |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
332 if s_len > 2 and s[0] == _TILDE and s[-1] == _TILDE: |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
333 try: |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
334 v = int(s[1:-1], 10) |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
335 if v // 10 > 3275: # be compatible to the fast C implementation |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
336 raise OverflowError("index too large") |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
337 return v |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
338 except (ValueError, OverflowError): |
|
2b1c7a68f913
Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
Franz Glasner <fzglas.hg@dom66.de>
parents:
655
diff
changeset
|
339 pass |
|
502
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
340 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
|
341 return s |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
342 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
|
343 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
|
344 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
|
345 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
|
346 try: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
347 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
|
348 except IndexError: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
349 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
|
350 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
|
351 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
|
352 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
|
353 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
|
354 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
|
355 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
|
356 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
|
357 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
|
358 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
|
359 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
|
360 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
|
361 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
|
362 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
|
363 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
|
364 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
|
365 else: |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
366 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
|
367 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
|
368 |
|
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
369 |
|
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
|
370 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
|
371 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
|
372 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
|
373 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
|
374 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
375 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
376 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
|
377 """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
|
378 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
|
379 |
|
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
|
380 :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
|
381 :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
|
382 :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
|
383 |
|
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
|
384 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
|
385 :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
|
386 |
|
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
|
387 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
|
388 :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
|
389 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
|
390 |
|
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
|
391 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
|
392 |
|
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
|
393 """ |
|
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
|
394 # |
|
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
|
395 # 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
|
396 # 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
|
397 # |
|
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
|
398 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
|
399 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
|
400 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
|
401 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
|
402 |
|
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
|
403 |
|
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
|
404 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
|
405 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
|
406 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
|
407 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
|
408 |
|
f71d34dda19f
Add an optional C-implementation for configmix.config.unquote and configmix.config.pathstr2path.
Franz Glasner <fzglas.hg@dom66.de>
parents:
541
diff
changeset
|
409 |
|
543
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
410 def _py_split_ns(varname): |
|
541
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
411 """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
|
412 the namespace-specific name |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
413 |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
414 :type varname: str |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
415 :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
|
416 namespace-specific (variable-)name |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
417 :rtype: tuple(str or None, str) |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
418 |
|
543
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
419 .. 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
|
420 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
|
421 |
|
541
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
422 """ |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
423 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
|
424 if sep: |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
425 return (unquote(ns), rest) |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
426 else: |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
427 return (None, ns) |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
428 |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
429 |
|
543
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
430 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
|
431 _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
|
432 else: |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
433 _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
|
434 |
|
491413368c7c
Added also a fast C-implementation of configmix.config._split_ns
Franz Glasner <fzglas.hg@dom66.de>
parents:
542
diff
changeset
|
435 |
|
705
0485a033c95d
FIX: Parsing a filter chain for the new filter-only expansions: parse them backwards and use "," as filter-chain separator here.
Franz Glasner <fzglas.hg@dom66.de>
parents:
703
diff
changeset
|
436 def _py_split_filters(varname, direction): |
|
541
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
437 """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
|
438 |
|
705
0485a033c95d
FIX: Parsing a filter chain for the new filter-only expansions: parse them backwards and use "," as filter-chain separator here.
Franz Glasner <fzglas.hg@dom66.de>
parents:
703
diff
changeset
|
439 :param str varname: The string where to search for filters |
|
0485a033c95d
FIX: Parsing a filter chain for the new filter-only expansions: parse them backwards and use "," as filter-chain separator here.
Franz Glasner <fzglas.hg@dom66.de>
parents:
703
diff
changeset
|
440 :param int direction: +1 means to do a forward search, -1 a backward search |
|
541
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
441 :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
|
442 of filters |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
443 :rtype: tuple(str, list) |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
444 |
|
25b61f0a1958
Docs for _split_ns() and _split_filters()
Franz Glasner <fzglas.hg@dom66.de>
parents:
540
diff
changeset
|
445 """ |
|
705
0485a033c95d
FIX: Parsing a filter chain for the new filter-only expansions: parse them backwards and use "," as filter-chain separator here.
Franz Glasner <fzglas.hg@dom66.de>
parents:
703
diff
changeset
|
446 if direction == 1: |
|
0485a033c95d
FIX: Parsing a filter chain for the new filter-only expansions: parse them backwards and use "," as filter-chain separator here.
Franz Glasner <fzglas.hg@dom66.de>
parents:
703
diff
changeset
|
447 name, sep, filters = varname.partition(_FILTER_SEPARATOR) |
|
0485a033c95d
FIX: Parsing a filter chain for the new filter-only expansions: parse them backwards and use "," as filter-chain separator here.
Franz Glasner <fzglas.hg@dom66.de>
parents:
703
diff
changeset
|
448 elif direction == -1: |
|
0485a033c95d
FIX: Parsing a filter chain for the new filter-only expansions: parse them backwards and use "," as filter-chain separator here.
Franz Glasner <fzglas.hg@dom66.de>
parents:
703
diff
changeset
|
449 name, sep, filters = varname.rpartition(_FILTER_SEPARATOR) |
|
0485a033c95d
FIX: Parsing a filter chain for the new filter-only expansions: parse them backwards and use "," as filter-chain separator here.
Franz Glasner <fzglas.hg@dom66.de>
parents:
703
diff
changeset
|
450 else: |
|
0485a033c95d
FIX: Parsing a filter chain for the new filter-only expansions: parse them backwards and use "," as filter-chain separator here.
Franz Glasner <fzglas.hg@dom66.de>
parents:
703
diff
changeset
|
451 raise ValueError("`direction' must be -1 or +1") |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
452 if sep: |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
453 filters = filters.strip() |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
454 if filters: |
|
705
0485a033c95d
FIX: Parsing a filter chain for the new filter-only expansions: parse them backwards and use "," as filter-chain separator here.
Franz Glasner <fzglas.hg@dom66.de>
parents:
703
diff
changeset
|
455 if direction == 1: |
|
708
e692216f8756
Allow also "," characters to act as a separator within a filter-chain.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
707
diff
changeset
|
456 if _FILTER_SEPARATOR_2 in filters: |
|
e692216f8756
Allow also "," characters to act as a separator within a filter-chain.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
707
diff
changeset
|
457 return (name, filters.split(_FILTER_SEPARATOR_2)) |
|
e692216f8756
Allow also "," characters to act as a separator within a filter-chain.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
707
diff
changeset
|
458 else: |
|
e692216f8756
Allow also "," characters to act as a separator within a filter-chain.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
707
diff
changeset
|
459 return (name, filters.split(_FILTER_SEPARATOR)) |
|
705
0485a033c95d
FIX: Parsing a filter chain for the new filter-only expansions: parse them backwards and use "," as filter-chain separator here.
Franz Glasner <fzglas.hg@dom66.de>
parents:
703
diff
changeset
|
460 else: |
|
707
10fbc23b4dba
Rename internal variable FILTER_SEPARATOR_REV -> FILTER_SEPARATOR_2
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
705
diff
changeset
|
461 return (name, filters.split(_FILTER_SEPARATOR_2)) |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
462 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
|
463 return (name, []) |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
464 else: |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
465 return (name, []) |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
466 |
|
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
467 |
|
552
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
551
diff
changeset
|
468 if _fast_split_filters: |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
551
diff
changeset
|
469 _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
|
470 else: |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
551
diff
changeset
|
471 _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
|
472 |
|
39e5d07d8dbc
Provide a C implementation of configmix.config._split_filters.
Franz Glasner <fzglas.hg@dom66.de>
parents:
551
diff
changeset
|
473 |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
474 class Configuration(CoercingMethodsMixin, _AttributeDict): |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
475 |
| 712 | 476 """The configuration dictionary with attribute support and |
| 477 variable interpolation/substitution. | |
| 18 | 478 |
|
711
6557cf9ecea5
FIX: When using attribute access for configurations the values are interpolated since long ago: fix the docu and add a test for that behaviour
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
708
diff
changeset
|
479 .. note:: When retrieving by attribute names variables will be |
|
6557cf9ecea5
FIX: When using attribute access for configurations the values are interpolated since long ago: fix the docu and add a test for that behaviour
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
708
diff
changeset
|
480 interpolated. |
| 18 | 481 |
| 482 """ | |
| 483 | |
|
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
|
484 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
|
485 """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
|
486 |
|
499
f46932e8a84c
Configuration._lookupvar() now uses an internal cache (positive and negative).
Franz Glasner <fzglas.hg@dom66.de>
parents:
497
diff
changeset
|
487 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
|
488 # |
|
f46932e8a84c
Configuration._lookupvar() now uses an internal cache (positive and negative).
Franz Glasner <fzglas.hg@dom66.de>
parents:
497
diff
changeset
|
489 # 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
|
490 # |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
491 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
|
492 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
|
493 |
|
506
dffa692751b1
Implement clear_cache() for the configuration
Franz Glasner <fzglas.hg@dom66.de>
parents:
504
diff
changeset
|
494 def clear_cache(self): |
| 529 | 495 """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
|
496 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
|
497 self.__lookup_cache.clear() |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
498 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
|
499 self.__interpolation_cache.clear() |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
500 |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
501 def disable_cache(self): |
|
731
75d37575472b
Docs: Add does to some methods that are yet missing docs
Franz Glasner <fzglas.hg@dom66.de>
parents:
723
diff
changeset
|
502 """Disable 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
|
503 self.__lookup_cache = None |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
504 self.__interpolation_cache = None |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
505 |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
506 def enable_cache(self): |
|
731
75d37575472b
Docs: Add does to some methods that are yet missing docs
Franz Glasner <fzglas.hg@dom66.de>
parents:
723
diff
changeset
|
507 """Enable the internal lookup cache and the interpolation cache. |
|
75d37575472b
Docs: Add does to some methods that are yet missing docs
Franz Glasner <fzglas.hg@dom66.de>
parents:
723
diff
changeset
|
508 |
|
75d37575472b
Docs: Add does to some methods that are yet missing docs
Franz Glasner <fzglas.hg@dom66.de>
parents:
723
diff
changeset
|
509 The caches are empty after enabling. |
|
75d37575472b
Docs: Add does to some methods that are yet missing docs
Franz Glasner <fzglas.hg@dom66.de>
parents:
723
diff
changeset
|
510 |
|
75d37575472b
Docs: Add does to some methods that are yet missing docs
Franz Glasner <fzglas.hg@dom66.de>
parents:
723
diff
changeset
|
511 """ |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
512 self.__lookup_cache = {} |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
513 self.__interpolation_cache = {} |
|
506
dffa692751b1
Implement clear_cache() for the configuration
Franz Glasner <fzglas.hg@dom66.de>
parents:
504
diff
changeset
|
514 |
|
437
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
515 def __getitem__(self, key): |
| 469 | 516 """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
|
517 |
|
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
518 """ |
|
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
519 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
|
520 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
|
521 else: |
|
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
522 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
|
523 |
|
442
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
524 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
|
525 """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
|
526 |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
527 """ |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
528 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
|
529 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
|
530 else: |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
531 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
|
532 |
|
439
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
533 def __contains__(self, key): |
| 469 | 534 """Containment test""" |
|
439
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
535 if isinstance(key, (tuple, list)): |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
536 # 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
|
537 try: |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
538 self._lookupvar(*key) |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
539 except KeyError: |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
540 return False |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
541 else: |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
542 return True |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
543 else: |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
544 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
|
545 |
|
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
|
546 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
|
547 """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
|
548 |
|
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
|
549 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
|
550 |
|
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
|
551 """ |
|
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
|
552 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
|
553 |
|
517
328af767f5f8
Implement Configuration.items() and Configuration.values() without interpolating the values
Franz Glasner <fzglas.hg@dom66.de>
parents:
516
diff
changeset
|
554 def items(self): |
|
328af767f5f8
Implement Configuration.items() and Configuration.values() without interpolating the values
Franz Glasner <fzglas.hg@dom66.de>
parents:
516
diff
changeset
|
555 """Items without interpolation""" |
|
328af767f5f8
Implement Configuration.items() and Configuration.values() without interpolating the values
Franz Glasner <fzglas.hg@dom66.de>
parents:
516
diff
changeset
|
556 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
|
557 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
|
558 |
|
328af767f5f8
Implement Configuration.items() and Configuration.values() without interpolating the values
Franz Glasner <fzglas.hg@dom66.de>
parents:
516
diff
changeset
|
559 def values(self): |
|
328af767f5f8
Implement Configuration.items() and Configuration.values() without interpolating the values
Franz Glasner <fzglas.hg@dom66.de>
parents:
516
diff
changeset
|
560 """Values without interpolation""" |
|
328af767f5f8
Implement Configuration.items() and Configuration.values() without interpolating the values
Franz Glasner <fzglas.hg@dom66.de>
parents:
516
diff
changeset
|
561 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
|
562 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
|
563 |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
564 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
|
565 """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
|
566 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
|
567 |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
568 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
|
569 |
|
382
24db29162d09
Renamed "names" arguments into the more proper "path"
Franz Glasner <fzglas.hg@dom66.de>
parents:
381
diff
changeset
|
570 Quoting of `path` and `namespace` is *not* needed and wrong. |
| 333 | 571 |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
572 """ |
|
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
|
573 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
|
574 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
|
575 try: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
576 if not namespace: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
577 lookupfn = self._lookupvar |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
578 else: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
579 if namespace == REF_NAMESPACE: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
580 lookupfn = self._lookupref |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
581 else: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
582 lookupfn = lookup_varns(namespace) |
|
382
24db29162d09
Renamed "names" arguments into the more proper "path"
Franz Glasner <fzglas.hg@dom66.de>
parents:
381
diff
changeset
|
583 varvalue = lookupfn(*path) |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
584 except KeyError: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
585 if default is _MARKER: |
|
382
24db29162d09
Renamed "names" arguments into the more proper "path"
Franz Glasner <fzglas.hg@dom66.de>
parents:
381
diff
changeset
|
586 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
|
587 else: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
588 return default |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
589 else: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
590 return varvalue |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
591 |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
592 if _fast_getvarl: |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
593 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
594 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
|
595 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
|
596 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
597 getvarl = fast_getvarl |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
598 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
599 else: |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
600 getvarl = py_getvarl |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
601 |
|
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
|
602 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
|
603 """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
|
604 |
|
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
|
605 :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
|
606 :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
|
607 |
|
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
|
608 .. 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
|
609 |
|
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
|
610 """ |
|
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
|
611 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
|
612 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
|
613 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
|
614 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
|
615 |
|
381
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
616 def getfirstvarl(self, *paths, **kwds): |
|
385
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
617 """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
|
618 variable in the `paths` list. |
|
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
619 |
|
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
620 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
|
621 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
|
622 and "path". |
|
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
623 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
|
624 to be `None`. |
|
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
625 |
| 389 | 626 Note that a caller that wants to use variables from a non-default |
| 627 namespace must use a sequence of dicts. | |
| 628 | |
|
385
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
629 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
|
630 |
|
4beeb291926d
First documentation of getfirstvarl()
Franz Glasner <fzglas.hg@dom66.de>
parents:
384
diff
changeset
|
631 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
|
632 |
|
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
|
633 """ |
|
381
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
634 default = kwds.pop("default", _MARKER) |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
635 for path in paths: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
636 if isinstance(path, (list, tuple)): |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
637 try: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
638 varvalue = self.getvarl(*path) |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
639 except KeyError: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
640 pass |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
641 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
642 return varvalue |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
643 elif isinstance(path, dict): |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
644 try: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
645 namespace = path["namespace"] |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
646 p = path["path"] |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
647 except KeyError: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
648 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
|
649 " and a `namespace' key") |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
650 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
651 try: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
652 varvalue = self.getvarl(*p, namespace=namespace) |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
653 except KeyError: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
654 pass |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
655 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
656 return varvalue |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
657 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
658 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
|
659 if default is _MARKER: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
660 raise KeyError( |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
661 "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
|
662 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
663 return default |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
664 |
|
610
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
665 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
|
666 """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
|
667 variables from other namespaces. |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
668 |
|
202
2e66178a09d8
Docu: Ban "keyword expansion" -- use "variable interpolation" instead
Franz Glasner <fzglas.hg@dom66.de>
parents:
156
diff
changeset
|
669 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
|
670 |
| 333 | 671 Special characters (e.g. ``:`` and ``.``) must be quoted when using |
| 672 the default namespace. | |
| 673 | |
|
502
4f90e1eb7af8
Make quote() and unquote() module globals and also export from configmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
500
diff
changeset
|
674 See also :func:`.quote`. |
| 333 | 675 |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
676 """ |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
677 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
|
678 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
|
679 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
|
680 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
|
681 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
|
682 |
|
610
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
683 if _fast_getvar: |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
684 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
685 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
|
686 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
|
687 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
688 getvar = fast_getvar |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
689 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
690 else: |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
691 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
692 getvar = py_getvar |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
693 |
|
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
|
694 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
|
695 """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
|
696 |
|
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
|
697 :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
|
698 :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
|
699 |
|
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
|
700 .. 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
|
701 |
|
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
|
702 """ |
|
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
|
703 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
|
704 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
|
705 |
|
368
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
706 def getfirstvar(self, *varnames, **kwds): |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
707 """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
|
708 in the list of given variables in `varnames`. |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
709 |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
710 """ |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
711 default = kwds.pop("default", _MARKER) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
712 for varname in varnames: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
713 try: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
714 varvalue = self.getvar(varname) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
715 except KeyError: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
716 pass |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
717 else: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
718 return varvalue |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
719 if default is _MARKER: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
720 raise KeyError( |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
721 "none of the given variables found: %r" % (varnames,)) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
722 else: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
723 return default |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
724 |
|
610
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
725 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
|
726 """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
|
727 |
|
382
24db29162d09
Renamed "names" arguments into the more proper "path"
Franz Glasner <fzglas.hg@dom66.de>
parents:
381
diff
changeset
|
728 `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
|
729 :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
|
730 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
|
731 applied. |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
732 |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
733 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
|
734 |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
735 """ |
|
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
|
736 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
|
737 namespace = kwds.pop("namespace", None) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
738 try: |
|
382
24db29162d09
Renamed "names" arguments into the more proper "path"
Franz Glasner <fzglas.hg@dom66.de>
parents:
381
diff
changeset
|
739 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
|
740 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
|
741 except KeyError: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
742 if default is _MARKER: |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
743 raise |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
744 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
745 return default |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
746 |
|
610
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
747 if _fast_getvarl_s: |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
748 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
749 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
|
750 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
|
751 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
752 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
|
753 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
754 else: |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
755 |
|
764d4185c76a
C-implementations of Configuration.getvarl_s() and Configuration.getvar()
Franz Glasner <fzglas.hg@dom66.de>
parents:
603
diff
changeset
|
756 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
|
757 |
|
381
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
758 def getfirstvarl_s(self, *paths, **kwds): |
|
388
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
759 """A variant of :meth:`~.getfirstvarl` that does variable |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
760 interpolation. |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
761 |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
762 `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
|
763 But variables will be interpolated |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
764 recursively within the variable values and filters are |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
765 applied. |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
766 |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
767 For more details see chapter :ref:`variable-interpolation`. |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
768 |
|
13427f37abab
Docs: document Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
385
diff
changeset
|
769 """ |
|
381
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
770 default = kwds.pop("default", _MARKER) |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
771 for path in paths: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
772 if isinstance(path, (list, tuple)): |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
773 try: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
774 obj = self.getvarl(*path) |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
775 except KeyError: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
776 pass |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
777 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
778 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
|
779 |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
780 elif isinstance(path, dict): |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
781 try: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
782 namespace = path["namespace"] |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
783 p = path["path"] |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
784 except KeyError: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
785 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
|
786 " and a `namespace' key") |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
787 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
788 try: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
789 obj = self.getvarl(*p, namespace=namespace) |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
790 except KeyError: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
791 pass |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
792 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
793 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
|
794 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
795 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
|
796 if default is _MARKER: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
797 raise KeyError( |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
798 "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
|
799 else: |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
800 return default |
|
fe3dfd687621
Implemented Configuration.getfirstvarl() and Configuration.getfirstvarl_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
380
diff
changeset
|
801 |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
802 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
|
803 """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
|
804 |
|
115
a5339d39af5c
Begin the documentation of variables and its expansion
Franz Glasner <hg@dom66.de>
parents:
104
diff
changeset
|
805 `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
|
806 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
|
807 and filters are applied. |
|
115
a5339d39af5c
Begin the documentation of variables and its expansion
Franz Glasner <hg@dom66.de>
parents:
104
diff
changeset
|
808 |
|
202
2e66178a09d8
Docu: Ban "keyword expansion" -- use "variable interpolation" instead
Franz Glasner <fzglas.hg@dom66.de>
parents:
156
diff
changeset
|
809 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
|
810 |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
811 """ |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
812 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
|
813 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
|
814 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
|
815 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
|
816 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
|
817 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
|
818 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
|
819 self.getvarl(varname, namespace=varns)) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
820 except KeyError: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
821 if default is _MARKER: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
822 raise |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
823 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
824 return default |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
825 |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
826 if _fast_getvar_s: |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
827 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
828 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
|
829 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
|
830 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
831 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
|
832 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
833 else: |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
834 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
835 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
|
836 |
|
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
837 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
|
838 """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
|
839 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
|
840 |
| 722 | 841 Caching is currently not allowed when namespaces are used -- |
| 842 as their implementations may not be deeterministic (or | |
| 843 ``immutable`` in the sense of PostgreSQL). | |
|
530
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
844 |
|
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
845 Currently used by :meth:`~.interpolate_variables`. |
|
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
846 |
|
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
847 """ |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
848 varns, varname = _split_ns(varname) |
|
530
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
849 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
|
850 # 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
|
851 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
|
852 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
|
853 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
|
854 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
|
855 ) |
|
530
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
856 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
|
857 # 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
|
858 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
|
859 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
|
860 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
|
861 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
|
862 ) |
|
530
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
863 |
|
368
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
864 def getfirstvar_s(self, *varnames, **kwds): |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
865 """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
|
866 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
|
867 |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
868 """ |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
869 default = kwds.pop("default", _MARKER) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
870 for varname in varnames: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
871 try: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
872 obj = self.getvar(varname) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
873 except KeyError: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
874 pass |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
875 else: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
876 return self.substitute_variables_in_obj(obj) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
877 if default is _MARKER: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
878 raise KeyError( |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
879 "none of the given variables found: %r" % (varnames,)) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
880 else: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
881 return default |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
882 |
|
489
b49164db1273
Remove unused keyword params for ._lookupvar().
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
488
diff
changeset
|
883 def _lookupvar(self, *path): |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
884 """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
|
885 |
|
489
b49164db1273
Remove unused keyword params for ._lookupvar().
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
488
diff
changeset
|
886 :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
|
887 |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
888 """ |
|
419
079a82129110
Allow the empty variable name to retrieve the root configuration object
Franz Glasner <fzglas.hg@dom66.de>
parents:
418
diff
changeset
|
889 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
|
890 return self |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
891 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
|
892 if use_cache: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
893 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
|
894 if v is not _MARKER: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
895 if v is _MISSING: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
896 raise KeyError( |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
897 "Configuration variable %r not found" |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
898 " (negative internal cache value)" % (path,)) |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
899 else: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
900 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
|
901 eiref = self.expand_if_reference |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
902 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
|
903 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
|
904 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
|
905 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
|
906 except TypeError: |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
907 if use_cache: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
908 self.__lookup_cache[path] = _MISSING |
|
207
b3b5ed34d180
Handle most flake8 errors and warnings.
Franz Glasner <fzglas.hg@dom66.de>
parents:
202
diff
changeset
|
909 raise KeyError( |
|
b3b5ed34d180
Handle most flake8 errors and warnings.
Franz Glasner <fzglas.hg@dom66.de>
parents:
202
diff
changeset
|
910 "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
|
911 "(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
|
912 except KeyError: |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
913 if use_cache: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
914 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
|
915 raise |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
916 if use_cache: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
917 self.__lookup_cache[path] = v |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
918 return v |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
919 |
|
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
|
920 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
|
921 """ |
| 311 | 922 |
| 923 `key` must be a configuration reference URI without any | |
| 924 (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
|
925 |
| 519 | 926 :raise KeyError: If the reference is not found |
| 927 | |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
928 """ |
|
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
|
929 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
|
930 |
|
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
|
931 def expand_if_reference(self, v): |
| 311 | 932 """Check whether `v` is a configuration reference and -- if true -- |
| 933 then expand it. | |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
934 |
| 310 | 935 `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
|
936 |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
937 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
|
938 unchanged. |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
939 |
| 678 | 940 :raise KeyError: If the reference cannot found |
|
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
|
941 |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
942 """ |
|
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
|
943 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
|
944 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
|
945 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
|
946 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
|
947 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
|
948 else: |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
949 return v |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
950 |
|
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
|
951 def expand_ref_uri(self, uri): |
| 519 | 952 """ |
| 953 | |
| 954 :raises KeyError: If the reference URI is not found | |
| 955 | |
| 956 """ | |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
957 pu = urlsplit(uri) |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
958 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
|
959 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
|
960 if not pu.fragment: |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
961 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
|
962 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
|
963 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
|
964 return self.getvar(pu.fragment) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
965 |
|
679
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
966 def try_get_reference_uri(self, v): |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
967 """Check whether `v` is a configuration reference and -- if true -- |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
968 return the configuration path where the reference points to. |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
969 |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
970 If `v` is not a text type or not a reference return `None`. |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
971 |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
972 Does not check whether the referenced configuration object exists. |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
973 |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
974 :rtype: None or str |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
975 |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
976 """ |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
977 if not isinstance(v, _TEXTTYPE): |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
978 return None |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
979 if v.startswith(_STARTTOK_REF) and v.endswith(_ENDTOK_REF): |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
980 uri = v[len(_STARTTOK_REF):-len(_ENDTOK_REF)] |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
981 pu = urlsplit(uri) |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
982 if pu.scheme or pu.netloc or pu.path or pu.query: |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
983 raise ValueError("only fragment-only URIs are supported") |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
984 if not pu.fragment: |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
985 return _EMPTY_STR |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
986 if pu.fragment.startswith(_DOT): |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
987 raise ValueError("relative refs not supported") |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
988 return pu.fragment |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
989 return None |
|
aa39c1856de4
Begin "ref:" support for jails.
Franz Glasner <fzglas.hg@dom66.de>
parents:
678
diff
changeset
|
990 |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
991 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
|
992 """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
|
993 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
|
994 if issubclass(ty, _TEXTTYPE): |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
995 # 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
|
996 return self.interpolate_variables(obj) |
|
491
de776953337b
Remove repeated type(obj) calls
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
490
diff
changeset
|
997 elif issubclass(ty, dict): |
|
de776953337b
Remove repeated type(obj) calls
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
490
diff
changeset
|
998 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
|
999 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
|
1000 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
|
1001 return newdict |
|
491
de776953337b
Remove repeated type(obj) calls
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
490
diff
changeset
|
1002 elif issubclass(ty, list): |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1003 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
|
1004 elif issubclass(ty, tuple): |
|
512
bf8a1b1498db
Remove a temporary variable usage
Franz Glasner <fzglas.hg@dom66.de>
parents:
511
diff
changeset
|
1005 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
|
1006 elif issubclass(ty, set): |
|
de776953337b
Remove repeated type(obj) calls
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
490
diff
changeset
|
1007 newset = ty() |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1008 for i in obj: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1009 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
|
1010 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1011 return obj |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1012 |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1013 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
|
1014 """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
|
1015 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
|
1016 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
|
1017 return s |
|
637
4499e9b4855d
The ``{{::DEL::}}`` is not subject to interpolation any more.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
610
diff
changeset
|
1018 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
|
1019 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
|
1020 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
|
1021 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
|
1022 return s |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
1023 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
|
1024 if use_cache: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
1025 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
|
1026 if res is not _MARKER: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
1027 if res is _MISSING: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
1028 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
|
1029 "%r (cached)" % (s, ), |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
1030 UserWarning, |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
1031 stacklevel=1) |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
1032 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
|
1033 "%r (cached)" % (s, )) |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
1034 else: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
1035 return res |
|
711
6557cf9ecea5
FIX: When using attribute access for configurations the values are interpolated since long ago: fix the docu and add a test for that behaviour
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
708
diff
changeset
|
1036 |
|
703
193a616e0b3c
Begin implementation of filter-only expansions (recursive with respect to expansion)
Franz Glasner <fzglas.hg@dom66.de>
parents:
702
diff
changeset
|
1037 if ((len_s >= 6) |
|
193a616e0b3c
Begin implementation of filter-only expansions (recursive with respect to expansion)
Franz Glasner <fzglas.hg@dom66.de>
parents:
702
diff
changeset
|
1038 and (s[2] == _FILTER_SEPARATOR) |
|
193a616e0b3c
Begin implementation of filter-only expansions (recursive with respect to expansion)
Franz Glasner <fzglas.hg@dom66.de>
parents:
702
diff
changeset
|
1039 and (start == 0)): |
|
193a616e0b3c
Begin implementation of filter-only expansions (recursive with respect to expansion)
Franz Glasner <fzglas.hg@dom66.de>
parents:
702
diff
changeset
|
1040 if s.find(_ENDTOK_FILTER, 3) != (len_s - 3): |
|
723
c17a4e30ebbf
Docs for nested filters
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
722
diff
changeset
|
1041 raise ValueError("`{{|' nested filter interpolation must end with `|}}'") |
|
705
0485a033c95d
FIX: Parsing a filter chain for the new filter-only expansions: parse them backwards and use "," as filter-chain separator here.
Franz Glasner <fzglas.hg@dom66.de>
parents:
703
diff
changeset
|
1042 new_s, filters = _split_filters(s[3:-3], -1) |
|
703
193a616e0b3c
Begin implementation of filter-only expansions (recursive with respect to expansion)
Franz Glasner <fzglas.hg@dom66.de>
parents:
702
diff
changeset
|
1043 try: |
|
193a616e0b3c
Begin implementation of filter-only expansions (recursive with respect to expansion)
Franz Glasner <fzglas.hg@dom66.de>
parents:
702
diff
changeset
|
1044 varvalue = self.py_interpolate_variables(new_s) |
|
193a616e0b3c
Begin implementation of filter-only expansions (recursive with respect to expansion)
Franz Glasner <fzglas.hg@dom66.de>
parents:
702
diff
changeset
|
1045 except KeyError: |
|
193a616e0b3c
Begin implementation of filter-only expansions (recursive with respect to expansion)
Franz Glasner <fzglas.hg@dom66.de>
parents:
702
diff
changeset
|
1046 if NONE_FILTER in filters: |
|
193a616e0b3c
Begin implementation of filter-only expansions (recursive with respect to expansion)
Franz Glasner <fzglas.hg@dom66.de>
parents:
702
diff
changeset
|
1047 varvalue = None |
|
193a616e0b3c
Begin implementation of filter-only expansions (recursive with respect to expansion)
Franz Glasner <fzglas.hg@dom66.de>
parents:
702
diff
changeset
|
1048 elif EMPTY_FILTER in filters: |
|
193a616e0b3c
Begin implementation of filter-only expansions (recursive with respect to expansion)
Franz Glasner <fzglas.hg@dom66.de>
parents:
702
diff
changeset
|
1049 varvalue = _EMPTY_STR |
|
193a616e0b3c
Begin implementation of filter-only expansions (recursive with respect to expansion)
Franz Glasner <fzglas.hg@dom66.de>
parents:
702
diff
changeset
|
1050 else: |
|
193a616e0b3c
Begin implementation of filter-only expansions (recursive with respect to expansion)
Franz Glasner <fzglas.hg@dom66.de>
parents:
702
diff
changeset
|
1051 raise |
|
193a616e0b3c
Begin implementation of filter-only expansions (recursive with respect to expansion)
Franz Glasner <fzglas.hg@dom66.de>
parents:
702
diff
changeset
|
1052 varvalue = self._apply_filters(filters, varvalue) |
|
193a616e0b3c
Begin implementation of filter-only expansions (recursive with respect to expansion)
Franz Glasner <fzglas.hg@dom66.de>
parents:
702
diff
changeset
|
1053 return varvalue |
|
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
|
1054 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
|
1055 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
|
1056 rest = 0 |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
1057 cacheable = True |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1058 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
|
1059 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
|
1060 end = s.find(_ENDTOK, start) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1061 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
|
1062 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
|
1063 break |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
1064 varname, filters = _split_filters( |
|
705
0485a033c95d
FIX: Parsing a filter chain for the new filter-only expansions: parse them backwards and use "," as filter-chain separator here.
Franz Glasner <fzglas.hg@dom66.de>
parents:
703
diff
changeset
|
1065 s[start+2:end], 1) # noqa: E226 |
|
39
8715e5cc59ac
Print a warning if a variable cannot be expanded.
Franz Glasner <hg@dom66.de>
parents:
36
diff
changeset
|
1066 try: |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
1067 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
|
1068 except KeyError: |
|
530
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
1069 cacheable = True |
|
528
54a8d020f5d5
Apply None and Empty interpolation filters only on KeyErrors
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
527
diff
changeset
|
1070 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
|
1071 varvalue = None |
|
54a8d020f5d5
Apply None and Empty interpolation filters only on KeyErrors
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
527
diff
changeset
|
1072 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
|
1073 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
|
1074 else: |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
1075 if use_cache and cacheable: |
|
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
1076 self.__interpolation_cache[s] = _MISSING |
|
530
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
1077 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
|
1078 "%r" % (varname, s, ), |
|
54a8d020f5d5
Apply None and Empty interpolation filters only on KeyErrors
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
527
diff
changeset
|
1079 UserWarning, |
|
54a8d020f5d5
Apply None and Empty interpolation filters only on KeyErrors
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
527
diff
changeset
|
1080 stacklevel=1) |
|
54a8d020f5d5
Apply None and Empty interpolation filters only on KeyErrors
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
527
diff
changeset
|
1081 raise |
|
530
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
1082 if not cacheable: |
|
647
df58983f28a2
Allow to disable the internal caching in configmix.
Franz Glasner <fzglas.hg@dom66.de>
parents:
640
diff
changeset
|
1083 cacheable = False |
|
528
54a8d020f5d5
Apply None and Empty interpolation filters only on KeyErrors
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
527
diff
changeset
|
1084 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
|
1085 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
|
1086 # |
|
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
|
1087 # 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
|
1088 # 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
|
1089 # |
|
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
|
1090 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
|
1091 if use_cache and cacheable: |
|
530
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
1092 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
|
1093 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
|
1094 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
|
1095 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
|
1096 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
|
1097 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
|
1098 # 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
|
1099 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
|
1100 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
|
1101 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
|
1102 if use_cache and cacheable: |
|
530
28191d61b042
FIX: Handle non-cacheable interpolations properly.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
529
diff
changeset
|
1103 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
|
1104 return res |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1105 |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1106 if _fast_interpolate_variables: |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1107 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1108 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
|
1109 return _fast_interpolate_variables( |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1110 self, s, self.__interpolation_cache) |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1111 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1112 interpolate_variables = fast_interpolate_variables |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1113 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1114 else: |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1115 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1116 interpolate_variables = py_interpolate_variables |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1117 |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1118 def _apply_filters(self, filters, value): |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1119 for name in filters: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1120 try: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1121 filterfn = lookup_filter(name) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1122 except KeyError: |
|
40
8d66aef2f7fb
Comment about exceptions when filters are missing.
Franz Glasner <hg@dom66.de>
parents:
39
diff
changeset
|
1123 # |
|
8d66aef2f7fb
Comment about exceptions when filters are missing.
Franz Glasner <hg@dom66.de>
parents:
39
diff
changeset
|
1124 # 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
|
1125 # a very serious error. |
|
8d66aef2f7fb
Comment about exceptions when filters are missing.
Franz Glasner <hg@dom66.de>
parents:
39
diff
changeset
|
1126 # |
|
521
1001701be682
Formatting of NameErrors in ._apply_filters(): put "name" into a tuple explicitely
Franz Glasner <fzglas.hg@dom66.de>
parents:
519
diff
changeset
|
1127 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
|
1128 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1129 value = filterfn(self, value) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
1130 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
|
1131 |
|
685
2e7920b0b4d9
Because Configuration.getvarl() expands references internally already extra handling of references in .jailed() is not needed
Franz Glasner <fzglas.hg@dom66.de>
parents:
684
diff
changeset
|
1132 def jailed(self, rootpath=None, root=None, bind_root=True): |
| 399 | 1133 """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
|
1134 |
|
655
b74f20e19c01
Docstring: be more accurate now in ".jailed()"
Franz Glasner <fzglas.hg@dom66.de>
parents:
648
diff
changeset
|
1135 :param rootpath: a sequence of strings (or objects) that shall |
|
b74f20e19c01
Docstring: be more accurate now in ".jailed()"
Franz Glasner <fzglas.hg@dom66.de>
parents:
648
diff
changeset
|
1136 emcompass the chroot-like jail of the returned |
| 399 | 1137 configuration |
| 1138 :type rootpath: list or tuple | |
| 1139 :param str root: a string path expression that shall encompass | |
| 1140 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
|
1141 :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
|
1142 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
|
1143 `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
|
1144 the default |
| 397 | 1145 :return: a jailed (aka restricted) configuration |
| 1146 :rtype: _JailedConfiguration | |
| 1147 | |
| 399 | 1148 Exactly one of `rootpath` or `root` must be given. |
| 1149 | |
|
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
|
1150 """ |
|
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
|
1151 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
|
1152 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
|
1153 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
|
1154 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
|
1155 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
|
1156 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
|
1157 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
|
1158 # convert to path |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
1159 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
|
1160 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
|
1161 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
|
1162 "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
|
1163 rootpath = pathstr2path(root) |
|
685
2e7920b0b4d9
Because Configuration.getvarl() expands references internally already extra handling of references in .jailed() is not needed
Franz Glasner <fzglas.hg@dom66.de>
parents:
684
diff
changeset
|
1164 # if resolve_ref: |
|
2e7920b0b4d9
Because Configuration.getvarl() expands references internally already extra handling of references in .jailed() is not needed
Franz Glasner <fzglas.hg@dom66.de>
parents:
684
diff
changeset
|
1165 # while True: |
|
2e7920b0b4d9
Because Configuration.getvarl() expands references internally already extra handling of references in .jailed() is not needed
Franz Glasner <fzglas.hg@dom66.de>
parents:
684
diff
changeset
|
1166 # target = self.getvarl(*rootpath) |
|
2e7920b0b4d9
Because Configuration.getvarl() expands references internally already extra handling of references in .jailed() is not needed
Franz Glasner <fzglas.hg@dom66.de>
parents:
684
diff
changeset
|
1167 # target_uri = self.try_get_reference_uri(target) |
|
2e7920b0b4d9
Because Configuration.getvarl() expands references internally already extra handling of references in .jailed() is not needed
Franz Glasner <fzglas.hg@dom66.de>
parents:
684
diff
changeset
|
1168 # if target_uri is None: |
|
2e7920b0b4d9
Because Configuration.getvarl() expands references internally already extra handling of references in .jailed() is not needed
Franz Glasner <fzglas.hg@dom66.de>
parents:
684
diff
changeset
|
1169 # break |
|
2e7920b0b4d9
Because Configuration.getvarl() expands references internally already extra handling of references in .jailed() is not needed
Franz Glasner <fzglas.hg@dom66.de>
parents:
684
diff
changeset
|
1170 # rootpath = pathstr2path(target_uri) |
|
411
3c95faa91dad
Optimize the creation of a jailed config.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
406
diff
changeset
|
1171 jc = _JailedConfiguration(*rootpath) |
|
3c95faa91dad
Optimize the creation of a jailed config.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
406
diff
changeset
|
1172 if bind_root: |
|
3c95faa91dad
Optimize the creation of a jailed config.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
406
diff
changeset
|
1173 jc.rebind(self) |
|
3c95faa91dad
Optimize the creation of a jailed config.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
406
diff
changeset
|
1174 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
|
1175 |
|
666
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1176 def iter_jailed(self, rootpath=None, root=None): |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1177 """Iterator that yields properly jailed configurations. |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1178 |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1179 `rootpath` or `root` must refer to a `list` or `dict` container. |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1180 |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1181 """ |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1182 return self.jailed(rootpath=rootpath, root=root).iter_jailed() |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1183 |
|
756
cabd1046d95f
Extract new config methods extract_new_config
Franz Glasner <fzglas.hg@dom66.de>
parents:
731
diff
changeset
|
1184 def extract_new_config(self, *path, **kwds): |
|
cabd1046d95f
Extract new config methods extract_new_config
Franz Glasner <fzglas.hg@dom66.de>
parents:
731
diff
changeset
|
1185 """Get the value at `path` and make a new :class:`~.Configuration` from it. |
|
cabd1046d95f
Extract new config methods extract_new_config
Franz Glasner <fzglas.hg@dom66.de>
parents:
731
diff
changeset
|
1186 |
|
762
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1187 The new configuration is a deepcopy and completely independent |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1188 of the source configuration. |
|
756
cabd1046d95f
Extract new config methods extract_new_config
Franz Glasner <fzglas.hg@dom66.de>
parents:
731
diff
changeset
|
1189 |
|
cabd1046d95f
Extract new config methods extract_new_config
Franz Glasner <fzglas.hg@dom66.de>
parents:
731
diff
changeset
|
1190 """ |
|
cabd1046d95f
Extract new config methods extract_new_config
Franz Glasner <fzglas.hg@dom66.de>
parents:
731
diff
changeset
|
1191 return self.__class__(copy.deepcopy(self.getvarl(*path, **kwds))) |
|
cabd1046d95f
Extract new config methods extract_new_config
Franz Glasner <fzglas.hg@dom66.de>
parents:
731
diff
changeset
|
1192 |
|
762
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1193 def copy_new_config_without(self, *path): |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1194 """Copy the current configuration but leave out the value at key |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1195 `path`. |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1196 |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1197 The new configuration is a deepcopy and completely independent |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1198 of the source configuration. |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1199 |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1200 .. note:: Currently only a "simple" `path` with length 1 is |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1201 supported. References are not supported. |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1202 |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1203 """ |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1204 # |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1205 # Manual copy: avoid direct and indirect calls to self.__getitem__ |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1206 # because it interpolates. |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1207 # |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1208 if path: |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1209 if len(path) != 1: |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1210 raise ValueError("Only a `path' with length 1 is supported") |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1211 nc = {} |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1212 for i in self: |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1213 if (not path) or (i != path[0]): |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1214 nc[i] = copy.deepcopy(self.getvarl(i)) |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1215 return self.__class__(nc) |
|
3eb2c451026b
Implement Configuration.copy_new_config_without()
Franz Glasner <fzglas.hg@dom66.de>
parents:
756
diff
changeset
|
1216 |
|
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
|
1217 |
|
412
816327e178b0
Provide coercing methods for the jailed configuration: getintXXX(), getboolXXX(), getfloatXXX() and friends.
Franz Glasner <fzglas.hg@dom66.de>
parents:
411
diff
changeset
|
1218 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
|
1219 |
| 397 | 1220 """A jailed and restricted variant of :class:`Configuration`. |
| 1221 | |
| 399 | 1222 Restriction is two-fold: |
| 1223 | |
| 1224 - The access to configuration variables in `config` is restricted | |
| 1225 to the configuration sub-tree that is configured in `path`. | |
| 1226 | |
| 1227 - Not all access-methods of :class:`Configuration` are implemented | |
| 1228 yet. | |
| 1229 | |
| 400 | 1230 .. seealso:: :ref:`jailed-configuration` |
| 1231 | |
| 399 | 1232 .. note:: There is no namespace support. |
| 1233 | |
| 1234 .. note:: Do not call the constructor directly. Instantiate a jailed | |
| 1235 configuration from the parent configuration's | |
| 1236 :meth:`~.Configuration.jailed` factory method. | |
| 397 | 1237 |
| 1238 """ | |
|
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 |
|
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
|
1240 __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
|
1241 |
|
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
|
1242 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
|
1243 """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
|
1244 |
|
411
3c95faa91dad
Optimize the creation of a jailed config.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
406
diff
changeset
|
1245 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
|
1246 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
|
1247 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
|
1248 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
|
1249 |
|
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
|
1250 @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
|
1251 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
|
1252 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
|
1253 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
|
1254 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
|
1255 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
|
1256 + _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
|
1257 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
|
1258 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
|
1259 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
|
1260 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
|
1261 |
|
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
|
1262 @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
|
1263 def base(self): |
|
426
84d4f82ffe59
Docs: more on jails and sub-jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
419
diff
changeset
|
1264 """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
|
1265 |
|
84d4f82ffe59
Docs: more on jails and sub-jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
419
diff
changeset
|
1266 This configuration is always unjailed. |
|
84d4f82ffe59
Docs: more on jails and sub-jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
419
diff
changeset
|
1267 |
|
84d4f82ffe59
Docs: more on jails and sub-jails
Franz Glasner <fzglas.hg@dom66.de>
parents:
419
diff
changeset
|
1268 """ |
|
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
|
1269 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
|
1270 |
|
405
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1271 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
|
1272 """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
|
1273 |
|
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1274 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
|
1275 the root. |
|
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1276 |
|
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1277 :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
|
1278 |
|
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1279 """ |
|
af367e1d0950
Allow to rebind a jailed configuration to another "similar" base
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
404
diff
changeset
|
1280 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
|
1281 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
|
1282 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
|
1283 # |
|
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
|
1284 # 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
|
1285 # 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
|
1286 # |
|
449
5864977bb44f
FIX: KeyError formatting.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
448
diff
changeset
|
1287 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
|
1288 raise KeyError( |
|
5864977bb44f
FIX: KeyError formatting.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
448
diff
changeset
|
1289 "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
|
1290 % (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
|
1291 |
|
448
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1292 def __getattr__(self, name): |
| 469 | 1293 """Attribute-style access. |
| 1294 | |
| 1295 Result values are interpolated (i.e. forwarded to | |
| 1296 :meth:`~.getvarl_s`) | |
| 1297 | |
| 1298 """ | |
|
448
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1299 try: |
|
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1300 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
|
1301 except KeyError: |
|
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1302 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
|
1303 else: |
|
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1304 # 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
|
1305 if isinstance(v, dict): |
|
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1306 return _AttributeDict(v) |
|
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1307 else: |
|
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1308 return v |
|
b95c12781497
Attribute-style access for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
443
diff
changeset
|
1309 |
|
437
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
1310 def __getitem__(self, key): |
| 469 | 1311 """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
|
1312 |
|
bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
Franz Glasner <fzglas.hg@dom66.de>
parents:
432
diff
changeset
|
1313 """ |
|
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
|
1314 if isinstance(key, tuple): |
|
440
f297c23f78f0
Optimize __getitem__() in jailed configurations: call base directly
Franz Glasner <fzglas.hg@dom66.de>
parents:
439
diff
changeset
|
1315 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
|
1316 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
|
1317 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
|
1318 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
|
1319 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
|
1320 |
|
442
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
1321 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
|
1322 if isinstance(key, tuple): |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
1323 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
|
1324 elif isinstance(key, list): |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
1325 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
|
1326 else: |
|
94cf5a8722d6
Add proper .get() support for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
441
diff
changeset
|
1327 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
|
1328 |
|
439
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
1329 def __contains__(self, key): |
| 469 | 1330 """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
|
1331 if isinstance(key, tuple): |
|
439
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
1332 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
|
1333 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
|
1334 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
|
1335 else: |
|
bd27da55483a
Optimized __contains__() implementation for jailed and unjailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
438
diff
changeset
|
1336 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
|
1337 |
|
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
|
1338 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
|
1339 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
|
1340 |
|
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
|
1341 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
|
1342 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
|
1343 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
|
1344 |
|
398
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1345 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
|
1346 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
|
1347 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
|
1348 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
|
1349 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
|
1350 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
|
1351 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
|
1352 "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
|
1353 else: |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1354 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
|
1355 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
|
1356 |
|
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
|
1357 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
|
1358 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
|
1359 |
|
398
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1360 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
|
1361 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
|
1362 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
|
1363 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
|
1364 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
|
1365 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
|
1366 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
|
1367 "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
|
1368 else: |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1369 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
|
1370 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
|
1371 |
|
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
|
1372 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
|
1373 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
|
1374 **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
|
1375 |
|
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
|
1376 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
|
1377 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
|
1378 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
|
1379 |
|
398
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1380 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
|
1381 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
|
1382 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
|
1383 |
|
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
|
1384 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
|
1385 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
|
1386 **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
|
1387 |
|
b1f82b853290
Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
397
diff
changeset
|
1388 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
|
1389 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
|
1390 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
|
1391 |
|
459
9dc9cef1b9cd
Implement proper iteration support for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
455
diff
changeset
|
1392 def __iter__(self): |
| 469 | 1393 """Iteration support for containers""" |
|
459
9dc9cef1b9cd
Implement proper iteration support for jailed configurations
Franz Glasner <fzglas.hg@dom66.de>
parents:
455
diff
changeset
|
1394 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
|
1395 |
|
467
9fcdc42a0457
len-support for jailed configurations: implement a proper __len__() method
Franz Glasner <fzglas.hg@dom66.de>
parents:
460
diff
changeset
|
1396 def __len__(self): |
| 469 | 1397 """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
|
1398 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
|
1399 |
|
666
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1400 def iter_jailed(self): |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1401 """Iteration support for containers which yields properly jailed |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1402 sub-jails. |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1403 |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1404 Only supported for type `list` or type `dict` jails. |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1405 |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1406 """ |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1407 container = self._base.getvarl(*self._path) |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1408 if isinstance(container, dict): |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1409 for k in container: |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1410 yield self.jailed(rootpath=(k, )) |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1411 elif isinstance(container, list): |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1412 len_container = len(container) |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1413 idx = 0 |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1414 while idx < len_container: |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1415 yield self.jailed(rootpath=(idx, )) |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1416 idx += 1 |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1417 else: |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1418 raise TypeError( |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1419 "jailed iterators only supported for lists and dicts") |
|
0eff8441c4b9
Implement iteration support that yields properly jailed configurations for each container item
Franz Glasner <fzglas.hg@dom66.de>
parents:
656
diff
changeset
|
1420 |
|
460
d22985d6806e
Proper boolean context for jailed configurations: __bool__()/__nonzero__()
Franz Glasner <fzglas.hg@dom66.de>
parents:
459
diff
changeset
|
1421 if PY2: |
|
d22985d6806e
Proper boolean context for jailed configurations: __bool__()/__nonzero__()
Franz Glasner <fzglas.hg@dom66.de>
parents:
459
diff
changeset
|
1422 |
|
d22985d6806e
Proper boolean context for jailed configurations: __bool__()/__nonzero__()
Franz Glasner <fzglas.hg@dom66.de>
parents:
459
diff
changeset
|
1423 def __nonzero__(self): |
| 469 | 1424 """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
|
1425 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
|
1426 |
|
d22985d6806e
Proper boolean context for jailed configurations: __bool__()/__nonzero__()
Franz Glasner <fzglas.hg@dom66.de>
parents:
459
diff
changeset
|
1427 else: |
|
d22985d6806e
Proper boolean context for jailed configurations: __bool__()/__nonzero__()
Franz Glasner <fzglas.hg@dom66.de>
parents:
459
diff
changeset
|
1428 |
|
d22985d6806e
Proper boolean context for jailed configurations: __bool__()/__nonzero__()
Franz Glasner <fzglas.hg@dom66.de>
parents:
459
diff
changeset
|
1429 def __bool__(self): |
| 469 | 1430 """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
|
1431 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
|
1432 |
|
685
2e7920b0b4d9
Because Configuration.getvarl() expands references internally already extra handling of references in .jailed() is not needed
Franz Glasner <fzglas.hg@dom66.de>
parents:
684
diff
changeset
|
1433 def jailed(self, rootpath=None, root=None, bind_root=True): |
|
417
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1434 """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
|
1435 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
|
1436 |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1437 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
|
1438 |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1439 """ |
|
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1440 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
|
1441 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
|
1442 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
|
1443 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
|
1444 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
|
1445 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
|
1446 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
|
1447 # convert to path |
|
540
33856ae1cc0b
_split_ns() and _split_filters() are now module-globals
Franz Glasner <fzglas.hg@dom66.de>
parents:
539
diff
changeset
|
1448 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
|
1449 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
|
1450 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
|
1451 "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
|
1452 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
|
1453 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
|
1454 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
|
1455 else: |
|
510
acf1e8696d68
FIX: Some other lists that need to converted to tuples
Franz Glasner <fzglas.hg@dom66.de>
parents:
509
diff
changeset
|
1456 new_rootpath = tuple(rootpath) |
|
685
2e7920b0b4d9
Because Configuration.getvarl() expands references internally already extra handling of references in .jailed() is not needed
Franz Glasner <fzglas.hg@dom66.de>
parents:
684
diff
changeset
|
1457 # if resolve_ref: |
|
2e7920b0b4d9
Because Configuration.getvarl() expands references internally already extra handling of references in .jailed() is not needed
Franz Glasner <fzglas.hg@dom66.de>
parents:
684
diff
changeset
|
1458 # while True: |
|
2e7920b0b4d9
Because Configuration.getvarl() expands references internally already extra handling of references in .jailed() is not needed
Franz Glasner <fzglas.hg@dom66.de>
parents:
684
diff
changeset
|
1459 # target = self._base.getvarl(*new_rootpath) |
|
2e7920b0b4d9
Because Configuration.getvarl() expands references internally already extra handling of references in .jailed() is not needed
Franz Glasner <fzglas.hg@dom66.de>
parents:
684
diff
changeset
|
1460 # target_uri = self._base.try_get_reference_uri(target) |
|
2e7920b0b4d9
Because Configuration.getvarl() expands references internally already extra handling of references in .jailed() is not needed
Franz Glasner <fzglas.hg@dom66.de>
parents:
684
diff
changeset
|
1461 # if target_uri is None: |
|
2e7920b0b4d9
Because Configuration.getvarl() expands references internally already extra handling of references in .jailed() is not needed
Franz Glasner <fzglas.hg@dom66.de>
parents:
684
diff
changeset
|
1462 # break |
|
2e7920b0b4d9
Because Configuration.getvarl() expands references internally already extra handling of references in .jailed() is not needed
Franz Glasner <fzglas.hg@dom66.de>
parents:
684
diff
changeset
|
1463 # new_rootpath = pathstr2path(target_uri) |
|
417
83d537f1dfbb
Implement sub-jails: allow to get a jailed configuration from a jail
Franz Glasner <fzglas.hg@dom66.de>
parents:
416
diff
changeset
|
1464 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
|
1465 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
|
1466 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
|
1467 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
|
1468 |
|
b96f49c9c76b
Proper "repr()" for a jailed configuration: put the root path into the output
Franz Glasner <fzglas.hg@dom66.de>
parents:
428
diff
changeset
|
1469 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
|
1470 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
|
1471 return r |
|
554
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1472 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1473 |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1474 if _sync_MISSING: |
|
36d7aa000435
Implement a C-version of Configuration.interpolate_variables
Franz Glasner <fzglas.hg@dom66.de>
parents:
553
diff
changeset
|
1475 _sync_MISSING(_MISSING) |
|
713
1832c5d1bd00
Handle _sync_MARKER exactly as _sync_MISSING.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
712
diff
changeset
|
1476 if _sync_MARKER: |
|
603
e55a42144ba9
C-implementations for Configuration.getvarl() and Configuration.getvar_s()
Franz Glasner <fzglas.hg@dom66.de>
parents:
593
diff
changeset
|
1477 _sync_MARKER(_MARKER) |
