Fix seekable() in BZ2File and LZMAFile to check whether the underlying file supports seek().

This commit is contained in:
Nadeem Vawda 2012-02-12 01:51:38 +02:00
parent d7e5c6ed7f
commit ae557d767f
4 changed files with 28 additions and 4 deletions

View File

@ -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):

View File

@ -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):

View File

@ -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:

View File

@ -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: