diff options
author | Christian Heimes <christian@python.org> | 2017-01-28 10:32:59 +0100 |
---|---|---|
committer | Christian Heimes <christian@python.org> | 2017-01-28 14:51:01 +0100 |
commit | cf41a00e935342ae5266aaea117578c92d48f216 (patch) | |
tree | be7edabd30d41cfd66d58e852032331c9ee37c2b | |
parent | ccea2c389541afebf60219845879fb4a87f6146b (diff) | |
download | defusedxml-git-cf41a00e935342ae5266aaea117578c92d48f216.tar.gz |
Drop Python 2.6, 3.1 to 3.3 support
-rw-r--r-- | defusedxml/ElementTree.py | 30 | ||||
-rw-r--r-- | defusedxml/cElementTree.py | 4 | ||||
-rw-r--r-- | defusedxml/common.py | 63 | ||||
-rw-r--r-- | defusedxml/xmlrpc.py | 19 | ||||
-rw-r--r-- | setup.py | 7 | ||||
-rw-r--r-- | tests.py | 78 |
6 files changed, 48 insertions, 153 deletions
diff --git a/defusedxml/ElementTree.py b/defusedxml/ElementTree.py index 8c46064..b35962d 100644 --- a/defusedxml/ElementTree.py +++ b/defusedxml/ElementTree.py @@ -8,17 +8,13 @@ from __future__ import print_function, absolute_import import sys -from .common import PY3, PY26, PY31 +from .common import PY3 if PY3: import importlib else: from xml.etree.ElementTree import XMLParser as _XMLParser from xml.etree.ElementTree import iterparse as _iterparse - if PY26: - from xml.parsers.expat import ExpatError as ParseError - else: - from xml.etree.ElementTree import ParseError - _IterParseIterator = None + from xml.etree.ElementTree import ParseError from xml.etree.ElementTree import TreeBuilder as _TreeBuilder from xml.etree.ElementTree import parse as _parse from xml.etree.ElementTree import tostring @@ -49,32 +45,24 @@ def _get_py3_cls(): _XMLParser = pure_pymod.XMLParser _iterparse = pure_pymod.iterparse - if PY31 or sys.version_info >= (3, 6): - _IterParseIterator = None - from xml.parsers.expat import ExpatError as ParseError - else: - _IterParseIterator = pure_pymod._IterParseIterator - ParseError = pure_pymod.ParseError + ParseError = pure_pymod.ParseError - return _XMLParser, _iterparse, _IterParseIterator, ParseError + return _XMLParser, _iterparse, ParseError if PY3: - _XMLParser, _iterparse, _IterParseIterator, ParseError = _get_py3_cls() + _XMLParser, _iterparse, ParseError = _get_py3_cls() class DefusedXMLParser(_XMLParser): def __init__(self, html=0, target=None, encoding=None, forbid_dtd=False, forbid_entities=True, forbid_external=True): - if PY26 or PY31: - _XMLParser.__init__(self, html, target) - else: - # Python 2.x old style class - _XMLParser.__init__(self, html, target, encoding) + # Python 2.x old style class + _XMLParser.__init__(self, html, target, encoding) self.forbid_dtd = forbid_dtd self.forbid_entities = forbid_entities self.forbid_external = forbid_external - if PY3 and not PY31: + if PY3: parser = self.parser else: parser = self._parser @@ -108,5 +96,5 @@ class DefusedXMLParser(_XMLParser): XMLTreeBuilder = XMLParse = DefusedXMLParser parse, iterparse, fromstring = _generate_etree_functions(DefusedXMLParser, - _TreeBuilder, _IterParseIterator, _parse, _iterparse) + _TreeBuilder, _parse, _iterparse) XML = fromstring diff --git a/defusedxml/cElementTree.py b/defusedxml/cElementTree.py index 0e37c8f..0c8779c 100644 --- a/defusedxml/cElementTree.py +++ b/defusedxml/cElementTree.py @@ -13,7 +13,7 @@ from xml.etree.cElementTree import tostring # iterparse from ElementTree! from xml.etree.ElementTree import iterparse as _iterparse -from .ElementTree import DefusedXMLParser, _IterParseIterator +from .ElementTree import DefusedXMLParser from .common import _generate_etree_functions __origin__ = "xml.etree.cElementTree" @@ -21,5 +21,5 @@ __origin__ = "xml.etree.cElementTree" XMLTreeBuilder = XMLParse = DefusedXMLParser parse, iterparse, fromstring = _generate_etree_functions(DefusedXMLParser, - _TreeBuilder, _IterParseIterator, _parse, _iterparse) + _TreeBuilder, _parse, _iterparse) XML = fromstring diff --git a/defusedxml/common.py b/defusedxml/common.py index 5e5f8a2..85a2d9c 100644 --- a/defusedxml/common.py +++ b/defusedxml/common.py @@ -9,8 +9,6 @@ import sys from types import MethodType PY3 = sys.version_info[0] == 3 -PY26 = sys.version_info[:2] == (2, 6) -PY31 = sys.version_info[:2] == (3, 1) class DefusedXmlException(ValueError): @@ -85,7 +83,7 @@ def _apply_defusing(defused_mod): def _generate_etree_functions(DefusedXMLParser, _TreeBuilder, - _IterParseIterator, _parse, _iterparse): + _parse, _iterparse): """Factory for functions needed by etree, dependent on whether cElementTree or ElementTree is used.""" @@ -98,57 +96,14 @@ def _generate_etree_functions(DefusedXMLParser, _TreeBuilder, forbid_external=forbid_external) return _parse(source, parser) - if PY26 or PY31: - def bind(xmlparser, funcname, hookname): - func = getattr(DefusedXMLParser, funcname) - if PY26: - # unbound -> function - func = func.__func__ - method = MethodType(func, xmlparser, xmlparser.__class__) - else: - method = MethodType(func, xmlparser) - # set hook - setattr(xmlparser._parser, hookname, method) - - def iterparse(source, events=None, forbid_dtd=False, - forbid_entities=True, forbid_external=True): - it = _iterparse(source, events) - xmlparser = it._parser - if forbid_dtd: - bind(xmlparser, "defused_start_doctype_decl", - "StartDoctypeDeclHandler") - if forbid_entities: - bind(xmlparser, "defused_entity_decl", - "EntityDeclHandler") - bind(xmlparser, "defused_unparsed_entity_decl", - "UnparsedEntityDeclHandler") - if forbid_external: - bind(xmlparser, "defused_external_entity_ref_handler", - "ExternalEntityRefHandler") - return it - elif PY3: - def iterparse(source, events=None, parser=None, forbid_dtd=False, - forbid_entities=True, forbid_external=True): - close_source = False - if not hasattr(source, "read"): - source = open(source, "rb") - close_source = True - if not parser: - parser = DefusedXMLParser(target=_TreeBuilder(), - forbid_dtd=forbid_dtd, - forbid_entities=forbid_entities, - forbid_external=forbid_external) - return _IterParseIterator(source, events, parser, close_source) - else: - # Python 2.7 - def iterparse(source, events=None, parser=None, forbid_dtd=False, - forbid_entities=True, forbid_external=True): - if parser is None: - parser = DefusedXMLParser(target=_TreeBuilder(), - forbid_dtd=forbid_dtd, - forbid_entities=forbid_entities, - forbid_external=forbid_external) - return _iterparse(source, events, parser) + def iterparse(source, events=None, parser=None, forbid_dtd=False, + forbid_entities=True, forbid_external=True): + if parser is None: + parser = DefusedXMLParser(target=_TreeBuilder(), + forbid_dtd=forbid_dtd, + forbid_entities=forbid_entities, + forbid_external=forbid_external) + return _iterparse(source, events, parser) def fromstring(text, forbid_dtd=False, forbid_entities=True, forbid_external=True): diff --git a/defusedxml/xmlrpc.py b/defusedxml/xmlrpc.py index 0829916..7160d3c 100644 --- a/defusedxml/xmlrpc.py +++ b/defusedxml/xmlrpc.py @@ -11,25 +11,23 @@ from __future__ import print_function, absolute_import import io -from .common import (DTDForbidden, EntitiesForbidden, - ExternalReferenceForbidden, PY3, PY31, PY26) +from .common import ( + DTDForbidden, EntitiesForbidden, ExternalReferenceForbidden, PY3) if PY3: __origin__ = "xmlrpc.client" from xmlrpc.client import ExpatParser from xmlrpc import client as xmlrpc_client from xmlrpc import server as xmlrpc_server - if not PY31: - from xmlrpc.client import gzip_decode as _orig_gzip_decode - from xmlrpc.client import GzipDecodedResponse as _OrigGzipDecodedResponse + from xmlrpc.client import gzip_decode as _orig_gzip_decode + from xmlrpc.client import GzipDecodedResponse as _OrigGzipDecodedResponse else: __origin__ = "xmlrpclib" from xmlrpclib import ExpatParser import xmlrpclib as xmlrpc_client xmlrpc_server = None - if not PY26: - from xmlrpclib import gzip_decode as _orig_gzip_decode - from xmlrpclib import GzipDecodedResponse as _OrigGzipDecodedResponse + from xmlrpclib import gzip_decode as _orig_gzip_decode + from xmlrpclib import GzipDecodedResponse as _OrigGzipDecodedResponse try: import gzip @@ -142,9 +140,6 @@ class DefusedExpatParser(ExpatParser): def monkey_patch(): xmlrpc_client.FastParser = DefusedExpatParser - if PY26 or PY31: - # Python 2.6 and 3.1 have no gzip support in xmlrpc - return xmlrpc_client.GzipDecodedResponse = DefusedGzipDecodedResponse xmlrpc_client.gzip_decode = defused_gzip_decode if xmlrpc_server: @@ -152,8 +147,6 @@ def monkey_patch(): def unmonkey_patch(): xmlrpc_client.FastParser = None - if PY26 or PY31: - return xmlrpc_client.GzipDecodedResponse = _OrigGzipDecodedResponse xmlrpc_client.gzip_decode = _orig_gzip_decode if xmlrpc_server: @@ -48,12 +48,11 @@ setup( "Natural Language :: English", "Programming Language :: Python", "Programming Language :: Python :: 2", - "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.1", - "Programming Language :: Python :: 3.2", - "Programming Language :: Python :: 3.3", + "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", "Topic :: Text Processing :: Markup :: XML", ], ) @@ -13,7 +13,7 @@ from defusedxml import cElementTree, ElementTree, minidom, pulldom, sax, xmlrpc from defusedxml import defuse_stdlib from defusedxml import (DefusedXmlException, DTDForbidden, EntitiesForbidden, ExternalReferenceForbidden, NotSupportedError) -from defusedxml.common import PY3, PY26, PY31 +from defusedxml.common import PY3 try: @@ -39,39 +39,6 @@ os.environ["http_proxy"] = "http://127.0.9.1:9" os.environ["https_proxy"] = os.environ["http_proxy"] os.environ["ftp_proxy"] = os.environ["http_proxy"] -if PY26 or PY31: - class _AssertRaisesContext(object): - def __init__(self, expected, test_case, expected_regexp=None): - self.expected = expected - self.failureException = test_case.failureException - self.expected_regexp = expected_regexp - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, tb): - if exc_type is None: - try: - exc_name = self.expected.__name__ - except AttributeError: - exc_name = str(self.expected) - raise self.failureException( - "{0} not raised".format(exc_name)) - if not issubclass(exc_type, self.expected): - # let unexpected exceptions pass through - return False - self.exception = exc_value # store for later retrieval - if self.expected_regexp is None: - return True - - expected_regexp = self.expected_regexp - if isinstance(expected_regexp, basestring): - expected_regexp = re.compile(expected_regexp) - if not expected_regexp.search(str(exc_value)): - raise self.failureException('"%s" does not match "%s"' % - (expected_regexp.pattern, str(exc_value))) - return True - class DefusedTestCase(unittest.TestCase): @@ -90,21 +57,6 @@ class DefusedTestCase(unittest.TestCase): xml_bomb2 = os.path.join(HERE, "xmltestdata", "xmlbomb2.xml") xml_cyclic = os.path.join(HERE, "xmltestdata", "cyclic.xml") - if PY26 or PY31: - # old Python versions don't have these useful test methods - def assertRaises(self, excClass, callableObj=None, *args, **kwargs): - context = _AssertRaisesContext(excClass, self) - if callableObj is None: - return context - with context: - callableObj(*args, **kwargs) - - def assertIn(self, member, container, msg=None): - if member not in container: - standardMsg = '%s not found in %s' % (repr(member), - repr(container)) - self.fail(self._formatMessage(msg, standardMsg)) - def get_content(self, xmlfile): mode = "rb" if self.content_binary else "r" with io.open(xmlfile, mode) as f: @@ -302,10 +254,6 @@ class TestDefusedSax(BaseTests): return result.getvalue() def test_exceptions(self): - if PY26: - # Python 2.6 unittest doesn't support with self.assertRaises() - return - with self.assertRaises(EntitiesForbidden) as ctx: self.parse(self.xml_bomb) msg = "EntitiesForbidden(name='a', system_id=None, public_id=None)" @@ -334,11 +282,17 @@ class TestDefusedLxml(BaseTests): content_binary = True def parse(self, xmlfile, **kwargs): - tree = self.module.parse(xmlfile, **kwargs) + try: + tree = self.module.parse(xmlfile, **kwargs) + except XMLSyntaxError: + self.skipTest("lxml detects entityt reference loop") return self.module.tostring(tree) def parseString(self, xmlstring, **kwargs): - tree = self.module.fromstring(xmlstring, **kwargs) + try: + tree = self.module.fromstring(xmlstring, **kwargs) + except XMLSyntaxError: + self.skipTest("lxml detects entityt reference loop") return self.module.tostring(tree) if not LXML3: @@ -355,8 +309,11 @@ class TestDefusedLxml(BaseTests): pass def test_restricted_element1(self): - tree = self.module.parse(self.xml_bomb, forbid_dtd=False, - forbid_entities=False) + try: + tree = self.module.parse(self.xml_bomb, forbid_dtd=False, + forbid_entities=False) + except XMLSyntaxError: + self.skipTest("lxml detects entityt reference loop") root = tree.getroot() self.assertEqual(root.text, None) @@ -370,8 +327,11 @@ class TestDefusedLxml(BaseTests): self.assertEqual(root.getnext(), None) def test_restricted_element2(self): - tree = self.module.parse(self.xml_bomb2, forbid_dtd=False, - forbid_entities=False) + try: + tree = self.module.parse(self.xml_bomb2, forbid_dtd=False, + forbid_entities=False) + except XMLSyntaxError: + self.skipTest("lxml detects entityt reference loop") root = tree.getroot() bomb, tag = root self.assertEqual(root.text, "text") |