can be determined, `mode' is overridden by `fileobj's mode.
`fileobj' is not closed, when TarFile is closed.
"""
- if len(mode) > 1 or mode not in "raw":
+ modes = {"r": "rb", "a": "r+b", "w": "wb"}
+ if mode not in modes:
raise ValueError("mode must be 'r', 'a' or 'w'")
self.mode = mode
- self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode]
+ self._mode = modes[mode]
if not fileobj:
if self.mode == "a" and not os.path.exists(name):
filemode = filemode or "r"
comptype = comptype or "tar"
- if filemode not in "rw":
+ if filemode not in ("r", "w"):
raise ValueError("mode must be 'r' or 'w'")
t = cls(name, filemode,
t._extfileobj = False
return t
- elif mode in "aw":
+ elif mode in ("a", "w"):
return cls.taropen(name, mode, fileobj, **kwargs)
raise ValueError("undiscernible mode")
def taropen(cls, name, mode="r", fileobj=None, **kwargs):
"""Open uncompressed tar archive name for reading or writing.
"""
- if len(mode) > 1 or mode not in "raw":
+ if mode not in ("r", "a", "w"):
raise ValueError("mode must be 'r', 'a' or 'w'")
return cls(name, mode, fileobj, **kwargs)
"""Open gzip compressed tar archive name for reading or writing.
Appending is not allowed.
"""
- if len(mode) > 1 or mode not in "rw":
+ if mode not in ("r", "w"):
raise ValueError("mode must be 'r' or 'w'")
try:
"""Open bzip2 compressed tar archive name for reading or writing.
Appending is not allowed.
"""
- if len(mode) > 1 or mode not in "rw":
+ if mode not in ("r", "w"):
raise ValueError("mode must be 'r' or 'w'.")
try:
class MiscReadTest(CommonReadTest):
+ taropen = tarfile.TarFile.taropen
def test_no_name_argument(self):
fobj = open(self.tarname, "rb")
tar = tarfile.open(fileobj=fobj, mode=self.mode)
self.assertEqual(tar.name, None)
+ def test_illegal_mode_arg(self):
+ with open(tmpname, 'wb'):
+ pass
+ self.addCleanup(os.unlink, tmpname)
+ with self.assertRaisesRegexp(ValueError, 'mode must be '):
+ tar = self.taropen(tmpname, 'q')
+ with self.assertRaisesRegexp(ValueError, 'mode must be '):
+ tar = self.taropen(tmpname, 'rw')
+ with self.assertRaisesRegexp(ValueError, 'mode must be '):
+ tar = self.taropen(tmpname, '')
+
def test_fileobj_with_offset(self):
# Skip the first member and store values from the second member
# of the testtar.
class GzipMiscReadTest(MiscReadTest):
tarname = gzipname
mode = "r:gz"
+ taropen = tarfile.TarFile.gzopen
class GzipUstarReadTest(UstarReadTest):
tarname = gzipname
mode = "r:gz"
class Bz2MiscReadTest(MiscReadTest):
tarname = bz2name
mode = "r:bz2"
+ taropen = tarfile.TarFile.bz2open
class Bz2UstarReadTest(UstarReadTest):
tarname = bz2name
mode = "r:bz2"