summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorÉric Araujo <merwok@netwok.org>2011-10-09 05:32:35 (GMT)
committerÉric Araujo <merwok@netwok.org>2011-10-09 05:32:35 (GMT)
commita5bc34fa00602911f1ab870456d1319af1cd6391 (patch)
tree708d2d803179fa6f2440204de3a0f6f0b35c7df8
parentc0bbe7d38a9a7b43de4a921876072662ba5c82fc (diff)
parent5819dcc0d262ef0ceaffc68d1b65f3d031e27b68 (diff)
downloadcpython-a5bc34fa00602911f1ab870456d1319af1cd6391.zip
cpython-a5bc34fa00602911f1ab870456d1319af1cd6391.tar.gz
cpython-a5bc34fa00602911f1ab870456d1319af1cd6391.tar.bz2
Branch merge
-rw-r--r--Doc/distutils/apiref.rst11
-rw-r--r--Doc/library/gettext.rst6
-rw-r--r--Lib/distutils/sysconfig.py2
-rw-r--r--Lib/distutils/tests/test_build_py.py9
-rw-r--r--Lib/distutils/tests/test_check.py13
-rw-r--r--Lib/distutils/tests/test_config_cmd.py4
-rw-r--r--Lib/distutils/tests/test_install_lib.py11
-rw-r--r--Lib/distutils/tests/test_register.py20
-rw-r--r--Lib/distutils/util.py17
-rw-r--r--Lib/test/test_sysconfig.py15
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS6
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))
diff --git a/Misc/ACKS b/Misc/ACKS
index 3dc3de1..0fd2192 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -722,6 +722,7 @@ Pierre Quentel
Brian Quinlan
Anders Qvist
Burton Radons
+Jeff Ramnani
Brodie Rao
Antti Rasinen
Sridhar Ratnakumar
diff --git a/Misc/NEWS b/Misc/NEWS
index d33f341..186ea21 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.