test_ok2/py/xmlobj/xml.py

59 lines
1.7 KiB
Python

"""
generic (and pythonic :-) xml tag and namespace objects
"""
class Tag(list):
class Attr(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
def __init__(self, *args, **kwargs):
super(Tag, self).__init__(args)
self.attr = self.Attr(**kwargs)
def __unicode__(self):
return self.unicode(indent=0)
def unicode(self, indent=2):
from py.__.xmlobj.visit import SimpleUnicodeVisitor
l = []
SimpleUnicodeVisitor(l.append, indent).visit(self)
return u"".join(l)
def __repr__(self):
name = self.__class__.__name__
return "<%r tag object %d>" % (name, id(self))
class raw(object):
"""just a box that can contain a unicode string that will be
included directly in the output"""
def __init__(self, uniobj):
self.uniobj = uniobj
# the generic xml namespace
# provides Tag classes on the fly optionally checking for
# a tagspecification
class NamespaceMetaclass(type):
def __getattr__(self, name):
if name[:1] == '_':
raise AttributeError(name)
if self == Namespace:
raise ValueError("Namespace class is abstract")
tagspec = self.__tagspec__
if tagspec is not None and name not in tagspec:
raise AttributeError(name)
classattr = {}
if self.__stickyname__:
classattr['xmlname'] = name
cls = type(name, (self.__tagclass__,), classattr)
setattr(self, name, cls)
return cls
class Namespace(object):
__tagspec__ = None
__tagclass__ = Tag
__metaclass__ = NamespaceMetaclass
__stickyname__ = False