From 7bbc71b845f5df13fd2a0ae31fd5c2a3c28265fa Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Sat, 9 Nov 2019 23:56:25 -0700 Subject: [PATCH 1/3] bpo-26353: IDLE adds an unneeded newline when saving a shell window --- Lib/idlelib/iomenu.py | 10 ++++------ .../next/IDLE/2019-11-09-23-55-59.bpo-26353.duYZiF.rst | 1 + 2 files changed, 5 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2019-11-09-23-55-59.bpo-26353.duYZiF.rst diff --git a/Lib/idlelib/iomenu.py b/Lib/idlelib/iomenu.py index b5533be79f9960..143128c0128625 100644 --- a/Lib/idlelib/iomenu.py +++ b/Lib/idlelib/iomenu.py @@ -371,8 +371,11 @@ def save_a_copy(self, event): return "break" def writefile(self, filename): - self.fixlastline() text = self.text.get("1.0", "end-1c") + if self.text.get("end-2c") != "\n": + text += "\n" + if not hasattr(self.editwin, "interp"): + self.text.insert("end-1c", "\n") if self.eol_convention != "\n": text = text.replace("\n", self.eol_convention) chars = self.encode(text) @@ -426,11 +429,6 @@ def encode(self, chars): # declared encoding return BOM_UTF8 + chars.encode("utf-8") - def fixlastline(self): - c = self.text.get("end-2c") - if c != '\n': - self.text.insert("end-1c", "\n") - def print_window(self, event): confirm = tkMessageBox.askokcancel( title="Print", diff --git a/Misc/NEWS.d/next/IDLE/2019-11-09-23-55-59.bpo-26353.duYZiF.rst b/Misc/NEWS.d/next/IDLE/2019-11-09-23-55-59.bpo-26353.duYZiF.rst new file mode 100644 index 00000000000000..aceef10fd5118d --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-11-09-23-55-59.bpo-26353.duYZiF.rst @@ -0,0 +1 @@ +IDLE no longer adds an unneeded newline when saving a shell window. From beaba46bda2552e80f126521e4a559796c1928b3 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Tue, 12 Nov 2019 02:41:22 -0500 Subject: [PATCH 2/3] Revise newline fix, add test, add idlelib news. --- Lib/idlelib/NEWS.txt | 2 ++ Lib/idlelib/idle_test/test_iomenu.py | 24 ++++++++++++++----- Lib/idlelib/iomenu.py | 18 ++++++++------ .../2019-11-09-23-55-59.bpo-26353.duYZiF.rst | 3 ++- 4 files changed, 33 insertions(+), 14 deletions(-) diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index ce96baf32859c4..938c9c7d06b05a 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,8 @@ Released on 2020-10-05? ====================================== +bop-26353: Stop adding newline when saving an IDLE shell window. + bpo-38598: Do not try to compile IDLE shell or output windows. diff --git a/Lib/idlelib/idle_test/test_iomenu.py b/Lib/idlelib/idle_test/test_iomenu.py index 743a05b3c3134e..99f40487967124 100644 --- a/Lib/idlelib/idle_test/test_iomenu.py +++ b/Lib/idlelib/idle_test/test_iomenu.py @@ -1,14 +1,13 @@ -"Test , coverage 16%." +"Test , coverage 17%." from idlelib import iomenu import unittest from test.support import requires from tkinter import Tk - from idlelib.editor import EditorWindow -class IOBindigTest(unittest.TestCase): +class IOBindingTest(unittest.TestCase): @classmethod def setUpClass(cls): @@ -16,9 +15,11 @@ def setUpClass(cls): cls.root = Tk() cls.root.withdraw() cls.editwin = EditorWindow(root=cls.root) + cls.io = iomenu.IOBinding(cls.editwin) @classmethod def tearDownClass(cls): + cls.io.close() cls.editwin._close() del cls.editwin cls.root.update_idletasks() @@ -28,9 +29,20 @@ def tearDownClass(cls): del cls.root def test_init(self): - io = iomenu.IOBinding(self.editwin) - self.assertIs(io.editwin, self.editwin) - io.close + self.assertIs(self.io.editwin, self.editwin) + + def test_fixnewlines_end(self): + eq = self.assertEqual + io = self.io + fix = io.fixnewlines + text = io.editwin.text + self.editwin.interp = None + eq(fix(), '') + del self.editwin.interp + text.insert(1.0, 'a') + eq(fix(), 'a'+io.eol_convention) + eq(text.get('1.0', 'end-1c'), 'a\n') + eq(fix(), 'a'+io.eol_convention) if __name__ == '__main__': diff --git a/Lib/idlelib/iomenu.py b/Lib/idlelib/iomenu.py index 143128c0128625..583356e9b8417c 100644 --- a/Lib/idlelib/iomenu.py +++ b/Lib/idlelib/iomenu.py @@ -371,13 +371,7 @@ def save_a_copy(self, event): return "break" def writefile(self, filename): - text = self.text.get("1.0", "end-1c") - if self.text.get("end-2c") != "\n": - text += "\n" - if not hasattr(self.editwin, "interp"): - self.text.insert("end-1c", "\n") - if self.eol_convention != "\n": - text = text.replace("\n", self.eol_convention) + text = self.fixnewlines() chars = self.encode(text) try: with open(filename, "wb") as f: @@ -390,6 +384,16 @@ def writefile(self, filename): parent=self.text) return False + def fixnewlines(self): + "Return text with final \n if needed and os eols." + if (self.text.get("end-2c") != '\n' + and not hasattr(self.editwin, "interp")): # Not shell. + self.text.insert("end-1c", "\n") + text = self.text.get("1.0", "end-1c") + if self.eol_convention != "\n": + text = text.replace("\n", self.eol_convention) + return text + def encode(self, chars): if isinstance(chars, bytes): # This is either plain ASCII, or Tk was returning mixed-encoding diff --git a/Misc/NEWS.d/next/IDLE/2019-11-09-23-55-59.bpo-26353.duYZiF.rst b/Misc/NEWS.d/next/IDLE/2019-11-09-23-55-59.bpo-26353.duYZiF.rst index aceef10fd5118d..fd0a2a36821008 100644 --- a/Misc/NEWS.d/next/IDLE/2019-11-09-23-55-59.bpo-26353.duYZiF.rst +++ b/Misc/NEWS.d/next/IDLE/2019-11-09-23-55-59.bpo-26353.duYZiF.rst @@ -1 +1,2 @@ -IDLE no longer adds an unneeded newline when saving a shell window. +Stop adding newline when saving an IDLE shell window. + From 4396f940364a938761b930d4ee776410d2f38710 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Tue, 12 Nov 2019 05:17:44 -0500 Subject: [PATCH 3/3] Fix whitespace complaint. --- Lib/idlelib/iomenu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/idlelib/iomenu.py b/Lib/idlelib/iomenu.py index 583356e9b8417c..4b2833b8ca56f3 100644 --- a/Lib/idlelib/iomenu.py +++ b/Lib/idlelib/iomenu.py @@ -388,7 +388,7 @@ def fixnewlines(self): "Return text with final \n if needed and os eols." if (self.text.get("end-2c") != '\n' and not hasattr(self.editwin, "interp")): # Not shell. - self.text.insert("end-1c", "\n") + self.text.insert("end-1c", "\n") text = self.text.get("1.0", "end-1c") if self.eol_convention != "\n": text = text.replace("\n", self.eol_convention)