From 35b87e6001bd991f625abe305951c77ddeb9a9c5 Mon Sep 17 00:00:00 2001 From: Ngalim Siregar Date: Sun, 21 Jul 2019 22:37:28 +0700 Subject: [PATCH] bpo-37627: Initialize IDLE Custom Run dialog with previous entries (#14870) Repeat the command line arguments most recently entered before so the user can edit them. --- Lib/idlelib/idle_test/test_query.py | 10 ++++++---- Lib/idlelib/query.py | 8 ++++++-- Lib/idlelib/runscript.py | 11 +++++++---- .../IDLE/2019-07-20-23-33-53.bpo-37627.dQhUNB.rst | 3 +++ 4 files changed, 22 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2019-07-20-23-33-53.bpo-37627.dQhUNB.rst diff --git a/Lib/idlelib/idle_test/test_query.py b/Lib/idlelib/idle_test/test_query.py index 3b444de15d7..f957585190d 100644 --- a/Lib/idlelib/idle_test/test_query.py +++ b/Lib/idlelib/idle_test/test_query.py @@ -12,7 +12,7 @@ HelpSource htests. These are run by running query.py. from idlelib import query import unittest from test.support import requires -from tkinter import Tk +from tkinter import Tk, END import sys from unittest import mock @@ -392,10 +392,12 @@ class CustomRunGuiTest(unittest.TestCase): def test_click_args(self): root = Tk() root.withdraw() - dialog = query.CustomRun(root, 'Title', _utest=True) - dialog.entry.insert(0, 'okay') + dialog = query.CustomRun(root, 'Title', + cli_args=['a', 'b=1'], _utest=True) + self.assertEqual(dialog.entry.get(), 'a b=1') + dialog.entry.insert(END, ' c') dialog.button_ok.invoke() - self.assertEqual(dialog.result, (['okay'], True)) + self.assertEqual(dialog.result, (['a', 'b=1', 'c'], True)) root.destroy() diff --git a/Lib/idlelib/query.py b/Lib/idlelib/query.py index d74084feed7..097e6e61e35 100644 --- a/Lib/idlelib/query.py +++ b/Lib/idlelib/query.py @@ -325,9 +325,13 @@ class CustomRun(Query): """ # Used in runscript.run_custom_event - def __init__(self, parent, title, *, cli_args='', + def __init__(self, parent, title, *, cli_args=[], _htest=False, _utest=False): - # TODO Use cli_args to pre-populate entry. + """cli_args is a list of strings. + + The list is assigned to the default Entry StringVar. + The strings are displayed joined by ' ' for display. + """ message = 'Command Line Arguments for sys.argv:' super().__init__( parent, title, message, text0=cli_args, diff --git a/Lib/idlelib/runscript.py b/Lib/idlelib/runscript.py index b041e56fb84..f97cf528cce 100644 --- a/Lib/idlelib/runscript.py +++ b/Lib/idlelib/runscript.py @@ -39,6 +39,8 @@ class ScriptBinding: # XXX This should be done differently self.flist = self.editwin.flist self.root = self.editwin.root + # cli_args is list of strings that extends sys.argv + self.cli_args = [] if macosx.isCocoaTk(): self.editwin.text_frame.bind('<>', self._run_module_event) @@ -137,10 +139,11 @@ class ScriptBinding: return 'break' if customize: title = f"Customize {self.editwin.short_title()} Run" - run_args = CustomRun(self.shell.text, title).result + run_args = CustomRun(self.shell.text, title, + cli_args=self.cli_args).result if not run_args: # User cancelled. return 'break' - cli_args, restart = run_args if customize else ([], True) + self.cli_args, restart = run_args if customize else ([], True) interp = self.shell.interp if pyshell.use_subprocess and restart: interp.restart_subprocess( @@ -148,8 +151,8 @@ class ScriptBinding: self.editwin._filename_to_unicode(filename)) dirname = os.path.dirname(filename) argv = [filename] - if cli_args: - argv += cli_args + if self.cli_args: + argv += self.cli_args interp.runcommand(f"""if 1: __file__ = {filename!r} import sys as _sys diff --git a/Misc/NEWS.d/next/IDLE/2019-07-20-23-33-53.bpo-37627.dQhUNB.rst b/Misc/NEWS.d/next/IDLE/2019-07-20-23-33-53.bpo-37627.dQhUNB.rst new file mode 100644 index 00000000000..d864d07f60e --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-07-20-23-33-53.bpo-37627.dQhUNB.rst @@ -0,0 +1,3 @@ +Initialize the Customize Run dialog with the command line arguments +most recently entered before. The user can optionally edit before +submitting them.