diff options
author | Christian Heimes <christian@python.org> | 2021-01-12 15:50:08 +0100 |
---|---|---|
committer | Christian Heimes <christian@python.org> | 2021-01-12 17:50:53 +0100 |
commit | af1f4cf0c1bd94bc6c8debbd500b02daede92d31 (patch) | |
tree | a20f3a0ab1be063b864e3b923a1deb3b78c8b917 | |
parent | 5a928e5f90b58b96a90180bc3c81e293af387ff8 (diff) | |
download | defusedxml-git-af1f4cf0c1bd94bc6c8debbd500b02daede92d31.tar.gz |
Re-add cElementTree module and deprecate it
``xml.etree.ElementTree`` was re-added before Python 3.9.0 release. The
alias will be removed in a future release.
Signed-off-by: Christian Heimes <christian@python.org>
-rw-r--r-- | README.md | 3 | ||||
-rw-r--r-- | README.txt | 3 | ||||
-rw-r--r-- | defusedxml/__init__.py | 10 | ||||
-rw-r--r-- | defusedxml/cElementTree.py | 11 | ||||
-rw-r--r-- | defusedxml/common.py | 2 | ||||
-rw-r--r-- | defusedxml/lxml.py | 2 | ||||
-rw-r--r-- | tests.py | 20 |
7 files changed, 28 insertions, 23 deletions
@@ -275,7 +275,8 @@ defuse\_stdlib() (*experimental*) ### defusedxml.cElementTree -**NOTE** `defusedxml.cElementTree` is not available in Python 3.9+ +**NOTE** `defusedxml.cElementTree` is deprecated and will be removed in +a future release. Import from `defusedxml.ElementTree` instead. parse(), iterparse(), fromstring(), XMLParser @@ -317,7 +317,8 @@ defuse_stdlib() (*experimental*) defusedxml.cElementTree ----------------------- -**NOTE** ``defusedxml.cElementTree`` is not available in Python 3.9+ +**NOTE** ``defusedxml.cElementTree`` is deprecated and will be removed in a +future release. Import from ``defusedxml.ElementTree`` instead. parse(), iterparse(), fromstring(), XMLParser diff --git a/defusedxml/__init__.py b/defusedxml/__init__.py index 95ddeb9..c154a4d 100644 --- a/defusedxml/__init__.py +++ b/defusedxml/__init__.py @@ -7,6 +7,8 @@ """ from __future__ import print_function, absolute_import +import warnings + from .common import ( DefusedXmlException, DTDForbidden, @@ -14,7 +16,6 @@ from .common import ( ExternalReferenceForbidden, NotSupportedError, _apply_defusing, - _HAVE_CELEMENTTREE, ) @@ -25,10 +26,8 @@ def defuse_stdlib(): """ defused = {} - if _HAVE_CELEMENTTREE: + with warnings.catch_warnings(): from . import cElementTree - else: - cElementTree = None from . import ElementTree from . import minidom from . import pulldom @@ -41,6 +40,7 @@ def defuse_stdlib(): defused[xmlrpc] = None defused_mods = [ + cElementTree, ElementTree, minidom, pulldom, @@ -48,8 +48,6 @@ def defuse_stdlib(): expatbuilder, expatreader, ] - if _HAVE_CELEMENTTREE: - defused_mods.append(cElementTree) for defused_mod in defused_mods: stdlib_mod = _apply_defusing(defused_mod) diff --git a/defusedxml/cElementTree.py b/defusedxml/cElementTree.py index 95c3056..2b6364e 100644 --- a/defusedxml/cElementTree.py +++ b/defusedxml/cElementTree.py @@ -7,10 +7,9 @@ """ from __future__ import absolute_import -from .common import _generate_etree_functions, _HAVE_CELEMENTTREE +import warnings -if not _HAVE_CELEMENTTREE: - raise ImportError("cElementTree has been removed from Python 3.9") +from .common import _generate_etree_functions from xml.etree.cElementTree import TreeBuilder as _TreeBuilder from xml.etree.cElementTree import parse as _parse @@ -24,6 +23,12 @@ from .ElementTree import DefusedXMLParser __origin__ = "xml.etree.cElementTree" +warnings.warn( + "defusedxml.cElementTree is deprecated, import from defusedxml.ElementTree instead.", + category=DeprecationWarning, + stacklevel=2, +) + # XMLParse is a typo, keep it for backwards compatibility XMLTreeBuilder = XMLParse = XMLParser = DefusedXMLParser diff --git a/defusedxml/common.py b/defusedxml/common.py index 4bd573a..5ceda1f 100644 --- a/defusedxml/common.py +++ b/defusedxml/common.py @@ -9,8 +9,6 @@ import sys import xml.parsers.expat PY3 = sys.version_info[0] == 3 -# Python 3.9 removed cElementTree module -_HAVE_CELEMENTTREE = sys.version_info < (3, 9, 0) # Fail early when pyexpat is not installed correctly if not hasattr(xml.parsers.expat, "ParserCreate"): diff --git a/defusedxml/lxml.py b/defusedxml/lxml.py index ec22e0c..99d5be9 100644 --- a/defusedxml/lxml.py +++ b/defusedxml/lxml.py @@ -24,7 +24,7 @@ tostring = _etree.tostring warnings.warn( - "defusedxml.lxml is no longer supported and will be removed in a " "future release.", + "defusedxml.lxml is no longer supported and will be removed in a future release.", category=DeprecationWarning, stacklevel=2, ) @@ -18,13 +18,15 @@ from defusedxml import ( ExternalReferenceForbidden, NotSupportedError, ) -from defusedxml.common import PY3, _HAVE_CELEMENTTREE +from defusedxml.common import PY3 -if _HAVE_CELEMENTTREE: +if sys.version_info < (3, 7): + warnings.filterwarnings("once", category=DeprecationWarning) + + +with warnings.catch_warnings(record=True) as cetree_warnings: from defusedxml import cElementTree -else: - cElementTree = None try: @@ -33,10 +35,6 @@ except ImportError: gzip = None -if sys.version_info < (3, 7): - warnings.filterwarnings("once", category=DeprecationWarning) - - try: with warnings.catch_warnings(record=True) as lxml_warnings: from defusedxml import lxml @@ -211,10 +209,14 @@ class TestDefusedElementTree(BaseTests): assert self.module.XMLParse is parser -@unittest.skipUnless(_HAVE_CELEMENTTREE, "Python 3.9 has removed cElementTree") class TestDefusedcElementTree(TestDefusedElementTree): module = cElementTree + def test_celementtree_warnings(self): + self.assertTrue(cetree_warnings) + self.assertEqual(cetree_warnings[0].category, DeprecationWarning) + self.assertIn("tests.py", cetree_warnings[0].filename) + class TestDefusedMinidom(BaseTests): module = minidom |