From af1f4cf0c1bd94bc6c8debbd500b02daede92d31 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Tue, 12 Jan 2021 15:50:08 +0100 Subject: 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 --- README.md | 3 ++- README.txt | 3 ++- defusedxml/__init__.py | 10 ++++------ defusedxml/cElementTree.py | 11 ++++++++--- defusedxml/common.py | 2 -- defusedxml/lxml.py | 2 +- tests.py | 20 +++++++++++--------- 7 files changed, 28 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index dc23628..ad06452 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/README.txt b/README.txt index 8844fb7..eda36d5 100644 --- a/README.txt +++ b/README.txt @@ -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, ) diff --git a/tests.py b/tests.py index 188200a..f8b9274 100644 --- a/tests.py +++ b/tests.py @@ -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 -- cgit v1.2.1