summaryrefslogtreecommitdiffstats
path: root/Lib/xmlcore/dom/minicompat.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/xmlcore/dom/minicompat.py')
-rw-r--r--Lib/xmlcore/dom/minicompat.py184
1 files changed, 184 insertions, 0 deletions
diff --git a/Lib/xmlcore/dom/minicompat.py b/Lib/xmlcore/dom/minicompat.py
new file mode 100644
index 0000000..364ca45
--- /dev/null
+++ b/Lib/xmlcore/dom/minicompat.py
@@ -0,0 +1,184 @@
+"""Python version compatibility support for minidom."""
+
+# This module should only be imported using "import *".
+#
+# The following names are defined:
+#
+# isinstance -- version of the isinstance() function that accepts
+# tuples as the second parameter regardless of the
+# Python version
+#
+# NodeList -- lightest possible NodeList implementation
+#
+# EmptyNodeList -- lightest possible NodeList that is guarateed to
+# remain empty (immutable)
+#
+# StringTypes -- tuple of defined string types
+#
+# GetattrMagic -- base class used to make _get_<attr> be magically
+# invoked when available
+# defproperty -- function used in conjunction with GetattrMagic;
+# using these together is needed to make them work
+# as efficiently as possible in both Python 2.2+
+# and older versions. For example:
+#
+# class MyClass(GetattrMagic):
+# def _get_myattr(self):
+# return something
+#
+# defproperty(MyClass, "myattr",
+# "return some value")
+#
+# For Python 2.2 and newer, this will construct a
+# property object on the class, which avoids
+# needing to override __getattr__(). It will only
+# work for read-only attributes.
+#
+# For older versions of Python, inheriting from
+# GetattrMagic will use the traditional
+# __getattr__() hackery to achieve the same effect,
+# but less efficiently.
+#
+# defproperty() should be used for each version of
+# the relevant _get_<property>() function.
+#
+# NewStyle -- base class to cause __slots__ to be honored in
+# the new world
+#
+# True, False -- only for Python 2.2 and earlier
+
+__all__ = ["NodeList", "EmptyNodeList", "NewStyle",
+ "StringTypes", "defproperty", "GetattrMagic"]
+
+import xmlcore.dom
+
+try:
+ unicode
+except NameError:
+ StringTypes = type(''),
+else:
+ StringTypes = type(''), type(unicode(''))
+
+
+# define True and False only if not defined as built-ins
+try:
+ True
+except NameError:
+ True = 1
+ False = 0
+ __all__.extend(["True", "False"])
+
+
+try:
+ isinstance('', StringTypes)
+except TypeError:
+ #
+ # Wrap isinstance() to make it compatible with the version in
+ # Python 2.2 and newer.
+ #
+ _isinstance = isinstance
+ def isinstance(obj, type_or_seq):
+ try:
+ return _isinstance(obj, type_or_seq)
+ except TypeError:
+ for t in type_or_seq:
+ if _isinstance(obj, t):
+ return 1
+ return 0
+ __all__.append("isinstance")
+
+
+if list is type([]):
+ class NodeList(list):
+ __slots__ = ()
+
+ def item(self, index):
+ if 0 <= index < len(self):
+ return self[index]
+
+ def _get_length(self):
+ return len(self)
+
+ def _set_length(self, value):
+ raise xmlcore.dom.NoModificationAllowedErr(
+ "attempt to modify read-only attribute 'length'")
+
+ length = property(_get_length, _set_length,
+ doc="The number of nodes in the NodeList.")
+
+ def __getstate__(self):
+ return list(self)
+
+ def __setstate__(self, state):
+ self[:] = state
+
+ class EmptyNodeList(tuple):
+ __slots__ = ()
+
+ def __add__(self, other):
+ NL = NodeList()
+ NL.extend(other)
+ return NL
+
+ def __radd__(self, other):
+ NL = NodeList()
+ NL.extend(other)
+ return NL
+
+ def item(self, index):
+ return None
+
+ def _get_length(self):
+ return 0
+
+ def _set_length(self, value):
+ raise xmlcore.dom.NoModificationAllowedErr(
+ "attempt to modify read-only attribute 'length'")
+
+ length = property(_get_length, _set_length,
+ doc="The number of nodes in the NodeList.")
+
+else:
+ def NodeList():
+ return []
+
+ def EmptyNodeList():
+ return []
+
+
+try:
+ property
+except NameError:
+ def defproperty(klass, name, doc):
+ # taken care of by the base __getattr__()
+ pass
+
+ class GetattrMagic:
+ def __getattr__(self, key):
+ if key.startswith("_"):
+ raise AttributeError, key
+
+ try:
+ get = getattr(self, "_get_" + key)
+ except AttributeError:
+ raise AttributeError, key
+ return get()
+
+ class NewStyle:
+ pass
+
+else:
+ def defproperty(klass, name, doc):
+ get = getattr(klass, ("_get_" + name)).im_func
+ def set(self, value, name=name):
+ raise xmlcore.dom.NoModificationAllowedErr(
+ "attempt to modify read-only attribute " + repr(name))
+ assert not hasattr(klass, "_set_" + name), \
+ "expected not to find _set_" + name
+ prop = property(get, set, doc=doc)
+ setattr(klass, name, prop)
+
+ class GetattrMagic:
+ pass
+
+ NewStyle = object