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