Commit 84a13fbd authored by Berker Peksag's avatar Berker Peksag Committed by GitHub

bpo-9372: Deprecate several __getitem__ methods (GH-8609)

The __getitem__ methods of DOMEventStream, FileInput,
and FileWrapper classes ignore their 'index' parameters
and return the next item instead.
parent 423d05f6
...@@ -169,6 +169,9 @@ available for subclassing as well: ...@@ -169,6 +169,9 @@ available for subclassing as well:
.. deprecated-removed:: 3.6 3.8 .. deprecated-removed:: 3.6 3.8
The *bufsize* parameter. The *bufsize* parameter.
.. deprecated:: 3.8
Support for :meth:`__getitem__` method is deprecated.
**Optional in-place filtering:** if the keyword argument ``inplace=True`` is **Optional in-place filtering:** if the keyword argument ``inplace=True`` is
passed to :func:`fileinput.input` or to the :class:`FileInput` constructor, the passed to :func:`fileinput.input` or to the :class:`FileInput` constructor, the
......
...@@ -173,6 +173,8 @@ also provides these miscellaneous utilities: ...@@ -173,6 +173,8 @@ also provides these miscellaneous utilities:
for chunk in wrapper: for chunk in wrapper:
print(chunk) print(chunk)
.. deprecated:: 3.8
Support for :meth:`sequence protocol <__getitem__>` is deprecated.
:mod:`wsgiref.headers` -- WSGI response header tools :mod:`wsgiref.headers` -- WSGI response header tools
......
...@@ -100,6 +100,8 @@ DOMEventStream Objects ...@@ -100,6 +100,8 @@ DOMEventStream Objects
.. class:: DOMEventStream(stream, parser, bufsize) .. class:: DOMEventStream(stream, parser, bufsize)
.. deprecated:: 3.8
Support for :meth:`sequence protocol <__getitem__>` is deprecated.
.. method:: getEvent() .. method:: getEvent()
......
...@@ -154,6 +154,15 @@ Build and C API Changes ...@@ -154,6 +154,15 @@ Build and C API Changes
(Contributed by Antoine Pitrou in :issue:`32430`.) (Contributed by Antoine Pitrou in :issue:`32430`.)
* The :meth:`__getitem__` methods of :class:`xml.dom.pulldom.DOMEventStream`,
:class:`wsgiref.util.FileWrapper` and :class:`fileinput.FileInput` have been
deprecated.
Implementations of these methods have been ignoring their *index* parameter,
and returning the next item instead.
(Contributed by Berker Peksag in :issue:`9372`.)
Deprecated Deprecated
========== ==========
......
...@@ -259,6 +259,13 @@ class FileInput: ...@@ -259,6 +259,13 @@ class FileInput:
# repeat with next file # repeat with next file
def __getitem__(self, i): def __getitem__(self, i):
import warnings
warnings.warn(
"Support for indexing FileInput objects is deprecated. "
"Use iterator protocol instead.",
DeprecationWarning,
stacklevel=2
)
if i != self.lineno(): if i != self.lineno():
raise RuntimeError("accessing lines out of order") raise RuntimeError("accessing lines out of order")
try: try:
......
...@@ -89,6 +89,7 @@ __all__ = [ ...@@ -89,6 +89,7 @@ __all__ = [
"requires_IEEE_754", "skip_unless_xattr", "requires_zlib", "requires_IEEE_754", "skip_unless_xattr", "requires_zlib",
"anticipate_failure", "load_package_tests", "detect_api_mismatch", "anticipate_failure", "load_package_tests", "detect_api_mismatch",
"check__all__", "skip_unless_bind_unix_socket", "check__all__", "skip_unless_bind_unix_socket",
"ignore_warnings",
# sys # sys
"is_jython", "is_android", "check_impl_detail", "unix_shell", "is_jython", "is_android", "check_impl_detail", "unix_shell",
"setswitchinterval", "setswitchinterval",
...@@ -138,6 +139,22 @@ def _ignore_deprecated_imports(ignore=True): ...@@ -138,6 +139,22 @@ def _ignore_deprecated_imports(ignore=True):
yield yield
def ignore_warnings(*, category):
"""Decorator to suppress deprecation warnings.
Use of context managers to hide warnings make diffs
more noisy and tools like 'git blame' less useful.
"""
def decorator(test):
@functools.wraps(test)
def wrapper(self, *args, **kwargs):
with warnings.catch_warnings():
warnings.simplefilter('ignore', category=category)
return test(self, *args, **kwargs)
return wrapper
return decorator
def import_module(name, deprecated=False, *, required_on=()): def import_module(name, deprecated=False, *, required_on=()):
"""Import and return the module to be tested, raising SkipTest if """Import and return the module to be tested, raising SkipTest if
it is not available. it is not available.
......
...@@ -351,6 +351,7 @@ class FileInputTests(BaseTests, unittest.TestCase): ...@@ -351,6 +351,7 @@ class FileInputTests(BaseTests, unittest.TestCase):
with FileInput(files=[]) as fi: with FileInput(files=[]) as fi:
self.assertEqual(fi._files, ('-',)) self.assertEqual(fi._files, ('-',))
@support.ignore_warnings(category=DeprecationWarning)
def test__getitem__(self): def test__getitem__(self):
"""Tests invoking FileInput.__getitem__() with the current """Tests invoking FileInput.__getitem__() with the current
line number""" line number"""
...@@ -361,6 +362,14 @@ class FileInputTests(BaseTests, unittest.TestCase): ...@@ -361,6 +362,14 @@ class FileInputTests(BaseTests, unittest.TestCase):
retval2 = fi[1] retval2 = fi[1]
self.assertEqual(retval2, "line2\n") self.assertEqual(retval2, "line2\n")
def test__getitem___deprecation(self):
t = self.writeTmp("line1\nline2\n")
with self.assertWarnsRegex(DeprecationWarning,
r'Use iterator protocol instead'):
with FileInput(files=[t]) as fi:
self.assertEqual(fi[0], "line1\n")
@support.ignore_warnings(category=DeprecationWarning)
def test__getitem__invalid_key(self): def test__getitem__invalid_key(self):
"""Tests invoking FileInput.__getitem__() with an index unequal to """Tests invoking FileInput.__getitem__() with an index unequal to
the line number""" the line number"""
...@@ -370,6 +379,7 @@ class FileInputTests(BaseTests, unittest.TestCase): ...@@ -370,6 +379,7 @@ class FileInputTests(BaseTests, unittest.TestCase):
fi[1] fi[1]
self.assertEqual(cm.exception.args, ("accessing lines out of order",)) self.assertEqual(cm.exception.args, ("accessing lines out of order",))
@support.ignore_warnings(category=DeprecationWarning)
def test__getitem__eof(self): def test__getitem__eof(self):
"""Tests invoking FileInput.__getitem__() with the line number but at """Tests invoking FileInput.__getitem__() with the line number but at
end-of-input""" end-of-input"""
......
...@@ -159,6 +159,13 @@ class PullDOMTestCase(unittest.TestCase): ...@@ -159,6 +159,13 @@ class PullDOMTestCase(unittest.TestCase):
self.fail( self.fail(
"Ran out of events, but should have received END_DOCUMENT") "Ran out of events, but should have received END_DOCUMENT")
def test_getitem_deprecation(self):
parser = pulldom.parseString(SMALL_SAMPLE)
with self.assertWarnsRegex(DeprecationWarning,
r'Use iterator protocol instead'):
# This should have returned 'END_ELEMENT'.
self.assertEqual(parser[-1][0], pulldom.START_DOCUMENT)
class ThoroughTestCase(unittest.TestCase): class ThoroughTestCase(unittest.TestCase):
"""Test the hard-to-reach parts of pulldom.""" """Test the hard-to-reach parts of pulldom."""
......
...@@ -338,6 +338,7 @@ class UtilityTests(TestCase): ...@@ -338,6 +338,7 @@ class UtilityTests(TestCase):
util.setup_testing_defaults(kw) util.setup_testing_defaults(kw)
self.assertEqual(util.request_uri(kw,query),uri) self.assertEqual(util.request_uri(kw,query),uri)
@support.ignore_warnings(category=DeprecationWarning)
def checkFW(self,text,size,match): def checkFW(self,text,size,match):
def make_it(text=text,size=size): def make_it(text=text,size=size):
...@@ -356,6 +357,13 @@ class UtilityTests(TestCase): ...@@ -356,6 +357,13 @@ class UtilityTests(TestCase):
it.close() it.close()
self.assertTrue(it.filelike.closed) self.assertTrue(it.filelike.closed)
def test_filewrapper_getitem_deprecation(self):
wrapper = util.FileWrapper(StringIO('foobar'), 3)
with self.assertWarnsRegex(DeprecationWarning,
r'Use iterator protocol instead'):
# This should have returned 'bar'.
self.assertEqual(wrapper[1], 'foo')
def testSimpleShifts(self): def testSimpleShifts(self):
self.checkShift('','/', '', '/', '') self.checkShift('','/', '', '/', '')
self.checkShift('','/x', 'x', '/x', '') self.checkShift('','/x', 'x', '/x', '')
......
...@@ -18,6 +18,13 @@ class FileWrapper: ...@@ -18,6 +18,13 @@ class FileWrapper:
self.close = filelike.close self.close = filelike.close
def __getitem__(self,key): def __getitem__(self,key):
import warnings
warnings.warn(
"FileWrapper's __getitem__ method ignores 'key' parameter. "
"Use iterator protocol instead.",
DeprecationWarning,
stacklevel=2
)
data = self.filelike.read(self.blksize) data = self.filelike.read(self.blksize)
if data: if data:
return data return data
......
...@@ -217,6 +217,13 @@ class DOMEventStream: ...@@ -217,6 +217,13 @@ class DOMEventStream:
self.parser.setContentHandler(self.pulldom) self.parser.setContentHandler(self.pulldom)
def __getitem__(self, pos): def __getitem__(self, pos):
import warnings
warnings.warn(
"DOMEventStream's __getitem__ method ignores 'pos' parameter. "
"Use iterator protocol instead.",
DeprecationWarning,
stacklevel=2
)
rc = self.getEvent() rc = self.getEvent()
if rc: if rc:
return rc return rc
......
Deprecate :meth:`__getitem__` methods of
:class:`xml.dom.pulldom.DOMEventStream`, :class:`wsgiref.util.FileWrapper`
and :class:`fileinput.FileInput`.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment