bpo-39313: Add an option to RefactoringTool for using exec as a function (GH-17967)
https://bugs.python.org/issue39313 Automerge-Triggered-By: @pablogsal
This commit is contained in:
parent
14dbe4b3f0
commit
61b14151cc
|
@ -102,7 +102,7 @@ presence of the ``from __future__ import print_function`` compiler directive, it
|
||||||
modifies its internal grammar to interpret :func:`print` as a function. This
|
modifies its internal grammar to interpret :func:`print` as a function. This
|
||||||
change can also be enabled manually with the :option:`!-p` flag. Use
|
change can also be enabled manually with the :option:`!-p` flag. Use
|
||||||
:option:`!-p` to run fixers on code that already has had its print statements
|
:option:`!-p` to run fixers on code that already has had its print statements
|
||||||
converted.
|
converted. Also :option:`!-e` can be used to make :func:`exec` a function.
|
||||||
|
|
||||||
The :option:`!-o` or :option:`!--output-dir` option allows specification of an
|
The :option:`!-o` or :option:`!--output-dir` option allows specification of an
|
||||||
alternate directory for processed output files to be written to. The
|
alternate directory for processed output files to be written to. The
|
||||||
|
|
|
@ -154,6 +154,8 @@ def main(fixer_pkg, args=None):
|
||||||
help="List available transformations")
|
help="List available transformations")
|
||||||
parser.add_option("-p", "--print-function", action="store_true",
|
parser.add_option("-p", "--print-function", action="store_true",
|
||||||
help="Modify the grammar so that print() is a function")
|
help="Modify the grammar so that print() is a function")
|
||||||
|
parser.add_option("-e", "--exec-function", action="store_true",
|
||||||
|
help="Modify the grammar so that exec() is a function")
|
||||||
parser.add_option("-v", "--verbose", action="store_true",
|
parser.add_option("-v", "--verbose", action="store_true",
|
||||||
help="More verbose logging")
|
help="More verbose logging")
|
||||||
parser.add_option("--no-diffs", action="store_true",
|
parser.add_option("--no-diffs", action="store_true",
|
||||||
|
@ -211,6 +213,9 @@ def main(fixer_pkg, args=None):
|
||||||
if options.print_function:
|
if options.print_function:
|
||||||
flags["print_function"] = True
|
flags["print_function"] = True
|
||||||
|
|
||||||
|
if options.exec_function:
|
||||||
|
flags["exec_function"] = True
|
||||||
|
|
||||||
# Set up logging handler
|
# Set up logging handler
|
||||||
level = logging.DEBUG if options.verbose else logging.INFO
|
level = logging.DEBUG if options.verbose else logging.INFO
|
||||||
logging.basicConfig(format='%(name)s: %(message)s', level=level)
|
logging.basicConfig(format='%(name)s: %(message)s', level=level)
|
||||||
|
|
|
@ -155,6 +155,7 @@ class FixerError(Exception):
|
||||||
class RefactoringTool(object):
|
class RefactoringTool(object):
|
||||||
|
|
||||||
_default_options = {"print_function" : False,
|
_default_options = {"print_function" : False,
|
||||||
|
"exec_function": False,
|
||||||
"write_unchanged_files" : False}
|
"write_unchanged_files" : False}
|
||||||
|
|
||||||
CLASS_PREFIX = "Fix" # The prefix for fixer classes
|
CLASS_PREFIX = "Fix" # The prefix for fixer classes
|
||||||
|
@ -173,10 +174,13 @@ class RefactoringTool(object):
|
||||||
self.options = self._default_options.copy()
|
self.options = self._default_options.copy()
|
||||||
if options is not None:
|
if options is not None:
|
||||||
self.options.update(options)
|
self.options.update(options)
|
||||||
if self.options["print_function"]:
|
self.grammar = pygram.python_grammar.copy()
|
||||||
self.grammar = pygram.python_grammar_no_print_statement
|
|
||||||
else:
|
if self.options['print_function']:
|
||||||
self.grammar = pygram.python_grammar
|
del self.grammar.keywords["print"]
|
||||||
|
elif self.options['exec_function']:
|
||||||
|
del self.grammar.keywords["exec"]
|
||||||
|
|
||||||
# When this is True, the refactor*() methods will call write_file() for
|
# When this is True, the refactor*() methods will call write_file() for
|
||||||
# files processed even if they were not changed during refactoring. If
|
# files processed even if they were not changed during refactoring. If
|
||||||
# and only if the refactor method's write parameter was True.
|
# and only if the refactor method's write parameter was True.
|
||||||
|
|
|
@ -44,9 +44,13 @@ class TestRefactoringTool(unittest.TestCase):
|
||||||
|
|
||||||
def test_print_function_option(self):
|
def test_print_function_option(self):
|
||||||
rt = self.rt({"print_function" : True})
|
rt = self.rt({"print_function" : True})
|
||||||
self.assertIs(rt.grammar, pygram.python_grammar_no_print_statement)
|
self.assertNotIn("print", rt.grammar.keywords)
|
||||||
self.assertIs(rt.driver.grammar,
|
self.assertNotIn("print", rt.driver.grammar.keywords)
|
||||||
pygram.python_grammar_no_print_statement)
|
|
||||||
|
def test_exec_function_option(self):
|
||||||
|
rt = self.rt({"exec_function" : True})
|
||||||
|
self.assertNotIn("exec", rt.grammar.keywords)
|
||||||
|
self.assertNotIn("exec", rt.driver.grammar.keywords)
|
||||||
|
|
||||||
def test_write_unchanged_files_option(self):
|
def test_write_unchanged_files_option(self):
|
||||||
rt = self.rt()
|
rt = self.rt()
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Add a new ``exec_function`` option (*--exec-function* in the CLI) to
|
||||||
|
``RefactoringTool`` for making ``exec`` a function. Patch by Batuhan Taskaya.
|
Loading…
Reference in New Issue