[Python-checkins] cpython (3.4): Issue #23672: Allow Idle to edit and run files with astral chars in name.

terry.reedy python-checkins at python.org
Thu Aug 6 06:55:39 CEST 2015


https://hg.python.org/cpython/rev/dda625798111
changeset:   97295:dda625798111
branch:      3.4
parent:      97280:ee8e9edb8aae
user:        Terry Jan Reedy <tjreedy at udel.edu>
date:        Thu Aug 06 00:54:07 2015 -0400
summary:
  Issue #23672: Allow Idle to edit and run files with astral chars in name.
Patch by Mohd Sanad Zaki Rizvi.

files:
  Lib/idlelib/EditorWindow.py          |  16 ++++++++--------
  Lib/idlelib/ScriptBinding.py         |   4 +++-
  Lib/idlelib/idle_test/test_editor.py |  16 ++++++++++++++++
  3 files changed, 27 insertions(+), 9 deletions(-)


diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py
--- a/Lib/idlelib/EditorWindow.py
+++ b/Lib/idlelib/EditorWindow.py
@@ -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 --git a/Lib/idlelib/ScriptBinding.py b/Lib/idlelib/ScriptBinding.py
--- a/Lib/idlelib/ScriptBinding.py
+++ b/Lib/idlelib/ScriptBinding.py
@@ -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 --git a/Lib/idlelib/idle_test/test_editor.py b/Lib/idlelib/idle_test/test_editor.py
new file mode 100644
--- /dev/null
+++ b/Lib/idlelib/idle_test/test_editor.py
@@ -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)

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list