mirror of
https://github.com/python/cpython
synced 2024-09-19 20:51:48 +00:00
Fix small bugs in Template code.
* The parameterization of "delimiter" was incomplete. * safe_substitute's code for braced delimiters should only be executed when braced is not None. * Invalid pattern group names now raise a ValueError. Formerly, the convert code would fall off the end and improperly return None. Beefed-up tests. * Test delimiter override for all paths in substitute and safe_substitute. * Alter unittest invocation to match other modules (now it itemizes the tests as they are run).
This commit is contained in:
parent
23f1241dc6
commit
6d191113a6
|
@ -152,6 +152,7 @@ def substitute(self, *args, **kws):
|
|||
mapping = _multimap(kws, args[0])
|
||||
else:
|
||||
mapping = args[0]
|
||||
delimiter = self.delimiter[-1]
|
||||
# Helper function for .sub()
|
||||
def convert(mo):
|
||||
# Check the most common path first.
|
||||
|
@ -162,9 +163,10 @@ def convert(mo):
|
|||
# fail if val is a Unicode containing non-ASCII characters.
|
||||
return '%s' % val
|
||||
if mo.group('escaped') is not None:
|
||||
return '$'
|
||||
return delimiter
|
||||
if mo.group('invalid') is not None:
|
||||
self._invalid(mo)
|
||||
raise ValueError('Unrecognized named group in pattern', pattern)
|
||||
return self.pattern.sub(convert, self.template)
|
||||
|
||||
def safe_substitute(self, *args, **kws):
|
||||
|
@ -176,6 +178,7 @@ def safe_substitute(self, *args, **kws):
|
|||
mapping = _multimap(kws, args[0])
|
||||
else:
|
||||
mapping = args[0]
|
||||
delimiter = self.delimiter[-1]
|
||||
# Helper function for .sub()
|
||||
def convert(mo):
|
||||
named = mo.group('named')
|
||||
|
@ -185,16 +188,18 @@ def convert(mo):
|
|||
# will fail if val is a Unicode containing non-ASCII
|
||||
return '%s' % mapping[named]
|
||||
except KeyError:
|
||||
return '$' + named
|
||||
return delimiter + named
|
||||
braced = mo.group('braced')
|
||||
try:
|
||||
return '%s' % mapping[braced]
|
||||
except KeyError:
|
||||
return '${' + braced + '}'
|
||||
if braced is not None:
|
||||
try:
|
||||
return '%s' % mapping[braced]
|
||||
except KeyError:
|
||||
return delimiter + '{' + braced + '}'
|
||||
if mo.group('escaped') is not None:
|
||||
return '$'
|
||||
return delimiter
|
||||
if mo.group('invalid') is not None:
|
||||
self._invalid(mo)
|
||||
raise ValueError('Unrecognized named group in pattern', pattern)
|
||||
return self.pattern.sub(convert, self.template)
|
||||
|
||||
|
||||
|
|
|
@ -150,17 +150,27 @@ def test_keyword_arguments_safe(self):
|
|||
raises(TypeError, s.substitute, d, {})
|
||||
raises(TypeError, s.safe_substitute, d, {})
|
||||
|
||||
|
||||
def suite():
|
||||
suite = unittest.TestSuite()
|
||||
suite.addTest(unittest.makeSuite(TestTemplate))
|
||||
return suite
|
||||
|
||||
def test_delimiter_override(self):
|
||||
class AmpersandTemplate(Template):
|
||||
delimiter = '&'
|
||||
s = AmpersandTemplate('this &gift is for &{who} &&')
|
||||
self.assertEqual(s.substitute(gift='bud', who='you'),
|
||||
'this bud is for you &')
|
||||
self.assertRaises(KeyError, s.substitute)
|
||||
self.assertEqual(s.safe_substitute(gift='bud', who='you'),
|
||||
'this bud is for you &')
|
||||
self.assertEqual(s.safe_substitute(),
|
||||
'this &gift is for &{who} &')
|
||||
s = AmpersandTemplate('this &gift is for &{who} &')
|
||||
self.assertRaises(ValueError, s.substitute,
|
||||
dict(gift='bud', who='you'))
|
||||
self.assertRaises(ValueError, s.safe_substitute)
|
||||
|
||||
def test_main():
|
||||
from test import test_support
|
||||
test_support.run_suite(suite())
|
||||
test_classes = [TestTemplate,]
|
||||
test_support.run_unittest(*test_classes)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
test_main()
|
||||
|
|
Loading…
Reference in a new issue