Fix seekable() in BZ2File and LZMAFile to check whether the underlying file supports seek().
This commit is contained in:
parent
d7e5c6ed7f
commit
ae557d767f
|
@ -138,7 +138,7 @@ class BZ2File(io.BufferedIOBase):
|
|||
|
||||
def seekable(self):
|
||||
"""Return whether the file supports seeking."""
|
||||
return self.readable()
|
||||
return self.readable() and self._fp.seekable()
|
||||
|
||||
def readable(self):
|
||||
"""Return whether the file was opened for reading."""
|
||||
|
@ -165,9 +165,12 @@ class BZ2File(io.BufferedIOBase):
|
|||
raise io.UnsupportedOperation("File not open for writing")
|
||||
|
||||
def _check_can_seek(self):
|
||||
if not self.seekable():
|
||||
if not self.readable():
|
||||
raise io.UnsupportedOperation("Seeking is only supported "
|
||||
"on files open for reading")
|
||||
if not self._fp.seekable():
|
||||
raise io.UnsupportedOperation("The underlying file object "
|
||||
"does not support seeking")
|
||||
|
||||
# Fill the readahead buffer if it is empty. Returns False on EOF.
|
||||
def _fill_buffer(self):
|
||||
|
|
|
@ -165,7 +165,7 @@ class LZMAFile(io.BufferedIOBase):
|
|||
|
||||
def seekable(self):
|
||||
"""Return whether the file supports seeking."""
|
||||
return self.readable()
|
||||
return self.readable() and self._fp.seekable()
|
||||
|
||||
def readable(self):
|
||||
"""Return whether the file was opened for reading."""
|
||||
|
@ -192,9 +192,12 @@ class LZMAFile(io.BufferedIOBase):
|
|||
raise io.UnsupportedOperation("File not open for writing")
|
||||
|
||||
def _check_can_seek(self):
|
||||
if not self.seekable():
|
||||
if not self.readable():
|
||||
raise io.UnsupportedOperation("Seeking is only supported "
|
||||
"on files open for reading")
|
||||
if not self._fp.seekable():
|
||||
raise io.UnsupportedOperation("The underlying file object "
|
||||
"does not support seeking")
|
||||
|
||||
# Fill the readahead buffer if it is empty. Returns False on EOF.
|
||||
def _fill_buffer(self):
|
||||
|
|
|
@ -372,6 +372,15 @@ class BZ2FileTest(BaseTest):
|
|||
bz2f.close()
|
||||
self.assertRaises(ValueError, bz2f.seekable)
|
||||
|
||||
src = BytesIO(self.DATA)
|
||||
src.seekable = lambda: False
|
||||
bz2f = BZ2File(fileobj=src)
|
||||
try:
|
||||
self.assertFalse(bz2f.seekable())
|
||||
finally:
|
||||
bz2f.close()
|
||||
self.assertRaises(ValueError, bz2f.seekable)
|
||||
|
||||
def testReadable(self):
|
||||
bz2f = BZ2File(fileobj=BytesIO(self.DATA))
|
||||
try:
|
||||
|
|
|
@ -525,6 +525,15 @@ class FileTestCase(unittest.TestCase):
|
|||
f.close()
|
||||
self.assertRaises(ValueError, f.seekable)
|
||||
|
||||
src = BytesIO(COMPRESSED_XZ)
|
||||
src.seekable = lambda: False
|
||||
f = LZMAFile(fileobj=src)
|
||||
try:
|
||||
self.assertFalse(f.seekable())
|
||||
finally:
|
||||
f.close()
|
||||
self.assertRaises(ValueError, f.seekable)
|
||||
|
||||
def test_readable(self):
|
||||
f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
|
||||
try:
|
||||
|
|
Loading…
Reference in New Issue