Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 287d939

Browse filesBrowse files
gh-118148: Improve tests for shutil.make_archive() (GH-118149)
1 parent a6647d1 commit 287d939
Copy full SHA for 287d939

File tree

Expand file treeCollapse file tree

1 file changed

+176
-71
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+176
-71
lines changed

‎Lib/test/test_shutil.py

Copy file name to clipboardExpand all lines: Lib/test/test_shutil.py
+176-71Lines changed: 176 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1615,42 +1615,6 @@ class TestArchives(BaseTest, unittest.TestCase):
16151615

16161616
### shutil.make_archive
16171617

1618-
@support.requires_zlib()
1619-
def test_make_tarball(self):
1620-
# creating something to tar
1621-
root_dir, base_dir = self._create_files('')
1622-
1623-
tmpdir2 = self.mkdtemp()
1624-
# force shutil to create the directory
1625-
os.rmdir(tmpdir2)
1626-
# working with relative paths
1627-
work_dir = os.path.dirname(tmpdir2)
1628-
rel_base_name = os.path.join(os.path.basename(tmpdir2), 'archive')
1629-
1630-
with os_helper.change_cwd(work_dir), no_chdir:
1631-
base_name = os.path.abspath(rel_base_name)
1632-
tarball = make_archive(rel_base_name, 'gztar', root_dir, '.')
1633-
1634-
# check if the compressed tarball was created
1635-
self.assertEqual(tarball, base_name + '.tar.gz')
1636-
self.assertTrue(os.path.isfile(tarball))
1637-
self.assertTrue(tarfile.is_tarfile(tarball))
1638-
with tarfile.open(tarball, 'r:gz') as tf:
1639-
self.assertCountEqual(tf.getnames(),
1640-
['.', './sub', './sub2',
1641-
'./file1', './file2', './sub/file3'])
1642-
1643-
# trying an uncompressed one
1644-
with os_helper.change_cwd(work_dir), no_chdir:
1645-
tarball = make_archive(rel_base_name, 'tar', root_dir, '.')
1646-
self.assertEqual(tarball, base_name + '.tar')
1647-
self.assertTrue(os.path.isfile(tarball))
1648-
self.assertTrue(tarfile.is_tarfile(tarball))
1649-
with tarfile.open(tarball, 'r') as tf:
1650-
self.assertCountEqual(tf.getnames(),
1651-
['.', './sub', './sub2',
1652-
'./file1', './file2', './sub/file3'])
1653-
16541618
def _tarinfo(self, path):
16551619
with tarfile.open(path) as tar:
16561620
names = tar.getnames()
@@ -1671,6 +1635,92 @@ def _create_files(self, base_dir='dist'):
16711635
write_file((root_dir, 'outer'), 'xxx')
16721636
return root_dir, base_dir
16731637

