diff -r 08829230079b Doc/library/xml.etree.elementtree.rst --- a/Doc/library/xml.etree.elementtree.rst Sat May 16 10:10:21 2015 -0400 +++ b/Doc/library/xml.etree.elementtree.rst Sat May 16 19:25:11 2015 +0300 @@ -1054,13 +1054,6 @@ XMLParser Objects this is the toplevel document element. - .. method:: doctype(name, pubid, system) - - .. deprecated:: 3.2 - Define the :meth:`TreeBuilder.doctype` method on a custom TreeBuilder - target. - - .. method:: feed(data) Feeds data to the parser. *data* is encoded data. diff -r 08829230079b Doc/whatsnew/3.5.rst --- a/Doc/whatsnew/3.5.rst Sat May 16 10:10:21 2015 -0400 +++ b/Doc/whatsnew/3.5.rst Sat May 16 19:25:11 2015 +0300 @@ -740,6 +740,11 @@ removed: * The JoinableQueue class in the provisional asyncio module was deprecated in 3.4.4 and is now removed (:issue:`23464`). +* The :meth:`~xml.etree.ElementTree.XMLParser.doctype` method of + :class:`xml.etree.ElementTree.XMLParser` has been removed (:issue:`19176`). + It has been deprecated in favour of :meth:`TreeBuilder.doctype() + ` since Python 3.2. + Porting to Python 3.5 ===================== diff -r 08829230079b Lib/test/test_xml_etree.py --- a/Lib/test/test_xml_etree.py Sat May 16 10:10:21 2015 -0400 +++ b/Lib/test/test_xml_etree.py Sat May 16 19:25:11 2015 +0300 @@ -12,6 +12,7 @@ import pickle import sys import types import unittest +import warnings import weakref from itertools import product @@ -2117,20 +2118,16 @@ class XMLParserTest(unittest.TestCase): parser.feed(self.sample1) self._check_sample_element(parser.close()) - def test_subclass_doctype(self): - _doctype = None - class MyParserWithDoctype(ET.XMLParser): - def doctype(self, name, pubid, system): - nonlocal _doctype - _doctype = (name, pubid, system) - - parser = MyParserWithDoctype() - with self.assertWarns(DeprecationWarning): + def test_inherited_deprecation(self): + # Ensure that subclass usage is not deprecated. In Issue 19176, + # there was trouble detecting use of inherited deprecated methods. + with warnings.catch_warnings(): + warnings.simplefilter('error', DeprecationWarning) + class MyParser(ET.XMLParser): + pass + parser = MyParser() parser.feed(self.sample2) - parser.close() - self.assertEqual(_doctype, - ('html', '-//W3C//DTD XHTML 1.0 Transitional//EN', - 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd')) + parser.close() def test_parse_string(self): parser = ET.XMLParser(target=ET.TreeBuilder()) diff -r 08829230079b Lib/xml/etree/ElementTree.py --- a/Lib/xml/etree/ElementTree.py Sat May 16 10:10:21 2015 -0400 +++ b/Lib/xml/etree/ElementTree.py Sat May 16 19:25:11 2015 +0300 @@ -1603,28 +1603,8 @@ class XMLParser: return if hasattr(self.target, "doctype"): self.target.doctype(name, pubid, system[1:-1]) - elif self.doctype != self._XMLParser__doctype: - # warn about deprecated call - self._XMLParser__doctype(name, pubid, system[1:-1]) - self.doctype(name, pubid, system[1:-1]) self._doctype = None - def doctype(self, name, pubid, system): - """(Deprecated) Handle doctype declaration - - *name* is the Doctype name, *pubid* is the public identifier, - and *system* is the system identifier. - - """ - warnings.warn( - "This method of XMLParser is deprecated. Define doctype() " - "method on the TreeBuilder target.", - DeprecationWarning, - ) - - # sentinel, if doctype is redefined in a subclass - __doctype = doctype - def feed(self, data): """Feed encoded data to parser.""" try: diff -r 08829230079b Modules/_elementtree.c --- a/Modules/_elementtree.c Sat May 16 10:10:21 2015 -0400 +++ b/Modules/_elementtree.c Sat May 16 19:25:11 2015 +0300 @@ -2732,8 +2732,6 @@ typedef struct { } XMLParserObject; -#define XMLParser_CheckExact(op) (Py_TYPE(op) == &XMLParser_Type) - /* helpers */ LOCAL(PyObject*) @@ -3091,9 +3089,7 @@ expat_start_doctype_handler(XMLParserObj const XML_Char *pubid, int has_internal_subset) { - PyObject *self_pyobj = (PyObject *)self; PyObject *doctype_name_obj, *sysid_obj, *pubid_obj; - PyObject *parser_doctype = NULL; PyObject *res = NULL; if (PyErr_Occurred()) @@ -3133,27 +3129,6 @@ expat_start_doctype_handler(XMLParserObj Py_CLEAR(res); } - /* Now see if the parser itself has a doctype method. If yes and it's - * a subclass, call it but warn about deprecation. If it's not a subclass - * (i.e. vanilla XMLParser), do nothing. - */ - parser_doctype = PyObject_GetAttrString(self_pyobj, "doctype"); - if (parser_doctype) { - if (!XMLParser_CheckExact(self_pyobj)) { - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "This method of XMLParser is deprecated. Define" - " doctype() method on the TreeBuilder target.", - 1) < 0) { - goto clear; - } - res = PyObject_CallFunction(parser_doctype, "OOO", - doctype_name_obj, pubid_obj, sysid_obj); - Py_CLEAR(res); - } - } - -clear: - Py_XDECREF(parser_doctype); Py_DECREF(doctype_name_obj); Py_DECREF(pubid_obj); Py_DECREF(sysid_obj); @@ -3520,18 +3495,6 @@ static PyObject * } /*[clinic input] -_elementtree.XMLParser.doctype - -[clinic start generated code]*/ - -static PyObject * -_elementtree_XMLParser_doctype_impl(XMLParserObject *self) -/*[clinic end generated code: output=d09fdb9c45f3a602 input=20d5e0febf902a2f]*/ -{ - Py_RETURN_NONE; -} - -/*[clinic input] _elementtree.XMLParser._setevents events_queue: object(subclass_of='&PyList_Type') @@ -3799,7 +3762,6 @@ static PyMethodDef xmlparser_methods[] = _ELEMENTTREE_XMLPARSER_CLOSE_METHODDEF _ELEMENTTREE_XMLPARSER__PARSE_WHOLE_METHODDEF _ELEMENTTREE_XMLPARSER__SETEVENTS_METHODDEF - _ELEMENTTREE_XMLPARSER_DOCTYPE_METHODDEF {NULL, NULL} }; diff -r 08829230079b Modules/clinic/_elementtree.c.h --- a/Modules/clinic/_elementtree.c.h Sat May 16 10:10:21 2015 -0400 +++ b/Modules/clinic/_elementtree.c.h Sat May 16 19:25:11 2015 +0300 @@ -618,23 +618,6 @@ PyDoc_STRVAR(_elementtree_XMLParser__par #define _ELEMENTTREE_XMLPARSER__PARSE_WHOLE_METHODDEF \ {"_parse_whole", (PyCFunction)_elementtree_XMLParser__parse_whole, METH_O, _elementtree_XMLParser__parse_whole__doc__}, -PyDoc_STRVAR(_elementtree_XMLParser_doctype__doc__, -"doctype($self, /)\n" -"--\n" -"\n"); - -#define _ELEMENTTREE_XMLPARSER_DOCTYPE_METHODDEF \ - {"doctype", (PyCFunction)_elementtree_XMLParser_doctype, METH_NOARGS, _elementtree_XMLParser_doctype__doc__}, - -static PyObject * -_elementtree_XMLParser_doctype_impl(XMLParserObject *self); - -static PyObject * -_elementtree_XMLParser_doctype(XMLParserObject *self, PyObject *Py_UNUSED(ignored)) -{ - return _elementtree_XMLParser_doctype_impl(self); -} - PyDoc_STRVAR(_elementtree_XMLParser__setevents__doc__, "_setevents($self, events_queue, events_to_report=None, /)\n" "--\n" @@ -663,4 +646,4 @@ static PyObject * exit: return return_value; } -/*[clinic end generated code: output=119aed84c1545187 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=f336ec7f931a7838 input=a9049054013a1b77]*/