# HG changeset patch # User Franz Glasner # Date 1638404693 -3600 # Node ID bb5f11abd12a7872e3e00a5d8734d09ccdee5c18 # Parent 83d537f1dfbb5aa1a4d054a77a88d93c7e1ccf55 Implement .getkeysl() and .getkeys() for configuration objects that iterate over all the keys of a configuration value diff -r 83d537f1dfbb -r bb5f11abd12a CHANGES.txt --- 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) ~~~~~~~~~~~~~~~~~ diff -r 83d537f1dfbb -r bb5f11abd12a configmix/config.py --- 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) diff -r 83d537f1dfbb -r bb5f11abd12a tests/test.py --- 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()