Skip to content

Commit a3ec3ad

Browse files
authored
bpo-40275: More lazy imports in test.support (GH-20131)
Make the the following imports lazy in test.support: * bz2 * gzip * lzma * resource * zlib The following test.support decorators now need to be called with parenthesis: * @support.requires_bz2 * @support.requires_gzip * @support.requires_lzma * @support.requires_zlib For example, "@requires_zlib" becomes "@requires_zlib()".
1 parent ced4e5c commit a3ec3ad

10 files changed

+81
-77
lines changed

Lib/test/support/__init__.py

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -28,31 +28,6 @@
2828

2929
from .testresult import get_test_runner
3030

31-
try:
32-
import zlib
33-
except ImportError:
34-
zlib = None
35-
36-
try:
37-
import gzip
38-
except ImportError:
39-
gzip = None
40-
41-
try:
42-
import bz2
43-
except ImportError:
44-
bz2 = None
45-
46-
try:
47-
import lzma
48-
except ImportError:
49-
lzma = None
50-
51-
try:
52-
import resource
53-
except ImportError:
54-
resource = None
55-
5631
__all__ = [
5732
# globals
5833
"PIPE_MAX_SIZE", "verbose", "max_memuse", "use_resources", "failfast",
@@ -705,13 +680,33 @@ def dec(*args, **kwargs):
705680
float.__getformat__("double").startswith("IEEE"),
706681
"test requires IEEE 754 doubles")
707682

708-
requires_zlib = unittest.skipUnless(zlib, 'requires zlib')
683+
def requires_zlib(reason='requires zlib'):
684+
try:
685+
import zlib
686+
except ImportError:
687+
zlib = None
688+
return unittest.skipUnless(zlib, reason)
709689

710-
requires_gzip = unittest.skipUnless(gzip, 'requires gzip')
690+
def requires_gzip(reason='requires gzip'):
691+
try:
692+
import gzip
693+
except ImportError:
694+
gzip = None
695+
return unittest.skipUnless(gzip, reason)
711696

712-
requires_bz2 = unittest.skipUnless(bz2, 'requires bz2')
697+
def requires_bz2(reason='requires bz2'):
698+
try:
699+
import bz2
700+
except ImportError:
701+
bz2 = None
702+
return unittest.skipUnless(bz2, reason)
713703

714-
requires_lzma = unittest.skipUnless(lzma, 'requires lzma')
704+
def requires_lzma(reason='requires lzma'):
705+
try:
706+
import lzma
707+
except ImportError:
708+
lzma = None
709+
return unittest.skipUnless(lzma, reason)
715710

716711
is_jython = sys.platform.startswith('java')
717712

