diff options
author | Christian Heimes <christian@python.org> | 2021-01-12 19:52:24 +0100 |
---|---|---|
committer | Christian Heimes <christian@python.org> | 2021-03-04 11:26:20 +0100 |
commit | 2be0182d145d086306435f30ab997711bb5b3fb1 (patch) | |
tree | 5b4bcfa8bf07ebb3d6b198915c873f7bbe02f81b | |
parent | 06d7ab2c5c19472a8cc7d5184a264873cb8fa972 (diff) | |
download | defusedxml-git-2be0182d145d086306435f30ab997711bb5b3fb1.tar.gz |
Drop Python 2 support
-rw-r--r-- | .github/workflows/main.yml | 2 | ||||
-rw-r--r-- | CHANGES.txt | 1 | ||||
-rw-r--r-- | defusedxml/ElementTree.py | 22 | ||||
-rw-r--r-- | defusedxml/common.py | 10 | ||||
-rw-r--r-- | defusedxml/expatreader.py | 4 | ||||
-rw-r--r-- | defusedxml/xmlrpc.py | 33 | ||||
-rw-r--r-- | pyproject.toml | 3 | ||||
-rw-r--r-- | setup.py | 6 | ||||
-rw-r--r-- | tests.py | 18 | ||||
-rw-r--r-- | tox.ini | 11 |
10 files changed, 32 insertions, 78 deletions
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f66d308..94af983 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["2.7", "3.5", "3.6", "3.7", "3.8", "3.9"] + python-version: ["3.6", "3.7", "3.8", "3.9"] steps: - uses: "actions/checkout@v2" - uses: "actions/setup-python@v2" diff --git a/CHANGES.txt b/CHANGES.txt index a86065b..c6e5151 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -22,6 +22,7 @@ defusedxml 0.7.0rc2 - Use GitHub Actions instead of TravisCI - Restore ``ElementTree`` attribute of ``xml.etree`` module after patching + defusedxml 0.7.0rc1 ------------------- diff --git a/defusedxml/ElementTree.py b/defusedxml/ElementTree.py index 55c123e..441f0a4 100644 --- a/defusedxml/ElementTree.py +++ b/defusedxml/ElementTree.py @@ -1,6 +1,6 @@ # defusedxml # -# Copyright (c) 2013 by Christian Heimes <christian@python.org> +# Copyright (c) 2013-2020 by Christian Heimes <christian@python.org> # Licensed to PSF under a Contributor Agreement. # See https://www.python.org/psf/license for licensing details. """Defused xml.etree.ElementTree facade @@ -13,14 +13,7 @@ from xml.etree.ElementTree import TreeBuilder as _TreeBuilder from xml.etree.ElementTree import parse as _parse from xml.etree.ElementTree import tostring -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 - from xml.etree.ElementTree import ParseError +import importlib from .common import ( @@ -68,8 +61,7 @@ def _get_py3_cls(): return _XMLParser, _iterparse, ParseError -if PY3: - _XMLParser, _iterparse, ParseError = _get_py3_cls() +_XMLParser, _iterparse, ParseError = _get_py3_cls() _sentinel = object() @@ -84,8 +76,7 @@ class DefusedXMLParser(_XMLParser): forbid_entities=True, forbid_external=True, ): - # Python 2.x old style class - _XMLParser.__init__(self, target=target, encoding=encoding) + super().__init__(target=target, encoding=encoding) if html is not _sentinel: # the 'html' argument has been deprecated and ignored in all # supported versions of Python. Python 3.8 finally removed it. @@ -101,10 +92,7 @@ class DefusedXMLParser(_XMLParser): self.forbid_dtd = forbid_dtd self.forbid_entities = forbid_entities self.forbid_external = forbid_external - if PY3: - parser = self.parser - else: - parser = self._parser + parser = self.parser if self.forbid_dtd: parser.StartDoctypeDeclHandler = self.defused_start_doctype_decl if self.forbid_entities: diff --git a/defusedxml/common.py b/defusedxml/common.py index 5ceda1f..d286009 100644 --- a/defusedxml/common.py +++ b/defusedxml/common.py @@ -1,6 +1,6 @@ # defusedxml # -# Copyright (c) 2013 by Christian Heimes <christian@python.org> +# Copyright (c) 2013-2020 by Christian Heimes <christian@python.org> # Licensed to PSF under a Contributor Agreement. # See https://www.python.org/psf/license for licensing details. """Common constants, exceptions and helpe functions @@ -8,7 +8,7 @@ import sys import xml.parsers.expat -PY3 = sys.version_info[0] == 3 +PY3 = True # Fail early when pyexpat is not installed correctly if not hasattr(xml.parsers.expat, "ParserCreate"): @@ -26,7 +26,7 @@ class DTDForbidden(DefusedXmlException): """Document type definition is forbidden""" def __init__(self, name, sysid, pubid): - super(DTDForbidden, self).__init__() + super().__init__() self.name = name self.sysid = sysid self.pubid = pubid @@ -40,7 +40,7 @@ class EntitiesForbidden(DefusedXmlException): """Entity definition is forbidden""" def __init__(self, name, value, base, sysid, pubid, notation_name): - super(EntitiesForbidden, self).__init__() + super().__init__() self.name = name self.value = value self.base = base @@ -57,7 +57,7 @@ class ExternalReferenceForbidden(DefusedXmlException): """Resolving an external reference is forbidden""" def __init__(self, context, base, sysid, pubid): - super(ExternalReferenceForbidden, self).__init__() + super().__init__() self.context = context self.base = base self.sysid = sysid diff --git a/defusedxml/expatreader.py b/defusedxml/expatreader.py index 890e1d1..9d36dc3 100644 --- a/defusedxml/expatreader.py +++ b/defusedxml/expatreader.py @@ -25,7 +25,7 @@ class DefusedExpatParser(_ExpatParser): forbid_entities=True, forbid_external=True, ): - _ExpatParser.__init__(self, namespaceHandling, bufsize) + super().__init__(namespaceHandling, bufsize) self.forbid_dtd = forbid_dtd self.forbid_entities = forbid_entities self.forbid_external = forbid_external @@ -46,7 +46,7 @@ class DefusedExpatParser(_ExpatParser): raise ExternalReferenceForbidden(context, base, sysid, pubid) def reset(self): - _ExpatParser.reset(self) + super().reset() parser = self._parser if self.forbid_dtd: parser.StartDoctypeDeclHandler = self.defused_start_doctype_decl diff --git a/defusedxml/xmlrpc.py b/defusedxml/xmlrpc.py index fbc674d..39e9245 100644 --- a/defusedxml/xmlrpc.py +++ b/defusedxml/xmlrpc.py @@ -11,23 +11,14 @@ from __future__ import print_function, absolute_import import io -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 - 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 - from xmlrpclib import gzip_decode as _orig_gzip_decode - from xmlrpclib import GzipDecodedResponse as _OrigGzipDecodedResponse +from .common import DTDForbidden, EntitiesForbidden, ExternalReferenceForbidden + +__origin__ = "xmlrpc.client" +from xmlrpc.client import ExpatParser +from xmlrpc import client as xmlrpc_client +from xmlrpc import server as xmlrpc_server +from xmlrpc.client import gzip_decode as _orig_gzip_decode +from xmlrpc.client import GzipDecodedResponse as _OrigGzipDecodedResponse try: import gzip @@ -87,7 +78,7 @@ class DefusedGzipDecodedResponse(gzip.GzipFile if gzip else object): if limit >= 0 and len(data) > limit: raise ValueError("max payload length exceeded") self.stringio = io.BytesIO(data) - gzip.GzipFile.__init__(self, mode="rb", fileobj=self.stringio) + super().__init__(mode="rb", fileobj=self.stringio) def read(self, n): if self.limit >= 0: @@ -99,16 +90,16 @@ class DefusedGzipDecodedResponse(gzip.GzipFile if gzip else object): raise ValueError("max payload length exceeded") return data else: - return gzip.GzipFile.read(self, n) + return super().read(n) def close(self): - gzip.GzipFile.close(self) + super().close() self.stringio.close() class DefusedExpatParser(ExpatParser): def __init__(self, target, forbid_dtd=False, forbid_entities=True, forbid_external=True): - ExpatParser.__init__(self, target) + super().__init__(target) self.forbid_dtd = forbid_dtd self.forbid_entities = forbid_entities self.forbid_external = forbid_external diff --git a/pyproject.toml b/pyproject.toml index ef0550c..04a757d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,4 +1,3 @@ [tool.black] line-length = 98 -# black does not yet support py39 -target-version = ['py27', 'py35', 'py36', 'py37', 'py38'] +target-version = ['py36', 'py37', 'py38'] @@ -1,5 +1,4 @@ #!/usr/bin/env python -from __future__ import absolute_import import sys from distutils.core import Command import subprocess @@ -52,15 +51,12 @@ setup( "License :: OSI Approved :: Python Software Foundation License", "Natural Language :: English", "Programming Language :: Python", - "Programming Language :: Python :: 2", - "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Topic :: Text Processing :: Markup :: XML", ], - python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", + python_requires=">=3.6", ) @@ -19,8 +19,6 @@ from defusedxml import ( ExternalReferenceForbidden, NotSupportedError, ) -from defusedxml.common import PY3 - if sys.version_info < (3, 7): warnings.filterwarnings("once", category=DeprecationWarning) @@ -62,11 +60,7 @@ os.environ["ftp_proxy"] = os.environ["http_proxy"] class DefusedTestCase(unittest.TestCase): - - if PY3: - content_binary = False - else: - content_binary = True + content_binary = False xml_dtd = os.path.join(HERE, "xmltestdata", "dtd.xml") xml_external = os.path.join(HERE, "xmltestdata", "external.xml") @@ -280,19 +274,13 @@ class TestDefusedSax(BaseTests): dtd_external_ref = True def parse(self, xmlfile, **kwargs): - if PY3: - result = io.StringIO() - else: - result = io.BytesIO() + result = io.StringIO() handler = XMLGenerator(result) self.module.parse(xmlfile, handler, **kwargs) return result.getvalue() def parseString(self, xmlstring, **kwargs): - if PY3: - result = io.StringIO() - else: - result = io.BytesIO() + result = io.StringIO() handler = XMLGenerator(result) self.module.parseString(xmlstring, handler, **kwargs) return result.getvalue() @@ -1,5 +1,5 @@ [tox] -envlist = py27,py35,py36,py37,py38,py39,py310,black,pep8py2,pep8py3,doc +envlist = py36,py37,py38,py39,py310,black,pep8py3,doc skip_missing_interpreters = true [testenv] @@ -23,13 +23,6 @@ commands = black --check --verbose \ {toxinidir}/defusedxml/ deps = black -[testenv:pep8py2] -basepython = python2.7 -deps = - flake8 -commands = - {envpython} -m flake8 - [testenv:pep8py3] basepython = python3 deps = @@ -56,8 +49,6 @@ max-line-length = 98 [gh-actions] python = - 2.7: py27, pep8py2 - 3.5: py35 3.6: py36 3.7: py37 3.8: py38, pep8py3, doc |