changeset 437:bbc5b64e137a

- Dict-level access to a configuration key now does variable interpolation. - Basic dict-level access for jailed configurations
author Franz Glasner <fzglas.hg@dom66.de>
date Fri, 10 Dec 2021 01:33:37 +0100
parents 3ae097e04879
children 37424d1f8dcf
files CHANGES.txt configmix/config.py docs/changes.rst tests/test.py
diffstat 4 files changed, 75 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/CHANGES.txt	Fri Dec 10 01:05:34 2021 +0100
+++ b/CHANGES.txt	Fri Dec 10 01:33:37 2021 +0100
@@ -12,6 +12,17 @@
 Pre-1.0 Series
 --------------
 
+n/a (not released)
+~~~~~~~~~~~~~~~~~~
+
+- **[breaking] [feature}**
+  Access to a configuration key using dict-level access now does variable
+  interpolation
+
+- **[feature]**
+  Simple dict-level access for jailed configuration
+
+
 0.18.1 (2021-12-10)
 ~~~~~~~~~~~~~~~~~~~
 
--- a/configmix/config.py	Fri Dec 10 01:05:34 2021 +0100
+++ b/configmix/config.py	Fri Dec 10 01:33:37 2021 +0100
@@ -238,6 +238,15 @@
     is_jail = False
     """Flag to show that this is not a jail for another configuration"""
 
+    def __getitem__(self, key):
+        """Mapping interface that forwards to :meth:`~.getvarl_s`
+
+        """
+        if isinstance(key, (tuple, list)):
+            return self.getvarl_s(*key)
+        else:
+            return self.getvarl_s(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.
@@ -513,7 +522,8 @@
         if not path:
             return self
         try:
-            v = self.expand_if_reference(self[path[0]])
+            # v = self.expand_if_reference(self[path[0]])
+            v = self.expand_if_reference(super(Configuration, self).__getitem__(path[0]))
             for p in path[1:]:
                 v = self.expand_if_reference(v[p])
         except TypeError:
@@ -808,6 +818,15 @@
         if self._path:
             new_base.getvarl(*self._path)
 
+    def __getitem__(self, key):
+        """Mapping interface that forwards to :meth:`~.getvarl_s`
+
+        """
+        if isinstance(key, (tuple, list)):
+            return self.getvarl_s(*key)
+        else:
+            return self.getvarl_s(key)
+
     def getvarl(self, *path, **kwds):
         return self._base.getvarl(*(self._path + path), **kwds)
 
--- a/docs/changes.rst	Fri Dec 10 01:05:34 2021 +0100
+++ b/docs/changes.rst	Fri Dec 10 01:33:37 2021 +0100
@@ -16,6 +16,12 @@
 Breaking Changes
 ================
 
+0.19
+----
+
+- Dict-level access to a configuraiton now does variable interpolation
+
+
 0.14
 ----
 
--- a/tests/test.py	Fri Dec 10 01:05:34 2021 +0100
+++ b/tests/test.py	Fri Dec 10 01:33:37 2021 +0100
@@ -1015,16 +1015,19 @@
             "werkzeug",
             self._cfg.getvarl_s("wsgi", "profiler", "params", "type"))
 
-    def test03_no_direct_attribute_access_to_expanded_references(self):
+    def test03_direct_attribute_access_to_expanded_references(self):
+        self.assertEqual(
+            u"werkzeug",
+            self._cfg.wsgi.profiler.params.type)
+
+    def test03b_dict_like_access_expands_references(self):
         self.assertEqual(
-            "{{ref:#wsgi.debugger}}",
-            self._cfg.wsgi.profiler.params)
-        try:
-            self._cfg.wsgi.profiler.params.type
-        except AttributeError:
-            pass
-        else:
-            self.fail("no attribute error seen")
+            u"werkzeug",
+            self._cfg[(u"wsgi", u"profiler", u"params", u"type")])
+
+    def test03c_dict_like_access_with_single_string_key(self):
+        self.assertTrue(
+            u"profiler" in self._cfg[u"wsgi"])
 
     def test04_indirect_recursive_references(self):
         self.assertEqual(
@@ -1556,6 +1559,32 @@
                 r"_JailedConfiguration(rootpath=('tree1', 'tree2'))",
                 repr(jcfg))
 
+    def test_dict_level_access_with_single_key(self):
+        cfg = configmix.load(os.path.join(TESTDATADIR, "conf10.py"))
+        jcfg = cfg.jailed(rootpath=(u"tree1", u"tree2"))
+        self.assertEqual(
+            u"off",
+            jcfg[u"key6"])
+        try:
+            jcfg[u"key3"]
+        except KeyError:
+            pass
+        else:
+            self.fail("KeyError expected")
+
+    def test_dict_level_access_with_path(self):
+        cfg = configmix.load(os.path.join(TESTDATADIR, "conf10.py"))
+        jcfg = cfg.jailed(rootpath=(u"tree1", u"tree2"))
+        self.assertEqual(
+            u"get this as `tree1.tree2.key4'",
+            jcfg[(u"key4",)])
+        try:
+            jcfg[(u"key3",)]
+        except KeyError:
+            pass
+        else:
+            self.fail("KeyError expected")
+
 
 if __name__ == "__main__":
     unittest.main()