# HG changeset patch # User Franz Glasner # Date 1639098900 -3600 # Node ID bd27da55483a4a2f13c8fe2a95bf3d0c2811de4a # Parent 37424d1f8dcfd99c33914ac234a7f585e6fe5f61 Optimized __contains__() implementation for jailed and unjailed configurations diff -r 37424d1f8dcf -r bd27da55483a CHANGES.txt --- 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) ~~~~~~~~~~~~~~~~~~~ diff -r 37424d1f8dcf -r bd27da55483a configmix/config.py --- 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) diff -r 37424d1f8dcf -r bd27da55483a tests/test.py --- 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()