test_sdist.py (10609B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\stdlib\distutils\tests\test_sdist.py 2 import os 3 import unittest 4 import shutil 5 import zipfile 6 import tarfile 7 try: 8 import zlib 9 except ImportError: 10 zlib = None 11 12 try: 13 import grp 14 import pwd 15 UID_GID_SUPPORT = True 16 except ImportError: 17 UID_GID_SUPPORT = False 18 19 from os.path import join 20 import sys 21 import tempfile 22 import warnings 23 from test.test_support import check_warnings 24 from test.test_support import captured_stdout 25 from distutils.command.sdist import sdist 26 from distutils.command.sdist import show_formats 27 from distutils.core import Distribution 28 from distutils.tests.test_config import PyPIRCCommandTestCase 29 from distutils.errors import DistutilsExecError, DistutilsOptionError 30 from distutils.spawn import find_executable 31 from distutils.tests import support 32 from distutils.log import WARN 33 from distutils.archive_util import ARCHIVE_FORMATS 34 SETUP_PY = "\nfrom distutils.core import setup\nimport somecode\n\nsetup(name='fake')\n" 35 MANIFEST = '# file GENERATED by distutils, do NOT edit\nREADME\ninroot.txt\nsetup.py\ndata%(sep)sdata.dt\nscripts%(sep)sscript.py\nsome%(sep)sfile.txt\nsome%(sep)sother_file.txt\nsomecode%(sep)s__init__.py\nsomecode%(sep)sdoc.dat\nsomecode%(sep)sdoc.txt\n' 36 37 class SDistTestCase(PyPIRCCommandTestCase): 38 39 def setUp(self): 40 super(SDistTestCase, self).setUp() 41 self.old_path = os.getcwd() 42 os.mkdir(join(self.tmp_dir, 'somecode')) 43 os.mkdir(join(self.tmp_dir, 'dist')) 44 self.write_file((self.tmp_dir, 'README'), 'xxx') 45 self.write_file((self.tmp_dir, 'somecode', '__init__.py'), '#') 46 self.write_file((self.tmp_dir, 'setup.py'), SETUP_PY) 47 os.chdir(self.tmp_dir) 48 49 def tearDown(self): 50 os.chdir(self.old_path) 51 super(SDistTestCase, self).tearDown() 52 53 def get_cmd(self, metadata = None): 54 if metadata is None: 55 metadata = {'name': 'fake', 56 'version': '1.0', 57 'url': 'xxx', 58 'author': 'xxx', 59 'author_email': 'xxx'} 60 dist = Distribution(metadata) 61 dist.script_name = 'setup.py' 62 dist.packages = ['somecode'] 63 dist.include_package_data = True 64 cmd = sdist(dist) 65 cmd.dist_dir = 'dist' 66 67 def _warn(*args): 68 pass 69 70 cmd.warn = _warn 71 return (dist, cmd) 72 73 @unittest.skipUnless(zlib, 'requires zlib') 74 def test_prune_file_list(self): 75 os.mkdir(join(self.tmp_dir, 'somecode', '.svn')) 76 self.write_file((self.tmp_dir, 77 'somecode', 78 '.svn', 79 'ok.py'), 'xxx') 80 os.mkdir(join(self.tmp_dir, 'somecode', '.hg')) 81 self.write_file((self.tmp_dir, 82 'somecode', 83 '.hg', 84 'ok'), 'xxx') 85 os.mkdir(join(self.tmp_dir, 'somecode', '.git')) 86 self.write_file((self.tmp_dir, 87 'somecode', 88 '.git', 89 'ok'), 'xxx') 90 dist, cmd = self.get_cmd() 91 cmd.formats = ['zip'] 92 cmd.ensure_finalized() 93 cmd.run() 94 dist_folder = join(self.tmp_dir, 'dist') 95 files = os.listdir(dist_folder) 96 self.assertEqual(files, ['fake-1.0.zip']) 97 zip_file = zipfile.ZipFile(join(dist_folder, 'fake-1.0.zip')) 98 try: 99 content = zip_file.namelist() 100 finally: 101 zip_file.close() 102 103 self.assertEqual(len(content), 4) 104 105 @unittest.skipUnless(zlib, 'requires zlib') 106 def test_make_distribution(self): 107 if find_executable('tar') is None or find_executable('gzip') is None: 108 return 109 dist, cmd = self.get_cmd() 110 cmd.formats = ['gztar', 'tar'] 111 cmd.ensure_finalized() 112 cmd.run() 113 dist_folder = join(self.tmp_dir, 'dist') 114 result = os.listdir(dist_folder) 115 result.sort() 116 self.assertEqual(result, ['fake-1.0.tar', 'fake-1.0.tar.gz']) 117 os.remove(join(dist_folder, 'fake-1.0.tar')) 118 os.remove(join(dist_folder, 'fake-1.0.tar.gz')) 119 cmd.formats = ['tar', 'gztar'] 120 cmd.ensure_finalized() 121 cmd.run() 122 result = os.listdir(dist_folder) 123 result.sort() 124 self.assertEqual(result, ['fake-1.0.tar', 'fake-1.0.tar.gz']) 125 126 @unittest.skipUnless(zlib, 'requires zlib') 127 def test_add_defaults(self): 128 dist, cmd = self.get_cmd() 129 dist.package_data = {'': ['*.cfg', '*.dat'], 130 'somecode': ['*.txt']} 131 self.write_file((self.tmp_dir, 'somecode', 'doc.txt'), '#') 132 self.write_file((self.tmp_dir, 'somecode', 'doc.dat'), '#') 133 data_dir = join(self.tmp_dir, 'data') 134 os.mkdir(data_dir) 135 self.write_file((data_dir, 'data.dt'), '#') 136 some_dir = join(self.tmp_dir, 'some') 137 os.mkdir(some_dir) 138 self.write_file((self.tmp_dir, 'inroot.txt'), '#') 139 self.write_file((some_dir, 'file.txt'), '#') 140 self.write_file((some_dir, 'other_file.txt'), '#') 141 dist.data_files = [('data', ['data/data.dt', 'inroot.txt', 'notexisting']), 'some/file.txt', 'some/other_file.txt'] 142 script_dir = join(self.tmp_dir, 'scripts') 143 os.mkdir(script_dir) 144 self.write_file((script_dir, 'script.py'), '#') 145 dist.scripts = [join('scripts', 'script.py')] 146 cmd.formats = ['zip'] 147 cmd.use_defaults = True 148 cmd.ensure_finalized() 149 cmd.run() 150 dist_folder = join(self.tmp_dir, 'dist') 151 files = os.listdir(dist_folder) 152 self.assertEqual(files, ['fake-1.0.zip']) 153 zip_file = zipfile.ZipFile(join(dist_folder, 'fake-1.0.zip')) 154 try: 155 content = zip_file.namelist() 156 finally: 157 zip_file.close() 158 159 self.assertEqual(len(content), 11) 160 f = open(join(self.tmp_dir, 'MANIFEST')) 161 try: 162 manifest = f.read() 163 self.assertEqual(manifest, MANIFEST % {'sep': os.sep}) 164 finally: 165 f.close() 166 167 @unittest.skipUnless(zlib, 'requires zlib') 168 def test_metadata_check_option(self): 169 dist, cmd = self.get_cmd(metadata={}) 170 cmd.ensure_finalized() 171 cmd.run() 172 warnings = self.get_logs(WARN) 173 self.assertEqual(len(warnings), 2) 174 self.clear_logs() 175 dist, cmd = self.get_cmd() 176 cmd.ensure_finalized() 177 cmd.metadata_check = 0 178 cmd.run() 179 warnings = self.get_logs(WARN) 180 self.assertEqual(len(warnings), 0) 181 182 def test_check_metadata_deprecated(self): 183 dist, cmd = self.get_cmd() 184 with check_warnings() as w: 185 warnings.simplefilter('always') 186 cmd.check_metadata() 187 self.assertEqual(len(w.warnings), 1) 188 189 def test_show_formats(self): 190 with captured_stdout() as stdout: 191 show_formats() 192 num_formats = len(ARCHIVE_FORMATS.keys()) 193 output = [ line for line in stdout.getvalue().split('\n') if line.strip().startswith('--formats=') ] 194 self.assertEqual(len(output), num_formats) 195 196 def test_finalize_options(self): 197 dist, cmd = self.get_cmd() 198 cmd.finalize_options() 199 self.assertEqual(cmd.manifest, 'MANIFEST') 200 self.assertEqual(cmd.template, 'MANIFEST.in') 201 self.assertEqual(cmd.dist_dir, 'dist') 202 cmd.formats = 1 203 self.assertRaises(DistutilsOptionError, cmd.finalize_options) 204 cmd.formats = ['zip'] 205 cmd.finalize_options() 206 cmd.formats = 'supazipa' 207 self.assertRaises(DistutilsOptionError, cmd.finalize_options) 208 209 @unittest.skipUnless(zlib, 'requires zlib') 210 @unittest.skipUnless(UID_GID_SUPPORT, 'Requires grp and pwd support') 211 def test_make_distribution_owner_group(self): 212 if find_executable('tar') is None or find_executable('gzip') is None: 213 return 214 dist, cmd = self.get_cmd() 215 cmd.formats = ['gztar'] 216 cmd.owner = pwd.getpwuid(0)[0] 217 cmd.group = grp.getgrgid(0)[0] 218 cmd.ensure_finalized() 219 cmd.run() 220 archive_name = join(self.tmp_dir, 'dist', 'fake-1.0.tar.gz') 221 archive = tarfile.open(archive_name) 222 try: 223 for member in archive.getmembers(): 224 self.assertEqual(member.uid, 0) 225 self.assertEqual(member.gid, 0) 226 227 finally: 228 archive.close() 229 230 dist, cmd = self.get_cmd() 231 cmd.formats = ['gztar'] 232 cmd.ensure_finalized() 233 cmd.run() 234 archive_name = join(self.tmp_dir, 'dist', 'fake-1.0.tar.gz') 235 archive = tarfile.open(archive_name) 236 try: 237 for member in archive.getmembers(): 238 self.assertEqual(member.uid, os.getuid()) 239 240 finally: 241 archive.close() 242 243 @unittest.skipUnless(zlib, 'requires zlib') 244 def test_get_file_list(self): 245 dist, cmd = self.get_cmd() 246 dist.package_data = {'somecode': ['*.txt']} 247 self.write_file((self.tmp_dir, 'somecode', 'doc.txt'), '#') 248 cmd.ensure_finalized() 249 cmd.run() 250 f = open(cmd.manifest) 251 try: 252 manifest = [ line.strip() for line in f.read().split('\n') if line.strip() != '' ] 253 finally: 254 f.close() 255 256 self.assertEqual(len(manifest), 5) 257 self.write_file((self.tmp_dir, 'somecode', 'doc2.txt'), '#') 258 build_py = dist.get_command_obj('build_py') 259 build_py.finalized = False 260 build_py.ensure_finalized() 261 cmd.run() 262 f = open(cmd.manifest) 263 try: 264 manifest2 = [ line.strip() for line in f.read().split('\n') if line.strip() != '' ] 265 finally: 266 f.close() 267 268 self.assertEqual(len(manifest2), 6) 269 self.assertIn('doc2.txt', manifest2[-1]) 270 271 def test_manifest_marker(self): 272 dist, cmd = self.get_cmd() 273 cmd.ensure_finalized() 274 cmd.run() 275 f = open(cmd.manifest) 276 try: 277 manifest = [ line.strip() for line in f.read().split('\n') if line.strip() != '' ] 278 finally: 279 f.close() 280 281 self.assertEqual(manifest[0], '# file GENERATED by distutils, do NOT edit') 282 283 def test_manual_manifest(self): 284 dist, cmd = self.get_cmd() 285 cmd.ensure_finalized() 286 self.write_file((self.tmp_dir, cmd.manifest), 'README.manual') 287 cmd.run() 288 f = open(cmd.manifest) 289 try: 290 manifest = [ line.strip() for line in f.read().split('\n') if line.strip() != '' ] 291 finally: 292 f.close() 293 294 self.assertEqual(manifest, ['README.manual']) 295 296 297 def test_suite(): 298 return unittest.makeSuite(SDistTestCase) 299 300 301 if __name__ == '__main__': 302 unittest.main(defaultTest='test_suite')