14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""Tests for distutils.command.build_py.""" 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport os 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport sys 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport StringIO 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom distutils.command.build_py import build_py 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom distutils.core import Distribution 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom distutils.errors import DistutilsFileError 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom distutils.tests import support 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test.test_support import run_unittest 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass BuildPyTestCase(support.TempdirManager, 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm support.LoggingSilencer, 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unittest.TestCase): 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_package_data(self): 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sources = self.mkdtemp() 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm f = open(os.path.join(sources, "__init__.py"), "w") 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm f.write("# Pretend this is a package.") 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm f.close() 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm f = open(os.path.join(sources, "README.txt"), "w") 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm f.write("Info about this package") 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm f.close() 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm destination = self.mkdtemp() 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dist = Distribution({"packages": ["pkg"], 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "package_dir": {"pkg": sources}}) 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # script_name need not exist, it just need to be initialized 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dist.script_name = os.path.join(sources, "setup.py") 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dist.command_obj["build"] = support.DummyCommand( 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm force=0, 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm build_lib=destination) 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dist.packages = ["pkg"] 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dist.package_data = {"pkg": ["README.txt"]} 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dist.package_dir = {"pkg": sources} 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cmd = build_py(dist) 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cmd.compile = 1 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cmd.ensure_finalized() 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(cmd.package_data, dist.package_data) 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cmd.run() 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # This makes sure the list of outputs includes byte-compiled 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # files for Python modules but not for package data files 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # (there shouldn't *be* byte-code files for those!). 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(cmd.get_outputs()), 3) 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pkgdest = os.path.join(destination, "pkg") 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm files = os.listdir(pkgdest) 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIn("__init__.py", files) 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIn("README.txt", files) 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # XXX even with -O, distutils writes pyc, not pyo; bug? 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if sys.dont_write_bytecode: 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn("__init__.pyc", files) 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIn("__init__.pyc", files) 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_empty_package_dir(self): 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # See SF 1668596/1720897. 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cwd = os.getcwd() 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # create the distribution files. 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sources = self.mkdtemp() 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm open(os.path.join(sources, "__init__.py"), "w").close() 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm testdir = os.path.join(sources, "doc") 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.mkdir(testdir) 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm open(os.path.join(testdir, "testfile"), "w").close() 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(sources) 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm old_stdout = sys.stdout 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.stdout = StringIO.StringIO() 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dist = Distribution({"packages": ["pkg"], 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "package_dir": {"pkg": ""}, 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "package_data": {"pkg": ["doc/*"]}}) 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # script_name need not exist, it just need to be initialized 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dist.script_name = os.path.join(sources, "setup.py") 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dist.script_args = ["build"] 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dist.parse_command_line() 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dist.run_commands() 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except DistutilsFileError: 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail("failed package_data test when package_dir is ''") 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Restore state. 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm os.chdir(cwd) 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.stdout = old_stdout 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_dont_write_bytecode(self): 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # makes sure byte_compile is not used 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pkg_dir, dist = self.create_dist() 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cmd = build_py(dist) 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cmd.compile = 1 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cmd.optimize = 1 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm old_dont_write_bytecode = sys.dont_write_bytecode 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.dont_write_bytecode = True 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cmd.byte_compile([]) 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.dont_write_bytecode = old_dont_write_bytecode 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIn('byte-compiling is disabled', self.logs[0][1]) 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_suite(): 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return unittest.makeSuite(BuildPyTestCase) 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == "__main__": 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm run_unittest(test_suite()) 123