summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/codecs.rst25
-rw-r--r--Lib/codecs.py25
-rw-r--r--Lib/test/test_codecs.py152
-rw-r--r--Misc/NEWS5
4 files changed, 59 insertions, 148 deletions
diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst
index b58e410..4d5058e 100644
--- a/Doc/library/codecs.rst
+++ b/Doc/library/codecs.rst
@@ -85,9 +85,6 @@ It defines the following functions:
In case a search function cannot find a given encoding, it should return
``None``.
- .. deprecated:: 3.3
- *streamreader* and *streamwriter* attributes are now deprecated.
-
.. function:: lookup(encoding)
@@ -142,8 +139,6 @@ functions which use :func:`lookup` for the codec lookup:
Raises a :exc:`LookupError` in case the encoding cannot be found.
- .. deprecated:: 3.3
-
.. function:: getwriter(encoding)
@@ -152,8 +147,6 @@ functions which use :func:`lookup` for the codec lookup:
Raises a :exc:`LookupError` in case the encoding cannot be found.
- .. deprecated:: 3.3
-
.. function:: register_error(name, error_handler)
@@ -224,11 +217,6 @@ utility functions:
.. note::
- This function is kept for backward compatibility with Python 2, the
- builtin :func:`open` function should be used instead.
-
- .. note::
-
The wrapped version's methods will accept and return strings only. Bytes
arguments will be rejected.
@@ -263,8 +251,6 @@ utility functions:
``'strict'``, which causes :exc:`ValueError` to be raised in case an encoding
error occurs.
- .. deprecated:: 3.3
-
.. function:: iterencode(iterator, encoding, errors='strict', **kwargs)
@@ -577,9 +563,6 @@ The :class:`StreamWriter` class is a subclass of :class:`Codec` and defines the
following methods which every stream writer must define in order to be
compatible with the Python codec registry.
-.. deprecated:: 3.3
- Use the builtin the :class:`io.TextIOWrapper` class.
-
.. class:: StreamWriter(stream[, errors])
@@ -645,9 +628,6 @@ The :class:`StreamReader` class is a subclass of :class:`Codec` and defines the
following methods which every stream reader must define in order to be
compatible with the Python codec registry.
-.. deprecated:: 3.3
- Use the builtin the :class:`io.TextIOWrapper` class.
-
.. class:: StreamReader(stream[, errors])
@@ -748,9 +728,6 @@ and write modes.
The design is such that one can use the factory functions returned by the
:func:`lookup` function to construct the instance.
-.. deprecated:: 3.3
- Use the :class:`io.TextIOWrapper` class.
-
.. class:: StreamReaderWriter(stream, Reader, Writer, errors)
@@ -775,8 +752,6 @@ which is sometimes useful when dealing with different encoding environments.
The design is such that one can use the factory functions returned by the
:func:`lookup` function to construct the instance.
-.. deprecated:: 3.3
-
.. class:: StreamRecoder(stream, encode, decode, Reader, Writer, errors)
diff --git a/Lib/codecs.py b/Lib/codecs.py
index ec7879f..b150d64 100644
--- a/Lib/codecs.py
+++ b/Lib/codecs.py
@@ -345,8 +345,6 @@ class StreamWriter(Codec):
The set of allowed parameter values can be extended via
register_error.
"""
- import warnings
- warnings.warn('use io.TextIOWrapper', DeprecationWarning, stacklevel=2)
self.stream = stream
self.errors = errors
@@ -418,8 +416,6 @@ class StreamReader(Codec):
The set of allowed parameter values can be extended via
register_error.
"""
- import warnings
- warnings.warn('use io.TextIOWrapper', DeprecationWarning, stacklevel=2)
self.stream = stream
self.errors = errors
self.bytebuffer = b""
@@ -850,7 +846,7 @@ class StreamRecoder:
### Shortcuts
-def open(filename, mode='r', encoding=None, errors=None, buffering=1):
+def open(filename, mode='rb', encoding=None, errors='strict', buffering=1):
""" Open an encoded file using the given mode and return
a wrapped version providing transparent encoding/decoding.
@@ -881,13 +877,18 @@ def open(filename, mode='r', encoding=None, errors=None, buffering=1):
parameter.
"""
- if encoding is not None:
- return builtins.open(filename, mode, buffering,
- encoding, errors, newline='')
- else:
- if 'b' not in mode:
- mode = mode + 'b'
- return builtins.open(filename, mode, buffering, encoding, errors)
+ if encoding is not None and \
+ 'b' not in mode:
+ # Force opening of the file in binary mode
+ mode = mode + 'b'
+ file = builtins.open(filename, mode, buffering)
+ if encoding is None:
+ return file
+ info = lookup(encoding)
+ srw = StreamReaderWriter(file, info.streamreader, info.streamwriter, errors)
+ # Add attributes to simplify introspection
+ srw.encoding = encoding
+ return srw
def EncodedFile(file, data_encoding, file_encoding=None, errors='strict'):
diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py
index 1f46560..c0450e7 100644
--- a/Lib/test/test_codecs.py
+++ b/Lib/test/test_codecs.py
@@ -1,10 +1,7 @@
from test import support
-import _testcapi
-import codecs
-import io
-import sys
import unittest
-import warnings
+import codecs
+import sys, _testcapi, io
class Queue(object):
"""
@@ -66,9 +63,7 @@ class ReadTest(unittest.TestCase, MixInCheckStateHandling):
# the StreamReader and check that the results equal the appropriate
# entries from partialresults.
q = Queue(b"")
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- r = codecs.getreader(self.encoding)(q)
+ r = codecs.getreader(self.encoding)(q)
result = ""
for (c, partialresult) in zip(input.encode(self.encoding), partialresults):
q.write(bytes([c]))
@@ -111,9 +106,7 @@ class ReadTest(unittest.TestCase, MixInCheckStateHandling):
return codecs.getreader(self.encoding)(stream)
def readalllines(input, keepends=True, size=None):
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- reader = getreader(input)
+ reader = getreader(input)
lines = []
while True:
line = reader.readline(size=size, keepends=keepends)
@@ -222,18 +215,14 @@ class ReadTest(unittest.TestCase, MixInCheckStateHandling):
' \r\n',
]
stream = io.BytesIO("".join(s).encode(self.encoding))
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- reader = codecs.getreader(self.encoding)(stream)
+ reader = codecs.getreader(self.encoding)(stream)
for (i, line) in enumerate(reader):
self.assertEqual(line, s[i])
def test_readlinequeue(self):
q = Queue(b"")
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- writer = codecs.getwriter(self.encoding)(q)
- reader = codecs.getreader(self.encoding)(q)
+ writer = codecs.getwriter(self.encoding)(q)
+ reader = codecs.getreader(self.encoding)(q)
# No lineends
writer.write("foo\r")
@@ -264,9 +253,7 @@ class ReadTest(unittest.TestCase, MixInCheckStateHandling):
s = (s1+s2+s3).encode(self.encoding)
stream = io.BytesIO(s)
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- reader = codecs.getreader(self.encoding)(stream)
+ reader = codecs.getreader(self.encoding)(stream)
self.assertEqual(reader.readline(), s1)
self.assertEqual(reader.readline(), s2)
self.assertEqual(reader.readline(), s3)
@@ -281,9 +268,7 @@ class ReadTest(unittest.TestCase, MixInCheckStateHandling):
s = (s1+s2+s3+s4+s5).encode(self.encoding)
stream = io.BytesIO(s)
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- reader = codecs.getreader(self.encoding)(stream)
+ reader = codecs.getreader(self.encoding)(stream)
self.assertEqual(reader.readline(), s1)
self.assertEqual(reader.readline(), s2)
self.assertEqual(reader.readline(), s3)
@@ -305,9 +290,7 @@ class UTF32Test(ReadTest):
_,_,reader,writer = codecs.lookup(self.encoding)
# encode some stream
s = io.BytesIO()
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- f = writer(s)
+ f = writer(s)
f.write("spam")
f.write("spam")
d = s.getvalue()
@@ -315,22 +298,16 @@ class UTF32Test(ReadTest):
self.assertTrue(d == self.spamle or d == self.spambe)
# try to read it back
s = io.BytesIO(d)
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- f = reader(s)
+ f = reader(s)
self.assertEqual(f.read(), "spamspam")
def test_badbom(self):
s = io.BytesIO(4*b"\xff")
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- f = codecs.getreader(self.encoding)(s)
+ f = codecs.getreader(self.encoding)(s)
self.assertRaises(UnicodeError, f.read)
s = io.BytesIO(8*b"\xff")
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- f = codecs.getreader(self.encoding)(s)
+ f = codecs.getreader(self.encoding)(s)
self.assertRaises(UnicodeError, f.read)
def test_partial(self):
@@ -477,9 +454,7 @@ class UTF16Test(ReadTest):
_,_,reader,writer = codecs.lookup(self.encoding)
# encode some stream
s = io.BytesIO()
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- f = writer(s)
+ f = writer(s)
f.write("spam")
f.write("spam")
d = s.getvalue()
@@ -487,22 +462,16 @@ class UTF16Test(ReadTest):
self.assertTrue(d == self.spamle or d == self.spambe)
# try to read it back
s = io.BytesIO(d)
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- f = reader(s)
+ f = reader(s)
self.assertEqual(f.read(), "spamspam")
def test_badbom(self):
s = io.BytesIO(b"\xff\xff")
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- f = codecs.getreader(self.encoding)(s)
+ f = codecs.getreader(self.encoding)(s)
self.assertRaises(UnicodeError, f.read)
s = io.BytesIO(b"\xff\xff\xff\xff")
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- f = codecs.getreader(self.encoding)(s)
+ f = codecs.getreader(self.encoding)(s)
self.assertRaises(UnicodeError, f.read)
def test_partial(self):
@@ -548,8 +517,7 @@ class UTF16Test(ReadTest):
self.addCleanup(support.unlink, support.TESTFN)
with open(support.TESTFN, 'wb') as fp:
fp.write(s)
- with codecs.open(support.TESTFN, 'U',
- encoding=self.encoding) as reader:
+ with codecs.open(support.TESTFN, 'U', encoding=self.encoding) as reader:
self.assertEqual(reader.read(), s1)
class UTF16LETest(ReadTest):
@@ -737,9 +705,7 @@ class UTF8SigTest(ReadTest):
reader = codecs.getreader("utf-8-sig")
for sizehint in [None] + list(range(1, 11)) + \
[64, 128, 256, 512, 1024]:
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- istream = reader(io.BytesIO(bytestring))
+ istream = reader(io.BytesIO(bytestring))
ostream = io.StringIO()
while 1:
if sizehint is not None:
@@ -761,9 +727,7 @@ class UTF8SigTest(ReadTest):
reader = codecs.getreader("utf-8-sig")
for sizehint in [None] + list(range(1, 11)) + \
[64, 128, 256, 512, 1024]:
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- istream = reader(io.BytesIO(bytestring))
+ istream = reader(io.BytesIO(bytestring))
ostream = io.StringIO()
while 1:
if sizehint is not None:
@@ -785,9 +749,7 @@ class EscapeDecodeTest(unittest.TestCase):
class RecodingTest(unittest.TestCase):
def test_recoding(self):
f = io.BytesIO()
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- f2 = codecs.EncodedFile(f, "unicode_internal", "utf-8")
+ f2 = codecs.EncodedFile(f, "unicode_internal", "utf-8")
f2.write("a")
f2.close()
# Python used to crash on this at exit because of a refcount
@@ -1164,9 +1126,7 @@ class IDNACodecTest(unittest.TestCase):
self.assertEqual("pyth\xf6n.org.".encode("idna"), b"xn--pythn-mua.org.")
def test_stream(self):
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- r = codecs.getreader("idna")(io.BytesIO(b"abc"))
+ r = codecs.getreader("idna")(io.BytesIO(b"abc"))
r.read(3)
self.assertEqual(r.read(), "")
@@ -1273,24 +1233,18 @@ class CodecsModuleTest(unittest.TestCase):
class StreamReaderTest(unittest.TestCase):
def setUp(self):
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- self.reader = codecs.getreader('utf-8')
+ self.reader = codecs.getreader('utf-8')
self.stream = io.BytesIO(b'\xed\x95\x9c\n\xea\xb8\x80')
def test_readlines(self):
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- f = self.reader(self.stream)
+ f = self.reader(self.stream)
self.assertEqual(f.readlines(), ['\ud55c\n', '\uae00'])
class EncodedFileTest(unittest.TestCase):
def test_basic(self):
f = io.BytesIO(b'\xed\x95\x9c\n\xea\xb8\x80')
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- ef = codecs.EncodedFile(f, 'utf-16-le', 'utf-8')
+ ef = codecs.EncodedFile(f, 'utf-16-le', 'utf-8')
self.assertEqual(ef.read(), b'\\\xd5\n\x00\x00\xae')
f = io.BytesIO()
@@ -1434,9 +1388,7 @@ class BasicUnicodeTest(unittest.TestCase, MixInCheckStateHandling):
if encoding not in broken_unicode_with_streams:
# check stream reader/writer
q = Queue(b"")
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- writer = codecs.getwriter(encoding)(q)
+ writer = codecs.getwriter(encoding)(q)
encodedresult = b""
for c in s:
writer.write(c)
@@ -1444,9 +1396,7 @@ class BasicUnicodeTest(unittest.TestCase, MixInCheckStateHandling):
self.assertTrue(type(chunk) is bytes, type(chunk))
encodedresult += chunk
q = Queue(b"")
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- reader = codecs.getreader(encoding)(q)
+ reader = codecs.getreader(encoding)(q)
decodedresult = ""
for c in encodedresult:
q.write(bytes([c]))
@@ -1520,9 +1470,7 @@ class BasicUnicodeTest(unittest.TestCase, MixInCheckStateHandling):
continue
if encoding in broken_unicode_with_streams:
continue
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- reader = codecs.getreader(encoding)(io.BytesIO(s.encode(encoding)))
+ reader = codecs.getreader(encoding)(io.BytesIO(s.encode(encoding)))
for t in range(5):
# Test that calling seek resets the internal codec state and buffers
reader.seek(0, 0)
@@ -1591,19 +1539,15 @@ class CharmapTest(unittest.TestCase):
class WithStmtTest(unittest.TestCase):
def test_encodedfile(self):
f = io.BytesIO(b"\xc3\xbc")
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- with codecs.EncodedFile(f, "latin-1", "utf-8") as ef:
- self.assertEqual(ef.read(), b"\xfc")
+ with codecs.EncodedFile(f, "latin-1", "utf-8") as ef:
+ self.assertEqual(ef.read(), b"\xfc")
def test_streamreaderwriter(self):
f = io.BytesIO(b"\xc3\xbc")
info = codecs.lookup("utf-8")
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- with codecs.StreamReaderWriter(f, info.streamreader,
- info.streamwriter, 'strict') as srw:
- self.assertEqual(srw.read(), "\xfc")
+ with codecs.StreamReaderWriter(f, info.streamreader,
+ info.streamwriter, 'strict') as srw:
+ self.assertEqual(srw.read(), "\xfc")
class TypesTest(unittest.TestCase):
def test_decode_unicode(self):
@@ -1700,15 +1644,15 @@ class BomTest(unittest.TestCase):
# (StreamWriter) Check that the BOM is written after a seek(0)
with codecs.open(support.TESTFN, 'w+', encoding=encoding) as f:
- f.write(data[0])
- self.assertNotEqual(f.tell(), 0)
- f.seek(0)
- f.write(data)
+ f.writer.write(data[0])
+ self.assertNotEqual(f.writer.tell(), 0)
+ f.writer.seek(0)
+ f.writer.write(data)
f.seek(0)
self.assertEqual(f.read(), data)
- # Check that the BOM is not written after a seek() at a
- # position different than the start
+ # Check that the BOM is not written after a seek() at a position
+ # different than the start
with codecs.open(support.TESTFN, 'w+', encoding=encoding) as f:
f.write(data)
f.seek(f.tell())
@@ -1716,12 +1660,12 @@ class BomTest(unittest.TestCase):
f.seek(0)
self.assertEqual(f.read(), data * 2)
- # (StreamWriter) Check that the BOM is not written after a
- # seek() at a position different than the start
+ # (StreamWriter) Check that the BOM is not written after a seek()
+ # at a position different than the start
with codecs.open(support.TESTFN, 'w+', encoding=encoding) as f:
- f.write(data)
- f.seek(f.tell())
- f.write(data)
+ f.writer.write(data)
+ f.writer.seek(f.writer.tell())
+ f.writer.write(data)
f.seek(0)
self.assertEqual(f.read(), data * 2)
@@ -1760,9 +1704,7 @@ class TransformCodecTest(unittest.TestCase):
def test_read(self):
for encoding in bytes_transform_encodings:
sin = codecs.encode(b"\x80", encoding)
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- reader = codecs.getreader(encoding)(io.BytesIO(sin))
+ reader = codecs.getreader(encoding)(io.BytesIO(sin))
sout = reader.read()
self.assertEqual(sout, b"\x80")
@@ -1771,9 +1713,7 @@ class TransformCodecTest(unittest.TestCase):
if encoding in ['uu_codec', 'zlib_codec']:
continue
sin = codecs.encode(b"\x80", encoding)
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- reader = codecs.getreader(encoding)(io.BytesIO(sin))
+ reader = codecs.getreader(encoding)(io.BytesIO(sin))
sout = reader.readline()
self.assertEqual(sout, b"\x80")
diff --git a/Misc/NEWS b/Misc/NEWS
index df8bca8..2a916fd 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -167,11 +167,6 @@ Library
- Issue #1625: BZ2File and bz2.decompress() now support multi-stream files.
Initial patch by Nir Aides.
-- Issue #8796: codecs.open() calls the builtin open() function instead of using
- StreamReaderWriter. Deprecate StreamReader, StreamWriter, StreamReaderWriter,
- StreamRecoder and EncodedFile() of the codec module. Use the builtin open()
- function or io.TextIOWrapper instead.
-
- Issue #12175: BufferedReader.read(-1) now calls raw.readall() if available.
- Issue #12175: FileIO.readall() now only reads the file position and size