Merged the wxPy_newswig branch into the HEAD branch (main trunk)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@24541 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
		@@ -1,8 +1,125 @@
 | 
			
		||||
"""Interpreter executes Python commands."""
 | 
			
		||||
 | 
			
		||||
"""Renamer stub: provides a way to drop the wx prefix from wxPython objects."""
 | 
			
		||||
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
 | 
			
		||||
__cvsid__ = "$Id$"
 | 
			
		||||
__revision__ = "$Revision$"[11:-2]
 | 
			
		||||
 | 
			
		||||
from wx import _rename
 | 
			
		||||
from wxPython.py import interpreter
 | 
			
		||||
_rename(globals(), interpreter.__dict__, modulename='py.interpreter')
 | 
			
		||||
del interpreter
 | 
			
		||||
del _rename
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
from code import InteractiveInterpreter
 | 
			
		||||
import dispatcher
 | 
			
		||||
import introspect
 | 
			
		||||
 | 
			
		||||
try:
 | 
			
		||||
    True
 | 
			
		||||
except NameError:
 | 
			
		||||
    True = 1==1
 | 
			
		||||
    False = 1==0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Interpreter(InteractiveInterpreter):
 | 
			
		||||
    """Interpreter based on code.InteractiveInterpreter."""
 | 
			
		||||
    
 | 
			
		||||
    revision = __revision__
 | 
			
		||||
    
 | 
			
		||||
    def __init__(self, locals=None, rawin=None, 
 | 
			
		||||
                 stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr):
 | 
			
		||||
        """Create an interactive interpreter object."""
 | 
			
		||||
        InteractiveInterpreter.__init__(self, locals=locals)
 | 
			
		||||
        self.stdin = stdin
 | 
			
		||||
        self.stdout = stdout
 | 
			
		||||
        self.stderr = stderr
 | 
			
		||||
        if rawin:
 | 
			
		||||
            import __builtin__
 | 
			
		||||
            __builtin__.raw_input = rawin
 | 
			
		||||
            del __builtin__
 | 
			
		||||
        copyright = 'Type "help", "copyright", "credits" or "license"'
 | 
			
		||||
        copyright += ' for more information.'
 | 
			
		||||
        self.introText = 'Python %s on %s%s%s' % \
 | 
			
		||||
                         (sys.version, sys.platform, os.linesep, copyright)
 | 
			
		||||
        try:
 | 
			
		||||
            sys.ps1
 | 
			
		||||
        except AttributeError:
 | 
			
		||||
            sys.ps1 = '>>> '
 | 
			
		||||
        try:
 | 
			
		||||
            sys.ps2
 | 
			
		||||
        except AttributeError:
 | 
			
		||||
            sys.ps2 = '... '
 | 
			
		||||
        self.more = 0
 | 
			
		||||
        # List of lists to support recursive push().
 | 
			
		||||
        self.commandBuffer = []
 | 
			
		||||
        self.startupScript = os.environ.get('PYTHONSTARTUP')
 | 
			
		||||
 | 
			
		||||
    def push(self, command):
 | 
			
		||||
        """Send command to the interpreter to be executed.
 | 
			
		||||
        
 | 
			
		||||
        Because this may be called recursively, we append a new list
 | 
			
		||||
        onto the commandBuffer list and then append commands into
 | 
			
		||||
        that.  If the passed in command is part of a multi-line
 | 
			
		||||
        command we keep appending the pieces to the last list in
 | 
			
		||||
        commandBuffer until we have a complete command. If not, we
 | 
			
		||||
        delete that last list."""
 | 
			
		||||
        command = str(command)  # In case the command is unicode.
 | 
			
		||||
        if not self.more:
 | 
			
		||||
            try: del self.commandBuffer[-1]
 | 
			
		||||
            except IndexError: pass
 | 
			
		||||
        if not self.more: self.commandBuffer.append([])
 | 
			
		||||
        self.commandBuffer[-1].append(command)
 | 
			
		||||
        source = '\n'.join(self.commandBuffer[-1])
 | 
			
		||||
        more = self.more = self.runsource(source)
 | 
			
		||||
        dispatcher.send(signal='Interpreter.push', sender=self,
 | 
			
		||||
                        command=command, more=more, source=source)
 | 
			
		||||
        return more
 | 
			
		||||
        
 | 
			
		||||
    def runsource(self, source):
 | 
			
		||||
        """Compile and run source code in the interpreter."""
 | 
			
		||||
        stdin, stdout, stderr = sys.stdin, sys.stdout, sys.stderr
 | 
			
		||||
        sys.stdin, sys.stdout, sys.stderr = \
 | 
			
		||||
                   self.stdin, self.stdout, self.stderr
 | 
			
		||||
        more = InteractiveInterpreter.runsource(self, source)
 | 
			
		||||
        # If sys.std* is still what we set it to, then restore it.
 | 
			
		||||
        # But, if the executed source changed sys.std*, assume it was
 | 
			
		||||
        # meant to be changed and leave it. Power to the people.
 | 
			
		||||
        if sys.stdin == self.stdin:
 | 
			
		||||
            sys.stdin = stdin
 | 
			
		||||
        if sys.stdout == self.stdout:
 | 
			
		||||
            sys.stdout = stdout
 | 
			
		||||
        if sys.stderr == self.stderr:
 | 
			
		||||
            sys.stderr = stderr
 | 
			
		||||
        return more
 | 
			
		||||
        
 | 
			
		||||
    def getAutoCompleteKeys(self):
 | 
			
		||||
        """Return list of auto-completion keycodes."""
 | 
			
		||||
        return [ord('.')]
 | 
			
		||||
 | 
			
		||||
    def getAutoCompleteList(self, command='', *args, **kwds):
 | 
			
		||||
        """Return list of auto-completion options for a command.
 | 
			
		||||
        
 | 
			
		||||
        The list of options will be based on the locals namespace."""
 | 
			
		||||
        stdin, stdout, stderr = sys.stdin, sys.stdout, sys.stderr
 | 
			
		||||
        sys.stdin, sys.stdout, sys.stderr = \
 | 
			
		||||
                   self.stdin, self.stdout, self.stderr
 | 
			
		||||
        l = introspect.getAutoCompleteList(command, self.locals,
 | 
			
		||||
                                           *args, **kwds)
 | 
			
		||||
        sys.stdin, sys.stdout, sys.stderr = stdin, stdout, stderr
 | 
			
		||||
        return l
 | 
			
		||||
 | 
			
		||||
    def getCallTip(self, command='', *args, **kwds):
 | 
			
		||||
        """Return call tip text for a command.
 | 
			
		||||
        
 | 
			
		||||
        Call tip information will be based on the locals namespace."""
 | 
			
		||||
        return introspect.getCallTip(command, self.locals, *args, **kwds)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class InterpreterAlaCarte(Interpreter):
 | 
			
		||||
    """Demo Interpreter."""
 | 
			
		||||
    
 | 
			
		||||
    def __init__(self, locals, rawin, stdin, stdout, stderr, 
 | 
			
		||||
                 ps1='main prompt', ps2='continuation prompt'):
 | 
			
		||||
        """Create an interactive interpreter object."""
 | 
			
		||||
        Interpreter.__init__(self, locals=locals, rawin=rawin, 
 | 
			
		||||
                             stdin=stdin, stdout=stdout, stderr=stderr)
 | 
			
		||||
        sys.ps1 = ps1
 | 
			
		||||
        sys.ps2 = ps2
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user