@@ -1062,6 +1057,10 @@ def check_syntax_warning(testcase, statement, errtext='', *, lineno=1, offset=No
10621057

10631058
def open_urlresource(url, *args, **kw):
10641059
import urllib.request, urllib.parse
1060+
try:
1061+
import gzip
1062+
except ImportError:
1063+
gzip = None
10651064

10661065
check = kw.pop('check', None)
10671066

@@ -2579,11 +2578,16 @@ def __enter__(self):
25792578
self.old_modes[report_type] = old_mode, old_file
25802579

25812580
else:
2582-
if resource is not None:
2581+
try:
2582+
import resource
2583+
self.resource = resource
2584+
except ImportError:
2585+
self.resource = None
2586+
if self.resource is not None:
25832587
try:
2584-
self.old_value = resource.getrlimit(resource.RLIMIT_CORE)
2585-
resource.setrlimit(resource.RLIMIT_CORE,
2586-
(0, self.old_value[1]))
2588+
self.old_value = self.resource.getrlimit(self.resource.RLIMIT_CORE)
2589+
self.resource.setrlimit(self.resource.RLIMIT_CORE,
2590+
(0, self.old_value[1]))
25872591
except (ValueError, OSError):
25882592
pass
25892593

@@ -2621,9 +2625,9 @@ def __exit__(self, *ignore_exc):
26212625
msvcrt.CrtSetReportMode(report_type, old_mode)
26222626
msvcrt.CrtSetReportFile(report_type, old_file)
26232627
else:
2624-
if resource is not None:
2628+
if self.resource is not None:
26252629
try:
2626-
resource.setrlimit(resource.RLIMIT_CORE, self.old_value)
2630+
self.resource.setrlimit(self.resource.RLIMIT_CORE, self.old_value)
26272631
except (ValueError, OSError):
26282632
pass
26292633

Lib/test/test_importlib/test_zip.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from test.support import requires_zlib
1111

1212

13-
@requires_zlib
13+
@requires_zlib()
1414
class TestZip(unittest.TestCase):
1515
root = 'test.test_importlib.data'
1616

@@ -50,7 +50,7 @@ def test_files(self):
5050
assert '.whl/' in path, path
5151

5252

53-
@requires_zlib
53+
@requires_zlib()
5454
class TestEgg(TestZip):
5555
def setUp(self):
5656
# Find the path to the example-*.egg so we can add it to the front of

Lib/test/test_logging.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5076,7 +5076,7 @@ def rotator(self, source, dest):
50765076
self.assertFalse(os.path.exists(rh.namer(self.fn + ".1")))
50775077
rh.close()
50785078

5079-
@support.requires_zlib
5079+
@support.requires_zlib()
50805080
def test_rotator(self):
50815081
def namer(name):
50825082
return name + ".gz"

Lib/test/test_shutil.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1246,7 +1246,7 @@ class TestArchives(BaseTest, unittest.TestCase):
12461246

12471247
### shutil.make_archive
12481248

1249-
@support.requires_zlib
1249+
@support.requires_zlib()
12501250
def test_make_tarball(self):
12511251
# creating something to tar
12521252
root_dir, base_dir = self._create_files('')
@@ -1302,7 +1302,7 @@ def _create_files(self, base_dir='dist'):
13021302
write_file((root_dir, 'outer'), 'xxx')
13031303
return root_dir, base_dir
13041304

1305-
@support.requires_zlib
1305+
@support.requires_zlib()
13061306
@unittest.skipUnless(shutil.which('tar'),
13071307
'Need the tar command to run')
13081308
def test_tarfile_vs_tar(self):
@@ -1335,7 +1335,7 @@ def test_tarfile_vs_tar(self):
13351335
self.assertEqual(tarball, base_name + '.tar')
13361336
self.assertTrue(os.path.isfile(tarball))
13371337

1338-
@support.requires_zlib
1338+
@support.requires_zlib()
13391339
def test_make_zipfile(self):
13401340
# creating something to zip
13411341
root_dir, base_dir = self._create_files()
@@ -1372,7 +1372,7 @@ def test_make_zipfile(self):
13721372
['dist/', 'dist/sub/', 'dist/sub2/',
13731373
'dist/file1', 'dist/file2', 'dist/sub/file3'])
13741374

1375-
@support.requires_zlib
1375+
@support.requires_zlib()
13761376
@unittest.skipUnless(shutil.which('zip'),
13771377
'Need the zip command to run')
13781378
def test_zipfile_vs_zip(self):
@@ -1398,7 +1398,7 @@ def test_zipfile_vs_zip(self):
13981398
names2 = zf.namelist()
13991399
self.assertEqual(sorted(names), sorted(names2))
14001400

1401-
@support.requires_zlib
1401+
@support.requires_zlib()
14021402
@unittest.skipUnless(shutil.which('unzip'),
14031403
'Need the unzip command to run')
14041404
def test_unzip_zipfile(self):
@@ -1427,7 +1427,7 @@ def test_make_archive(self):
14271427
base_name = os.path.join(tmpdir, 'archive')
14281428
self.assertRaises(ValueError, make_archive, base_name, 'xxx')
14291429

