Mercurial > hgrepos > Python > libs > ConfigMix
annotate configmix/config.py @ 380:bb4a90fb58e0
Docu: "namespace" in getvarl() is a keyword argument
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Tue, 09 Nov 2021 21:58:05 +0100 |
| parents | 4d7ad20cb8f9 |
| children | fe3dfd687621 |
| 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 # :- |
| 302 | 3 # :Copyright: (c) 2015-2021, 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 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
11 from __future__ import division, absolute_import, print_function |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
12 |
|
250
ff964825a75a
Style: placement of "__all__"
Franz Glasner <fzglas.hg@dom66.de>
parents:
249
diff
changeset
|
13 |
|
ff964825a75a
Style: placement of "__all__"
Franz Glasner <fzglas.hg@dom66.de>
parents:
249
diff
changeset
|
14 __all__ = ["Configuration"] |
|
ff964825a75a
Style: placement of "__all__"
Franz Glasner <fzglas.hg@dom66.de>
parents:
249
diff
changeset
|
15 |
|
ff964825a75a
Style: placement of "__all__"
Franz Glasner <fzglas.hg@dom66.de>
parents:
249
diff
changeset
|
16 |
|
39
8715e5cc59ac
Print a warning if a variable cannot be expanded.
Franz Glasner <hg@dom66.de>
parents:
36
diff
changeset
|
17 import warnings |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
18 try: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
19 from collections import OrderedDict as ConfigurationBase |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
20 except ImportError: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
21 try: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
22 from ordereddict import OrderedDict as ConfigurationBase |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
23 except ImportError: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
24 ConfigurationBase = dict |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
25 try: |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
26 from urllib.parse import urlsplit |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
27 except ImportError: |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
28 from urlparse import urlsplit |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
29 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
30 from .variables import lookup_varns, lookup_filter |
|
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
|
31 from .compat import u, uchr |
|
357
dd454e1efea4
Use constants for the names of the "None" and "Empty" filters
Franz Glasner <fzglas.hg@dom66.de>
parents:
352
diff
changeset
|
32 from .constants import REF_NAMESPACE, NONE_FILTER, EMPTY_FILTER |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
33 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
34 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
35 _MARKER = object() |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
36 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
37 |
|
17
94b5e94fae44
Make the AttributeDict "private" (-> "_AttributeDict")
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
16
diff
changeset
|
38 class _AttributeDict(ConfigurationBase): |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
39 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
40 def __getattr__(self, name): |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
41 try: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
42 v = self[name] |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
43 except KeyError: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
44 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
|
45 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
46 # 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
|
47 if isinstance(v, dict): |
|
29
17af7a78710c
FIX: Renaming a class was not really complete
Franz Glasner <hg@dom66.de>
parents:
25
diff
changeset
|
48 return _AttributeDict(v) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
49 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
50 return v |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
51 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
52 |
|
17
94b5e94fae44
Make the AttributeDict "private" (-> "_AttributeDict")
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
16
diff
changeset
|
53 class Configuration(_AttributeDict): |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
54 |
| 18 | 55 """The configuration dictionary with attribute support or |
| 56 variable substitution. | |
| 57 | |
| 322 | 58 .. note:: When retrieving by attribute names variables will *not* |
| 18 | 59 substituted. |
| 60 | |
| 61 """ | |
| 62 | |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
63 # Speed |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
64 _TEXTTYPE = type(u("")) |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
65 _STARTTOK = u(b"{{") |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
66 _ENDTOK = u(b"}}") |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
67 _HIER_SEPARATOR = u(b'.') |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
68 _NS_SEPARATOR = u(b':') |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
69 _FILTER_SEPARATOR = u(b'|') |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
70 _STARTTOK_REF = _STARTTOK + REF_NAMESPACE + _NS_SEPARATOR |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
71 _ENDTOK_REF = _ENDTOK |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
72 _DOT = u(b'.') |
|
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
|
73 _QUOTE = u(b'%') |
|
325
ab33d51f3412
By default quote the "#" character also because it is typically a comment in all the configuration file formats.
Franz Glasner <fzglas.hg@dom66.de>
parents:
322
diff
changeset
|
74 _COMMENT = u(b'#') |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
75 |
|
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
|
76 def getvarl(self, *names, **kwds): |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
77 """Get a variable where the hierarchy is given in `names` as sequence |
|
380
bb4a90fb58e0
Docu: "namespace" in getvarl() is a keyword argument
Franz Glasner <fzglas.hg@dom66.de>
parents:
374
diff
changeset
|
78 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
|
79 |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
80 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
|
81 |
| 333 | 82 Quoting of `names` and `namespace` is *not* needed and wrong. |
| 83 | |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
84 """ |
|
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
|
85 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
|
86 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
|
87 try: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
88 if not namespace: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
89 lookupfn = self._lookupvar |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
90 else: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
91 if namespace == REF_NAMESPACE: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
92 lookupfn = self._lookupref |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
93 else: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
94 lookupfn = lookup_varns(namespace) |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
95 varvalue = lookupfn(*names) |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
96 except KeyError: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
97 if default is _MARKER: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
98 raise KeyError("Variable %r not found" % (names,)) |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
99 else: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
100 return default |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
101 else: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
102 return varvalue |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
103 |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
104 def getvar(self, varname, default=_MARKER): |
|
115
a5339d39af5c
Begin the documentation of variables and its expansion
Franz Glasner <hg@dom66.de>
parents:
104
diff
changeset
|
105 """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
|
106 variables from other namespaces. |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
107 |
|
202
2e66178a09d8
Docu: Ban "keyword expansion" -- use "variable interpolation" instead
Franz Glasner <fzglas.hg@dom66.de>
parents:
156
diff
changeset
|
108 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
|
109 |
| 333 | 110 Special characters (e.g. ``:`` and ``.``) must be quoted when using |
| 111 the default namespace. | |
| 112 | |
| 113 See also :meth:`~.quote`. | |
| 114 | |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
115 """ |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
116 varns, varname = self._split_ns(varname) |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
117 if not varns: |
|
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
|
118 varnameparts = [self.unquote(vp) for vp in varname.split(self._HIER_SEPARATOR)] |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
119 else: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
120 varnameparts = (varname,) |
|
364
1941f0188e81
FIX: Handle a "default" keyword parameter in ".getvar()" properly.
Franz Glasner <fzglas.hg@dom66.de>
parents:
357
diff
changeset
|
121 return self.getvarl(*varnameparts, namespace=varns, default=default) |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
122 |
|
368
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
123 def getfirstvar(self, *varnames, **kwds): |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
124 """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
|
125 in the list of given variables in `varnames`. |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
126 |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
127 """ |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
128 default = kwds.pop("default", _MARKER) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
129 for varname in varnames: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
130 try: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
131 varvalue = self.getvar(varname) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
132 except KeyError: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
133 pass |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
134 else: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
135 return varvalue |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
136 if default is _MARKER: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
137 raise KeyError( |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
138 "none of the given variables found: %r" % (varnames,)) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
139 else: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
140 return default |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
141 |
|
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
|
142 def getvarl_s(self, *names, **kwds): |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
143 """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
|
144 |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
145 `names` and `namespace` are interpreted as in |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
146 :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
|
147 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
|
148 applied. |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
149 |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
150 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
|
151 |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
152 """ |
|
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
|
153 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
|
154 namespace = kwds.pop("namespace", None) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
155 try: |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
156 obj = self.getvarl(*names, namespace=namespace) |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
157 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
|
158 except KeyError: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
159 if default is _MARKER: |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
160 raise |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
161 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
162 return default |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
163 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
164 def getvar_s(self, varname, default=_MARKER): |
|
24
fa65adab0b71
FIX: Typo in comment
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
23
diff
changeset
|
165 """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
|
166 |
|
115
a5339d39af5c
Begin the documentation of variables and its expansion
Franz Glasner <hg@dom66.de>
parents:
104
diff
changeset
|
167 `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
|
168 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
|
169 and filters are applied. |
|
115
a5339d39af5c
Begin the documentation of variables and its expansion
Franz Glasner <hg@dom66.de>
parents:
104
diff
changeset
|
170 |
|
202
2e66178a09d8
Docu: Ban "keyword expansion" -- use "variable interpolation" instead
Franz Glasner <fzglas.hg@dom66.de>
parents:
156
diff
changeset
|
171 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
|
172 |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
173 """ |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
174 try: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
175 obj = self.getvar(varname) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
176 return self.substitute_variables_in_obj(obj) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
177 except KeyError: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
178 if default is _MARKER: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
179 raise |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
180 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
181 return default |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
182 |
|
368
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
183 def getfirstvar_s(self, *varnames, **kwds): |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
184 """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
|
185 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
|
186 |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
187 """ |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
188 default = kwds.pop("default", _MARKER) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
189 for varname in varnames: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
190 try: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
191 obj = self.getvar(varname) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
192 except KeyError: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
193 pass |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
194 else: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
195 return self.substitute_variables_in_obj(obj) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
196 if default is _MARKER: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
197 raise KeyError( |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
198 "none of the given variables found: %r" % (varnames,)) |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
199 else: |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
200 return default |
|
4ee53f6fcac1
Implement ".getfirstvar()" and ".getfirstvar_s()".
Franz Glasner <fzglas.hg@dom66.de>
parents:
364
diff
changeset
|
201 |
|
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
|
202 def getintvarl_s(self, *names, **kwds): |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
203 """Get a (possibly substituted) variable and coerce text to a |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
204 number. |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
205 |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
206 """ |
|
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
|
207 s = self.getvarl_s(*names, **kwds) |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
208 if isinstance(s, self._TEXTTYPE): |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
209 return int(s, 0) |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
210 else: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
211 return s |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
212 |
|
36
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
213 def getintvar_s(self, varname, default=_MARKER): |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
214 """Get a (possibly substituted) variable and coerce text to a |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
215 number. |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
216 |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
217 """ |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
218 s = self.getvar_s(varname, default=default) |
|
36
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
219 if isinstance(s, self._TEXTTYPE): |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
220 return int(s, 0) |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
221 else: |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
222 return s |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
223 |
|
373
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
224 def getfirstintvar_s(self, *varnames, **kwds): |
| 374 | 225 """A variant of :meth:`~.getintvar_s` that returns the first found |
| 226 variable in the list of given variables in `varnames`. | |
|
373
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
227 |
|
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
228 """ |
|
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
229 s = self.getfirstvar_s(*varnames, **kwds) |
|
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
230 if isinstance(s, self._TEXTTYPE): |
|
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
231 return int(s, 0) |
|
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
232 else: |
|
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
233 return s |
|
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
234 |
|
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
|
235 def getboolvarl_s(self, *names, **kwds): |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
236 """Get a (possibly substituted) variable and convert text to a |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
237 boolean |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
238 |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
239 """ |
|
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
|
240 s = self.getvarl_s(*names, **kwds) |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
241 if isinstance(s, self._TEXTTYPE): |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
242 sl = s.strip().lower() |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
243 if sl not in self._BOOL_CVT: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
244 raise ValueError("Not a boolean: %r" % s) |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
245 return self._BOOL_CVT[sl] |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
246 else: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
247 return s |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
248 |
|
36
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
249 def getboolvar_s(self, varname, default=_MARKER): |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
250 """Get a (possibly substituted) variable and convert text to a |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
251 boolean |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
252 |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
253 """ |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
254 s = self.getvar_s(varname, default=default) |
|
36
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
255 if isinstance(s, self._TEXTTYPE): |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
256 sl = s.strip().lower() |
|
207
b3b5ed34d180
Handle most flake8 errors and warnings.
Franz Glasner <fzglas.hg@dom66.de>
parents:
202
diff
changeset
|
257 if sl not in self._BOOL_CVT: |
|
36
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
258 raise ValueError("Not a boolean: %r" % s) |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
259 return self._BOOL_CVT[sl] |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
260 else: |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
261 return s |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
262 |
|
373
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
263 def getfirstboolvar_s(self, *varnames, **kwds): |
| 374 | 264 """A variant of :meth:`~.getboolvar_s` that returns the first found |
| 265 variable in the list of given variables in `varnames`. | |
|
373
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
266 |
|
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
267 """ |
|
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
268 s = self.getfirstvar_s(*varnames, **kwds) |
|
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
269 if isinstance(s, self._TEXTTYPE): |
|
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
270 sl = s.strip().lower() |
|
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
271 if sl not in self._BOOL_CVT: |
|
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
272 raise ValueError("Not a boolean: %r" % s) |
|
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
273 return self._BOOL_CVT[sl] |
|
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
274 else: |
|
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
275 return s |
|
0c65aac81807
Implement ".getfirstintvar_s()" and ".getfirstboolvar_s()" with unittests
Franz Glasner <fzglas.hg@dom66.de>
parents:
368
diff
changeset
|
276 |
|
36
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
277 # Conversion of booleans |
|
304
d8361dd70d2d
FIX: Map unicode strings to boolean values because this is the canonical texttype in confixmmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
302
diff
changeset
|
278 _BOOL_CVT = { |
|
d8361dd70d2d
FIX: Map unicode strings to boolean values because this is the canonical texttype in confixmmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
302
diff
changeset
|
279 u('1'): True, u('yes'): True, u('true'): True, u('on'): True, |
|
d8361dd70d2d
FIX: Map unicode strings to boolean values because this is the canonical texttype in confixmmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
302
diff
changeset
|
280 u('0'): False, u('no'): False, u('false'): False, u('off'): False |
|
d8361dd70d2d
FIX: Map unicode strings to boolean values because this is the canonical texttype in confixmmix
Franz Glasner <fzglas.hg@dom66.de>
parents:
302
diff
changeset
|
281 } |
|
36
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
282 |
|
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
|
283 def getfloatvarl_s(self, *names, **kwds): |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
284 """Get a (possibly substituted) variable and convert text to a |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
285 float |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
286 |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
287 """ |
|
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
|
288 s = self.getvarl_s(*names, **kwds) |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
289 if isinstance(s, self._TEXTTYPE): |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
290 return float(s) |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
291 else: |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
292 return s |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
293 |
|
36
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
294 def getfloatvar_s(self, varname, default=_MARKER): |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
295 """Get a (possibly substituted) variable and convert text to a |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
296 float |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
297 |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
298 """ |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
299 s = self.getvar_s(varname, default) |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
300 if isinstance(s, self._TEXTTYPE): |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
301 return float(s) |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
302 else: |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
303 return s |
|
b04a350f894b
Implement methods to convert text to other types when getting configuration variables.
Franz Glasner <hg@dom66.de>
parents:
29
diff
changeset
|
304 |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
305 def _split_ns(self, s): |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
306 nameparts = s.split(self._NS_SEPARATOR, 1) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
307 if len(nameparts) == 1: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
308 return (None, s, ) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
309 else: |
|
329
d81d2cdf4925
FIX: Handle the unquoting of namespaces within Configuration.getvar() properly.
Franz Glasner <fzglas.hg@dom66.de>
parents:
326
diff
changeset
|
310 return (self.unquote(nameparts[0]), nameparts[1], ) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
311 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
312 def _split_filters(self, s): |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
313 nameparts = s.split(self._FILTER_SEPARATOR) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
314 if len(nameparts) == 1: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
315 return (s, [], ) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
316 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
317 return (nameparts[0].rstrip(), nameparts[1:], ) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
318 |
|
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
|
319 def _lookupvar(self, *names, **kwds): |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
320 """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
|
321 |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
322 If no default is given an unexisting `name` raises a `KeyError` |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
323 else `default` is returned. |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
324 """ |
|
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
|
325 default = kwds.pop("default", _MARKER) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
326 try: |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
327 v = self.expand_if_reference(self[names[0]]) |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
328 for p in names[1:]: |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
329 v = self.expand_if_reference(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
|
330 except TypeError: |
|
207
b3b5ed34d180
Handle most flake8 errors and warnings.
Franz Glasner <fzglas.hg@dom66.de>
parents:
202
diff
changeset
|
331 raise KeyError( |
|
b3b5ed34d180
Handle most flake8 errors and warnings.
Franz Glasner <fzglas.hg@dom66.de>
parents:
202
diff
changeset
|
332 "Configuration variable %r not found" |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
333 "(missing intermediate keys?)" % (names,)) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
334 except KeyError: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
335 if default is _MARKER: |
|
314
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
336 raise KeyError( |
|
043a6412be3c
Implemented new access methods .getvarl() and .getvarl_s
Franz Glasner <fzglas.hg@dom66.de>
parents:
311
diff
changeset
|
337 "Configuration variable %r not found" % (names,)) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
338 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
339 return default |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
340 return v |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
341 |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
342 def _lookupref(self, key, default=_MARKER): |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
343 """ |
| 311 | 344 |
| 345 `key` must be a configuration reference URI without any | |
| 346 (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
|
347 |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
348 """ |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
349 return self.expand_ref_uri(key, default=default) |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
350 |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
351 def expand_if_reference(self, v, default=_MARKER): |
| 311 | 352 """Check whether `v` is a configuration reference and -- if true -- |
| 353 then expand it. | |
|
305
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
354 |
| 310 | 355 `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
|
356 |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
357 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
|
358 unchanged. |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
359 |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
360 """ |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
361 if not isinstance(v, self._TEXTTYPE): |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
362 return v |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
363 if not v.startswith(self._STARTTOK_REF) \ |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
364 or not v.endswith(self._ENDTOK_REF): |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
365 return v |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
366 return self.expand_ref_uri( |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
367 v[len(self._STARTTOK_REF):-len(self._ENDTOK_REF)], |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
368 default=default) |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
369 |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
370 def expand_ref_uri(self, uri, default=_MARKER): |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
371 pu = urlsplit(uri) |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
372 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
|
373 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
|
374 if not pu.fragment: |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
375 return self |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
376 if pu.fragment.startswith(self._DOT): |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
377 raise ValueError("relative refs not supported") |
|
f529ca46dd50
Implemented the "ref" namespace to get configuration tree references.
Franz Glasner <fzglas.hg@dom66.de>
parents:
304
diff
changeset
|
378 return self.getvar(pu.fragment, default=default) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
379 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
380 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
|
381 """Recursively expand variables in the object tree `obj`.""" |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
382 if isinstance(obj, self._TEXTTYPE): |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
383 # a string - really replace the value |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
384 return self.expand_variable(obj) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
385 elif isinstance(obj, list): |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
386 return [self.substitute_variables_in_obj(i) for i in obj] |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
387 elif isinstance(obj, tuple): |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
388 tmp = [self.substitute_variables_in_obj(i) for i in obj] |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
389 return type(obj)(tmp) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
390 elif isinstance(obj, dict): |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
391 newdict = type(obj)() |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
392 for k in obj: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
393 newdict[k] = self.substitute_variables_in_obj(obj[k]) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
394 return newdict |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
395 elif isinstance(obj, set): |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
396 newset = type(obj)() |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
397 for i in obj: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
398 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
|
399 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
400 return obj |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
401 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
402 def expand_variable(self, s): |
| 302 | 403 """Expand variables in the single string `s`""" |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
404 start = s.find(self._STARTTOK, 0) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
405 while start != -1: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
406 end = s.find(self._ENDTOK, start) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
407 if end < 0: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
408 return s |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
409 varname, filters = self._split_filters(s[start+2:end]) |
|
39
8715e5cc59ac
Print a warning if a variable cannot be expanded.
Franz Glasner <hg@dom66.de>
parents:
36
diff
changeset
|
410 try: |
|
357
dd454e1efea4
Use constants for the names of the "None" and "Empty" filters
Franz Glasner <fzglas.hg@dom66.de>
parents:
352
diff
changeset
|
411 if NONE_FILTER in filters: |
|
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
|
412 varvalue = self._apply_filters( |
|
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
|
413 filters, self.getvar_s(varname, default=None)) |
|
357
dd454e1efea4
Use constants for the names of the "None" and "Empty" filters
Franz Glasner <fzglas.hg@dom66.de>
parents:
352
diff
changeset
|
414 elif EMPTY_FILTER in filters: |
|
352
2b209bdf6995
Implement the "Empty" filter.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
350
diff
changeset
|
415 varvalue = self._apply_filters( |
|
2b209bdf6995
Implement the "Empty" filter.
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
350
diff
changeset
|
416 filters, self.getvar_s(varname, default=u(""))) |
|
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
|
417 else: |
|
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
|
418 varvalue = self._apply_filters( |
|
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
|
419 filters, self.getvar_s(varname)) |
|
39
8715e5cc59ac
Print a warning if a variable cannot be expanded.
Franz Glasner <hg@dom66.de>
parents:
36
diff
changeset
|
420 except KeyError: |
|
8715e5cc59ac
Print a warning if a variable cannot be expanded.
Franz Glasner <hg@dom66.de>
parents:
36
diff
changeset
|
421 warnings.warn("Cannot expand variable %r in string " |
|
8715e5cc59ac
Print a warning if a variable cannot be expanded.
Franz Glasner <hg@dom66.de>
parents:
36
diff
changeset
|
422 "%r" % (varname, s, ), |
|
8715e5cc59ac
Print a warning if a variable cannot be expanded.
Franz Glasner <hg@dom66.de>
parents:
36
diff
changeset
|
423 UserWarning, |
|
8715e5cc59ac
Print a warning if a variable cannot be expanded.
Franz Glasner <hg@dom66.de>
parents:
36
diff
changeset
|
424 stacklevel=1) |
|
8715e5cc59ac
Print a warning if a variable cannot be expanded.
Franz Glasner <hg@dom66.de>
parents:
36
diff
changeset
|
425 raise |
|
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
|
426 # |
|
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
|
427 # 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
|
428 # 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
|
429 # |
|
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
|
430 if (start == 0) and (end + 2 == len(s)): |
|
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
|
431 return varvalue |
|
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
|
432 if varvalue is None: |
|
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
|
433 varvalue = u("") |
|
249
1e38ccfba3de
Use explicit type conversion instead of an implicit one.
Franz Glasner <fzglas.hg@dom66.de>
parents:
248
diff
changeset
|
434 replaced = s[:start] + u(str(varvalue)) |
|
248
13283057a21e
Do not use ".format()" but string concatenation or (when conversion to Unicode is needed) the faster %s method
Franz Glasner <fzglas.hg@dom66.de>
parents:
237
diff
changeset
|
435 s = replaced + s[end+2:] |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
436 # don't re-evaluate because `self.getvar_s()` expands already |
|
23
c77cb6bc8eeb
FIX: Handle non-str types in variable substitutions properly
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
18
diff
changeset
|
437 start = s.find(self._STARTTOK, len(replaced)) |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
438 return s |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
439 |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
440 def _apply_filters(self, filters, value): |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
441 for name in filters: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
442 try: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
443 filterfn = lookup_filter(name) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
444 except KeyError: |
|
40
8d66aef2f7fb
Comment about exceptions when filters are missing.
Franz Glasner <hg@dom66.de>
parents:
39
diff
changeset
|
445 # |
|
8d66aef2f7fb
Comment about exceptions when filters are missing.
Franz Glasner <hg@dom66.de>
parents:
39
diff
changeset
|
446 # 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
|
447 # a very serious error. |
|
8d66aef2f7fb
Comment about exceptions when filters are missing.
Franz Glasner <hg@dom66.de>
parents:
39
diff
changeset
|
448 # |
|
16
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
449 raise NameError("Filter %r not found" % name) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
450 else: |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
451 value = filterfn(self, value) |
|
f85dc4677c01
Implemented the real configuration dictionary with attribute access or
Franz Glasner <hg@dom66.de>
parents:
diff
changeset
|
452 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
|
453 |
|
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
|
454 @classmethod |
|
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
|
455 def quote(klass, s): |
| 333 | 456 """Replace important special characters in string `s` by replacing |
| 457 them with ``%xNN`` where `NN` are the two hexadecimal digits of the | |
| 458 characters unicode codepoint value. | |
| 459 | |
| 460 Handled are the important special chars: ``%``, ``.``, ``:``, | |
|
334
a04cd5dbcd2c
By default quote also the characters "{", "}", "[" and "]" because they are special in YAML
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
333
diff
changeset
|
461 ``#``; ``'``, ``"``, ``|``, ``{``, ``}``, ``[`` and ``]``. |
| 333 | 462 |
| 463 See also the :ref:`quoting` section. | |
|
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
|
464 |
|
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
|
465 """ |
|
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
|
466 qc = klass._QUOTE |
|
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
|
467 s = s.replace(qc, qc + "x25") |
|
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
|
468 s = s.replace(klass._DOT, qc + "x2e") |
|
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
|
469 s = s.replace(klass._NS_SEPARATOR, qc + "x3a") |
|
325
ab33d51f3412
By default quote the "#" character also because it is typically a comment in all the configuration file formats.
Franz Glasner <fzglas.hg@dom66.de>
parents:
322
diff
changeset
|
470 s = s.replace(klass._COMMENT, qc + "x23") |
|
326
b7abfbfe806d
By default quote '"' and "'" also
Franz Glasner <fzglas.hg@dom66.de>
parents:
325
diff
changeset
|
471 s = s.replace(klass._FILTER_SEPARATOR, qc + "x7c") |
|
b7abfbfe806d
By default quote '"' and "'" also
Franz Glasner <fzglas.hg@dom66.de>
parents:
325
diff
changeset
|
472 s = s.replace('"', qc + "x22") |
|
334
a04cd5dbcd2c
By default quote also the characters "{", "}", "[" and "]" because they are special in YAML
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
333
diff
changeset
|
473 s = s.replace("'", qc + "x27") |
|
a04cd5dbcd2c
By default quote also the characters "{", "}", "[" and "]" because they are special in YAML
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
333
diff
changeset
|
474 s = s.replace('{', qc + "x7b") |
|
a04cd5dbcd2c
By default quote also the characters "{", "}", "[" and "]" because they are special in YAML
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
333
diff
changeset
|
475 s = s.replace('}', qc + "x7d") |
|
a04cd5dbcd2c
By default quote also the characters "{", "}", "[" and "]" because they are special in YAML
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
333
diff
changeset
|
476 s = s.replace('[', qc + "x5b") |
|
a04cd5dbcd2c
By default quote also the characters "{", "}", "[" and "]" because they are special in YAML
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
333
diff
changeset
|
477 return s.replace(']', qc + "x5d") |
|
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
|
478 |
|
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
|
479 @classmethod |
|
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
|
480 def unquote(klass, s): |
| 333 | 481 """Unquote the content of `s`: handle all patterns ``%xNN``, |
| 482 ``%uNNNN`` or ``%UNNNNNNNN``. | |
| 483 | |
| 484 This is the inverse of :meth:`~.quote`. | |
|
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
|
485 |
|
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
|
486 """ |
|
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
|
487 if klass._QUOTE not in s: |
|
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
|
488 return s |
|
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
|
489 res = [] |
|
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
|
490 parts = s.split(klass._QUOTE) |
|
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
|
491 res.append(parts[0]) |
|
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
|
492 for p in parts[1:]: |
|
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
|
493 if p.startswith(u(b'x')): |
|
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
|
494 if len(p) < 3: |
|
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
|
495 raise ValueError("quote syntax: length too small") |
|
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
|
496 res.append(uchr(int(p[1:3], 16))) |
|
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
|
497 res.append(p[3:]) |
|
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
|
498 elif p.startswith(u(b'u')): |
|
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
|
499 if len(p) < 5: |
|
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
|
500 raise ValueError("quote syntax: length too small") |
|
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
|
501 res.append(uchr(int(p[1:5], 16))) |
|
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
|
502 res.append(p[5:]) |
|
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
|
503 elif p.startswith(u(b'U')): |
|
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
|
504 if len(p) < 9: |
|
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
|
505 raise ValueError("quote syntax: length too small") |
|
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
|
506 res.append(uchr(int(p[1:9], 16))) |
|
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
|
507 res.append(p[9:]) |
|
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
|
508 else: |
|
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
|
509 raise ValueError("unknown quote syntax string: {}".format(s)) |
|
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
|
510 return ''.join(res) |