1638+
@support.requires_zlib()
1639+
def test_make_tarfile(self):
1640+
root_dir, base_dir = self._create_files()
1641+
# Test without base_dir.
1642+
with os_helper.temp_cwd(), no_chdir:
1643+
base_name = os.path.join('dst', 'archive')
1644+
archive = make_archive(base_name, 'tar', root_dir)
1645+
# check if the compressed tarball was created
1646+
self.assertEqual(archive, os.path.abspath(base_name) + '.tar')
1647+
self.assertTrue(os.path.isfile(archive))
1648+
self.assertTrue(tarfile.is_tarfile(archive))
1649+
with tarfile.open(archive, 'r') as tf:
1650+
self.assertCountEqual(tf.getnames(),
1651+
['.', './dist', './dist/sub', './dist/sub2',
1652+
'./dist/file1', './dist/file2', './dist/sub/file3',
1653+
'./outer'])
1654+
1655+
# Test with base_dir.
1656+
with os_helper.temp_cwd(), no_chdir:
1657+
base_name = os.path.join('dst2', 'archive')
1658+
archive = make_archive(base_name, 'tar', root_dir, base_dir)
1659+
self.assertEqual(archive, os.path.abspath(base_name) + '.tar')
1660+
# check if the uncompressed tarball was created
1661+
self.assertTrue(os.path.isfile(archive))
1662+
self.assertTrue(tarfile.is_tarfile(archive))
1663+
with tarfile.open(archive, 'r') as tf:
1664+
self.assertCountEqual(tf.getnames(),
1665+
['dist', 'dist/sub', 'dist/sub2',
1666+
'dist/file1', 'dist/file2', 'dist/sub/file3'])
1667+
1668+
# Test with multi-component base_dir.
1669+
with os_helper.temp_cwd(), no_chdir:
1670+
base_name = os.path.join('dst3', 'archive')
1671+
archive = make_archive(base_name, 'tar', root_dir,
1672+
os.path.join(base_dir, 'sub'))
1673+
self.assertEqual(archive, os.path.abspath(base_name) + '.tar')
1674+
self.assertTrue(os.path.isfile(archive))
1675+
self.assertTrue(tarfile.is_tarfile(archive))
1676+
with tarfile.open(archive, 'r') as tf:
1677+
self.assertCountEqual(tf.getnames(),
1678+
['dist/sub', 'dist/sub/file3'])
1679+
1680+
@support.requires_zlib()
1681+
def test_make_tarfile_without_rootdir(self):
1682+
root_dir, base_dir = self._create_files()
1683+
# Test without base_dir.
1684+
base_name = os.path.join(self.mkdtemp(), 'dst', 'archive')
1685+
base_name = os.path.relpath(base_name, root_dir)
1686+
with os_helper.change_cwd(root_dir), no_chdir:
1687+
archive = make_archive(base_name, 'gztar')
1688+
self.assertEqual(archive, base_name + '.tar.gz')
1689+
self.assertTrue(os.path.isfile(archive))
1690+
self.assertTrue(tarfile.is_tarfile(archive))
1691+
with tarfile.open(archive, 'r:gz') as tf:
1692+
self.assertCountEqual(tf.getnames(),
1693+
['.', './dist', './dist/sub', './dist/sub2',
1694+
'./dist/file1', './dist/file2', './dist/sub/file3',
1695+
'./outer'])
1696+
1697+
# Test with base_dir.
1698+
with os_helper.change_cwd(root_dir), no_chdir:
1699+
base_name = os.path.join('dst', 'archive')
1700+
archive = make_archive(base_name, 'tar', base_dir=base_dir)
1701+
self.assertEqual(archive, base_name + '.tar')
1702+
self.assertTrue(os.path.isfile(archive))
1703+
self.assertTrue(tarfile.is_tarfile(archive))
1704+
with tarfile.open(archive, 'r') as tf:
1705+
self.assertCountEqual(tf.getnames(),
1706+
['dist', 'dist/sub', 'dist/sub2',
1707+
'dist/file1', 'dist/file2', 'dist/sub/file3'])
1708+
1709+
def test_make_tarfile_with_explicit_curdir(self):
1710+
# Test with base_dir=os.curdir.
1711+
root_dir, base_dir = self._create_files()
1712+
with os_helper.temp_cwd(), no_chdir:
1713+
base_name = os.path.join('dst', 'archive')
1714+
archive = make_archive(base_name, 'tar', root_dir, os.curdir)
1715+
self.assertEqual(archive, os.path.abspath(base_name) + '.tar')
1716+
self.assertTrue(os.path.isfile(archive))
1717+
self.assertTrue(tarfile.is_tarfile(archive))
1718+
with tarfile.open(archive, 'r') as tf:
1719+
self.assertCountEqual(tf.getnames(),
1720+
['.', './dist', './dist/sub', './dist/sub2',
1721+
'./dist/file1', './dist/file2', './dist/sub/file3',
1722+
'./outer'])
1723+
16741724
@support.requires_zlib()
16751725
@unittest.skipUnless(shutil.which('tar'),
16761726
'Need the tar command to run')
@@ -1720,40 +1770,89 @@ def test_tarfile_vs_tar(self):
17201770

17211771
@support.requires_zlib()
17221772
def test_make_zipfile(self):
1723-
# creating something to zip
17241773
root_dir, base_dir = self._create_files()
1774+
# Test without base_dir.
1775+
with os_helper.temp_cwd(), no_chdir:
1776+
base_name = os.path.join('dst', 'archive')
1777+
archive = make_archive(base_name, 'zip', root_dir)
1778+
self.assertEqual(archive, os.path.abspath(base_name) + '.zip')
1779+
self.assertTrue(os.path.isfile(archive))
1780+
self.assertTrue(zipfile.is_zipfile(archive))
1781+
with zipfile.ZipFile(archive) as zf:
1782+
self.assertCountEqual(zf.namelist(),
1783+
['dist/', 'dist/sub/', 'dist/sub2/',
1784+
'dist/file1', 'dist/file2', 'dist/sub/file3',
1785+
'outer'])
1786+
1787+
# Test with base_dir.
1788+
with os_helper.temp_cwd(), no_chdir:
1789+
base_name = os.path.join('dst2', 'archive')
1790+
archive = make_archive(base_name, 'zip', root_dir, base_dir)
1791+
self.assertEqual(archive, os.path.abspath(base_name) + '.zip')
1792+
self.assertTrue(os.path.isfile(archive))
1793+
self.assertTrue(zipfile.is_zipfile(archive))
1794+
with zipfile.ZipFile(archive) as zf:
1795+
self.assertCountEqual(zf.namelist(),
1796+
['dist/', 'dist/sub/', 'dist/sub2/',
1797+
'dist/file1', 'dist/file2', 'dist/sub/file3'])
1798+
1799+
# Test with multi-component base_dir.
1800+
with os_helper.temp_cwd(), no_chdir:
1801+
base_name = os.path.join('dst3', 'archive')
1802+
archive = make_archive(base_name, 'zip', root_dir,
1803+
os.path.join(base_dir, 'sub'))
1804+
self.assertEqual(archive, os.path.abspath(base_name) + '.zip')
1805+
self.assertTrue(os.path.isfile(archive))
1806+
self.assertTrue(zipfile.is_zipfile(archive))
1807+
with zipfile.ZipFile(archive) as zf:
1808+
self.assertCountEqual(zf.namelist(),
1809+
['dist/sub/', 'dist/sub/file3'])
17251810

