new version of PyCrust
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11395 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
		
							
								
								
									
										3
									
								
								wxPython/wxPython/lib/PyCrust/.cvsignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								wxPython/wxPython/lib/PyCrust/.cvsignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					*.pyc
 | 
				
			||||||
 | 
					*.BAK
 | 
				
			||||||
 | 
					*.$$$
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								wxPython/wxPython/lib/PyCrust/PyCrust.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								wxPython/wxPython/lib/PyCrust/PyCrust.ico
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 766 B  | 
@@ -9,8 +9,16 @@ __version__ = "$Revision$"[11:-2]
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from wxPython.wx import *
 | 
					from wxPython.wx import *
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from PyCrustVersion import version
 | 
					from version import VERSION
 | 
				
			||||||
from PyCrustShell import Shell
 | 
					from shell import Shell
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ID_AUTOCOMP = NewId()
 | 
				
			||||||
 | 
					ID_AUTOCOMP_SHOW = NewId()
 | 
				
			||||||
 | 
					ID_AUTOCOMP_INCLUDE_MAGIC = NewId()
 | 
				
			||||||
 | 
					ID_AUTOCOMP_INCLUDE_SINGLE = NewId()
 | 
				
			||||||
 | 
					ID_AUTOCOMP_INCLUDE_DOUBLE = NewId()
 | 
				
			||||||
 | 
					ID_CALLTIPS = NewId()
 | 
				
			||||||
 | 
					ID_CALLTIPS_SHOW = NewId()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Frame(wxFrame):
 | 
					class Frame(wxFrame):
 | 
				
			||||||
@@ -18,15 +26,17 @@ class Frame(wxFrame):
 | 
				
			|||||||
    def __init__(self, parent, id, title):
 | 
					    def __init__(self, parent, id, title):
 | 
				
			||||||
        """Create the main frame object for the application."""
 | 
					        """Create the main frame object for the application."""
 | 
				
			||||||
        wxFrame.__init__(self, parent, id, title)
 | 
					        wxFrame.__init__(self, parent, id, title)
 | 
				
			||||||
        intro = 'Welcome To PyCrust %s - The Flakiest Python Shell' % version
 | 
					        intro = 'Welcome To PyCrust %s - The Flakiest Python Shell' % VERSION
 | 
				
			||||||
        self.CreateStatusBar()
 | 
					        self.CreateStatusBar()
 | 
				
			||||||
        self.SetStatusText(intro)
 | 
					        self.SetStatusText(intro)
 | 
				
			||||||
 | 
					        self.icon = wxIcon('PyCrust.ico', wxBITMAP_TYPE_ICO)
 | 
				
			||||||
 | 
					        self.SetIcon(self.icon)
 | 
				
			||||||
        self.createMenus()
 | 
					        self.createMenus()
 | 
				
			||||||
        # Create the shell, which will create a default editor and
 | 
					        # Create the shell, which will create a default interpreter.
 | 
				
			||||||
        # a default interpreter.
 | 
					        locals = {'__app__': 'PyCrust Application'}
 | 
				
			||||||
        self.shell = Shell(editorParent=self, introText=intro)
 | 
					        self.shell = Shell(parent=self, id=-1, introText=intro, locals=locals)
 | 
				
			||||||
        # Override the editor so that status messages go to the status bar.
 | 
					        # Override the shell so that status messages go to the status bar.
 | 
				
			||||||
        self.shell.editor.setStatusText = self.SetStatusText
 | 
					        self.shell.setStatusText = self.SetStatusText
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def createMenus(self):
 | 
					    def createMenus(self):
 | 
				
			||||||
        m = self.fileMenu = wxMenu()
 | 
					        m = self.fileMenu = wxMenu()
 | 
				
			||||||
