mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	gh-130941: Fix configparser parsing values with allow_no_value and interpolation set (GH-130949)
				
					
				
			This commit is contained in:
		
							parent
							
								
									8b7cb947c5
								
							
						
					
					
						commit
						c35c7353eb
					
				
					 3 changed files with 45 additions and 0 deletions
				
			
		|  | @ -541,6 +541,8 @@ def _interpolate_some(self, parser, option, accum, rest, section, map, | |||
|                 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)), | ||||
|  |  | |||
|  | @ -1328,6 +1328,47 @@ class ConfigParserTestCaseNoValue(ConfigParserTestCase): | |||
|     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 = {'='} | ||||
|  |  | |||
|  | @ -0,0 +1,2 @@ | |||
| Fix :class:`configparser.ConfigParser` parsing empty interpolation with | ||||
| ``allow_no_value`` set to ``True``. | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 sobolevn
						sobolevn