mirror of
https://github.com/python/cpython.git
synced 2025-07-23 19:25:40 +00:00
Issue #4073: Add 2to3 support to build_scripts, refactor that support
in build_py.
This commit is contained in:
parent
2212e529d9
commit
6178db6d55
5 changed files with 77 additions and 22 deletions
|
@ -6,6 +6,11 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
from distutils.command.build_py import build_py
|
from distutils.command.build_py import build_py
|
||||||
|
|
||||||
|
try:
|
||||||
|
from distutils.command.build_scripts import build_scripts_2to3 as build_scripts
|
||||||
|
except ImportError:
|
||||||
|
from distutils.command.build_scripts import build_scripts
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
name = "test2to3",
|
name = "test2to3",
|
||||||
version = "1.0",
|
version = "1.0",
|
||||||
|
@ -14,5 +19,8 @@ setup(
|
||||||
author_email = "python-dev@python.org",
|
author_email = "python-dev@python.org",
|
||||||
license = "PSF license",
|
license = "PSF license",
|
||||||
packages = ["test2to3"],
|
packages = ["test2to3"],
|
||||||
cmdclass = {'build_py':build_py}
|
scripts = ["maintest.py"],
|
||||||
|
cmdclass = {'build_py':build_py,
|
||||||
|
'build_scripts':build_scripts,
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
|
@ -9,7 +9,7 @@ from glob import glob
|
||||||
|
|
||||||
from distutils.core import Command
|
from distutils.core import Command
|
||||||
from distutils.errors import *
|
from distutils.errors import *
|
||||||
from distutils.util import convert_path
|
from distutils.util import convert_path, Mixin2to3
|
||||||
from distutils import log
|
from distutils import log
|
||||||
|
|
||||||
class build_py (Command):
|
class build_py (Command):
|
||||||
|
@ -384,19 +384,7 @@ class build_py (Command):
|
||||||
byte_compile(files, optimize=self.optimize,
|
byte_compile(files, optimize=self.optimize,
|
||||||
force=self.force, prefix=prefix, dry_run=self.dry_run)
|
force=self.force, prefix=prefix, dry_run=self.dry_run)
|
||||||
|
|
||||||
from lib2to3.refactor import RefactoringTool, get_fixers_from_package
|
class build_py_2to3(build_py, Mixin2to3):
|
||||||
class DistutilsRefactoringTool(RefactoringTool):
|
|
||||||
def log_error(self, msg, *args, **kw):
|
|
||||||
# XXX ignores kw
|
|
||||||
log.error(msg, *args)
|
|
||||||
|
|
||||||
def log_message(self, msg, *args):
|
|
||||||
log.info(msg, *args)
|
|
||||||
|
|
||||||
def log_debug(self, msg, *args):
|
|
||||||
log.debug(msg, *args)
|
|
||||||
|
|
||||||
class build_py_2to3(build_py):
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.updated_files = []
|
self.updated_files = []
|
||||||
|
|
||||||
|
@ -408,12 +396,7 @@ class build_py_2to3(build_py):
|
||||||
self.build_package_data()
|
self.build_package_data()
|
||||||
|
|
||||||
# 2to3
|
# 2to3
|
||||||
fixers = get_fixers_from_package('lib2to3.fixes')
|
self.run_2to3(self.updated_files)
|
||||||
options = dict(fix=[], list_fixes=[],
|
|
||||||
print_function=False, verbose=False,
|
|
||||||
write=True)
|
|
||||||
r = DistutilsRefactoringTool(fixers, options)
|
|
||||||
r.refactor(self.updated_files, write=True)
|
|
||||||
|
|
||||||
# Remaining base class code
|
# Remaining base class code
|
||||||
self.byte_compile(self.get_outputs(include_bytecode=0))
|
self.byte_compile(self.get_outputs(include_bytecode=0))
|
||||||
|
|
|
@ -9,7 +9,7 @@ from stat import ST_MODE
|
||||||
from distutils import sysconfig
|
from distutils import sysconfig
|
||||||
from distutils.core import Command
|
from distutils.core import Command
|
||||||
from distutils.dep_util import newer
|
from distutils.dep_util import newer
|
||||||
from distutils.util import convert_path
|
from distutils.util import convert_path, Mixin2to3
|
||||||
from distutils import log
|
from distutils import log
|
||||||
|
|
||||||
# check if Python is called on the first line with this expression
|
# check if Python is called on the first line with this expression
|
||||||
|
@ -59,6 +59,7 @@ class build_scripts(Command):
|
||||||
"""
|
"""
|
||||||
self.mkpath(self.build_dir)
|
self.mkpath(self.build_dir)
|
||||||
outfiles = []
|
outfiles = []
|
||||||
|
updated_files = []
|
||||||
for script in self.scripts:
|
for script in self.scripts:
|
||||||
adjust = False
|
adjust = False
|
||||||
script = convert_path(script)
|
script = convert_path(script)
|
||||||
|
@ -92,6 +93,7 @@ class build_scripts(Command):
|
||||||
if adjust:
|
if adjust:
|
||||||
log.info("copying and adjusting %s -> %s", script,
|
log.info("copying and adjusting %s -> %s", script,
|
||||||
self.build_dir)
|
self.build_dir)
|
||||||
|
updated_files.append(outfile)
|
||||||
if not self.dry_run:
|
if not self.dry_run:
|
||||||
outf = open(outfile, "w")
|
outf = open(outfile, "w")
|
||||||
if not sysconfig.python_build:
|
if not sysconfig.python_build:
|
||||||
|
@ -112,6 +114,7 @@ class build_scripts(Command):
|
||||||
else:
|
else:
|
||||||
if f:
|
if f:
|
||||||
f.close()
|
f.close()
|
||||||
|
updated_files.append(outfile)
|
||||||
self.copy_file(script, outfile)
|
self.copy_file(script, outfile)
|
||||||
|
|
||||||
if os.name == 'posix':
|
if os.name == 'posix':
|
||||||
|
@ -125,3 +128,13 @@ class build_scripts(Command):
|
||||||
log.info("changing mode of %s from %o to %o",
|
log.info("changing mode of %s from %o to %o",
|
||||||
file, oldmode, newmode)
|
file, oldmode, newmode)
|
||||||
os.chmod(file, newmode)
|
os.chmod(file, newmode)
|
||||||
|
# XXX should we modify self.outfiles?
|
||||||
|
return outfiles, updated_files
|
||||||
|
|
||||||
|
class build_scripts_2to3(build_scripts, Mixin2to3):
|
||||||
|
|
||||||
|
def copy_scripts(self):
|
||||||
|
outfiles, updated_files = build_scripts.copy_scripts(self)
|
||||||
|
if not self.dry_run:
|
||||||
|
self.run_2to3(updated_files)
|
||||||
|
return outfiles, updated_files
|
||||||
|
|
|
@ -531,3 +531,51 @@ def rfc822_escape (header):
|
||||||
lines = [x.strip() for x in header.split('\n')]
|
lines = [x.strip() for x in header.split('\n')]
|
||||||
sep = '\n' + 8*' '
|
sep = '\n' + 8*' '
|
||||||
return sep.join(lines)
|
return sep.join(lines)
|
||||||
|
|
||||||
|
# 2to3 support
|
||||||
|
|
||||||
|
def run_2to3(files, fixer_names=None, options=None, explicit=None):
|
||||||
|
"""Invoke 2to3 on a list of Python files.
|
||||||
|
The files should all come from the build area, as the
|
||||||
|
modification is done in-place. To reduce the build time,
|
||||||
|
only files modified since the last invocation of this
|
||||||
|
function should be passed in the files argument."""
|
||||||
|
|
||||||
|
if not files:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Make this class local, to delay import of 2to3
|
||||||
|
from lib2to3.refactor import RefactoringTool, get_fixers_from_package
|
||||||
|
class DistutilsRefactoringTool(RefactoringTool):
|
||||||
|
def log_error(self, msg, *args, **kw):
|
||||||
|
log.error(msg, *args)
|
||||||
|
|
||||||
|
def log_message(self, msg, *args):
|
||||||
|
log.info(msg, *args)
|
||||||
|
|
||||||
|
def log_debug(self, msg, *args):
|
||||||
|
log.debug(msg, *args)
|
||||||
|
|
||||||
|
if fixer_names is None:
|
||||||
|
fixer_names = get_fixers_from_package('lib2to3.fixes')
|
||||||
|
r = DistutilsRefactoringTool(fixer_names, options=options)
|
||||||
|
r.refactor(files, write=True)
|
||||||
|
|
||||||
|
class Mixin2to3:
|
||||||
|
'''Mixin class for commands that run 2to3.
|
||||||
|
To configure 2to3, setup scripts may either change
|
||||||
|
the class variables, or inherit from individual commands
|
||||||
|
to override how 2to3 is invoked.'''
|
||||||
|
|
||||||
|
# provide list of fixers to run;
|
||||||
|
# defaults to all from lib2to3.fixers
|
||||||
|
fixer_names = None
|
||||||
|
|
||||||
|
# options dictionary
|
||||||
|
options = None
|
||||||
|
|
||||||
|
# list of fixers to invoke even though they are marked as explicit
|
||||||
|
explicit = None
|
||||||
|
|
||||||
|
def run_2to3(self, files):
|
||||||
|
return run_2to3(files, self.fixer_names, self.options, self.explicit)
|
||||||
|
|
|
@ -24,6 +24,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #4073: Add 2to3 support to build_scripts, refactor that support
|
||||||
|
in build_py.
|
||||||
|
|
||||||
- IDLE would print a "Unhandled server exception!" message when internal
|
- IDLE would print a "Unhandled server exception!" message when internal
|
||||||
debugging is enabled.
|
debugging is enabled.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue