summaryrefslogtreecommitdiffstats
path: root/Lib/idlelib/run.py
diff options
context:
space:
mode:
authorTerry Jan Reedy <tjreedy@udel.edu>2016-07-15 06:43:03 (GMT)
committerTerry Jan Reedy <tjreedy@udel.edu>2016-07-15 06:43:03 (GMT)
commit6cf0e13b656b624f456f9ca1deb924dc00191bc7 (patch)
treed8d7583b55638643df2256acdce5846d878dd608 /Lib/idlelib/run.py
parentce7b27d169f0d8383f99e0b73d6057aae6470e27 (diff)
downloadcpython-6cf0e13b656b624f456f9ca1deb924dc00191bc7.zip
cpython-6cf0e13b656b624f456f9ca1deb924dc00191bc7.tar.gz
cpython-6cf0e13b656b624f456f9ca1deb924dc00191bc7.tar.bz2
Issue #25507: Move 4 objects from pyshell to run and switch inports.
This removes one problem inport and reduces len(sys.modules) by 37.
Diffstat (limited to 'Lib/idlelib/run.py')
-rw-r--r--Lib/idlelib/run.py121
1 files changed, 112 insertions, 9 deletions
diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py
index eb34944..10ede99 100644
--- a/Lib/idlelib/run.py
+++ b/Lib/idlelib/run.py
@@ -1,10 +1,11 @@
-import sys
+import io
import linecache
-import time
-import traceback
+import queue
+import sys
import _thread as thread
import threading
-import queue
+import time
+import traceback
import tkinter
from idlelib import calltips
@@ -14,7 +15,6 @@ from idlelib import debugger_r
from idlelib import debugobj_r
from idlelib import stackviewer
from idlelib import rpc
-from idlelib import pyshell
from idlelib import iomenu
import __main__
@@ -23,6 +23,19 @@ LOCALHOST = '127.0.0.1'
import warnings
+def idle_formatwarning(message, category, filename, lineno, line=None):
+ """Format warnings the IDLE way."""
+
+ s = "\nWarning (from warnings module):\n"
+ s += ' File \"%s\", line %s\n' % (filename, lineno)
+ if line is None:
+ line = linecache.getline(filename, lineno)
+ line = line.strip()
+ if line:
+ s += " %s\n" % line
+ s += "%s: %s\n" % (category.__name__, message)
+ return s
+
def idle_showwarning_subproc(
message, category, filename, lineno, file=None, line=None):
"""Show Idle-format warning after replacing warnings.showwarning.
@@ -32,7 +45,7 @@ def idle_showwarning_subproc(
if file is None:
file = sys.stderr
try:
- file.write(pyshell.idle_formatwarning(
+ file.write(idle_formatwarning(
message, category, filename, lineno, line))
except IOError:
pass # the file (probably stderr) is invalid - this warning gets lost.
@@ -291,6 +304,96 @@ class MyRPCServer(rpc.RPCServer):
quitting = True
thread.interrupt_main()
+
+# Pseudofiles for shell-remote communication (also used in pyshell)
+
+class PseudoFile(io.TextIOBase):
+
+ def __init__(self, shell, tags, encoding=None):
+ self.shell = shell
+ self.tags = tags
+ self._encoding = encoding
+
+ @property
+ def encoding(self):
+ return self._encoding
+
+ @property
+ def name(self):
+ return '<%s>' % self.tags
+
+ def isatty(self):
+ return True
+
+
+class PseudoOutputFile(PseudoFile):
+
+ def writable(self):
+ return True
+
+ def write(self, s):
+ if self.closed:
+ raise ValueError("write to closed file")
+ if type(s) is not str:
+ if not isinstance(s, str):
+ raise TypeError('must be str, not ' + type(s).__name__)
+ # See issue #19481
+ s = str.__str__(s)
+ return self.shell.write(s, self.tags)
+
+
+class PseudoInputFile(PseudoFile):
+
+ def __init__(self, shell, tags, encoding=None):
+ PseudoFile.__init__(self, shell, tags, encoding)
+ self._line_buffer = ''
+
+ def readable(self):
+ return True
+
+ def read(self, size=-1):
+ if self.closed:
+ raise ValueError("read from closed file")
+ if size is None:
+ size = -1
+ elif not isinstance(size, int):
+ raise TypeError('must be int, not ' + type(size).__name__)
+ result = self._line_buffer
+ self._line_buffer = ''
+ if size < 0:
+ while True:
+ line = self.shell.readline()
+ if not line: break
+ result += line
+ else:
+ while len(result) < size:
+ line = self.shell.readline()
+ if not line: break
+ result += line
+ self._line_buffer = result[size:]
+ result = result[:size]
+ return result
+
+ def readline(self, size=-1):
+ if self.closed:
+ raise ValueError("read from closed file")
+ if size is None:
+ size = -1
+ elif not isinstance(size, int):
+ raise TypeError('must be int, not ' + type(size).__name__)
+ line = self._line_buffer or self.shell.readline()
+ if size < 0:
+ size = len(line)
+ eol = line.find('\n', 0, size)
+ if eol >= 0:
+ size = eol + 1
+ self._line_buffer = line[size:]
+ return line[:size]
+
+ def close(self):
+ self.shell.close()
+
+
class MyHandler(rpc.RPCHandler):
def handle(self):
@@ -298,11 +401,11 @@ class MyHandler(rpc.RPCHandler):
executive = Executive(self)
self.register("exec", executive)
self.console = self.get_remote_proxy("console")
- sys.stdin = pyshell.PseudoInputFile(self.console, "stdin",
+ sys.stdin = PseudoInputFile(self.console, "stdin",
iomenu.encoding)
- sys.stdout = pyshell.PseudoOutputFile(self.console, "stdout",
+ sys.stdout = PseudoOutputFile(self.console, "stdout",
iomenu.encoding)
- sys.stderr = pyshell.PseudoOutputFile(self.console, "stderr",
+ sys.stderr = PseudoOutputFile(self.console, "stderr",
iomenu.encoding)
sys.displayhook = rpc.displayhook