changeset 439:bd27da55483a

Optimized __contains__() implementation for jailed and unjailed configurations
author Franz Glasner <fzglas.hg@dom66.de>
date Fri, 10 Dec 2021 02:15:00 +0100
parents 37424d1f8dcf
children f297c23f78f0
files CHANGES.txt configmix/config.py tests/test.py
diffstat 3 files changed, 49 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/CHANGES.txt	Fri Dec 10 01:44:12 2021 +0100
+++ b/CHANGES.txt	Fri Dec 10 02:15:00 2021 +0100
@@ -22,6 +22,10 @@
 - **[feature]**
   Simple dict-level access for jailed configuration
 
+- **[feature]**
+  Optimized "__contains__()" implementation for jailed and unjailed
+  configurations
+
 
 0.18.1 (2021-12-10)
 ~~~~~~~~~~~~~~~~~~~
--- a/configmix/config.py	Fri Dec 10 01:44:12 2021 +0100
+++ b/configmix/config.py	Fri Dec 10 02:15:00 2021 +0100
@@ -247,6 +247,18 @@
         else:
             return self.getvarl_s(key)
 
+    def __contains__(self, key):
+        if isinstance(key, (tuple, list)):
+            # No namespace and quoting support here
+            try:
+                self._lookupvar(*key)
+            except KeyError:
+                return False
+            else:
+                return True
+        else:
+            return super(Configuration, self).__contains__(key)
+
     def getvarl(self, *path, **kwds):
         """Get a variable where the hierarchy is given in `path` as sequence
         and the namespace is given in the `namespace` keyword argument.
@@ -827,6 +839,12 @@
         else:
             return self.getvarl_s(key)
 
+    def __contains__(self, key):
+        if isinstance(key, (tuple, list)):
+            return (self._path + key) in self._base
+        else:
+            return (self._path + (key, )) in self._base
+
     def getvarl(self, *path, **kwds):
         return self._base.getvarl(*(self._path + path), **kwds)
 
--- a/tests/test.py	Fri Dec 10 01:44:12 2021 +0100
+++ b/tests/test.py	Fri Dec 10 02:15:00 2021 +0100
@@ -784,6 +784,16 @@
             set([u"key1", u"key2", u"tree1"]),
             set(cfg.getkeysl()))
 
+    def test40_contains_with_string(self):
+        cfg = self._load(os.path.join(TESTDATADIR, "conf10.py"))
+        self.assertTrue(u"tree1" in cfg)
+        self.assertFalse(u"non-existing-tree1" in cfg)
+
+    def test41_contains_with_path(self):
+        cfg = self._load(os.path.join(TESTDATADIR, "conf10.py"))
+        self.assertTrue((u"tree1", u"tree2") in cfg)
+        self.assertFalse((u"tree1", u"non-existing-tree2") in cfg)
+
 
 class T02LoadAndMerge(_T02MixinLoadAndMerge, unittest.TestCase):
 
@@ -1585,6 +1595,23 @@
         else:
             self.fail("KeyError expected")
 
+    def test_contains_with_string(self):
+        cfg = configmix.load(os.path.join(TESTDATADIR, "conf10.py"))
+        jcfg = cfg.jailed(rootpath=(u"tree1",))
+
+        self.assertTrue(u"key3" in jcfg)
+        self.assertFalse(u"key3-not" in jcfg)
+
+    def test_contains_with_path(self):
+        cfg = configmix.load(os.path.join(TESTDATADIR, "conf10.py"))
+        jcfg = cfg.jailed(rootpath=(u"tree1",))
+
+        self.assertTrue((u"key3",) in jcfg)
+        self.assertFalse((u"key3-not",) in jcfg)
+
+        self.assertTrue((u"tree2", u"key5") in jcfg)
+        self.assertFalse((u"tree2", u"no-key") in jcfg)
+
 
 if __name__ == "__main__":
     unittest.main()