@@ -44,6 +54,26 @@ class Frame(wxFrame):
 | 
				
			|||||||
        m.Append(wxID_CLEAR, 'Cle&ar \tDel', 'Delete the selection')
 | 
					        m.Append(wxID_CLEAR, 'Cle&ar \tDel', 'Delete the selection')
 | 
				
			||||||
        m.Append(wxID_SELECTALL, 'Select A&ll \tCtrl+A', 'Select all text')
 | 
					        m.Append(wxID_SELECTALL, 'Select A&ll \tCtrl+A', 'Select all text')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        m = self.autocompMenu = wxMenu()
 | 
				
			||||||
 | 
					        m.Append(ID_AUTOCOMP_SHOW, 'Show Auto Completion', \
 | 
				
			||||||
 | 
					                 'Show auto completion during dot syntax', checkable=1)
 | 
				
			||||||
 | 
					        m.Append(ID_AUTOCOMP_INCLUDE_MAGIC, 'Include Magic Attributes', \
 | 
				
			||||||
 | 
					                 'Include attributes visible to __getattr__ and __setattr__', checkable=1)
 | 
				
			||||||
 | 
					        m.Append(ID_AUTOCOMP_INCLUDE_SINGLE, 'Include Single Underscores', \
 | 
				
			||||||
 | 
					                 'Include attibutes prefixed by a single underscore', checkable=1)
 | 
				
			||||||
 | 
					        m.Append(ID_AUTOCOMP_INCLUDE_DOUBLE, 'Include Double Underscores', \
 | 
				
			||||||
 | 
					                 'Include attibutes prefixed by a double underscore', checkable=1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        m = self.calltipsMenu = wxMenu()
 | 
				
			||||||
 | 
					        m.Append(ID_CALLTIPS_SHOW, 'Show Call Tips', \
 | 
				
			||||||
 | 
					                 'Show call tips with argument specifications', checkable=1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        m = self.optionsMenu = wxMenu()
 | 
				
			||||||
 | 
					        m.AppendMenu(ID_AUTOCOMP, '&Auto Completion', self.autocompMenu, \
 | 
				
			||||||
 | 
					                     'Auto Completion Options')
 | 
				
			||||||
 | 
					        m.AppendMenu(ID_CALLTIPS, '&Call Tips', self.calltipsMenu, \
 | 
				
			||||||
 | 
					                     'Call Tip Options')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        m = self.helpMenu = wxMenu()
 | 
					        m = self.helpMenu = wxMenu()
 | 
				
			||||||
        m.AppendSeparator()
 | 
					        m.AppendSeparator()
 | 
				
			||||||
        m.Append(wxID_ABOUT, '&About...', 'About PyCrust')
 | 
					        m.Append(wxID_ABOUT, '&About...', 'About PyCrust')
 | 
				
			||||||
@@ -51,6 +81,7 @@ class Frame(wxFrame):
 | 
				
			|||||||
        b = self.menuBar = wxMenuBar()
 | 
					        b = self.menuBar = wxMenuBar()
 | 
				
			||||||
        b.Append(self.fileMenu, '&File')
 | 
					        b.Append(self.fileMenu, '&File')
 | 
				
			||||||
        b.Append(self.editMenu, '&Edit')
 | 
					        b.Append(self.editMenu, '&Edit')
 | 
				
			||||||
 | 
					        b.Append(self.optionsMenu, '&Options')
 | 
				
			||||||
        b.Append(self.helpMenu, '&Help')
 | 
					        b.Append(self.helpMenu, '&Help')
 | 
				
			||||||
        self.SetMenuBar(b)
 | 
					        self.SetMenuBar(b)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -63,6 +94,11 @@ class Frame(wxFrame):
 | 
				
			|||||||
        EVT_MENU(self, wxID_CLEAR, self.OnClear)
 | 
					        EVT_MENU(self, wxID_CLEAR, self.OnClear)
 | 
				
			||||||
        EVT_MENU(self, wxID_SELECTALL, self.OnSelectAll)
 | 
					        EVT_MENU(self, wxID_SELECTALL, self.OnSelectAll)
 | 
				
			||||||
        EVT_MENU(self, wxID_ABOUT, self.OnAbout)
 | 
					        EVT_MENU(self, wxID_ABOUT, self.OnAbout)
 | 
				
			||||||
 | 
					        EVT_MENU(self, ID_AUTOCOMP_SHOW, self.OnAutoCompleteShow)
 | 
				
			||||||
 | 
					        EVT_MENU(self, ID_AUTOCOMP_INCLUDE_MAGIC, self.OnAutoCompleteIncludeMagic)
 | 
				
			||||||
 | 
					        EVT_MENU(self, ID_AUTOCOMP_INCLUDE_SINGLE, self.OnAutoCompleteIncludeSingle)
 | 
				
			||||||
 | 
					        EVT_MENU(self, ID_AUTOCOMP_INCLUDE_DOUBLE, self.OnAutoCompleteIncludeDouble)
 | 
				
			||||||
 | 
					        EVT_MENU(self, ID_CALLTIPS_SHOW, self.OnCallTipsShow)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        EVT_UPDATE_UI(self, wxID_UNDO, self.OnUpdateMenu)
 | 
					        EVT_UPDATE_UI(self, wxID_UNDO, self.OnUpdateMenu)
 | 
				
			||||||
        EVT_UPDATE_UI(self, wxID_REDO, self.OnUpdateMenu)
 | 
					        EVT_UPDATE_UI(self, wxID_REDO, self.OnUpdateMenu)
 | 
				
			||||||
@@ -70,57 +106,89 @@ class Frame(wxFrame):
 | 
				
			|||||||
        EVT_UPDATE_UI(self, wxID_COPY, self.OnUpdateMenu)
 | 
					        EVT_UPDATE_UI(self, wxID_COPY, self.OnUpdateMenu)
 | 
				
			||||||
        EVT_UPDATE_UI(self, wxID_PASTE, self.OnUpdateMenu)
 | 
					        EVT_UPDATE_UI(self, wxID_PASTE, self.OnUpdateMenu)
 | 
				
			||||||
        EVT_UPDATE_UI(self, wxID_CLEAR, self.OnUpdateMenu)
 | 
					        EVT_UPDATE_UI(self, wxID_CLEAR, self.OnUpdateMenu)
 | 
				
			||||||
 | 
					        EVT_UPDATE_UI(self, ID_AUTOCOMP_SHOW, self.OnUpdateMenu)
 | 
				
			||||||
 | 
					        EVT_UPDATE_UI(self, ID_AUTOCOMP_INCLUDE_MAGIC, self.OnUpdateMenu)
 | 
				
			||||||
 | 
					        EVT_UPDATE_UI(self, ID_AUTOCOMP_INCLUDE_SINGLE, self.OnUpdateMenu)
 | 
				
			||||||
 | 
					        EVT_UPDATE_UI(self, ID_AUTOCOMP_INCLUDE_DOUBLE, self.OnUpdateMenu)
 | 
				
			||||||
 | 
					        EVT_UPDATE_UI(self, ID_CALLTIPS_SHOW, self.OnUpdateMenu)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def OnExit(self, event):
 | 
					    def OnExit(self, event):
 | 
				
			||||||
        self.Close(true)
 | 
					        self.Close(true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def OnUndo(self, event):
 | 
					    def OnUndo(self, event):
 | 
				
			||||||
        self.shell.editor.Undo()
 | 
					        self.shell.Undo()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def OnRedo(self, event):
 | 
					    def OnRedo(self, event):
 | 
				
			||||||
        self.shell.editor.Redo()
 | 
					        self.shell.Redo()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def OnCut(self, event):
 | 
					    def OnCut(self, event):
 | 
				
			||||||
        self.shell.editor.Cut()
 | 
					        self.shell.Cut()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def OnCopy(self, event):
 | 
					    def OnCopy(self, event):
 | 
				
			||||||
        self.shell.editor.Copy()
 | 
					        self.shell.Copy()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def OnPaste(self, event):
 | 
					    def OnPaste(self, event):
 | 
				
			||||||
        self.shell.editor.Paste()
 | 
					        self.shell.Paste()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def OnClear(self, event):
 | 
					    def OnClear(self, event):
 | 
				
			||||||
        self.shell.editor.Clear()
 | 
					        self.shell.Clear()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def OnSelectAll(self, event):
 | 
					    def OnSelectAll(self, event):
 | 
				
			||||||
        self.shell.editor.SelectAll()
 | 
					        self.shell.SelectAll()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def OnAbout(self, event):
 | 
					    def OnAbout(self, event):
 | 
				
			||||||
        """Display an About PyCrust window."""
 | 
					        """Display an About PyCrust window."""
 | 
				
			||||||
        title = 'About PyCrust'
 | 
					        title = 'About PyCrust'
 | 
				
			||||||
        text = 'PyCrust %s\n\n' % version + \
 | 
					        text = 'PyCrust %s\n\n' % VERSION + \
 | 
				
			||||||
               'Yet another Python shell, only flakier.\n\n' + \
 | 
					               'Yet another Python shell, only flakier.\n\n' + \
 | 
				
			||||||
               'Half-baked by Patrick K. O\'Brien,\n' + \
 | 
					               'Half-baked by Patrick K. O\'Brien,\n' + \
 | 
				
			||||||
               'the other half is still in the oven.'
 | 
					               'the other half is still in the oven.\n\n' + \
 | 
				
			||||||
 | 
					               'Shell Revision: %s\n' % self.shell.revision + \
 | 
				
			||||||
 | 
					               'Interpreter Revision: %s\n' % self.shell.interp.revision
 | 
				
			||||||
        dialog = wxMessageDialog(self, text, title, wxOK | wxICON_INFORMATION)
 | 
					        dialog = wxMessageDialog(self, text, title, wxOK | wxICON_INFORMATION)
 | 
				
			||||||
        dialog.ShowModal()
 | 
					        dialog.ShowModal()
 | 
				
			||||||
        dialog.Destroy()
 | 
					        dialog.Destroy()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def OnAutoCompleteShow(self, event):
 | 
				
			||||||
 | 
					        self.shell.autoComplete = event.IsChecked()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def OnAutoCompleteIncludeMagic(self, event):
 | 
				
			||||||
 | 
					        self.shell.autoCompleteIncludeMagic = event.IsChecked()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def OnAutoCompleteIncludeSingle(self, event):
 | 
				
			||||||
 | 
					        self.shell.autoCompleteIncludeSingle = event.IsChecked()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def OnAutoCompleteIncludeDouble(self, event):
 | 
				
			||||||
 | 
					        self.shell.autoCompleteIncludeDouble = event.IsChecked()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def OnCallTipsShow(self, event):
 | 
				
			||||||
 | 
					        self.shell.autoCallTip = event.IsChecked()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def OnUpdateMenu(self, event):
 | 
					    def OnUpdateMenu(self, event):
 | 
				
			||||||
        """Update menu items based on which should be enabled/disabled."""
 | 
					        """Update menu items based on current status."""
 | 
				
			||||||
        id = event.GetId()
 | 
					        id = event.GetId()
 | 
				
			||||||
        if id == wxID_UNDO:
 | 
					        if id == wxID_UNDO:
 | 
				
			||||||
            event.Enable(self.shell.editor.CanUndo())
 | 
					            event.Enable(self.shell.CanUndo())
 | 
				
			||||||
        elif id == wxID_REDO:
 | 
					        elif id == wxID_REDO:
 | 
				
			||||||
            event.Enable(self.shell.editor.CanRedo())
 | 
					            event.Enable(self.shell.CanRedo())
 | 
				
			||||||
        elif id == wxID_CUT:
 | 
					        elif id == wxID_CUT:
 | 
				
			||||||
            event.Enable(self.shell.editor.CanCut())
 | 
					            event.Enable(self.shell.CanCut())
 | 
				
			||||||
        elif id == wxID_COPY:
 | 
					        elif id == wxID_COPY:
 | 
				
			||||||
            event.Enable(self.shell.editor.CanCopy())
 | 
					            event.Enable(self.shell.CanCopy())
 | 
				
			||||||
        elif id == wxID_PASTE:
 | 
					        elif id == wxID_PASTE:
 | 
				
			||||||
            event.Enable(self.shell.editor.CanPaste())
 | 
					            event.Enable(self.shell.CanPaste())
 | 
				
			||||||
        elif id == wxID_CLEAR:
 | 
					        elif id == wxID_CLEAR:
 | 
				
			||||||
            event.Enable(self.shell.editor.CanCut())
 | 
					            event.Enable(self.shell.CanCut())
 | 
				
			||||||
 | 
					        elif id == ID_AUTOCOMP_SHOW:
 | 
				
			||||||
 | 
					            event.Check(self.shell.autoComplete)
 | 
				
			||||||
 | 
					        elif id == ID_AUTOCOMP_INCLUDE_MAGIC:
 | 
				
			||||||
 | 
					            event.Check(self.shell.autoCompleteIncludeMagic)
 | 
				
			||||||
 | 
					        elif id == ID_AUTOCOMP_INCLUDE_SINGLE:
 | 
				
			||||||
 | 
					            event.Check(self.shell.autoCompleteIncludeSingle)
 | 
				
			||||||
 | 
					        elif id == ID_AUTOCOMP_INCLUDE_DOUBLE:
 | 
				
			||||||
 | 
					            event.Check(self.shell.autoCompleteIncludeDouble)
 | 
				
			||||||
 | 
					        elif id == ID_CALLTIPS_SHOW:
 | 
				
			||||||
 | 
					            event.Check(self.shell.autoCallTip)
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class App(wxApp):
 | 
					class App(wxApp):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,180 +0,0 @@
 | 
				
			|||||||
"""
 | 
					 | 
				
			||||||
"""
 | 
					 | 
				
			||||||
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
 | 
					 | 
				
			||||||
__cvsid__ = "$Id$"
 | 
					 | 
				
			||||||
__date__ = "July 1, 2001"
 | 
					 | 
				
			||||||
__version__ = "$Revision$"[11:-2]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import os
 | 
					 | 
				
			||||||
from PyCrustVersion import version
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Shell:
 | 
					 | 
				
			||||||
    """PyCrust Shell manages the Editor and Interpreter."""
 | 
					 | 
				
			||||||
    name = 'PyCrust Shell'
 | 
					 | 
				
			||||||
    revision = __version__
 | 
					 | 
				
			||||||
    def __init__(self, editorParent=None, introText='', editor=None, interp=None):
 | 
					 | 
				
			||||||
        """Create a PyCrust shell object to manage the editor and interpreter."""
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            eval('crap')
 | 
					 | 
				
			||||||
        except:
 | 
					 | 
				
			||||||
            pass
 | 
					 | 
				
			||||||
        self.introText = introText
 | 
					 | 
				
			||||||
        # Create a default editor if one isn't provided.
 | 
					 | 
				
			||||||
        if editor == None:
 | 
					 | 
				
			||||||
            from PyCrustEditor import Editor
 | 
					 | 
				
			||||||
            self.editor = Editor(editorParent, id=-1)
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            self.editor = editor
 | 
					 | 
				
			||||||
        # Link the editor to the shell so that the shell is a conduit for
 | 
					 | 
				
			||||||
        # pushing commands to the interpreter.
 | 
					 | 
				
			||||||
        self.editor.shellPush = self.shellPush
 | 
					 | 
				
			||||||
        # Create a default interpreter if one isn't provided.
 | 
					 | 
				
			||||||
        if interp == None:
 | 
					 | 
				
			||||||
            from PyCrustInterp import Interpreter
 | 
					 | 
				
			||||||
            from pseudo import PseudoFileIn, PseudoFileOut, PseudoFileErr
 | 
					 | 
				
			||||||
            self.stdin = PseudoFileIn(self.editor.readIn)
 | 
					 | 
				
			||||||
            self.stdout = PseudoFileOut(self.editor.writeOut)
 | 
					 | 
				
			||||||
            self.stderr = PseudoFileErr(self.editor.writeErr)
 | 
					 | 
				
			||||||
            # Override the default locals so we have something interesting.
 | 
					 | 
				
			||||||
            locals = {'__name__': 'PyCrust',
 | 
					 | 
				
			||||||
                      '__doc__': 'PyCrust, The Python Shell.',
 | 
					 | 
				
			||||||
                      '__version__': version,
 | 
					 | 
				
			||||||
                      }
 | 
					 | 
				
			||||||
            self.interp = Interpreter(locals=locals,
 | 
					 | 
				
			||||||
                                      rawin=self.editor.readRaw,
 | 
					 | 
				
			||||||
                                      stdin=self.stdin,
 | 
					 | 
				
			||||||
                                      stdout=self.stdout,
 | 
					 | 
				
			||||||
                                      stderr=self.stderr)
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            self.interp = interp
 | 
					 | 
				
			||||||
        # XXX redo this using hasattr() or something so that we can link
 | 
					 | 
				
			||||||
        # these if a provided editor has this method.
 | 
					 | 
				
			||||||
        if editor == None or editor == self:
 | 
					 | 
				
			||||||
            # Override so the auto complete list comes from the interpreter.
 | 
					 | 
				
			||||||
            self.editor.getAutoCompleteList = self.interp.getAutoCompleteList
 | 
					 | 
				
			||||||
            # Override so the call tip comes from the interpreter.
 | 
					 | 
				
			||||||
            self.editor.getCallTip = self.interp.getCallTip
 | 
					 | 
				
			||||||
        # Keep track of whether the interpreter needs more.
 | 
					 | 
				
			||||||
        self.more = 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            self.showIntro(self.introText)
 | 
					 | 
				
			||||||
        except:
 | 
					 | 
				
			||||||
            pass
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            self.setBuiltinKeywords()
 | 
					 | 
				
			||||||
        except:
 | 
					 | 
				
			||||||
            pass
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            self.setLocalShell()
 | 
					 | 
				
			||||||
        except:
 | 
					 | 
				
			||||||
            pass
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # Do this last so the user has complete control over their
 | 
					 | 
				
			||||||
        # environment. They can override anything they want.
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            self.execStartupScript(self.interp.startupScript)
 | 
					 | 
				
			||||||
        except:
 | 
					 | 
				
			||||||
            pass
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def destroy(self):
 | 
					 | 
				
			||||||
        del self.editor
 | 
					 | 
				
			||||||
        del self.stdin
 | 
					 | 
				
			||||||
        del self.stdout
 | 
					 | 
				
			||||||
        del self.stderr
 | 
					 | 
				
			||||||
        del self.interp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def showIntro(self, text=''):
 | 
					 | 
				
			||||||
        """Display introductory text in the shell editor."""
 | 
					 | 
				
			||||||
        if text:
 | 
					 | 
				
			||||||
            if text[-1] != '\n': text += '\n'
 | 
					 | 
				
			||||||
            self.editor.write(text)
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            self.editor.write(self.interp.introText)
 | 
					 | 
				
			||||||
        except AttributeError:
 | 
					 | 
				
			||||||
            pass
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def setBuiltinKeywords(self):
 | 
					 | 
				
			||||||
        """Create pseudo keywords as part of builtins.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        This is a rather clever hack that sets "close", "exit" and "quit"
 | 
					 | 
				
			||||||
        to a PseudoKeyword object so that we can make them do what we want.
 | 
					 | 
				
			||||||
        In this case what we want is to call our self.quit() method.
 | 
					 | 
				
			||||||
        The user can type "close", "exit" or "quit" without the final parens.
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        import __builtin__
 | 
					 | 
				
			||||||
        from pseudo import PseudoKeyword
 | 
					 | 
				
			||||||
        __builtin__.close = __builtin__.exit = __builtin__.quit = \
 | 
					 | 
				
			||||||
            PseudoKeyword(self.quit)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def quit(self):
 | 
					 | 
				
			||||||
        """Quit the application."""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # XXX Good enough for now but later we want to send a close event.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # In the close event handler we can prompt to make sure they want to quit.
 | 
					 | 
				
			||||||
        # Other applications, like PythonCard, may choose to hide rather than
 | 
					 | 
				
			||||||
        # quit so we should just post the event and let the surrounding app
 | 
					 | 
				
			||||||
        # decide what it wants to do.
 | 
					 | 
				
			||||||
        self.editor.write('Click on the close button to leave the application.')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def setLocalShell(self):
 | 
					 | 
				
			||||||
        """Add 'shell' to locals."""
 | 
					 | 
				
			||||||
        self.interp.locals['shell'] = self
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def execStartupScript(self, startupScript):
 | 
					 | 
				
			||||||
        """Execute the user's PYTHONSTARTUP script if they have one."""
 | 
					 | 
				
			||||||
        if startupScript and os.path.isfile(startupScript):
 | 
					 | 
				
			||||||
            startupText = 'Startup script executed: ' + startupScript
 | 
					 | 
				
			||||||
            self.editor.push('print %s;execfile(%s)' % \
 | 
					 | 
				
			||||||
                            (`startupText`, `startupScript`))
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            self.editor.push('')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def run(self, command, prompt=1, verbose=1):
 | 
					 | 
				
			||||||
        """Execute command within the shell as if it was typed in directly.
 | 
					 | 
				
			||||||
        >>> shell.run('print "this"')
 | 
					 | 
				
			||||||
        >>> print "this"
 | 
					 | 
				
			||||||
        this
 | 
					 | 
				
			||||||
        >>>
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        command = command.rstrip()
 | 
					 | 
				
			||||||
        if prompt: self.editor.prompt()
 | 
					 | 
				
			||||||
        if verbose: self.editor.write(command)
 | 
					 | 
				
			||||||
        self.editor.push(command)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def runfile(self, filename):
 | 
					 | 
				
			||||||
        """Execute all commands in file as if they were typed into the shell."""
 | 
					 | 
				
			||||||
        file = open(filename)
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            self.editor.prompt()
 | 
					 | 
				
			||||||
            for command in file.readlines():
 | 
					 | 
				
			||||||
                if command[:6] == 'shell.':  # Run shell methods silently.
 | 
					 | 
				
			||||||
                    self.run(command, prompt=0, verbose=0)
 | 
					 | 
				
			||||||
                else:
 | 
					 | 
				
			||||||
                    self.run(command, prompt=0, verbose=1)
 | 
					 | 
				
			||||||
        finally:
 | 
					 | 
				
			||||||
            file.close()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def push(self, command):
 | 
					 | 
				
			||||||
        """Send command to the interpreter for execution."""
 | 
					 | 
				
			||||||
        self.more = self.interp.push(command)
 | 
					 | 
				
			||||||
        return self.more
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    shellPush = push
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def ask(self, prompt='Please enter your response:'):
 | 
					 | 
				
			||||||
        """Get response from the user."""
 | 
					 | 
				
			||||||
        return raw_input(prompt=prompt)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def pause(self):
 | 
					 | 
				
			||||||
        """Halt execution pending a response from the user."""
 | 
					 | 
				
			||||||
        self.ask('Press enter to continue:')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def clear(self):
 | 
					 | 
				
			||||||
        """Delete all text from the shell editor."""
 | 
					 | 
				
			||||||
        self.editor.clear()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
							
								
								
									
										43
									
								
								wxPython/wxPython/lib/PyCrust/README.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								wxPython/wxPython/lib/PyCrust/README.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
				
			|||||||
 | 
					PyCrust - The Flakiest Python Shell
 | 
				
			||||||
 | 
					Half-baked by Patrick K. O'Brien (pobrien@orbtech.com)
 | 
				
			||||||
 | 
					======================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					What is PyCrust?
 | 
				
			||||||
 | 
					----------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PyCrust is is an interactive Python Shell written in Python.
 | 
				
			||||||
 | 
					PyCrust can be run standalone or integrated into other development
 | 
				
			||||||
 | 
					environments or other Python applications.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Where can I get the latest files and join the mailing lists?
 | 
				
			||||||
 | 
					------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Latest PyCrust releases:
 | 
				
			||||||
 | 
					http://sourceforge.net/project/showfiles.php?group_id=31263
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PyCrust home page:
 | 
				
			||||||
 | 
					http://pycrust.sourceforge.net/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SourceForge summary page:
 | 
				
			||||||
 | 
					http://sourceforge.net/projects/pycrust/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PyCrust Mailing lists:
 | 
				
			||||||
 | 
					http://sourceforge.net/mail/?group_id=31263
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					What else do I need to use PyCrust?
 | 
				
			||||||
 | 
					-----------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PyCrust requires Python 2.1 or later, and wxPython 2.3.1 or later.
 | 
				
			||||||
 | 
					PyCrust uses wxPython and the Scintilla wrapper class (wxStyledTextCtrl).
 | 
				
			||||||
 | 
					Python is available at http://www.python.org/.
 | 
				
			||||||
 | 
					wxPython is available at http://www.wxpython.org/.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					What is the CVS information for this README file?
 | 
				
			||||||
 | 
					-------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$Date$
 | 
				
			||||||
 | 
					$Revision$
 | 
				
			||||||
 | 
					$Id$
 | 
				
			||||||
@@ -1,3 +1,5 @@
 | 
				
			|||||||
 | 
					"""PyCrust Interpreter executes Python commands.
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
 | 
					__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
 | 
				
			||||||
__cvsid__ = "$Id$"
 | 
					__cvsid__ = "$Id$"
 | 
				
			||||||
@@ -67,15 +69,15 @@ class Interpreter(InteractiveInterpreter):
 | 
				
			|||||||
        sys.stdin, sys.stdout, sys.stderr = stdin, stdout, stderr
 | 
					        sys.stdin, sys.stdout, sys.stderr = stdin, stdout, stderr
 | 
				
			||||||
        return more
 | 
					        return more
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
    def getAutoCompleteList(self, command=''):
 | 
					    def getAutoCompleteList(self, command='', *args, **kwds):
 | 
				
			||||||
        """Return list of auto-completion options for a command.
 | 
					        """Return list of auto-completion options for a command.
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        The list of options will be based on the locals namespace."""
 | 
					        The list of options will be based on the locals namespace."""
 | 
				
			||||||
        return introspect.getAutoCompleteList(command, self.locals)
 | 
					        return introspect.getAutoCompleteList(command, self.locals, *args, **kwds)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def getCallTip(self, command=''):
 | 
					    def getCallTip(self, command='', *args, **kwds):
 | 
				
			||||||
        """Return call tip text for a command.
 | 
					        """Return call tip text for a command.
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        The call tip information will be based on the locals namespace."""
 | 
					        The call tip information will be based on the locals namespace."""
 | 
				
			||||||
        return introspect.getCallTip(command, self.locals)
 | 
					        return introspect.getCallTip(command, self.locals, *args, **kwds)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -9,7 +9,8 @@ __version__ = "$Revision$"[11:-2]
 | 
				
			|||||||
import inspect
 | 
					import inspect
 | 
				
			||||||
import string
 | 
					import string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def getAutoCompleteList(command='', locals=None):
 | 
					def getAutoCompleteList(command='', locals=None, includeMagic=1, \
 | 
				
			||||||
 | 
					                        includeSingle=1, includeDouble=1):
 | 
				
			||||||
    """Return list of auto-completion options for command.
 | 
					    """Return list of auto-completion options for command.
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    The list of options will be based on the locals namespace."""
 | 
					    The list of options will be based on the locals namespace."""
 | 
				
			||||||
@@ -18,36 +19,44 @@ def getAutoCompleteList(command='', locals=None):
 | 
				
			|||||||
    root = getRoot(command, terminator='.')
 | 
					    root = getRoot(command, terminator='.')
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        object = eval(root, locals)
 | 
					        object = eval(root, locals)
 | 
				
			||||||
        attributes = getAttributes(object)
 | 
					        attributes = getAttributeNames(object)
 | 
				
			||||||
 | 
					        if includeMagic:
 | 
				
			||||||
 | 
					            try: attributes += object._getAttributeNames()
 | 
				
			||||||
 | 
					            except: pass
 | 
				
			||||||
 | 
					        if not includeSingle:
 | 
				
			||||||
 | 
					            attributes = filter(lambda item: item[0]!='_' or item[1]=='_', attributes)
 | 
				
			||||||
 | 
					        if not includeDouble:
 | 
				
			||||||
 | 
					            attributes = filter(lambda item: item[:2]!='__', attributes)
 | 
				
			||||||
        return attributes
 | 
					        return attributes
 | 
				
			||||||
    except:
 | 
					    except:
 | 
				
			||||||
        return []
 | 
					        return []
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
def getAttributes(object):
 | 
					def getAttributeNames(object):
 | 
				
			||||||
    """Return list of unique attributes, including inherited, for an object."""
 | 
					    """Return list of unique attributes, including inherited, for an object."""
 | 
				
			||||||
    attributes = []
 | 
					    attributes = []
 | 
				
			||||||
    dict = {}
 | 
					    dict = {}
 | 
				
			||||||
    # Remove duplicates from the attribute list.
 | 
					    # Remove duplicates from the attribute list.
 | 
				
			||||||
    for item in getAllAttributes(object):
 | 
					    for item in getAllAttributeNames(object):
 | 
				
			||||||
        dict[item] = None
 | 
					        dict[item] = None
 | 
				
			||||||
    attributes += dict.keys()
 | 
					    attributes += dict.keys()
 | 
				
			||||||
    attributes.sort()
 | 
					    attributes.sort()
 | 
				
			||||||
    return attributes
 | 
					    return attributes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def getAllAttributes(object):
 | 
					def getAllAttributeNames(object):
 | 
				
			||||||
    """Return list of all attributes, including inherited, for an object.
 | 
					    """Return list of all attributes, including inherited, for an object.
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    Recursively walk through a class and all base classes.
 | 
					    Recursively walk through a class and all base classes.
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    attributes = []
 | 
					    attributes = []
 | 
				
			||||||
    try:
 | 
					    # Get attributes available through the normal convention.
 | 
				
			||||||
    attributes += dir(object)
 | 
					    attributes += dir(object)
 | 
				
			||||||
 | 
					    # For a class instance, get the attributes for the class.
 | 
				
			||||||
    if hasattr(object, '__class__'):
 | 
					    if hasattr(object, '__class__'):
 | 
				
			||||||
            attributes += getAllAttributes(object.__class__)
 | 
					        attributes += getAllAttributeNames(object.__class__)
 | 
				
			||||||
 | 
					    # Also get attributes from any and all parent classes.
 | 
				
			||||||
    if hasattr(object, '__bases__'):
 | 
					    if hasattr(object, '__bases__'):
 | 
				
			||||||
        for base in object.__bases__:
 | 
					        for base in object.__bases__:
 | 
				
			||||||
                attributes += getAllAttributes(base)
 | 
					            attributes += getAllAttributeNames(base)
 | 
				
			||||||
    finally:
 | 
					 | 
				
			||||||
    return attributes
 | 
					    return attributes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def getCallTip(command='', locals=None):
 | 
					def getCallTip(command='', locals=None):
 | 
				
			||||||
@@ -119,21 +128,30 @@ def getRoot(command, terminator=None):
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    The command would normally terminate with a "(" or ".". Anything after 
 | 
					    The command would normally terminate with a "(" or ".". Anything after 
 | 
				
			||||||
    the terminator will be dropped, allowing you to get back to the root.
 | 
					    the terminator will be dropped, allowing you to get back to the root.
 | 
				
			||||||
 | 
					    Return only the root portion that can be eval()'d without side effect.
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    root = ''
 | 
					    root = ''
 | 
				
			||||||
    validChars = "._" + string.uppercase + string.lowercase + string.digits
 | 
					    validChars = "._" + string.uppercase + string.lowercase + string.digits
 | 
				
			||||||
    # Remove all whitespace from the command.
 | 
					 | 
				
			||||||
    command = ''.join(command.split())
 | 
					 | 
				
			||||||
    # Deal with the terminator.
 | 
					 | 
				
			||||||
    if terminator:
 | 
					    if terminator:
 | 
				
			||||||
 | 
					        # Drop the final terminator and anything that follows.
 | 
				
			||||||
        pieces = command.split(terminator)
 | 
					        pieces = command.split(terminator)
 | 
				
			||||||
        if len(pieces) > 1:
 | 
					        if len(pieces) > 1:
 | 
				
			||||||
            # Drop the final terminator and anything that follows.
 | 
					 | 
				
			||||||
            command = terminator.join(pieces[:-1])
 | 
					            command = terminator.join(pieces[:-1])
 | 
				
			||||||
 | 
					    if command in ("''", '""', '""""""', '[]', '()', '{}'):
 | 
				
			||||||
 | 
					        # Let empty type delimiter pairs go through.
 | 
				
			||||||
 | 
					        root = command
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
        # Go backward through the command until we hit an "invalid" character.
 | 
					        # Go backward through the command until we hit an "invalid" character.
 | 
				
			||||||
        i = len(command)
 | 
					        i = len(command)
 | 
				
			||||||
        while i and command[i-1] in validChars:
 | 
					        while i and command[i-1] in validChars:
 | 
				
			||||||
            i -= 1
 | 
					            i -= 1
 | 
				
			||||||
 | 
					        # Detect situations where we are in the middle of a string.
 | 
				
			||||||
 | 
					        # This code catches the simplest case, but needs to catch others.
 | 
				
			||||||
 | 
					        if command[i-1] in ("'", '"'):
 | 
				
			||||||
 | 
					            # Were in the middle of a string so we aren't dealing with an
 | 
				
			||||||
 | 
					            # object and it would be misleading to return anything here.
 | 
				
			||||||
 | 
					            root = ''
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
            # Grab everything from the "invalid" character to the end.
 | 
					            # Grab everything from the "invalid" character to the end.
 | 
				
			||||||
            root = command[i:]
 | 
					            root = command[i:]
 | 
				
			||||||
    return root
 | 
					    return root
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,7 @@
 | 
				
			|||||||
 | 
					"""PyCrust Shell is the gui text control in which a user interacts and types
 | 
				
			||||||
 | 
					in commands to be sent to the interpreter. This particular shell is based on
 | 
				
			||||||
 | 
					wxPython's wxStyledTextCtrl.
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
 | 
					__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
 | 
				
			||||||
__cvsid__ = "$Id$"
 | 
					__cvsid__ = "$Id$"
 | 
				
			||||||
@@ -8,8 +12,10 @@ from wxPython.wx import *
 | 
				
			|||||||
from wxPython.stc import *
 | 
					from wxPython.stc import *
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import keyword
 | 
					import keyword
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
import sys
 | 
					import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from version import VERSION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if wxPlatform == '__WXMSW__':
 | 
					if wxPlatform == '__WXMSW__':
 | 
				
			||||||
    faces = { 'times'  : 'Times New Roman',
 | 
					    faces = { 'times'  : 'Times New Roman',
 | 
				
			||||||
@@ -32,26 +38,77 @@ else:  # GTK
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Editor(wxStyledTextCtrl):
 | 
					class Shell(wxStyledTextCtrl):
 | 
				
			||||||
    """PyCrust Editor based on wxStyledTextCtrl."""
 | 
					    """PyCrust Shell based on wxStyledTextCtrl."""
 | 
				
			||||||
 | 
					    name = 'PyCrust Shell'
 | 
				
			||||||
    revision = __version__
 | 
					    revision = __version__
 | 
				
			||||||
    def __init__(self, parent, id):
 | 
					    def __init__(self, parent, id, introText='', locals=None, interp=None):
 | 
				
			||||||
        """Create a PyCrust editor object based on wxStyledTextCtrl."""
 | 
					        """Create a PyCrust Shell object."""
 | 
				
			||||||
        wxStyledTextCtrl.__init__(self, parent, id, style=wxCLIP_CHILDREN)
 | 
					        wxStyledTextCtrl.__init__(self, parent, id, style=wxCLIP_CHILDREN)
 | 
				
			||||||
        # Commands get pushed to a method determined by the outer shell.
 | 
					        self.introText = introText
 | 
				
			||||||
        #self.shellPush = pushMethod
 | 
					 | 
				
			||||||
        # Keep track of the most recent prompt starting and ending positions.
 | 
					        # Keep track of the most recent prompt starting and ending positions.
 | 
				
			||||||
        self.promptPos = [0, 0]
 | 
					        self.promptPos = [0, 0]
 | 
				
			||||||
        # Keep track of multi-line commands.
 | 
					        # Keep track of multi-line commands.
 | 
				
			||||||
        self.more = 0
 | 
					        self.more = 0
 | 
				
			||||||
        # Configure various defaults and user preferences.
 | 
					 | 
				
			||||||
        self.config()
 | 
					 | 
				
			||||||
        # Assign handlers for keyboard events.
 | 
					        # Assign handlers for keyboard events.
 | 
				
			||||||
        EVT_KEY_DOWN(self, self.OnKeyDown)
 | 
					        EVT_KEY_DOWN(self, self.OnKeyDown)
 | 
				
			||||||
        EVT_CHAR(self, self.OnChar)
 | 
					        EVT_CHAR(self, self.OnChar)
 | 
				
			||||||
 | 
					        # Create a default interpreter if one isn't provided.
 | 
				
			||||||
 | 
					        if interp == None:
 | 
				
			||||||
 | 
					            from interpreter import Interpreter
 | 
				
			||||||
 | 
					            from pseudo import PseudoFileIn, PseudoFileOut, PseudoFileErr
 | 
				
			||||||
 | 
					            self.stdin = PseudoFileIn(self.readIn)
 | 
				
			||||||
 | 
					            self.stdout = PseudoFileOut(self.writeOut)
 | 
				
			||||||
 | 
					            self.stderr = PseudoFileErr(self.writeErr)
 | 
				
			||||||
 | 
					            # Override the default locals so we have something interesting.
 | 
				
			||||||
 | 
					            self.locals = {'__name__': 'PyCrust', 
 | 
				
			||||||
 | 
					                           '__doc__': 'PyCrust, The Python Shell.',
 | 
				
			||||||
 | 
					                           '__version__': VERSION,
 | 
				
			||||||
 | 
					                          }
 | 
				
			||||||
 | 
					            # Add the dictionary that was passed in.
 | 
				
			||||||
 | 
					            if locals:
 | 
				
			||||||
 | 
					                self.locals.update(locals)
 | 
				
			||||||
 | 
					            self.interp = Interpreter(locals=self.locals, 
 | 
				
			||||||
 | 
					                                      rawin=self.readRaw,
 | 
				
			||||||
 | 
					                                      stdin=self.stdin, 
 | 
				
			||||||
 | 
					                                      stdout=self.stdout, 
 | 
				
			||||||
 | 
					                                      stderr=self.stderr)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            self.interp = interp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Configure various defaults and user preferences.
 | 
				
			||||||
 | 
					        self.config()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            self.showIntro(self.introText)
 | 
				
			||||||
 | 
					        except:
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            self.setBuiltinKeywords()
 | 
				
			||||||
 | 
					        except:
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            self.setLocalShell()
 | 
				
			||||||
 | 
					        except:
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        # Do this last so the user has complete control over their
 | 
				
			||||||
 | 
					        # environment. They can override anything they want.
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            self.execStartupScript(self.interp.startupScript)
 | 
				
			||||||
 | 
					        except:
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					    def destroy(self):
 | 
				
			||||||
 | 
					        del self.stdin
 | 
				
			||||||
 | 
					        del self.stdout
 | 
				
			||||||
 | 
					        del self.stderr
 | 
				
			||||||
 | 
					        del self.interp
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
    def config(self):
 | 
					    def config(self):
 | 
				
			||||||
        """Configure editor based on user preferences."""
 | 
					        """Configure shell based on user preferences."""
 | 
				
			||||||
        self.SetMarginType(1, wxSTC_MARGIN_NUMBER)
 | 
					        self.SetMarginType(1, wxSTC_MARGIN_NUMBER)
 | 
				
			||||||
        self.SetMarginWidth(1, 40)
 | 
					        self.SetMarginWidth(1, 40)
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
@@ -64,12 +121,62 @@ class Editor(wxStyledTextCtrl):
 | 
				
			|||||||
        self.SetUseTabs(0)
 | 
					        self.SetUseTabs(0)
 | 
				
			||||||
        # Do we want to automatically pop up command completion options?
 | 
					        # Do we want to automatically pop up command completion options?
 | 
				
			||||||
        self.autoComplete = 1
 | 
					        self.autoComplete = 1
 | 
				
			||||||
 | 
					        self.autoCompleteIncludeMagic = 1
 | 
				
			||||||
 | 
					        self.autoCompleteIncludeSingle = 1
 | 
				
			||||||
 | 
					        self.autoCompleteIncludeDouble = 1
 | 
				
			||||||
        self.autoCompleteCaseInsensitive = 1
 | 
					        self.autoCompleteCaseInsensitive = 1
 | 
				
			||||||
        self.AutoCompSetIgnoreCase(self.autoCompleteCaseInsensitive)
 | 
					        self.AutoCompSetIgnoreCase(self.autoCompleteCaseInsensitive)
 | 
				
			||||||
        # De we want to automatically pop up command argument help?
 | 
					        # De we want to automatically pop up command argument help?
 | 
				
			||||||
        self.autoCallTip = 1
 | 
					        self.autoCallTip = 1
 | 
				
			||||||
        self.CallTipSetBackground(wxColour(255, 255, 232))
 | 
					        self.CallTipSetBackground(wxColour(255, 255, 232))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def showIntro(self, text=''):
 | 
				
			||||||
 | 
					        """Display introductory text in the shell."""
 | 
				
			||||||
 | 
					        if text:
 | 
				
			||||||
 | 
					            if text[-1] != '\n': text += '\n'
 | 
				
			||||||
 | 
					            self.write(text)
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            self.write(self.interp.introText)
 | 
				
			||||||
 | 
					        except AttributeError:
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def setBuiltinKeywords(self):
 | 
				
			||||||
 | 
					        """Create pseudo keywords as part of builtins.
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        This is a rather clever hack that sets "close", "exit" and "quit" 
 | 
				
			||||||
 | 
					        to a PseudoKeyword object so that we can make them do what we want.
 | 
				
			||||||
 | 
					        In this case what we want is to call our self.quit() method.
 | 
				
			||||||
 | 
					        The user can type "close", "exit" or "quit" without the final parens.
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        import __builtin__
 | 
				
			||||||
 | 
					        from pseudo import PseudoKeyword
 | 
				
			||||||
 | 
					        __builtin__.close = __builtin__.exit = __builtin__.quit = \
 | 
				
			||||||
 | 
					            PseudoKeyword(self.quit)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def quit(self):
 | 
				
			||||||
 | 
					        """Quit the application."""
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        # XXX Good enough for now but later we want to send a close event.
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        # In the close event handler we can prompt to make sure they want to quit.
 | 
				
			||||||
 | 
					        # Other applications, like PythonCard, may choose to hide rather than
 | 
				
			||||||
 | 
					        # quit so we should just post the event and let the surrounding app
 | 
				
			||||||
 | 
					        # decide what it wants to do.
 | 
				
			||||||
 | 
					        self.write('Click on the close button to leave the application.')
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def setLocalShell(self):
 | 
				
			||||||
 | 
					        """Add 'shell' to locals."""
 | 
				
			||||||
 | 
					        self.interp.locals['shell'] = self
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def execStartupScript(self, startupScript):
 | 
				
			||||||
 | 
					        """Execute the user's PYTHONSTARTUP script if they have one."""
 | 
				
			||||||
 | 
					        if startupScript and os.path.isfile(startupScript):
 | 
				
			||||||
 | 
					            startupText = 'Startup script executed: ' + startupScript
 | 
				
			||||||
 | 
					            self.push('print %s;execfile(%s)' % \
 | 
				
			||||||
 | 
					                      (`startupText`, `startupScript`))
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            self.push('')
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
    def setStyles(self, faces):
 | 
					    def setStyles(self, faces):
 | 
				
			||||||
        """Configure font size, typeface and color for lexer."""
 | 
					        """Configure font size, typeface and color for lexer."""
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
@@ -180,48 +287,18 @@ class Editor(wxStyledTextCtrl):
 | 
				
			|||||||
        # to do something more interesting, like write to a status bar.
 | 
					        # to do something more interesting, like write to a status bar.
 | 
				
			||||||
        print text
 | 
					        print text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def autoCompleteShow(self, command):
 | 
					 | 
				
			||||||
        """Display auto-completion popup list."""
 | 
					 | 
				
			||||||
        list = self.getAutoCompleteList(command)
 | 
					 | 
				
			||||||
        if list:
 | 
					 | 
				
			||||||
            options = ' '.join(list)
 | 
					 | 
				
			||||||
            offset = 0
 | 
					 | 
				
			||||||
            self.AutoCompShow(offset, options)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def getAutoCompleteList(self, command):
 | 
					 | 
				
			||||||
        """Return list of auto-completion options for command."""
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        # This method needs to be replaced by the enclosing app
 | 
					 | 
				
			||||||
        # to get the proper auto complete list from the interpreter.
 | 
					 | 
				
			||||||
        return []
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def autoCallTipShow(self, command):
 | 
					 | 
				
			||||||
        """Display argument spec and docstring in a popup bubble thingie."""
 | 
					 | 
				
			||||||
        if self.CallTipActive: self.CallTipCancel()
 | 
					 | 
				
			||||||
        tip = self.getCallTip(command)
 | 
					 | 
				
			||||||
        if tip:
 | 
					 | 
				
			||||||
            offset = self.GetCurrentPos()
 | 
					 | 
				
			||||||
            self.CallTipShow(offset, tip)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def getCallTip(self, command):
 | 
					 | 
				
			||||||
        """Return arguments and docstring for command."""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # This method needs to be replaced by the enclosing app
 | 
					 | 
				
			||||||
        # to get the proper auto complete list from the interpreter.
 | 
					 | 
				
			||||||
        return ''
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def processLine(self):
 | 
					    def processLine(self):
 | 
				
			||||||
        """Process the line of text at which the user hit Enter."""
 | 
					        """Process the line of text at which the user hit Enter."""
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # The user hit ENTER and we need to decide what to do. They could be
 | 
					        # The user hit ENTER and we need to decide what to do. They could be
 | 
				
			||||||
        # sitting on any line in the editor.
 | 
					        # sitting on any line in the shell.
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # Grab information about the current line.
 | 
					        # Grab information about the current line.
 | 
				
			||||||
        thepos = self.GetCurrentPos()
 | 
					        thepos = self.GetCurrentPos()
 | 
				
			||||||
        theline = self.GetCurrentLine()
 | 
					        theline = self.GetCurrentLine()
 | 
				
			||||||
        thetext = self.GetCurLine()[0]
 | 
					        thetext = self.GetCurLine()[0]
 | 
				
			||||||
        command = self.getCommand(thetext)
 | 
					        command = self.getCommand(thetext)
 | 
				
			||||||
        # Go to the very bottom of the editor.
 | 
					        # Go to the very bottom of the text.
 | 
				
			||||||
        endpos = self.GetTextLength()
 | 
					        endpos = self.GetTextLength()
 | 
				
			||||||
        self.SetCurrentPos(endpos)
 | 
					        self.SetCurrentPos(endpos)
 | 
				
			||||||
        endline = self.GetCurrentLine()
 | 
					        endline = self.GetCurrentLine()
 | 
				
			||||||
@@ -266,18 +343,20 @@ class Editor(wxStyledTextCtrl):
 | 
				
			|||||||
        return command
 | 
					        return command
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    def push(self, command):
 | 
					    def push(self, command):
 | 
				
			||||||
        """Start a new line, send command to the shell, display a prompt."""
 | 
					        """Send command to the interpreter for execution."""
 | 
				
			||||||
        self.write('\n')
 | 
					        self.write('\n')
 | 
				
			||||||
        self.more = self.shellPush(command)
 | 
					        self.more = self.interp.push(command)
 | 
				
			||||||
        self.prompt()
 | 
					        self.prompt()
 | 
				
			||||||
        # Keep the undo feature from undoing previous responses. The only
 | 
					        # Keep the undo feature from undoing previous responses. The only
 | 
				
			||||||
        # thing that can be undone is stuff typed after the prompt, before
 | 
					        # thing that can be undone is stuff typed after the prompt, before
 | 
				
			||||||
        # hitting enter. After they hit enter it becomes permanent.
 | 
					        # hitting enter. After they hit enter it becomes permanent.
 | 
				
			||||||
        self.EmptyUndoBuffer()
 | 
					        self.EmptyUndoBuffer()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def clear(self):
 | 
					    def write(self, text):
 | 
				
			||||||
        """Delete all text from the editor."""
 | 
					        """Display text in the shell."""
 | 
				
			||||||
        self.ClearAll()
 | 
					        self.AddText(text)
 | 
				
			||||||
 | 
					        self.EnsureCaretVisible()
 | 
				
			||||||
 | 
					        #self.ScrollToColumn(0)
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    def prompt(self):
 | 
					    def prompt(self):
 | 
				
			||||||
        """Display appropriate prompt for the context, either ps1 or ps2.
 | 
					        """Display appropriate prompt for the context, either ps1 or ps2.
 | 
				
			||||||
@@ -325,11 +404,61 @@ class Editor(wxStyledTextCtrl):
 | 
				
			|||||||
            dialog.Destroy()
 | 
					            dialog.Destroy()
 | 
				
			||||||
        return ''
 | 
					        return ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def write(self, text):
 | 
					    def ask(self, prompt='Please enter your response:'):
 | 
				
			||||||
        """Display text in the editor."""
 | 
					        """Get response from the user."""
 | 
				
			||||||
        self.AddText(text)
 | 
					        return raw_input(prompt=prompt)
 | 
				
			||||||
        self.EnsureCaretVisible()
 | 
					        
 | 
				
			||||||
        #self.ScrollToColumn(0)
 | 
					    def pause(self):
 | 
				
			||||||
 | 
					        """Halt execution pending a response from the user."""
 | 
				
			||||||
 | 
					        self.ask('Press enter to continue:')
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    def clear(self):
 | 
				
			||||||
 | 
					        """Delete all text from the shell."""
 | 
				
			||||||
 | 
					        self.ClearAll()
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    def run(self, command, prompt=1, verbose=1):
 | 
				
			||||||
 | 
					        """Execute command within the shell as if it was typed in directly.
 | 
				
			||||||
 | 
					        >>> shell.run('print "this"')
 | 
				
			||||||
 | 
					        >>> print "this"
 | 
				
			||||||
 | 
					        this
 | 
				
			||||||
 | 
					        >>> 
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        command = command.rstrip()
 | 
				
			||||||
 | 
					        if prompt: self.prompt()
 | 
				
			||||||
 | 
					        if verbose: self.write(command)
 | 
				
			||||||
 | 
					        self.push(command)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def runfile(self, filename):
 | 
				
			||||||
 | 
					        """Execute all commands in file as if they were typed into the shell."""
 | 
				
			||||||
 | 
					        file = open(filename)
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            self.prompt()
 | 
				
			||||||
 | 
					            for command in file.readlines():
 | 
				
			||||||
 | 
					                if command[:6] == 'shell.':  # Run shell methods silently.
 | 
				
			||||||
 | 
					                    self.run(command, prompt=0, verbose=0)
 | 
				
			||||||
 | 
					                else:
 | 
				
			||||||
 | 
					                    self.run(command, prompt=0, verbose=1)
 | 
				
			||||||
 | 
					        finally:
 | 
				
			||||||
 | 
					            file.close()
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def autoCompleteShow(self, command):
 | 
				
			||||||
 | 
					        """Display auto-completion popup list."""
 | 
				
			||||||
 | 
					        list = self.interp.getAutoCompleteList(command, \
 | 
				
			||||||
 | 
					                    includeMagic=self.autoCompleteIncludeMagic, \
 | 
				
			||||||
 | 
					                    includeSingle=self.autoCompleteIncludeSingle, \
 | 
				
			||||||
 | 
					                    includeDouble=self.autoCompleteIncludeDouble)
 | 
				
			||||||
 | 
					        if list:
 | 
				
			||||||
 | 
					            options = ' '.join(list)
 | 
				
			||||||
 | 
					            offset = 0
 | 
				
			||||||
 | 
					            self.AutoCompShow(offset, options)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def autoCallTipShow(self, command):
 | 
				
			||||||
 | 
					        """Display argument spec and docstring in a popup bubble thingie."""
 | 
				
			||||||
 | 
					        if self.CallTipActive: self.CallTipCancel()
 | 
				
			||||||
 | 
					        tip = self.interp.getCallTip(command)
 | 
				
			||||||
 | 
					        if tip:
 | 
				
			||||||
 | 
					            offset = self.GetCurrentPos()
 | 
				
			||||||
 | 
					            self.CallTipShow(offset, tip)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def writeOut(self, text):
 | 
					    def writeOut(self, text):
 | 
				
			||||||
        """Replacement for stdout."""
 | 
					        """Replacement for stdout."""
 | 
				
			||||||
@@ -1,10 +1,10 @@
 | 
				
			|||||||
"""Provides an object representing the current "version" or "release" of
 | 
					"""Provides an object representing the current "version" or "release" of
 | 
				
			||||||
PyCrust as a whole. Individual classes, such as the shell, editor and
 | 
					PyCrust as a whole. Individual classes, such as the shell, editor and
 | 
				
			||||||
interpreter, each have a revision property based on the CVS $Revision$."""
 | 
					interpreter, each have a revision property based on the CVS Revision."""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
 | 
					__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
 | 
				
			||||||
__cvsid__ = "$Id$"
 | 
					__cvsid__ = "$Id$"
 | 
				
			||||||
__date__ = "July 1, 2001"
 | 
					__date__ = "July 1, 2001"
 | 
				
			||||||
__version__ = "$Revision$"[11:-2]
 | 
					__version__ = "$Revision$"[11:-2]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
version = '0.5'
 | 
					VERSION = '0.5.2'
 | 
				
			||||||
		Reference in New Issue
	
	Block a user