From 9ea179fa7da13aa68c42a86cb9b315b0d9ea7aaf Mon Sep 17 00:00:00 2001 From: Fred Drake Date: Thu, 6 Apr 2006 01:29:04 +0000 Subject: [PATCH] remove much of the Python-version compatibility cruft; the minimum Python version this should support is Python 2.3 --- Lib/xmlcore/dom/expatbuilder.py | 14 +-- Lib/xmlcore/dom/minicompat.py | 191 ++++++++++---------------------- Lib/xmlcore/dom/minidom.py | 10 +- Lib/xmlcore/dom/xmlbuilder.py | 6 +- 4 files changed, 72 insertions(+), 149 deletions(-) diff --git a/Lib/xmlcore/dom/expatbuilder.py b/Lib/xmlcore/dom/expatbuilder.py index 81d9c2b0602..32ffa411f69 100644 --- a/Lib/xmlcore/dom/expatbuilder.py +++ b/Lib/xmlcore/dom/expatbuilder.py @@ -59,7 +59,7 @@ _typeinfo_map = { "NMTOKENS": minidom.TypeInfo(None, "nmtokens"), } -class ElementInfo(NewStyle): +class ElementInfo(object): __slots__ = '_attr_info', '_model', 'tagName' def __init__(self, tagName, model=None): @@ -460,7 +460,7 @@ class ExpatBuilder: # where allowed. _ALLOWED_FILTER_RETURNS = (FILTER_ACCEPT, FILTER_REJECT, FILTER_SKIP) -class FilterVisibilityController(NewStyle): +class FilterVisibilityController(object): """Wrapper around a DOMBuilderFilter which implements the checks to make the whatToShow filter attribute work.""" @@ -518,7 +518,7 @@ class FilterVisibilityController(NewStyle): } -class FilterCrutch(NewStyle): +class FilterCrutch(object): __slots__ = '_builder', '_level', '_old_start', '_old_end' def __init__(self, builder): @@ -908,7 +908,7 @@ class InternalSubsetExtractor(ExpatBuilder): raise ParseEscape() -def parse(file, namespaces=1): +def parse(file, namespaces=True): """Parse a document, returning the resulting Document node. 'file' may be either a file name or an open file object. @@ -929,7 +929,7 @@ def parse(file, namespaces=1): return result -def parseString(string, namespaces=1): +def parseString(string, namespaces=True): """Parse a document from a string, returning the resulting Document node. """ @@ -940,7 +940,7 @@ def parseString(string, namespaces=1): return builder.parseString(string) -def parseFragment(file, context, namespaces=1): +def parseFragment(file, context, namespaces=True): """Parse a fragment of a document, given the context from which it was originally extracted. context should be the parent of the node(s) which are in the fragment. @@ -963,7 +963,7 @@ def parseFragment(file, context, namespaces=1): return result -def parseFragmentString(string, context, namespaces=1): +def parseFragmentString(string, context, namespaces=True): """Parse a fragment of a document from a string, given the context from which it was originally extracted. context should be the parent of the node(s) which are in the fragment. diff --git a/Lib/xmlcore/dom/minicompat.py b/Lib/xmlcore/dom/minicompat.py index 364ca45241d..f99b7feb72e 100644 --- a/Lib/xmlcore/dom/minicompat.py +++ b/Lib/xmlcore/dom/minicompat.py @@ -4,10 +4,6 @@ # # 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 @@ -15,8 +11,6 @@ # # StringTypes -- tuple of defined string types # -# GetattrMagic -- base class used to make _get_ 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+ @@ -41,14 +35,8 @@ # # defproperty() should be used for each version of # the relevant _get_() 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"] +__all__ = ["NodeList", "EmptyNodeList", "StringTypes", "defproperty"] import xmlcore.dom @@ -60,125 +48,62 @@ 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"]) +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 xml.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 xml.dom.NoModificationAllowedErr( + "attempt to modify read-only attribute 'length'") + + length = property(_get_length, _set_length, + doc="The number of nodes in the NodeList.") -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 +def defproperty(klass, name, doc): + get = getattr(klass, ("_get_" + name)).im_func + def set(self, value, name=name): + raise xml.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) diff --git a/Lib/xmlcore/dom/minidom.py b/Lib/xmlcore/dom/minidom.py index 54620e14cad..d4f34b7af24 100644 --- a/Lib/xmlcore/dom/minidom.py +++ b/Lib/xmlcore/dom/minidom.py @@ -31,7 +31,7 @@ _nodeTypes_with_children = (xmlcore.dom.Node.ELEMENT_NODE, xmlcore.dom.Node.ENTITY_REFERENCE_NODE) -class Node(xmlcore.dom.Node, GetattrMagic): +class Node(xmlcore.dom.Node): namespaceURI = None # this is non-null only for elements and attributes parentNode = None ownerDocument = None @@ -459,7 +459,7 @@ defproperty(Attr, "localName", doc="Namespace-local name of this attribute.") defproperty(Attr, "schemaType", doc="Schema type for this attribute.") -class NamedNodeMap(NewStyle, GetattrMagic): +class NamedNodeMap(object): """The attribute list is a transient interface to the underlying dictionaries. Mutations here will change the underlying element's dictionary. @@ -613,7 +613,7 @@ defproperty(NamedNodeMap, "length", AttributeList = NamedNodeMap -class TypeInfo(NewStyle): +class TypeInfo(object): __slots__ = 'namespace', 'name' def __init__(self, namespace, name): @@ -1146,7 +1146,7 @@ class CDATASection(Text): writer.write("" % self.data) -class ReadOnlySequentialNamedNodeMap(NewStyle, GetattrMagic): +class ReadOnlySequentialNamedNodeMap(object): __slots__ = '_seq', def __init__(self, seq=()): @@ -1418,7 +1418,7 @@ class DOMImplementation(DOMImplementationLS): def _create_document(self): return Document() -class ElementInfo(NewStyle): +class ElementInfo(object): """Object that represents content-model information for an element. This implementation is not expected to be used in practice; DOM diff --git a/Lib/xmlcore/dom/xmlbuilder.py b/Lib/xmlcore/dom/xmlbuilder.py index d58c72311f7..6566d3c4a9e 100644 --- a/Lib/xmlcore/dom/xmlbuilder.py +++ b/Lib/xmlcore/dom/xmlbuilder.py @@ -3,8 +3,6 @@ import copy import xmlcore.dom -from xmlcore.dom.minicompat import * - from xmlcore.dom.NodeFilter import NodeFilter @@ -211,7 +209,7 @@ def _name_xform(name): return name.lower().replace('-', '_') -class DOMEntityResolver(NewStyle): +class DOMEntityResolver(object): __slots__ = '_opener', def resolveEntity(self, publicId, systemId): @@ -255,7 +253,7 @@ class DOMEntityResolver(NewStyle): return param.split("=", 1)[1].lower() -class DOMInputSource(NewStyle): +class DOMInputSource(object): __slots__ = ('byteStream', 'characterStream', 'stringData', 'encoding', 'publicId', 'systemId', 'baseURI')