import py
here = py.path.local(__file__).dirpath()
py.std.sys.path.append(str(here.dirpath()))
try:
from templess.templess import *
from templess.convert import *
from templess.util import *
from templess.parse import *
except ImportError:
from templess import *
from convert import *
from util import *
from parse import *
def test_start_node():
node = elnode('foo', {'foo': 'bar'}, None)
s = xmlgenerator(node)
assert list(s._start_node(node, node.attrs, True)) == [
'']
assert list(s._start_node(node, node.attrs, False)) == [
'']
def test_handle_cond():
node = templessnode('foo', {}, None, {})
s = convertor(node)
assert s._handle_cond(node, {})
node = templessnode('foo', {}, None, {'cond': 'foo'})
s = convertor(node)
assert not s._handle_cond(node, {'foo': False})
node = templessnode('foo', {}, None, {'cond': 'foo'})
s = convertor(node)
assert s._handle_cond(node, {'foo': True})
node = templessnode('foo', {}, None, {'not': 'foo'})
s = convertor(node)
assert not s._handle_cond(node, {'foo': True})
node = templessnode('foo', {}, None, {'not': 'foo'})
s = convertor(node)
assert s._handle_cond(node, {'foo': False})
node = templessnode('foo', {}, None, {'cond': 'foo'})
s = convertor(node)
assert not s._handle_cond(node, {'foo': []})
def test_handle_cond_not_existing():
node = templessnode('foo', {}, None, {'cond': 'foo'})
s = convertor(node)
assert not s._handle_cond(node, {})
node = templessnode('foo', {}, None, {'not': 'foo'})
s = convertor(node)
assert s._handle_cond(node, {})
def test_get_content():
node = templessnode('foo', {}, None, {})
s = convertor(node)
assert not s._get_content(node)
node = templessnode('foo', {}, None, {'content': 'foo'})
s = convertor(node)
assert s._get_content(node) == 'foo'
def test_get_replace():
node = templessnode('foo', {}, None, {})
s = convertor(node)
assert not s._get_replace(node)
node = templessnode('foo', {}, None, {'replace': 'foo'})
s = convertor(node)
assert s._get_replace(node) == 'foo'
def test_basic_rendering():
node = templessnode('foo', {}, None, {'content': 'bar'})
s = xmlserializer(node)
s.convert({'bar': 'baz'})
ret = s.unicode()
assert ret == u'baz'
def test_list_rendering():
node = templessnode('foo', {}, None, {'content': 'bar'})
s = xmlserializer(node)
nodes = s.convert({'bar': ['1', '2']})
ret1 = s._unicode(nodes[0])
assert ret1 == '1'
ret2 = s._unicode(nodes[1])
assert ret2 == '2'
def test_entitizing():
node = templessnode('foo', {}, None, {'content': 'bar'})
s = xmlserializer(node)
s.convert({'bar': 'x < 1'})
ret = s.unicode()
assert ret == 'x < 1'
def test_xmlstring():
node = templessnode('foo', {}, None, {'content': 'bar'})
s = xmlserializer(node)
s.convert({'bar': xmlstring('')})
ret = s.unicode()
assert ret == ''
def test_generator():
def somegenerator():
for x in [1, 2, 3]:
yield x
node = templessnode('foo', {}, None, {'content': 'bar'})
s = xmlserializer(node)
nodes = s.convert({'bar': somegenerator()})
for i, n in enumerate(nodes):
assert s._unicode(n) == '%s' % (i + 1,)
def test_list_of_dicts():
node = templessnode('foo', {}, None, {'content': 'fooc'})
# add some ignorable whitespace and some children
textnode(' ', node)
templessnode('bar', {}, node, {'content': 'barc'})
templessnode('baz', {}, node, {'content': 'bazc'})
s = xmlserializer(node)
nodes = s.convert(
{'fooc': [
{'barc': 'r1', 'bazc': 'z1'},
{'barc': 'r2', 'bazc': 'z2'},
]}
)
print repr(nodes)
assert s._unicode(nodes[0]) == u' r1z1'
assert s._unicode(nodes[1]) == u' r2z2'
def test_dict():
node = templessnode('foo', {}, None, {'content': 'fooc'})
templessnode('bar', {}, node, {'content': 'barc'})
templessnode('baz', {}, node, {'content': 'bazc'})
s = xmlserializer(node)
# shouldn't this return a single node instead?
nodes = s.convert({'fooc': {'barc': 'r1', 'bazc': 'z1'}})
print repr(nodes)
assert s._unicode(nodes[0]) == u'r1z1'
def test_basic_attrs():
node = templessnode('foo', {}, None, {'attr': 'value bar'})
s = xmlserializer(node)
node = s.convert({'bar': 'baz'})
assert s.unicode() == ''
def test_attr_basic():
node = templessnode('foo', {}, None, {'attr': 'bar baz'})
s = xmlserializer(node)
s.convert({'baz': 'qux'})
assert s.unicode() == u''
def test_attr_false():
node = templessnode('foo', {}, None, {'attr': 'bar baz'})
s = xmlserializer(node)
s.convert({'baz': False})
assert s.unicode() == u''
def test_attr_remove_xmlns():
#py.test.skip('done by parser nowadays - write test there')
node = parse_from_xml(
'', 'utf-8')
s = xmlserializer(node)
s.convert({})
assert s.unicode() == u''
def test_attr_remove_xmlns_leave_other():
node = templessnode('foo', {'xmlns:q': 'foo'}, None, {})
node = parse_from_xml(
'', 'utf-8')
s = xmlserializer(node)
s.convert({})
assert s.unicode() == u''
def test_attr_false_empty_string():
node = templessnode('foo', {}, None, {'attr': 'bar baz'})
s = xmlserializer(node)
s.convert({'baz': ''})
assert s.unicode() == u''
def test_attr_false_replacing():
node = templessnode('foo', {'bar': 'baz'}, None, {'attr': 'bar baz'})
s = xmlserializer(node)
s.convert({'baz': False})
assert s.unicode() == u''
def test_list_with_attrs():
# XXX not entirely sure about this behaviour yet...
node = templessnode(
'foo', {}, None, {'content': 'bar', 'attr': 'value baz'})
s = xmlserializer(node)
nodes = s.convert({'baz': 'top', 'bar': [{'baz': 1}, {'baz': 2}]})
assert len(nodes) == 2
assert s._unicode(nodes[0]) == u''
assert s._unicode(nodes[1]) == u''
def test_cdata():
node = cdatanode(' foo ', None)
s = xmlserializer(node)
assert s.unicode() == u''
def test_find():
''
foo = elnode('foo', {}, None)
bar1 = elnode('bar', {'id': "bar1"}, foo)
baz = elnode('baz', {}, bar1)
bar2 = elnode('bar', {'id': "bar2"}, baz)
bar3 = elnode('bar', {'id': "bar3"}, foo)
bar4 = elnode('bar', {'id': "bar4"}, bar2)
ids = [el.attrs['id'] for el in list(foo.find('bar'))]
assert ids == ['bar1', 'bar2', 'bar4', 'bar3']
class container(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
def test_objectcontext_regular():
c = container(foo=1)
assert str(c.foo) == '1'
py.test.raises(TypeError, "c['foo']")
oc = objectcontext(c)
assert str(oc['foo']) == '1'
py.test.raises(KeyError, "oc['bar']")
def test_objectcontext_dict():
oc = objectcontext({'foo': 1})
assert str(oc['foo']) == '1'
def test_objectcontext_nested():
ci = container(bar=1)
c = container(foo=ci)
oc = objectcontext(c)
assert str(oc['foo']['bar']) == '1'
def test_objectcontext_callable():
c = container(foo=lambda: 1)
oc = objectcontext(c)
assert str(oc['foo']) == '1'
def test_objectcontext_nested_list():
c = container(foo=[container(bar=1), container(bar=2)])
oc = objectcontext(c)
for i, item in enumerate(oc['foo']):
assert isinstance(item, objectcontext)
assert str(item['bar']) == str(i+1)
def test_objectcontext_nested_iterable():
c = container(foo=(container(bar=x) for x in [1, 2]))
oc = objectcontext(c)
for i, item in enumerate(oc['foo']):
assert isinstance(item, objectcontext)
assert str(item['bar']) == str(i+1)
def test_generate():
t = template('')
ret = ''
i = 0
for chunk in t.generate({'foo': 'bar'}):
i += 1
ret += chunk
assert i > 1
assert ret == ('bar')
def test_generate_list():
t = template(
'')
ret = ''.join(list(t.generate({'bar': [1, 2]})))
assert ret == '12'
def test_generate_singleton():
t = template(
''
'')
ret = ''.join(list(t.generate({'bar': []})))
assert ret == ''
def test_generate_cond():
t = template(
''
'')
ret = ''.join(list(t.generate({'baz': True})))
assert ret == ''
ret = ''.join(list(t.generate({'baz': False})))
assert ret == ''
def test_generate_not():
t = template(
''
'')
ret = ''.join(list(t.generate({'baz': True})))
assert ret == ''
ret = ''.join(list(t.generate({'baz': False})))
assert ret == ''
def test_generate_content_list_of_dicts():
t = template(
''
'')
ret = ''.join(list(t.generate(
{'spam': [{'eggs': 'foo'}, {'eggs': 'bar'}]})))
assert ret == (
'foobar')
def test_generate_replace_list_of_dicts():
t = template(
''
'')
ret = ''.join(list(t.generate(
{'spam': [{'eggs': 'foo'}, {'eggs': 'bar'}]})))
assert ret == (
'foobar')
def test_generate_list_of_dicts_replace_inner():
t = template(
''
'')
ret = ''.join(list(t.generate(
{'spam': [{'eggs': 'foo'}, {'eggs': 'bar'}]})))
assert ret == (
'foobar')
def test_generate_content_dict():
t = template(''
'')
ret = ''.join(list(t.generate({'spam': {'eggs': 'eggs'}})))
assert ret == 'eggs'
def test_generate_replace_dict():
t = template(''
'')
ret = ''.join(list(t.generate({'spam': {'eggs': 'eggs'}})))
assert ret == 'eggs'
def test_generate_html_non_singletons():
t = template(
''
'')
html = ''.join(list(t.generate({'foo': None}, True)))
assert html == ''
def test_generate_html_singleton():
t = template(
''
'
')
html = ''.join(list(t.generate({'foo': 'bar'}, True)))
assert html == '
bar'
html = ''.join(list(t.generate({'foo': None}, True)))
assert html == '
'
def test_generate_html_singleton_non_templess_el():
t = template('
')
s = xmlgenerator(t.tree)
s.convert({})
html = ''.join(list(s.generate(True)))
assert html == '
'
t = template('
bar')
html = ''.join(list(t.generate({}, True)))
assert html == '
bar'
def test_elnode_repr():
node = elnode('bar', {}, None)
s = xmlserializer(node)
xml = s.unicode()
assert xml == ''
def test_templessnode_repr():
node = templessnode('bar', {}, None, {})
s = xmlserializer(node)
s.convert({})
xml = s.unicode()
assert xml == ''
def test_unicode_noxmlns():
t = template('')
s = xmlserializer(t)
s.convert({})
xml = s.unicode()
assert xml == ''
def test_html_output():
t = template('')
s = xmlserializer(t)
s.convert({})
xml = s.unicode()
assert xml == u''
html = t.unicode({}, html=True)
assert html == u''
html = ''.join(list(t.generate({}, html=True)))
assert html == u''
def test_str_subclass_is_str():
class mystr(str):
pass
node = templessnode('foo', {}, None, {'content': 'bar'})
s = xmlserializer(node)
s.convert({'bar': mystr('baz')})
assert s.unicode() == u'baz'
def test_force_str():
node = templessnode('foo', {}, None, {'content': 'bar:str'})
s = xmlserializer(node)
s.convert({'bar': ['baz']})
assert s.unicode() == u'%s' % (['baz'],)
def test_force_iter():
node = templessnode('foo', {}, None, {});
templessnode('bar', {}, node, {'content': 'bar:iter'})
s = xmlserializer(node)
s.convert({'bar': 'baz'})
assert s.unicode() == u'baz'
def test_force_ctx():
class myctx(object):
def __getitem__(self, name):
if name == 'spam':
return 'eggs'
raise KeyError(name)
node = templessnode('foo', {}, None, {'content': 'bar:ctx'});
templessnode('bar', {}, node, {'content': 'spam'})
s = xmlserializer(node)
nodes = s.convert({'bar': myctx()})
assert s._unicode(nodes[0]) == u'eggs'
def test_replace_with_node_iterator():
t = templess.template(
''
'')
t2 = templess.template(
'foobar')
converted = t2.convert({})
rendered = ''.join(t.generate({'els': list(converted.find('el'))}))
assert rendered == 'foobar'
def test_convert_generate_tree_not_in_place_converted():
t = templess.template(
''
'')
g = xmlgenerator(t)
s = ''.join(g.convert_generate({'bar': [1, 2], 'baz': [3, 4]}))
s2 = ''.join(g.convert_generate({'bar': [1, 2], 'baz': [3, 4]}))
assert s == '1234'
assert s == s2
def test_double_replace_textnode():
t = templess.template(
''
' '
'')
g = xmlgenerator(t)
s = ''.join(g.convert_generate({'bar': [{'baz': 1, 'qux': 2}]}))
assert s == '1 2'
def test_double_replace_elnode():
t = templess.template(
''
''
''
'')
g = xmlgenerator(t)
s = ''.join(g.convert_generate({'bar': [{'baz': 1, 'qux': 2, 'quux': 3}]}))
assert s == '123'