changeset 442:94cf5a8722d6

Add proper .get() support for jailed and unjailed configurations
author Franz Glasner <fzglas.hg@dom66.de>
date Fri, 10 Dec 2021 03:00:11 +0100
parents 9d20fab53a19
children 23941c014130
files configmix/config.py tests/test.py
diffstat 2 files changed, 73 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/configmix/config.py	Fri Dec 10 02:20:54 2021 +0100
+++ b/configmix/config.py	Fri Dec 10 03:00:11 2021 +0100
@@ -247,6 +247,15 @@
         else:
             return self.getvarl_s(key)
 
+    def get(self, key, default=None):
+        """Mapping interface that forwards to :meth:`~.getvarl_s`
+
+        """
+        if isinstance(key, (tuple, list)):
+            return self.getvarl_s(*key, default=default)
+        else:
+            return self.getvarl_s(key, default=default)
+
     def __contains__(self, key):
         if isinstance(key, (tuple, list)):
             # No namespace and quoting support here
@@ -841,6 +850,14 @@
         else:
             return self._base.getvarl_s(*(self._path + (key, )))
 
+    def get(self, key, default=None):
+        if isinstance(key, tuple):
+            return self._base.get(self._path + key, default=default)
+        elif isinstance(key, list):
+            return self._base.get(self._path + tuple(key), default=default)
+        else:
+            return self._base.get(self._path + (key, ), default=default)
+
     def __contains__(self, key):
         if isinstance(key, tuple):
             return (self._path + key) in self._base
--- a/tests/test.py	Fri Dec 10 02:20:54 2021 +0100
+++ b/tests/test.py	Fri Dec 10 03:00:11 2021 +0100
@@ -794,6 +794,23 @@
         self.assertTrue((u"tree1", u"tree2") in cfg)
         self.assertFalse((u"tree1", u"non-existing-tree2") in cfg)
 
+    def test43_get_with_string(self):
+        cfg = self._load(os.path.join(TESTDATADIR, "conf10.py"))
+        self.assertEqual(
+            u"in the root namespace",
+            cfg.get(u"key1"))
+        self.assertTrue(
+            cfg.get(u"key1-not", default=None) is None)
+
+    def test43_get_with_path(self):
+        cfg = self._load(os.path.join(TESTDATADIR, "conf10.py"))
+        self.assertEqual(
+            0x20,
+            cfg.get((u"tree1", u"key3")))
+        self.assertEqual(
+            0x1,
+            cfg.get((u"no", u"key"), default=0x1))
+
 
 class T02LoadAndMerge(_T02MixinLoadAndMerge, unittest.TestCase):
 
@@ -1624,6 +1641,45 @@
         self.assertTrue([u"tree2", u"key5"] in jcfg)
         self.assertFalse([u"tree2", u"no-key"] in jcfg)
 
+    def test_get_with_string(self):
+        cfg = configmix.load(os.path.join(TESTDATADIR, "conf10.py"))
+        jcfg = cfg.jailed(rootpath=(u"tree1",))
+
+        self.assertEqual(
+            0x20,
+            jcfg.get(u"key3"))
+        self.assertEqual(
+            0x2,
+            jcfg.get(u"no-key3", default=0x2))
+
+    def test_get_with_path(self):
+        cfg = configmix.load(os.path.join(TESTDATADIR, "conf10.py"))
+        jcfg = cfg.jailed(rootpath=(u"tree1",))
+
+        self.assertEqual(
+            0x20,
+            jcfg.get((u"key3",)))
+        self.assertEqual(
+            0x3,
+            jcfg.get((u"no-key",), default=0x3))
+        self.assertEqual(
+            u"off",
+            jcfg.get((u"tree2", u"key6")))
+        self.assertEqual(
+            u"the default",
+            jcfg.get((u"no", u"key"), default=u"the default"))
+        self.assertTrue(
+            jcfg.get((u"no", u"key")) is None)
+
+        self.assertEqual(
+            u"off",
+            jcfg.get([u"tree2", u"key6"]))
+        self.assertEqual(
+            u"the default",
+            jcfg.get([u"no", u"key"], default=u"the default"))
+        self.assertTrue(
+            jcfg.get([u"no", u"key"]) is None)
+
 
 if __name__ == "__main__":
     unittest.main()