Exemple #1
0
    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, [])
Exemple #2
0
    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, [])
Exemple #3
0
 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
Exemple #5
0
 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)
Exemple #6
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)
Exemple #7
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)
Exemple #8
0
 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 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, [])
Exemple #10
0
    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, [])
Exemple #11
0
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()