Mercurial > hgrepos > Python > libs > ConfigMix
changeset 437:bbc5b64e137a
- Dict-level access to a configuration key now does variable interpolation.
- Basic dict-level access for jailed configurations
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Fri, 10 Dec 2021 01:33:37 +0100 |
| parents | 3ae097e04879 |
| children | 37424d1f8dcf |
| files | CHANGES.txt configmix/config.py docs/changes.rst tests/test.py |
| diffstat | 4 files changed, 75 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/CHANGES.txt Fri Dec 10 01:05:34 2021 +0100 +++ b/CHANGES.txt Fri Dec 10 01:33:37 2021 +0100 @@ -12,6 +12,17 @@ Pre-1.0 Series -------------- +n/a (not released) +~~~~~~~~~~~~~~~~~~ + +- **[breaking] [feature}** + Access to a configuration key using dict-level access now does variable + interpolation + +- **[feature]** + Simple dict-level access for jailed configuration + + 0.18.1 (2021-12-10) ~~~~~~~~~~~~~~~~~~~
--- a/configmix/config.py Fri Dec 10 01:05:34 2021 +0100 +++ b/configmix/config.py Fri Dec 10 01:33:37 2021 +0100 @@ -238,6 +238,15 @@ is_jail = False """Flag to show that this is not a jail for another configuration""" + def __getitem__(self, key): + """Mapping interface that forwards to :meth:`~.getvarl_s` + + """ + if isinstance(key, (tuple, list)): + return self.getvarl_s(*key) + else: + return self.getvarl_s(key) + def getvarl(self, *path, **kwds): """Get a variable where the hierarchy is given in `path` as sequence and the namespace is given in the `namespace` keyword argument. @@ -513,7 +522,8 @@ if not path: return self try: - v = self.expand_if_reference(self[path[0]]) + # v = self.expand_if_reference(self[path[0]]) + v = self.expand_if_reference(super(Configuration, self).__getitem__(path[0])) for p in path[1:]: v = self.expand_if_reference(v[p]) except TypeError: @@ -808,6 +818,15 @@ if self._path: new_base.getvarl(*self._path) + def __getitem__(self, key): + """Mapping interface that forwards to :meth:`~.getvarl_s` + + """ + if isinstance(key, (tuple, list)): + return self.getvarl_s(*key) + else: + return self.getvarl_s(key) + def getvarl(self, *path, **kwds): return self._base.getvarl(*(self._path + path), **kwds)
--- a/docs/changes.rst Fri Dec 10 01:05:34 2021 +0100 +++ b/docs/changes.rst Fri Dec 10 01:33:37 2021 +0100 @@ -16,6 +16,12 @@ Breaking Changes ================ +0.19 +---- + +- Dict-level access to a configuraiton now does variable interpolation + + 0.14 ----
--- a/tests/test.py Fri Dec 10 01:05:34 2021 +0100 +++ b/tests/test.py Fri Dec 10 01:33:37 2021 +0100 @@ -1015,16 +1015,19 @@ "werkzeug", self._cfg.getvarl_s("wsgi", "profiler", "params", "type")) - def test03_no_direct_attribute_access_to_expanded_references(self): + def test03_direct_attribute_access_to_expanded_references(self): + self.assertEqual( + u"werkzeug", + self._cfg.wsgi.profiler.params.type) + + def test03b_dict_like_access_expands_references(self): self.assertEqual( - "{{ref:#wsgi.debugger}}", - self._cfg.wsgi.profiler.params) - try: - self._cfg.wsgi.profiler.params.type - except AttributeError: - pass - else: - self.fail("no attribute error seen") + u"werkzeug", + self._cfg[(u"wsgi", u"profiler", u"params", u"type")]) + + def test03c_dict_like_access_with_single_string_key(self): + self.assertTrue( + u"profiler" in self._cfg[u"wsgi"]) def test04_indirect_recursive_references(self): self.assertEqual( @@ -1556,6 +1559,32 @@ r"_JailedConfiguration(rootpath=('tree1', 'tree2'))", repr(jcfg)) + def test_dict_level_access_with_single_key(self): + cfg = configmix.load(os.path.join(TESTDATADIR, "conf10.py")) + jcfg = cfg.jailed(rootpath=(u"tree1", u"tree2")) + self.assertEqual( + u"off", + jcfg[u"key6"]) + try: + jcfg[u"key3"] + except KeyError: + pass + else: + self.fail("KeyError expected") + + def test_dict_level_access_with_path(self): + cfg = configmix.load(os.path.join(TESTDATADIR, "conf10.py")) + jcfg = cfg.jailed(rootpath=(u"tree1", u"tree2")) + self.assertEqual( + u"get this as `tree1.tree2.key4'", + jcfg[(u"key4",)]) + try: + jcfg[(u"key3",)] + except KeyError: + pass + else: + self.fail("KeyError expected") + if __name__ == "__main__": unittest.main()
