Mercurial > hgrepos > Python > libs > ConfigMix
changeset 418:bb5f11abd12a
Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Thu, 02 Dec 2021 01:24:53 +0100 |
| parents | 83d537f1dfbb |
| children | 079a82129110 |
| files | CHANGES.txt configmix/config.py tests/test.py |
| diffstat | 3 files changed, 67 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/CHANGES.txt Wed Dec 01 23:10:20 2021 +0100 +++ b/CHANGES.txt Thu Dec 02 01:24:53 2021 +0100 @@ -18,6 +18,11 @@ - **[feature]** Allow to get sub-jails from an already jailed configuration. +- **[feature]** + Implement :meth:`~configmix.config.Configuration.getkeysl` and + :meth:`~configmix.config.Configuration.getkeys` that return generators + over all keys of a configuration value + 0.17 (2021-11-22) ~~~~~~~~~~~~~~~~~
--- a/configmix/config.py Wed Dec 01 23:10:20 2021 +0100 +++ b/configmix/config.py Thu Dec 02 01:24:53 2021 +0100 @@ -266,6 +266,20 @@ else: return varvalue + def getkeysl(self, *path, **kwds): + """Yield the keys of a variable value. + + :rtype: A generator + :raise KeyError: + + .. note:: Dictionary keys are not subject to interpolation. + + """ + if "default" in kwds: + raise TypeError("got unexpected keyword argument: default") + for k in self.getvarl(*path, **kwds).keys(): + yield k + def getfirstvarl(self, *paths, **kwds): """A variant of :meth:`~.getvarl` that returns the first found variable in the `paths` list. @@ -336,6 +350,18 @@ varnameparts = (varname,) return self.getvarl(*varnameparts, namespace=varns, default=default) + def getkeys(self, varname): + """Yield all the keys of a variable value. + + :rtype: A generator + :raise KeyError: + + .. note:: Dictionary keys are not subject to interpolation. + + """ + for k in self.getvar(varname).keys(): + yield k + def getfirstvar(self, *varnames, **kwds): """A variant of :meth:`~.getvar` that returns the first found variable in the list of given variables in `varnames`. @@ -775,6 +801,10 @@ def getvarl(self, *path, **kwds): return self._base.getvarl(*(self._path + path), **kwds) + def getkeysl(self, *path, **kwds): + for k in self._base.getkeysl(*(self._path + path), **kwds): + yield k + def getfirstvarl(self, *paths, **kwds): real_paths = [] for path in paths: @@ -805,6 +835,10 @@ def getvar(self, varname, default=_MARKER): return self._base.getvar(self._pathstr + varname, default=default) + def getkeys(self, varname): + for k in self._base.getkeys(self._pathstr + varname): + yield k + def getfirstvar(self, *varnames, **kwds): real_varnames = [self._pathstr + vn for vn in varnames] return self._base.getfirstvar(*real_varnames, **kwds)
--- a/tests/test.py Wed Dec 01 23:10:20 2021 +0100 +++ b/tests/test.py Thu Dec 02 01:24:53 2021 +0100 @@ -752,6 +752,18 @@ ("db", "non", "existing", "key2")), default=u("20"))) + def test35_keysl(self): + cfg = self._load(os.path.join(TESTDATADIR, "conf20.yml")) + self.assertEqual( + set([u"domain", u"localedir", u"fallback", u"cache",]), + set(cfg.getkeysl(u"intl"))) + + def test36_keys(self): + cfg = self._load(os.path.join(TESTDATADIR, "conf20.yml")) + self.assertEqual( + set([u"name", u"pwd"]), + set(cfg.getkeys(u"db.user"))) + class T02LoadAndMerge(_T02MixinLoadAndMerge, unittest.TestCase): @@ -1471,6 +1483,22 @@ self.assertEqual(0x20, sjcfg.getintvar_s(u"key3")) + def test_getkeys(self): + cfg = configmix.load(os.path.join(TESTDATADIR, "conf10.py")) + jcfg = cfg.jailed(root=u"tree1") + + self.assertEqual( + set([u"key4", u"key5", u"key6"]), + set(jcfg.getkeysl(u"tree2"))) + + self.assertEqual( + set([u"key4", u"key5", u"key6"]), + set(jcfg.getkeys(u"tree2"))) + + self.assertEqual( + set([u"key3", u"tree2"]), + set(jcfg.getkeysl())) + if __name__ == "__main__": unittest.main()
