From c8b53dc3d8f721ed8519aa5a35530a42fbfb9424 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Tue, 12 Nov 2019 03:54:10 -0700 Subject: bpo-26353: IDLE adds an unneeded newline when saving a shell window (GH-17103) --- Lib/idlelib/NEWS.txt | 2 ++ Lib/idlelib/idle_test/test_iomenu.py | 24 ++++++++++++++++------ Lib/idlelib/iomenu.py | 20 ++++++++++-------- .../IDLE/2019-11-09-23-55-59.bpo-26353.duYZiF.rst | 2 ++ 4 files changed, 33 insertions(+), 15 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2019-11-09-23-55-59.bpo-26353.duYZiF.rst diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index ce96baf..938c9c7 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 743a05b..99f4048 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 @@ class IOBindigTest(unittest.TestCase): 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 @@ class IOBindigTest(unittest.TestCase): 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 b5533be..4b2833b 100644 --- a/Lib/idlelib/iomenu.py +++ b/Lib/idlelib/iomenu.py @@ -371,10 +371,7 @@ class IOBinding: return "break" def writefile(self, filename): - self.fixlastline() - text = self.text.get("1.0", "end-1c") - 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: @@ -387,6 +384,16 @@ class IOBinding: 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 @@ -426,11 +433,6 @@ class IOBinding: # 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 0000000..fd0a2a3 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-11-09-23-55-59.bpo-26353.duYZiF.rst @@ -0,0 +1,2 @@ +Stop adding newline when saving an IDLE shell window. + -- cgit v0.12