Mercurial > repos > bcclaywell > argo_navis
comparison venv/lib/python2.7/site-packages/setuptools/tests/test_sdist.py @ 0:d67268158946 draft
planemo upload commit a3f181f5f126803c654b3a66dd4e83a48f7e203b
| author | bcclaywell |
|---|---|
| date | Mon, 12 Oct 2015 17:43:33 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:d67268158946 |
|---|---|
| 1 # -*- coding: utf-8 -*- | |
| 2 """sdist tests""" | |
| 3 | |
| 4 import locale | |
| 5 import os | |
| 6 import shutil | |
| 7 import sys | |
| 8 import tempfile | |
| 9 import unicodedata | |
| 10 import contextlib | |
| 11 | |
| 12 import pytest | |
| 13 | |
| 14 import pkg_resources | |
| 15 from setuptools.compat import StringIO, unicode, PY3, PY2 | |
| 16 from setuptools.command.sdist import sdist | |
| 17 from setuptools.command.egg_info import manifest_maker | |
| 18 from setuptools.dist import Distribution | |
| 19 | |
| 20 SETUP_ATTRS = { | |
| 21 'name': 'sdist_test', | |
| 22 'version': '0.0', | |
| 23 'packages': ['sdist_test'], | |
| 24 'package_data': {'sdist_test': ['*.txt']} | |
| 25 } | |
| 26 | |
| 27 | |
| 28 SETUP_PY = """\ | |
| 29 from setuptools import setup | |
| 30 | |
| 31 setup(**%r) | |
| 32 """ % SETUP_ATTRS | |
| 33 | |
| 34 | |
| 35 if PY3: | |
| 36 LATIN1_FILENAME = 'smörbröd.py'.encode('latin-1') | |
| 37 else: | |
| 38 LATIN1_FILENAME = 'sm\xf6rbr\xf6d.py' | |
| 39 | |
| 40 | |
| 41 # Cannot use context manager because of Python 2.4 | |
| 42 @contextlib.contextmanager | |
| 43 def quiet(): | |
| 44 old_stdout, old_stderr = sys.stdout, sys.stderr | |
| 45 sys.stdout, sys.stderr = StringIO(), StringIO() | |
| 46 try: | |
| 47 yield | |
| 48 finally: | |
| 49 sys.stdout, sys.stderr = old_stdout, old_stderr | |
| 50 | |
| 51 | |
| 52 # Fake byte literals for Python <= 2.5 | |
| 53 def b(s, encoding='utf-8'): | |
| 54 if PY3: | |
| 55 return s.encode(encoding) | |
| 56 return s | |
| 57 | |
| 58 | |
| 59 # Convert to POSIX path | |
| 60 def posix(path): | |
| 61 if PY3 and not isinstance(path, str): | |
| 62 return path.replace(os.sep.encode('ascii'), b('/')) | |
| 63 else: | |
| 64 return path.replace(os.sep, '/') | |
| 65 | |
| 66 | |
| 67 # HFS Plus uses decomposed UTF-8 | |
| 68 def decompose(path): | |
| 69 if isinstance(path, unicode): | |
| 70 return unicodedata.normalize('NFD', path) | |
| 71 try: | |
| 72 path = path.decode('utf-8') | |
| 73 path = unicodedata.normalize('NFD', path) | |
| 74 path = path.encode('utf-8') | |
| 75 except UnicodeError: | |
| 76 pass # Not UTF-8 | |
| 77 return path | |
| 78 | |
| 79 | |
| 80 class TestSdistTest: | |
| 81 | |
| 82 def setup_method(self, method): | |
| 83 self.temp_dir = tempfile.mkdtemp() | |
| 84 f = open(os.path.join(self.temp_dir, 'setup.py'), 'w') | |
| 85 f.write(SETUP_PY) | |
| 86 f.close() | |
| 87 | |
| 88 # Set up the rest of the test package | |
| 89 test_pkg = os.path.join(self.temp_dir, 'sdist_test') | |
| 90 os.mkdir(test_pkg) | |
| 91 # *.rst was not included in package_data, so c.rst should not be | |
| 92 # automatically added to the manifest when not under version control | |
| 93 for fname in ['__init__.py', 'a.txt', 'b.txt', 'c.rst']: | |
| 94 # Just touch the files; their contents are irrelevant | |
| 95 open(os.path.join(test_pkg, fname), 'w').close() | |
| 96 | |
| 97 self.old_cwd = os.getcwd() | |
| 98 os.chdir(self.temp_dir) | |
| 99 | |
| 100 def teardown_method(self, method): | |
| 101 os.chdir(self.old_cwd) | |
| 102 shutil.rmtree(self.temp_dir) | |
| 103 | |
| 104 def test_package_data_in_sdist(self): | |
| 105 """Regression test for pull request #4: ensures that files listed in | |
| 106 package_data are included in the manifest even if they're not added to | |
| 107 version control. | |
| 108 """ | |
| 109 | |
| 110 dist = Distribution(SETUP_ATTRS) | |
| 111 dist.script_name = 'setup.py' | |
| 112 cmd = sdist(dist) | |
| 113 cmd.ensure_finalized() | |
| 114 | |
| 115 with quiet(): | |
| 116 cmd.run() | |
| 117 | |
| 118 manifest = cmd.filelist.files | |
| 119 assert os.path.join('sdist_test', 'a.txt') in manifest | |
| 120 assert os.path.join('sdist_test', 'b.txt') in manifest | |
| 121 assert os.path.join('sdist_test', 'c.rst') not in manifest | |
| 122 | |
| 123 | |
| 124 def test_defaults_case_sensitivity(self): | |
| 125 """ | |
| 126 Make sure default files (README.*, etc.) are added in a case-sensitive | |
| 127 way to avoid problems with packages built on Windows. | |
| 128 """ | |
| 129 | |
| 130 open(os.path.join(self.temp_dir, 'readme.rst'), 'w').close() | |
| 131 open(os.path.join(self.temp_dir, 'SETUP.cfg'), 'w').close() | |
| 132 | |
| 133 dist = Distribution(SETUP_ATTRS) | |
| 134 # the extension deliberately capitalized for this test | |
| 135 # to make sure the actual filename (not capitalized) gets added | |
| 136 # to the manifest | |
| 137 dist.script_name = 'setup.PY' | |
| 138 cmd = sdist(dist) | |
| 139 cmd.ensure_finalized() | |
| 140 | |
| 141 with quiet(): | |
| 142 cmd.run() | |
| 143 | |
| 144 # lowercase all names so we can test in a case-insensitive way to make sure the files are not included | |
| 145 manifest = map(lambda x: x.lower(), cmd.filelist.files) | |
| 146 assert 'readme.rst' not in manifest, manifest | |
| 147 assert 'setup.py' not in manifest, manifest | |
| 148 assert 'setup.cfg' not in manifest, manifest | |
| 149 | |
| 150 def test_manifest_is_written_with_utf8_encoding(self): | |
| 151 # Test for #303. | |
| 152 dist = Distribution(SETUP_ATTRS) | |
| 153 dist.script_name = 'setup.py' | |
| 154 mm = manifest_maker(dist) | |
| 155 mm.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt') | |
| 156 os.mkdir('sdist_test.egg-info') | |
| 157 | |
| 158 # UTF-8 filename | |
| 159 filename = os.path.join('sdist_test', 'smörbröd.py') | |
| 160 | |
| 161 # Must create the file or it will get stripped. | |
| 162 open(filename, 'w').close() | |
| 163 | |
| 164 # Add UTF-8 filename and write manifest | |
| 165 with quiet(): | |
| 166 mm.run() | |
| 167 mm.filelist.append(filename) | |
| 168 mm.write_manifest() | |
| 169 | |
| 170 manifest = open(mm.manifest, 'rbU') | |
| 171 contents = manifest.read() | |
| 172 manifest.close() | |
| 173 | |
| 174 # The manifest should be UTF-8 encoded | |
| 175 u_contents = contents.decode('UTF-8') | |
| 176 | |
| 177 # The manifest should contain the UTF-8 filename | |
| 178 if PY2: | |
| 179 fs_enc = sys.getfilesystemencoding() | |
| 180 filename = filename.decode(fs_enc) | |
| 181 | |
| 182 assert posix(filename) in u_contents | |
| 183 | |
| 184 # Python 3 only | |
| 185 if PY3: | |
| 186 | |
| 187 def test_write_manifest_allows_utf8_filenames(self): | |
| 188 # Test for #303. | |
| 189 dist = Distribution(SETUP_ATTRS) | |
| 190 dist.script_name = 'setup.py' | |
| 191 mm = manifest_maker(dist) | |
| 192 mm.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt') | |
| 193 os.mkdir('sdist_test.egg-info') | |
| 194 | |
| 195 # UTF-8 filename | |
| 196 filename = os.path.join(b('sdist_test'), b('smörbröd.py')) | |
| 197 | |
| 198 # Must touch the file or risk removal | |
| 199 open(filename, "w").close() | |
| 200 | |
| 201 # Add filename and write manifest | |
| 202 with quiet(): | |
| 203 mm.run() | |
| 204 u_filename = filename.decode('utf-8') | |
| 205 mm.filelist.files.append(u_filename) | |
| 206 # Re-write manifest | |
| 207 mm.write_manifest() | |
| 208 | |
| 209 manifest = open(mm.manifest, 'rbU') | |
| 210 contents = manifest.read() | |
| 211 manifest.close() | |
| 212 | |
| 213 # The manifest should be UTF-8 encoded | |
| 214 contents.decode('UTF-8') | |
| 215 | |
| 216 # The manifest should contain the UTF-8 filename | |
| 217 assert posix(filename) in contents | |
| 218 | |
| 219 # The filelist should have been updated as well | |
| 220 assert u_filename in mm.filelist.files | |
| 221 | |
| 222 def test_write_manifest_skips_non_utf8_filenames(self): | |
| 223 """ | |
| 224 Files that cannot be encoded to UTF-8 (specifically, those that | |
| 225 weren't originally successfully decoded and have surrogate | |
| 226 escapes) should be omitted from the manifest. | |
| 227 See https://bitbucket.org/tarek/distribute/issue/303 for history. | |
| 228 """ | |
| 229 dist = Distribution(SETUP_ATTRS) | |
| 230 dist.script_name = 'setup.py' | |
| 231 mm = manifest_maker(dist) | |
| 232 mm.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt') | |
| 233 os.mkdir('sdist_test.egg-info') | |
| 234 | |
| 235 # Latin-1 filename | |
| 236 filename = os.path.join(b('sdist_test'), LATIN1_FILENAME) | |
| 237 | |
| 238 # Add filename with surrogates and write manifest | |
| 239 with quiet(): | |
| 240 mm.run() | |
| 241 u_filename = filename.decode('utf-8', 'surrogateescape') | |
| 242 mm.filelist.append(u_filename) | |
| 243 # Re-write manifest | |
| 244 mm.write_manifest() | |
| 245 | |
| 246 manifest = open(mm.manifest, 'rbU') | |
| 247 contents = manifest.read() | |
| 248 manifest.close() | |
| 249 | |
| 250 # The manifest should be UTF-8 encoded | |
| 251 contents.decode('UTF-8') | |
| 252 | |
| 253 # The Latin-1 filename should have been skipped | |
| 254 assert posix(filename) not in contents | |
| 255 | |
| 256 # The filelist should have been updated as well | |
| 257 assert u_filename not in mm.filelist.files | |
| 258 | |
| 259 def test_manifest_is_read_with_utf8_encoding(self): | |
| 260 # Test for #303. | |
| 261 dist = Distribution(SETUP_ATTRS) | |
| 262 dist.script_name = 'setup.py' | |
| 263 cmd = sdist(dist) | |
| 264 cmd.ensure_finalized() | |
| 265 | |
| 266 # Create manifest | |
| 267 with quiet(): | |
| 268 cmd.run() | |
| 269 | |
| 270 # Add UTF-8 filename to manifest | |
| 271 filename = os.path.join(b('sdist_test'), b('smörbröd.py')) | |
| 272 cmd.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt') | |
| 273 manifest = open(cmd.manifest, 'ab') | |
| 274 manifest.write(b('\n') + filename) | |
| 275 manifest.close() | |
| 276 | |
| 277 # The file must exist to be included in the filelist | |
| 278 open(filename, 'w').close() | |
| 279 | |
| 280 # Re-read manifest | |
| 281 cmd.filelist.files = [] | |
| 282 with quiet(): | |
| 283 cmd.read_manifest() | |
| 284 | |
| 285 # The filelist should contain the UTF-8 filename | |
| 286 if PY3: | |
| 287 filename = filename.decode('utf-8') | |
| 288 assert filename in cmd.filelist.files | |
| 289 | |
| 290 # Python 3 only | |
| 291 if PY3: | |
| 292 | |
| 293 def test_read_manifest_skips_non_utf8_filenames(self): | |
| 294 # Test for #303. | |
| 295 dist = Distribution(SETUP_ATTRS) | |
| 296 dist.script_name = 'setup.py' | |
| 297 cmd = sdist(dist) | |
| 298 cmd.ensure_finalized() | |
| 299 | |
| 300 # Create manifest | |
| 301 with quiet(): | |
| 302 cmd.run() | |
| 303 | |
| 304 # Add Latin-1 filename to manifest | |
| 305 filename = os.path.join(b('sdist_test'), LATIN1_FILENAME) | |
| 306 cmd.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt') | |
| 307 manifest = open(cmd.manifest, 'ab') | |
| 308 manifest.write(b('\n') + filename) | |
| 309 manifest.close() | |
| 310 | |
| 311 # The file must exist to be included in the filelist | |
| 312 open(filename, 'w').close() | |
| 313 | |
| 314 # Re-read manifest | |
| 315 cmd.filelist.files = [] | |
| 316 with quiet(): | |
| 317 cmd.read_manifest() | |
| 318 | |
| 319 # The Latin-1 filename should have been skipped | |
| 320 filename = filename.decode('latin-1') | |
| 321 assert filename not in cmd.filelist.files | |
| 322 | |
| 323 @pytest.mark.skipif(PY3 and locale.getpreferredencoding() != 'UTF-8', | |
| 324 reason='Unittest fails if locale is not utf-8 but the manifests is ' | |
| 325 'recorded correctly') | |
| 326 def test_sdist_with_utf8_encoded_filename(self): | |
| 327 # Test for #303. | |
| 328 dist = Distribution(SETUP_ATTRS) | |
| 329 dist.script_name = 'setup.py' | |
| 330 cmd = sdist(dist) | |
| 331 cmd.ensure_finalized() | |
| 332 | |
| 333 # UTF-8 filename | |
| 334 filename = os.path.join(b('sdist_test'), b('smörbröd.py')) | |
| 335 open(filename, 'w').close() | |
| 336 | |
| 337 with quiet(): | |
| 338 cmd.run() | |
| 339 | |
| 340 if sys.platform == 'darwin': | |
| 341 filename = decompose(filename) | |
| 342 | |
| 343 if PY3: | |
| 344 fs_enc = sys.getfilesystemencoding() | |
| 345 | |
| 346 if sys.platform == 'win32': | |
| 347 if fs_enc == 'cp1252': | |
| 348 # Python 3 mangles the UTF-8 filename | |
| 349 filename = filename.decode('cp1252') | |
| 350 assert filename in cmd.filelist.files | |
| 351 else: | |
| 352 filename = filename.decode('mbcs') | |
| 353 assert filename in cmd.filelist.files | |
| 354 else: | |
| 355 filename = filename.decode('utf-8') | |
| 356 assert filename in cmd.filelist.files | |
| 357 else: | |
| 358 assert filename in cmd.filelist.files | |
| 359 | |
| 360 def test_sdist_with_latin1_encoded_filename(self): | |
| 361 # Test for #303. | |
| 362 dist = Distribution(SETUP_ATTRS) | |
| 363 dist.script_name = 'setup.py' | |
| 364 cmd = sdist(dist) | |
| 365 cmd.ensure_finalized() | |
| 366 | |
| 367 # Latin-1 filename | |
| 368 filename = os.path.join(b('sdist_test'), LATIN1_FILENAME) | |
| 369 open(filename, 'w').close() | |
| 370 assert os.path.isfile(filename) | |
| 371 | |
| 372 with quiet(): | |
| 373 cmd.run() | |
| 374 | |
| 375 if PY3: | |
| 376 # not all windows systems have a default FS encoding of cp1252 | |
| 377 if sys.platform == 'win32': | |
| 378 # Latin-1 is similar to Windows-1252 however | |
| 379 # on mbcs filesys it is not in latin-1 encoding | |
| 380 fs_enc = sys.getfilesystemencoding() | |
| 381 if fs_enc == 'mbcs': | |
| 382 filename = filename.decode('mbcs') | |
| 383 else: | |
| 384 filename = filename.decode('latin-1') | |
| 385 | |
| 386 assert filename in cmd.filelist.files | |
| 387 else: | |
| 388 # The Latin-1 filename should have been skipped | |
| 389 filename = filename.decode('latin-1') | |
| 390 filename not in cmd.filelist.files | |
| 391 else: | |
| 392 # Under Python 2 there seems to be no decoded string in the | |
| 393 # filelist. However, due to decode and encoding of the | |
| 394 # file name to get utf-8 Manifest the latin1 maybe excluded | |
| 395 try: | |
| 396 # fs_enc should match how one is expect the decoding to | |
| 397 # be proformed for the manifest output. | |
| 398 fs_enc = sys.getfilesystemencoding() | |
| 399 filename.decode(fs_enc) | |
| 400 assert filename in cmd.filelist.files | |
| 401 except UnicodeDecodeError: | |
| 402 filename not in cmd.filelist.files | |
| 403 | |
| 404 | |
| 405 def test_default_revctrl(): | |
| 406 """ | |
| 407 When _default_revctrl was removed from the `setuptools.command.sdist` | |
| 408 module in 10.0, it broke some systems which keep an old install of | |
| 409 setuptools (Distribute) around. Those old versions require that the | |
| 410 setuptools package continue to implement that interface, so this | |
| 411 function provides that interface, stubbed. See #320 for details. | |
| 412 | |
| 413 This interface must be maintained until Ubuntu 12.04 is no longer | |
| 414 supported (by Setuptools). | |
| 415 """ | |
| 416 ep_def = 'svn_cvs = setuptools.command.sdist:_default_revctrl' | |
| 417 ep = pkg_resources.EntryPoint.parse(ep_def) | |
| 418 res = ep.resolve() | |
| 419 assert hasattr(res, '__iter__') |
