| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | """Tests for distutils.command.build_py.""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import sys | 
					
						
							| 
									
										
										
										
											2011-10-08 04:09:15 +02:00
										 |  |  | import imp | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | from packaging.command.build_py import build_py | 
					
						
							|  |  |  | from packaging.dist import Distribution | 
					
						
							|  |  |  | from packaging.errors import PackagingFileError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from packaging.tests import unittest, support | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class BuildPyTestCase(support.TempdirManager, | 
					
						
							|  |  |  |                       support.LoggingCatcher, | 
					
						
							|  |  |  |                       unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_package_data(self): | 
					
						
							|  |  |  |         sources = self.mkdtemp() | 
					
						
							|  |  |  |         pkg_dir = os.path.join(sources, 'pkg') | 
					
						
							|  |  |  |         os.mkdir(pkg_dir) | 
					
						
							|  |  |  |         f = open(os.path.join(pkg_dir, "__init__.py"), "w") | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             f.write("# Pretend this is a package.") | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             f.close() | 
					
						
							| 
									
										
										
										
											2012-02-04 21:43:07 +01:00
										 |  |  |         # let's have two files to make sure globbing works | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  |         f = open(os.path.join(pkg_dir, "README.txt"), "w") | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             f.write("Info about this package") | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             f.close() | 
					
						
							| 
									
										
										
										
											2012-02-04 21:43:07 +01:00
										 |  |  |         f = open(os.path.join(pkg_dir, "HACKING.txt"), "w") | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             f.write("How to contribute") | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             f.close() | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         destination = self.mkdtemp() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         dist = Distribution({"packages": ["pkg"], | 
					
						
							|  |  |  |                              "package_dir": sources}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         dist.command_obj["build"] = support.DummyCommand( | 
					
						
							|  |  |  |             force=False, | 
					
						
							|  |  |  |             build_lib=destination, | 
					
						
							|  |  |  |             use_2to3_fixers=None, | 
					
						
							|  |  |  |             convert_2to3_doctests=None, | 
					
						
							|  |  |  |             use_2to3=False) | 
					
						
							|  |  |  |         dist.packages = ["pkg"] | 
					
						
							| 
									
										
										
										
											2012-02-04 21:43:07 +01:00
										 |  |  |         dist.package_data = {"pkg": ["*.txt"]} | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  |         dist.package_dir = sources | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cmd = build_py(dist) | 
					
						
							|  |  |  |         cmd.compile = True | 
					
						
							|  |  |  |         cmd.ensure_finalized() | 
					
						
							|  |  |  |         self.assertEqual(cmd.package_data, dist.package_data) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cmd.run() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # This makes sure the list of outputs includes byte-compiled | 
					
						
							|  |  |  |         # files for Python modules but not for package data files | 
					
						
							|  |  |  |         # (there shouldn't *be* byte-code files for those!). | 
					
						
							| 
									
										
										
										
											2012-02-04 21:43:07 +01:00
										 |  |  |         # FIXME the test below is not doing what the comment above says, and | 
					
						
							|  |  |  |         # if it did it would show a code bug: if we add a demo.py file to | 
					
						
							|  |  |  |         # package_data, it gets byte-compiled! | 
					
						
							|  |  |  |         outputs = cmd.get_outputs() | 
					
						
							|  |  |  |         self.assertEqual(len(outputs), 4, outputs) | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  |         pkgdest = os.path.join(destination, "pkg") | 
					
						
							|  |  |  |         files = os.listdir(pkgdest) | 
					
						
							| 
									
										
										
										
											2011-10-08 04:09:15 +02:00
										 |  |  |         pycache_dir = os.path.join(pkgdest, "__pycache__") | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  |         self.assertIn("__init__.py", files) | 
					
						
							|  |  |  |         self.assertIn("README.txt", files) | 
					
						
							| 
									
										
										
										
											2012-02-04 21:43:07 +01:00
										 |  |  |         self.assertIn("HACKING.txt", files) | 
					
						
							| 
									
										
										
										
											2011-11-03 05:08:28 +01:00
										 |  |  |         pyc_files = os.listdir(pycache_dir) | 
					
						
							| 
									
										
										
										
											2012-02-04 21:43:07 +01:00
										 |  |  |         self.assertEqual(["__init__.%s.pyc" % imp.get_tag()], pyc_files) | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_empty_package_dir(self): | 
					
						
							|  |  |  |         # See SF 1668596/1720897. | 
					
						
							|  |  |  |         # create the distribution files. | 
					
						
							|  |  |  |         sources = self.mkdtemp() | 
					
						
							|  |  |  |         pkg = os.path.join(sources, 'pkg') | 
					
						
							|  |  |  |         os.mkdir(pkg) | 
					
						
							| 
									
										
										
										
											2011-05-19 15:52:59 +02:00
										 |  |  |         open(os.path.join(pkg, "__init__.py"), "wb").close() | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  |         testdir = os.path.join(pkg, "doc") | 
					
						
							|  |  |  |         os.mkdir(testdir) | 
					
						
							| 
									
										
										
										
											2011-05-19 15:52:59 +02:00
										 |  |  |         open(os.path.join(testdir, "testfile"), "wb").close() | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         os.chdir(sources) | 
					
						
							| 
									
										
										
										
											2011-11-06 11:32:47 +01:00
										 |  |  |         dist = Distribution({"packages": ["pkg"], | 
					
						
							|  |  |  |                              "package_dir": sources, | 
					
						
							|  |  |  |                              "package_data": {"pkg": ["doc/*"]}}) | 
					
						
							|  |  |  |         dist.script_args = ["build"] | 
					
						
							|  |  |  |         dist.parse_command_line() | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2011-11-06 11:32:47 +01:00
										 |  |  |             dist.run_commands() | 
					
						
							|  |  |  |         except PackagingFileError: | 
					
						
							|  |  |  |             self.fail("failed package_data test when package_dir is ''") | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-19 08:18:05 +02:00
										 |  |  |     def test_byte_compile(self): | 
					
						
							|  |  |  |         project_dir, dist = self.create_dist(py_modules=['boiledeggs']) | 
					
						
							|  |  |  |         os.chdir(project_dir) | 
					
						
							|  |  |  |         self.write_file('boiledeggs.py', 'import antigravity') | 
					
						
							|  |  |  |         cmd = build_py(dist) | 
					
						
							|  |  |  |         cmd.compile = True | 
					
						
							|  |  |  |         cmd.build_lib = 'here' | 
					
						
							|  |  |  |         cmd.finalize_options() | 
					
						
							|  |  |  |         cmd.run() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         found = os.listdir(cmd.build_lib) | 
					
						
							|  |  |  |         self.assertEqual(sorted(found), ['__pycache__', 'boiledeggs.py']) | 
					
						
							|  |  |  |         found = os.listdir(os.path.join(cmd.build_lib, '__pycache__')) | 
					
						
							|  |  |  |         self.assertEqual(found, ['boiledeggs.%s.pyc' % imp.get_tag()]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_byte_compile_optimized(self): | 
					
						
							|  |  |  |         project_dir, dist = self.create_dist(py_modules=['boiledeggs']) | 
					
						
							|  |  |  |         os.chdir(project_dir) | 
					
						
							|  |  |  |         self.write_file('boiledeggs.py', 'import antigravity') | 
					
						
							|  |  |  |         cmd = build_py(dist) | 
					
						
							|  |  |  |         cmd.compile = True | 
					
						
							|  |  |  |         cmd.optimize = 1 | 
					
						
							|  |  |  |         cmd.build_lib = 'here' | 
					
						
							|  |  |  |         cmd.finalize_options() | 
					
						
							|  |  |  |         cmd.run() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         found = os.listdir(cmd.build_lib) | 
					
						
							|  |  |  |         self.assertEqual(sorted(found), ['__pycache__', 'boiledeggs.py']) | 
					
						
							|  |  |  |         found = os.listdir(os.path.join(cmd.build_lib, '__pycache__')) | 
					
						
							|  |  |  |         self.assertEqual(sorted(found), ['boiledeggs.%s.pyc' % imp.get_tag(), | 
					
						
							|  |  |  |                                          'boiledeggs.%s.pyo' % imp.get_tag()]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-03 05:08:28 +01:00
										 |  |  |     def test_byte_compile_under_B(self): | 
					
						
							|  |  |  |         # make sure byte compilation works under -B (dont_write_bytecode) | 
					
						
							|  |  |  |         self.addCleanup(setattr, sys, 'dont_write_bytecode', | 
					
						
							|  |  |  |                         sys.dont_write_bytecode) | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  |         sys.dont_write_bytecode = True | 
					
						
							| 
									
										
										
										
											2011-11-03 05:08:28 +01:00
										 |  |  |         self.test_byte_compile() | 
					
						
							|  |  |  |         self.test_byte_compile_optimized() | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-19 08:18:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | def test_suite(): | 
					
						
							|  |  |  |     return unittest.makeSuite(BuildPyTestCase) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     unittest.main(defaultTest="test_suite") |