def test_writelines(self): shell = MockShell() f = PseudoOutputFile(shell, 'stdout', 'utf-8') f.writelines([]) self.assertEqual(shell.written, []) shell.reset() f.writelines(['one\n', 'two']) self.assertEqual(shell.written, [('one\n', 'stdout'), ('two', 'stdout')]) shell.reset() f.writelines(['on\xe8\n', 'tw\xf2']) self.assertEqual(shell.written, [('on\xe8\n', 'stdout'), ('tw\xf2', 'stdout')]) shell.reset() f.writelines([S('t\xe8st')]) self.assertEqual(shell.written, [('t\xe8st', 'stdout')]) self.assertEqual(type(shell.written[0][0]), str) shell.reset() self.assertRaises(TypeError, f.writelines) self.assertEqual(shell.written, []) self.assertRaises(TypeError, f.writelines, 123) self.assertEqual(shell.written, []) self.assertRaises(TypeError, f.writelines, [b'test']) self.assertRaises(TypeError, f.writelines, [123]) self.assertEqual(shell.written, []) self.assertRaises(TypeError, f.writelines, [], []) self.assertEqual(shell.written, [])
def test_misc(self): shell = MockShell() f = PseudoOutputFile(shell, 'stdout', 'utf-8') self.assertIsInstance(f, io.TextIOBase) self.assertEqual(f.encoding, 'utf-8') self.assertIsNone(f.errors) self.assertIsNone(f.newlines) self.assertEqual(f.name, '<stdout>') self.assertFalse(f.closed) self.assertTrue(f.isatty()) self.assertFalse(f.readable()) self.assertTrue(f.writable()) self.assertFalse(f.seekable())
def __init__(self, flist=None): if use_subprocess: ms = self.menu_specs if ms[2][0] != 'shell': ms.insert(2, ('shell', 'She_ll')) self.interp = ModifiedInterpreter(self) if flist is None: root = Tk() fixwordbreaks(root) root.withdraw() flist = PyShellFileList(root) OutputWindow.__init__(self, flist, None, None) self.usetabs = True self.indentwidth = 8 self.context_use_ps1 = True text = self.text text.configure(wrap='char') text.bind('<<newline-and-indent>>', self.enter_callback) text.bind('<<plain-newline-and-indent>>', self.linefeed_callback) text.bind('<<interrupt-execution>>', self.cancel_callback) text.bind('<<end-of-file>>', self.eof_callback) text.bind('<<open-stack-viewer>>', self.open_stack_viewer) text.bind('<<toggle-debugger>>', self.toggle_debugger) text.bind('<<toggle-jit-stack-viewer>>', self.toggle_jit_stack_viewer) if use_subprocess: text.bind('<<view-restart>>', self.view_restart_mark) text.bind('<<restart-shell>>', self.restart_shell) self.save_stdout = sys.stdout self.save_stderr = sys.stderr self.save_stdin = sys.stdin from idlelib import iomenu self.stdin = PseudoInputFile(self, 'stdin', iomenu.encoding) self.stdout = PseudoOutputFile(self, 'stdout', iomenu.encoding) self.stderr = PseudoOutputFile(self, 'stderr', iomenu.encoding) self.console = PseudoOutputFile(self, 'console', iomenu.encoding) if not use_subprocess: sys.stdout = self.stdout sys.stderr = self.stderr sys.stdin = self.stdin try: import pydoc pydoc.pager = pydoc.plainpager except: sys.stderr = sys.__stderr__ raise self.history = self.History(self.text) self.pollinterval = 50
def test_unsupported(self): shell = MockShell() f = PseudoOutputFile(shell, 'stdout', 'utf-8') self.assertRaises(OSError, f.fileno) self.assertRaises(OSError, f.tell) self.assertRaises(OSError, f.seek, 0) self.assertRaises(OSError, f.read, 0) self.assertRaises(OSError, f.readline, 0)
def test_close(self): shell = MockShell() f = PseudoOutputFile(shell, 'stdout', 'utf-8') self.assertFalse(f.closed) f.write('test') f.close() self.assertTrue(f.closed) self.assertRaises(ValueError, f.write, 'x') self.assertEqual(shell.written, [('test', 'stdout')]) f.close() self.assertRaises(TypeError, f.close, 1)
def test_write(self): shell = MockShell() f = PseudoOutputFile(shell, 'stdout', 'utf-8') f.write('test') self.assertEqual(shell.written, [('test', 'stdout')]) shell.reset() f.write('tèst') self.assertEqual(shell.written, [('tèst', 'stdout')]) shell.reset() f.write(S('tèst')) self.assertEqual(shell.written, [('tèst', 'stdout')]) self.assertEqual(type(shell.written[0][0]), str) shell.reset() self.assertRaises(TypeError, f.write) self.assertEqual(shell.written, []) self.assertRaises(TypeError, f.write, b'test') self.assertRaises(TypeError, f.write, 123) self.assertEqual(shell.written, []) self.assertRaises(TypeError, f.write, 'test', 'spam') self.assertEqual(shell.written, [])
def test_write(self): shell = MockShell() f = PseudoOutputFile(shell, 'stdout', 'utf-8') f.write('test') self.assertEqual(shell.written, [('test', 'stdout')]) shell.reset() f.write('t\xe8st') self.assertEqual(shell.written, [('t\xe8st', 'stdout')]) shell.reset() f.write(S('t\xe8st')) self.assertEqual(shell.written, [('t\xe8st', 'stdout')]) self.assertEqual(type(shell.written[0][0]), str) shell.reset() self.assertRaises(TypeError, f.write) self.assertEqual(shell.written, []) self.assertRaises(TypeError, f.write, b'test') self.assertRaises(TypeError, f.write, 123) self.assertEqual(shell.written, []) self.assertRaises(TypeError, f.write, 'test', 'spam') self.assertEqual(shell.written, [])
class PyShell(OutputWindow): shell_title = 'Python ' + python_version() + ' Shell' ColorDelegator = ModifiedColorDelegator UndoDelegator = ModifiedUndoDelegator menu_specs = [('file', '_File'), ('edit', '_Edit'), ('debug', '_Debug'), ('options', '_Options'), ('windows', '_Window'), ('help', '_Help')] from idlelib.history import History def __init__(self, flist=None): if use_subprocess: ms = self.menu_specs if ms[2][0] != 'shell': ms.insert(2, ('shell', 'She_ll')) self.interp = ModifiedInterpreter(self) if flist is None: root = Tk() fixwordbreaks(root) root.withdraw() flist = PyShellFileList(root) OutputWindow.__init__(self, flist, None, None) self.usetabs = True self.indentwidth = 8 self.context_use_ps1 = True text = self.text text.configure(wrap='char') text.bind('<<newline-and-indent>>', self.enter_callback) text.bind('<<plain-newline-and-indent>>', self.linefeed_callback) text.bind('<<interrupt-execution>>', self.cancel_callback) text.bind('<<end-of-file>>', self.eof_callback) text.bind('<<open-stack-viewer>>', self.open_stack_viewer) text.bind('<<toggle-debugger>>', self.toggle_debugger) text.bind('<<toggle-jit-stack-viewer>>', self.toggle_jit_stack_viewer) if use_subprocess: text.bind('<<view-restart>>', self.view_restart_mark) text.bind('<<restart-shell>>', self.restart_shell) self.save_stdout = sys.stdout self.save_stderr = sys.stderr self.save_stdin = sys.stdin from idlelib import iomenu self.stdin = PseudoInputFile(self, 'stdin', iomenu.encoding) self.stdout = PseudoOutputFile(self, 'stdout', iomenu.encoding) self.stderr = PseudoOutputFile(self, 'stderr', iomenu.encoding) self.console = PseudoOutputFile(self, 'console', iomenu.encoding) if not use_subprocess: sys.stdout = self.stdout sys.stderr = self.stderr sys.stdin = self.stdin try: import pydoc pydoc.pager = pydoc.plainpager except: sys.stderr = sys.__stderr__ raise self.history = self.History(self.text) self.pollinterval = 50 def get_standard_extension_names(self): return idleConf.GetExtensions(shell_only=True) reading = False executing = False canceled = False endoffile = False closing = False _stop_readline_flag = False def set_warning_stream(self, stream): global warning_stream warning_stream = stream def get_warning_stream(self): return warning_stream def toggle_debugger(self, event=None): if self.executing: tkMessageBox.showerror( "Don't debug now", 'You can only toggle the debugger when idle', parent=self.text) self.set_debugger_indicator() return 'break' else: db = self.interp.getdebugger() if db: self.close_debugger() else: self.open_debugger() def set_debugger_indicator(self): db = self.interp.getdebugger() self.setvar('<<toggle-debugger>>', not not db) def toggle_jit_stack_viewer(self, event=None): pass def close_debugger(self): db = self.interp.getdebugger() if db: self.interp.setdebugger(None) db.close() if self.interp.rpcclt: debugger_r.close_remote_debugger(self.interp.rpcclt) self.resetoutput() self.console.write('[DEBUG OFF]\n') sys.ps1 = '>>> ' self.showprompt() self.set_debugger_indicator() def open_debugger(self): if self.interp.rpcclt: dbg_gui = debugger_r.start_remote_debugger(self.interp.rpcclt, self) else: dbg_gui = debugger.Debugger(self) self.interp.setdebugger(dbg_gui) dbg_gui.load_breakpoints() sys.ps1 = '[DEBUG ON]\n>>> ' self.showprompt() self.set_debugger_indicator() def beginexecuting(self): """Helper for ModifiedInterpreter""" self.resetoutput() self.executing = 1 def endexecuting(self): """Helper for ModifiedInterpreter""" self.executing = 0 self.canceled = 0 self.showprompt() def close(self): """Extend EditorWindow.close()""" if self.executing: response = tkMessageBox.askokcancel( 'Kill?', """Your program is still running! Do you want to kill it?""", default='ok', parent=self.text) if response is False: return 'cancel' self.stop_readline() self.canceled = True self.closing = True return EditorWindow.close(self) def _close(self): """Extend EditorWindow._close(), shut down debugger and execution server""" self.close_debugger() if use_subprocess: self.interp.kill_subprocess() sys.stdout = self.save_stdout sys.stderr = self.save_stderr sys.stdin = self.save_stdin self.interp = None self.console = None self.flist.pyshell = None self.history = None EditorWindow._close(self) def ispythonsource(self, filename): """Override EditorWindow method: never remove the colorizer""" return True def short_title(self): return self.shell_title COPYRIGHT = ( 'Type "copyright", "credits" or "license()" for more information.') def begin(self): self.text.mark_set('iomark', 'insert') self.resetoutput() if use_subprocess: nosub = '' client = self.interp.start_subprocess() if not client: self.close() return False else: nosub = ( '==== No Subprocess ====\n\n' + """WARNING: Running IDLE without a Subprocess is deprecated """ + 'and will be removed in a later version. See Help/IDLE Help\n' + 'for details.\n\n') sys.displayhook = rpc.displayhook self.write('Python %s on %s\n%s\n%s' % (sys.version, sys.platform, self.COPYRIGHT, nosub)) self.text.focus_force() self.showprompt() import tkinter tkinter._default_root = None return True def stop_readline(self): if not self.reading: return self._stop_readline_flag = True self.top.quit() def readline(self): save = self.reading try: self.reading = 1 self.top.mainloop() finally: self.reading = save if self._stop_readline_flag: self._stop_readline_flag = False return '' line = self.text.get('iomark', 'end-1c') if len(line) == 0: line = '\n' self.resetoutput() if self.canceled: self.canceled = 0 if not use_subprocess: raise KeyboardInterrupt if self.endoffile: self.endoffile = 0 line = '' return line def isatty(self): return True def cancel_callback(self, event=None): try: if self.text.compare('sel.first', '!=', 'sel.last'): return except: pass if not (self.executing or self.reading): self.resetoutput() self.interp.write('KeyboardInterrupt\n') self.showprompt() return 'break' self.endoffile = 0 self.canceled = 1 if self.executing and self.interp.rpcclt: if self.interp.getdebugger(): self.interp.restart_subprocess() else: self.interp.interrupt_subprocess() if self.reading: self.top.quit() return 'break' def eof_callback(self, event): if self.executing and not self.reading: return if not (self.text.compare('iomark', '==', 'insert') and self.text.compare('insert', '==', 'end-1c')): return if not self.executing: self.resetoutput() self.close() else: self.canceled = 0 self.endoffile = 1 self.top.quit() return 'break' def linefeed_callback(self, event): if self.reading: self.text.insert('insert', '\n') self.text.see('insert') else: self.newline_and_indent_event(event) return 'break' def enter_callback(self, event): if self.executing and not self.reading: return try: sel = self.text.get('sel.first', 'sel.last') if sel: if self.text.compare('sel.last', '<=', 'iomark'): self.recall(sel, event) return 'break' except: pass if self.text.compare('insert', '<', 'iomark linestart'): prev = self.text.tag_prevrange('stdin', 'insert') if prev and self.text.compare('insert', '<', prev[1]): self.recall(self.text.get(prev[0], prev[1]), event) return 'break' next = self.text.tag_nextrange('stdin', 'insert') if next and self.text.compare('insert lineend', '>=', next[0]): self.recall(self.text.get(next[0], next[1]), event) return 'break' indices = self.text.tag_nextrange('console', 'insert linestart') if indices and self.text.compare(indices[0], '<=', 'insert linestart'): self.recall(self.text.get(indices[1], 'insert lineend'), event) else: self.recall( self.text.get('insert linestart', 'insert lineend'), event) return 'break' if self.text.compare('insert', '<', 'iomark'): self.text.mark_set('insert', 'iomark') s = self.text.get('insert', 'end-1c') if s and not s.strip(): self.text.delete('insert', 'end-1c') if self.text.compare('insert', '<', 'end-1c linestart'): self.newline_and_indent_event(event) return 'break' self.text.mark_set('insert', 'end-1c') if self.reading: self.text.insert('insert', '\n') self.text.see('insert') else: self.newline_and_indent_event(event) self.text.tag_add('stdin', 'iomark', 'end-1c') self.text.update_idletasks() if self.reading: self.top.quit() else: self.runit() return 'break' def recall(self, s, event): s = re.sub('^\\s*\\n', '', s) s = re.sub('\\n\\s*$', '', s) lines = s.split('\n') self.text.undo_block_start() try: self.text.tag_remove('sel', '1.0', 'end') self.text.mark_set('insert', 'end-1c') prefix = self.text.get('insert linestart', 'insert') if prefix.rstrip().endswith(':'): self.newline_and_indent_event(event) prefix = self.text.get('insert linestart', 'insert') self.text.insert('insert', lines[0].strip()) if len(lines) > 1: orig_base_indent = re.search('^([ \\t]*)', lines[0]).group(0) new_base_indent = re.search('^([ \\t]*)', prefix).group(0) for line in lines[1:]: if line.startswith(orig_base_indent): line = new_base_indent + line[len(orig_base_indent):] self.text.insert('insert', '\n' + line.rstrip()) finally: self.text.see('insert') self.text.undo_block_stop() def runit(self): line = self.text.get('iomark', 'end-1c') i = len(line) while i > 0 and line[i - 1] in ' \t': i = i - 1 if i > 0 and line[i - 1] == '\n': i = i - 1 while i > 0 and line[i - 1] in ' \t': i = i - 1 line = line[:i] self.interp.runsource(line) def open_stack_viewer(self, event=None): if self.interp.rpcclt: return self.interp.remote_stack_viewer() try: sys.last_traceback except: tkMessageBox.showerror('No stack trace', """There is no stack trace yet. (sys.last_traceback is not defined)""", parent=self.text) return from idlelib.stackviewer import StackBrowser StackBrowser(self.root, self.flist) def view_restart_mark(self, event=None): self.text.see('iomark') self.text.see('restart') def restart_shell(self, event=None): """Callback for Run/Restart Shell Cntl-F6""" self.interp.restart_subprocess(with_cwd=True) def showprompt(self): self.resetoutput() try: s = str(sys.ps1) except: s = '' self.console.write(s) self.text.mark_set('insert', 'end-1c') self.set_line_and_column() self.io.reset_undo() def resetoutput(self): source = self.text.get('iomark', 'end-1c') if self.history: self.history.store(source) if self.text.get('end-2c') != '\n': self.text.insert('end-1c', '\n') self.text.mark_set('iomark', 'end-1c') self.set_line_and_column() def write(self, s, tags=()): if isinstance(s, str) and len(s) and max(s) > '\uffff': for start, char in enumerate(s): if char > '\uffff': break raise UnicodeEncodeError('UCS-2', char, start, start + 1, 'Non-BMP character not supported in Tk') try: self.text.mark_gravity('iomark', 'right') count = OutputWindow.write(self, s, tags, 'iomark') self.text.mark_gravity('iomark', 'left') except: raise if self.canceled: self.canceled = 0 if not use_subprocess: raise KeyboardInterrupt return count def rmenu_check_cut(self): try: if self.text.compare('sel.first', '<', 'iomark'): return 'disabled' except TclError: return 'disabled' return super().rmenu_check_cut() def rmenu_check_paste(self): if self.text.compare('insert', '<', 'iomark'): return 'disabled' return super().rmenu_check_paste()