Skip to content

Commit d486739

Browse files
ZackerySpytzshihai1991
authored andcommitted
bpo-26353: IDLE adds an unneeded newline when saving a shell window (pythonGH-17103)
1 parent 8f6baab commit d486739

File tree

4 files changed

+33
-15
lines changed

4 files changed

+33
-15
lines changed

Lib/idlelib/NEWS.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ Released on 2020-10-05?
33
======================================
44

55

6+
bop-26353: Stop adding newline when saving an IDLE shell window.
7+
68
bpo-38598: Do not try to compile IDLE shell or output windows.
79

810

Lib/idlelib/idle_test/test_iomenu.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
1-
"Test , coverage 16%."
1+
"Test , coverage 17%."
22

33
from idlelib import iomenu
44
import unittest
55
from test.support import requires
66
from tkinter import Tk
7-
87
from idlelib.editor import EditorWindow
98

109

11-
class IOBindigTest(unittest.TestCase):
10+
class IOBindingTest(unittest.TestCase):
1211

1312
@classmethod
1413
def setUpClass(cls):
1514
requires('gui')
1615
cls.root = Tk()
1716
cls.root.withdraw()
1817
cls.editwin = EditorWindow(root=cls.root)
18+
cls.io = iomenu.IOBinding(cls.editwin)
1919

2020
@classmethod
2121
def tearDownClass(cls):
22+
cls.io.close()
2223
cls.editwin._close()
2324
del cls.editwin
2425
cls.root.update_idletasks()
@@ -28,9 +29,20 @@ def tearDownClass(cls):
2829
del cls.root
2930

3031
def test_init(self):
31-
io = iomenu.IOBinding(self.editwin)
32-
self.assertIs(io.editwin, self.editwin)
33-
io.close
32+
self.assertIs(self.io.editwin, self.editwin)
33+
34+
def test_fixnewlines_end(self):
35+
eq = self.assertEqual
36+
io = self.io
37+
fix = io.fixnewlines
38+
text = io.editwin.text
39+
self.editwin.interp = None
40+
eq(fix(), '')
41+
del self.editwin.interp
42+
text.insert(1.0, 'a')
43+
eq(fix(), 'a'+io.eol_convention)
44+
eq(text.get('1.0', 'end-1c'), 'a\n')
45+
eq(fix(), 'a'+io.eol_convention)
3446

3547

3648
if __name__ == '__main__':

Lib/idlelib/iomenu.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -371,10 +371,7 @@ def save_a_copy(self, event):
371371
return "break"
372372

373373
def writefile(self, filename):
374-
self.fixlastline()
375-
text = self.text.get("1.0", "end-1c")
376-
if self.eol_convention != "\n":
377-
text = text.replace("\n", self.eol_convention)
374+
text = self.fixnewlines()
378375
chars = self.encode(text)
379376
try:
380377
with open(filename, "wb") as f:
@@ -387,6 +384,16 @@ def writefile(self, filename):
387384
parent=self.text)
388385
return False
389386

387+
def fixnewlines(self):
388+
"Return text with final \n if needed and os eols."
389+
if (self.text.get("end-2c") != '\n'
390+
and not hasattr(self.editwin, "interp")): # Not shell.
391+
self.text.insert("end-1c", "\n")
392+
text = self.text.get("1.0", "end-1c")
393+
if self.eol_convention != "\n":
394+
text = text.replace("\n", self.eol_convention)
395+
return text
396+
390397
def encode(self, chars):
391398
if isinstance(chars, bytes):
392399
# This is either plain ASCII, or Tk was returning mixed-encoding
@@ -426,11 +433,6 @@ def encode(self, chars):
426433
# declared encoding
427434
return BOM_UTF8 + chars.encode("utf-8")
428435

429-
def fixlastline(self):
430-
c = self.text.get("end-2c")
431-
if c != '\n':
432-
self.text.insert("end-1c", "\n")
433-
434436
def print_window(self, event):
435437
confirm = tkMessageBox.askokcancel(
436438
title="Print",
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Stop adding newline when saving an IDLE shell window.
2+

0 commit comments

Comments
 (0)