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()