#! /usr/bin/env/python
# -*- coding: iso-8859-1 -*-
## Copyright 1999-2006 by LivingLogic AG, Bayreuth/Germany.
## Copyright 1999-2006 by Walter Dörwald
##
## All Rights Reserved
##
## See xist/__init__.py for the license
import py.test
from ll.xist import xsc
from ll.xist.ns import html, xml, chars, abbr, ihtml, wml, specials, htmlspecials, form, meta, svg, fo, docbook, jsp, struts_html, struts_config, tld
def test_mixedattrnames():
class __ns__(xsc.Namespace):
xmlname = "test"
xmlurl = "test"
class Attrs(xsc.Namespace.Attrs):
class a(xsc.TextAttr): xmlname = "A"
class A(xsc.TextAttr): xmlname = "a"
class Test(xsc.Element):
class Attrs(xsc.Element.Attrs):
class a(xsc.TextAttr): xmlname = "A"
class A(xsc.TextAttr): xmlname = "a"
node = __ns__.Test(
{
(__ns__, "a"): "a2",
(__ns__, "A"): "A2",
},
a="a",
A="A"
)
def check(name, value):
assert unicode(node[name]) == value
assert unicode(node.attrs[name]) == value
if not isinstance(name, tuple):
assert unicode(getattr(node.attrs, name)) == value
assert unicode(node.attrs.get(name, xml=False)) == value
if isinstance(name, tuple):
name = (name[0], name[1].swapcase())
else:
name = name.swapcase()
assert unicode(node.attrs.get(name, xml=True)) == value
tests = [
("a", "a"),
("A", "A"),
((__ns__, "a"), "a2"),
((__ns__, "A"), "A2")
]
for (name, value) in tests:
yield check, name, value
def test_variousnamespaces():
def check(ns, *skip):
for obj in ns.iterelementvalues():
if not issubclass(obj, skip):
node = obj()
for (attrname, attrvalue) in node.attrs.alloweditems():
if attrvalue.required:
if attrvalue.values:
node[attrname] = attrvalue.values[0]
else:
node[attrname] = "foo"
node.conv().asBytes()
for obj in ns.iterentityvalues():
node = obj()
node.conv().asBytes()
for obj in ns.iterprocinstvalues():
node = obj()
node.conv().asBytes()
yield check, html
yield check, ihtml
yield check, wml
yield check, specials, specials.include, specials.filetime, specials.filesize
yield check, form
yield check, meta
yield check, htmlspecials, htmlspecials.autoimg, htmlspecials.autopixel
yield check, svg
yield check, fo
yield check, docbook
yield check, jsp
yield check, struts_html
yield check, struts_config
yield check, tld
def test_nsupdate():
def createns():
class __ns__(xsc.Namespace):
xmlname = "gurk"
xmlurl = "http://www.gurk.com/"
class foo(xsc.Element): pass
class bar(xsc.Element): pass
return __ns__
class ns1:
class foo(xsc.Element): pass
class bar(xsc.Element): pass
class foo2(xsc.Element): pass
class bar2(xsc.Element): pass
class ns2:
class foo(xsc.Element): pass
class bar(xsc.Element): pass
class foo2(xsc.Element): pass
class bar2(xsc.Element): pass
a = [ {"foo": ns.foo, "bar": ns.bar, "foo2": ns.foo2, "bar2": ns.bar2} for ns in (ns1, ns2) ]
ns = createns()
ns.update(*a)
assert ns.element("foo") is ns2.foo
assert ns.element("bar") is ns2.bar
assert ns.element("foo2") is ns2.foo2
assert ns.element("bar2") is ns2.bar2
ns = createns()
ns.updatenew(*a)
assert ns.element("foo") is ns.foo
assert ns.element("bar") is ns.bar
assert ns.element("foo2") is ns2.foo2
assert ns.element("bar2") is ns2.bar2
ns = createns()
ns.updateexisting(*a)
assert ns.element("foo") == ns2.foo
assert ns.element("bar") == ns2.bar
py.test.raises(xsc.IllegalElementError, ns.element, "foo2")
py.test.raises(xsc.IllegalElementError, ns.element, "bar2")
def test_attributeexamples():
assert xsc.amp.__name__ == "amp"
assert xsc.amp.xmlname == u"amp"
assert xsc.amp.__ns__ is None
assert xsc.amp.xmlprefix() is None
assert chars.uuml.__name__ == "uuml"
assert chars.uuml.xmlname == u"uuml"
assert chars.uuml.__ns__ is chars
assert chars.uuml.xmlprefix() == "chars"
assert html.a.Attrs.class_.__name__ == "class_"
assert html.a.Attrs.class_.xmlname == u"class"
assert html.a.Attrs.class_.__ns__ is None
assert xml.Attrs.lang.__name__ == "lang"
assert xml.Attrs.lang.xmlname == u"lang"
assert xml.Attrs.lang.__ns__ is xml
assert xml.Attrs.lang.xmlprefix() == "xml"
def test_autoinherit():
class NS1(xsc.Namespace):
xmlname = "test"
xmlurl = "test"
class foo(xsc.Element):
model = False
def convert(self, converter):
e = self.__ns__.bar()
return e.convert(converter)
class bar(xsc.Entity):
def convert(self, converter):
return xsc.Text(17)
class NS2(NS1):
xmlname = "test"
class bar(xsc.Entity):
def convert(self, converter):
return xsc.Text(23)
assert unicode(NS1.foo().conv()) == u"17"
assert unicode(NS2.foo().conv()) == u"23"
def check_nskeysvaluesitems(ns, method, resname, resclass):
assert getattr(ns, method + "keys")(xml=False) == [resname]
assert getattr(ns, method + "keys")(xml=True) == [resname[:-1]]
assert getattr(ns, method + "values")() == [resclass]
assert getattr(ns, method + "items")(xml=False) == [(resname, resclass)]
assert getattr(ns, method + "items")(xml=True) == [(resname[:-1], resclass)]
def test_nskeysvaluesitems():
class NS(xsc.Namespace):
xmlname = "test"
class el_(xsc.Element):
xmlname = "el"
class en_(xsc.Entity):
xmlname = "en"
class pi_(xsc.ProcInst):
xmlname = "pi"
class cr_(xsc.CharRef):
xmlname = "cr"
codepoint = 0x4242
check_nskeysvaluesitems(NS, "element", "el_", NS.el_)
keys = NS.entitykeys(xml=False)
assert len(keys) == 2
assert "en_" in keys
assert "cr_" in keys
keys = NS.entitykeys(xml=True)
assert len(keys) == 2
assert "en" in keys
assert "cr" in keys
values = NS.entityvalues()
assert len(values) == 2
assert NS.en_ in values
assert NS.cr_ in values
items = NS.entityitems(xml=False)
assert len(items) == 2
assert ("en_", NS.en_) in items
assert ("cr_", NS.cr_) in items
items = NS.entityitems(xml=True)
assert len(items) == 2
assert ("en", NS.en_) in items
assert ("cr", NS.cr_) in items
check_nskeysvaluesitems(NS, "procinst", "pi_", NS.pi_)
check_nskeysvaluesitems(NS, "charref", "cr_", NS.cr_)
def test_prefixsubclasses():
class NS1(xsc.Namespace):
xmlname = "ns"
xmlurl = "http://xmlns.ns.info/"
class gurk(xsc.Element):
model = False
class NS2(NS1):
xmlname = "ns"
p = xsc.Prefixes(ns=NS1)
assert \
NS1.gurk().asBytes(xhtml=2, prefixmode=2, prefixes=p) == \
''
# The sub namespace should pick up the prefix defined for the first one
assert \
NS2.gurk().asBytes(xhtml=2, prefixmode=2, prefixes=p) == \
''