changeset 398:b1f82b853290

Jailed configuration: implement more methods: getfirstvarl, getfirstvarl_s, getfirstvar and getfirstvar_s
author Franz Glasner <fzglas.hg@dom66.de>
date Fri, 19 Nov 2021 01:39:18 +0100
parents 88239f28415c
children b45403d175a0
files configmix/config.py tests/test.py
diffstat 2 files changed, 141 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/configmix/config.py	Thu Nov 18 22:29:05 2021 +0100
+++ b/configmix/config.py	Fri Nov 19 01:39:18 2021 +0100
@@ -707,11 +707,43 @@
     def getvarl(self, *path, **kwds):
         return self._base.getvarl(*(self._path + path), **kwds)
 
+    def getfirstvarl(self, *paths, **kwds):
+        real_paths = []
+        for path in paths:
+            if isinstance(path, (list, tuple)):
+                real_paths.append(self._path + path)
+            elif isinstance(path, dict):
+                raise TypeError(
+                    "a `dict' is not supported in a jailed configuration")
+            else:
+                raise TypeError("a paths item must be a list or tuple")
+        return self._base.getfirstvarl(*real_paths, **kwds)
+
     def getvarl_s(self, *path, **kwds):
         return self._base.getvarl_s(*(self._path + path), **kwds)
 
+    def getfirstvarl_s(self, *paths, **kwds):
+        real_paths = []
+        for path in paths:
+            if isinstance(path, (list, tuple)):
+                real_paths.append(self._path + path)
+            elif isinstance(path, dict):
+                raise TypeError(
+                    "a `dict' is not supported in a jailed configuration")
+            else:
+                raise TypeError("a paths item must be a list or tuple")
+        return self._base.getfirstvarl_s(*real_paths, **kwds)
+
     def getvar(self, varname, default=_MARKER):
         return self._base.getvar(self._pathstr + varname, default=default)
 
+    def getfirstvar(self, *varnames, **kwds):
+        real_varnames = [self._pathstr + vn for vn in varnames]
+        return self._base.getfirstvar(*real_varnames, **kwds)
+
     def getvar_s(self, varname, default=_MARKER):
         return self._base.getvar_s(self._pathstr + varname, default=default)
+
+    def getfirstvar_s(self, *varnames, **kwds):
+        real_varnames = [self._pathstr + vn for vn in varnames]
+        return self._base.getfirstvar_s(*real_varnames, **kwds)
--- a/tests/test.py	Thu Nov 18 22:29:05 2021 +0100
+++ b/tests/test.py	Fri Nov 19 01:39:18 2021 +0100
@@ -1271,6 +1271,115 @@
             u"get this as `tree1.tree2.key4'",
             jcfg.getvar_s(u"tree1.tree2.key4"))
 
+    def test_rootpath_getfirstvar_nonexisting(self):
+        cfg = configmix.load(os.path.join(TESTDATADIR, "conf10.py"))
+        jcfg = cfg.jailed(rootpath=(u"tree1",))
+
+        self.assertIsNone(jcfg.getfirstvarl(
+            *[(u"a", u"b"),
+              (u"tree2", u"no-key")],
+            default=None))
+        self.assertIsNone(jcfg.getfirstvarl_s(
+            *[(u"a", u"b"),
+              (u"tree2", u"no-key")],
+            default=None))
+        self.assertIsNone(jcfg.getfirstvar(
+            u"a.b", u"tree2.no-key",
+            default=None))
+        self.assertIsNone(jcfg.getfirstvar_s(
+            u"a.b", u"tree2.no-key",
+            default=None))
+
+    def test_rootpath_getfirstvar_raising(self):
+        cfg = configmix.load(os.path.join(TESTDATADIR, "conf10.py"))
+        jcfg = cfg.jailed(rootpath=(u"tree1",))
+
+        self.assertRaises(
+            KeyError,
+            jcfg.getfirstvarl,
+            (u"a", u"b"),
+            (u"tree2", u"no-key"))
+        self.assertRaises(
+            KeyError,
+            jcfg.getfirstvarl_s,
+            (u"a", u"b"),
+            (u"tree2", u"no-key"))
+        self.assertRaises(
+            KeyError,
+            jcfg.getfirstvar,
+            u"a.b", u"tree2.no-key")
+        self.assertRaises(
+            KeyError,
+            jcfg.getfirstvar_s,
+            u"a.b", u"tree2.no-key")
+
+    def test_rootpath_getfirstvar_existing(self):
+        cfg = configmix.load(os.path.join(TESTDATADIR, "conf10.py"))
+        jcfg = cfg.jailed(rootpath=(u"tree1",))
+
+        self.assertEqual(
+            u"get this as `tree1.tree2.key4'",
+            jcfg.getfirstvarl(
+                *[(u"a", u"b"),
+                  (u"tree2", u"key4")]))
+        self.assertEqual(
+            0x20,
+            jcfg.getfirstvarl_s(
+                *[(u"a", u"b"),
+                  (u"key3", ),
+                  (u"tree2", u"key4")]))
+        self.assertEqual(
+            0x20,
+            jcfg.getfirstvar(
+                u"key1", u"key3"))
+        self.assertEqual(
+            u"get this as `tree1.tree2.key4'",
+            jcfg.getfirstvar_s(
+                u"a.b", u"tree2.key4", u"tree2.key5"))
+
+    def test_root_getfirstvar_nonexisting(self):
+        cfg = configmix.load(os.path.join(TESTDATADIR, "conf10.py"))
+        jcfg = cfg.jailed(root=u"tree1")
+
+        self.assertIsNone(jcfg.getfirstvarl(
+            *[(u"a", u"b"),
+              (u"tree2", u"no-key")],
+            default=None))
+        self.assertIsNone(jcfg.getfirstvarl_s(
+            *[(u"a", u"b"),
+              (u"tree2", u"no-key")],
+            default=None))
+        self.assertIsNone(jcfg.getfirstvarl_s(
+            *[(u"a", u"b"),
+              (u"tree2", u"no-key")],
+            default=None))
+        self.assertIsNone(jcfg.getfirstvar_s(
+            u"a.b", u"tree2.no-key",
+            default=None))
+
+    def test_root_getfirstvar_raising(self):
+        cfg = configmix.load(os.path.join(TESTDATADIR, "conf10.py"))
+        jcfg = cfg.jailed(root=u"tree1")
+
+        self.assertRaises(
+            KeyError,
+            jcfg.getfirstvarl,
+            (u"a", u"b"),
+            (u"tree2", u"no-key"))
+        self.assertRaises(
+            KeyError,
+            jcfg.getfirstvarl_s,
+            (u"a", u"b"),
+            (u"tree2", u"no-key"))
+        self.assertRaises(
+            KeyError,
+            jcfg.getfirstvar,
+            u"a.b", u"tree2.no-key")
+        self.assertRaises(
+            KeyError,
+            jcfg.getfirstvar_s,
+            u"a.b", u"tree2.no-key")
+
 
 if __name__ == "__main__":
     unittest.main()