Skip to content

Commit 7d2b5a0

Browse files
committed
fix(open): support plain .tar archives in Opener
- include 'tar' in ARCHIVES detection\n- use tarfile mode 'r:' for uncompressed tar files\n- add regression tests for plain tar extraction
1 parent a7059c8 commit 7d2b5a0

2 files changed

Lines changed: 42 additions & 2 deletions

File tree

cache_manager/_open.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from cache_manager._session import _log
2121

2222
COMPRESSED = {'gz', 'xz', 'bz2'}
23-
ARCHIVES = {'zip', 'tar.gz', 'tar.bz2', 'tar.xz'}
23+
ARCHIVES = {'zip', 'tar', 'tar.gz', 'tar.bz2', 'tar.xz'}
2424

2525

2626
class Opener:
@@ -239,7 +239,8 @@ def open_tar(self):
239239
self._files = {}
240240
self.sizes = {}
241241
compr = self.ext.split('.')[-1]
242-
self.tarfile = tarfile.open(fileobj=self.fileobj, mode=f'r:{compr}')
242+
mode = 'r:' if self.ext == 'tar' or compr == 'tar' else f'r:{compr}'
243+
self.tarfile = tarfile.open(fileobj=self.fileobj, mode=mode)
243244
self._members = self.tarfile.getmembers()
244245

245246
for m in self._members:

tests/test_open.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,23 @@ def temp_tar_gz_file(tmpdir):
2828
return gz_path
2929

3030

31+
@pytest.fixture
32+
def temp_tar_file(tmpdir):
33+
34+
subfolder = tmpdir.mkdir('subfolder_plain_tar')
35+
file1 = subfolder.join('file1.txt')
36+
file2 = subfolder.join('file2.txt')
37+
file1.write('This is the first file.')
38+
file2.write('This is the second file.')
39+
40+
tar_path = tmpdir.join('archive.tar')
41+
42+
with tarfile.open(tar_path, 'w:') as tar:
43+
tar.add(subfolder.strpath, arcname=os.path.basename(subfolder.strpath))
44+
45+
return tar_path
46+
47+
3148
@pytest.fixture
3249
def temp_xz_file(tmpdir):
3350

@@ -138,3 +155,25 @@ def test_open_tar_gz(temp_tar_gz_file):
138155
opener = _open.Opener(temp_tar_gz_file.strpath, large = False)
139156

140157
assert opener.result['subfolder/file1.txt'] == b'This is the first file.'
158+
159+
160+
def test_open_plain_tar(temp_tar_file):
161+
162+
opener = _open.Opener(temp_tar_file.strpath, ext='tar')
163+
164+
assert isinstance(opener.result, dict)
165+
assert set(opener.result.keys()) == {
166+
'subfolder_plain_tar/file1.txt',
167+
'subfolder_plain_tar/file2.txt',
168+
}
169+
assert (
170+
opener.result['subfolder_plain_tar/file1.txt'].read() ==
171+
b'This is the first file.'
172+
)
173+
174+
opener = _open.Opener(temp_tar_file.strpath, ext='tar', large=False)
175+
176+
assert (
177+
opener.result['subfolder_plain_tar/file2.txt'] ==
178+
b'This is the second file.'
179+
)

0 commit comments

Comments
 (0)