1726-
tmpdir2 = self.mkdtemp()
1727-
# force shutil to create the directory
1728-
os.rmdir(tmpdir2)
1729-
# working with relative paths
1730-
work_dir = os.path.dirname(tmpdir2)
1731-
rel_base_name = os.path.join(os.path.basename(tmpdir2), 'archive')
1732-
1733-
with os_helper.change_cwd(work_dir), no_chdir:
1734-
base_name = os.path.abspath(rel_base_name)
1735-
res = make_archive(rel_base_name, 'zip', root_dir)
1811+
@support.requires_zlib()
1812+
def test_make_zipfile_without_rootdir(self):
1813+
root_dir, base_dir = self._create_files()
1814+
# Test without base_dir.
1815+
base_name = os.path.join(self.mkdtemp(), 'dst', 'archive')
1816+
base_name = os.path.relpath(base_name, root_dir)
1817+
with os_helper.change_cwd(root_dir), no_chdir:
1818+
archive = make_archive(base_name, 'zip')
1819+
self.assertEqual(archive, base_name + '.zip')
1820+
self.assertTrue(os.path.isfile(archive))
1821+
self.assertTrue(zipfile.is_zipfile(archive))
1822+
with zipfile.ZipFile(archive) as zf:
1823+
self.assertCountEqual(zf.namelist(),
1824+
['dist/', 'dist/sub/', 'dist/sub2/',
1825+
'dist/file1', 'dist/file2', 'dist/sub/file3',
1826+
'outer'])
1827+
1828+
# Test with base_dir.
1829+
root_dir, base_dir = self._create_files()
1830+
with os_helper.change_cwd(root_dir), no_chdir:
1831+
base_name = os.path.join('dst', 'archive')
1832+
archive = make_archive(base_name, 'zip', base_dir=base_dir)
1833+
self.assertEqual(archive, base_name + '.zip')
1834+
self.assertTrue(os.path.isfile(archive))
1835+
self.assertTrue(zipfile.is_zipfile(archive))
1836+
with zipfile.ZipFile(archive) as zf:
1837+
self.assertCountEqual(zf.namelist(),
1838+
['dist/', 'dist/sub/', 'dist/sub2/',
1839+
'dist/file1', 'dist/file2', 'dist/sub/file3'])
17361840

1737-
self.assertEqual(res, base_name + '.zip')
1738-
self.assertTrue(os.path.isfile(res))
1739-
self.assertTrue(zipfile.is_zipfile(res))
1740-
with zipfile.ZipFile(res) as zf:
1741-
self.assertCountEqual(zf.namelist(),
1742-
['dist/', 'dist/sub/', 'dist/sub2/',
1743-
'dist/file1', 'dist/file2', 'dist/sub/file3',
1744-
'outer'])
1745-
1746-
with os_helper.change_cwd(work_dir), no_chdir:
1747-
base_name = os.path.abspath(rel_base_name)
1748-
res = make_archive(rel_base_name, 'zip', root_dir, base_dir)
1749-
1750-
self.assertEqual(res, base_name + '.zip')
1751-
self.assertTrue(os.path.isfile(res))
1752-
self.assertTrue(zipfile.is_zipfile(res))
1753-
with zipfile.ZipFile(res) as zf:
1754-
self.assertCountEqual(zf.namelist(),
1755-
['dist/', 'dist/sub/', 'dist/sub2/',
1756-
'dist/file1', 'dist/file2', 'dist/sub/file3'])
1841+
@support.requires_zlib()
1842+
def test_make_zipfile_with_explicit_curdir(self):
1843+
# Test with base_dir=os.curdir.
1844+
root_dir, base_dir = self._create_files()
1845+
with os_helper.temp_cwd(), no_chdir:
1846+
base_name = os.path.join('dst', 'archive')
1847+
archive = make_archive(base_name, 'zip', root_dir, os.curdir)
1848+
self.assertEqual(archive, os.path.abspath(base_name) + '.zip')
1849+
self.assertTrue(os.path.isfile(archive))
1850+
self.assertTrue(zipfile.is_zipfile(archive))
1851+
with zipfile.ZipFile(archive) as zf:
1852+
self.assertCountEqual(zf.namelist(),
1853+
['dist/', 'dist/sub/', 'dist/sub2/',
1854+
'dist/file1', 'dist/file2', 'dist/sub/file3',
1855+
'outer'])
17571856

