diff --git a/wxPython/wxPython/lib/PyCrust/CHANGES.txt b/wxPython/wxPython/lib/PyCrust/CHANGES.txt new file mode 100644 index 0000000000..8e199d3610 --- /dev/null +++ b/wxPython/wxPython/lib/PyCrust/CHANGES.txt @@ -0,0 +1,406 @@ +================================================================== +CHANGES.txt is a list of code changes for each release of PyCrust. +================================================================== + +===== +0.8.1 (12/20/2002 to //2002) +===== +Improved keyboard handling with Autocomplete active. You can now +use Enter as well as Tab to select an item from the list. +----- +Disabled autocomplete for lists of 2000 items or more. The current +implementation of wxSTC can't handle lists this big. +----- +Changed filling to always display docstrings for objects. This is +useful for objects whose docstrings have been decorated, rather than +coming directly from the source code. (Hmmm. Sounds like someone is +doing some decorating. I wonder where that would be helpful. ;-) +----- +Fixed handling of icon. Added images.py file. +----- + + +===== +0.8 (10/29/2002 to 12/16/2002) +===== +Added "help" to startup banner info. +----- +Made all wx and stc imports explicit. No more import *. +----- +Replaced use of wx's true and false with Python's True and False. +----- +Changed introspect.getRoot() to use tokenize module. This does a +slightly better job than the previous parsing routine and the code +is clearer. +----- +Improved handling of whitespace and empty types during introspection. +----- +Fixed cut/copy clipboard problem under Linux. (Robin Dunn rocks!!!) +----- +Added shell.about() which works like this: + >>> shell.about() + PyCrust Version: 0.8 + Shell Revision: 1.80 + Interpreter Revision: 1.15 + Python Version: 2.2.2 + wxPython Version: 2.3.3.1 + Platform: linux2 +----- +Added copy plus and paste plus to shell menu. +----- +Moved shell menu from shell.py to shellmenu.py. +----- +Added sys.stdin.readlines() support. +----- +Added time.sleep() in readline() and OnIdle() event handler to free +up the CPU. +----- + + +===== +0.7.2 (2/22/2002 to 8/27/2002) +===== +Tweaked getAttributeNames() to pick up a few more attributes: +'__bases__', '__class__', '__dict__', '__name__', +'func_closure', 'func_code', 'func_defaults', 'func_dict', +'func_doc', 'func_globals', 'func_name' +----- +Added a tests directory and unit tests. +----- +Improved support for empty types in the shell: [], () and {} as far +as when call tips and autocompletion are available. +Added support for the other triple string - ''''''. +----- +Refactored introspect.py to improve testability. +----- +Improved call tips for unbound methods by leaving the "self" +parameter, since unbound methods require an instance be passed. +----- +Fixed call tip bug where a tip was displayed when a "(" was typed +after an object that wasn't callable. +----- +Fixed getAllAttributeNames when str(object) fails. +----- +Added brace highlighting. (Thank you, Kevin Altis.) +----- +Fixed problem displaying unicode objects in PyFilling. +----- +Changed how filling.py checks for expandable objects. +Lists are now expandable objects. +----- +Made the key handling more robust when there is an active text +selection that includes text prior to the last primary prompt. +Thanks to Raul Cota for pointing this out. +----- +Fixed wxSTC problem with brace highlighting and non-us keyboards. +(Thank you for the patch, Jean-Michel Fauth.) +----- +Added busy = wxBusyCursor() to key point in shell and filling. +----- +Added OnCloseWindow handler to ShellFrame and CrustFrame. +----- +Default to SetWrapMode(1) for shell and namespace viewer. +----- +Added shell.wrap() and shell.zoom(). +----- +Added Raul Cota autoCompleteKeys hooks. +----- +Cleaned up various little key handling bugs. +----- +Changed input methods to get values from shell, rather than dialog +boxes. Renamed readIn to readline and readRaw to raw_input. +----- + + +===== +0.7.1 (12/12/2001 to 2/21/2002) +===== +Fixed OnChar() issues effecting European keyboards, as reported by +Jean-Michel Fauth. +----- +Fixed introspect.py issue with xmlrpc objects reported by Kevin Altis. +----- +Fixed some introspect/PyFilling issues with regard to Python 2.2. +----- +Fixed font background color as reported by Keith J. Farmer. (Thanks) +----- +Fixed problem with call tips and autocompletion inside multiline +commands as report by Kevin Altis. +----- +Improved OnKeyDown handling of cut/copy/paste operations based on +feedback from Syver Enstad. (Thanks) +----- +Added a shell.help() method to display some help info. +----- +Changed sort of items in the namespace viewer to case insensitive. +----- +Changed attributes.sort(lambda x, y: cmp(x.upper(), y.upper())) in +advance of an upcoming fix to an autocompletion matching bug in wxSTC. +----- +Improved support for ZODB by allowing namespace drilldown into BTrees. +----- +Added shell.PasteAndRun() to support pasting multiple commands into +the shell from the clipboard. Ctrl+Shift+V or v. +----- +Enter now always processes a command (or copies down a previous one.) +To insert a line break, press Ctrl+Enter. +----- +Escape key clears the current, unexecuted command. +----- +History retrieval changed to replace current command. Added new keys +to insert from history - Shift+Up and Shift+Down. +----- +Better call tips on objects with __call__ methods. +----- +Improved call tip positioning calculation. +----- + + +===== +0.7 (10/15/2001 to 12/11/2001) +===== +Changed how command history retrieval functions work. +Added Alt-P, Alt-N as keybindings for Retrieve-Previous, Retrieve-Next. +----- +Added full support for mult-line commands, similar to IDLE. +----- +Changed introspect.getAttributeNames() to do a case insensitive sort. +----- +Changed Cut/Copy/Paste to deal with prompts intelligently. Cut and Copy +remove all prompts. Paste can handle prompted or not-prompted text. +----- +Added CopyWithPrompts() method attached to Ctrl-Shift-C for those times +when you really do want all the prompts left intact. +----- +Improved handling of the shell's read-only zone. +----- +Changed CrustFrame.__init__ parameter spec to include all parameters +allowed by a wxFrame. +----- +Changed FillingText to be read-only. +----- +Renamed PyCrust.py to PyCrustApp.py to eliminate package/module name +conflicts that kept you from doing "from PyCrust import shell" inside +files located in the PyCrust directory. +----- +Renamed PyFilling.py to PyFillingApp.py and PyShell.py to PyShellApp.py +to maintain consistency. +----- +Removed the __date__ property from all modules. +----- +Fixed bug in introspect.getCallTip(), reported by Kevin Altis. +----- + + +===== +0.6.1 (9/19/2001 to 10/12/2001) +===== +Changed Shell.run() to always position to the end of existing text, as +suggested by Raul Cota. +----- +Changed introspect.getAllAttributeNames() to break circular references in +object.__class__, which occurs in Zope/ZODB extension classes. +----- +Changed filling.FillingTree.getChildren() to introspect extension classes. +----- +Fixed minor bugs in introspect.getCallTip() that were interfering with call +tips for Zope/ZODB extension class methods. +----- +In preparation for wxPython 2.3.2, added code to fix a font sizing problem. +Versions of wxPython prior to 2.3.2 had a sizing bug on Win platform where +the font was 2 points larger than what was specified. +----- +Added a hack to introspect.getAllAttributeNames() to "wake up" ZODB objects +that are asleep - in a "ghost" state. Otherwise it returns incomplete info. +----- + + +===== +0.6 (8/21/2001 to 9/12/2001) +===== +Added PyFilling.py and filling.py. +----- +PyShell.py and PyFilling.py can now be run standalone, as well as PyCrust.py. +----- +Added crust.py and moved some code from PyCrust.py to it. +----- +Added command history retrieval features submitted by Richie Hindle. +----- +Changed shell.write() to replace line endings with OS-specific endings. +Changed shell.py and interpreter.py to use os.linesep in strings having +hardcoded line endings. +----- +Added shell.redirectStdin(), shell.redirectStdout() and +shell.redirectStderr() to allow the surrounding app to toggle requests that +the specified sys.std* be redirected to the shell. These can also be run +from within the shell itself, of course. +----- +The shell now adds the current working directory "." to the search path: + sys.path.insert(0, os.curdir) +----- +Added support for distutils installations. +----- + + +===== +0.5.4 (8/17/2001 to 8/20/2001) +===== +Changed default font size under *nix to: + 'size' : 12, + 'lnsize' : 10, +----- +Changed Shell to expect a parameter referencing an Interpreter class, rather +than an intepreter instance, to facilitate subclassing of Interpreter, which +effectively broke when the Editor class was eliminated. +----- +Fixed PyCrustAlaCarte.py, which had been broken by previous changes. +Created InterpreterAlaCarte class as an example for use in the demo. +----- +Split PyCrust.py into PyCrust.py and PyShell.py in anticipation of PyFilling. +----- + + +===== +0.5.3 (8/16/2001) +===== +Added patch to PyCrust.py to fix wxPython bug: + wxID_SELECTALL = NewId() # This *should* be defined by wxPython. +----- + + +===== +0.5.2 (8/14/2001 to 8/15/2001) +===== +Shortened module names by dropping "PyCrust" as a prefix. +----- +Changed version to VERSION in version module. +----- +Added Options menu to PyCrust application. +----- +Eliminated the Editor class (and editor module) by merging with Shell. +This means that Shell "is a" wxStyledTextCtrl rather than "has a". +There just wasn't enough non-gui code to justify the separation. Plus, +Shell will be much easier for gui toolkits/designers to deal with now. +----- + + +===== +0.5.1 (8/10/2001 to 8/14/2001) +===== +Added introspect module. +Moved some functionality from PyCrustInterp to introspect. +----- +Changed introspect.getRoot() to no longer remove whitespace from the command. +This was a remnant of a previous approach that, when left as part of the +current approach, turned out to be a really bad thing. +----- +Changed introspect.getRoot() to allow commands of '', "", """""", [], (), +and {} to pass through. This allows you to type them, followed by a dot, and +get autocomplete options on them. +----- +Changed introspect.getRoot() to identify some situations where strings +shouldn't be considered roots. For example: + + >>> import PyCrust # To illustrate the potential problem. + >>> len('PyCrust.py') + +Typing the dot at the end of "PyCrust" in the second line above should NOT +result in an autocompletion list because "PyCrust" is part of a string in +this context, not a reference to the PyCrust module object. Similar reasoning +applies to call tips. For example: + + >>> len('dir(') + +Typing the left paren at the end of "dir" should NOT result in a call tip. + +Both features now behave properly in the examples given. However, there is +still the case where whitespace precedes the potential root and that is NOT +handled properly. For example: + + >>> len('this is a dir(') + +and + + >>> len('This is PyCrust.py') + +More code needs to be written to handle more complex situations. +----- +Added locals=None parameter to Shell.__init__(). +----- +Added support for magic attribute retrieval. Users can change this with: + >>> shell.editor.autoCompleteIncludeMagic = 0 +----- +Added the ability to set filters on auto completion to exclude attributes +prefixed with a single or double underscore. Users can exclude one or the +other or both with: + >>> shell.editor.autoCompleteExcludeSingle = 1 + >>> shell.editor.autoCompleteExcludeDouble = 1 +----- + + +===== +0.5 (8/8/2001) +===== +Mostly just a final version change before creating a release. + + +===== +0.4 (8/4/2001 to 8/7/2001) +===== +Changed version/revision handling. +Fixed bugs. + + +===== +0.3 (8/2/2001 to 8/3/2001) +===== +Removed lots of cruft. +Added lots of docstrings. +Imported to CVS repository at SourceForge. +Added call tips. + + +===== +0.2 (7/30/2001 to 8/2/2001) +===== +Renamed several files. +Added command autocompletion. +Added menus to PyCrust.py: File, Edit and Help +Added sample applications: PyCrustAlaCarte.py, PyCrustAlaMode.py, and +PyCrustMinimus.py. + + +===== +0.1 (7/1/2001 to 7/19/2001) +===== +Added basic syntax coloring much like Boa. +Added read-only logging much like IDLE. +Can retrieve a previous command by putting the cursor back on that line and +hitting enter. +Stdin and raw_input operate properly so you can now do help() and license() +without hanging. +Redefined "quit", "exit", and "close" to display a better-than-nothing +response. +Home key honors the prompt. +Created SourceForge account, but nothing was posted. + + +================================== +In the beginning, there was pie... (7/1/2001) +================================== +Blame it all on IDLE, Boa and PythonWin. I was using all three, got frustrated +with their dissimilarities, and began to let everyone know how I felt. At the +same time, Scintilla looked like an interesting tool to build a shell around. +And while I didn't receive much in the way of positive feedback, let alone +encouragement, I just couldn't let go of the idea of a Scintilla-based Python +shell. Then the PythonCard project got to the point where they were talking +about including a shell in their development environment. That was all the +incentive I needed. PyCrust had to happen... + + +=============== +CVS Information +=============== +$Date$ +$Revision$ +$Id$ diff --git a/wxPython/wxPython/lib/PyCrust/crust.py b/wxPython/wxPython/lib/PyCrust/crust.py index c0f10cc36a..3f26b813f0 100644 --- a/wxPython/wxPython/lib/PyCrust/crust.py +++ b/wxPython/wxPython/lib/PyCrust/crust.py @@ -18,18 +18,18 @@ class Crust(wx.wxSplitterWindow): name = 'PyCrust Crust' revision = __revision__ - def __init__(self, parent, id=-1, pos=wx.wxDefaultPosition, - size=wx.wxDefaultSize, style=wx.wxSP_3D, name='Crust Window', - rootObject=None, rootLabel=None, rootIsNamespace=1, - intro='', locals=None, + def __init__(self, parent, id=-1, pos=wx.wxDefaultPosition, + size=wx.wxDefaultSize, style=wx.wxSP_3D, name='Crust Window', + rootObject=None, rootLabel=None, rootIsNamespace=1, + intro='', locals=None, InterpClass=None, *args, **kwds): """Create a PyCrust Crust instance.""" wx.wxSplitterWindow.__init__(self, parent, id, pos, size, style, name) - self.shell = Shell(parent=self, introText=intro, - locals=locals, InterpClass=InterpClass, + self.shell = Shell(parent=self, introText=intro, + locals=locals, InterpClass=InterpClass, *args, **kwds) - self.filling = Filling(parent=self, - rootObject=self.shell.interp.locals, + self.filling = Filling(parent=self, + rootObject=self.shell.interp.locals, rootLabel=rootLabel, rootIsNamespace=1) """Add 'filling' to the interpreter's locals.""" self.shell.interp.locals['filling'] = self.filling @@ -43,10 +43,10 @@ class CrustFrame(wx.wxFrame, ShellMenu): name = 'PyCrust Frame' revision = __revision__ - def __init__(self, parent=None, id=-1, title='PyCrust', - pos=wx.wxDefaultPosition, size=wx.wxDefaultSize, - style=wx.wxDEFAULT_FRAME_STYLE, - rootObject=None, rootLabel=None, rootIsNamespace=1, + def __init__(self, parent=None, id=-1, title='PyCrust', + pos=wx.wxDefaultPosition, size=wx.wxDefaultSize, + style=wx.wxDEFAULT_FRAME_STYLE, + rootObject=None, rootLabel=None, rootIsNamespace=1, locals=None, InterpClass=None, *args, **kwds): """Create a PyCrust CrustFrame instance.""" wx.wxFrame.__init__(self, parent, id, title, pos, size, style) @@ -56,11 +56,11 @@ class CrustFrame(wx.wxFrame, ShellMenu): self.SetStatusText(intro.replace('\n', ', ')) import images self.SetIcon(images.getPyCrustIcon()) - self.crust = Crust(parent=self, intro=intro, - rootObject=rootObject, - rootLabel=rootLabel, - rootIsNamespace=rootIsNamespace, - locals=locals, + self.crust = Crust(parent=self, intro=intro, + rootObject=rootObject, + rootLabel=rootLabel, + rootIsNamespace=rootIsNamespace, + locals=locals, InterpClass=InterpClass, *args, **kwds) # Override the filling so that status messages go to the status bar. self.crust.filling.fillingTree.setStatusText = self.SetStatusText diff --git a/wxPython/wxPython/lib/PyCrust/filling.py b/wxPython/wxPython/lib/PyCrust/filling.py index 823d5d74ac..d79ad2735f 100644 --- a/wxPython/wxPython/lib/PyCrust/filling.py +++ b/wxPython/wxPython/lib/PyCrust/filling.py @@ -114,11 +114,15 @@ class FillingTree(wx.wxTreeCtrl): def OnSelChanged(self, event): busy = wx.wxBusyCursor() + self.setText('') item = event.GetItem() if item == self.root: - self.setText('') + del busy return o = self.GetPyData(item) + if o is None: # Windows bug fix. + del busy + return otype = type(o) text = '' text += self.getFullName(item) @@ -130,25 +134,24 @@ class FillingTree(wx.wxTreeCtrl): if otype is types.StringType or otype is types.UnicodeType: value = repr(o) text += '\n\nValue: ' + value + try: + text += '\n\nDocstring:\n\n"""\n' + inspect.getdoc(o).strip() + '\n"""' + except: + pass if otype is types.InstanceType: try: text += '\n\nClass Definition:\n\n' + \ inspect.getsource(o.__class__) except: - try: - text += '\n\n"""' + inspect.getdoc(o).strip() + '"""' - except: - pass + pass else: try: text += '\n\nSource Code:\n\n' + \ inspect.getsource(o) except: - try: - text += '\n\n"""' + inspect.getdoc(o).strip() + '"""' - except: - pass + pass self.setText(text) + del busy def getFullName(self, item, partial=''): """Return a syntactically proper name for item.""" @@ -322,11 +325,8 @@ class FillingFrame(wx.wxFrame): intro = 'Welcome To PyFilling - The Tastiest Namespace Inspector' self.CreateStatusBar() self.SetStatusText(intro) - if wx.wxPlatform == '__WXMSW__': - import os - filename = os.path.join(os.path.dirname(__file__), 'PyCrust.ico') - icon = wx.wxIcon(filename, wx.wxBITMAP_TYPE_ICO) - self.SetIcon(icon) + import images + self.SetIcon(images.getPyCrustIcon()) self.filling = Filling(parent=self, rootObject=rootObject, rootLabel=rootLabel, rootIsNamespace=rootIsNamespace) @@ -338,6 +338,7 @@ class App(wx.wxApp): """PyFilling standalone application.""" def OnInit(self): + wx.wxInitAllImageHandlers() self.fillingFrame = FillingFrame() self.fillingFrame.Show(True) self.SetTopWindow(self.fillingFrame) diff --git a/wxPython/wxPython/lib/PyCrust/shell.py b/wxPython/wxPython/lib/PyCrust/shell.py index be8f060ce3..a9d0de6536 100644 --- a/wxPython/wxPython/lib/PyCrust/shell.py +++ b/wxPython/wxPython/lib/PyCrust/shell.py @@ -8,8 +8,6 @@ __author__ = "Patrick K. O'Brien " __cvsid__ = "$Id$" __revision__ = "$Revision$"[11:-2] -from wxPython import wx -from wxPython import stc import keyword import os import sys @@ -20,6 +18,16 @@ from pseudo import PseudoFileErr from shellmenu import ShellMenu from version import VERSION +try: + from deco.wxpy import wx +except ImportError: + from wxPython import wx + +try: + from deco.wxpy import stc +except ImportError: + from wxPython import stc + True, False = 1, 0 sys.ps3 = '<-- ' # Input prompt. @@ -64,9 +72,8 @@ class ShellFrame(wx.wxFrame, ShellMenu): intro += '\nSponsored by Orbtech - Your source for Python programming expertise.' self.CreateStatusBar() self.SetStatusText(intro.replace('\n', ', ')) - filename = os.path.join(os.path.dirname(__file__), 'PyCrust.ico') - icon = wx.wxIcon(filename, wx.wxBITMAP_TYPE_ICO) - self.SetIcon(icon) + import images + self.SetIcon(images.getPyCrustIcon()) self.shell = Shell(parent=self, id=-1, introText=intro, locals=locals, InterpClass=InterpClass, *args, **kwds) @@ -432,6 +439,8 @@ Platform: %s""" % (VERSION, self.revision, self.interp.revision, # Usually the dot (period) key activates auto completion. # Get the command between the prompt and the cursor. # Add the autocomplete character to the end of the command. + if self.AutoCompActive(): + self.AutoCompCancel() command = self.GetTextRange(stoppos, currpos) + chr(key) self.write(chr(key)) if self.autoComplete: @@ -455,12 +464,12 @@ Platform: %s""" % (VERSION, self.revision, self.interp.revision, def OnKeyDown(self, event): """Key down event handler.""" + key = event.KeyCode() # If the auto-complete window is up let it do its thing. if self.AutoCompActive(): event.Skip() return # Prevent modification of previously submitted commands/responses. - key = event.KeyCode() controlDown = event.ControlDown() altDown = event.AltDown() shiftDown = event.ShiftDown()