diff options
-rw-r--r-- | Doc/distutils/apiref.rst | 11 | ||||
-rw-r--r-- | Doc/library/gettext.rst | 6 | ||||
-rw-r--r-- | Lib/distutils/sysconfig.py | 2 | ||||
-rw-r--r-- | Lib/distutils/tests/test_build_py.py | 9 | ||||
-rw-r--r-- | Lib/distutils/tests/test_check.py | 13 | ||||
-rw-r--r-- | Lib/distutils/tests/test_config_cmd.py | 4 | ||||
-rw-r--r-- | Lib/distutils/tests/test_install_lib.py | 11 | ||||
-rw-r--r-- | Lib/distutils/tests/test_register.py | 20 | ||||
-rw-r--r-- | Lib/distutils/util.py | 17 | ||||
-rw-r--r-- | Lib/test/test_sysconfig.py | 15 | ||||
-rw-r--r-- | Misc/ACKS | 1 | ||||
-rw-r--r-- | Misc/NEWS | 6 |
12 files changed, 85 insertions, 30 deletions
diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst index 4c849a9..e3d41cc 100644 --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -1204,9 +1204,9 @@ other utility module. .. function:: byte_compile(py_files[, optimize=0, force=0, prefix=None, base_dir=None, verbose=1, dry_run=0, direct=None]) Byte-compile a collection of Python source files to either :file:`.pyc` or - :file:`.pyo` files in the same directory. *py_files* is a list of files to - compile; any files that don't end in :file:`.py` are silently skipped. - *optimize* must be one of the following: + :file:`.pyo` files in a :file:`__pycache__` subdirectory (see :pep:`3147`). + *py_files* is a list of files to compile; any files that don't end in + :file:`.py` are silently skipped. *optimize* must be one of the following: * ``0`` - don't optimize (generate :file:`.pyc`) * ``1`` - normal optimization (like ``python -O``) @@ -1231,6 +1231,11 @@ other utility module. is used by the script generated in indirect mode; unless you know what you're doing, leave it set to ``None``. + .. versionchanged:: 3.2.3 + Create ``.pyc`` or ``.pyo`` files with an :func:`import magic tag + <imp.get_tag>` in their name, in a :file:`__pycache__` subdirectory + instead of files without tag in the current directory. + .. function:: rfc822_escape(header) diff --git a/Doc/library/gettext.rst b/Doc/library/gettext.rst index bc825cc..0fa022c 100644 --- a/Doc/library/gettext.rst +++ b/Doc/library/gettext.rst @@ -263,7 +263,7 @@ are the methods of :class:`NullTranslations`: .. method:: lngettext(singular, plural, n) - If a fallback has been set, forward :meth:`ngettext` to the fallback. + If a fallback has been set, forward :meth:`lngettext` to the fallback. Otherwise, return the translated message. Overridden in derived classes. @@ -644,8 +644,8 @@ implementations, and valuable experience to the creation of this module: .. [#] See the footnote for :func:`bindtextdomain` above. .. [#] François Pinard has written a program called :program:`xpot` which does a - similar job. It is available as part of his :program:`po-utils` package at http - ://po-utils.progiciels-bpi.ca/. + similar job. It is available as part of his `po-utils package + <http://po-utils.progiciels-bpi.ca/>`_. .. [#] :program:`msgfmt.py` is binary compatible with GNU :program:`msgfmt` except that it provides a simpler, all-Python implementation. With this and diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py index 5ea724c..ac06313 100644 --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -218,7 +218,7 @@ def get_makefile_filename(): """Return full pathname of installed Makefile from the Python build.""" if python_build: return os.path.join(os.path.dirname(sys.executable), "Makefile") - lib_dir = get_python_lib(plat_specific=1, standard_lib=1) + lib_dir = get_python_lib(plat_specific=0, standard_lib=1) config_file = 'config-{}{}'.format(get_python_version(), build_flags) return os.path.join(lib_dir, config_file, 'Makefile') diff --git a/Lib/distutils/tests/test_build_py.py b/Lib/distutils/tests/test_build_py.py index 4e46339..80316ad 100644 --- a/Lib/distutils/tests/test_build_py.py +++ b/Lib/distutils/tests/test_build_py.py @@ -3,6 +3,7 @@ import os import sys import io +import imp import unittest from distutils.command.build_py import build_py @@ -57,13 +58,15 @@ class BuildPyTestCase(support.TempdirManager, self.assertEqual(len(cmd.get_outputs()), 3) pkgdest = os.path.join(destination, "pkg") files = os.listdir(pkgdest) + pycache_dir = os.path.join(pkgdest, "__pycache__") self.assertIn("__init__.py", files) self.assertIn("README.txt", files) - # XXX even with -O, distutils writes pyc, not pyo; bug? if sys.dont_write_bytecode: - self.assertNotIn("__init__.pyc", files) + self.assertFalse(os.path.exists(pycache_dir)) else: - self.assertIn("__init__.pyc", files) + # XXX even with -O, distutils writes pyc, not pyo; bug? + pyc_files = os.listdir(pycache_dir) + self.assertIn("__init__.%s.pyc" % imp.get_tag(), pyc_files) def test_empty_package_dir(self): # See SF 1668596/1720897. diff --git a/Lib/distutils/tests/test_check.py b/Lib/distutils/tests/test_check.py index 229ae25..4de6473 100644 --- a/Lib/distutils/tests/test_check.py +++ b/Lib/distutils/tests/test_check.py @@ -46,6 +46,15 @@ class CheckTestCase(support.LoggingSilencer, cmd = self._run(metadata, strict=1) self.assertEqual(cmd._warnings, 0) + # now a test with non-ASCII characters + metadata = {'url': 'xxx', 'author': '\u00c9ric', + 'author_email': 'xxx', 'name': 'xxx', + 'version': 'xxx', + 'description': 'Something about esszet \u00df', + 'long_description': 'More things about esszet \u00df'} + cmd = self._run(metadata) + self.assertEqual(cmd._warnings, 0) + def test_check_document(self): if not HAS_DOCUTILS: # won't test without docutils return @@ -80,8 +89,8 @@ class CheckTestCase(support.LoggingSilencer, self.assertRaises(DistutilsSetupError, self._run, metadata, **{'strict': 1, 'restructuredtext': 1}) - # and non-broken rest - metadata['long_description'] = 'title\n=====\n\ntest' + # and non-broken rest, including a non-ASCII character to test #12114 + metadata['long_description'] = 'title\n=====\n\ntest \u00df' cmd = self._run(metadata, strict=1, restructuredtext=1) self.assertEqual(cmd._warnings, 0) diff --git a/Lib/distutils/tests/test_config_cmd.py b/Lib/distutils/tests/test_config_cmd.py index 4f7ebdd..e2e6e4e 100644 --- a/Lib/distutils/tests/test_config_cmd.py +++ b/Lib/distutils/tests/test_config_cmd.py @@ -44,10 +44,10 @@ class ConfigTestCase(support.LoggingSilencer, cmd = config(dist) # simple pattern searches - match = cmd.search_cpp(pattern='xxx', body='// xxx') + match = cmd.search_cpp(pattern='xxx', body='/* xxx */') self.assertEqual(match, 0) - match = cmd.search_cpp(pattern='_configtest', body='// xxx') + match = cmd.search_cpp(pattern='_configtest', body='/* xxx */') self.assertEqual(match, 1) def test_finalize_options(self): diff --git a/Lib/distutils/tests/test_install_lib.py b/Lib/distutils/tests/test_install_lib.py index fddaabe..b42b03b 100644 --- a/Lib/distutils/tests/test_install_lib.py +++ b/Lib/distutils/tests/test_install_lib.py @@ -1,6 +1,7 @@ """Tests for distutils.command.install_data.""" import sys import os +import imp import unittest from distutils.command.install_lib import install_lib @@ -32,18 +33,20 @@ class InstallLibTestCase(support.TempdirManager, cmd.finalize_options() self.assertEqual(cmd.optimize, 2) - @unittest.skipUnless(not sys.dont_write_bytecode, - 'byte-compile not supported') + @unittest.skipIf(sys.dont_write_bytecode, 'byte-compile disabled') def test_byte_compile(self): pkg_dir, dist = self.create_dist() + os.chdir(pkg_dir) cmd = install_lib(dist) cmd.compile = cmd.optimize = 1 f = os.path.join(pkg_dir, 'foo.py') self.write_file(f, '# python file') cmd.byte_compile([f]) - self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyc'))) - self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyo'))) + pyc_file = imp.cache_from_source('foo.py') + pyo_file = imp.cache_from_source('foo.py', debug_override=False) + self.assertTrue(os.path.exists(pyc_file)) + self.assertTrue(os.path.exists(pyo_file)) def test_get_outputs(self): pkg_dir, dist = self.create_dist() diff --git a/Lib/distutils/tests/test_register.py b/Lib/distutils/tests/test_register.py index cb72a11..5863ae1 100644 --- a/Lib/distutils/tests/test_register.py +++ b/Lib/distutils/tests/test_register.py @@ -214,7 +214,7 @@ class RegisterTestCase(PyPIRCCommandTestCase): # metadata are OK but long_description is broken metadata = {'url': 'xxx', 'author': 'xxx', - 'author_email': 'xxx', + 'author_email': 'éxéxé', 'name': 'xxx', 'version': 'xxx', 'long_description': 'title\n==\n\ntext'} @@ -247,6 +247,24 @@ class RegisterTestCase(PyPIRCCommandTestCase): finally: del register_module.input + # and finally a Unicode test (bug #12114) + metadata = {'url': 'xxx', 'author': '\u00c9ric', + 'author_email': 'xxx', 'name': 'xxx', + 'version': 'xxx', + 'description': 'Something about esszet \u00df', + 'long_description': 'More things about esszet \u00df'} + + cmd = self._get_cmd(metadata) + cmd.ensure_finalized() + cmd.strict = 1 + inputs = Inputs('1', 'tarek', 'y') + register_module.input = inputs.__call__ + # let's run the command + try: + cmd.run() + finally: + del register_module.input + def test_check_metadata_deprecated(self): # makes sure make_metadata is deprecated cmd = self._get_cmd() diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py index 023ddff..f42c6a1 100644 --- a/Lib/distutils/util.py +++ b/Lib/distutils/util.py @@ -4,7 +4,11 @@ Miscellaneous utility functions -- anything that doesn't fit into one of the other *util.py modules. """ -import sys, os, string, re +import os +import re +import imp +import sys +import string from distutils.errors import DistutilsPlatformError from distutils.dep_util import newer from distutils.spawn import spawn @@ -415,9 +419,9 @@ def byte_compile (py_files, verbose=1, dry_run=0, direct=None): """Byte-compile a collection of Python source files to either .pyc - or .pyo files in the same directory. 'py_files' is a list of files - to compile; any files that don't end in ".py" are silently skipped. - 'optimize' must be one of the following: + or .pyo files in a __pycache__ subdirectory. 'py_files' is a list + of files to compile; any files that don't end in ".py" are silently + skipped. 'optimize' must be one of the following: 0 - don't optimize (generate .pyc) 1 - normal optimization (like "python -O") 2 - extra optimization (like "python -OO") @@ -529,7 +533,10 @@ byte_compile(files, optimize=%r, force=%r, # Terminology from the py_compile module: # cfile - byte-compiled file # dfile - purported source filename (same as 'file' by default) - cfile = file + (__debug__ and "c" or "o") + if optimize >= 0: + cfile = imp.cache_from_source(file, debug_override=not optimize) + else: + cfile = imp.cache_from_source(file) dfile = file if prefix: if file[:len(prefix)] != prefix: diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py index b2a3224..aabb6fa 100644 --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -1,9 +1,5 @@ -"""Tests for 'site'. +"""Tests for sysconfig.""" -Tests assume the initial paths in sys.path once the interpreter has begun -executing have not been removed. - -""" import unittest import sys import os @@ -11,7 +7,7 @@ import subprocess import shutil from copy import copy, deepcopy -from test.support import (run_unittest, TESTFN, unlink, get_attribute, +from test.support import (run_unittest, TESTFN, unlink, captured_stdout, skip_unless_symlink) import sysconfig @@ -265,8 +261,15 @@ class TestSysConfig(unittest.TestCase): # is similar to the global posix_prefix one base = get_config_var('base') user = get_config_var('userbase') + # the global scheme mirrors the distinction between prefix and + # exec-prefix but not the user scheme, so we have to adapt the paths + # before comparing (issue #9100) + adapt = sys.prefix != sys.exec_prefix for name in ('stdlib', 'platstdlib', 'purelib', 'platlib'): global_path = get_path(name, 'posix_prefix') + if adapt: + global_path = global_path.replace(sys.exec_prefix, sys.prefix) + base = base.replace(sys.exec_prefix, sys.prefix) user_path = get_path(name, 'posix_user') self.assertEqual(user_path, global_path.replace(base, user, 1)) @@ -722,6 +722,7 @@ Pierre Quentel Brian Quinlan Anders Qvist Burton Radons +Jeff Ramnani Brodie Rao Antti Rasinen Sridhar Ratnakumar @@ -43,6 +43,12 @@ Core and Builtins Library ------- +- Issue #11171: Fix distutils.sysconfig.get_makefile_filename when Python was + configured with different prefix and exec-prefix. + +- Issue #11254: Teach distutils to compile .pyc and .pyo files in + PEP 3147-compliant __pycache__ directories. + - Issue #11250: Back port fix from 3.3 branch, so that 2to3 can handle files with line feeds. This was ported from the sandbox to the 3.3 branch, but didn't make it into 3.2. |