summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Heimes <christian@python.org>2021-01-12 19:52:24 +0100
committerChristian Heimes <christian@python.org>2021-03-04 11:26:20 +0100
commit2be0182d145d086306435f30ab997711bb5b3fb1 (patch)
tree5b4bcfa8bf07ebb3d6b198915c873f7bbe02f81b
parent06d7ab2c5c19472a8cc7d5184a264873cb8fa972 (diff)
downloaddefusedxml-git-2be0182d145d086306435f30ab997711bb5b3fb1.tar.gz
Drop Python 2 support
-rw-r--r--.github/workflows/main.yml2
-rw-r--r--CHANGES.txt1
-rw-r--r--defusedxml/ElementTree.py22
-rw-r--r--defusedxml/common.py10
-rw-r--r--defusedxml/expatreader.py4
-rw-r--r--defusedxml/xmlrpc.py33
-rw-r--r--pyproject.toml3
-rw-r--r--setup.py6
-rw-r--r--tests.py18
-rw-r--r--tox.ini11
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']
diff --git a/setup.py b/setup.py
index 9be51bd..fa459f5 100644
--- a/setup.py
+++ b/setup.py
@@ -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",
)
diff --git a/tests.py b/tests.py
index 89fb985..f9dbfff 100644
--- a/tests.py
+++ b/tests.py
@@ -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()
diff --git a/tox.ini b/tox.ini
index d9d64fe..e283efb 100644
--- a/tox.ini
+++ b/tox.ini
@@ -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