Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 44ae4a2

Browse files
committed
Make error handling in BZ2File.{readable,seekable,writable,fileno} consistent with TextIOWrapper.
Also, add tests for these methods.
1 parent 3ff069e commit 44ae4a2

2 files changed

Lines changed: 59 additions & 4 deletions

File tree

Lib/bz2.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ def closed(self):
125125

126126
def fileno(self):
127127
"""Return the file descriptor for the underlying file."""
128+
self._check_not_closed()
128129
return self._fp.fileno()
129130

130131
def seekable(self):
@@ -133,10 +134,12 @@ def seekable(self):
133134

134135
def readable(self):
135136
"""Return whether the file was opened for reading."""
137+
self._check_not_closed()
136138
return self._mode in (_MODE_READ, _MODE_READ_EOF)
137139

138140
def writable(self):
139141
"""Return whether the file was opened for writing."""
142+
self._check_not_closed()
140143
return self._mode == _MODE_WRITE
141144

142145
# Mode-checking helper functions.
@@ -147,17 +150,14 @@ def _check_not_closed(self):
147150

148151
def _check_can_read(self):
149152
if not self.readable():
150-
self._check_not_closed()
151153
raise io.UnsupportedOperation("File not open for reading")
152154

153155
def _check_can_write(self):
154156
if not self.writable():
155-
self._check_not_closed()
156157
raise io.UnsupportedOperation("File not open for writing")
157158

158159
def _check_can_seek(self):
159160
if not self.seekable():
160-
self._check_not_closed()
161161
raise io.UnsupportedOperation("Seeking is only supported "
162162
"on files open for reading")
163163

Lib/test/test_bz2.py

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,8 +348,63 @@ def testSeekPreStartMultiStream(self):
348348
def testFileno(self):
349349
self.createTempFile()
350350
with open(self.filename, 'rb') as rawf:
351-
with BZ2File(fileobj=rawf) as bz2f:
351+
bz2f = BZ2File(fileobj=rawf)
352+
try:
352353
self.assertEqual(bz2f.fileno(), rawf.fileno())
354+
finally:
355+
bz2f.close()
356+
self.assertRaises(ValueError, bz2f.fileno)
357+
358+
def testSeekable(self):
359+
bz2f = BZ2File(fileobj=BytesIO(self.DATA))
360+
try:
361+
self.assertTrue(bz2f.seekable())
362+
bz2f.read()
363+
self.assertTrue(bz2f.seekable())
364+
finally:
365+
bz2f.close()
366+
self.assertRaises(ValueError, bz2f.seekable)
367+
368+
bz2f = BZ2File(fileobj=BytesIO(), mode="w")
369+
try:
370+
self.assertFalse(bz2f.seekable())
371+
finally:
372+
bz2f.close()
373+
self.assertRaises(ValueError, bz2f.seekable)
374+
375+
def testReadable(self):
376+
bz2f = BZ2File(fileobj=BytesIO(self.DATA))
377+
try:
378+
self.assertTrue(bz2f.readable())
379+
bz2f.read()
380+
self.assertTrue(bz2f.readable())
381+
finally:
382+
bz2f.close()
383+
self.assertRaises(ValueError, bz2f.readable)
384+
385+
bz2f = BZ2File(fileobj=BytesIO(), mode="w")
386+
try:
387+
self.assertFalse(bz2f.readable())
388+
finally:
389+
bz2f.close()
390+
self.assertRaises(ValueError, bz2f.readable)
391+
392+
def testWritable(self):
393+
bz2f = BZ2File(fileobj=BytesIO(self.DATA))
394+
try:
395+
self.assertFalse(bz2f.writable())
396+
bz2f.read()
397+
self.assertFalse(bz2f.writable())
398+
finally:
399+
bz2f.close()
400+
self.assertRaises(ValueError, bz2f.writable)
401+
402+
bz2f = BZ2File(fileobj=BytesIO(), mode="w")
403+
try:
404+
self.assertTrue(bz2f.writable())
405+
finally:
406+
bz2f.close()
407+
self.assertRaises(ValueError, bz2f.writable)
353408

354409
def testOpenDel(self):
355410
self.createTempFile()

0 commit comments

Comments
 (0)