except (KeyError, NoSectionError, NoOptionError):
raise InterpolationMissingOptionError(
option, section, rawval, ":".join(path)) from None
+ if v is None:
+ continue
if "$" in v:
self._interpolate_some(parser, opt, accum, v, sect,
dict(parser.items(sect, raw=True)),
allow_no_value = True
+class NoValueAndExtendedInterpolation(CfgParserTestCaseClass):
+ interpolation = configparser.ExtendedInterpolation()
+ allow_no_value = True
+
+ def test_interpolation_with_allow_no_value(self):
+ config = textwrap.dedent("""
+ [dummy]
+ a
+ b = ${a}
+ """)
+ cf = self.fromstring(config)
+
+ self.assertIs(cf["dummy"]["a"], None)
+ self.assertEqual(cf["dummy"]["b"], "")
+
+ def test_explicit_none(self):
+ config = textwrap.dedent("""
+ [dummy]
+ a = None
+ b = ${a}
+ """)
+ cf = self.fromstring(config)
+
+ self.assertEqual(cf["dummy"]["a"], "None")
+ self.assertEqual(cf["dummy"]["b"], "None")
+
+
+class ConfigParserNoValueAndExtendedInterpolationTest(
+ NoValueAndExtendedInterpolation,
+ unittest.TestCase,
+):
+ config_class = configparser.ConfigParser
+
+
+class RawConfigParserNoValueAndExtendedInterpolationTest(
+ NoValueAndExtendedInterpolation,
+ unittest.TestCase,
+):
+ config_class = configparser.RawConfigParser
+
+
class ConfigParserTestCaseTrickyFile(CfgParserTestCaseClass, unittest.TestCase):
config_class = configparser.ConfigParser
delimiters = {'='}