changeset 251:2a8dcab2de8c

Do not implicitely convert a configuration value to text if the value is the result of just a variable expansion. This is technically a breaking change. But no known client code uses the old behaviour.
author Franz Glasner <fzglas.hg@dom66.de>
date Tue, 07 Jul 2020 22:21:27 +0200
parents ff964825a75a
children 42a6d59cf2ad
files CHANGES.txt configmix/config.py tests/data/conf1.ini tests/test.py
diffstat 4 files changed, 55 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/CHANGES.txt	Tue Jul 07 09:27:24 2020 +0200
+++ b/CHANGES.txt	Tue Jul 07 22:21:27 2020 +0200
@@ -13,6 +13,16 @@
 --------------
 
 .. changelog::
+   :version: n/a
+   :released: not yet
+
+   .. change::
+      :tags: breaking, feature
+
+      Do not implicitely convert a configuration value to text if the
+      value is the result of just a variable expansion.
+
+.. changelog::
    :version: 0.7.4
    :released: 2020-05-21
 
--- a/configmix/config.py	Tue Jul 07 09:27:24 2020 +0200
+++ b/configmix/config.py	Tue Jul 07 22:21:27 2020 +0200
@@ -219,6 +219,12 @@
                 raise
             if varvalue is None:
                 varvalue = u("")
+            #
+            # Dont apply and type conversions to str if the whole `s` is
+            # just one expansion
+            #
+            if (start == 0) and (end + 2 == len(s)):
+                return varvalue
             replaced = s[:start] + u(str(varvalue))
             s = replaced + s[end+2:]
             # don't re-evaluate because `self.getvar_s()` expands already
--- a/tests/data/conf1.ini	Tue Jul 07 09:27:24 2020 +0200
+++ b/tests/data/conf1.ini	Tue Jul 07 22:21:27 2020 +0200
@@ -10,3 +10,11 @@
 key6 = :int:0o377
 __comment2 = Comment no 2
 key7 = Umlaute: ÄÖÜäöüß
+# Just expand to an int
+key100 = {{key2}}
+# Convert to a string because not alone
+key101 = the {{key2}} value
+# Recursion does not change the type also
+key102 = {{key100}}
+# Not alone -> string
+key103 = {{key100}}{{key2}}
--- a/tests/test.py	Tue Jul 07 09:27:24 2020 +0200
+++ b/tests/test.py	Tue Jul 07 22:21:27 2020 +0200
@@ -391,7 +391,7 @@
         cfg = configmix.load(os.path.join(TESTDATADIR, "conf1.ini"),
                              os.path.join(TESTDATADIR, "conf30.conf"))
         self.assertRaises(KeyError, cfg.getvar_s, "key-new")
-        self.assertRaises(KeyError, cfg.getvar_s, "key1")        
+        self.assertRaises(KeyError, cfg.getvar_s, "key1")
 
     def test03_only_style_corrrect_style(self):
         configmix.clear_assoc()
@@ -431,5 +431,35 @@
         self.assertRaises(KeyError, _ld)
 
 
+class T05SubstituteExpand(unittest.TestCase):
+
+    def setUp(self):
+        self._reset()
+
+    def tearDown(self):
+        self._reset()
+
+    def _reset(self):
+        configmix.clear_assoc()
+        for pat, fmode in configmix.DEFAULT_ASSOC:
+            configmix.set_assoc(pat, fmode)
+
+    def test01_expand_int_ini(self):
+        cfg = configmix.load(os.path.join(TESTDATADIR, "conf1.ini"))
+        self.assertEqual(2, cfg.getvar_s("key100"))
+
+    def test02_expand_int_indirect_ini(self):
+        cfg = configmix.load(os.path.join(TESTDATADIR, "conf1.ini"))
+        self.assertEqual(2, cfg.getvar_s("key102"))
+
+    def test03_expand_int2str_ini(self):
+        cfg = configmix.load(os.path.join(TESTDATADIR, "conf1.ini"))
+        self.assertEqual("the 2 value", cfg.getvar_s("key101"))
+
+    def test04_expand_intint2str_ini(self):
+        cfg = configmix.load(os.path.join(TESTDATADIR, "conf1.ini"))
+        self.assertEqual("22", cfg.getvar_s("key103"))        
+
+
 if __name__ == "__main__":
     unittest.main()