comparison configmix/config.py @ 314:043a6412be3c

Implemented new access methods .getvarl() and .getvarl_s
author Franz Glasner <fzglas.hg@dom66.de>
date Wed, 05 May 2021 01:32:07 +0200
parents 035b42a224ed
children 98490375d90c
comparison
equal deleted inserted replaced
313:15a1d5fd0aa1 314:043a6412be3c
62 62
63 # Speed 63 # Speed
64 _TEXTTYPE = type(u("")) 64 _TEXTTYPE = type(u(""))
65 _STARTTOK = u(b"{{") 65 _STARTTOK = u(b"{{")
66 _ENDTOK = u(b"}}") 66 _ENDTOK = u(b"}}")
67 _HIER_SEPARATOR = u(b'.')
67 _NS_SEPARATOR = u(b':') 68 _NS_SEPARATOR = u(b':')
68 _FILTER_SEPARATOR = u(b'|') 69 _FILTER_SEPARATOR = u(b'|')
69 _STARTTOK_REF = _STARTTOK + REF_NAMESPACE + _NS_SEPARATOR 70 _STARTTOK_REF = _STARTTOK + REF_NAMESPACE + _NS_SEPARATOR
70 _ENDTOK_REF = _ENDTOK 71 _ENDTOK_REF = _ENDTOK
71 _DOT = u(b'.') 72 _DOT = u(b'.')
72 73
74 def getvarl(self, *names, default=_MARKER, namespace=None):
75 """Get a variable where the hierarchy is given in `names` as sequence
76 and the namespace is given in `namespace`.
77
78 No variable interpolation is done and no filters are applied.
79
80 """
81 try:
82 if not namespace:
83 lookupfn = self._lookupvar
84 else:
85 if namespace == REF_NAMESPACE:
86 lookupfn = self._lookupref
87 else:
88 lookupfn = lookup_varns(namespace)
89 varvalue = lookupfn(*names)
90 except KeyError:
91 if default is _MARKER:
92 raise KeyError("Variable %r not found" % (names,))
93 else:
94 return default
95 else:
96 return varvalue
97
73 def getvar(self, varname, default=_MARKER): 98 def getvar(self, varname, default=_MARKER):
74 """Get a variable of the form ``[ns:][[key1.]key2.]name`` - including 99 """Get a variable of the form ``[ns:][[key1.]key2.]name`` - including
75 variables from other namespaces. 100 variables from other namespaces.
76 101
77 No variable interpolation is done and no filters are applied. 102 No variable interpolation is done and no filters are applied.
78 103
79 """ 104 """
80 varns, varname = self._split_ns(varname) 105 varns, varname = self._split_ns(varname)
81 try: 106 if not varns:
82 if not varns: 107 varnameparts = varname.split(self._HIER_SEPARATOR)
83 lookupfn = self._lookupvar 108 else:
84 else: 109 varnameparts = (varname,)
85 if varns == REF_NAMESPACE: 110 return self.getvarl(*varnameparts, namespace=varns)
86 lookupfn = self._lookupref 111
87 else: 112 def getvarl_s(self, *names, default=_MARKER, namespace=None):
88 lookupfn = lookup_varns(varns) 113 """Get a variable - including variables from other namespaces.
89 varvalue = lookupfn(varname) 114
115 `names` and `namespace` are interpreted as in
116 :meth:`.getvarl`. But variables will be interpolated
117 recursively within the variable values and filters are
118 applied.
119
120 For more details see chapter :ref:`variable-interpolation`.
121
122 """
123 try:
124 obj = self.getvarl(*names, namespace=namespace)
125 return self.substitute_variables_in_obj(obj)
90 except KeyError: 126 except KeyError:
91 if default is _MARKER: 127 if default is _MARKER:
92 raise KeyError("Variable %r not found" % varname) 128 raise
93 else: 129 else:
94 return default 130 return default
95 else:
96 return varvalue
97 131
98 def getvar_s(self, varname, default=_MARKER): 132 def getvar_s(self, varname, default=_MARKER):
99 """Get a variable - including variables from other namespaces. 133 """Get a variable - including variables from other namespaces.
100 134
101 `varname` is interpreted as in :meth:`.getvar`. But variables 135 `varname` is interpreted as in :meth:`.getvar`. But variables
112 if default is _MARKER: 146 if default is _MARKER:
113 raise 147 raise
114 else: 148 else:
115 return default 149 return default
116 150
151 def getintvarl_s(self, *names, default=_MARKER, namespace=None):
152 """Get a (possibly substituted) variable and coerce text to a
153 number.
154
155 """
156 s = self.getvarl_s(*names, default=default, namespace=namespace)
157 if isinstance(s, self._TEXTTYPE):
158 return int(s, 0)
159 else:
160 return s
161
117 def getintvar_s(self, varname, default=_MARKER): 162 def getintvar_s(self, varname, default=_MARKER):
118 """Get a (possibly substituted) variable and coerce text to a 163 """Get a (possibly substituted) variable and coerce text to a
119 number. 164 number.
120 165
121 """ 166 """
122 s = self.getvar_s(varname, default) 167 s = self.getvar_s(varname, default=default)
123 if isinstance(s, self._TEXTTYPE): 168 if isinstance(s, self._TEXTTYPE):
124 return int(s, 0) 169 return int(s, 0)
170 else:
171 return s
172
173 def getboolvarl_s(self, *names, default=_MARKER, namespace=None):
174 """Get a (possibly substituted) variable and convert text to a
175 boolean
176
177 """
178 s = self.getvarl_s(*names, default=default, namespace=namespace)
179 if isinstance(s, self._TEXTTYPE):
180 sl = s.strip().lower()
181 if sl not in self._BOOL_CVT:
182 raise ValueError("Not a boolean: %r" % s)
183 return self._BOOL_CVT[sl]
125 else: 184 else:
126 return s 185 return s
127 186
128 def getboolvar_s(self, varname, default=_MARKER): 187 def getboolvar_s(self, varname, default=_MARKER):
129 """Get a (possibly substituted) variable and convert text to a 188 """Get a (possibly substituted) variable and convert text to a
130 boolean 189 boolean
131 190
132 """ 191 """
133 s = self.getvar_s(varname, default) 192 s = self.getvar_s(varname, default=default)
134 if isinstance(s, self._TEXTTYPE): 193 if isinstance(s, self._TEXTTYPE):
135 sl = s.strip().lower() 194 sl = s.strip().lower()
136 if sl not in self._BOOL_CVT: 195 if sl not in self._BOOL_CVT:
137 raise ValueError("Not a boolean: %r" % s) 196 raise ValueError("Not a boolean: %r" % s)
138 return self._BOOL_CVT[sl] 197 return self._BOOL_CVT[sl]
143 _BOOL_CVT = { 202 _BOOL_CVT = {
144 u('1'): True, u('yes'): True, u('true'): True, u('on'): True, 203 u('1'): True, u('yes'): True, u('true'): True, u('on'): True,
145 u('0'): False, u('no'): False, u('false'): False, u('off'): False 204 u('0'): False, u('no'): False, u('false'): False, u('off'): False
146 } 205 }
147 206
207 def getfloatvarl_s(self, *names, default=_MARKER, namespace=None):
208 """Get a (possibly substituted) variable and convert text to a
209 float
210
211 """
212 s = self.getvarl_s(*names, default=default, namespace=namespace)
213 if isinstance(s, self._TEXTTYPE):
214 return float(s)
215 else:
216 return s
217
148 def getfloatvar_s(self, varname, default=_MARKER): 218 def getfloatvar_s(self, varname, default=_MARKER):
149 """Get a (possibly substituted) variable and convert text to a 219 """Get a (possibly substituted) variable and convert text to a
150 float 220 float
151 221
152 """ 222 """
168 if len(nameparts) == 1: 238 if len(nameparts) == 1:
169 return (s, [], ) 239 return (s, [], )
170 else: 240 else:
171 return (nameparts[0].rstrip(), nameparts[1:], ) 241 return (nameparts[0].rstrip(), nameparts[1:], )
172 242
173 def _lookupvar(self, key, default=_MARKER): 243 def _lookupvar(self, *names, default=_MARKER):
174 """Lookup a variable. 244 """Lookup a variable within a hierarchy.
175 245
176 If no default is given an unexisting `key` raises a `KeyError` 246 If no default is given an unexisting `name` raises a `KeyError`
177 else `default` is returned. 247 else `default` is returned.
178 """ 248 """
179 parts = key.split('.') 249 try:
180 try: 250 v = self.expand_if_reference(self[names[0]])
181 v = self.expand_if_reference(self[parts[0]]) 251 for p in names[1:]:
182 for p in parts[1:]:
183 v = self.expand_if_reference(v[p]) 252 v = self.expand_if_reference(v[p])
184 except TypeError: 253 except TypeError:
185 raise KeyError( 254 raise KeyError(
186 "Configuration variable %r not found" 255 "Configuration variable %r not found"
187 "(missing intermediate keys?)" % key) 256 "(missing intermediate keys?)" % (names,))
188 except KeyError: 257 except KeyError:
189 if default is _MARKER: 258 if default is _MARKER:
190 raise KeyError("Configuration variable %r not found" % key) 259 raise KeyError(
260 "Configuration variable %r not found" % (names,))
191 else: 261 else:
192 return default 262 return default
193 return v 263 return v
194 264
195 def _lookupref(self, key, default=_MARKER): 265 def _lookupref(self, key, default=_MARKER):