changeset 419:079a82129110

Allow the empty variable name to retrieve the root configuration object
author Franz Glasner <fzglas.hg@dom66.de>
date Thu, 02 Dec 2021 09:22:22 +0100
parents bb5f11abd12a
children 212a27cb0fc4
files CHANGES.txt configmix/config.py tests/test.py
diffstat 3 files changed, 44 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/CHANGES.txt	Thu Dec 02 01:24:53 2021 +0100
+++ b/CHANGES.txt	Thu Dec 02 09:22:22 2021 +0100
@@ -16,8 +16,10 @@
 ~~~
 
 - **[feature]**
+  Allow empty variable names in some cases to get the root object of a
+  configuration.
+- **[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
--- a/configmix/config.py	Thu Dec 02 01:24:53 2021 +0100
+++ b/configmix/config.py	Thu Dec 02 09:22:22 2021 +0100
@@ -343,9 +343,13 @@
         """
         varns, varname = self._split_ns(varname)
         if not varns:
-            varnameparts = [
-                self.unquote(vp) for vp in varname.split(self._HIER_SEPARATOR)
-            ]
+            if varname:
+                varnameparts = [
+                    self.unquote(vp)
+                    for vp in varname.split(self._HIER_SEPARATOR)
+                ]
+            else:
+                varnameparts = tuple()
         else:
             varnameparts = (varname,)
         return self.getvarl(*varnameparts, namespace=varns, default=default)
@@ -506,6 +510,8 @@
         else `default` is returned.
         """
         default = kwds.pop("default", _MARKER)
+        if not path:
+            return self
         try:
             v = self.expand_if_reference(self[path[0]])
             for p in path[1:]:
--- a/tests/test.py	Thu Dec 02 01:24:53 2021 +0100
+++ b/tests/test.py	Thu Dec 02 09:22:22 2021 +0100
@@ -764,6 +764,26 @@
             set([u"name", u"pwd"]),
             set(cfg.getkeys(u"db.user")))
 
+    def test37_get_root_object(self):
+        cfg = self._load(os.path.join(TESTDATADIR, "conf20.yml"))
+        self.assertTrue(cfg.getvarl() is cfg)
+
+    def test38_get_root_object(self):
+        cfg = self._load(os.path.join(TESTDATADIR, "conf20.yml"))
+        self.assertTrue(cfg.getvar(u"") is cfg)
+
+    def test39_get_root_keys(self):
+        cfg = self._load(os.path.join(TESTDATADIR, "conf10.py"))
+        self.assertEqual(
+            set([u"key1", u"key2", u"tree1"]),
+            set(cfg.getkeys(u"")))
+
+    def test39b_get_root_keys(self):
+        cfg = self._load(os.path.join(TESTDATADIR, "conf10.py"))
+        self.assertEqual(
+            set([u"key1", u"key2", u"tree1"]),
+            set(cfg.getkeysl()))
+
 
 class T02LoadAndMerge(_T02MixinLoadAndMerge, unittest.TestCase):
 
@@ -1499,6 +1519,18 @@
             set([u"key3", u"tree2"]),
             set(jcfg.getkeysl()))
 
+    def test_getkeys_all_empty_paths(self):
+        cfg = configmix.load(os.path.join(TESTDATADIR, "conf10.py"))
+        jcfg = cfg.jailed(rootpath=tuple())
+
+        self.assertEqual(
+            set([u"key1", u"key2", u"tree1"]),
+            set(jcfg.getkeysl()))
+
+        self.assertEqual(
+            set([u"key1", u"key2", u"tree1"]),
+            set(jcfg.getkeys(u"")))
+
 
 if __name__ == "__main__":
     unittest.main()