summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Heimes <christian@python.org>2017-01-28 10:32:59 +0100
committerChristian Heimes <christian@python.org>2017-01-28 14:51:01 +0100
commitcf41a00e935342ae5266aaea117578c92d48f216 (patch)
treebe7edabd30d41cfd66d58e852032331c9ee37c2b
parentccea2c389541afebf60219845879fb4a87f6146b (diff)
downloaddefusedxml-git-cf41a00e935342ae5266aaea117578c92d48f216.tar.gz
Drop Python 2.6, 3.1 to 3.3 support
-rw-r--r--defusedxml/ElementTree.py30
-rw-r--r--defusedxml/cElementTree.py4
-rw-r--r--defusedxml/common.py63
-rw-r--r--defusedxml/xmlrpc.py19
-rw-r--r--setup.py7
-rw-r--r--tests.py78
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:
diff --git a/setup.py b/setup.py
index c5fecc0..5e652aa 100644
--- a/setup.py
+++ b/setup.py
@@ -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",
],
)
diff --git a/tests.py b/tests.py
index 7c63ea2..b297200 100644
--- a/tests.py
+++ b/tests.py
@@ -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")