changeset 459:9dc9cef1b9cd

Implement proper iteration support for jailed configurations
author Franz Glasner <fzglas.hg@dom66.de>
date Wed, 15 Dec 2021 08:48:37 +0100
parents a68240971d3d
children d22985d6806e
files configmix/config.py tests/data/conf10.py tests/test.py
diffstat 3 files changed, 30 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/configmix/config.py	Wed Dec 15 01:01:07 2021 +0100
+++ b/configmix/config.py	Wed Dec 15 08:48:37 2021 +0100
@@ -940,6 +940,9 @@
         real_varnames = [self._pathstr + vn for vn in varnames]
         return self._base.getfirstvar_s(*real_varnames, **kwds)
 
+    def __iter__(self):
+        return iter(self._base.getvarl_s(*self._path))
+
     def jailed(self, rootpath=None, root=None, bind_root=True):
         """Return a "jailed" configuration that effectively is a
         subjail of the current jail
--- a/tests/data/conf10.py	Wed Dec 15 01:01:07 2021 +0100
+++ b/tests/data/conf10.py	Wed Dec 15 08:48:37 2021 +0100
@@ -9,7 +9,12 @@
     'tree2': {
         'key4': u"get this as `tree1.tree2.key4'",
         'key5': True,
-        'key6': u"off"
+        'key6': u"off",
+        'key7': [],
+        'key8': [
+            u"val1",
+            u"val2",
+            u"{{key1}}"
+        ]
     }
 }
-
--- a/tests/test.py	Wed Dec 15 01:01:07 2021 +0100
+++ b/tests/test.py	Wed Dec 15 08:48:37 2021 +0100
@@ -1553,11 +1553,11 @@
         jcfg = cfg.jailed(root=u"tree1")
 
         self.assertEqual(
-            set([u"key4", u"key5", u"key6"]),
+            set([u"key4", u"key5", u"key6", u"key7", u"key8"]),
             set(jcfg.getkeysl(u"tree2")))
 
         self.assertEqual(
-            set([u"key4", u"key5", u"key6"]),
+            set([u"key4", u"key5", u"key6", u"key7", u"key8"]),
             set(jcfg.getkeys(u"tree2")))
 
         self.assertEqual(
@@ -1716,6 +1716,24 @@
         else:
             self.fail("AttributeError expected")
 
+    def test_iteration_dict(self):
+        cfg = configmix.load(os.path.join(TESTDATADIR, "conf10.py"))
+        jcfg = cfg.jailed(rootpath=(u"tree1",))
+        s = []
+        for k in jcfg:
+            s.append(k)
+        s.sort()
+        self.assertEqual([u"key3", u"tree2"], s)
+
+    def test_iteration_list(self):
+        cfg = configmix.load(os.path.join(TESTDATADIR, "conf10.py"))
+        jcfg = cfg.jailed(rootpath=(u"tree1", u"tree2", u"key8"))
+        s = []
+        for k in jcfg:
+            s.append(k)
+        s.sort()
+        self.assertEqual([u"in the root namespace", u"val1", u"val2"], s)
+
 
 if __name__ == "__main__":
     unittest.main()