diff options
author | Terry Jan Reedy <tjreedy@udel.edu> | 2016-07-15 06:43:03 (GMT) |
---|---|---|
committer | Terry Jan Reedy <tjreedy@udel.edu> | 2016-07-15 06:43:03 (GMT) |
commit | 6cf0e13b656b624f456f9ca1deb924dc00191bc7 (patch) | |
tree | d8d7583b55638643df2256acdce5846d878dd608 /Lib/idlelib/run.py | |
parent | ce7b27d169f0d8383f99e0b73d6057aae6470e27 (diff) | |
download | cpython-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.py | 121 |
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 |