# Copyright (C) 2004 Python Software Foundation
# Author: barry@python.org (Barry Warsaw)
# License: http://www.opensource.org/licenses/PythonSoftFoundation.php
from string
import Template
def __getitem__(self
, name
):
for part
in name
.split('.'):
class TestTemplate(unittest
.TestCase
):
def test_regular_templates(self
):
s
= Template('$who likes to eat a bag of $what worth $$100')
self
.assertEqual(s
.substitute(dict(who
='tim', what
='ham')),
'tim likes to eat a bag of ham worth $100')
self
.assertRaises(KeyError, s
.substitute
, dict(who
='tim'))
def test_regular_templates_with_braces(self
):
s
= Template('$who likes ${what} for ${meal}')
d
= dict(who
='tim', what
='ham', meal
='dinner')
self
.assertEqual(s
.substitute(d
), 'tim likes ham for dinner')
self
.assertRaises(KeyError, s
.substitute
,
dict(who
='tim', what
='ham'))
s
= Template('$who likes to eat a bag of $$what worth $$100')
eq(s
.substitute(dict(who
='tim', what
='ham')),
'tim likes to eat a bag of $what worth $100')
s
= Template('$who likes $$')
eq(s
.substitute(dict(who
='tim', what
='ham')), 'tim likes $')
s
= Template('%(foo)s $foo ${foo}')
eq(s
.substitute(d
), '%(foo)s baz baz')
eq(s
.safe_substitute(d
), '%(foo)s baz baz')
def test_stringification(self
):
s
= Template('tim has eaten $count bags of ham today')
eq(s
.substitute(d
), 'tim has eaten 7 bags of ham today')
eq(s
.safe_substitute(d
), 'tim has eaten 7 bags of ham today')
s
= Template('tim has eaten ${count} bags of ham today')
eq(s
.substitute(d
), 'tim has eaten 7 bags of ham today')
def test_SafeTemplate(self
):
s
= Template('$who likes ${what} for ${meal}')
eq(s
.safe_substitute(dict(who
='tim')), 'tim likes ${what} for ${meal}')
eq(s
.safe_substitute(dict(what
='ham')), '$who likes ham for ${meal}')
eq(s
.safe_substitute(dict(what
='ham', meal
='dinner')),
'$who likes ham for dinner')
eq(s
.safe_substitute(dict(who
='tim', what
='ham')),
'tim likes ham for ${meal}')
eq(s
.safe_substitute(dict(who
='tim', what
='ham', meal
='dinner')),
'tim likes ham for dinner')
def test_invalid_placeholders(self
):
raises
= self
.assertRaises
s
= Template('$who likes $')
raises(ValueError, s
.substitute
, dict(who
='tim'))
s
= Template('$who likes ${what)')
raises(ValueError, s
.substitute
, dict(who
='tim'))
s
= Template('$who likes $100')
raises(ValueError, s
.substitute
, dict(who
='tim'))
def test_delimiter_override(self
):
class PieDelims(Template
):
s
= PieDelims('@who likes to eat a bag of @{what} worth $100')
self
.assertEqual(s
.substitute(dict(who
='tim', what
='ham')),
'tim likes to eat a bag of ham worth $100')
def test_idpattern_override(self
):
class PathPattern(Template
):
idpattern
= r
'[_a-z][._a-z0-9]*'
s
= PathPattern('$bag.foo.who likes to eat a bag of $bag.what')
self
.assertEqual(s
.substitute(m
), 'tim likes to eat a bag of ham')
def test_pattern_override(self
):
class MyPattern(Template
):
@(?P<named>[_a-z][._a-z0-9]*) |
@{(?P<braced>[_a-z][._a-z0-9]*)} |
s
= MyPattern('@bag.foo.who likes to eat a bag of @bag.what')
self
.assertEqual(s
.substitute(m
), 'tim likes to eat a bag of ham')
class BadPattern(Template
):
@(?P<named>[_a-z][._a-z0-9]*) |
@{(?P<braced>[_a-z][._a-z0-9]*)} |
s
= BadPattern('@bag.foo.who likes to eat a bag of @bag.what')
self
.assertRaises(ValueError, s
.substitute
, {})
self
.assertRaises(ValueError, s
.safe_substitute
, {})
def test_unicode_values(self
):
s
= Template('$who likes $what')
d
= dict(who
=u
't\xffm', what
=u
'f\xfe\fed')
self
.assertEqual(s
.substitute(d
), u
't\xffm likes f\xfe\x0ced')
def test_keyword_arguments(self
):
s
= Template('$who likes $what')
eq(s
.substitute(who
='tim', what
='ham'), 'tim likes ham')
eq(s
.substitute(dict(who
='tim'), what
='ham'), 'tim likes ham')
eq(s
.substitute(dict(who
='fred', what
='kung pao'),
s
= Template('the mapping is $mapping')
eq(s
.substitute(dict(foo
='none'), mapping
='bozo'),
eq(s
.substitute(dict(mapping
='one'), mapping
='two'),
def test_keyword_arguments_safe(self
):
raises
= self
.assertRaises
s
= Template('$who likes $what')
eq(s
.safe_substitute(who
='tim', what
='ham'), 'tim likes ham')
eq(s
.safe_substitute(dict(who
='tim'), what
='ham'), 'tim likes ham')
eq(s
.safe_substitute(dict(who
='fred', what
='kung pao'),
s
= Template('the mapping is $mapping')
eq(s
.safe_substitute(dict(foo
='none'), mapping
='bozo'),
eq(s
.safe_substitute(dict(mapping
='one'), mapping
='two'),
raises(TypeError, s
.substitute
, d
, {})
raises(TypeError, s
.safe_substitute
, d
, {})
def test_delimiter_override(self
):
raises
= self
.assertRaises
class AmpersandTemplate(Template
):
s
= AmpersandTemplate('this &gift is for &{who} &&')
eq(s
.substitute(gift
='bud', who
='you'), 'this bud is for you &')
raises(KeyError, s
.substitute
)
eq(s
.safe_substitute(gift
='bud', who
='you'), 'this bud is for you &')
eq(s
.safe_substitute(), 'this &gift is for &{who} &')
s
= AmpersandTemplate('this &gift is for &{who} &')
raises(ValueError, s
.substitute
, dict(gift
='bud', who
='you'))
eq(s
.safe_substitute(), 'this &gift is for &{who} &')
from test
import test_support
test_classes
= [TestTemplate
,]
test_support
.run_unittest(*test_classes
)
if __name__
== '__main__':