Mercurial > hgrepos > Python > libs > ConfigMix
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): |
