1"""Tests for distutils.command.install_data.""" 2import sys 3import os 4import importlib.util 5import unittest 6 7from distutils.command.install_lib import install_lib 8from distutils.extension import Extension 9from distutils.tests import support 10from distutils.errors import DistutilsOptionError 11from test.support import run_unittest 12 13 14class InstallLibTestCase(support.TempdirManager, 15 support.LoggingSilencer, 16 support.EnvironGuard, 17 unittest.TestCase): 18 19 def test_finalize_options(self): 20 dist = self.create_dist()[1] 21 cmd = install_lib(dist) 22 23 cmd.finalize_options() 24 self.assertEqual(cmd.compile, 1) 25 self.assertEqual(cmd.optimize, 0) 26 27 # optimize must be 0, 1, or 2 28 cmd.optimize = 'foo' 29 self.assertRaises(DistutilsOptionError, cmd.finalize_options) 30 cmd.optimize = '4' 31 self.assertRaises(DistutilsOptionError, cmd.finalize_options) 32 33 cmd.optimize = '2' 34 cmd.finalize_options() 35 self.assertEqual(cmd.optimize, 2) 36 37 @unittest.skipIf(sys.dont_write_bytecode, 'byte-compile disabled') 38 def test_byte_compile(self): 39 project_dir, dist = self.create_dist() 40 os.chdir(project_dir) 41 cmd = install_lib(dist) 42 cmd.compile = cmd.optimize = 1 43 44 f = os.path.join(project_dir, 'foo.py') 45 self.write_file(f, '# python file') 46 cmd.byte_compile([f]) 47 pyc_file = importlib.util.cache_from_source('foo.py', optimization='') 48 pyc_opt_file = importlib.util.cache_from_source('foo.py', 49 optimization=cmd.optimize) 50 self.assertTrue(os.path.exists(pyc_file)) 51 self.assertTrue(os.path.exists(pyc_opt_file)) 52 53 def test_get_outputs(self): 54 project_dir, dist = self.create_dist() 55 os.chdir(project_dir) 56 os.mkdir('spam') 57 cmd = install_lib(dist) 58 59 # setting up a dist environment 60 cmd.compile = cmd.optimize = 1 61 cmd.install_dir = self.mkdtemp() 62 f = os.path.join(project_dir, 'spam', '__init__.py') 63 self.write_file(f, '# python package') 64 cmd.distribution.ext_modules = [Extension('foo', ['xxx'])] 65 cmd.distribution.packages = ['spam'] 66 cmd.distribution.script_name = 'setup.py' 67 68 # Create rubbish, uncompilable file 69 f = os.path.join(project_dir, 'spam', 'rubbish.py') 70 self.write_file(f, 'rubbish()') 71 72 # get_outputs should return 4 elements: spam/__init__.py and .pyc, 73 # foo.import-tag-abiflags.so / foo.pyd and rubbish.py (no .pyc) 74 outputs = cmd.get_outputs() 75 self.assertEqual(len(outputs), 5, outputs) 76 77 def test_get_inputs(self): 78 project_dir, dist = self.create_dist() 79 os.chdir(project_dir) 80 os.mkdir('spam') 81 cmd = install_lib(dist) 82 83 # setting up a dist environment 84 cmd.compile = cmd.optimize = 1 85 cmd.install_dir = self.mkdtemp() 86 f = os.path.join(project_dir, 'spam', '__init__.py') 87 self.write_file(f, '# python package') 88 cmd.distribution.ext_modules = [Extension('foo', ['xxx'])] 89 cmd.distribution.packages = ['spam'] 90 cmd.distribution.script_name = 'setup.py' 91 92 # get_inputs should return 2 elements: spam/__init__.py and 93 # foo.import-tag-abiflags.so / foo.pyd 94 inputs = cmd.get_inputs() 95 self.assertEqual(len(inputs), 2, inputs) 96 97 def test_dont_write_bytecode(self): 98 # makes sure byte_compile is not used 99 dist = self.create_dist()[1] 100 cmd = install_lib(dist) 101 cmd.compile = 1 102 cmd.optimize = 1 103 104 old_dont_write_bytecode = sys.dont_write_bytecode 105 sys.dont_write_bytecode = True 106 try: 107 cmd.byte_compile([]) 108 finally: 109 sys.dont_write_bytecode = old_dont_write_bytecode 110 111 self.assertIn('byte-compiling is disabled', 112 self.logs[0][1] % self.logs[0][2]) 113 114 115def test_suite(): 116 return unittest.makeSuite(InstallLibTestCase) 117 118if __name__ == "__main__": 119 run_unittest(test_suite()) 120