1430-
@support.requires_zlib
1430+
@support.requires_zlib()
14311431
def test_make_archive_owner_group(self):
14321432
# testing make_archive with owner and group, with various combinations
14331433
# this works even if there's not gid/uid support
@@ -1455,7 +1455,7 @@ def test_make_archive_owner_group(self):
14551455
self.assertTrue(os.path.isfile(res))
14561456

14571457

1458-
@support.requires_zlib
1458+
@support.requires_zlib()
14591459
@unittest.skipUnless(UID_GID_SUPPORT, "Requires grp and pwd support")
14601460
def test_tarfile_root_owner(self):
14611461
root_dir, base_dir = self._create_files()
@@ -1500,7 +1500,7 @@ def test_make_tarfile_in_curdir(self):
15001500
self.assertEqual(make_archive('test', 'tar'), 'test.tar')
15011501
self.assertTrue(os.path.isfile('test.tar'))
15021502

1503-
@support.requires_zlib
1503+
@support.requires_zlib()
15041504
def test_make_zipfile_in_curdir(self):
15051505
# Issue #21280
15061506
root_dir = self.mkdtemp()
@@ -1555,20 +1555,20 @@ def check_unpack_archive_with_converter(self, format, converter):
15551555
def test_unpack_archive_tar(self):
15561556
self.check_unpack_archive('tar')
15571557

1558-
@support.requires_zlib
1558+
@support.requires_zlib()
15591559
def test_unpack_archive_gztar(self):
15601560
self.check_unpack_archive('gztar')
15611561

1562-
@support.requires_bz2
1562+
@support.requires_bz2()
15631563
def test_unpack_archive_bztar(self):
15641564
self.check_unpack_archive('bztar')
15651565

1566-
@support.requires_lzma
1566+
@support.requires_lzma()
15671567
@unittest.skipIf(AIX and not _maxdataOK(), "AIX MAXDATA must be 0x20000000 or larger")
15681568
def test_unpack_archive_xztar(self):
15691569
self.check_unpack_archive('xztar')
15701570

1571-
@support.requires_zlib
1571+
@support.requires_zlib()
15721572
def test_unpack_archive_zip(self):
15731573
self.check_unpack_archive('zip')
15741574

Lib/test/test_tarfile.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,21 +57,21 @@ class TarTest:
5757
def mode(self):
5858
return self.prefix + self.suffix
5959

60-
@support.requires_gzip
60+
@support.requires_gzip()
6161
class GzipTest:
6262
tarname = gzipname
6363
suffix = 'gz'
6464
open = gzip.GzipFile if gzip else None
6565
taropen = tarfile.TarFile.gzopen
6666

67-
@support.requires_bz2
67+
@support.requires_bz2()
6868
class Bz2Test:
6969
tarname = bz2name
7070
suffix = 'bz2'
7171
open = bz2.BZ2File if bz2 else None
7272
taropen = tarfile.TarFile.bz2open
7373

74-
@support.requires_lzma
74+
@support.requires_lzma()
7575
class LzmaTest:
7676
tarname = xzname
7777
suffix = 'xz'

Lib/test/test_venv.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ def do_test_with_pip(self, system_site_packages):
530530

531531
# Issue #26610: pip/pep425tags.py requires ctypes
532532
@unittest.skipUnless(ctypes, 'pip requires ctypes')
533-
@requires_zlib
533+
@requires_zlib()
534534
def test_with_pip(self):
535535
self.do_test_with_pip(False)
536536
self.do_test_with_pip(True)

Lib/test/test_zipapp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ def test_create_archive_default_target(self):
101101
expected_target = self.tmpdir / 'source.pyz'
102102
self.assertTrue(expected_target.is_file())
103103

104-
@requires_zlib
104+
@requires_zlib()
105105
def test_create_archive_with_compression(self):
106106
# Test packing a directory into a compressed archive.
107107
source = self.tmpdir / 'source'

0 commit comments

Comments
 (0)