17581857
@support.requires_zlib()
17591858
@unittest.skipUnless(shutil.which('zip'),
@@ -1923,17 +2022,19 @@ def archiver(base_name, base_dir, **kw):
19232022
unregister_archive_format('xxx')
19242023

19252024
def test_make_tarfile_in_curdir(self):
1926-
# Issue #21280
2025+
# Issue #21280: Test with the archive in the current directory.
19272026
root_dir = self.mkdtemp()
19282027
with os_helper.change_cwd(root_dir), no_chdir:
2028+
# root_dir must be None, so the archive path is relative.
19292029
self.assertEqual(make_archive('test', 'tar'), 'test.tar')
19302030
self.assertTrue(os.path.isfile('test.tar'))
19312031

19322032
@support.requires_zlib()
19332033
def test_make_zipfile_in_curdir(self):
1934-
# Issue #21280
2034+
# Issue #21280: Test with the archive in the current directory.
19352035
root_dir = self.mkdtemp()
19362036
with os_helper.change_cwd(root_dir), no_chdir:
2037+
# root_dir must be None, so the archive path is relative.
19372038
self.assertEqual(make_archive('test', 'zip'), 'test.zip')
19382039
self.assertTrue(os.path.isfile('test.zip'))
19392040

@@ -1954,10 +2055,11 @@ def test_register_archive_format(self):
19542055
self.assertNotIn('xxx', formats)
19552056

19562057
def test_make_tarfile_rootdir_nodir(self):
1957-
# GH-99203
2058+
# GH-99203: Test with root_dir is not a real directory.
19582059
self.addCleanup(os_helper.unlink, f'{TESTFN}.tar')
19592060
for dry_run in (False, True):
19602061
with self.subTest(dry_run=dry_run):
2062+
# root_dir does not exist.
19612063
tmp_dir = self.mkdtemp()
19622064
nonexisting_file = os.path.join(tmp_dir, 'nonexisting')
19632065
with self.assertRaises(FileNotFoundError) as cm:
@@ -1966,6 +2068,7 @@ def test_make_tarfile_rootdir_nodir(self):
19662068
self.assertEqual(cm.exception.filename, nonexisting_file)
19672069
self.assertFalse(os.path.exists(f'{TESTFN}.tar'))
19682070

2071+
# root_dir is a file.
19692072
tmp_fd, tmp_file = tempfile.mkstemp(dir=tmp_dir)
19702073
os.close(tmp_fd)
19712074
with self.assertRaises(NotADirectoryError) as cm:
@@ -1976,10 +2079,11 @@ def test_make_tarfile_rootdir_nodir(self):
19762079

19772080
@support.requires_zlib()
19782081
def test_make_zipfile_rootdir_nodir(self):
1979-
# GH-99203
2082+
# GH-99203: Test with root_dir is not a real directory.
19802083
self.addCleanup(os_helper.unlink, f'{TESTFN}.zip')
19812084
for dry_run in (False, True):
19822085
with self.subTest(dry_run=dry_run):
2086+
# root_dir does not exist.
19832087
tmp_dir = self.mkdtemp()
19842088
nonexisting_file = os.path.join(tmp_dir, 'nonexisting')
19852089
with self.assertRaises(FileNotFoundError) as cm:
@@ -1988,6 +2092,7 @@ def test_make_zipfile_rootdir_nodir(self):
19882092
self.assertEqual(cm.exception.filename, nonexisting_file)
19892093
self.assertFalse(os.path.exists(f'{TESTFN}.zip'))
19902094

2095+
# root_dir is a file.
19912096
tmp_fd, tmp_file = tempfile.mkstemp(dir=tmp_dir)
19922097
os.close(tmp_fd)
19932098
with self.assertRaises(NotADirectoryError) as cm:

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.