changeset: 97296:97d50e6247e1 branch: 3.5 parent: 97293:4721805fc35d parent: 97295:dda625798111 user: Terry Jan Reedy date: Thu Aug 06 00:54:45 2015 -0400 description: Issue #23672:Merge with 3.4 diff -r 4721805fc35d -r 97d50e6247e1 Lib/idlelib/EditorWindow.py --- a/Lib/idlelib/EditorWindow.py Wed Aug 05 19:01:51 2015 -0400 +++ b/Lib/idlelib/EditorWindow.py Thu Aug 06 00:54:45 2015 -0400 @@ -344,19 +344,19 @@ def _filename_to_unicode(self, filename): - """convert filename to unicode in order to display it in Tk""" - if isinstance(filename, str) or not filename: - return filename - else: + """Return filename as BMP unicode so diplayable in Tk.""" + # Decode bytes to unicode. + if isinstance(filename, bytes): try: - return filename.decode(self.filesystemencoding) + filename = filename.decode(self.filesystemencoding) except UnicodeDecodeError: - # XXX try: - return filename.decode(self.encoding) + filename = filename.decode(self.encoding) except UnicodeDecodeError: # byte-to-byte conversion - return filename.decode('iso8859-1') + filename = filename.decode('iso8859-1') + # Replace non-BMP char with diamond questionmark. + return re.sub('[\U00010000-\U0010FFFF]', '\ufffd', filename) def new_callback(self, event): dirname, basename = self.io.defaultfilename() diff -r 4721805fc35d -r 97d50e6247e1 Lib/idlelib/ScriptBinding.py --- a/Lib/idlelib/ScriptBinding.py Wed Aug 05 19:01:51 2015 -0400 +++ b/Lib/idlelib/ScriptBinding.py Thu Aug 06 00:54:45 2015 -0400 @@ -36,6 +36,7 @@ by Format->Untabify Region and specify the number of columns used by each tab. """ + class ScriptBinding: menudefs = [ @@ -142,7 +143,8 @@ return 'break' interp = self.shell.interp if PyShell.use_subprocess: - interp.restart_subprocess(with_cwd=False, filename=code.co_filename) + interp.restart_subprocess(with_cwd=False, filename= + self.editwin._filename_to_unicode(filename)) dirname = os.path.dirname(filename) # XXX Too often this discards arguments the user just set... interp.runcommand("""if 1: diff -r 4721805fc35d -r 97d50e6247e1 Lib/idlelib/idle_test/test_editor.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/idlelib/idle_test/test_editor.py Thu Aug 06 00:54:45 2015 -0400 @@ -0,0 +1,16 @@ +import unittest +from tkinter import Tk, Text +from idlelib.EditorWindow import EditorWindow +from test.support import requires + +class Editor_func_test(unittest.TestCase): + def test_filename_to_unicode(self): + func = EditorWindow._filename_to_unicode + class dummy(): filesystemencoding = 'utf-8' + pairs = (('abc', 'abc'), ('a\U00011111c', 'a\ufffdc'), + (b'abc', 'abc'), (b'a\xf0\x91\x84\x91c', 'a\ufffdc')) + for inp, out in pairs: + self.assertEqual(func(dummy, inp), out) + +if __name__ == '__main__': + unittest.main(verbosity=2)