From 611e0f98288a40e88478804efdfe00cd97480b2b Mon Sep 17 00:00:00 2001
From: "(no author)" <(no author)@6015fed2-1504-0410-9fe1-9d1591cc4771>
Date: Thu, 6 Sep 2001 22:07:50 +0000
Subject: [PATCH] This commit was manufactured by cvs2svn to create tag
'r22a3-fork'.
git-svn-id: http://svn.python.org/projects/python/tags/r22a3-fork@23038 6015fed2-1504-0410-9fe1-9d1591cc4771
---
Demo/sgi/video/vcopy.py | 134 ----
Demo/sgi/video/vinfo.py | 90 ---
Demo/sgi/video/vtime.py | 106 ---
Doc/whatsnew/whatsnew20.tex | 1335 -------------------------------
Doc/whatsnew/whatsnew21.tex | 868 --------------------
Doc/whatsnew/whatsnew22.tex | 875 --------------------
Lib/idlelib/AutoExpand.py | 91 ---
Lib/idlelib/AutoIndent.py | 554 -------------
Lib/idlelib/Bindings.py | 68 --
Lib/idlelib/CREDITS.txt | 17 -
Lib/idlelib/CallTipWindow.py | 71 --
Lib/idlelib/CallTips.py | 190 -----
Lib/idlelib/ChangeLog | 1587 -------------------------------------
Lib/idlelib/ClassBrowser.py | 224 ------
Lib/idlelib/ColorDelegator.py | 247 ------
Lib/idlelib/Debugger.py | 308 -------
Lib/idlelib/Delegator.py | 33 -
Lib/idlelib/EditorWindow.py | 728 -----------------
Lib/idlelib/ExecBinding.py | 198 -----
Lib/idlelib/FileList.py | 146 ----
Lib/idlelib/FormatParagraph.py | 155 ----
Lib/idlelib/FrameViewer.py | 38 -
Lib/idlelib/GrepDialog.py | 135 ----
Lib/idlelib/INSTALL.txt | 58 --
Lib/idlelib/IOBinding.py | 254 ------
Lib/idlelib/Icons/folder.gif | Bin 120 -> 0 bytes
Lib/idlelib/Icons/minusnode.gif | Bin 96 -> 0 bytes
Lib/idlelib/Icons/openfolder.gif | Bin 125 -> 0 bytes
Lib/idlelib/Icons/plusnode.gif | Bin 79 -> 0 bytes
Lib/idlelib/Icons/python.gif | Bin 125 -> 0 bytes
Lib/idlelib/Icons/tk.gif | Bin 85 -> 0 bytes
Lib/idlelib/IdleConf.py | 113 ---
Lib/idlelib/IdleHistory.py | 88 --
Lib/idlelib/LICENSE.txt | 50 --
Lib/idlelib/MultiScrolledLists.py | 138 ----
Lib/idlelib/MultiStatusBar.py | 32 -
Lib/idlelib/NEWS.txt | 173 ----
Lib/idlelib/ObjectBrowser.py | 151 ----
Lib/idlelib/OldStackViewer.py | 276 -------
Lib/idlelib/OutputWindow.py | 279 -------
Lib/idlelib/ParenMatch.py | 191 -----
Lib/idlelib/PathBrowser.py | 95 ---
Lib/idlelib/Percolator.py | 85 --
Lib/idlelib/PyParse.py | 589 --------------
Lib/idlelib/PyShell.py | 883 ---------------------
Lib/idlelib/README.txt | 158 ----
Lib/idlelib/Remote.py | 101 ---
Lib/idlelib/RemoteInterp.py | 342 --------
Lib/idlelib/ReplaceDialog.py | 188 -----
Lib/idlelib/ScriptBinding.py | 173 ----
Lib/idlelib/ScrolledList.py | 139 ----
Lib/idlelib/SearchBinding.py | 97 ---
Lib/idlelib/SearchDialog.py | 67 --
Lib/idlelib/SearchDialogBase.py | 129 ---
Lib/idlelib/SearchEngine.py | 221 ------
Lib/idlelib/Separator.py | 92 ---
Lib/idlelib/StackViewer.py | 147 ----
Lib/idlelib/TODO.txt | 212 -----
Lib/idlelib/ToolTip.py | 87 --
Lib/idlelib/TreeWidget.py | 471 -----------
Lib/idlelib/UndoDelegator.py | 352 --------
Lib/idlelib/WidgetRedirector.py | 92 ---
Lib/idlelib/WindowList.py | 85 --
Lib/idlelib/ZoomHeight.py | 46 --
Lib/idlelib/__init__.py | 1 -
Lib/idlelib/aboutDialog.py | 137 ----
Lib/idlelib/config-unix.txt | 3 -
Lib/idlelib/config-win.txt | 3 -
Lib/idlelib/config.txt | 66 --
Lib/idlelib/configDialog.py | 537 -------------
Lib/idlelib/eventparse.py | 93 ---
Lib/idlelib/extend.txt | 120 ---
Lib/idlelib/help.txt | 156 ----
Lib/idlelib/idle | 4 -
Lib/idlelib/idle.bat | 3 -
Lib/idlelib/idle.py | 4 -
Lib/idlelib/idle.pyw | 12 -
Lib/idlelib/idlever.py | 1 -
Lib/idlelib/keydefs.py | 55 --
Lib/idlelib/loader.py | 64 --
Lib/idlelib/protocol.py | 369 ---------
Lib/idlelib/setup.py | 86 --
Lib/idlelib/spawn.py | 58 --
Lib/idlelib/testcode.py | 31 -
Lib/idlelib/textView.py | 77 --
Mac/MPW/buildall | 29 -
Mac/Unsupported/mactcp/dnrglue.c | 301 -------
Mac/mwerks/mwerks_shlib_config.h | 3 -
88 files changed, 17065 deletions(-)
delete mode 100755 Demo/sgi/video/vcopy.py
delete mode 100755 Demo/sgi/video/vinfo.py
delete mode 100755 Demo/sgi/video/vtime.py
delete mode 100644 Doc/whatsnew/whatsnew20.tex
delete mode 100644 Doc/whatsnew/whatsnew21.tex
delete mode 100644 Doc/whatsnew/whatsnew22.tex
delete mode 100644 Lib/idlelib/AutoExpand.py
delete mode 100644 Lib/idlelib/AutoIndent.py
delete mode 100644 Lib/idlelib/Bindings.py
delete mode 100644 Lib/idlelib/CREDITS.txt
delete mode 100644 Lib/idlelib/CallTipWindow.py
delete mode 100644 Lib/idlelib/CallTips.py
delete mode 100644 Lib/idlelib/ChangeLog
delete mode 100644 Lib/idlelib/ClassBrowser.py
delete mode 100644 Lib/idlelib/ColorDelegator.py
delete mode 100644 Lib/idlelib/Debugger.py
delete mode 100644 Lib/idlelib/Delegator.py
delete mode 100644 Lib/idlelib/EditorWindow.py
delete mode 100644 Lib/idlelib/ExecBinding.py
delete mode 100644 Lib/idlelib/FileList.py
delete mode 100644 Lib/idlelib/FormatParagraph.py
delete mode 100644 Lib/idlelib/FrameViewer.py
delete mode 100644 Lib/idlelib/GrepDialog.py
delete mode 100644 Lib/idlelib/INSTALL.txt
delete mode 100644 Lib/idlelib/IOBinding.py
delete mode 100644 Lib/idlelib/Icons/folder.gif
delete mode 100644 Lib/idlelib/Icons/minusnode.gif
delete mode 100644 Lib/idlelib/Icons/openfolder.gif
delete mode 100644 Lib/idlelib/Icons/plusnode.gif
delete mode 100644 Lib/idlelib/Icons/python.gif
delete mode 100644 Lib/idlelib/Icons/tk.gif
delete mode 100644 Lib/idlelib/IdleConf.py
delete mode 100644 Lib/idlelib/IdleHistory.py
delete mode 100644 Lib/idlelib/LICENSE.txt
delete mode 100644 Lib/idlelib/MultiScrolledLists.py
delete mode 100644 Lib/idlelib/MultiStatusBar.py
delete mode 100644 Lib/idlelib/NEWS.txt
delete mode 100644 Lib/idlelib/ObjectBrowser.py
delete mode 100644 Lib/idlelib/OldStackViewer.py
delete mode 100644 Lib/idlelib/OutputWindow.py
delete mode 100644 Lib/idlelib/ParenMatch.py
delete mode 100644 Lib/idlelib/PathBrowser.py
delete mode 100644 Lib/idlelib/Percolator.py
delete mode 100644 Lib/idlelib/PyParse.py
delete mode 100644 Lib/idlelib/PyShell.py
delete mode 100644 Lib/idlelib/README.txt
delete mode 100644 Lib/idlelib/Remote.py
delete mode 100644 Lib/idlelib/RemoteInterp.py
delete mode 100644 Lib/idlelib/ReplaceDialog.py
delete mode 100644 Lib/idlelib/ScriptBinding.py
delete mode 100644 Lib/idlelib/ScrolledList.py
delete mode 100644 Lib/idlelib/SearchBinding.py
delete mode 100644 Lib/idlelib/SearchDialog.py
delete mode 100644 Lib/idlelib/SearchDialogBase.py
delete mode 100644 Lib/idlelib/SearchEngine.py
delete mode 100644 Lib/idlelib/Separator.py
delete mode 100644 Lib/idlelib/StackViewer.py
delete mode 100644 Lib/idlelib/TODO.txt
delete mode 100644 Lib/idlelib/ToolTip.py
delete mode 100644 Lib/idlelib/TreeWidget.py
delete mode 100644 Lib/idlelib/UndoDelegator.py
delete mode 100644 Lib/idlelib/WidgetRedirector.py
delete mode 100644 Lib/idlelib/WindowList.py
delete mode 100644 Lib/idlelib/ZoomHeight.py
delete mode 100644 Lib/idlelib/__init__.py
delete mode 100644 Lib/idlelib/aboutDialog.py
delete mode 100644 Lib/idlelib/config-unix.txt
delete mode 100644 Lib/idlelib/config-win.txt
delete mode 100644 Lib/idlelib/config.txt
delete mode 100644 Lib/idlelib/configDialog.py
delete mode 100644 Lib/idlelib/eventparse.py
delete mode 100644 Lib/idlelib/extend.txt
delete mode 100644 Lib/idlelib/help.txt
delete mode 100755 Lib/idlelib/idle
delete mode 100755 Lib/idlelib/idle.bat
delete mode 100644 Lib/idlelib/idle.py
delete mode 100644 Lib/idlelib/idle.pyw
delete mode 100644 Lib/idlelib/idlever.py
delete mode 100644 Lib/idlelib/keydefs.py
delete mode 100644 Lib/idlelib/loader.py
delete mode 100644 Lib/idlelib/protocol.py
delete mode 100644 Lib/idlelib/setup.py
delete mode 100644 Lib/idlelib/spawn.py
delete mode 100644 Lib/idlelib/testcode.py
delete mode 100644 Lib/idlelib/textView.py
delete mode 100644 Mac/MPW/buildall
delete mode 100644 Mac/Unsupported/mactcp/dnrglue.c
delete mode 100644 Mac/mwerks/mwerks_shlib_config.h
diff --git a/Demo/sgi/video/vcopy.py b/Demo/sgi/video/vcopy.py
deleted file mode 100755
index d32bc1f801..0000000000
--- a/Demo/sgi/video/vcopy.py
+++ /dev/null
@@ -1,134 +0,0 @@
-# Copy a video file, interactively, frame-by-frame.
-
-import sys
-import getopt
-from gl import *
-from DEVICE import *
-import VFile
-import string
-import imageop
-
-def report(time, iframe):
- print 'Frame', iframe, ': t =', time
-
-def usage():
- sys.stderr.write('usage: vcopy [-t type] [-m treshold] [-a] infile outfile\n')
- sys.stderr.write('-t Convert to other type\n')
- sys.stderr.write('-a Automatic\n')
- sys.stderr.write('-m Convert grey to mono with treshold\n')
- sys.stderr.write('-d Convert grey to mono with dithering\n')
- sys.exit(2)
-
-def help():
- print 'Command summary:'
- print 'n get next image from input'
- print 'w write current image to output'
-
-def main():
- foreground()
- opts, args = getopt.getopt(sys.argv[1:], 't:am:d')
- if len(args) <> 2:
- usage()
- [ifile, ofile] = args
- print 'open film ', ifile
- ifilm = VFile.VinFile().init(ifile)
- print 'open output ', ofile
- ofilm = VFile.VoutFile().init(ofile)
-
- ofilm.setinfo(ifilm.getinfo())
-
- use_grabber = 0
- continuous = 0
- tomono = 0
- tomonodither = 0
- for o, a in opts:
- if o == '-t':
- ofilm.format = a
- use_grabber = 1
- if o == '-a':
- continuous = 1
- if o == '-m':
- if ifilm.format <> 'grey':
- print '-m only supported for greyscale'
- sys.exit(1)
- tomono = 1
- treshold = string.atoi(a)
- ofilm.format = 'mono'
- if o == '-d':
- if ifilm.format <> 'grey':
- print '-m only supported for greyscale'
- sys.exit(1)
- tomonodither = 1
- ofilm.format = 'mono'
-
- ofilm.writeheader()
- #
- prefsize(ifilm.width, ifilm.height)
- w = winopen(ifile)
- qdevice(KEYBD)
- qdevice(ESCKEY)
- qdevice(WINQUIT)
- qdevice(WINSHUT)
- print 'qdevice calls done'
- #
- help()
- #
- time, data, cdata = ifilm.getnextframe()
- ifilm.showframe(data, cdata)
- iframe = 1
- report(time, iframe)
- #
- while 1:
- if continuous:
- dev = KEYBD
- else:
- dev, val = qread()
- if dev in (ESCKEY, WINQUIT, WINSHUT):
- break
- if dev == REDRAW:
- reshapeviewport()
- elif dev == KEYBD:
- if continuous:
- c = '0'
- else:
- c = chr(val)
- #XXX Debug
- if c == 'R':
- c3i(255,0,0)
- clear()
- if c == 'G':
- c3i(0,255,0)
- clear()
- if c == 'B':
- c3i(0,0,255)
- clear()
- if c == 'w' or continuous:
- if use_grabber:
- data, cdata = ofilm.grabframe()
- if tomono:
- data = imageop.grey2mono(data, \
- ifilm.width, ifilm.height, \
- treshold)
- if tomonodither:
- data = imageop.dither2mono(data, \
- ifilm.width, ifilm.height)
- ofilm.writeframe(time, data, cdata)
- print 'Frame', iframe, 'written.'
- if c == 'n' or continuous:
- try:
- time,data,cdata = ifilm.getnextframe()
- ifilm.showframe(data, cdata)
- iframe = iframe+1
- report(time, iframe)
- except EOFError:
- print 'EOF'
- if continuous:
- break
- ringbell()
- elif dev == INPUTCHANGE:
- pass
- else:
- print '(dev, val) =', (dev, val)
- ofilm.close()
-
-main()
diff --git a/Demo/sgi/video/vinfo.py b/Demo/sgi/video/vinfo.py
deleted file mode 100755
index 7f98237a97..0000000000
--- a/Demo/sgi/video/vinfo.py
+++ /dev/null
@@ -1,90 +0,0 @@
-from gl import *
-from GL import *
-from DEVICE import *
-import time
-import sys
-import getopt
-
-class Struct(): pass
-epoch = Struct()
-EndOfFile = 'End of file'
-bye = 'bye'
-
-def openvideo(filename):
- f = open(filename, 'r')
- line = f.readline()
- if not line: raise EndOfFile
- if line[:4] == 'CMIF': line = f.readline()
- x = eval(line[:-1])
- if len(x) == 3: w, h, pf = x
- else: w, h = x; pf = 2
- return f, w, h, pf
-
-def loadframe(f, w, h, pf):
- line = f.readline()
- if line == '':
- raise EndOfFile
- x = eval(line[:-1])
- if type(x) == type(0) or type(x) == type(0.0):
- tijd = x
- if pf == 0:
- size = w*h*4
- else:
- size = (w/pf) * (h/pf)
- else:
- tijd, size = x
- f.seek(size, 1)
- return tijd
-
-def main():
- delta = 0
- short = 0
- try:
- opts, names = getopt.getopt(sys.argv[1:], 'ds')
- except getopt.error, msg:
- sys.stderr.write(msg + '\n')
- sys.stderr.write('usage: vinfo [-d] [-s] [file] ...\n')
- sys.exit(2)
- for opt, arg in opts:
- if opt == '-d': delta = 1 # print delta between frames
- elif opt == '-s': short = 1 # short: don't print times
- if names == []:
- names = ['film.video']
- for name in names:
- try:
- f, w, h, pf = openvideo(name)
- except:
- sys.stderr.write(name + ': cannot open\n')
- continue
- if pf == 0:
- size = w*h*4
- else:
- size = (w/pf) * (h/pf)
- print name, ':', w, 'x', h, '; pf =', pf, ', size =', size,
- if pf == 0:
- print '(color)',
- else:
- print '(' + `(w/pf)` + 'x' + `(h/pf)` + ')',
- if (w/pf)%4 <> 0: print '!!!',
- print
- num = 0
- try:
- otijd = 0
- while not short:
- try:
- tijd = loadframe(f, w, h, pf)
- if delta: print '\t' + `tijd-otijd`,
- else: print '\t' + `tijd`,
- otijd = tijd
- num = num + 1
- if num % 8 == 0:
- print
- except EndOfFile:
- raise bye
- except bye:
- pass
- if num % 8 <> 0:
- print
- f.close()
-
-main()
diff --git a/Demo/sgi/video/vtime.py b/Demo/sgi/video/vtime.py
deleted file mode 100755
index c333e57983..0000000000
--- a/Demo/sgi/video/vtime.py
+++ /dev/null
@@ -1,106 +0,0 @@
-#
-# Module vtime - Keep virtual time between two nodes.
-#
-# We try for synchronised clocks by sending a packet of the for
-# (1,mytime,0) to the other side, and waiting (at most) a second for
-# a reply. This reply has the form (2,mytime,histime), and we can
-# estimate the time difference by defining histime to be exactly half-way
-# between the time we sent our message and got our reply. We send a
-# final (3,mynewtime,histime) message to allow the other side to do the
-# same computations.
-#
-# Note that the protocol suffers heavily from the 2-army problem.
-# It'll have to do until I can read up on time-sync protocols, though.
-#
-from socket import *
-import time
-
-MSGSIZE = 100
-MSGTIMEOUT = 1000
-
-recv_timeout = 'receive timeout'
-bad_connect = 'Bad connection'
-
-def timeavg(a,b):
- return int((long(a)+b)/2L)
-def tryrecv(s):
- cnt = 0
- while 1:
- if s.avail():
- return s.recvfrom(MSGSIZE)
- time.millisleep(100)
- cnt = cnt + 100
- if cnt > MSGTIMEOUT:
- raise recv_timeout
-
-class VTime():
- def init(self,(client,host,port)):
- s = socket(AF_INET, SOCK_DGRAM)
- host = gethostbyname(host)
- localhost = gethostbyname(gethostname())
- raddr = (host,port)
- s.bind((localhost,port))
- if client:
- #
- # We loop here because we want the *second* measurement
- # for accuracy
- for loopct in (0,2):
- curtijd = time.millitimer()
- check = `(loopct,curtijd,0)`
- s.sendto(check,raddr)
- while 1:
- try:
- if loopct:
- data, other = s.recvfrom(MSGSIZE)
- else:
- data, other = tryrecv(s)
- newtijd = time.millitimer()
- if other <> raddr:
- print 'Someone else syncing to us: ', other
- raise bad_connect
- data = eval(data)
- if data[:2] == (loopct+1,curtijd):
- break
- if data[0] <> 2:
- print 'Illegal sync reply: ', data
- raise bad_connect
- except recv_timeout:
- curtijd = time.millitimer()
- check = `(loopct,curtijd,0)`
- s.sendto(check,raddr)
- histime = data[2]
- s.sendto(`(4,newtijd,histime)`,raddr)
- mytime = timeavg(curtijd,newtijd)
- #mytime = curtijd
- self.timediff = histime - mytime
- else:
- while 1:
- data,other = s.recvfrom(MSGSIZE)
- if other <> raddr:
- print 'Someone else syncing to us: ', other, ' Wanted ', raddr
- raise bad_connect
- data = eval(data)
- if data[0] in (0,2):
- curtijd = time.millitimer()
- s.sendto(`(data[0]+1,data[1],curtijd)`,raddr)
- elif data[0] == 4:
- newtijd = time.millitimer()
- histime = data[1]
- mytime = timeavg(curtijd,newtijd)
- #mytime = curtijd
- self.timediff = histime-mytime
- break
- else:
- print 'Funny data: ', data
- raise bad_connect
- return self
- #
- def his2mine(self,tijd):
- return tijd - self.timediff
- #
- def mine2his(self, tijd):
- return tijd + self.timediff
-
-def test(clt, host, port):
- xx = VTime().init(clt,host,port)
- print 'Time diff: ', xx.his2mine(0)
diff --git a/Doc/whatsnew/whatsnew20.tex b/Doc/whatsnew/whatsnew20.tex
deleted file mode 100644
index 4817dcfcf8..0000000000
--- a/Doc/whatsnew/whatsnew20.tex
+++ /dev/null
@@ -1,1335 +0,0 @@
-\documentclass{howto}
-
-% $Id$
-
-\title{What's New in Python 2.0}
-\release{1.01}
-\author{A.M. Kuchling and Moshe Zadka}
-\authoraddress{\email{amk1@bigfoot.com}, \email{moshez@math.huji.ac.il} }
-\begin{document}
-\maketitle\tableofcontents
-
-\section{Introduction}
-
-A new release of Python, version 2.0, will be released some time this
-autumn. Beta versions are already available from
-\url{http://www.pythonlabs.com/products/python2.0/}. This article
-covers the exciting new features in 2.0, highlights some other useful
-changes, and points out a few incompatible changes that may require
-rewriting code.
-
-Python's development never completely stops between releases, and a
-steady flow of bug fixes and improvements are always being submitted.
-A host of minor fixes, a few optimizations, additional docstrings, and
-better error messages went into 2.0; to list them all would be
-impossible, but they're certainly significant. Consult the
-publicly-available CVS logs if you want to see the full list. This
-progress is due to the five developers working for
-PythonLabs are now getting paid to spend their days fixing bugs,
-and also due to the improved communication resulting
-from moving to SourceForge.
-
-% ======================================================================
-\section{What About Python 1.6?}
-
-Python 1.6 can be thought of as the Contractual Obligations Python
-release. After the core development team left CNRI in May 2000, CNRI
-requested that a 1.6 release be created, containing all the work on
-Python that had been performed at CNRI. Python 1.6 therefore
-represents the state of the CVS tree as of May 2000, with the most
-significant new feature being Unicode support. Development continued
-after May, of course, so the 1.6 tree received a few fixes to ensure
-that it's forward-compatible with Python 2.0. 1.6 is therefore part
-of Python's evolution, and not a side branch.
-
-So, should you take much interest in Python 1.6? Probably not. The
-1.6final and 2.0beta1 releases were made on the same day (September 5,
-2000), the plan being to finalize Python 2.0 within a month or so. If
-you have applications to maintain, there seems little point in
-breaking things by moving to 1.6, fixing them, and then having another
-round of breakage within a month by moving to 2.0; you're better off
-just going straight to 2.0. Most of the really interesting features
-described in this document are only in 2.0, because a lot of work was
-done between May and September.
-
-% ======================================================================
-\section{New Development Process}
-
-The most important change in Python 2.0 may not be to the code at all,
-but to how Python is developed: in May 2000 the Python developers
-began using the tools made available by SourceForge for storing
-source code, tracking bug reports, and managing the queue of patch
-submissions. To report bugs or submit patches for Python 2.0, use the
-bug tracking and patch manager tools available from Python's project
-page, located at \url{http://sourceforge.net/projects/python/}.
-
-The most important of the services now hosted at SourceForge is the
-Python CVS tree, the version-controlled repository containing the
-source code for Python. Previously, there were roughly 7 or so people
-who had write access to the CVS tree, and all patches had to be
-inspected and checked in by one of the people on this short list.
-Obviously, this wasn't very scalable. By moving the CVS tree to
-SourceForge, it became possible to grant write access to more people;
-as of September 2000 there were 27 people able to check in changes, a
-fourfold increase. This makes possible large-scale changes that
-wouldn't be attempted if they'd have to be filtered through the small
-group of core developers. For example, one day Peter Schneider-Kamp
-took it into his head to drop K\&R C compatibility and convert the C
-source for Python to ANSI C. After getting approval on the python-dev
-mailing list, he launched into a flurry of checkins that lasted about
-a week, other developers joined in to help, and the job was done. If
-there were only 5 people with write access, probably that task would
-have been viewed as ``nice, but not worth the time and effort needed''
-and it would never have gotten done.
-
-The shift to using SourceForge's services has resulted in a remarkable
-increase in the speed of development. Patches now get submitted,
-commented on, revised by people other than the original submitter, and
-bounced back and forth between people until the patch is deemed worth
-checking in. Bugs are tracked in one central location and can be
-assigned to a specific person for fixing, and we can count the number
-of open bugs to measure progress. This didn't come without a cost:
-developers now have more e-mail to deal with, more mailing lists to
-follow, and special tools had to be written for the new environment.
-For example, SourceForge sends default patch and bug notification
-e-mail messages that are completely unhelpful, so Ka-Ping Yee wrote an
-HTML screen-scraper that sends more useful messages.
-
-The ease of adding code caused a few initial growing pains, such as
-code was checked in before it was ready or without getting clear
-agreement from the developer group. The approval process that has
-emerged is somewhat similar to that used by the Apache group.
-Developers can vote +1, +0, -0, or -1 on a patch; +1 and -1 denote
-acceptance or rejection, while +0 and -0 mean the developer is mostly
-indifferent to the change, though with a slight positive or negative
-slant. The most significant change from the Apache model is that the
-voting is essentially advisory, letting Guido van Rossum, who has
-Benevolent Dictator For Life status, know what the general opinion is.
-He can still ignore the result of a vote, and approve or
-reject a change even if the community disagrees with him.
-
-Producing an actual patch is the last step in adding a new feature,
-and is usually easy compared to the earlier task of coming up with a
-good design. Discussions of new features can often explode into
-lengthy mailing list threads, making the discussion hard to follow,
-and no one can read every posting to python-dev. Therefore, a
-relatively formal process has been set up to write Python Enhancement
-Proposals (PEPs), modelled on the Internet RFC process. PEPs are
-draft documents that describe a proposed new feature, and are
-continually revised until the community reaches a consensus, either
-accepting or rejecting the proposal. Quoting from the introduction to
-PEP 1, ``PEP Purpose and Guidelines'':
-
-\begin{quotation}
- PEP stands for Python Enhancement Proposal. A PEP is a design
- document providing information to the Python community, or
- describing a new feature for Python. The PEP should provide a
- concise technical specification of the feature and a rationale for
- the feature.
-
- We intend PEPs to be the primary mechanisms for proposing new
- features, for collecting community input on an issue, and for
- documenting the design decisions that have gone into Python. The
- PEP author is responsible for building consensus within the
- community and documenting dissenting opinions.
-\end{quotation}
-
-Read the rest of PEP 1 for the details of the PEP editorial process,
-style, and format. PEPs are kept in the Python CVS tree on
-SourceForge, though they're not part of the Python 2.0 distribution,
-and are also available in HTML form from
-\url{http://python.sourceforge.net/peps/}. As of September 2000,
-there are 25 PEPS, ranging from PEP 201, ``Lockstep Iteration'', to
-PEP 225, ``Elementwise/Objectwise Operators''.
-
-% ======================================================================
-\section{Unicode}
-
-The largest new feature in Python 2.0 is a new fundamental data type:
-Unicode strings. Unicode uses 16-bit numbers to represent characters
-instead of the 8-bit number used by ASCII, meaning that 65,536
-distinct characters can be supported.
-
-The final interface for Unicode support was arrived at through
-countless often-stormy discussions on the python-dev mailing list, and
-mostly implemented by Marc-Andr\'e Lemburg, based on a Unicode string
-type implementation by Fredrik Lundh. A detailed explanation of the
-interface is in the file \file{Misc/unicode.txt} in the Python source
-distribution; it's also available on the Web at
-\url{http://starship.python.net/crew/lemburg/unicode-proposal.txt}.
-This article will simply cover the most significant points about the Unicode
-interfaces.
-
-In Python source code, Unicode strings are written as
-\code{u"string"}. Arbitrary Unicode characters can be written using a
-new escape sequence, \code{\e u\var{HHHH}}, where \var{HHHH} is a
-4-digit hexadecimal number from 0000 to FFFF. The existing
-\code{\e x\var{HHHH}} escape sequence can also be used, and octal
-escapes can be used for characters up to U+01FF, which is represented
-by \code{\e 777}.
-
-Unicode strings, just like regular strings, are an immutable sequence
-type. They can be indexed and sliced, but not modified in place.
-Unicode strings have an \method{encode( \optional{encoding} )} method
-that returns an 8-bit string in the desired encoding. Encodings are
-named by strings, such as \code{'ascii'}, \code{'utf-8'},
-\code{'iso-8859-1'}, or whatever. A codec API is defined for
-implementing and registering new encodings that are then available
-throughout a Python program. If an encoding isn't specified, the
-default encoding is usually 7-bit ASCII, though it can be changed for
-your Python installation by calling the
-\function{sys.setdefaultencoding(\var{encoding})} function in a
-customised version of \file{site.py}.
-
-Combining 8-bit and Unicode strings always coerces to Unicode, using
-the default ASCII encoding; the result of \code{'a' + u'bc'} is
-\code{u'abc'}.
-
-New built-in functions have been added, and existing built-ins
-modified to support Unicode:
-
-\begin{itemize}
-\item \code{unichr(\var{ch})} returns a Unicode string 1 character
-long, containing the character \var{ch}.
-
-\item \code{ord(\var{u})}, where \var{u} is a 1-character regular or Unicode string, returns the number of the character as an integer.
-
-\item \code{unicode(\var{string} \optional{, \var{encoding}}
-\optional{, \var{errors}} ) } creates a Unicode string from an 8-bit
-string. \code{encoding} is a string naming the encoding to use.
-The \code{errors} parameter specifies the treatment of characters that
-are invalid for the current encoding; passing \code{'strict'} as the
-value causes an exception to be raised on any encoding error, while
-\code{'ignore'} causes errors to be silently ignored and
-\code{'replace'} uses U+FFFD, the official replacement character, in
-case of any problems.
-
-\item The \keyword{exec} statement, and various built-ins such as
-\code{eval()}, \code{getattr()}, and \code{setattr()} will also
-accept Unicode strings as well as regular strings. (It's possible
-that the process of fixing this missed some built-ins; if you find a
-built-in function that accepts strings but doesn't accept Unicode
-strings at all, please report it as a bug.)
-
-\end{itemize}
-
-A new module, \module{unicodedata}, provides an interface to Unicode
-character properties. For example, \code{unicodedata.category(u'A')}
-returns the 2-character string 'Lu', the 'L' denoting it's a letter,
-and 'u' meaning that it's uppercase.
-\code{u.bidirectional(u'\e x0660')} returns 'AN', meaning that U+0660 is
-an Arabic number.
-
-The \module{codecs} module contains functions to look up existing encodings
-and register new ones. Unless you want to implement a
-new encoding, you'll most often use the
-\function{codecs.lookup(\var{encoding})} function, which returns a
-4-element tuple: \code{(\var{encode_func},
-\var{decode_func}, \var{stream_reader}, \var{stream_writer})}.
-
-\begin{itemize}
-\item \var{encode_func} is a function that takes a Unicode string, and
-returns a 2-tuple \code{(\var{string}, \var{length})}. \var{string}
-is an 8-bit string containing a portion (perhaps all) of the Unicode
-string converted into the given encoding, and \var{length} tells you
-how much of the Unicode string was converted.
-
-\item \var{decode_func} is the opposite of \var{encode_func}, taking
-an 8-bit string and returning a 2-tuple \code{(\var{ustring},
-\var{length})}, consisting of the resulting Unicode string
-\var{ustring} and the integer \var{length} telling how much of the
-8-bit string was consumed.
-
-\item \var{stream_reader} is a class that supports decoding input from
-a stream. \var{stream_reader(\var{file_obj})} returns an object that
-supports the \method{read()}, \method{readline()}, and
-\method{readlines()} methods. These methods will all translate from
-the given encoding and return Unicode strings.
-
-\item \var{stream_writer}, similarly, is a class that supports
-encoding output to a stream. \var{stream_writer(\var{file_obj})}
-returns an object that supports the \method{write()} and
-\method{writelines()} methods. These methods expect Unicode strings,
-translating them to the given encoding on output.
-\end{itemize}
-
-For example, the following code writes a Unicode string into a file,
-encoding it as UTF-8:
-
-\begin{verbatim}
-import codecs
-
-unistr = u'\u0660\u2000ab ...'
-
-(UTF8_encode, UTF8_decode,
- UTF8_streamreader, UTF8_streamwriter) = codecs.lookup('UTF-8')
-
-output = UTF8_streamwriter( open( '/tmp/output', 'wb') )
-output.write( unistr )
-output.close()
-\end{verbatim}
-
-The following code would then read UTF-8 input from the file:
-
-\begin{verbatim}
-input = UTF8_streamreader( open( '/tmp/output', 'rb') )
-print repr(input.read())
-input.close()
-\end{verbatim}
-
-Unicode-aware regular expressions are available through the
-\module{re} module, which has a new underlying implementation called
-SRE written by Fredrik Lundh of Secret Labs AB.
-
-A \code{-U} command line option was added which causes the Python
-compiler to interpret all string literals as Unicode string literals.
-This is intended to be used in testing and future-proofing your Python
-code, since some future version of Python may drop support for 8-bit
-strings and provide only Unicode strings.
-
-% ======================================================================
-\section{List Comprehensions}
-
-Lists are a workhorse data type in Python, and many programs
-manipulate a list at some point. Two common operations on lists are
-to loop over them, and either pick out the elements that meet a
-certain criterion, or apply some function to each element. For
-example, given a list of strings, you might want to pull out all the
-strings containing a given substring, or strip off trailing whitespace
-from each line.
-
-The existing \function{map()} and \function{filter()} functions can be
-used for this purpose, but they require a function as one of their
-arguments. This is fine if there's an existing built-in function that
-can be passed directly, but if there isn't, you have to create a
-little function to do the required work, and Python's scoping rules
-make the result ugly if the little function needs additional
-information. Take the first example in the previous paragraph,
-finding all the strings in the list containing a given substring. You
-could write the following to do it:
-
-\begin{verbatim}
-# Given the list L, make a list of all strings
-# containing the substring S.
-sublist = filter( lambda s, substring=S:
- string.find(s, substring) != -1,
- L)
-\end{verbatim}
-
-Because of Python's scoping rules, a default argument is used so that
-the anonymous function created by the \keyword{lambda} statement knows
-what substring is being searched for. List comprehensions make this
-cleaner:
-
-\begin{verbatim}
-sublist = [ s for s in L if string.find(s, S) != -1 ]
-\end{verbatim}
-
-List comprehensions have the form:
-
-\begin{verbatim}
-[ expression for expr in sequence1
- for expr2 in sequence2 ...
- for exprN in sequenceN
- if condition
-\end{verbatim}
-
-The \keyword{for}...\keyword{in} clauses contain the sequences to be
-iterated over. The sequences do not have to be the same length,
-because they are \emph{not} iterated over in parallel, but
-from left to right; this is explained more clearly in the following
-paragraphs. The elements of the generated list will be the successive
-values of \var{expression}. The final \keyword{if} clause is
-optional; if present, \var{expression} is only evaluated and added to
-the result if \var{condition} is true.
-
-To make the semantics very clear, a list comprehension is equivalent
-to the following Python code:
-
-\begin{verbatim}
-for expr1 in sequence1:
- for expr2 in sequence2:
- ...
- for exprN in sequenceN:
- if (condition):
- # Append the value of
- # the expression to the
- # resulting list.
-\end{verbatim}
-
-This means that when there are \keyword{for}...\keyword{in} clauses,
-the resulting list will be equal to the product of the lengths of all
-the sequences. If you have two lists of length 3, the output list is
-9 elements long:
-
-\begin{verbatim}
-seq1 = 'abc'
-seq2 = (1,2,3)
->>> [ (x,y) for x in seq1 for y in seq2]
-[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1),
-('c', 2), ('c', 3)]
-\end{verbatim}
-
-To avoid introducing an ambiguity into Python's grammar, if
-\var{expression} is creating a tuple, it must be surrounded with
-parentheses. The first list comprehension below is a syntax error,
-while the second one is correct:
-
-\begin{verbatim}
-# Syntax error
-[ x,y for x in seq1 for y in seq2]
-# Correct
-[ (x,y) for x in seq1 for y in seq2]
-\end{verbatim}
-
-The idea of list comprehensions originally comes from the functional
-programming language Haskell (\url{http://www.haskell.org}). Greg
-Ewing argued most effectively for adding them to Python and wrote the
-initial list comprehension patch, which was then discussed for a
-seemingly endless time on the python-dev mailing list and kept
-up-to-date by Skip Montanaro.
-
-% ======================================================================
-\section{Augmented Assignment}
-
-Augmented assignment operators, another long-requested feature, have
-been added to Python 2.0. Augmented assignment operators include
-\code{+=}, \code{-=}, \code{*=}, and so forth. For example, the
-statement \code{a += 2} increments the value of the variable
-\code{a} by 2, equivalent to the slightly lengthier \code{a = a + 2}.
-
-The full list of supported assignment operators is \code{+=},
-\code{-=}, \code{*=}, \code{/=}, \code{\%=}, \code{**=}, \code{\&=},
-\code{|=}, \verb|^=|, \code{>>=}, and \code{<<=}. Python classes can
-override the augmented assignment operators by defining methods named
-\method{__iadd__}, \method{__isub__}, etc. For example, the following
-\class{Number} class stores a number and supports using += to create a
-new instance with an incremented value.
-
-\begin{verbatim}
-class Number:
- def __init__(self, value):
- self.value = value
- def __iadd__(self, increment):
- return Number( self.value + increment)
-
-n = Number(5)
-n += 3
-print n.value
-\end{verbatim}
-
-The \method{__iadd__} special method is called with the value of the
-increment, and should return a new instance with an appropriately
-modified value; this return value is bound as the new value of the
-variable on the left-hand side.
-
-Augmented assignment operators were first introduced in the C
-programming language, and most C-derived languages, such as
-\program{awk}, C++, Java, Perl, and PHP also support them. The augmented
-assignment patch was implemented by Thomas Wouters.
-
-% ======================================================================
-\section{String Methods}
-
-Until now string-manipulation functionality was in the \module{string}
-module, which was usually a front-end for the \module{strop}
-module written in C. The addition of Unicode posed a difficulty for
-the \module{strop} module, because the functions would all need to be
-rewritten in order to accept either 8-bit or Unicode strings. For
-functions such as \function{string.replace()}, which takes 3 string
-arguments, that means eight possible permutations, and correspondingly
-complicated code.
-
-Instead, Python 2.0 pushes the problem onto the string type, making
-string manipulation functionality available through methods on both
-8-bit strings and Unicode strings.
-
-\begin{verbatim}
->>> 'andrew'.capitalize()
-'Andrew'
->>> 'hostname'.replace('os', 'linux')
-'hlinuxtname'
->>> 'moshe'.find('sh')
-2
-\end{verbatim}
-
-One thing that hasn't changed, a noteworthy April Fools' joke
-notwithstanding, is that Python strings are immutable. Thus, the
-string methods return new strings, and do not modify the string on
-which they operate.
-
-The old \module{string} module is still around for backwards
-compatibility, but it mostly acts as a front-end to the new string
-methods.
-
-Two methods which have no parallel in pre-2.0 versions, although they
-did exist in JPython for quite some time, are \method{startswith()}
-and \method{endswith}. \code{s.startswith(t)} is equivalent to \code{s[:len(t)]
-== t}, while \code{s.endswith(t)} is equivalent to \code{s[-len(t):] == t}.
-
-One other method which deserves special mention is \method{join}. The
-\method{join} method of a string receives one parameter, a sequence of
-strings, and is equivalent to the \function{string.join} function from
-the old \module{string} module, with the arguments reversed. In other
-words, \code{s.join(seq)} is equivalent to the old
-\code{string.join(seq, s)}.
-
-% ======================================================================
-\section{Garbage Collection of Cycles}
-
-The C implementation of Python uses reference counting to implement
-garbage collection. Every Python object maintains a count of the
-number of references pointing to itself, and adjusts the count as
-references are created or destroyed. Once the reference count reaches
-zero, the object is no longer accessible, since you need to have a
-reference to an object to access it, and if the count is zero, no
-references exist any longer.
-
-Reference counting has some pleasant properties: it's easy to
-understand and implement, and the resulting implementation is
-portable, fairly fast, and reacts well with other libraries that
-implement their own memory handling schemes. The major problem with
-reference counting is that it sometimes doesn't realise that objects
-are no longer accessible, resulting in a memory leak. This happens
-when there are cycles of references.
-
-Consider the simplest possible cycle,
-a class instance which has a reference to itself:
-
-\begin{verbatim}
-instance = SomeClass()
-instance.myself = instance
-\end{verbatim}
-
-After the above two lines of code have been executed, the reference
-count of \code{instance} is 2; one reference is from the variable
-named \samp{'instance'}, and the other is from the \samp{myself}
-attribute of the instance.
-
-If the next line of code is \code{del instance}, what happens? The
-reference count of \code{instance} is decreased by 1, so it has a
-reference count of 1; the reference in the \samp{myself} attribute
-still exists. Yet the instance is no longer accessible through Python
-code, and it could be deleted. Several objects can participate in a
-cycle if they have references to each other, causing all of the
-objects to be leaked.
-
-Python 2.0 fixes this problem by periodically executing a cycle
-detection algorithm which looks for inaccessible cycles and deletes
-the objects involved. A new \module{gc} module provides functions to
-perform a garbage collection, obtain debugging statistics, and tuning
-the collector's parameters.
-
-Running the cycle detection algorithm takes some time, and therefore
-will result in some additional overhead. It is hoped that after we've
-gotten experience with the cycle collection from using 2.0, Python 2.1
-will be able to minimize the overhead with careful tuning. It's not
-yet obvious how much performance is lost, because benchmarking this is
-tricky and depends crucially on how often the program creates and
-destroys objects. The detection of cycles can be disabled when Python
-is compiled, if you can't afford even a tiny speed penalty or suspect
-that the cycle collection is buggy, by specifying the
-\samp{--without-cycle-gc} switch when running the \file{configure}
-script.
-
-Several people tackled this problem and contributed to a solution. An
-early implementation of the cycle detection approach was written by
-Toby Kelsey. The current algorithm was suggested by Eric Tiedemann
-during a visit to CNRI, and Guido van Rossum and Neil Schemenauer
-wrote two different implementations, which were later integrated by
-Neil. Lots of other people offered suggestions along the way; the
-March 2000 archives of the python-dev mailing list contain most of the
-relevant discussion, especially in the threads titled ``Reference
-cycle collection for Python'' and ``Finalization again''.
-
-% ======================================================================
-\section{Other Core Changes}
-
-Various minor changes have been made to Python's syntax and built-in
-functions. None of the changes are very far-reaching, but they're
-handy conveniences.
-
-\subsection{Minor Language Changes}
-
-A new syntax makes it more convenient to call a given function
-with a tuple of arguments and/or a dictionary of keyword arguments.
-In Python 1.5 and earlier, you'd use the \function{apply()}
-built-in function: \code{apply(f, \var{args}, \var{kw})} calls the
-function \function{f()} with the argument tuple \var{args} and the
-keyword arguments in the dictionary \var{kw}. \function{apply()}
-is the same in 2.0, but thanks to a patch from
-Greg Ewing, \code{f(*\var{args}, **\var{kw})} as a shorter
-and clearer way to achieve the same effect. This syntax is
-symmetrical with the syntax for defining functions:
-
-\begin{verbatim}
-def f(*args, **kw):
- # args is a tuple of positional args,
- # kw is a dictionary of keyword args
- ...
-\end{verbatim}
-
-The \keyword{print} statement can now have its output directed to a
-file-like object by following the \keyword{print} with
-\verb|>> file|, similar to the redirection operator in Unix shells.
-Previously you'd either have to use the \method{write()} method of the
-file-like object, which lacks the convenience and simplicity of
-\keyword{print}, or you could assign a new value to
-\code{sys.stdout} and then restore the old value. For sending output to standard error,
-it's much easier to write this:
-
-\begin{verbatim}
-print >> sys.stderr, "Warning: action field not supplied"
-\end{verbatim}
-
-Modules can now be renamed on importing them, using the syntax
-\code{import \var{module} as \var{name}} or \code{from \var{module}
-import \var{name} as \var{othername}}. The patch was submitted by
-Thomas Wouters.
-
-A new format style is available when using the \code{\%} operator;
-'\%r' will insert the \function{repr()} of its argument. This was
-also added from symmetry considerations, this time for symmetry with
-the existing '\%s' format style, which inserts the \function{str()} of
-its argument. For example, \code{'\%r \%s' \% ('abc', 'abc')} returns a
-string containing \verb|'abc' abc|.
-
-Previously there was no way to implement a class that overrode
-Python's built-in \keyword{in} operator and implemented a custom
-version. \code{\var{obj} in \var{seq}} returns true if \var{obj} is
-present in the sequence \var{seq}; Python computes this by simply
-trying every index of the sequence until either \var{obj} is found or
-an \exception{IndexError} is encountered. Moshe Zadka contributed a
-patch which adds a \method{__contains__} magic method for providing a
-custom implementation for \keyword{in}. Additionally, new built-in
-objects written in C can define what \keyword{in} means for them via a
-new slot in the sequence protocol.
-
-Earlier versions of Python used a recursive algorithm for deleting
-objects. Deeply nested data structures could cause the interpreter to
-fill up the C stack and crash; Christian Tismer rewrote the deletion
-logic to fix this problem. On a related note, comparing recursive
-objects recursed infinitely and crashed; Jeremy Hylton rewrote the
-code to no longer crash, producing a useful result instead. For
-example, after this code:
-
-\begin{verbatim}
-a = []
-b = []
-a.append(a)
-b.append(b)
-\end{verbatim}
-
-The comparison \code{a==b} returns true, because the two recursive
-data structures are isomorphic. See the thread ``trashcan
-and PR\#7'' in the April 2000 archives of the python-dev mailing list
-for the discussion leading up to this implementation, and some useful
-relevant links.
-% Starting URL:
-% http://www.python.org/pipermail/python-dev/2000-April/004834.html
-
-Note that comparisons can now also raise exceptions. In earlier
-versions of Python, a comparison operation such as \code{cmp(a,b)}
-would always produce an answer, even if a user-defined
-\method{__cmp__} method encountered an error, since the resulting
-exception would simply be silently swallowed.
-
-Work has been done on porting Python to 64-bit Windows on the Itanium
-processor, mostly by Trent Mick of ActiveState. (Confusingly,
-\code{sys.platform} is still \code{'win32'} on Win64 because it seems
-that for ease of porting, MS Visual C++ treats code as 32 bit on Itanium.)
-PythonWin also supports Windows CE; see the Python CE page at
-\url{http://starship.python.net/crew/mhammond/ce/} for more
-information.
-
-Another new platform is Darwin/MacOS X; inital support for it is in
-Python 2.0. Dynamic loading works, if you specify ``configure
---with-dyld --with-suffix=.x''. Consult the README in the Python
-source distribution for more instructions.
-
-An attempt has been made to alleviate one of Python's warts, the
-often-confusing \exception{NameError} exception when code refers to a
-local variable before the variable has been assigned a value. For
-example, the following code raises an exception on the \keyword{print}
-statement in both 1.5.2 and 2.0; in 1.5.2 a \exception{NameError}
-exception is raised, while 2.0 raises a new
-\exception{UnboundLocalError} exception.
-\exception{UnboundLocalError} is a subclass of \exception{NameError},
-so any existing code that expects \exception{NameError} to be raised
-should still work.
-
-\begin{verbatim}
-def f():
- print "i=",i
- i = i + 1
-f()
-\end{verbatim}
-
-Two new exceptions, \exception{TabError} and
-\exception{IndentationError}, have been introduced. They're both
-subclasses of \exception{SyntaxError}, and are raised when Python code
-is found to be improperly indented.
-
-\subsection{Changes to Built-in Functions}
-
-A new built-in, \function{zip(\var{seq1}, \var{seq2}, ...)}, has been
-added. \function{zip()} returns a list of tuples where each tuple
-contains the i-th element from each of the argument sequences. The
-difference between \function{zip()} and \code{map(None, \var{seq1},
-\var{seq2})} is that \function{map()} pads the sequences with
-\code{None} if the sequences aren't all of the same length, while
-\function{zip()} truncates the returned list to the length of the
-shortest argument sequence.
-
-The \function{int()} and \function{long()} functions now accept an
-optional ``base'' parameter when the first argument is a string.
-\code{int('123', 10)} returns 123, while \code{int('123', 16)} returns
-291. \code{int(123, 16)} raises a \exception{TypeError} exception
-with the message ``can't convert non-string with explicit base''.
-
-A new variable holding more detailed version information has been
-added to the \module{sys} module. \code{sys.version_info} is a tuple
-\code{(\var{major}, \var{minor}, \var{micro}, \var{level},
-\var{serial})} For example, in a hypothetical 2.0.1beta1,
-\code{sys.version_info} would be \code{(2, 0, 1, 'beta', 1)}.
-\var{level} is a string such as \code{"alpha"}, \code{"beta"}, or
-\code{"final"} for a final release.
-
-Dictionaries have an odd new method, \method{setdefault(\var{key},
-\var{default})}, which behaves similarly to the existing
-\method{get()} method. However, if the key is missing,
-\method{setdefault()} both returns the value of \var{default} as
-\method{get()} would do, and also inserts it into the dictionary as
-the value for \var{key}. Thus, the following lines of code:
-
-\begin{verbatim}
-if dict.has_key( key ): return dict[key]
-else:
- dict[key] = []
- return dict[key]
-\end{verbatim}
-
-can be reduced to a single \code{return dict.setdefault(key, [])} statement.
-
-The interpreter sets a maximum recursion depth in order to catch
-runaway recursion before filling the C stack and causing a core dump
-or GPF.. Previously this limit was fixed when you compiled Python,
-but in 2.0 the maximum recursion depth can be read and modified using
-\function{sys.getrecursionlimit} and \function{sys.setrecursionlimit}.
-The default value is 1000, and a rough maximum value for a given
-platform can be found by running a new script,
-\file{Misc/find_recursionlimit.py}.
-
-% ======================================================================
-\section{Porting to 2.0}
-
-New Python releases try hard to be compatible with previous releases,
-and the record has been pretty good. However, some changes are
-considered useful enough, usually because they fix initial design decisions that
-turned out to be actively mistaken, that breaking backward compatibility
-can't always be avoided. This section lists the changes in Python 2.0
-that may cause old Python code to break.
-
-The change which will probably break the most code is tightening up
-the arguments accepted by some methods. Some methods would take
-multiple arguments and treat them as a tuple, particularly various
-list methods such as \method{.append()} and \method{.insert()}.
-In earlier versions of Python, if \code{L} is a list, \code{L.append(
-1,2 )} appends the tuple \code{(1,2)} to the list. In Python 2.0 this
-causes a \exception{TypeError} exception to be raised, with the
-message: 'append requires exactly 1 argument; 2 given'. The fix is to
-simply add an extra set of parentheses to pass both values as a tuple:
-\code{L.append( (1,2) )}.
-
-The earlier versions of these methods were more forgiving because they
-used an old function in Python's C interface to parse their arguments;
-2.0 modernizes them to use \function{PyArg_ParseTuple}, the current
-argument parsing function, which provides more helpful error messages
-and treats multi-argument calls as errors. If you absolutely must use
-2.0 but can't fix your code, you can edit \file{Objects/listobject.c}
-and define the preprocessor symbol \code{NO_STRICT_LIST_APPEND} to
-preserve the old behaviour; this isn't recommended.
-
-Some of the functions in the \module{socket} module are still
-forgiving in this way. For example, \function{socket.connect(
-('hostname', 25) )} is the correct form, passing a tuple representing
-an IP address, but \function{socket.connect( 'hostname', 25 )} also
-works. \function{socket.connect_ex()} and \function{socket.bind()} are
-similarly easy-going. 2.0alpha1 tightened these functions up, but
-because the documentation actually used the erroneous multiple
-argument form, many people wrote code which would break with the
-stricter checking. GvR backed out the changes in the face of public
-reaction, so for the \module{socket} module, the documentation was
-fixed and the multiple argument form is simply marked as deprecated;
-it \emph{will} be tightened up again in a future Python version.
-
-The \code{\e x} escape in string literals now takes exactly 2 hex
-digits. Previously it would consume all the hex digits following the
-'x' and take the lowest 8 bits of the result, so \code{\e x123456} was
-equivalent to \code{\e x56}.
-
-The \exception{AttributeError} exception has a more friendly error message,
-whose text will be something like \code{'Spam' instance has no attribute 'eggs'}.
-Previously the error message was just the missing attribute name \code{eggs}, and
-code written to take advantage of this fact will break in 2.0.
-
-Some work has been done to make integers and long integers a bit more
-interchangeable. In 1.5.2, large-file support was added for Solaris,
-to allow reading files larger than 2Gb; this made the \method{tell()}
-method of file objects return a long integer instead of a regular
-integer. Some code would subtract two file offsets and attempt to use
-the result to multiply a sequence or slice a string, but this raised a
-\exception{TypeError}. In 2.0, long integers can be used to multiply
-or slice a sequence, and it'll behave as you'd intuitively expect it
-to; \code{3L * 'abc'} produces 'abcabcabc', and \code{
-(0,1,2,3)[2L:4L]} produces (2,3). Long integers can also be used in
-various contexts where previously only integers were accepted, such
-as in the \method{seek()} method of file objects, and in the formats
-supported by the \verb|%| operator (\verb|%d|, \verb|%i|, \verb|%x|,
-etc.). For example, \code{"\%d" \% 2L**64} will produce the string
-\samp{18446744073709551616}.
-
-The subtlest long integer change of all is that the \function{str()}
-of a long integer no longer has a trailing 'L' character, though
-\function{repr()} still includes it. The 'L' annoyed many people who
-wanted to print long integers that looked just like regular integers,
-since they had to go out of their way to chop off the character. This
-is no longer a problem in 2.0, but code which does \code{str(longval)[:-1]} and assumes the 'L' is there, will now lose
-the final digit.
-
-Taking the \function{repr()} of a float now uses a different
-formatting precision than \function{str()}. \function{repr()} uses
-\code{\%.17g} format string for C's \function{sprintf()}, while
-\function{str()} uses \code{\%.12g} as before. The effect is that
-\function{repr()} may occasionally show more decimal places than
-\function{str()}, for certain numbers.
-For example, the number 8.1 can't be represented exactly in binary, so
-\code{repr(8.1)} is \code{'8.0999999999999996'}, while str(8.1) is
-\code{'8.1'}.
-
-The \code{-X} command-line option, which turned all standard
-exceptions into strings instead of classes, has been removed; the
-standard exceptions will now always be classes. The
-\module{exceptions} module containing the standard exceptions was
-translated from Python to a built-in C module, written by Barry Warsaw
-and Fredrik Lundh.
-
-% Commented out for now -- I don't think anyone will care.
-%The pattern and match objects provided by SRE are C types, not Python
-%class instances as in 1.5. This means you can no longer inherit from
-%\class{RegexObject} or \class{MatchObject}, but that shouldn't be much
-%of a problem since no one should have been doing that in the first
-%place.
-
-% ======================================================================
-\section{Extending/Embedding Changes}
-
-Some of the changes are under the covers, and will only be apparent to
-people writing C extension modules or embedding a Python interpreter
-in a larger application. If you aren't dealing with Python's C API,
-you can safely skip this section.
-
-The version number of the Python C API was incremented, so C
-extensions compiled for 1.5.2 must be recompiled in order to work with
-2.0. On Windows, it's not possible for Python 2.0 to import a third
-party extension built for Python 1.5.x due to how Windows DLLs work,
-so Python will raise an exception and the import will fail.
-
-Users of Jim Fulton's ExtensionClass module will be pleased to find
-out that hooks have been added so that ExtensionClasses are now
-supported by \function{isinstance()} and \function{issubclass()}.
-This means you no longer have to remember to write code such as
-\code{if type(obj) == myExtensionClass}, but can use the more natural
-\code{if isinstance(obj, myExtensionClass)}.
-
-The \file{Python/importdl.c} file, which was a mass of \#ifdefs to
-support dynamic loading on many different platforms, was cleaned up
-and reorganised by Greg Stein. \file{importdl.c} is now quite small,
-and platform-specific code has been moved into a bunch of
-\file{Python/dynload_*.c} files. Another cleanup: there were also a
-number of \file{my*.h} files in the Include/ directory that held
-various portability hacks; they've been merged into a single file,
-\file{Include/pyport.h}.
-
-Vladimir Marangozov's long-awaited malloc restructuring was completed,
-to make it easy to have the Python interpreter use a custom allocator
-instead of C's standard \function{malloc()}. For documentation, read
-the comments in \file{Include/pymem.h} and
-\file{Include/objimpl.h}. For the lengthy discussions during which
-the interface was hammered out, see the Web archives of the 'patches'
-and 'python-dev' lists at python.org.
-
-Recent versions of the GUSI development environment for MacOS support
-POSIX threads. Therefore, Python's POSIX threading support now works
-on the Macintosh. Threading support using the user-space GNU \texttt{pth}
-library was also contributed.
-
-Threading support on Windows was enhanced, too. Windows supports
-thread locks that use kernel objects only in case of contention; in
-the common case when there's no contention, they use simpler functions
-which are an order of magnitude faster. A threaded version of Python
-1.5.2 on NT is twice as slow as an unthreaded version; with the 2.0
-changes, the difference is only 10\%. These improvements were
-contributed by Yakov Markovitch.
-
-Python 2.0's source now uses only ANSI C prototypes, so compiling Python now
-requires an ANSI C compiler, and can no longer be done using a compiler that
-only supports K\&R C.
-
-Previously the Python virtual machine used 16-bit numbers in its
-bytecode, limiting the size of source files. In particular, this
-affected the maximum size of literal lists and dictionaries in Python
-source; occasionally people who are generating Python code would run
-into this limit. A patch by Charles G. Waldman raises the limit from
-\verb|2^16| to \verb|2^{32}|.
-
-Three new convenience functions intended for adding constants to a
-module's dictionary at module initialization time were added:
-\function{PyModule_AddObject()}, \function{PyModule_AddIntConstant()},
-and \function{PyModule_AddStringConstant()}. Each of these functions
-takes a module object, a null-terminated C string containing the name
-to be added, and a third argument for the value to be assigned to the
-name. This third argument is, respectively, a Python object, a C
-long, or a C string.
-
-A wrapper API was added for Unix-style signal handlers.
-\function{PyOS_getsig()} gets a signal handler and
-\function{PyOS_setsig()} will set a new handler.
-
-% ======================================================================
-\section{Distutils: Making Modules Easy to Install}
-
-Before Python 2.0, installing modules was a tedious affair -- there
-was no way to figure out automatically where Python is installed, or
-what compiler options to use for extension modules. Software authors
-had to go through an arduous ritual of editing Makefiles and
-configuration files, which only really work on Unix and leave Windows
-and MacOS unsupported. Python users faced wildly differing
-installation instructions which varied between different extension
-packages, which made adminstering a Python installation something of a
-chore.
-
-The SIG for distribution utilities, shepherded by Greg Ward, has
-created the Distutils, a system to make package installation much
-easier. They form the \module{distutils} package, a new part of
-Python's standard library. In the best case, installing a Python
-module from source will require the same steps: first you simply mean
-unpack the tarball or zip archive, and the run ``\code{python setup.py
-install}''. The platform will be automatically detected, the compiler
-will be recognized, C extension modules will be compiled, and the
-distribution installed into the proper directory. Optional
-command-line arguments provide more control over the installation
-process, the distutils package offers many places to override defaults
--- separating the build from the install, building or installing in
-non-default directories, and more.
-
-In order to use the Distutils, you need to write a \file{setup.py}
-script. For the simple case, when the software contains only .py
-files, a minimal \file{setup.py} can be just a few lines long:
-
-\begin{verbatim}
-from distutils.core import setup
-setup (name = "foo", version = "1.0",
- py_modules = ["module1", "module2"])
-\end{verbatim}
-
-The \file{setup.py} file isn't much more complicated if the software
-consists of a few packages:
-
-\begin{verbatim}
-from distutils.core import setup
-setup (name = "foo", version = "1.0",
- packages = ["package", "package.subpackage"])
-\end{verbatim}
-
-A C extension can be the most complicated case; here's an example taken from
-the PyXML package:
-
-
-\begin{verbatim}
-from distutils.core import setup, Extension
-
-expat_extension = Extension('xml.parsers.pyexpat',
- define_macros = [('XML_NS', None)],
- include_dirs = [ 'extensions/expat/xmltok',
- 'extensions/expat/xmlparse' ],
- sources = [ 'extensions/pyexpat.c',
- 'extensions/expat/xmltok/xmltok.c',
- 'extensions/expat/xmltok/xmlrole.c',
- ]
- )
-setup (name = "PyXML", version = "0.5.4",
- ext_modules =[ expat_extension ] )
-\end{verbatim}
-
-The Distutils can also take care of creating source and binary
-distributions. The ``sdist'' command, run by ``\code{python setup.py
-sdist}', builds a source distribution such as \file{foo-1.0.tar.gz}.
-Adding new commands isn't difficult, ``bdist_rpm'' and
-``bdist_wininst'' commands have already been contributed to create an
-RPM distribution and a Windows installer for the software,
-respectively. Commands to create other distribution formats such as
-Debian packages and Solaris \file{.pkg} files are in various stages of
-development.
-
-All this is documented in a new manual, \textit{Distributing Python
-Modules}, that joins the basic set of Python documentation.
-
-% ======================================================================
-\section{XML Modules}
-
-Python 1.5.2 included a simple XML parser in the form of the
-\module{xmllib} module, contributed by Sjoerd Mullender. Since
-1.5.2's release, two different interfaces for processing XML have
-become common: SAX2 (version 2 of the Simple API for XML) provides an
-event-driven interface with some similarities to \module{xmllib}, and
-the DOM (Document Object Model) provides a tree-based interface,
-transforming an XML document into a tree of nodes that can be
-traversed and modified. Python 2.0 includes a SAX2 interface and a
-stripped-down DOM interface as part of the \module{xml} package.
-Here we will give a brief overview of these new interfaces; consult
-the Python documentation or the source code for complete details.
-The Python XML SIG is also working on improved documentation.
-
-\subsection{SAX2 Support}
-
-SAX defines an event-driven interface for parsing XML. To use SAX,
-you must write a SAX handler class. Handler classes inherit from
-various classes provided by SAX, and override various methods that
-will then be called by the XML parser. For example, the
-\method{startElement} and \method{endElement} methods are called for
-every starting and end tag encountered by the parser, the
-\method{characters()} method is called for every chunk of character
-data, and so forth.
-
-The advantage of the event-driven approach is that that the whole
-document doesn't have to be resident in memory at any one time, which
-matters if you are processing really huge documents. However, writing
-the SAX handler class can get very complicated if you're trying to
-modify the document structure in some elaborate way.
-
-For example, this little example program defines a handler that prints
-a message for every starting and ending tag, and then parses the file
-\file{hamlet.xml} using it:
-
-\begin{verbatim}
-from xml import sax
-
-class SimpleHandler(sax.ContentHandler):
- def startElement(self, name, attrs):
- print 'Start of element:', name, attrs.keys()
-
- def endElement(self, name):
- print 'End of element:', name
-
-# Create a parser object
-parser = sax.make_parser()
-
-# Tell it what handler to use
-handler = SimpleHandler()
-parser.setContentHandler( handler )
-
-# Parse a file!
-parser.parse( 'hamlet.xml' )
-\end{verbatim}
-
-For more information, consult the Python documentation, or the XML
-HOWTO at \url{http://www.python.org/doc/howto/xml/}.
-
-\subsection{DOM Support}
-
-The Document Object Model is a tree-based representation for an XML
-document. A top-level \class{Document} instance is the root of the
-tree, and has a single child which is the top-level \class{Element}
-instance. This \class{Element} has children nodes representing
-character data and any sub-elements, which may have further children
-of their own, and so forth. Using the DOM you can traverse the
-resulting tree any way you like, access element and attribute values,
-insert and delete nodes, and convert the tree back into XML.
-
-The DOM is useful for modifying XML documents, because you can create
-a DOM tree, modify it by adding new nodes or rearranging subtrees, and
-then produce a new XML document as output. You can also construct a
-DOM tree manually and convert it to XML, which can be a more flexible
-way of producing XML output than simply writing
-\code{}...\code{} to a file.
-
-The DOM implementation included with Python lives in the
-\module{xml.dom.minidom} module. It's a lightweight implementation of
-the Level 1 DOM with support for XML namespaces. The
-\function{parse()} and \function{parseString()} convenience
-functions are provided for generating a DOM tree:
-
-\begin{verbatim}
-from xml.dom import minidom
-doc = minidom.parse('hamlet.xml')
-\end{verbatim}
-
-\code{doc} is a \class{Document} instance. \class{Document}, like all
-the other DOM classes such as \class{Element} and \class{Text}, is a
-subclass of the \class{Node} base class. All the nodes in a DOM tree
-therefore support certain common methods, such as \method{toxml()}
-which returns a string containing the XML representation of the node
-and its children. Each class also has special methods of its own; for
-example, \class{Element} and \class{Document} instances have a method
-to find all child elements with a given tag name. Continuing from the
-previous 2-line example:
-
-\begin{verbatim}
-perslist = doc.getElementsByTagName( 'PERSONA' )
-print perslist[0].toxml()
-print perslist[1].toxml()
-\end{verbatim}
-
-For the \textit{Hamlet} XML file, the above few lines output:
-
-\begin{verbatim}
-CLAUDIUS, king of Denmark.
-HAMLET, son to the late, and nephew to the present king.
-\end{verbatim}
-
-The root element of the document is available as
-\code{doc.documentElement}, and its children can be easily modified
-by deleting, adding, or removing nodes:
-
-\begin{verbatim}
-root = doc.documentElement
-
-# Remove the first child
-root.removeChild( root.childNodes[0] )
-
-# Move the new first child to the end
-root.appendChild( root.childNodes[0] )
-
-# Insert the new first child (originally,
-# the third child) before the 20th child.
-root.insertBefore( root.childNodes[0], root.childNodes[20] )
-\end{verbatim}
-
-Again, I will refer you to the Python documentation for a complete
-listing of the different \class{Node} classes and their various methods.
-
-\subsection{Relationship to PyXML}
-
-The XML Special Interest Group has been working on XML-related Python
-code for a while. Its code distribution, called PyXML, is available
-from the SIG's Web pages at \url{http://www.python.org/sigs/xml-sig/}.
-The PyXML distribution also used the package name \samp{xml}. If
-you've written programs that used PyXML, you're probably wondering
-about its compatibility with the 2.0 \module{xml} package.
-
-The answer is that Python 2.0's \module{xml} package isn't compatible
-with PyXML, but can be made compatible by installing a recent version
-PyXML. Many applications can get by with the XML support that is
-included with Python 2.0, but more complicated applications will
-require that the full PyXML package will be installed. When
-installed, PyXML versions 0.6.0 or greater will replace the
-\module{xml} package shipped with Python, and will be a strict
-superset of the standard package, adding a bunch of additional
-features. Some of the additional features in PyXML include:
-
-\begin{itemize}
-\item 4DOM, a full DOM implementation
-from FourThought, Inc.
-\item The xmlproc validating parser, written by Lars Marius Garshol.
-\item The \module{sgmlop} parser accelerator module, written by Fredrik Lundh.
-\end{itemize}
-
-% ======================================================================
-\section{Module changes}
-
-Lots of improvements and bugfixes were made to Python's extensive
-standard library; some of the affected modules include
-\module{readline}, \module{ConfigParser}, \module{cgi},
-\module{calendar}, \module{posix}, \module{readline}, \module{xmllib},
-\module{aifc}, \module{chunk, wave}, \module{random}, \module{shelve},
-and \module{nntplib}. Consult the CVS logs for the exact
-patch-by-patch details.
-
-Brian Gallew contributed OpenSSL support for the \module{socket}
-module. OpenSSL is an implementation of the Secure Socket Layer,
-which encrypts the data being sent over a socket. When compiling
-Python, you can edit \file{Modules/Setup} to include SSL support,
-which adds an additional function to the \module{socket} module:
-\function{socket.ssl(\var{socket}, \var{keyfile}, \var{certfile})},
-which takes a socket object and returns an SSL socket. The
-\module{httplib} and \module{urllib} modules were also changed to
-support ``https://'' URLs, though no one has implemented FTP or SMTP
-over SSL.
-
-The \module{httplib} module has been rewritten by Greg Stein to
-support HTTP/1.1. Backward compatibility with the 1.5 version of
-\module{httplib} is provided, though using HTTP/1.1 features such as
-pipelining will require rewriting code to use a different set of
-interfaces.
-
-The \module{Tkinter} module now supports Tcl/Tk version 8.1, 8.2, or
-8.3, and support for the older 7.x versions has been dropped. The
-Tkinter module now supports displaying Unicode strings in Tk widgets.
-Also, Fredrik Lundh contributed an optimization which makes operations
-like \code{create_line} and \code{create_polygon} much faster,
-especially when using lots of coordinates.
-
-The \module{curses} module has been greatly extended, starting from
-Oliver Andrich's enhanced version, to provide many additional
-functions from ncurses and SYSV curses, such as colour, alternative
-character set support, pads, and mouse support. This means the module
-is no longer compatible with operating systems that only have BSD
-curses, but there don't seem to be any currently maintained OSes that
-fall into this category.
-
-As mentioned in the earlier discussion of 2.0's Unicode support, the
-underlying implementation of the regular expressions provided by the
-\module{re} module has been changed. SRE, a new regular expression
-engine written by Fredrik Lundh and partially funded by Hewlett
-Packard, supports matching against both 8-bit strings and Unicode
-strings.
-
-% ======================================================================
-\section{New modules}
-
-A number of new modules were added. We'll simply list them with brief
-descriptions; consult the 2.0 documentation for the details of a
-particular module.
-
-\begin{itemize}
-
-\item{\module{atexit}}:
-For registering functions to be called before the Python interpreter exits.
-Code that currently sets
-\code{sys.exitfunc} directly should be changed to
-use the \module{atexit} module instead, importing \module{atexit}
-and calling \function{atexit.register()} with
-the function to be called on exit.
-(Contributed by Skip Montanaro.)
-
-\item{\module{codecs}, \module{encodings}, \module{unicodedata}:} Added as part of the new Unicode support.
-
-\item{\module{filecmp}:} Supersedes the old \module{cmp}, \module{cmpcache} and
-\module{dircmp} modules, which have now become deprecated.
-(Contributed by Gordon MacMillan and Moshe Zadka.)
-
-\item{\module{gettext}:} This module provides internationalization
-(I18N) and localization (L10N) support for Python programs by
-providing an interface to the GNU gettext message catalog library.
-(Integrated by Barry Warsaw, from separate contributions by Martin von
-Loewis, Peter Funk, and James Henstridge.)
-
-\item{\module{linuxaudiodev}:} Support for the \file{/dev/audio}
-device on Linux, a twin to the existing \module{sunaudiodev} module.
-(Contributed by Peter Bosch, with fixes by Jeremy Hylton.)
-
-\item{\module{mmap}:} An interface to memory-mapped files on both
-Windows and Unix. A file's contents can be mapped directly into
-memory, at which point it behaves like a mutable string, so its
-contents can be read and modified. They can even be passed to
-functions that expect ordinary strings, such as the \module{re}
-module. (Contributed by Sam Rushing, with some extensions by
-A.M. Kuchling.)
-
-\item{\module{pyexpat}:} An interface to the Expat XML parser.
-(Contributed by Paul Prescod.)
-
-\item{\module{robotparser}:} Parse a \file{robots.txt} file, which is
-used for writing Web spiders that politely avoid certain areas of a
-Web site. The parser accepts the contents of a \file{robots.txt} file,
-builds a set of rules from it, and can then answer questions about
-the fetchability of a given URL. (Contributed by Skip Montanaro.)
-
-\item{\module{tabnanny}:} A module/script to
-check Python source code for ambiguous indentation.
-(Contributed by Tim Peters.)
-
-\item{\module{UserString}:} A base class useful for deriving objects that behave like strings.
-
-\item{\module{webbrowser}:} A module that provides a platform independent
-way to launch a web browser on a specific URL. For each platform, various
-browsers are tried in a specific order. The user can alter which browser
-is launched by setting the \var{BROWSER} environment variable.
-(Originally inspired by Eric S. Raymond's patch to \module{urllib}
-which added similar functionality, but
-the final module comes from code originally
-implemented by Fred Drake as \file{Tools/idle/BrowserControl.py},
-and adapted for the standard library by Fred.)
-
-\item{\module{_winreg}:} An interface to the
-Windows registry. \module{_winreg} is an adaptation of functions that
-have been part of PythonWin since 1995, but has now been added to the core
-distribution, and enhanced to support Unicode.
-\module{_winreg} was written by Bill Tutt and Mark Hammond.
-
-\item{\module{zipfile}:} A module for reading and writing ZIP-format
-archives. These are archives produced by \program{PKZIP} on
-DOS/Windows or \program{zip} on Unix, not to be confused with
-\program{gzip}-format files (which are supported by the \module{gzip}
-module)
-(Contributed by James C. Ahlstrom.)
-
-\item{\module{imputil}:} A module that provides a simpler way for
-writing customised import hooks, in comparison to the existing
-\module{ihooks} module. (Implemented by Greg Stein, with much
-discussion on python-dev along the way.)
-
-\end{itemize}
-
-% ======================================================================
-\section{IDLE Improvements}
-
-IDLE is the official Python cross-platform IDE, written using Tkinter.
-Python 2.0 includes IDLE 0.6, which adds a number of new features and
-improvements. A partial list:
-
-\begin{itemize}
-\item UI improvements and optimizations,
-especially in the area of syntax highlighting and auto-indentation.
-
-\item The class browser now shows more information, such as the top
-level functions in a module.
-
-\item Tab width is now a user settable option. When opening an existing Python
-file, IDLE automatically detects the indentation conventions, and adapts.
-
-\item There is now support for calling browsers on various platforms,
-used to open the Python documentation in a browser.
-
-\item IDLE now has a command line, which is largely similar to
-the vanilla Python interpreter.
-
-\item Call tips were added in many places.
-
-\item IDLE can now be installed as a package.
-
-\item In the editor window, there is now a line/column bar at the bottom.
-
-\item Three new keystroke commands: Check module (Alt-F5), Import
-module (F5) and Run script (Ctrl-F5).
-
-\end{itemize}
-
-% ======================================================================
-\section{Deleted and Deprecated Modules}
-
-A few modules have been dropped because they're obsolete, or because
-there are now better ways to do the same thing. The \module{stdwin}
-module is gone; it was for a platform-independent windowing toolkit
-that's no longer developed.
-
-A number of modules have been moved to the
-\file{lib-old} subdirectory:
-\module{cmp}, \module{cmpcache}, \module{dircmp}, \module{dump},
-\module{find}, \module{grep}, \module{packmail},
-\module{poly}, \module{util}, \module{whatsound}, \module{zmod}.
-If you have code which relies on a module that's been moved to
-\file{lib-old}, you can simply add that directory to \code{sys.path}
-to get them back, but you're encouraged to update any code that uses
-these modules.
-
-\section{Acknowledgements}
-
-The authors would like to thank the following people for offering
-suggestions on various drafts of this article: David Bolen, Mark Hammond, Gregg Hauser,
-Jeremy Hylton, Fredrik Lundh, Detlef Lannert, Aahz Maruch, Skip
-Montanaro, Vladimir Marangozov, Guido van Rossum, Neil Schemenauer,
-and Russ Schmidt.
-
-\end{document}
diff --git a/Doc/whatsnew/whatsnew21.tex b/Doc/whatsnew/whatsnew21.tex
deleted file mode 100644
index 4a5ad7f0ec..0000000000
--- a/Doc/whatsnew/whatsnew21.tex
+++ /dev/null
@@ -1,868 +0,0 @@
-\documentclass{howto}
-
-\usepackage{distutils}
-
-% $Id$
-
-\title{What's New in Python 2.1}
-\release{1.00}
-\author{A.M. Kuchling}
-\authoraddress{\email{amk1@bigfoot.com}}
-\begin{document}
-\maketitle\tableofcontents
-
-\section{Introduction}
-
-It's that time again... time for a new Python release, Python 2.1.
-One recent goal of the Python development team has been to accelerate
-the pace of new releases, with a new release coming every 6 to 9
-months. 2.1 is the first release to come out at this faster pace, with
-the first alpha appearing in January, 3 months after the final version
-of 2.0 was released.
-
-This article explains the new features in 2.1. While there aren't as
-many changes in 2.1 as there were in Python 2.0, there are still some
-pleasant surprises in store. 2.1 is the first release to be steered
-through the use of Python Enhancement Proposals, or PEPs, so most of
-the sizable changes have accompanying PEPs that provide more complete
-documentation and a design rationale for the change. This article
-doesn't attempt to document the new features completely, but simply
-provides an overview of the new features for Python programmers.
-Refer to the Python 2.1 documentation, or to the specific PEP, for
-more details about any new feature that particularly interests you.
-
-The final release of Python 2.1 was made on April 17, 2001.
-
-%======================================================================
-\section{PEP 227: Nested Scopes}
-
-The largest change in Python 2.1 is to Python's scoping rules. In
-Python 2.0, at any given time there are at most three namespaces used
-to look up variable names: local, module-level, and the built-in
-namespace. This often surprised people because it didn't match their
-intuitive expectations. For example, a nested recursive function
-definition doesn't work:
-
-\begin{verbatim}
-def f():
- ...
- def g(value):
- ...
- return g(value-1) + 1
- ...
-\end{verbatim}
-
-The function \function{g()} will always raise a \exception{NameError}
-exception, because the binding of the name \samp{g} isn't in either
-its local namespace or in the module-level namespace. This isn't much
-of a problem in practice (how often do you recursively define interior
-functions like this?), but this also made using the \keyword{lambda}
-statement clumsier, and this was a problem in practice. In code which
-uses \keyword{lambda} you can often find local variables being copied
-by passing them as the default values of arguments.
-
-\begin{verbatim}
-def find(self, name):
- "Return list of any entries equal to 'name'"
- L = filter(lambda x, name=name: x == name,
- self.list_attribute)
- return L
-\end{verbatim}
-
-The readability of Python code written in a strongly functional style
-suffers greatly as a result.
-
-The most significant change to Python 2.1 is that static scoping has
-been added to the language to fix this problem. As a first effect,
-the \code{name=name} default argument is now unnecessary in the above
-example. Put simply, when a given variable name is not assigned a
-value within a function (by an assignment, or the \keyword{def},
-\keyword{class}, or \keyword{import} statements), references to the
-variable will be looked up in the local namespace of the enclosing
-scope. A more detailed explanation of the rules, and a dissection of
-the implementation, can be found in the PEP.
-
-This change may cause some compatibility problems for code where the
-same variable name is used both at the module level and as a local
-variable within a function that contains further function definitions.
-This seems rather unlikely though, since such code would have been
-pretty confusing to read in the first place.
-
-One side effect of the change is that the \code{from \var{module}
-import *} and \keyword{exec} statements have been made illegal inside
-a function scope under certain conditions. The Python reference
-manual has said all along that \code{from \var{module} import *} is
-only legal at the top level of a module, but the CPython interpreter
-has never enforced this before. As part of the implementation of
-nested scopes, the compiler which turns Python source into bytecodes
-has to generate different code to access variables in a containing
-scope. \code{from \var{module} import *} and \keyword{exec} make it
-impossible for the compiler to figure this out, because they add names
-to the local namespace that are unknowable at compile time.
-Therefore, if a function contains function definitions or
-\keyword{lambda} expressions with free variables, the compiler will
-flag this by raising a \exception{SyntaxError} exception.
-
-To make the preceding explanation a bit clearer, here's an example:
-
-\begin{verbatim}
-x = 1
-def f():
- # The next line is a syntax error
- exec 'x=2'
- def g():
- return x
-\end{verbatim}
-
-Line 4 containing the \keyword{exec} statement is a syntax error,
-since \keyword{exec} would define a new local variable named \samp{x}
-whose value should be accessed by \function{g()}.
-
-This shouldn't be much of a limitation, since \keyword{exec} is rarely
-used in most Python code (and when it is used, it's often a sign of a
-poor design anyway).
-
-Compatibility concerns have led to nested scopes being introduced
-gradually; in Python 2.1, they aren't enabled by default, but can be
-turned on within a module by using a future statement as described in
-PEP 236. (See the following section for further discussion of PEP
-236.) In Python 2.2, nested scopes will become the default and there
-will be no way to turn them off, but users will have had all of 2.1's
-lifetime to fix any breakage resulting from their introduction.
-
-\begin{seealso}
-
-\seepep{227}{Statically Nested Scopes}{Written and implemented by
-Jeremy Hylton.}
-
-\end{seealso}
-
-
-%======================================================================
-\section{PEP 236: \module{__future__} Directives}
-
-The reaction to nested scopes was widespread concern about the dangers
-of breaking code with the 2.1 release, and it was strong enough to
-make the Pythoneers take a more conservative approach. This approach
-consists of introducing a convention for enabling optional
-functionality in release N that will become compulsory in release N+1.
-
-The syntax uses a \code{from...import} statement using the reserved
-module name \module{__future__}. Nested scopes can be enabled by the
-following statement:
-
-\begin{verbatim}
-from __future__ import nested_scopes
-\end{verbatim}
-
-While it looks like a normal \keyword{import} statement, it's not;
-there are strict rules on where such a future statement can be put.
-They can only be at the top of a module, and must precede any Python
-code or regular \keyword{import} statements. This is because such
-statements can affect how the Python bytecode compiler parses code and
-generates bytecode, so they must precede any statement that will
-result in bytecodes being produced.
-
-\begin{seealso}
-
-\seepep{236}{Back to the \module{__future__}}{Written by Tim Peters,
-and primarily implemented by Jeremy Hylton.}
-
-\end{seealso}
-
-%======================================================================
-\section{PEP 207: Rich Comparisons}
-
-In earlier versions, Python's support for implementing comparisons on
-user-defined classes and extension types was quite simple. Classes
-could implement a \method{__cmp__} method that was given two instances
-of a class, and could only return 0 if they were equal or +1 or -1 if
-they weren't; the method couldn't raise an exception or return
-anything other than a Boolean value. Users of Numeric Python often
-found this model too weak and restrictive, because in the
-number-crunching programs that numeric Python is used for, it would be
-more useful to be able to perform elementwise comparisons of two
-matrices, returning a matrix containing the results of a given
-comparison for each element. If the two matrices are of different
-sizes, then the compare has to be able to raise an exception to signal
-the error.
-
-In Python 2.1, rich comparisons were added in order to support this
-need. Python classes can now individually overload each of the
-\code{<}, \code{<=}, \code{>}, \code{>=}, \code{==}, and \code{!=}
-operations. The new magic method names are:
-
-\begin{tableii}{c|l}{code}{Operation}{Method name}
- \lineii{<}{\method{__lt__}} \lineii{<=}{\method{__le__}}
- \lineii{>}{\method{__gt__}} \lineii{>=}{\method{__ge__}}
- \lineii{==}{\method{__eq__}} \lineii{!=}{\method{__ne__}}
- \end{tableii}
-
-(The magic methods are named after the corresponding Fortran operators
-\code{.LT.}. \code{.LE.}, \&c. Numeric programmers are almost
-certainly quite familar with these names and will find them easy to
-remember.)
-
-Each of these magic methods is of the form \code{\var{method}(self,
-other)}, where \code{self} will be the object on the left-hand side of
-the operator, while \code{other} will be the object on the right-hand
-side. For example, the expression \code{A < B} will cause
-\code{A.__lt__(B)} to be called.
-
-Each of these magic methods can return anything at all: a Boolean, a
-matrix, a list, or any other Python object. Alternatively they can
-raise an exception if the comparison is impossible, inconsistent, or
-otherwise meaningless.
-
-The built-in \function{cmp(A,B)} function can use the rich comparison
-machinery, and now accepts an optional argument specifying which
-comparison operation to use; this is given as one of the strings
-\code{"<"}, \code{"<="}, \code{">"}, \code{">="}, \code{"=="}, or
-\code{"!="}. If called without the optional third argument,
-\function{cmp()} will only return -1, 0, or +1 as in previous versions
-of Python; otherwise it will call the appropriate method and can
-return any Python object.
-
-There are also corresponding changes of interest to C programmers;
-there's a new slot \code{tp_richcmp} in type objects and an API for
-performing a given rich comparison. I won't cover the C API here, but
-will refer you to PEP 207, or to 2.1's C API documentation, for the
-full list of related functions.
-
-\begin{seealso}
-
-\seepep{207}{Rich Comparisions}{Written by Guido van Rossum, heavily
-based on earlier work by David Ascher, and implemented by Guido van
-Rossum.}
-
-\end{seealso}
-
-%======================================================================
-\section{PEP 230: Warning Framework}
-
-Over its 10 years of existence, Python has accumulated a certain
-number of obsolete modules and features along the way. It's difficult
-to know when a feature is safe to remove, since there's no way of
-knowing how much code uses it --- perhaps no programs depend on the
-feature, or perhaps many do. To enable removing old features in a
-more structured way, a warning framework was added. When the Python
-developers want to get rid of a feature, it will first trigger a
-warning in the next version of Python. The following Python version
-can then drop the feature, and users will have had a full release
-cycle to remove uses of the old feature.
-
-Python 2.1 adds the warning framework to be used in this scheme. It
-adds a \module{warnings} module that provide functions to issue
-warnings, and to filter out warnings that you don't want to be
-displayed. Third-party modules can also use this framework to
-deprecate old features that they no longer wish to support.
-
-For example, in Python 2.1 the \module{regex} module is deprecated, so
-importing it causes a warning to be printed:
-
-\begin{verbatim}
->>> import regex
-__main__:1: DeprecationWarning: the regex module
- is deprecated; please use the re module
->>>
-\end{verbatim}
-
-Warnings can be issued by calling the \function{warnings.warn}
-function:
-
-\begin{verbatim}
-warnings.warn("feature X no longer supported")
-\end{verbatim}
-
-The first parameter is the warning message; an additional optional
-parameters can be used to specify a particular warning category.
-
-Filters can be added to disable certain warnings; a regular expression
-pattern can be applied to the message or to the module name in order
-to suppress a warning. For example, you may have a program that uses
-the \module{regex} module and not want to spare the time to convert it
-to use the \module{re} module right now. The warning can be
-suppressed by calling
-
-\begin{verbatim}
-import warnings
-warnings.filterwarnings(action = 'ignore',
- message='.*regex module is deprecated',
- category=DeprecationWarning,
- module = '__main__')
-\end{verbatim}
-
-This adds a filter that will apply only to warnings of the class
-\class{DeprecationWarning} triggered in the \module{__main__} module,
-and applies a regular expression to only match the message about the
-\module{regex} module being deprecated, and will cause such warnings
-to be ignored. Warnings can also be printed only once, printed every
-time the offending code is executed, or turned into exceptions that
-will cause the program to stop (unless the exceptions are caught in
-the usual way, of course).
-
-Functions were also added to Python's C API for issuing warnings;
-refer to PEP 230 or to Python's API documentation for the details.
-
-\begin{seealso}
-
-\seepep{5}{Guidelines for Language Evolution}{Written
-by Paul Prescod, to specify procedures to be followed when removing
-old features from Python. The policy described in this PEP hasn't
-been officially adopted, but the eventual policy probably won't be too
-different from Prescod's proposal.}
-
-\seepep{230}{Warning Framework}{Written and implemented by Guido van
-Rossum.}
-
-\end{seealso}
-
-%======================================================================
-\section{PEP 229: New Build System}
-
-When compiling Python, the user had to go in and edit the
-\file{Modules/Setup} file in order to enable various additional
-modules; the default set is relatively small and limited to modules
-that compile on most Unix platforms. This means that on Unix
-platforms with many more features, most notably Linux, Python
-installations often don't contain all useful modules they could.
-
-Python 2.0 added the Distutils, a set of modules for distributing and
-installing extensions. In Python 2.1, the Distutils are used to
-compile much of the standard library of extension modules,
-autodetecting which ones are supported on the current machine. It's
-hoped that this will make Python installations easier and more
-featureful.
-
-Instead of having to edit the \file{Modules/Setup} file in order to
-enable modules, a \file{setup.py} script in the top directory of the
-Python source distribution is run at build time, and attempts to
-discover which modules can be enabled by examining the modules and
-header files on the system. If a module is configured in
-\file{Modules/Setup}, the \file{setup.py} script won't attempt to
-compile that module and will defer to the \file{Modules/Setup} file's
-contents. This provides a way to specific any strange command-line
-flags or libraries that are required for a specific platform.
-
-In another far-reaching change to the build mechanism, Neil
-Schemenauer restructured things so Python now uses a single makefile
-that isn't recursive, instead of makefiles in the top directory and in
-each of the \file{Python/}, \file{Parser/}, \file{Objects/}, and
-\file{Modules/} subdirectories. This makes building Python faster
-and also makes hacking the Makefiles clearer and simpler.
-
-\begin{seealso}
-
-\seepep{229}{Using Distutils to Build Python}{Written
-and implemented by A.M. Kuchling.}
-
-\end{seealso}
-
-%======================================================================
-\section{PEP 205: Weak References}
-
-Weak references, available through the \module{weakref} module, are a
-minor but useful new data type in the Python programmer's toolbox.
-
-Storing a reference to an object (say, in a dictionary or a list) has
-the side effect of keeping that object alive forever. There are a few
-specific cases where this behaviour is undesirable, object caches
-being the most common one, and another being circular references in
-data structures such as trees.
-
-For example, consider a memoizing function that caches the results of
-another function \function{f(\var{x})} by storing the function's
-argument and its result in a dictionary:
-
-\begin{verbatim}
-_cache = {}
-def memoize(x):
- if _cache.has_key(x):
- return _cache[x]
-
- retval = f(x)
-
- # Cache the returned object
- _cache[x] = retval
-
- return retval
-\end{verbatim}
-
-This version works for simple things such as integers, but it has a
-side effect; the \code{_cache} dictionary holds a reference to the
-return values, so they'll never be deallocated until the Python
-process exits and cleans up This isn't very noticeable for integers,
-but if \function{f()} returns an object, or a data structure that
-takes up a lot of memory, this can be a problem.
-
-Weak references provide a way to implement a cache that won't keep
-objects alive beyond their time. If an object is only accessible
-through weak references, the object will be deallocated and the weak
-references will now indicate that the object it referred to no longer
-exists. A weak reference to an object \var{obj} is created by calling
-\code{wr = weakref.ref(\var{obj})}. The object being referred to is
-returned by calling the weak reference as if it were a function:
-\code{wr()}. It will return the referenced object, or \code{None} if
-the object no longer exists.
-
-This makes it possible to write a \function{memoize()} function whose
-cache doesn't keep objects alive, by storing weak references in the
-cache.
-
-\begin{verbatim}
-_cache = {}
-def memoize(x):
- if _cache.has_key(x):
- obj = _cache[x]()
- # If weak reference object still exists,
- # return it
- if obj is not None: return obj
-
- retval = f(x)
-
- # Cache a weak reference
- _cache[x] = weakref.ref(retval)
-
- return retval
-\end{verbatim}
-
-The \module{weakref} module also allows creating proxy objects which
-behave like weak references --- an object referenced only by proxy
-objects is deallocated -- but instead of requiring an explicit call to
-retrieve the object, the proxy transparently forwards all operations
-to the object as long as the object still exists. If the object is
-deallocated, attempting to use a proxy will cause a
-\exception{weakref.ReferenceError} exception to be raised.
-
-\begin{verbatim}
-proxy = weakref.proxy(obj)
-proxy.attr # Equivalent to obj.attr
-proxy.meth() # Equivalent to obj.meth()
-del obj
-proxy.attr # raises weakref.ReferenceError
-\end{verbatim}
-
-\begin{seealso}
-
-\seepep{205}{Weak References}{Written and implemented by
-Fred~L. Drake,~Jr.}
-
-\end{seealso}
-
-%======================================================================
-\section{PEP 232: Function Attributes}
-
-In Python 2.1, functions can now have arbitrary information attached
-to them. People were often using docstrings to hold information about
-functions and methods, because the \code{__doc__} attribute was the
-only way of attaching any information to a function. For example, in
-the Zope Web application server, functions are marked as safe for
-public access by having a docstring, and in John Aycock's SPARK
-parsing framework, docstrings hold parts of the BNF grammar to be
-parsed. This overloading is unfortunate, since docstrings are really
-intended to hold a function's documentation; for example, it means you
-can't properly document functions intended for private use in Zope.
-
-Arbitrary attributes can now be set and retrieved on functions using the
-regular Python syntax:
-
-\begin{verbatim}
-def f(): pass
-
-f.publish = 1
-f.secure = 1
-f.grammar = "A ::= B (C D)*"
-\end{verbatim}
-
-The dictionary containing attributes can be accessed as the function's
-\member{__dict__}. Unlike the \member{__dict__} attribute of class
-instances, in functions you can actually assign a new dictionary to
-\member{__dict__}, though the new value is restricted to a regular
-Python dictionary; you \emph{can't} be tricky and set it to a
-\class{UserDict} instance, or any other random object that behaves
-like a mapping.
-
-\begin{seealso}
-
-\seepep{232}{Function Attributes}{Written and implemented by Barry
-Warsaw.}
-
-\end{seealso}
-
-
-%======================================================================
-
-\section{PEP 235: Case-Insensitive Platforms and \keyword{import}}
-
-Some operating systems have filesystems that are case-insensitive,
-MacOS and Windows being the primary examples; on these systems, it's
-impossible to distinguish the filenames \samp{FILE.PY} and
-\samp{file.py}, even though they do store the file's name
-in its original case (they're case-preserving, too).
-
-In Python 2.1, the \keyword{import} statement will work to simulate
-case-sensitivity on case-insensitive platforms. Python will now
-search for the first case-sensitive match by default, raising an
-\exception{ImportError} if no such file is found, so \code{import file}
-will not import a module named \samp{FILE.PY}. Case-insensitive
-matching can be requested by setting the \envvar{PYTHONCASEOK} environment
-variable before starting the Python interpreter.
-
-%======================================================================
-\section{PEP 217: Interactive Display Hook}
-
-When using the Python interpreter interactively, the output of
-commands is displayed using the built-in \function{repr()} function.
-In Python 2.1, the variable \function{sys.displayhook} can be set to a
-callable object which will be called instead of \function{repr()}.
-For example, you can set it to a special pretty-printing function:
-
-\begin{verbatim}
->>> # Create a recursive data structure
-... L = [1,2,3]
->>> L.append(L)
->>> L # Show Python's default output
-[1, 2, 3, [...]]
->>> # Use pprint.pprint() as the display function
-... import sys, pprint
->>> sys.displayhook = pprint.pprint
->>> L
-[1, 2, 3, ]
->>>
-\end{verbatim}
-
-\begin{seealso}
-
-\seepep{217}{Display Hook for Interactive Use}{Written and implemented
-by Moshe Zadka.}
-
-\end{seealso}
-
-%======================================================================
-\section{PEP 208: New Coercion Model}
-
-How numeric coercion is done at the C level was significantly
-modified. This will only affect the authors of C extensions to
-Python, allowing them more flexibility in writing extension types that
-support numeric operations.
-
-Extension types can now set the type flag \code{Py_TPFLAGS_CHECKTYPES}
-in their \code{PyTypeObject} structure to indicate that they support
-the new coercion model. In such extension types, the numeric slot
-functions can no longer assume that they'll be passed two arguments of
-the same type; instead they may be passed two arguments of differing
-types, and can then perform their own internal coercion. If the slot
-function is passed a type it can't handle, it can indicate the failure
-by returning a reference to the \code{Py_NotImplemented} singleton
-value. The numeric functions of the other type will then be tried,
-and perhaps they can handle the operation; if the other type also
-returns \code{Py_NotImplemented}, then a \exception{TypeError} will be
-raised. Numeric methods written in Python can also return
-\code{Py_NotImplemented}, causing the interpreter to act as if the
-method did not exist (perhaps raising a \exception{TypeError}, perhaps
-trying another object's numeric methods).
-
-\begin{seealso}
-
-\seepep{208}{Reworking the Coercion Model}{Written and implemented by
-Neil Schemenauer, heavily based upon earlier work by Marc-Andr\'e
-Lemburg. Read this to understand the fine points of how numeric
-operations will now be processed at the C level.}
-
-\end{seealso}
-
-%======================================================================
-\section{PEP 241: Metadata in Python Packages}
-
-A common complaint from Python users is that there's no single catalog
-of all the Python modules in existence. T.~Middleton's Vaults of
-Parnassus at \url{http://www.vex.net/parnassus} are the largest
-catalog of Python modules, but registering software at the Vaults is
-optional, and many people don't bother.
-
-As a first small step toward fixing the problem, Python software
-packaged using the Distutils \command{sdist} command will include a
-file named \file{PKG-INFO} containing information about the package
-such as its name, version, and author (metadata, in cataloguing
-terminology). PEP 241 contains the full list of fields that can be
-present in the \file{PKG-INFO} file. As people began to package their
-software using Python 2.1, more and more packages will include
-metadata, making it possible to build automated cataloguing systems
-and experiment with them. With the result experience, perhaps it'll
-be possible to design a really good catalog and then build support for
-it into Python 2.2. For example, the Distutils \command{sdist}
-and \command{bdist_*} commands could support a \option{upload} option
-that would automatically upload your package to a catalog server.
-
-You can start creating packages containing \file{PKG-INFO} even if
-you're not using Python 2.1, since a new release of the Distutils will
-be made for users of earlier Python versions. Version 1.0.2 of the
-Distutils includes the changes described in PEP 241, as well as
-various bugfixes and enhancements. It will be available from
-the Distutils SIG at \url{http://www.python.org/sigs/distutils-sig}.
-
-% XXX update when I actually release 1.0.2
-
-\begin{seealso}
-
-\seepep{241}{Metadata for Python Software Packages}{Written and
-implemented by A.M. Kuchling.}
-
-\seepep{243}{Module Repository Upload Mechanism}{Written by Sean
-Reifschneider, this draft PEP describes a proposed mechanism for uploading
-Python packages to a central server.
-}
-
-\end{seealso}
-
-%======================================================================
-\section{New and Improved Modules}
-
-\begin{itemize}
-
-\item Ka-Ping Yee contributed two new modules: \module{inspect.py}, a
-module for getting information about live Python code, and
-\module{pydoc.py}, a module for interactively converting docstrings to
-HTML or text. As a bonus, \file{Tools/scripts/pydoc}, which is now
-automatically installed, uses \module{pydoc.py} to display
-documentation given a Python module, package, or class name. For
-example, \samp{pydoc xml.dom} displays the following:
-
-\begin{verbatim}
-Python Library Documentation: package xml.dom in xml
-
-NAME
- xml.dom - W3C Document Object Model implementation for Python.
-
-FILE
- /usr/local/lib/python2.1/xml/dom/__init__.pyc
-
-DESCRIPTION
- The Python mapping of the Document Object Model is documented in the
- Python Library Reference in the section on the xml.dom package.
-
- This package contains the following modules:
- ...
-\end{verbatim}
-
-\file{pydoc} also includes a Tk-based interactive help browser.
-\file{pydoc} quickly becomes addictive; try it out!
-
-\item Two different modules for unit testing were added to the
-standard library. The \module{doctest} module, contributed by Tim
-Peters, provides a testing framework based on running embedded
-examples in docstrings and comparing the results against the expected
-output. PyUnit, contributed by Steve Purcell, is a unit testing
-framework inspired by JUnit, which was in turn an adaptation of Kent
-Beck's Smalltalk testing framework. See
-\url{http://pyunit.sourceforge.net/} for more information about
-PyUnit.
-
-\item The \module{difflib} module contains a class,
-\class{SequenceMatcher}, which compares two sequences and computes the
-changes required to transform one sequence into the other. For
-example, this module can be used to write a tool similar to the Unix
-\program{diff} program, and in fact the sample program
-\file{Tools/scripts/ndiff.py} demonstrates how to write such a script.
-
-\item \module{curses.panel}, a wrapper for the panel library, part of
-ncurses and of SYSV curses, was contributed by Thomas Gellekum. The
-panel library provides windows with the additional feature of depth.
-Windows can be moved higher or lower in the depth ordering, and the
-panel library figures out where panels overlap and which sections are
-visible.
-
-\item The PyXML package has gone through a few releases since Python
-2.0, and Python 2.1 includes an updated version of the \module{xml}
-package. Some of the noteworthy changes include support for Expat 1.2
-and later versions, the ability for Expat parsers to handle files in
-any encoding supported by Python, and various bugfixes for SAX, DOM,
-and the \module{minidom} module.
-
-\item Ping also contributed another hook for handling uncaught
-exceptions. \function{sys.excepthook} can be set to a callable
-object. When an exception isn't caught by any
-\keyword{try}...\keyword{except} blocks, the exception will be passed
-to \function{sys.excepthook}, which can then do whatever it likes. At
-the Ninth Python Conference, Ping demonstrated an application for this
-hook: printing an extended traceback that not only lists the stack
-frames, but also lists the function arguments and the local variables
-for each frame.
-
-\item Various functions in the \module{time} module, such as
-\function{asctime()} and \function{localtime()}, require a floating
-point argument containing the time in seconds since the epoch. The
-most common use of these functions is to work with the current time,
-so the floating point argument has been made optional; when a value
-isn't provided, the current time will be used. For example, log file
-entries usually need a string containing the current time; in Python
-2.1, \code{time.asctime()} can be used, instead of the lengthier
-\code{time.asctime(time.localtime(time.time()))} that was previously
-required.
-
-This change was proposed and implemented by Thomas Wouters.
-
-\item The \module{ftplib} module now defaults to retrieving files in
-passive mode, because passive mode is more likely to work from behind
-a firewall. This request came from the Debian bug tracking system,
-since other Debian packages use \module{ftplib} to retrieve files and
-then don't work from behind a firewall. It's deemed unlikely that
-this will cause problems for anyone, because Netscape defaults to
-passive mode and few people complain, but if passive mode is
-unsuitable for your application or network setup, call
-\method{set_pasv(0)} on FTP objects to disable passive mode.
-
-\item Support for raw socket access has been added to the
-\module{socket} module, contributed by Grant Edwards.
-
-\item The \module{pstats} module now contains a simple interactive
-statistics browser for displaying timing profiles for Python programs,
-invoked when the module is run as a script. Contributed by
-Eric S.\ Raymond.
-
-\item A new implementation-dependent function, \function{sys._getframe(\optional{depth})},
-has been added to return a given frame object from the current call stack.
-\function{sys._getframe()} returns the frame at the top of the call stack;
-if the optional integer argument \var{depth} is supplied, the function returns the frame
-that is \var{depth} calls below the top of the stack. For example, \code{sys._getframe(1)}
-returns the caller's frame object.
-
-This function is only present in CPython, not in Jython or the .NET
-implementation. Use it for debugging, and resist the temptation to
-put it into production code.
-
-
-
-\end{itemize}
-
-%======================================================================
-\section{Other Changes and Fixes}
-
-There were relatively few smaller changes made in Python 2.1 due to
-the shorter release cycle. A search through the CVS change logs turns
-up 117 patches applied, and 136 bugs fixed; both figures are likely to
-be underestimates. Some of the more notable changes are:
-
-\begin{itemize}
-
-
-\item A specialized object allocator is now optionally available, that
-should be faster than the system \function{malloc()} and have less
-memory overhead. The allocator uses C's \function{malloc()} function
-to get large pools of memory, and then fulfills smaller memory
-requests from these pools. It can be enabled by providing the
-\longprogramopt{with-pymalloc} option to the \program{configure} script; see
-\file{Objects/obmalloc.c} for the implementation details.
-
-Authors of C extension modules should test their code with the object
-allocator enabled, because some incorrect code may break, causing core
-dumps at runtime. There are a bunch of memory allocation functions in
-Python's C API that have previously been just aliases for the C
-library's \function{malloc()} and \function{free()}, meaning that if
-you accidentally called mismatched functions, the error wouldn't be
-noticeable. When the object allocator is enabled, these functions
-aren't aliases of \function{malloc()} and \function{free()} any more,
-and calling the wrong function to free memory will get you a core
-dump. For example, if memory was allocated using
-\function{PyMem_New()}, it has to be freed using
-\function{PyMem_Del()}, not \function{free()}. A few modules included
-with Python fell afoul of this and had to be fixed; doubtless there
-are more third-party modules that will have the same problem.
-
-The object allocator was contributed by Vladimir Marangozov.
-
-\item The speed of line-oriented file I/O has been improved because
-people often complain about its lack of speed, and because it's often
-been used as a na\"ive benchmark. The \method{readline()} method of
-file objects has therefore been rewritten to be much faster. The
-exact amount of the speedup will vary from platform to platform
-depending on how slow the C library's \function{getc()} was, but is
-around 66\%, and potentially much faster on some particular operating
-systems. Tim Peters did much of the benchmarking and coding for this
-change, motivated by a discussion in comp.lang.python.
-
-A new module and method for file objects was also added, contributed
-by Jeff Epler. The new method, \method{xreadlines()}, is similar to
-the existing \function{xrange()} built-in. \function{xreadlines()}
-returns an opaque sequence object that only supports being iterated
-over, reading a line on every iteration but not reading the entire
-file into memory as the existing \method{readlines()} method does.
-You'd use it like this:
-
-\begin{verbatim}
-for line in sys.stdin.xreadlines():
- # ... do something for each line ...
- ...
-\end{verbatim}
-
-For a fuller discussion of the line I/O changes, see the python-dev
-summary for January 1-15, 2001 at
-\url{http://www.amk.ca/python/dev/2001-01-1.html}.
-
-\item A new method, \method{popitem()}, was added to dictionaries to
-enable destructively iterating through the contents of a dictionary;
-this can be faster for large dictionaries because there's no need to
-construct a list containing all the keys or values.
-\code{D.popitem()} removes a random \code{(\var{key}, \var{value})}
-pair from the dictionary~\code{D} and returns it as a 2-tuple. This
-was implemented mostly by Tim Peters and Guido van Rossum, after a
-suggestion and preliminary patch by Moshe Zadka.
-
-\item Modules can now control which names are imported when \code{from
-\var{module} import *} is used, by defining an \code{__all__}
-attribute containing a list of names that will be imported. One
-common complaint is that if the module imports other modules such as
-\module{sys} or \module{string}, \code{from \var{module} import *}
-will add them to the importing module's namespace. To fix this,
-simply list the public names in \code{__all__}:
-
-\begin{verbatim}
-# List public names
-__all__ = ['Database', 'open']
-\end{verbatim}
-
-A stricter version of this patch was first suggested and implemented
-by Ben Wolfson, but after some python-dev discussion, a weaker final
-version was checked in.
-
-\item Applying \function{repr()} to strings previously used octal
-escapes for non-printable characters; for example, a newline was
-\code{'\e 012'}. This was a vestigial trace of Python's C ancestry, but
-today octal is of very little practical use. Ka-Ping Yee suggested
-using hex escapes instead of octal ones, and using the \code{\e n},
-\code{\e t}, \code{\e r} escapes for the appropriate characters, and
-implemented this new formatting.
-
-\item Syntax errors detected at compile-time can now raise exceptions
-containing the filename and line number of the error, a pleasant side
-effect of the compiler reorganization done by Jeremy Hylton.
-
-\item C extensions which import other modules have been changed to use
-\function{PyImport_ImportModule()}, which means that they will use any
-import hooks that have been installed. This is also encouraged for
-third-party extensions that need to import some other module from C
-code.
-
-\item The size of the Unicode character database was shrunk by another
-340K thanks to Fredrik Lundh.
-
-\item Some new ports were contributed: MacOS X (by Steven Majewski),
-Cygwin (by Jason Tishler); RISCOS (by Dietmar Schwertberger); Unixware~7
-(by Billy G. Allie).
-
-\end{itemize}
-
-And there's the usual list of minor bugfixes, minor memory leaks,
-docstring edits, and other tweaks, too lengthy to be worth itemizing;
-see the CVS logs for the full details if you want them.
-
-
-%======================================================================
-\section{Acknowledgements}
-
-The author would like to thank the following people for offering
-suggestions on various drafts of this article: Graeme Cross, David
-Goodger, Jay Graves, Michael Hudson, Marc-Andr\'e Lemburg, Fredrik
-Lundh, Neil Schemenauer, Thomas Wouters.
-
-\end{document}
diff --git a/Doc/whatsnew/whatsnew22.tex b/Doc/whatsnew/whatsnew22.tex
deleted file mode 100644
index 6645fbefc7..0000000000
--- a/Doc/whatsnew/whatsnew22.tex
+++ /dev/null
@@ -1,875 +0,0 @@
-\documentclass{howto}
-
-% $Id$
-
-\title{What's New in Python 2.2}
-\release{0.05}
-\author{A.M. Kuchling}
-\authoraddress{\email{akuchlin@mems-exchange.org}}
-\begin{document}
-\maketitle\tableofcontents
-
-\section{Introduction}
-
-{\large This document is a draft, and is subject to change until the
-final version of Python 2.2 is released. Currently it's up to date
-for Python 2.2 alpha 1. Please send any comments, bug reports, or
-questions, no matter how minor, to \email{akuchlin@mems-exchange.org}.
-}
-
-This article explains the new features in Python 2.2. Python 2.2
-includes some significant changes that go far toward cleaning up the
-language's darkest corners, and some exciting new features.
-
-This article doesn't attempt to provide a complete specification for
-the new features, but instead provides a convenient overview of the
-new features. For full details, you should refer to 2.2 documentation
-such as the
-\citetitle[http://python.sourceforge.net/devel-docs/lib/lib.html]{Python
-Library Reference} and the
-\citetitle[http://python.sourceforge.net/devel-docs/ref/ref.html]{Python
-Reference Manual}, or to the PEP for a particular new feature.
-% These \citetitle marks should get the python.org URLs for the final
-% release, just as soon as the docs are published there.
-
-The final release of Python 2.2 is planned for October 2001.
-
-
-%======================================================================
-% It looks like this set of changes will likely get into 2.2,
-% so I need to read and digest the relevant PEPs.
-%\section{PEP 252: Type and Class Changes}
-
-%XXX
-
-% GvR's description at http://www.python.org/2.2/descrintro.html
-
-%\begin{seealso}
-
-%\seepep{252}{Making Types Look More Like Classes}{Written and implemented
-%by GvR.}
-
-%\end{seealso}
-
-
-%======================================================================
-\section{PEP 234: Iterators}
-
-A significant addition to 2.2 is an iteration interface at both the C
-and Python levels. Objects can define how they can be looped over by
-callers.
-
-In Python versions up to 2.1, the usual way to make \code{for item in
-obj} work is to define a \method{__getitem__()} method that looks
-something like this:
-
-\begin{verbatim}
- def __getitem__(self, index):
- return
-\end{verbatim}
-
-\method{__getitem__()} is more properly used to define an indexing
-operation on an object so that you can write \code{obj[5]} to retrieve
-the sixth element. It's a bit misleading when you're using this only
-to support \keyword{for} loops. Consider some file-like object that
-wants to be looped over; the \var{index} parameter is essentially
-meaningless, as the class probably assumes that a series of
-\method{__getitem__()} calls will be made, with \var{index}
-incrementing by one each time. In other words, the presence of the
-\method{__getitem__()} method doesn't mean that \code{file[5]} will
-work, though it really should.
-
-In Python 2.2, iteration can be implemented separately, and
-\method{__getitem__()} methods can be limited to classes that really
-do support random access. The basic idea of iterators is quite
-simple. A new built-in function, \function{iter(obj)}, returns an
-iterator for the object \var{obj}. (It can also take two arguments:
-\code{iter(\var{C}, \var{sentinel})} will call the callable \var{C},
-until it returns \var{sentinel}, which will signal that the iterator
-is done. This form probably won't be used very often.)
-
-Python classes can define an \method{__iter__()} method, which should
-create and return a new iterator for the object; if the object is its
-own iterator, this method can just return \code{self}. In particular,
-iterators will usually be their own iterators. Extension types
-implemented in C can implement a \code{tp_iter} function in order to
-return an iterator, and extension types that want to behave as
-iterators can define a \code{tp_iternext} function.
-
-So what do iterators do? They have one required method,
-\method{next()}, which takes no arguments and returns the next value.
-When there are no more values to be returned, calling \method{next()}
-should raise the \exception{StopIteration} exception.
-
-\begin{verbatim}
->>> L = [1,2,3]
->>> i = iter(L)
->>> print i
-
->>> i.next()
-1
->>> i.next()
-2
->>> i.next()
-3
->>> i.next()
-Traceback (most recent call last):
- File "", line 1, in ?
-StopIteration
->>>
-\end{verbatim}
-
-In 2.2, Python's \keyword{for} statement no longer expects a sequence;
-it expects something for which \function{iter()} will return something.
-For backward compatibility, and convenience, an iterator is
-automatically constructed for sequences that don't implement
-\method{__iter__()} or a \code{tp_iter} slot, so \code{for i in
-[1,2,3]} will still work. Wherever the Python interpreter loops over
-a sequence, it's been changed to use the iterator protocol. This
-means you can do things like this:
-
-\begin{verbatim}
->>> i = iter(L)
->>> a,b,c = i
->>> a,b,c
-(1, 2, 3)
->>>
-\end{verbatim}
-
-Iterator support has been added to some of Python's basic types.
-Calling \function{iter()} on a dictionary will return an iterator
-which loops over its keys:
-
-\begin{verbatim}
->>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
-... 'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
->>> for key in m: print key, m[key]
-...
-Mar 3
-Feb 2
-Aug 8
-Sep 9
-May 5
-Jun 6
-Jul 7
-Jan 1
-Apr 4
-Nov 11
-Dec 12
-Oct 10
->>>
-\end{verbatim}
-
-That's just the default behaviour. If you want to iterate over keys,
-values, or key/value pairs, you can explicitly call the
-\method{iterkeys()}, \method{itervalues()}, or \method{iteritems()}
-methods to get an appropriate iterator. In a minor related change,
-the \keyword{in} operator now works on dictionaries, so
-\code{\var{key} in dict} is now equivalent to
-\code{dict.has_key(\var{key})}.
-
-
-Files also provide an iterator, which calls the \method{readline()}
-method until there are no more lines in the file. This means you can
-now read each line of a file using code like this:
-
-\begin{verbatim}
-for line in file:
- # do something for each line
-\end{verbatim}
-
-Note that you can only go forward in an iterator; there's no way to
-get the previous element, reset the iterator, or make a copy of it.
-An iterator object could provide such additional capabilities, but the
-iterator protocol only requires a \method{next()} method.
-
-\begin{seealso}
-
-\seepep{234}{Iterators}{Written by Ka-Ping Yee and GvR; implemented
-by the Python Labs crew, mostly by GvR and Tim Peters.}
-
-\end{seealso}
-
-
-%======================================================================
-\section{PEP 255: Simple Generators}
-
-Generators are another new feature, one that interacts with the
-introduction of iterators.
-
-You're doubtless familiar with how function calls work in Python or
-C. When you call a function, it gets a private area where its local
-variables are created. When the function reaches a \keyword{return}
-statement, the local variables are destroyed and the resulting value
-is returned to the caller. A later call to the same function will get
-a fresh new set of local variables. But, what if the local variables
-weren't destroyed on exiting a function? What if you could later
-resume the function where it left off? This is what generators
-provide; they can be thought of as resumable functions.
-
-Here's the simplest example of a generator function:
-
-\begin{verbatim}
-def generate_ints(N):
- for i in range(N):
- yield i
-\end{verbatim}
-
-A new keyword, \keyword{yield}, was introduced for generators. Any
-function containing a \keyword{yield} statement is a generator
-function; this is detected by Python's bytecode compiler which
-compiles the function specially. Because a new keyword was
-introduced, generators must be explicitly enabled in a module by
-including a \code{from __future__ import generators} statement near
-the top of the module's source code. In Python 2.3 this statement
-will become unnecessary.
-
-When you call a generator function, it doesn't return a single value;
-instead it returns a generator object that supports the iterator
-interface. On executing the \keyword{yield} statement, the generator
-outputs the value of \code{i}, similar to a \keyword{return}
-statement. The big difference between \keyword{yield} and a
-\keyword{return} statement is that, on reaching a \keyword{yield} the
-generator's state of execution is suspended and local variables are
-preserved. On the next call to the generator's \code{.next()} method,
-the function will resume executing immediately after the
-\keyword{yield} statement. (For complicated reasons, the
-\keyword{yield} statement isn't allowed inside the \keyword{try} block
-of a \code{try...finally} statement; read PEP 255 for a full
-explanation of the interaction between \keyword{yield} and
-exceptions.)
-
-Here's a sample usage of the \function{generate_ints} generator:
-
-\begin{verbatim}
->>> gen = generate_ints(3)
->>> gen
-
->>> gen.next()
-0
->>> gen.next()
-1
->>> gen.next()
-2
->>> gen.next()
-Traceback (most recent call last):
- File "", line 1, in ?
- File "", line 2, in generate_ints
-StopIteration
->>>
-\end{verbatim}
-
-You could equally write \code{for i in generate_ints(5)}, or
-\code{a,b,c = generate_ints(3)}.
-
-Inside a generator function, the \keyword{return} statement can only
-be used without a value, and signals the end of the procession of
-values; afterwards the generator cannot return any further values.
-\keyword{return} with a value, such as \code{return 5}, is a syntax
-error inside a generator function. The end of the generator's results
-can also be indicated by raising \exception{StopIteration} manually,
-or by just letting the flow of execution fall off the bottom of the
-function.
-
-You could achieve the effect of generators manually by writing your
-own class and storing all the local variables of the generator as
-instance variables. For example, returning a list of integers could
-be done by setting \code{self.count} to 0, and having the
-\method{next()} method increment \code{self.count} and return it.
-However, for a moderately complicated generator, writing a
-corresponding class would be much messier.
-\file{Lib/test/test_generators.py} contains a number of more
-interesting examples. The simplest one implements an in-order
-traversal of a tree using generators recursively.
-
-\begin{verbatim}
-# A recursive generator that generates Tree leaves in in-order.
-def inorder(t):
- if t:
- for x in inorder(t.left):
- yield x
- yield t.label
- for x in inorder(t.right):
- yield x
-\end{verbatim}
-
-Two other examples in \file{Lib/test/test_generators.py} produce
-solutions for the N-Queens problem (placing $N$ queens on an $NxN$
-chess board so that no queen threatens another) and the Knight's Tour
-(a route that takes a knight to every square of an $NxN$ chessboard
-without visiting any square twice).
-
-The idea of generators comes from other programming languages,
-especially Icon (\url{http://www.cs.arizona.edu/icon/}), where the
-idea of generators is central to the language. In Icon, every
-expression and function call behaves like a generator. One example
-from ``An Overview of the Icon Programming Language'' at
-\url{http://www.cs.arizona.edu/icon/docs/ipd266.htm} gives an idea of
-what this looks like:
-
-\begin{verbatim}
-sentence := "Store it in the neighboring harbor"
-if (i := find("or", sentence)) > 5 then write(i)
-\end{verbatim}
-
-The \function{find()} function returns the indexes at which the
-substring ``or'' is found: 3, 23, 33. In the \keyword{if} statement,
-\code{i} is first assigned a value of 3, but 3 is less than 5, so the
-comparison fails, and Icon retries it with the second value of 23. 23
-is greater than 5, so the comparison now succeeds, and the code prints
-the value 23 to the screen.
-
-Python doesn't go nearly as far as Icon in adopting generators as a
-central concept. Generators are considered a new part of the core
-Python language, but learning or using them isn't compulsory; if they
-don't solve any problems that you have, feel free to ignore them.
-This is different from Icon where the idea of generators is a basic
-concept. One novel feature of Python's interface as compared to
-Icon's is that a generator's state is represented as a concrete object
-that can be passed around to other functions or stored in a data
-structure.
-
-\begin{seealso}
-
-\seepep{255}{Simple Generators}{Written by Neil Schemenauer, Tim
-Peters, Magnus Lie Hetland. Implemented mostly by Neil Schemenauer
-and Tim Peters, with other fixes from the Python Labs crew.}
-
-\end{seealso}
-
-
-%======================================================================
-\section{PEP 237: Unifying Long Integers and Integers}
-
-XXX write this section
-
-
-%======================================================================
-\section{PEP 238: Changing the Division Operator}
-
-The most controversial change in Python 2.2 is the start of an effort
-to fix an old design flaw that's been in Python from the beginning.
-Currently Python's division operator, \code{/}, behaves like C's
-division operator when presented with two integer arguments. It
-returns an integer result that's truncated down when there would be
-fractional part. For example, \code{3/2} is 1, not 1.5, and
-\code{(-1)/2} is -1, not -0.5. This means that the results of divison
-can vary unexpectedly depending on the type of the two operands and
-because Python is dynamically typed, it can be difficult to determine
-the possible types of the operands.
-
-(The controversy is over whether this is \emph{really} a design flaw,
-and whether it's worth breaking existing code to fix this. It's
-caused endless discussions on python-dev and in July erupted into an
-storm of acidly sarcastic postings on \newsgroup{comp.lang.python}. I
-won't argue for either side here; read PEP 238 for a summary of
-arguments and counter-arguments.)
-
-Because this change might break code, it's being introduced very
-gradually. Python 2.2 begins the transition, but the switch won't be
-complete until Python 3.0.
-
-First, some terminology from PEP 238. ``True division'' is the
-division that most non-programmers are familiar with: 3/2 is 1.5, 1/4
-is 0.25, and so forth. ``Floor division'' is what Python's \code{/}
-operator currently does when given integer operands; the result is the
-floor of the value returned by true division. ``Classic division'' is
-the current mixed behaviour of \code{/}; it returns the result of
-floor division when the operands are integers, and returns the result
-of true division when one of the operands is a floating-point number.
-
-Here are the changes 2.2 introduces:
-
-\begin{itemize}
-
-\item A new operator, \code{//}, is the floor division operator.
-(Yes, we know it looks like \Cpp's comment symbol.) \code{//}
-\emph{always} returns the floor divison no matter what the types of
-its operands are, so \code{1 // 2} is 0 and \code{1.0 // 2.0} is also
-0.0.
-
-\code{//} is always available in Python 2.2; you don't need to enable
-it using a \code{__future__} statement.
-
-\item By including a \code{from __future__ import true_division} in a
-module, the \code{/} operator will be changed to return the result of
-true division, so \code{1/2} is 0.5. Without the \code{__future__}
-statement, \code{/} still means classic division. The default meaning
-of \code{/} will not change until Python 3.0.
-
-\item Classes can define methods called \method{__truediv__} and
-\method{__floordiv__} to overload the two division operators. At the
-C level, there are also slots in the \code{PyNumberMethods} structure
-so extension types can define the two operators.
-
-% XXX a warning someday?
-
-\end{itemize}
-
-\begin{seealso}
-
-\seepep{238}{Changing the Division Operator}{Written by Moshe Zadka and
-Guido van Rossum. Implemented by Guido van Rossum..}
-
-\end{seealso}
-
-
-%======================================================================
-\section{Unicode Changes}
-
-Python's Unicode support has been enhanced a bit in 2.2. Unicode
-strings are usually stored as UCS-2, as 16-bit unsigned integers.
-Python 2.2 can also be compiled to use UCS-4, 32-bit unsigned
-integers, as its internal encoding by supplying
-\longprogramopt{enable-unicode=ucs4} to the configure script. When
-built to use UCS-4 (a ``wide Python''), the interpreter can natively
-handle Unicode characters from U+000000 to U+110000, so the range of
-legal values for the \function{unichr()} function is expanded
-accordingly. Using an interpreter compiled to use UCS-2 (a ``narrow
-Python''), values greater than 65535 will still cause
-\function{unichr()} to raise a \exception{ValueError} exception.
-
-All this is the province of the still-unimplemented PEP 261, ``Support
-for `wide' Unicode characters''; consult it for further details, and
-please offer comments on the PEP and on your experiences with the
-2.2 alpha releases.
-% XXX update previous line once 2.2 reaches beta.
-
-Another change is much simpler to explain. Since their introduction,
-Unicode strings have supported an \method{encode()} method to convert
-the string to a selected encoding such as UTF-8 or Latin-1. A
-symmetric \method{decode(\optional{\var{encoding}})} method has been
-added to 8-bit strings (though not to Unicode strings) in 2.2.
-\method{decode()} assumes that the string is in the specified encoding
-and decodes it, returning whatever is returned by the codec.
-
-Using this new feature, codecs have been added for tasks not directly
-related to Unicode. For example, codecs have been added for
-uu-encoding, MIME's base64 encoding, and compression with the
-\module{zlib} module:
-
-\begin{verbatim}
->>> s = """Here is a lengthy piece of redundant, overly verbose,
-... and repetitive text.
-... """
->>> data = s.encode('zlib')
->>> data
-'x\x9c\r\xc9\xc1\r\x80 \x10\x04\xc0?Ul...'
->>> data.decode('zlib')
-'Here is a lengthy piece of redundant, overly verbose,\nand repetitive text.\n'
->>> print s.encode('uu')
-begin 666
-M2&5R92!I=F5R8F]S92P*86YD(')E<&5T:71I=F4@=&5X="X*
-
-end
->>> "sheesh".encode('rot-13')
-'furrfu'
-\end{verbatim}
-
-\method{encode()} and \method{decode()} were implemented by
-Marc-Andr\'e Lemburg. The changes to support using UCS-4 internally
-were implemented by Fredrik Lundh and Martin von L\"owis.
-
-\begin{seealso}
-
-\seepep{261}{Support for `wide' Unicode characters}{PEP written by
-Paul Prescod. Not yet accepted or fully implemented.}
-
-\end{seealso}
-
-%======================================================================
-\section{PEP 227: Nested Scopes}
-
-In Python 2.1, statically nested scopes were added as an optional
-feature, to be enabled by a \code{from __future__ import
-nested_scopes} directive. In 2.2 nested scopes no longer need to be
-specially enabled, but are always enabled. The rest of this section
-is a copy of the description of nested scopes from my ``What's New in
-Python 2.1'' document; if you read it when 2.1 came out, you can skip
-the rest of this section.
-
-The largest change introduced in Python 2.1, and made complete in 2.2,
-is to Python's scoping rules. In Python 2.0, at any given time there
-are at most three namespaces used to look up variable names: local,
-module-level, and the built-in namespace. This often surprised people
-because it didn't match their intuitive expectations. For example, a
-nested recursive function definition doesn't work:
-
-\begin{verbatim}
-def f():
- ...
- def g(value):
- ...
- return g(value-1) + 1
- ...
-\end{verbatim}
-
-The function \function{g()} will always raise a \exception{NameError}
-exception, because the binding of the name \samp{g} isn't in either
-its local namespace or in the module-level namespace. This isn't much
-of a problem in practice (how often do you recursively define interior
-functions like this?), but this also made using the \keyword{lambda}
-statement clumsier, and this was a problem in practice. In code which
-uses \keyword{lambda} you can often find local variables being copied
-by passing them as the default values of arguments.
-
-\begin{verbatim}
-def find(self, name):
- "Return list of any entries equal to 'name'"
- L = filter(lambda x, name=name: x == name,
- self.list_attribute)
- return L
-\end{verbatim}
-
-The readability of Python code written in a strongly functional style
-suffers greatly as a result.
-
-The most significant change to Python 2.2 is that static scoping has
-been added to the language to fix this problem. As a first effect,
-the \code{name=name} default argument is now unnecessary in the above
-example. Put simply, when a given variable name is not assigned a
-value within a function (by an assignment, or the \keyword{def},
-\keyword{class}, or \keyword{import} statements), references to the
-variable will be looked up in the local namespace of the enclosing
-scope. A more detailed explanation of the rules, and a dissection of
-the implementation, can be found in the PEP.
-
-This change may cause some compatibility problems for code where the
-same variable name is used both at the module level and as a local
-variable within a function that contains further function definitions.
-This seems rather unlikely though, since such code would have been
-pretty confusing to read in the first place.
-
-One side effect of the change is that the \code{from \var{module}
-import *} and \keyword{exec} statements have been made illegal inside
-a function scope under certain conditions. The Python reference
-manual has said all along that \code{from \var{module} import *} is
-only legal at the top level of a module, but the CPython interpreter
-has never enforced this before. As part of the implementation of
-nested scopes, the compiler which turns Python source into bytecodes
-has to generate different code to access variables in a containing
-scope. \code{from \var{module} import *} and \keyword{exec} make it
-impossible for the compiler to figure this out, because they add names
-to the local namespace that are unknowable at compile time.
-Therefore, if a function contains function definitions or
-\keyword{lambda} expressions with free variables, the compiler will
-flag this by raising a \exception{SyntaxError} exception.
-
-To make the preceding explanation a bit clearer, here's an example:
-
-\begin{verbatim}
-x = 1
-def f():
- # The next line is a syntax error
- exec 'x=2'
- def g():
- return x
-\end{verbatim}
-
-Line 4 containing the \keyword{exec} statement is a syntax error,
-since \keyword{exec} would define a new local variable named \samp{x}
-whose value should be accessed by \function{g()}.
-
-This shouldn't be much of a limitation, since \keyword{exec} is rarely
-used in most Python code (and when it is used, it's often a sign of a
-poor design anyway).
-
-\begin{seealso}
-
-\seepep{227}{Statically Nested Scopes}{Written and implemented by
-Jeremy Hylton.}
-
-\end{seealso}
-
-
-%======================================================================
-\section{New and Improved Modules}
-
-\begin{itemize}
-
- \item The \module{xmlrpclib} module was contributed to the standard
- library by Fredrik Lundh. It provides support for writing XML-RPC
- clients; XML-RPC is a simple remote procedure call protocol built on
- top of HTTP and XML. For example, the following snippet retrieves a
- list of RSS channels from the O'Reilly Network, and then retrieves a
- list of the recent headlines for one channel:
-
-\begin{verbatim}
-import xmlrpclib
-s = xmlrpclib.Server(
- 'http://www.oreillynet.com/meerkat/xml-rpc/server.php')
-channels = s.meerkat.getChannels()
-# channels is a list of dictionaries, like this:
-# [{'id': 4, 'title': 'Freshmeat Daily News'}
-# {'id': 190, 'title': '32Bits Online'},
-# {'id': 4549, 'title': '3DGamers'}, ... ]
-
-# Get the items for one channel
-items = s.meerkat.getItems( {'channel': 4} )
-
-# 'items' is another list of dictionaries, like this:
-# [{'link': 'http://freshmeat.net/releases/52719/',
-# 'description': 'A utility which converts HTML to XSL FO.',
-# 'title': 'html2fo 0.3 (Default)'}, ... ]
-\end{verbatim}
-
-See \url{http://www.xmlrpc.com/} for more information about XML-RPC.
-
- \item The \module{socket} module can be compiled to support IPv6;
- specify the \longprogramopt{enable-ipv6} option to Python's configure
- script. (Contributed by Jun-ichiro ``itojun'' Hagino.)
-
- \item Two new format characters were added to the \module{struct}
- module for 64-bit integers on platforms that support the C
- \ctype{long long} type. \samp{q} is for a signed 64-bit integer,
- and \samp{Q} is for an unsigned one. The value is returned in
- Python's long integer type. (Contributed by Tim Peters.)
-
- \item In the interpreter's interactive mode, there's a new built-in
- function \function{help()}, that uses the \module{pydoc} module
- introduced in Python 2.1 to provide interactive.
- \code{help(\var{object})} displays any available help text about
- \var{object}. \code{help()} with no argument puts you in an online
- help utility, where you can enter the names of functions, classes,
- or modules to read their help text.
- (Contributed by Guido van Rossum, using Ka-Ping Yee's \module{pydoc} module.)
-
- \item Various bugfixes and performance improvements have been made
- to the SRE engine underlying the \module{re} module. For example,
- \function{re.sub()} will now use \function{string.replace()}
- automatically when the pattern and its replacement are both just
- literal strings without regex metacharacters. Another contributed
- patch speeds up certain Unicode character ranges by a factor of
- two. (SRE is maintained by Fredrik Lundh. The BIGCHARSET patch was
- contributed by Martin von L\"owis.)
-
- \item The \module{imaplib} module, maintained by Piers Lauder, has
- support for several new extensions: the NAMESPACE extension defined
- in \rfc{2342}, SORT, GETACL and SETACL. (Contributed by Anthony
- Baxter and Michel Pelletier.)
-
- \item The \module{rfc822} module's parsing of email addresses is
- now compliant with \rfc{2822}, an update to \rfc{822}. The module's
- name is \emph{not} going to be changed to \samp{rfc2822}.
- (Contributed by Barry Warsaw.)
-
- \item New constants \constant{ascii_letters},
- \constant{ascii_lowercase}, and \constant{ascii_uppercase} were
- added to the \module{string} module. There were several modules in
- the standard library that used \constant{string.letters} to mean the
- ranges A-Za-z, but that assumption is incorrect when locales are in
- use, because \constant{string.letters} varies depending on the set
- of legal characters defined by the current locale. The buggy
- modules have all been fixed to use \constant{ascii_letters} instead.
- (Reported by an unknown person; fixed by Fred L. Drake, Jr.)
-
- \item The \module{mimetypes} module now makes it easier to use
- alternative MIME-type databases by the addition of a
- \class{MimeTypes} class, which takes a list of filenames to be
- parsed. (Contributed by Fred L. Drake, Jr.)
-
- \item XXX threading.Timer class
-
-\end{itemize}
-
-
-%======================================================================
-\section{Interpreter Changes and Fixes}
-
-Some of the changes only affect people who deal with the Python
-interpreter at the C level, writing Python extension modules,
-embedding the interpreter, or just hacking on the interpreter itself.
-If you only write Python code, none of the changes described here will
-affect you very much.
-
-\begin{itemize}
-
- \item Profiling and tracing functions can now be implemented in C,
- which can operate at much higher speeds than Python-based functions
- and should reduce the overhead of enabling profiling and tracing, so
- it will be of interest to authors of development environments for
- Python. Two new C functions were added to Python's API,
- \cfunction{PyEval_SetProfile()} and \cfunction{PyEval_SetTrace()}.
- The existing \function{sys.setprofile()} and
- \function{sys.settrace()} functions still exist, and have simply
- been changed to use the new C-level interface. (Contributed by Fred
- L. Drake, Jr.)
-
- \item Another low-level API, primarily of interest to implementors
- of Python debuggers and development tools, was added.
- \cfunction{PyInterpreterState_Head()} and
- \cfunction{PyInterpreterState_Next()} let a caller walk through all
- the existing interpreter objects;
- \cfunction{PyInterpreterState_ThreadHead()} and
- \cfunction{PyThreadState_Next()} allow looping over all the thread
- states for a given interpreter. (Contributed by David Beazley.)
-
- \item A new \samp{et} format sequence was added to
- \cfunction{PyArg_ParseTuple}; \samp{et} takes both a parameter and
- an encoding name, and converts the parameter to the given encoding
- if the parameter turns out to be a Unicode string, or leaves it
- alone if it's an 8-bit string, assuming it to already be in the
- desired encoding. This differs from the \samp{es} format character,
- which assumes that 8-bit strings are in Python's default ASCII
- encoding and converts them to the specified new encoding.
- (Contributed by M.-A. Lemburg, and used for the MBCS support on
- Windows described in the previous section.)
-
- \item Two new flags \constant{METH_NOARGS} and \constant{METH_O} are
- available in method definition tables to simplify implementation of
- methods with no arguments or a single untyped argument. Calling
- such methods is more efficient than calling a corresponding method
- that uses \constant{METH_VARARGS}.
- Also, the old \constant{METH_OLDARGS} style of writing C methods is
- now officially deprecated.
-
-\item
- Two new wrapper functions, \cfunction{PyOS_snprintf()} and
- \cfunction{PyOS_vsnprintf()} were added. which provide a
- cross-platform implementations for the relatively new
- \cfunction{snprintf()} and \cfunction{vsnprintf()} C lib APIs. In
- contrast to the standard \cfunction{sprintf()} and
- \cfunction{vsprintf()} functions, the Python versions check the
- bounds of the buffer used to protect against buffer overruns.
- (Contributed by M.-A. Lemburg.)
-
-\end{itemize}
-
-
-%======================================================================
-\section{Other Changes and Fixes}
-
-% XXX update the patch and bug figures as we go
-As usual there were a bunch of other improvements and bugfixes
-scattered throughout the source tree. A search through the CVS change
-logs finds there were 43 patches applied, and 77 bugs fixed; both
-figures are likely to be underestimates. Some of the more notable
-changes are:
-
-\begin{itemize}
-
- \item The code for the MacOS port for Python, maintained by Jack
- Jansen, is now kept in the main Python CVS tree, and many changes
- have been made to support MacOS X.
-
-The most significant change is the ability to build Python as a
-framework, enabled by supplying the \longprogramopt{enable-framework}
-option to the configure script when compiling Python. According to
-Jack Jansen, ``This installs a self-contained Python installation plus
-the OSX framework "glue" into
-\file{/Library/Frameworks/Python.framework} (or another location of
-choice). For now there is little immediate added benefit to this
-(actually, there is the disadvantage that you have to change your PATH
-to be able to find Python), but it is the basis for creating a
-full-blown Python application, porting the MacPython IDE, possibly
-using Python as a standard OSA scripting language and much more.''
-
-Most of the MacPython toolbox modules, which interface to MacOS APIs
-such as windowing, QuickTime, scripting, etc. have been ported to OS
-X, but they've been left commented out in setup.py. People who want
-to experiment with these modules can uncomment them manually.
-
-% Jack's original comments:
-%The main change is the possibility to build Python as a
-%framework. This installs a self-contained Python installation plus the
-%OSX framework "glue" into /Library/Frameworks/Python.framework (or
-%another location of choice). For now there is little immedeate added
-%benefit to this (actually, there is the disadvantage that you have to
-%change your PATH to be able to find Python), but it is the basis for
-%creating a fullblown Python application, porting the MacPython IDE,
-%possibly using Python as a standard OSA scripting language and much
-%more. You enable this with "configure --enable-framework".
-
-%The other change is that most MacPython toolbox modules, which
-%interface to all the MacOS APIs such as windowing, quicktime,
-%scripting, etc. have been ported. Again, most of these are not of
-%immedeate use, as they need a full application to be really useful, so
-%they have been commented out in setup.py. People wanting to experiment
-%can uncomment them. Gestalt and Internet Config modules are enabled by
-%default.
-
-
- \item Keyword arguments passed to builtin functions that don't take them
- now cause a \exception{TypeError} exception to be raised, with the
- message "\var{function} takes no keyword arguments".
-
- \item A new script, \file{Tools/scripts/cleanfuture.py} by Tim
- Peters, automatically removes obsolete \code{__future__} statements
- from Python source code.
-
- \item The new license introduced with Python 1.6 wasn't
- GPL-compatible. This is fixed by some minor textual changes to the
- 2.2 license, so Python can now be embedded inside a GPLed program
- again. The license changes were also applied to the Python 2.0.1
- and 2.1.1 releases.
-
- \item When presented with a Unicode filename on Windows, Python will
- now convert it to an MBCS encoded string, as used by the Microsoft
- file APIs. As MBCS is explicitly used by the file APIs, Python's
- choice of ASCII as the default encoding turns out to be an
- annoyance.
-
- (Contributed by Mark Hammond with assistance from Marc-Andr\'e
- Lemburg.)
-
- \item The \file{Tools/scripts/ftpmirror.py} script
- now parses a \file{.netrc} file, if you have one.
- (Contributed by Mike Romberg.)
-
- \item Some features of the object returned by the
- \function{xrange()} function are now deprecated, and trigger
- warnings when they're accessed; they'll disappear in Python 2.3.
- \class{xrange} objects tried to pretend they were full sequence
- types by supporting slicing, sequence multiplication, and the
- \keyword{in} operator, but these features were rarely used and
- therefore buggy. The \method{tolist()} method and the
- \member{start}, \member{stop}, and \member{step} attributes are also
- being deprecated. At the C level, the fourth argument to the
- \cfunction{PyRange_New()} function, \samp{repeat}, has also been
- deprecated.
-
- \item There were a bunch of patches to the dictionary
- implementation, mostly to fix potential core dumps if a dictionary
- contains objects that sneakily changed their hash value, or mutated
- the dictionary they were contained in. For a while python-dev fell
- into a gentle rhythm of Michael Hudson finding a case that dump
- core, Tim Peters fixing it, Michael finding another case, and round
- and round it went.
-
- \item On Windows, Python can now be compiled with Borland C thanks
- to a number of patches contributed by Stephen Hansen, though the
- result isn't fully functional yet. (But this \emph{is} progress...)
-
- \item Another Windows enhancement: Wise Solutions generously offered
- PythonLabs use of their InstallerMaster 8.1 system. Earlier
- PythonLabs Windows installers used Wise 5.0a, which was beginning to
- show its age. (Packaged up by Tim Peters.)
-
- \item Files ending in \samp{.pyw} can now be imported on Windows.
- \samp{.pyw} is a Windows-only thing, used to indicate that a script
- needs to be run using PYTHONW.EXE instead of PYTHON.EXE in order to
- prevent a DOS console from popping up to display the output. This
- patch makes it possible to import such scripts, in case they're also
- usable as modules. (Implemented by David Bolen.)
-
- \item On platforms where Python uses the C \cfunction{dlopen()} function
- to load extension modules, it's now possible to set the flags used
- by \cfunction{dlopen()} using the \function{sys.getdlopenflags()} and
- \function{sys.setdlopenflags()} functions. (Contributed by Bram Stolk.)
-
- \item XXX 3-argument float pow() is gone
-
-\end{itemize}
-
-
-%======================================================================
-\section{Acknowledgements}
-
-The author would like to thank the following people for offering
-suggestions and corrections to various drafts of this article: Fred
-Bremmer, Keith Briggs, Fred L. Drake, Jr., Carel Fellinger, Mark
-Hammond, Stephen Hansen, Jack Jansen, Marc-Andr\'e Lemburg, Tim Peters, Neil
-Schemenauer, Guido van Rossum.
-
-\end{document}
diff --git a/Lib/idlelib/AutoExpand.py b/Lib/idlelib/AutoExpand.py
deleted file mode 100644
index 09f34b38d9..0000000000
--- a/Lib/idlelib/AutoExpand.py
+++ /dev/null
@@ -1,91 +0,0 @@
-import string
-import re
-
-###$ event <>
-###$ win
-###$ unix
-
-class AutoExpand:
-
- keydefs = {
- '<>': [''],
- }
-
- unix_keydefs = {
- '<>': ['', ''],
- }
-
- menudefs = [
- ('edit', [
- ('E_xpand word', '<>'),
- ]),
- ]
-
- wordchars = string.letters + string.digits + "_"
-
- def __init__(self, editwin):
- self.text = editwin.text
- self.state = None
-
- def expand_word_event(self, event):
- curinsert = self.text.index("insert")
- curline = self.text.get("insert linestart", "insert lineend")
- if not self.state:
- words = self.getwords()
- index = 0
- else:
- words, index, insert, line = self.state
- if insert != curinsert or line != curline:
- words = self.getwords()
- index = 0
- if not words:
- self.text.bell()
- return "break"
- word = self.getprevword()
- self.text.delete("insert - %d chars" % len(word), "insert")
- newword = words[index]
- index = (index + 1) % len(words)
- if index == 0:
- self.text.bell() # Warn we cycled around
- self.text.insert("insert", newword)
- curinsert = self.text.index("insert")
- curline = self.text.get("insert linestart", "insert lineend")
- self.state = words, index, curinsert, curline
- return "break"
-
- def getwords(self):
- word = self.getprevword()
- if not word:
- return []
- before = self.text.get("1.0", "insert wordstart")
- wbefore = re.findall(r"\b" + word + r"\w+\b", before)
- del before
- after = self.text.get("insert wordend", "end")
- wafter = re.findall(r"\b" + word + r"\w+\b", after)
- del after
- if not wbefore and not wafter:
- return []
- words = []
- dict = {}
- # search backwards through words before
- wbefore.reverse()
- for w in wbefore:
- if dict.get(w):
- continue
- words.append(w)
- dict[w] = w
- # search onwards through words after
- for w in wafter:
- if dict.get(w):
- continue
- words.append(w)
- dict[w] = w
- words.append(word)
- return words
-
- def getprevword(self):
- line = self.text.get("insert linestart", "insert")
- i = len(line)
- while i > 0 and line[i-1] in self.wordchars:
- i = i-1
- return line[i:]
diff --git a/Lib/idlelib/AutoIndent.py b/Lib/idlelib/AutoIndent.py
deleted file mode 100644
index 6d38481a42..0000000000
--- a/Lib/idlelib/AutoIndent.py
+++ /dev/null
@@ -1,554 +0,0 @@
-import string
-#from Tkinter import TclError
-#import tkMessageBox
-#import tkSimpleDialog
-
-###$ event <>
-###$ win
-###$ win
-###$ unix
-###$ unix
-
-###$ event <>
-###$ win
-###$ unix
-###$ unix
-
-###$ event <>
-###$ win
-###$ unix
-###$ unix
-
-###$ event <>
-###$ win
-###$ unix
-
-###$ event <>
-###$ win
-###$ unix
-
-###$ event <>
-###$ win
-###$ unix
-
-###$ event <>
-###$ win
-###$ unix
-
-import PyParse
-
-class AutoIndent:
-
- menudefs = [
- ('format', [ # /s/edit/format dscherer@cmu.edu
- None,
- ('_Indent region', '<>'),
- ('_Dedent region', '<>'),
- ('Comment _out region', '<>'),
- ('U_ncomment region', '<>'),
- ('Tabify region', '<>'),
- ('Untabify region', '<>'),
- ('Toggle tabs', '<>'),
- ('New indent width', '<>'),
- ]),
- ]
-
- keydefs = {
- '<>': [''],
- '<>': ['', ''],
- '<>': ['']
- }
-
- windows_keydefs = {
- '<>': [''],
- '<>': ['', # dscherer@cmu.edu
- ''],
- '<>': [''],
- '<>': [''],
- '<>': [''],
- '<>': [''],
- '<>': [''],
- '<>': [''],
- }
-
- unix_keydefs = {
- '<>': ['',
- '',
- ''],
- '<>': ['',
- '',
- ''],
- '<>': ['', ''],
- '<>': ['', ''],
- '<>': ['', ''],
- '<>': ['', ''],
- '<>': [''],
- '<>': [''],
- }
-
- # usetabs true -> literal tab characters are used by indent and
- # dedent cmds, possibly mixed with spaces if
- # indentwidth is not a multiple of tabwidth
- # false -> tab characters are converted to spaces by indent
- # and dedent cmds, and ditto TAB keystrokes
- # indentwidth is the number of characters per logical indent level.
- # tabwidth is the display width of a literal tab character.
- # CAUTION: telling Tk to use anything other than its default
- # tab setting causes it to use an entirely different tabbing algorithm,
- # treating tab stops as fixed distances from the left margin.
- # Nobody expects this, so for now tabwidth should never be changed.
- usetabs = 1
- indentwidth = 4
- tabwidth = 8 # for IDLE use, must remain 8 until Tk is fixed
-
- # If context_use_ps1 is true, parsing searches back for a ps1 line;
- # else searches for a popular (if, def, ...) Python stmt.
- context_use_ps1 = 0
-
- # When searching backwards for a reliable place to begin parsing,
- # first start num_context_lines[0] lines back, then
- # num_context_lines[1] lines back if that didn't work, and so on.
- # The last value should be huge (larger than the # of lines in a
- # conceivable file).
- # Making the initial values larger slows things down more often.
- num_context_lines = 50, 500, 5000000
-
- def __init__(self, editwin):
- self.editwin = editwin
- self.text = editwin.text
-
- def config(self, **options):
- for key, value in options.items():
- if key == 'usetabs':
- self.usetabs = value
- elif key == 'indentwidth':
- self.indentwidth = value
- elif key == 'tabwidth':
- self.tabwidth = value
- elif key == 'context_use_ps1':
- self.context_use_ps1 = value
- else:
- raise KeyError, "bad option name: %s" % `key`
-
- # If ispythonsource and guess are true, guess a good value for
- # indentwidth based on file content (if possible), and if
- # indentwidth != tabwidth set usetabs false.
- # In any case, adjust the Text widget's view of what a tab
- # character means.
-
- def set_indentation_params(self, ispythonsource, guess=1):
- if guess and ispythonsource:
- i = self.guess_indent()
- if 2 <= i <= 8:
- self.indentwidth = i
- if self.indentwidth != self.tabwidth:
- self.usetabs = 0
-
- self.editwin.set_tabwidth(self.tabwidth)
-
- def smart_backspace_event(self, event):
- text = self.text
- first, last = self.editwin.get_selection_indices()
- if first and last:
- text.delete(first, last)
- text.mark_set("insert", first)
- return "break"
- # Delete whitespace left, until hitting a real char or closest
- # preceding virtual tab stop.
- chars = text.get("insert linestart", "insert")
- if chars == '':
- if text.compare("insert", ">", "1.0"):
- # easy: delete preceding newline
- text.delete("insert-1c")
- else:
- text.bell() # at start of buffer
- return "break"
- if chars[-1] not in " \t":
- # easy: delete preceding real char
- text.delete("insert-1c")
- return "break"
- # Ick. It may require *inserting* spaces if we back up over a
- # tab character! This is written to be clear, not fast.
- expand, tabwidth = string.expandtabs, self.tabwidth
- have = len(expand(chars, tabwidth))
- assert have > 0
- want = int((have - 1) / self.indentwidth) * self.indentwidth
- ncharsdeleted = 0
- while 1:
- chars = chars[:-1]
- ncharsdeleted = ncharsdeleted + 1
- have = len(expand(chars, tabwidth))
- if have <= want or chars[-1] not in " \t":
- break
- text.undo_block_start()
- text.delete("insert-%dc" % ncharsdeleted, "insert")
- if have < want:
- text.insert("insert", ' ' * (want - have))
- text.undo_block_stop()
- return "break"
-
- def smart_indent_event(self, event):
- # if intraline selection:
- # delete it
- # elif multiline selection:
- # do indent-region & return
- # indent one level
- text = self.text
- first, last = self.editwin.get_selection_indices()
- text.undo_block_start()
- try:
- if first and last:
- if index2line(first) != index2line(last):
- return self.indent_region_event(event)
- text.delete(first, last)
- text.mark_set("insert", first)
- prefix = text.get("insert linestart", "insert")
- raw, effective = classifyws(prefix, self.tabwidth)
- if raw == len(prefix):
- # only whitespace to the left
- self.reindent_to(effective + self.indentwidth)
- else:
- if self.usetabs:
- pad = '\t'
- else:
- effective = len(string.expandtabs(prefix,
- self.tabwidth))
- n = self.indentwidth
- pad = ' ' * (n - effective % n)
- text.insert("insert", pad)
- text.see("insert")
- return "break"
- finally:
- text.undo_block_stop()
-
- def newline_and_indent_event(self, event):
- text = self.text
- first, last = self.editwin.get_selection_indices()
- text.undo_block_start()
- try:
- if first and last:
- text.delete(first, last)
- text.mark_set("insert", first)
- line = text.get("insert linestart", "insert")
- i, n = 0, len(line)
- while i < n and line[i] in " \t":
- i = i+1
- if i == n:
- # the cursor is in or at leading indentation; just inject
- # an empty line at the start
- text.insert("insert linestart", '\n')
- return "break"
- indent = line[:i]
- # strip whitespace before insert point
- i = 0
- while line and line[-1] in " \t":
- line = line[:-1]
- i = i+1
- if i:
- text.delete("insert - %d chars" % i, "insert")
- # strip whitespace after insert point
- while text.get("insert") in " \t":
- text.delete("insert")
- # start new line
- text.insert("insert", '\n')
-
- # adjust indentation for continuations and block
- # open/close first need to find the last stmt
- lno = index2line(text.index('insert'))
- y = PyParse.Parser(self.indentwidth, self.tabwidth)
- for context in self.num_context_lines:
- startat = max(lno - context, 1)
- startatindex = `startat` + ".0"
- rawtext = text.get(startatindex, "insert")
- y.set_str(rawtext)
- bod = y.find_good_parse_start(
- self.context_use_ps1,
- self._build_char_in_string_func(startatindex))
- if bod is not None or startat == 1:
- break
- y.set_lo(bod or 0)
- c = y.get_continuation_type()
- if c != PyParse.C_NONE:
- # The current stmt hasn't ended yet.
- if c == PyParse.C_STRING:
- # inside a string; just mimic the current indent
- text.insert("insert", indent)
- elif c == PyParse.C_BRACKET:
- # line up with the first (if any) element of the
- # last open bracket structure; else indent one
- # level beyond the indent of the line with the
- # last open bracket
- self.reindent_to(y.compute_bracket_indent())
- elif c == PyParse.C_BACKSLASH:
- # if more than one line in this stmt already, just
- # mimic the current indent; else if initial line
- # has a start on an assignment stmt, indent to
- # beyond leftmost =; else to beyond first chunk of
- # non-whitespace on initial line
- if y.get_num_lines_in_stmt() > 1:
- text.insert("insert", indent)
- else:
- self.reindent_to(y.compute_backslash_indent())
- else:
- assert 0, "bogus continuation type " + `c`
- return "break"
-
- # This line starts a brand new stmt; indent relative to
- # indentation of initial line of closest preceding
- # interesting stmt.
- indent = y.get_base_indent_string()
- text.insert("insert", indent)
- if y.is_block_opener():
- self.smart_indent_event(event)
- elif indent and y.is_block_closer():
- self.smart_backspace_event(event)
- return "break"
- finally:
- text.see("insert")
- text.undo_block_stop()
-
- auto_indent = newline_and_indent_event
-
- # Our editwin provides a is_char_in_string function that works
- # with a Tk text index, but PyParse only knows about offsets into
- # a string. This builds a function for PyParse that accepts an
- # offset.
-
- def _build_char_in_string_func(self, startindex):
- def inner(offset, _startindex=startindex,
- _icis=self.editwin.is_char_in_string):
- return _icis(_startindex + "+%dc" % offset)
- return inner
-
- def indent_region_event(self, event):
- head, tail, chars, lines = self.get_region()
- for pos in range(len(lines)):
- line = lines[pos]
- if line:
- raw, effective = classifyws(line, self.tabwidth)
- effective = effective + self.indentwidth
- lines[pos] = self._make_blanks(effective) + line[raw:]
- self.set_region(head, tail, chars, lines)
- return "break"
-
- def dedent_region_event(self, event):
- head, tail, chars, lines = self.get_region()
- for pos in range(len(lines)):
- line = lines[pos]
- if line:
- raw, effective = classifyws(line, self.tabwidth)
- effective = max(effective - self.indentwidth, 0)
- lines[pos] = self._make_blanks(effective) + line[raw:]
- self.set_region(head, tail, chars, lines)
- return "break"
-
- def comment_region_event(self, event):
- head, tail, chars, lines = self.get_region()
- for pos in range(len(lines) - 1):
- line = lines[pos]
- lines[pos] = '##' + line
- self.set_region(head, tail, chars, lines)
-
- def uncomment_region_event(self, event):
- head, tail, chars, lines = self.get_region()
- for pos in range(len(lines)):
- line = lines[pos]
- if not line:
- continue
- if line[:2] == '##':
- line = line[2:]
- elif line[:1] == '#':
- line = line[1:]
- lines[pos] = line
- self.set_region(head, tail, chars, lines)
-
- def tabify_region_event(self, event):
- head, tail, chars, lines = self.get_region()
- tabwidth = self._asktabwidth()
- for pos in range(len(lines)):
- line = lines[pos]
- if line:
- raw, effective = classifyws(line, tabwidth)
- ntabs, nspaces = divmod(effective, tabwidth)
- lines[pos] = '\t' * ntabs + ' ' * nspaces + line[raw:]
- self.set_region(head, tail, chars, lines)
-
- def untabify_region_event(self, event):
- head, tail, chars, lines = self.get_region()
- tabwidth = self._asktabwidth()
- for pos in range(len(lines)):
- lines[pos] = string.expandtabs(lines[pos], tabwidth)
- self.set_region(head, tail, chars, lines)
-
- def toggle_tabs_event(self, event):
- if self.editwin.askyesno(
- "Toggle tabs",
- "Turn tabs " + ("on", "off")[self.usetabs] + "?",
- parent=self.text):
- self.usetabs = not self.usetabs
- return "break"
-
- # XXX this isn't bound to anything -- see class tabwidth comments
- def change_tabwidth_event(self, event):
- new = self._asktabwidth()
- if new != self.tabwidth:
- self.tabwidth = new
- self.set_indentation_params(0, guess=0)
- return "break"
-
- def change_indentwidth_event(self, event):
- new = self.editwin.askinteger(
- "Indent width",
- "New indent width (1-16)",
- parent=self.text,
- initialvalue=self.indentwidth,
- minvalue=1,
- maxvalue=16)
- if new and new != self.indentwidth:
- self.indentwidth = new
- return "break"
-
- def get_region(self):
- text = self.text
- first, last = self.editwin.get_selection_indices()
- if first and last:
- head = text.index(first + " linestart")
- tail = text.index(last + "-1c lineend +1c")
- else:
- head = text.index("insert linestart")
- tail = text.index("insert lineend +1c")
- chars = text.get(head, tail)
- lines = string.split(chars, "\n")
- return head, tail, chars, lines
-
- def set_region(self, head, tail, chars, lines):
- text = self.text
- newchars = string.join(lines, "\n")
- if newchars == chars:
- text.bell()
- return
- text.tag_remove("sel", "1.0", "end")
- text.mark_set("insert", head)
- text.undo_block_start()
- text.delete(head, tail)
- text.insert(head, newchars)
- text.undo_block_stop()
- text.tag_add("sel", head, "insert")
-
- # Make string that displays as n leading blanks.
-
- def _make_blanks(self, n):
- if self.usetabs:
- ntabs, nspaces = divmod(n, self.tabwidth)
- return '\t' * ntabs + ' ' * nspaces
- else:
- return ' ' * n
-
- # Delete from beginning of line to insert point, then reinsert
- # column logical (meaning use tabs if appropriate) spaces.
-
- def reindent_to(self, column):
- text = self.text
- text.undo_block_start()
- if text.compare("insert linestart", "!=", "insert"):
- text.delete("insert linestart", "insert")
- if column:
- text.insert("insert", self._make_blanks(column))
- text.undo_block_stop()
-
- def _asktabwidth(self):
- return self.editwin.askinteger(
- "Tab width",
- "Spaces per tab?",
- parent=self.text,
- initialvalue=self.tabwidth,
- minvalue=1,
- maxvalue=16) or self.tabwidth
-
- # Guess indentwidth from text content.
- # Return guessed indentwidth. This should not be believed unless
- # it's in a reasonable range (e.g., it will be 0 if no indented
- # blocks are found).
-
- def guess_indent(self):
- opener, indented = IndentSearcher(self.text, self.tabwidth).run()
- if opener and indented:
- raw, indentsmall = classifyws(opener, self.tabwidth)
- raw, indentlarge = classifyws(indented, self.tabwidth)
- else:
- indentsmall = indentlarge = 0
- return indentlarge - indentsmall
-
-# "line.col" -> line, as an int
-def index2line(index):
- return int(float(index))
-
-# Look at the leading whitespace in s.
-# Return pair (# of leading ws characters,
-# effective # of leading blanks after expanding
-# tabs to width tabwidth)
-
-def classifyws(s, tabwidth):
- raw = effective = 0
- for ch in s:
- if ch == ' ':
- raw = raw + 1
- effective = effective + 1
- elif ch == '\t':
- raw = raw + 1
- effective = (effective / tabwidth + 1) * tabwidth
- else:
- break
- return raw, effective
-
-import tokenize
-_tokenize = tokenize
-del tokenize
-
-class IndentSearcher:
-
- # .run() chews over the Text widget, looking for a block opener
- # and the stmt following it. Returns a pair,
- # (line containing block opener, line containing stmt)
- # Either or both may be None.
-
- def __init__(self, text, tabwidth):
- self.text = text
- self.tabwidth = tabwidth
- self.i = self.finished = 0
- self.blkopenline = self.indentedline = None
-
- def readline(self):
- if self.finished:
- return ""
- i = self.i = self.i + 1
- mark = `i` + ".0"
- if self.text.compare(mark, ">=", "end"):
- return ""
- return self.text.get(mark, mark + " lineend+1c")
-
- def tokeneater(self, type, token, start, end, line,
- INDENT=_tokenize.INDENT,
- NAME=_tokenize.NAME,
- OPENERS=('class', 'def', 'for', 'if', 'try', 'while')):
- if self.finished:
- pass
- elif type == NAME and token in OPENERS:
- self.blkopenline = line
- elif type == INDENT and self.blkopenline:
- self.indentedline = line
- self.finished = 1
-
- def run(self):
- save_tabsize = _tokenize.tabsize
- _tokenize.tabsize = self.tabwidth
- try:
- try:
- _tokenize.tokenize(self.readline, self.tokeneater)
- except _tokenize.TokenError:
- # since we cut off the tokenizer early, we can trigger
- # spurious errors
- pass
- finally:
- _tokenize.tabsize = save_tabsize
- return self.blkopenline, self.indentedline
diff --git a/Lib/idlelib/Bindings.py b/Lib/idlelib/Bindings.py
deleted file mode 100644
index 1bb926d47c..0000000000
--- a/Lib/idlelib/Bindings.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# This file defines the menu contents and key bindings. Note that
-# there is additional configuration information in the EditorWindow
-# class (and subclasses): the menus are created there based on the
-# menu_specs (class) variable, and menus not created are silently
-# skipped by the code here. This makes it possible to define the
-# Debug menu here, which is only present in the PythonShell window.
-
-# changes by dscherer@cmu.edu:
-# - Python shell moved to 'Run' menu
-# - "Help" renamed to "IDLE Help" to distinguish from Python help.
-# The distinction between the environment and the language is dim
-# or nonexistent in a novice's mind.
-# - Silly advice added
-
-import sys
-import string
-from keydefs import *
-
-menudefs = [
- # underscore prefixes character to underscore
- ('file', [
- ('_New window', '<>'),
- ('_Open...', '<>'),
- ('Open _module...', '<>'),
- ('Class _browser', '<>'),
- ('_Path browser', '<>'),
- None,
- ('_Save', '<>'),
- ('Save _As...', '<>'),
- ('Save Co_py As...', '<>'),
- None,
- ('_Close', '<>'),
- ('E_xit', '<>'),
- ]),
- ('edit', [
- ('_Undo', '<>'),
- ('_Redo', '<>'),
- None,
- ('Cu_t', '<>'),
- ('_Copy', '<>'),
- ('_Paste', '<>'),
- ('Select _All', '<>'),
- ]),
- ('run',[
- ('Python shell', '<>'),
- ]),
- ('debug', [
- ('_Go to file/line', '<>'),
- ('_Stack viewer', '<>'),
- ('!_Debugger', '<>'),
- ('!_Auto-open stack viewer', '<>' ),
- ]),
- ('help', [
- ('_IDLE Help...', '<>'),
- ('Python _Documentation...', '<>'),
- ('_Advice...', '<>'),
- ('View IDLE _Readme...', '<>'),
- None,
- ('_About IDLE...', '<>'),
- ]),
-]
-
-if sys.platform == 'win32':
- default_keydefs = windows_keydefs
-else:
- default_keydefs = unix_keydefs
-
-del sys
diff --git a/Lib/idlelib/CREDITS.txt b/Lib/idlelib/CREDITS.txt
deleted file mode 100644
index 30c2073f0f..0000000000
--- a/Lib/idlelib/CREDITS.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-IDLEfork Credits
-==================
-
-Guido van Rossum, as well as being the creator of the Python language, was
-the original creator of IDLE. His great work continues as both a contributor
-to, and 'benevolent dictator for life' of Python and IDLE/IDLEfork.
-
-The main developers who have been so far active on IDLEfork version 0.8.1
-and greater are, Guido van Rossum, Stephen M. Gava and Kurt B. Kaiser.
-
-The IDLE fork project was initiated and brought up to version 0.7.1 by
-David Scherer, Peter Schneider-Kamp and Nicholas Riley.
-
-There are doubtless others who should be included here, especially those
-who may have contributed to IDLE versions prior ot 0.8. Please contact
-the IDLEfork coordinator to have yourself included here if you are one of
-those I have missed! (contact details at http://idlefork.sourceforge.net)
diff --git a/Lib/idlelib/CallTipWindow.py b/Lib/idlelib/CallTipWindow.py
deleted file mode 100644
index d253fa5969..0000000000
--- a/Lib/idlelib/CallTipWindow.py
+++ /dev/null
@@ -1,71 +0,0 @@
-# A CallTip window class for Tkinter/IDLE.
-# After ToolTip.py, which uses ideas gleaned from PySol
-
-# Used by the CallTips IDLE extension.
-import os
-from Tkinter import *
-
-class CallTip:
-
- def __init__(self, widget):
- self.widget = widget
- self.tipwindow = None
- self.id = None
- self.x = self.y = 0
-
- def showtip(self, text):
- self.text = text
- if self.tipwindow or not self.text:
- return
- self.widget.see("insert")
- x, y, cx, cy = self.widget.bbox("insert")
- x = x + self.widget.winfo_rootx() + 2
- y = y + cy + self.widget.winfo_rooty()
- self.tipwindow = tw = Toplevel(self.widget)
- tw.wm_overrideredirect(1)
- tw.wm_geometry("+%d+%d" % (x, y))
- label = Label(tw, text=self.text, justify=LEFT,
- background="#ffffe0", relief=SOLID, borderwidth=1,
- font = self.widget['font'])
- label.pack()
-
- def hidetip(self):
- tw = self.tipwindow
- self.tipwindow = None
- if tw:
- tw.destroy()
-
-
-###############################
-#
-# Test Code
-#
-class container: # Conceptually an editor_window
- def __init__(self):
- root = Tk()
- text = self.text = Text(root)
- text.pack(side=LEFT, fill=BOTH, expand=1)
- text.insert("insert", "string.split")
- root.update()
- self.calltip = CallTip(text)
-
- text.event_add("<>", "(")
- text.event_add("<>", ")")
- text.bind("<>", self.calltip_show)
- text.bind("<>", self.calltip_hide)
-
- text.focus_set()
- # root.mainloop() # not in idle
-
- def calltip_show(self, event):
- self.calltip.showtip("Hello world")
-
- def calltip_hide(self, event):
- self.calltip.hidetip()
-
-def main():
- # Test code
- c=container()
-
-if __name__=='__main__':
- main()
diff --git a/Lib/idlelib/CallTips.py b/Lib/idlelib/CallTips.py
deleted file mode 100644
index 7c5f41c73d..0000000000
--- a/Lib/idlelib/CallTips.py
+++ /dev/null
@@ -1,190 +0,0 @@
-# CallTips.py - An IDLE extension that provides "Call Tips" - ie, a floating window that
-# displays parameter information as you open parens.
-
-import string
-import sys
-import types
-
-class CallTips:
-
- menudefs = [
- ]
-
- keydefs = {
- '<>': [''],
- '<>': [''],
- '<>': [''],
- '<>': ['', ''],
- }
-
- windows_keydefs = {
- }
-
- unix_keydefs = {
- }
-
- def __init__(self, editwin):
- self.editwin = editwin
- self.text = editwin.text
- self.calltip = None
- if hasattr(self.text, "make_calltip_window"):
- self._make_calltip_window = self.text.make_calltip_window
- else:
- self._make_calltip_window = self._make_tk_calltip_window
-
- def close(self):
- self._make_calltip_window = None
-
- # Makes a Tk based calltip window. Used by IDLE, but not Pythonwin.
- # See __init__ above for how this is used.
- def _make_tk_calltip_window(self):
- import CallTipWindow
- return CallTipWindow.CallTip(self.text)
-
- def _remove_calltip_window(self):
- if self.calltip:
- self.calltip.hidetip()
- self.calltip = None
-
- def paren_open_event(self, event):
- self._remove_calltip_window()
- arg_text = get_arg_text(self.get_object_at_cursor())
- if arg_text:
- self.calltip_start = self.text.index("insert")
- self.calltip = self._make_calltip_window()
- self.calltip.showtip(arg_text)
- return "" #so the event is handled normally.
-
- def paren_close_event(self, event):
- # Now just hides, but later we should check if other
- # paren'd expressions remain open.
- self._remove_calltip_window()
- return "" #so the event is handled normally.
-
- def check_calltip_cancel_event(self, event):
- if self.calltip:
- # If we have moved before the start of the calltip,
- # or off the calltip line, then cancel the tip.
- # (Later need to be smarter about multi-line, etc)
- if self.text.compare("insert", "<=", self.calltip_start) or \
- self.text.compare("insert", ">", self.calltip_start + " lineend"):
- self._remove_calltip_window()
- return "" #so the event is handled normally.
-
- def calltip_cancel_event(self, event):
- self._remove_calltip_window()
- return "" #so the event is handled normally.
-
- def get_object_at_cursor(self,
- wordchars="._" + string.uppercase + string.lowercase + string.digits):
- # XXX - This needs to be moved to a better place
- # so the "." attribute lookup code can also use it.
- text = self.text
- chars = text.get("insert linestart", "insert")
- i = len(chars)
- while i and chars[i-1] in wordchars:
- i = i-1
- word = chars[i:]
- if word:
- # How is this for a hack!
- import sys, __main__
- namespace = sys.modules.copy()
- namespace.update(__main__.__dict__)
- try:
- return eval(word, namespace)
- except:
- pass
- return None # Can't find an object.
-
-def _find_constructor(class_ob):
- # Given a class object, return a function object used for the
- # constructor (ie, __init__() ) or None if we can't find one.
- try:
- return class_ob.__init__.im_func
- except AttributeError:
- for base in class_ob.__bases__:
- rc = _find_constructor(base)
- if rc is not None: return rc
- return None
-
-def get_arg_text(ob):
- # Get a string describing the arguments for the given object.
- argText = ""
- if ob is not None:
- argOffset = 0
- if type(ob)==types.ClassType:
- # Look for the highest __init__ in the class chain.
- fob = _find_constructor(ob)
- if fob is None:
- fob = lambda: None
- else:
- argOffset = 1
- elif type(ob)==types.MethodType:
- # bit of a hack for methods - turn it into a function
- # but we drop the "self" param.
- fob = ob.im_func
- argOffset = 1
- else:
- fob = ob
- # Try and build one for Python defined functions
- if type(fob) in [types.FunctionType, types.LambdaType]:
- try:
- realArgs = fob.func_code.co_varnames[argOffset:fob.func_code.co_argcount]
- defaults = fob.func_defaults or []
- defaults = list(map(lambda name: "=%s" % name, defaults))
- defaults = [""] * (len(realArgs)-len(defaults)) + defaults
- items = map(lambda arg, dflt: arg+dflt, realArgs, defaults)
- if fob.func_code.co_flags & 0x4:
- items.append("...")
- if fob.func_code.co_flags & 0x8:
- items.append("***")
- argText = string.join(items , ", ")
- argText = "(%s)" % argText
- except:
- pass
- # See if we can use the docstring
- if hasattr(ob, "__doc__") and ob.__doc__:
- pos = string.find(ob.__doc__, "\n")
- if pos<0 or pos>70: pos=70
- if argText: argText = argText + "\n"
- argText = argText + ob.__doc__[:pos]
-
- return argText
-
-#################################################
-#
-# Test code
-#
-if __name__=='__main__':
-
- def t1(): "()"
- def t2(a, b=None): "(a, b=None)"
- def t3(a, *args): "(a, ...)"
- def t4(*args): "(...)"
- def t5(a, *args): "(a, ...)"
- def t6(a, b=None, *args, **kw): "(a, b=None, ..., ***)"
-
- class TC:
- "(a=None, ...)"
- def __init__(self, a=None, *b): "(a=None, ...)"
- def t1(self): "()"
- def t2(self, a, b=None): "(a, b=None)"
- def t3(self, a, *args): "(a, ...)"
- def t4(self, *args): "(...)"
- def t5(self, a, *args): "(a, ...)"
- def t6(self, a, b=None, *args, **kw): "(a, b=None, ..., ***)"
-
- def test( tests ):
- failed=[]
- for t in tests:
- expected = t.__doc__ + "\n" + t.__doc__
- if get_arg_text(t) != expected:
- failed.append(t)
- print "%s - expected %s, but got %s" % (t, `expected`, `get_arg_text(t)`)
- print "%d of %d tests failed" % (len(failed), len(tests))
-
- tc = TC()
- tests = t1, t2, t3, t4, t5, t6, \
- TC, tc.t1, tc.t2, tc.t3, tc.t4, tc.t5, tc.t6
-
- test(tests)
diff --git a/Lib/idlelib/ChangeLog b/Lib/idlelib/ChangeLog
deleted file mode 100644
index 8991427365..0000000000
--- a/Lib/idlelib/ChangeLog
+++ /dev/null
@@ -1,1587 +0,0 @@
-IDLEfork ChangeLog
-==================
-
-2001-07-20 11:35 elguavas
-
- * README.txt, NEWS.txt: bring up to date for 0.8.1 release
-
-2001-07-19 16:40 elguavas
-
- * IDLEFORK.html: replaced by IDLEFORK-index.html
-
-2001-07-19 16:39 elguavas
-
- * IDLEFORK-index.html: updated placeholder idlefork homepage
-
-2001-07-19 14:49 elguavas
-
- * ChangeLog, EditorWindow.py, INSTALLATION, NEWS.txt, README.txt,
- TODO.txt, idlever.py:
- minor tidy-ups ready for 0.8.1 alpha tarball release
-
-2001-07-17 15:12 kbk
-
- * INSTALLATION, setup.py: INSTALLATION: Remove the coexist.patch
- instructions
-
- **************** setup.py:
-
- Remove the idles script, add some words on IDLE Fork to the
- long_description, and clean up some line spacing.
-
-2001-07-17 15:01 kbk
-
- * coexist.patch: Put this in the attic, at least for now...
-
-2001-07-17 14:59 kbk
-
- * PyShell.py, idle, idles: Implement idle command interface as
- suggested by GvR [idle-dev] 16 July **************** PyShell: Added
- functionality:
-
- usage: idle.py [-c command] [-d] [-i] [-r script] [-s] [-t title]
- [arg] ...
-
- idle file(s) (without options) edit the file(s)
-
- -c cmd run the command in a shell -d enable the
- debugger -i open an interactive shell -i file(s) open a
- shell and also an editor window for each file -r script run a file
- as a script in a shell -s run $IDLESTARTUP or
- $PYTHONSTARTUP before anything else -t title set title of shell
- window
-
- Remaining arguments are applied to the command (-c) or script (-r).
-
- ****************** idles: Removed the idles script, not needed
-
- ****************** idle: Removed the IdleConf references, not
- required anymore
-
-2001-07-16 17:08 kbk
-
- * INSTALLATION, coexist.patch: Added installation instructions.
-
- Added a patch which modifies idlefork so that it can co-exist with
- "official" IDLE in the site-packages directory. This patch is not
- necessary if only idlefork IDLE is installed. See INSTALLATION for
- further details.
-
-2001-07-16 15:50 kbk
-
- * idles: Add a script "idles" which opens a Python Shell window.
-
- The default behaviour of idlefork idle is to open an editor window
- instead of a shell. Complex expressions may be run in a fresh
- environment by selecting "run". There are times, however, when a
- shell is desired. Though one can be started by "idle -t 'foo'",
- this script is more convenient. In addition, a shell and an editor
- window can be started in parallel by "idles -e foo.py".
-
-2001-07-16 15:25 kbk
-
- * PyShell.py: Call out IDLE Fork in startup message.
-
-2001-07-16 14:00 kbk
-
- * PyShell.py, setup.py: Add a script "idles" which opens a Python
- Shell window.
-
- The default behaviour of idlefork idle is to open an editor window
- instead of a shell. Complex expressions may be run in a fresh
- environment by selecting "run". There are times, however, when a
- shell is desired. Though one can be started by "idle -t 'foo'",
- this script is more convenient. In addition, a shell and an editor
- window can be started in parallel by "idles -e foo.py".
-
-2001-07-15 03:06 kbk
-
- * pyclbr.py, tabnanny.py: tabnanny and pyclbr are now found in /Lib
-
-2001-07-15 02:29 kbk
-
- * BrowserControl.py: Remove, was retained for 1.5.2 support
-
-2001-07-14 15:48 kbk
-
- * setup.py: Installing Idle to site-packages via Distutils does not
- copy the Idle help.txt file.
-
- Ref SF Python Patch 422471
-
-2001-07-14 15:26 kbk
-
- * keydefs.py: py-cvs-2001_07_13 (Rev 1.3) merge
-
- "Make copy, cut and paste events case insensitive. Reported by
- Patrick K. O'Brien on idle-dev. (Should other bindings follow
- suit?)" --GvR
-
-2001-07-14 15:21 kbk
-
- * idle.py: py-cvs-2001_07_13 (Rev 1.4) merge
-
- "Move the action of loading the configuration to the IdleConf
- module rather than the idle.py script. This has advantages and
- disadvantages; the biggest advantage being that we can more easily
- have an alternative main program." --GvR
-
-2001-07-14 15:18 kbk
-
- * extend.txt: py-cvs-2001_07_13 (Rev 1.4) merge
-
- "Quick update to the extension mechanism (extend.py is gone, long
- live config.txt)" --GvR
-
-2001-07-14 15:15 kbk
-
- * StackViewer.py: py-cvs-2001_07_13 (Rev 1.16) merge
-
- "Refactored, with some future plans in mind. This now uses the new
- gotofileline() method defined in FileList.py" --GvR
-
-2001-07-14 15:10 kbk
-
- * PyShell.py: py-cvs-2001_07_13 (Rev 1.34) merge
-
- "Amazing. A very subtle change in policy in descr-branch actually
- found a bug here. Here's the deal: Class PyShell derives from
- class OutputWindow. Method PyShell.close() wants to invoke its
- parent method, but because PyShell long ago was inherited from
- class PyShellEditorWindow, it invokes
- PyShelEditorWindow.close(self). Now, class PyShellEditorWindow
- itself derives from class OutputWindow, and inherits the close()
- method from there without overriding it. Under the old rules,
- PyShellEditorWindow.close would return an unbound method restricted
- to the class that defined the implementation of close(), which was
- OutputWindow.close. Under the new rules, the unbound method is
- restricted to the class whose method was requested, that is
- PyShellEditorWindow, and this was correctly trapped as an error."
- --GvR
-
-2001-07-14 14:59 kbk
-
- * PyParse.py: py-cvs-2001_07_13 (Rel 1.9) merge
-
- "Taught IDLE's autoident parser that "yield" is a keyword that
- begins a stmt. Along w/ the preceding change to keyword.py, making
- all this work w/ a future-stmt just looks harder and harder."
- --tim_one
-
- (From Rel 1.8: "Hack to make this still work with Python 1.5.2.
- ;-( " --fdrake)
-
-2001-07-14 14:51 kbk
-
- * IdleConf.py: py-cvs-2001_07_13 (Rel 1.7) merge
-
- "Move the action of loading the configuration to the IdleConf
- module rather than the idle.py script. This has advantages and
- disadvantages; the biggest advantage being that we can more easily
- have an alternative main program." --GvR
-
-2001-07-14 14:45 kbk
-
- * FileList.py: py-cvs-2000_07_13 (Rev 1.9) merge
-
- "Delete goodname() method, which is unused. Add gotofileline(), a
- convenience method which I intend to use in a variant. Rename
- test() to _test()." --GvR
-
- This was an interesting merge. The join completely missed removing
- goodname(), which was adjacent, but outside of, a small conflict.
- I only caught it by comparing the 1.1.3.2/1.1.3.3 diff. CVS ain't
- infallible.
-
-2001-07-14 13:58 kbk
-
- * EditorWindow.py: py-cvs-2000_07_13 (Rev 1.38) merge "Remove
- legacy support for the BrowserControl module; the webbrowser module
- has been included since Python 2.0, and that is the preferred
- interface." --fdrake
-
-2001-07-14 13:32 kbk
-
- * EditorWindow.py, FileList.py, IdleConf.py, PyParse.py,
- PyShell.py, StackViewer.py, extend.txt, idle.py, keydefs.py: Import
- the 2001 July 13 23:59 GMT version of Python CVS IDLE on the
- existing 1.1.3 vendor branch named py-cvs-vendor-branch. Release
- tag is py-cvs-2001_07_13.
-
-2001-07-14 12:02 kbk
-
- * Icons/python.gif: py-cvs-rel2_1 (Rev 1.2) merge Copied py-cvs rev
- 1.2 changed file to idlefork MAIN
-
-2001-07-14 11:58 kbk
-
- * Icons/minusnode.gif: py-cvs-rel2_1 (Rev 1.2) merge Copied py-cvs
- 1.2 changed file to idlefork MAIN
-
-2001-07-14 11:23 kbk
-
- * ScrolledList.py: py-cvs-rel2_1 (rev 1.5) merge - whitespace
- normalization
-
-2001-07-14 11:20 kbk
-
- * Separator.py: py-cvs-rel2_1 (Rev 1.3) merge - whitespace
- normalization
-
-2001-07-14 11:16 kbk
-
- * StackViewer.py: py-cvs-rel2_1 (Rev 1.15) merge - whitespace
- normalization
-
-2001-07-14 11:14 kbk
-
- * ToolTip.py: py-cvs-rel2_1 (Rev 1.2) merge - whitespace
- normalization
-
-2001-07-14 10:13 kbk
-
- * PyShell.py: cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
-
- Merged the following py-cvs revs without conflict: 1.29 Reduce
- copyright text output at startup 1.30 Delay setting sys.args until
- Tkinter is fully initialized 1.31 Whitespace normalization 1.32
- Turn syntax warning into error when interactive 1.33 Fix warning
- initialization bug
-
- Note that module is extensively modified wrt py-cvs
-
-2001-07-14 06:33 kbk
-
- * PyParse.py: py-cvs-rel2_1 (Rev 1.6 - 1.8) merge Fix autoindent
- bug and deflect Unicode from text.get()
-
-2001-07-14 06:00 kbk
-
- * Percolator.py: py-cvs-rel2_1 (Rev 1.3) "move "from Tkinter import
- *" to module level" --jhylton
-
-2001-07-14 05:57 kbk
-
- * PathBrowser.py: py-cvs-rel2_1 (Rev 1.6) merge - whitespace
- normalization
-
-2001-07-14 05:49 kbk
-
- * ParenMatch.py: cvs-py-rel2_1 (Rev 1.5) merge - whitespace
- normalization
-
-2001-07-14 03:57 kbk
-
- * ObjectBrowser.py: py-cvs-rel2_1 (Rev 1.3) merge "Make the test
- program work outside IDLE." -- GvR
-
-2001-07-14 03:52 kbk
-
- * MultiStatusBar.py: py-cvs-rel2_1 (Rev 1.2) merge - whitespace
- normalization
-
-2001-07-14 03:44 kbk
-
- * MultiScrolledLists.py: py-cvs-rel2_1 (Rev 1.2) merge - whitespace
- normalization
-
-2001-07-14 03:40 kbk
-
- * IdleHistory.py: py-cvs-rel2_1 (Rev 1.4) merge - whitespace
- normalization
-
-2001-07-14 03:38 kbk
-
- * IdleConf.py: py-cvs-rel2_1 (Rev 1.6) merge - whitespace
- normalization
-
-2001-07-13 14:18 kbk
-
- * IOBinding.py: py-cvs-rel2_1 (Rev 1.4) merge - move "import *" to
- module level
-
-2001-07-13 14:12 kbk
-
- * FormatParagraph.py: py-cvs-rel2_1 (Rev 1.9) merge - whitespace
- normalization
-
-2001-07-13 14:07 kbk
-
- * FileList.py: py-cvs-rel2_1 (Rev 1.8) merge - whitespace
- normalization
-
-2001-07-13 13:35 kbk
-
- * EditorWindow.py: py-cvs-rel2_1 (Rev 1.33 - 1.37) merge
-
- VP IDLE version depended on VP's ExecBinding.py and spawn.py to get
- the path to the Windows Doc directory (relative to python.exe).
- Removed this conflicting code in favor of py-cvs updates which on
- Windows use a hard coded path relative to the location of this
- module. py-cvs updates include support for webbrowser.py. Module
- still has BrowserControl.py for 1.5.2 support.
-
- At this point, the differences wrt py-cvs relate to menu
- functionality.
-
-2001-07-13 11:30 kbk
-
- * ConfigParser.py: py-cvs-rel2_1 merge - Remove, lives in /Lib
-
-2001-07-13 10:10 kbk
-
- * Delegator.py: py-cvs-rel2_1 (Rev 1.3) merge - whitespace
- normalization
-
-2001-07-13 10:07 kbk
-
- * Debugger.py: py-cvs-rel2_1 (Rev 1.15) merge - whitespace
- normalization
-
-2001-07-13 10:04 kbk
-
- * ColorDelegator.py: py-cvs-rel2_1 (Rev 1.11 and 1.12) merge
- Colorize "as" after "import" / use DEBUG instead of __debug__
-
-2001-07-13 09:54 kbk
-
- * ClassBrowser.py: py-cvs-rel2_1 (Rev 1.12) merge - whitespace
- normalization
-
-2001-07-13 09:41 kbk
-
- * BrowserControl.py: py-cvs-rel2_1 (Rev 1.1) merge - New File -
- Force HEAD to trunk with -f Note: browser.py was renamed
- BrowserControl.py 10 May 2000. It provides a collection of classes
- and convenience functions to control external browsers "for 1.5.2
- support". It was removed from py-cvs 18 April 2001.
-
-2001-07-13 09:10 kbk
-
- * CallTips.py: py-cvs-rel2_1 (Rev 1.8) merge - whitespace
- normalization
-
-2001-07-13 08:26 kbk
-
- * CallTipWindow.py: py-cvs-rel2_1 (Rev 1.3) merge - whitespace
- normalization
-
-2001-07-13 08:13 kbk
-
- * AutoExpand.py: py-cvs-rel1_2 (Rev 1.4) merge, "Add Alt-slash to
- Unix keydefs (I somehow need it on RH 6.2). Get rid of assignment
- to unused self.text.wordlist." --GvR
-
-2001-07-12 16:54 elguavas
-
- * ReplaceDialog.py: py-cvs merge, python 1.5.2 compatability
-
-2001-07-12 16:46 elguavas
-
- * ScriptBinding.py: py-cvs merge, better error dialog
-
-2001-07-12 16:38 elguavas
-
- * TODO.txt: py-cvs merge, additions
-
-2001-07-12 15:35 elguavas
-
- * WindowList.py: py-cvs merge, correct indentation
-
-2001-07-12 15:24 elguavas
-
- * config.txt: py-cvs merge, correct typo
-
-2001-07-12 15:21 elguavas
-
- * help.txt: py-cvs merge, update colour changing info
-
-2001-07-12 14:51 elguavas
-
- * idle.py: py-cvs merge, idle_dir loading changed
-
-2001-07-12 14:44 elguavas
-
- * idlever.py: py-cvs merge, version update
-
-2001-07-11 12:53 kbk
-
- * BrowserControl.py: Initial revision
-
-2001-07-11 12:53 kbk
-
- * AutoExpand.py, BrowserControl.py, CallTipWindow.py, CallTips.py,
- ClassBrowser.py, ColorDelegator.py, Debugger.py, Delegator.py,
- EditorWindow.py, FileList.py, FormatParagraph.py, IOBinding.py,
- IdleConf.py, IdleHistory.py, MultiScrolledLists.py,
- MultiStatusBar.py, ObjectBrowser.py, OutputWindow.py,
- ParenMatch.py, PathBrowser.py, Percolator.py, PyParse.py,
- PyShell.py, RemoteInterp.py, ReplaceDialog.py, ScriptBinding.py,
- ScrolledList.py, Separator.py, StackViewer.py, TODO.txt,
- ToolTip.py, WindowList.py, config.txt, help.txt, idle, idle.bat,
- idle.py, idlever.py, setup.py, Icons/minusnode.gif,
- Icons/python.gif: Import the release 2.1 version of Python CVS IDLE
- on the existing 1.1.3 vendor branch named py-cvs-vendor-branch,
- with release tag py-cvs-rel2_1.
-
-2001-07-11 12:34 kbk
-
- * AutoExpand.py, AutoIndent.py, Bindings.py, CallTipWindow.py,
- CallTips.py, ChangeLog, ClassBrowser.py, ColorDelegator.py,
- Debugger.py, Delegator.py, EditorWindow.py, FileList.py,
- FormatParagraph.py, FrameViewer.py, GrepDialog.py, IOBinding.py,
- IdleConf.py, IdleHistory.py, MultiScrolledLists.py,
- MultiStatusBar.py, NEWS.txt, ObjectBrowser.py, OldStackViewer.py,
- OutputWindow.py, ParenMatch.py, PathBrowser.py, Percolator.py,
- PyParse.py, PyShell.py, README.txt, RemoteInterp.py,
- ReplaceDialog.py, ScriptBinding.py, ScrolledList.py,
- SearchBinding.py, SearchDialog.py, SearchDialogBase.py,
- SearchEngine.py, Separator.py, StackViewer.py, TODO.txt,
- ToolTip.py, TreeWidget.py, UndoDelegator.py, WidgetRedirector.py,
- WindowList.py, ZoomHeight.py, __init__.py, config-unix.txt,
- config-win.txt, config.txt, eventparse.py, extend.txt, help.txt,
- idle.bat, idle.py, idle.pyw, idlever.py, keydefs.py, pyclbr.py,
- tabnanny.py, testcode.py, Icons/folder.gif, Icons/minusnode.gif,
- Icons/openfolder.gif, Icons/plusnode.gif, Icons/python.gif,
- Icons/tk.gif: Import the 9 March 2000 version of Python CVS IDLE as
- 1.1.3 vendor branch named py-cvs-vendor-branch.
-
-2001-07-04 13:43 kbk
-
- * Icons/: folder.gif, minusnode.gif, openfolder.gif, plusnode.gif,
- python.gif, tk.gif: Null commit with -f option to force an uprev
- and put HEADs firmly on the trunk.
-
-2001-07-04 13:15 kbk
-
- * AutoExpand.py, AutoIndent.py, Bindings.py, CallTipWindow.py,
- CallTips.py, ChangeLog, ClassBrowser.py, ColorDelegator.py,
- ConfigParser.py, Debugger.py, Delegator.py, EditorWindow.py,
- ExecBinding.py, FileList.py, FormatParagraph.py, FrameViewer.py,
- GrepDialog.py, IDLEFORK.html, IOBinding.py, IdleConf.py,
- IdleHistory.py, MultiScrolledLists.py, MultiStatusBar.py, NEWS.txt,
- ObjectBrowser.py, OldStackViewer.py, OutputWindow.py,
- ParenMatch.py, PathBrowser.py, Percolator.py, PyParse.py,
- PyShell.py, README.txt, Remote.py, RemoteInterp.py,
- ReplaceDialog.py, ScriptBinding.py, ScrolledList.py,
- SearchBinding.py, SearchDialog.py, SearchDialogBase.py,
- SearchEngine.py, Separator.py, StackViewer.py, TODO.txt,
- ToolTip.py, TreeWidget.py, UndoDelegator.py, WidgetRedirector.py,
- WindowList.py, ZoomHeight.py, __init__.py, config-unix.txt,
- config-win.txt, config.txt, eventparse.py, extend.txt, help.txt,
- idle, idle.bat, idle.py, idle.pyw, idlever.py, keydefs.py,
- loader.py, protocol.py, pyclbr.py, setup.py, spawn.py, tabnanny.py,
- testcode.py: Null commit with -f option to force an uprev and put
- HEADs firmly on the trunk.
-
-2001-06-27 10:24 elguavas
-
- * IDLEFORK.html: updated contact details
-
-2001-06-25 17:23 elguavas
-
- * idle, RemoteInterp.py, setup.py: Initial revision
-
-2001-06-25 17:23 elguavas
-
- * idle, RemoteInterp.py, setup.py: import current python cvs idle
- as a vendor branch
-
-2001-06-24 15:10 elguavas
-
- * IDLEFORK.html: tiny change to test new syncmail setup
-
-2001-06-24 14:41 elguavas
-
- * IDLEFORK.html: change to new developer contact, also a test
- commit for new syncmail setup
-
-2001-06-23 18:15 elguavas
-
- * IDLEFORK.html: tiny test update for revitalised idle-fork
-
-2000-09-24 17:29 nriley
-
- * protocol.py: Fixes for Python 1.6 compatibility - socket bind and
- connect get a tuple instead two arguments.
-
-2000-09-24 17:28 nriley
-
- * spawn.py: Change for Python 1.6 compatibility - UNIX's 'os'
- module defines 'spawnv' now, so we check for 'fork' first.
-
-2000-08-15 22:51 nowonder
-
- * IDLEFORK.html:
- corrected email address
-
-2000-08-15 22:47 nowonder
-
- * IDLEFORK.html:
- added .html file for http://idlefork.sourceforge.net
-
-2000-08-15 11:13 dscherer
-
- * AutoExpand.py, AutoIndent.py, Bindings.py, CallTipWindow.py,
- CallTips.py, __init__.py, ChangeLog, ClassBrowser.py,
- ColorDelegator.py, ConfigParser.py, Debugger.py, Delegator.py,
- FileList.py, FormatParagraph.py, FrameViewer.py, GrepDialog.py,
- IOBinding.py, IdleConf.py, IdleHistory.py, MultiScrolledLists.py,
- MultiStatusBar.py, NEWS.txt, ObjectBrowser.py, OldStackViewer.py,
- OutputWindow.py, ParenMatch.py, PathBrowser.py, Percolator.py,
- PyParse.py, PyShell.py, README.txt, ReplaceDialog.py,
- ScriptBinding.py, ScrolledList.py, SearchBinding.py,
- SearchDialog.py, SearchDialogBase.py, SearchEngine.py,
- Separator.py, StackViewer.py, TODO.txt, ToolTip.py, TreeWidget.py,
- UndoDelegator.py, WidgetRedirector.py, WindowList.py, help.txt,
- ZoomHeight.py, config-unix.txt, config-win.txt, config.txt,
- eventparse.py, extend.txt, idle.bat, idle.py, idle.pyw, idlever.py,
- keydefs.py, loader.py, pyclbr.py, tabnanny.py, testcode.py,
- EditorWindow.py, ExecBinding.py, Remote.py, protocol.py, spawn.py,
- Icons/folder.gif, Icons/minusnode.gif, Icons/openfolder.gif,
- Icons/plusnode.gif, Icons/python.gif, Icons/tk.gif: Initial
- revision
-
-2000-08-15 11:13 dscherer
-
- * AutoExpand.py, AutoIndent.py, Bindings.py, CallTipWindow.py,
- CallTips.py, __init__.py, ChangeLog, ClassBrowser.py,
- ColorDelegator.py, ConfigParser.py, Debugger.py, Delegator.py,
- FileList.py, FormatParagraph.py, FrameViewer.py, GrepDialog.py,
- IOBinding.py, IdleConf.py, IdleHistory.py, MultiScrolledLists.py,
- MultiStatusBar.py, NEWS.txt, ObjectBrowser.py, OldStackViewer.py,
- OutputWindow.py, ParenMatch.py, PathBrowser.py, Percolator.py,
- PyParse.py, PyShell.py, README.txt, ReplaceDialog.py,
- ScriptBinding.py, ScrolledList.py, SearchBinding.py,
- SearchDialog.py, SearchDialogBase.py, SearchEngine.py,
- Separator.py, StackViewer.py, TODO.txt, ToolTip.py, TreeWidget.py,
- UndoDelegator.py, WidgetRedirector.py, WindowList.py, help.txt,
- ZoomHeight.py, config-unix.txt, config-win.txt, config.txt,
- eventparse.py, extend.txt, idle.bat, idle.py, idle.pyw, idlever.py,
- keydefs.py, loader.py, pyclbr.py, tabnanny.py, testcode.py,
- EditorWindow.py, ExecBinding.py, Remote.py, protocol.py, spawn.py,
- Icons/folder.gif, Icons/minusnode.gif, Icons/openfolder.gif,
- Icons/plusnode.gif, Icons/python.gif, Icons/tk.gif: Modified IDLE
- from VPython 0.2
-
-
-original IDLE ChangeLog:
-========================
-
-Tue Feb 15 18:08:19 2000 Guido van Rossum
-
- * NEWS.txt: Notice status bar and stack viewer.
-
- * EditorWindow.py: Support for Moshe's status bar.
-
- * MultiStatusBar.py: Status bar code -- by Moshe Zadka.
-
- * OldStackViewer.py:
- Adding the old stack viewer implementation back, for the debugger.
-
- * StackViewer.py: New stack viewer, uses a tree widget.
- (XXX: the debugger doesn't yet use this.)
-
- * WindowList.py:
- Correct a typo and remove an unqualified except that was hiding the error.
-
- * ClassBrowser.py: Add an XXX comment about the ClassBrowser AIP.
-
- * ChangeLog: Updated change log.
-
- * NEWS.txt: News update. Probably incomplete; what else is new?
-
- * README.txt:
- Updated for pending IDLE 0.5 release (still very rough -- just getting
- it out in a more convenient format than CVS).
-
- * TODO.txt: Tiny addition.
-
-Thu Sep 9 14:16:02 1999 Guido van Rossum
-
- * TODO.txt: A few new TODO entries.
-
-Thu Aug 26 23:06:22 1999 Guido van Rossum
-
- * Bindings.py: Add Python Documentation entry to Help menu.
-
- * EditorWindow.py:
- Find the help.txt file relative to __file__ or ".", not in sys.path.
- (Suggested by Moshe Zadka, but implemented differently.)
-
- Add <> event which, on Unix, brings up Netscape pointing
- to http://www.python.doc/current/ (a local copy would be nice but its
- location can't be predicted). Windows solution TBD.
-
-Wed Aug 11 14:55:43 1999 Guido van Rossum
-
- * TreeWidget.py:
- Moshe noticed an inconsistency in his comment, so I'm rephrasing it to
- be clearer.
-
- * TreeWidget.py:
- Patch inspired by Moshe Zadka to search for the Icons directory in the
- same directory as __file__, rather than searching for it along sys.path.
- This works better when idle is a package.
-
-Thu Jul 15 13:11:02 1999 Guido van Rossum
-
- * TODO.txt: New wishes.
-
-Sat Jul 10 13:17:35 1999 Guido van Rossum
-
- * IdlePrefs.py:
- Make the color for stderr red (i.e. the standard warning/danger/stop
- color) rather than green. Suggested by Sam Schulenburg.
-
-Fri Jun 25 17:26:34 1999 Guido van Rossum
-
- * PyShell.py: Close debugger when closing. This may break a cycle.
-
- * Debugger.py: Break cycle on close.
-
- * ClassBrowser.py: Destroy the tree when closing.
-
- * TreeWidget.py: Add destroy() method to recursively destroy a tree.
-
- * PyShell.py: Extend _close() to break cycles.
- Break some other cycles too (and destroy the root when done).
-
- * EditorWindow.py:
- Add _close() method that does the actual cleanup (close() asks the
- user what they want first if there's unsaved stuff, and may cancel).
- It closes more than before.
-
- Add unload_extensions() method to unload all extensions; called from
- _close(). It calls an extension's close() method if it has one.
-
- * Percolator.py: Add close() method that breaks cycles.
-
- * WidgetRedirector.py: Add unregister() method.
- Unregister everything at closing.
- Don't call close() in __del__, rely on explicit call to close().
-
- * IOBinding.py, FormatParagraph.py, CallTips.py:
- Add close() method that breaks a cycle.
-
-Fri Jun 11 15:03:00 1999 Guido van Rossum
-
- * AutoIndent.py, EditorWindow.py, FormatParagraph.py:
- Tim Peters smart.patch:
-
- EditorWindow.py:
-
- + Added get_tabwidth & set_tabwidth "virtual text" methods, that get/set the
- widget's view of what a tab means.
-
- + Moved TK_TABWIDTH_DEFAULT here from AutoIndent.
-
- + Renamed Mark's get_selection_index to get_selection_indices (sorry, Mark,
- but the name was plain wrong ).
-
- FormatParagraph.py: renamed use of get_selection_index.
-
- AutoIndent.py:
-
- + Moved TK_TABWIDTH_DEFAULT to EditorWindow.
-
- + Rewrote set_indentation_params to use new VTW get/set_tabwidth methods.
-
- + Changed smart_backspace_event to delete whitespace back to closest
- preceding virtual tab stop or real character (note that this may require
- inserting characters if backspacing over a tab!).
-
- + Nuked almost references to the selection tag, in favor of using
- get_selection_indices. The sole exception is in set_region, for which no
- "set_selection" abstraction has yet been agreed upon.
-
- + Had too much fun using the spiffy new features of the format-paragraph
- cmd.
-
-Thu Jun 10 17:48:02 1999 Guido van Rossum
-
- * FormatParagraph.py:
- Code by Mark Hammond to format paragraphs embedded in comments.
- Read the comments (which I reformatted using the new feature :-)
- for some limitations.
-
- * EditorWindow.py:
- Added abstraction get_selection_index() (Mark Hammond). Also
- reformatted some comment blocks to show off a cool feature I'm about
- to check in next.
-
- * ClassBrowser.py:
- Adapt to the new pyclbr's support of listing top-level functions. If
- this functionality is not present (e.g. when used with a vintage
- Python 1.5.2 installation) top-level functions are not listed.
-
- (Hmm... Any distribution of IDLE 0.5 should probably include a copy
- of the new pyclbr.py!)
-
- * AutoIndent.py:
- Fix off-by-one error in Tim's recent change to comment_region(): the
- list of lines returned by get_region() contains an empty line at the
- end representing the start of the next line, and this shouldn't be
- commented out!
-
- * CallTips.py:
- Mark Hammond writes: Here is another change that allows it to work for
- class creation - tries to locate an __init__ function. Also updated
- the test code to reflect your new "***" change.
-
- * CallTipWindow.py:
- Mark Hammond writes: Tim's suggestion of copying the font for the
- CallTipWindow from the text control makes sense, and actually makes
- the control look better IMO.
-
-Wed Jun 9 20:34:57 1999 Guido van Rossum
-
- * CallTips.py:
- Append "..." if the appropriate flag (for varargs) in co_flags is set.
- Ditto "***" for kwargs.
-
-Tue Jun 8 13:06:07 1999 Guido van Rossum
-
- * ReplaceDialog.py:
- Hmm... Tim didn't turn "replace all" into a single undo block.
- I think I like it better if it os, so here.
-
- * ReplaceDialog.py: Tim Peters: made replacement atomic for undo/redo.
-
- * AutoIndent.py: Tim Peters:
-
- + Set usetabs=1. Editing pyclbr.py was driving me nuts <0.6 wink>.
- usetabs=1 is the Emacs pymode default too, and thanks to indentwidth !=
- tabwidth magical usetabs disabling, new files are still created with tabs
- turned off. The only implication is that if you open a file whose first
- indent is a single tab, IDLE will now magically use tabs for that file (and
- set indentwidth to 8). Note that the whole scheme doesn't work right for
- PythonWin, though, since Windows users typically set tabwidth to 4; Mark
- probably has to hide the IDLE algorithm from them (which he already knows).
-
- + Changed comment_region_event to stick "##" in front of every line. The
- "holes" previously left on blank lines were visually confusing (made it
- needlessly hard to figure out what to uncomment later).
-
-Mon Jun 7 15:38:40 1999 Guido van Rossum
-
- * TreeWidget.py, ObjectBrowser.py:
- Remove unnecessary reference to pyclbr from test() code.
-
- * PyParse.py: Tim Peters:
-
- Smarter logic for finding a parse synch point.
-
- Does a half to a fifth the work in normal cases; don't notice the speedup,
- but makes more breathing room for other extensions.
-
- Speeds terrible cases by at least a factor of 10. "Terrible" == e.g. you put
- """ at the start of Tkinter.py, undo it, zoom to the bottom, and start
- typing in code. Used to take about 8 seconds for ENTER to respond, now some
- large fraction of a second. The new code gets indented correctly, despite
- that it all remains "string colored" until the colorizer catches up (after
- which, ENTER appears instantaneous again).
-
-Fri Jun 4 19:21:19 1999 Guido van Rossum
-
- * extend.py: Might as well enable CallTips by default.
- If there are too many complaints I'll remove it again or fix it.
-
-Thu Jun 3 14:32:16 1999 Guido van Rossum
-
- * AutoIndent.py, EditorWindow.py, PyParse.py:
- New offerings by Tim Peters; he writes:
-
- IDLE is now the first Python editor in the Universe not confused by my
- doctest.py .
-
- As threatened, this defines IDLE's is_char_in_string function as a
- method of EditorWindow. You just need to define one similarly in
- whatever it is you pass as editwin to AutoIndent; looking at the
- EditorWindow.py part of the patch should make this clear.
-
- * GrepDialog.py: Enclose pattern in quotes in status message.
-
- * CallTips.py:
- Mark Hammond fixed some comments and improved the way the tip text is
- constructed.
-
-Wed Jun 2 18:18:57 1999 Guido van Rossum
-
- * CallTips.py:
- My fix to Mark's code: restore the universal check on .
- Always cancel on or .
-
- * CallTips.py:
- A version that Mark Hammond posted to the newsgroup. Has some newer
- stuff for getting the tip. Had to fix the Key-( and Key-) events
- for Unix. Will have to re-apply my patch for catching KeyRelease and
- ButtonRelease events.
-
- * CallTipWindow.py, CallTips.py:
- Call tips by Mark Hammond (plus tiny fix by me.)
-
- * IdleHistory.py:
- Changes by Mark Hammond: (1) support optional output_sep argument to
- the constructor so he can eliminate the sys.ps2 that PythonWin leaves
- in the source; (2) remove duplicate history items.
-
- * AutoIndent.py:
- Changes by Mark Hammond to allow using IDLE extensions in PythonWin as
- well: make three dialog routines instance variables.
-
- * EditorWindow.py:
- Change by Mark Hammond to allow using IDLE extensions in PythonWin as
- well: make three dialog routines instance variables.
-
-Tue Jun 1 20:06:44 1999 Guido van Rossum
-
- * AutoIndent.py: Hah! A fix of my own to Tim's code!
- Unix bindings for <> and <> were
- missing, and somehow that meant the events were never generated,
- even though they were in the menu. The new Unix bindings are now
- the same as the Windows bindings (M-t and M-u).
-
- * AutoIndent.py, PyParse.py, PyShell.py: Tim Peters again:
-
- The new version (attached) is fast enough all the time in every real module
- I have . You can make it slow by, e.g., creating an open list with
- 5,000 90-character identifiers (+ trailing comma) each on its own line, then
- adding an item to the end -- but that still consumes less than a second on
- my P5-166. Response time in real code appears instantaneous.
-
- Fixed some bugs.
-
- New feature: when hitting ENTER and the cursor is beyond the line's leading
- indentation, whitespace is removed on both sides of the cursor; before
- whitespace was removed only on the left; e.g., assuming the cursor is
- between the comma and the space:
-
- def something(arg1, arg2):
- ^ cursor to the left of here, and hit ENTER
- arg2): # new line used to end up here
- arg2): # but now lines up the way you expect
-
- New hack: AutoIndent has grown a context_use_ps1 Boolean config option,
- defaulting to 0 (false) and set to 1 (only) by PyShell. Reason: handling
- the fancy stuff requires looking backward for a parsing synch point; ps1
- lines are the only sensible thing to look for in a shell window, but are a
- bad thing to look for in a file window (ps1 lines show up in my module
- docstrings often). PythonWin's shell should set this true too.
-
- Persistent problem: strings containing def/class can still screw things up
- completely. No improvement. Simplest workaround is on the user's head, and
- consists of inserting e.g.
-
- def _(): pass
-
- (or any other def/class) after the end of the multiline string that's
- screwing them up. This is especially irksome because IDLE's syntax coloring
- is *not* confused, so when this happens the colors don't match the
- indentation behavior they see.
-
- * AutoIndent.py: Tim Peters again:
-
- [Tim, after adding some bracket smarts to AutoIndent.py]
- > ...
- > What it can't possibly do without reparsing large gobs of text is
- > suggest a reasonable indent level after you've *closed* a bracket
- > left open on some previous line.
- > ...
-
- The attached can, and actually fast enough to use -- most of the time. The
- code is tricky beyond belief to achieve that, but it works so far; e.g.,
-
- return len(string.expandtabs(str[self.stmt_start :
- ^ indents to caret
- i],
- ^ indents to caret
- self.tabwidth)) + 1
- ^ indents to caret
-
- It's about as smart as pymode now, wrt both bracket and backslash
- continuation rules. It does require reparsing large gobs of text, and if it
- happens to find something that looks like a "def" or "class" or sys.ps1
- buried in a multiline string, but didn't suck up enough preceding text to
- see the start of the string, it's completely hosed. I can't repair that --
- it's just too slow to reparse from the start of the file all the time.
-
- AutoIndent has grown a new num_context_lines tuple attribute that controls
- how far to look back, and-- like other params --this could/should be made
- user-overridable at startup and per-file on the fly.
-
- * PyParse.py: New file by Tim Peters:
-
- One new file in the attached, PyParse.py. The LineStudier (whatever it was
- called ) class was removed from AutoIndent; PyParse subsumes its
- functionality.
-
- * AutoIndent.py: Tim Peters keeps revising this module (more to come):
-
- Removed "New tabwidth" menu binding.
-
- Added "a tab means how many spaces?" dialog to block tabify and untabify. I
- think prompting for this is good now: they're usually at-most-once-per-file
- commands, and IDLE can't let them change tabwidth from the Tk default
- anymore, so IDLE can no longer presume to have any idea what a tab means.
-
- Irony: for the purpose of keeping comments aligned via tabs, Tk's
- non-default approach is much nicer than the Emacs/Notepad/Codewright/vi/etc
- approach.
-
- * EditorWindow.py:
- 1. Catch NameError on import (could be raised by case mismatch on Windows).
- 2. No longer need to reset pyclbr cache and show watch cursor when calling
- ClassBrowser -- the ClassBrowser takes care of pyclbr and the TreeWidget
- takes care of the watch cursor.
- 3. Reset the focus to the current window after error message about class
- browser on buffer without filename.
-
- * Icons/minusnode.gif, Icons/plusnode.gif: Missed a few.
-
- * ClassBrowser.py, PathBrowser.py: Rewritten based on TreeWidget.py
-
- * ObjectBrowser.py: Object browser, based on TreeWidget.py.
-
- * TreeWidget.py: Tree widget done right.
-
- * ToolTip.py: As yet unused code for tool tips.
-
- * ScriptBinding.py:
- Ensure sys.argv[0] is the script name on Run Script.
-
- * ZoomHeight.py: Move zoom height functionality to separate function.
-
- * Icons/folder.gif, Icons/openfolder.gif, Icons/python.gif, Icons/tk.gif:
- A few icons used by ../TreeWidget.py and its callers.
-
- * AutoIndent.py: New version by Tim Peters improves block opening test.
-
-Fri May 21 04:46:17 1999 Guido van Rossum
-
- * Attic/History.py, PyShell.py: Rename History to IdleHistory.
- Add isatty() to pseudo files.
-
- * StackViewer.py: Make initial stack viewer wider
-
- * TODO.txt: New wishes
-
- * AutoIndent.py, EditorWindow.py, PyShell.py:
- Much improved autoindent and handling of tabs,
- by Tim Peters.
-
-Mon May 3 15:49:52 1999 Guido van Rossum
-
- * AutoIndent.py, EditorWindow.py, FormatParagraph.py, UndoDelegator.py:
- Tim Peters writes:
-
- I'm still unsure, but couldn't stand the virtual event trickery so tried a
- different sin (adding undo_block_start/stop methods to the Text instance in
- EditorWindow.py). Like it or not, it's efficient and works . Better
- idea?
-
- Give the attached a whirl. Even if you hate the implementation, I think
- you'll like the results. Think I caught all the "block edit" cmds,
- including Format Paragraph, plus subtler ones involving smart indents and
- backspacing.
-
- * WidgetRedirector.py: Tim Peters writes:
-
- [W]hile trying to dope out how redirection works, stumbled into two
- possible glitches. In the first, it doesn't appear to make sense to try to
- rename a command that's already been destroyed; in the second, the name
- "previous" doesn't really bring to mind "ignore the previous value" .
-
-Fri Apr 30 19:39:25 1999 Guido van Rossum
-
- * __init__.py: Support for using idle as a package.
-
- * PathBrowser.py:
- Avoid listing files more than once (e.g. foomodule.so has two hits:
- once for foo + module.so, once for foomodule + .so).
-
-Mon Apr 26 22:20:38 1999 Guido van Rossum
-
- * ChangeLog, ColorDelegator.py, PyShell.py: Tim Peters strikes again:
-
- Ho ho ho -- that's trickier than it sounded! The colorizer is working with
- "line.col" strings instead of Text marks, and the absolute coordinates of
- the point of interest can change across the self.update call (voice of
- baffled experience, when two quick backspaces no longer fooled it, but a
- backspace followed by a quick ENTER did ).
-
- Anyway, the attached appears to do the trick. CPU usage goes way up when
- typing quickly into a long triple-quoted string, but the latency is fine for
- me (a relatively fast typist on a relatively slow machine). Most of the
- changes here are left over from reducing the # of vrbl names to help me
- reason about the logic better; I hope the code is a *little* easier to
-
-Fri Apr 23 14:01:25 1999 Guido van Rossum
-
- * EditorWindow.py:
- Provide full arguments to __import__ so it works in packagized IDLE.
-
-Thu Apr 22 23:20:17 1999 Guido van Rossum
-
- * help.txt:
- Bunch of updates necessary due to recent changes; added docs for File
- menu, command line and color preferences.
-
- * Bindings.py: Remove obsolete 'script' menu.
-
- * TODO.txt: Several wishes fulfilled.
-
- * OutputWindow.py:
- Moved classes OnDemandOutputWindow and PseudoFile here,
- from ScriptBinding.py where they are no longer needed.
-
- * ScriptBinding.py:
- Mostly rewritten. Instead of the old Run module and Debug module,
- there are two new commands:
-
- Import module (F5) imports or reloads the module and also adds its
- name to the __main__ namespace. This gets executed in the PyShell
- window under control of its debug settings.
-
- Run script (Control-F5) is similar but executes the contents of the
- file directly in the __main__ namespace.
-
- * PyShell.py: Nits: document use of $IDLESTARTUP; display idle version
-
- * idlever.py: New version to celebrate new command line
-
- * OutputWindow.py: Added flush(), for completeness.
-
- * PyShell.py:
- A lot of changes to make the command line more useful. You can now do:
- idle.py -e file ... -- to edit files
- idle.py script arg ... -- to run a script
- idle.py -c cmd arg ... -- to run a command
- Other options, see also the usage message (also new!) for more details:
- -d -- enable debugger
- -s -- run $IDLESTARTUP or $PYTHONSTARTUP
- -t title -- set Python Shell window's title
- sys.argv is set accordingly, unless -e is used.
- sys.path is absolutized, and all relevant paths are inserted into it.
-
- Other changes:
- - the environment in which commands are executed is now the
- __main__ module
- - explicitly save sys.stdout etc., don't restore from sys.__stdout__
- - new interpreter methods execsource(), execfile(), stuffsource()
- - a few small nits
-
- * TODO.txt:
- Some more TODO items. Made up my mind about command line args,
- Run/Import, __main__.
-
- * ColorDelegator.py:
- Super-elegant patch by Tim Peters that speeds up colorization
- dramatically (up to 15 times he claims). Works by reading more than
- one line at a time, up to 100-line chunks (starting with one line and
- then doubling up to the limit). On a typical machine (e.g. Tim's
- P5-166) this doesn't reduce interactive responsiveness in a noticeable
- way.
-
-Wed Apr 21 15:49:34 1999 Guido van Rossum
-
- * ColorDelegator.py:
- Patch by Tim Peters to speed up colorizing of big multiline strings.
-
-Tue Apr 20 17:32:52 1999 Guido van Rossum
-
- * extend.txt:
- For an event 'foo-bar', the corresponding method must be called
- foo_bar_event(). Therefore, fix the references to zoom_height() in
- the example.
-
- * IdlePrefs.py: Restored the original IDLE color scheme.
-
- * PyShell.py, IdlePrefs.py, ColorDelegator.py, EditorWindow.py:
- Color preferences code by Loren Luke (massaged by me somewhat)
-
- * SearchEngine.py:
- Patch by Mark Favas: it fixes the search engine behaviour where an
- unsuccessful search wraps around and re-searches that part of the file
- between the start of the search and the end of the file - only really
- an issue for very large files, but... (also removes a redundant
- m.span() call).
-
-Mon Apr 19 16:26:02 1999 Guido van Rossum
-
- * TODO.txt: A few wishes are now fulfilled.
-
- * AutoIndent.py: Tim Peters implements some of my wishes:
-
- o Makes the tab key intelligently insert spaces when appropriate
- (see Help list banter twixt David Ascher and me; idea stolen from
- every other editor on earth ).
-
- o newline_and_indent_event trims trailing whitespace on the old
- line (pymode and Codewright).
-
- o newline_and_indent_event no longer fooled by trailing whitespace or
- comment after ":" (pymode, PTUI).
-
- o newline_and_indent_event now reduces the new line's indentation after
- return, break, continue, raise and pass stmts (pymode).
-
- The last two are easy to fool in the presence of strings &
- continuations, but pymode requires Emacs's high-powered C parsing
- functions to avoid that in finite time.
-
-======================================================================
- Python release 1.5.2c1, IDLE version 0.4
-======================================================================
-
-Wed Apr 7 18:41:59 1999 Guido van Rossum
-
- * README.txt, NEWS.txt: New version.
-
- * idlever.py: Version bump awaiting impending new release.
- (Not much has changed :-( )
-
-Mon Mar 29 14:52:28 1999 Guido van Rossum
-
- * ScriptBinding.py, PyShell.py:
- At Tim Peters' recommendation, add a dummy flush() method to
- PseudoFile.
-
-Thu Mar 11 23:21:23 1999 Guido van Rossum
-
- * PathBrowser.py: Don't crash when sys.path contains an empty string.
-
- * Attic/Outline.py: This file was never supposed to be part of IDLE.
-
- * PathBrowser.py:
- - Don't crash in the case where a superclass is a string instead of a
- pyclbr.Class object; this can happen when the superclass is
- unrecognizable (to pyclbr), e.g. when module renaming is used.
-
- - Show a watch cursor when calling pyclbr (since it may take a while
- recursively parsing imported modules!).
-
-Wed Mar 10 05:18:02 1999 Guido van Rossum
-
- * EditorWindow.py, Bindings.py: Add PathBrowser to File module
-
- * PathBrowser.py: "Path browser" - 4 scrolled lists displaying:
- directories on sys.path
- modules in selected directory
- classes in selected module
- methods of selected class
-
- Sinlge clicking in a directory, module or class item updates the next
- column with info about the selected item. Double clicking in a
- module, class or method item opens the file (and selects the clicked
- item if it is a class or method).
-
- I guess eventually I should be using a tree widget for this, but the
- ones I've seen don't work well enough, so for now I use the old
- Smalltalk or NeXT style multi-column hierarchical browser.
-
- * MultiScrolledLists.py:
- New utility: multiple scrolled lists in parallel
-
- * ScrolledList.py: - White background.
- - Display "(None)" (or text of your choosing) when empty.
- - Don't set the focus.
-
-======================================================================
- Python release 1.5.2b2, IDLE version 0.3
-======================================================================
-
-Wed Feb 17 22:47:41 1999 Guido van Rossum
-
- * NEWS.txt: News in 0.3.
-
- * README.txt, idlever.py: Bump version to 0.3.
-
- * EditorWindow.py:
- After all, we don't need to call the callbacks ourselves!
-
- * WindowList.py:
- When deleting, call the callbacks *after* deleting the window from our list!
-
- * EditorWindow.py:
- Fix up the Windows menu via the new callback mechanism instead of
- depending on menu post commands (which don't work when the menu is
- torn off).
-
- * WindowList.py:
- Support callbacks to patch up Windows menus everywhere.
-
- * ChangeLog: Oh, why not. Checking in the Emacs-generated change log.
-
-Tue Feb 16 22:34:17 1999 Guido van Rossum
-
- * ScriptBinding.py:
- Only pop up the stack viewer when requested in the Debug menu.
-
-Mon Feb 8 22:27:49 1999 Guido van Rossum
-
- * WindowList.py: Don't crash if a window no longer exists.
-
- * TODO.txt: Restructured a bit.
-
-Mon Feb 1 23:06:17 1999 Guido van Rossum
-
- * PyShell.py: Add current dir or paths of file args to sys.path.
-
- * Debugger.py: Add canonic() function -- for brand new bdb.py feature.
-
- * StackViewer.py: Protect against accessing an empty stack.
-
-Fri Jan 29 20:44:45 1999 Guido van Rossum
-
- * ZoomHeight.py:
- Use only the height to decide whether to zoom in or out.
-
-Thu Jan 28 22:24:30 1999 Guido van Rossum
-
- * EditorWindow.py, FileList.py:
- Make sure the Tcl variables are shared between windows.
-
- * PyShell.py, EditorWindow.py, Bindings.py:
- Move menu/key binding code from Bindings.py to EditorWindow.py,
- with changed APIs -- it makes much more sense there.
- Also add a new feature: if the first character of a menu label is
- a '!', it gets a checkbox. Checkboxes are bound to Boolean Tcl variables
- that can be accessed through the new getvar/setvar/getrawvar API;
- the variable is named after the event to which the menu is bound.
-
- * Debugger.py: Add Quit button to the debugger window.
-
- * SearchDialog.py:
- When find_again() finds exactly the current selection, it's a failure.
-
- * idle.py, Attic/idle: Rename idle -> idle.py
-
-Mon Jan 18 15:18:57 1999 Guido van Rossum
-
- * EditorWindow.py, WindowList.py: Only deiconify when iconic.
-
- * TODO.txt: Misc
-
-Tue Jan 12 22:14:34 1999 Guido van Rossum
-
- * testcode.py, Attic/test.py:
- Renamed test.py to testcode.py so one can import Python's
- test package from inside IDLE. (Suggested by Jack Jansen.)
-
- * EditorWindow.py, ColorDelegator.py:
- Hack to close a window that is colorizing.
-
- * Separator.py: Vladimir Marangozov's patch:
- The separator dances too much and seems to jump by arbitrary amounts
- in arbitrary directions when I try to move it for resizing the frames.
- This patch makes it more quiet.
-
-Mon Jan 11 14:52:40 1999 Guido van Rossum
-
- * TODO.txt: Some requests have been fulfilled.
-
- * EditorWindow.py:
- Set the cursor to a watch when opening the class browser (which may
- take quite a while, browsing multiple files).
-
- Newer, better center() -- but assumes no wrapping.
-
- * SearchBinding.py:
- Got rid of debug print statement in goto_line_event().
-
- * ScriptBinding.py:
- I think I like it better if it prints the traceback even when it displays
- the stack viewer.
-
- * Debugger.py: Bind ESC to close-window.
-
- * ClassBrowser.py: Use a HSeparator between the classes and the items.
- Make the list of classes wider by default (40 chars).
- Bind ESC to close-window.
-
- * Separator.py:
- Separator classes (draggable divider between two panes).
-
-Sat Jan 9 22:01:33 1999 Guido van Rossum
-
- * WindowList.py:
- Don't traceback when wakeup() is called when the window has been destroyed.
- This can happen when a torn-of Windows menu references closed windows.
- And Tim Peters claims that the Windows menu is his favorite to tear off...
-
- * EditorWindow.py: Allow tearing off of the Windows menu.
-
- * StackViewer.py: Close on ESC.
-
- * help.txt: Updated a bunch of things (it was mostly still 0.1!)
-
- * extend.py: Added ScriptBinding to standard bindings.
-
- * ScriptBinding.py:
- This now actually works. See doc string. It can run a module (i.e.
- import or reload) or debug it (same with debugger control). Output
- goes to a fresh output window, only created when needed.
-
-======================================================================
- Python release 1.5.2b1, IDLE version 0.2
-======================================================================
-
-Fri Jan 8 17:26:02 1999 Guido van Rossum
-
- * README.txt, NEWS.txt: What's new in this release.
-
- * Bindings.py, PyShell.py:
- Paul Prescod's patches to allow the stack viewer to pop up when a
- traceback is printed.
-
-Thu Jan 7 00:12:15 1999 Guido van Rossum
-
- * FormatParagraph.py:
- Change paragraph width limit to 70 (like Emacs M-Q).
-
- * README.txt:
- Separating TODO from README. Slight reformulation of features. No
- exact release date.
-
- * TODO.txt: Separating TODO from README.
-
-Mon Jan 4 21:19:09 1999 Guido van Rossum
-
- * FormatParagraph.py:
- Hm. There was a boundary condition error at the end of the file too.
-
- * SearchBinding.py: Hm. Add Unix binding for replace, too.
-
- * keydefs.py: Ran eventparse.py again.
-
- * FormatParagraph.py: Added Unix Meta-q key binding;
- fix find_paragraph when at start of file.
-
- * AutoExpand.py: Added Meta-/ binding for Unix as alt for Alt-/.
-
- * SearchBinding.py:
- Add unix binding for grep (otherwise the menu entry doesn't work!)
-
- * ZoomHeight.py: Adjusted Unix height to work with fvwm96. :=(
-
- * GrepDialog.py: Need to import sys!
-
- * help.txt, extend.txt, README.txt: Formatted some paragraphs
-
- * extend.py, FormatParagraph.py:
- Add new extension to reformat a (text) paragraph.
-
- * ZoomHeight.py: Typo in Win specific height setting.
-
-Sun Jan 3 00:47:35 1999 Guido van Rossum
-
- * AutoIndent.py: Added something like Tim Peters' backspace patch.
-
- * ZoomHeight.py: Adapted to Unix (i.e., more hardcoded constants).
-
-Sat Jan 2 21:28:54 1999 Guido van Rossum
-
- * keydefs.py, idlever.py, idle.pyw, idle.bat, help.txt, extend.txt, extend.py, eventparse.py, ZoomHeight.py, WindowList.py, UndoDelegator.py, StackViewer.py, SearchEngine.py, SearchDialogBase.py, SearchDialog.py, ScrolledList.py, SearchBinding.py, ScriptBinding.py, ReplaceDialog.py, Attic/README, README.txt, PyShell.py, Attic/PopupMenu.py, OutputWindow.py, IOBinding.py, Attic/HelpWindow.py, History.py, GrepDialog.py, FileList.py, FrameViewer.py, EditorWindow.py, Debugger.py, Delegator.py, ColorDelegator.py, Bindings.py, ClassBrowser.py, AutoExpand.py, AutoIndent.py:
- Checking in IDLE 0.2.
-
- Much has changed -- too much, in fact, to write down.
- The big news is that there's a standard way to write IDLE extensions;
- see extend.txt. Some sample extensions have been provided, and
- some existing code has been converted to extensions. Probably the
- biggest new user feature is a new search dialog with more options,
- search and replace, and even search in files (grep).
-
- This is exactly as downloaded from my laptop after returning
- from the holidays -- it hasn't even been tested on Unix yet.
-
-Fri Dec 18 15:52:54 1998 Guido van Rossum
-
- * FileList.py, ClassBrowser.py:
- Fix the class browser to work even when the file is not on sys.path.
-
-Tue Dec 8 20:39:36 1998 Guido van Rossum
-
- * Attic/turtle.py: Moved to Python 1.5.2/Lib
-
-Fri Nov 27 03:19:20 1998 Guido van Rossum
-
- * help.txt: Typo
-
- * EditorWindow.py, FileList.py: Support underlining of menu labels
-
- * Bindings.py:
- New approach, separate tables for menus (platform-independent) and key
- definitions (platform-specific), and generating accelerator strings
- automatically from the key definitions.
-
-Mon Nov 16 18:37:42 1998 Guido van Rossum
-
- * Attic/README: Clarify portability and main program.
-
- * Attic/README: Added intro for 0.1 release and append Grail notes.
-
-Mon Oct 26 18:49:00 1998 Guido van Rossum
-
- * Attic/turtle.py: root is now a global called _root
-
-Sat Oct 24 16:38:38 1998 Guido van Rossum
-
- * Attic/turtle.py: Raise the root window on reset().
- Different action on WM_DELETE_WINDOW is more likely to do the right thing,
- allowing us to destroy old windows.
-
- * Attic/turtle.py:
- Split the goto() function in two: _goto() is the internal one,
- using Canvas coordinates, and goto() uses turtle coordinates
- and accepts variable argument lists.
-
- * Attic/turtle.py: Cope with destruction of the window
-
- * Attic/turtle.py: Turtle graphics
-
- * Debugger.py: Use of Breakpoint class should be bdb.Breakpoint.
-
-Mon Oct 19 03:33:40 1998 Guido van Rossum
-
- * SearchBinding.py:
- Speed up the search a bit -- don't drag a mark around...
-
- * PyShell.py:
- Change our special entries from to .
- Patch linecache.checkcache() to keep our special entries alive.
- Add popup menu to all editor windows to set a breakpoint.
-
- * Debugger.py:
- Use and pass through the 'force' flag to set_dict() where appropriate.
- Default source and globals checkboxes to false.
- Don't interact in user_return().
- Add primitive set_breakpoint() method.
-
- * ColorDelegator.py:
- Raise priority of 'sel' tag so its foreground (on Windows) will take
- priority over text colorization (which on Windows is almost the
- same color as the selection background).
-
- Define a tag and color for breakpoints ("BREAK").
-
- * Attic/PopupMenu.py: Disable "Open stack viewer" and "help" commands.
-
- * StackViewer.py:
- Add optional 'force' argument (default 0) to load_dict().
- If set, redo the display even if it's the same dict.
-
-Fri Oct 16 21:10:12 1998 Guido van Rossum
-
- * StackViewer.py: Do nothing when loading the same dict as before.
-
- * PyShell.py: Details for debugger interface.
-
- * Debugger.py:
- Restructured and more consistent. Save checkboxes across instantiations.
-
- * EditorWindow.py, Attic/README, Bindings.py:
- Get rid of conflicting ^X binding. Use ^W.
-
- * Debugger.py, StackViewer.py:
- Debugger can now show local and global variables.
-
- * Debugger.py: Oops
-
- * Debugger.py, PyShell.py: Better debugger support (show stack etc).
-
- * Attic/PopupMenu.py: Follow renames in StackViewer module
-
- * StackViewer.py:
- Rename classes to StackViewer (the widget) and StackBrowser (the toplevel).
-
- * ScrolledList.py: Add close() method
-
- * EditorWindow.py: Clarify 'Open Module' dialog text
-
- * StackViewer.py: Restructured into a browser and a widget.
-
-Thu Oct 15 23:27:08 1998 Guido van Rossum
-
- * ClassBrowser.py, ScrolledList.py:
- Generalized the scrolled list which is the base for the class and
- method browser into a separate class in its own module.
-
- * Attic/test.py: Cosmetic change
-
- * Debugger.py: Don't show function name if there is none
-
-Wed Oct 14 03:43:05 1998 Guido van Rossum
-
- * Debugger.py, PyShell.py: Polish the Debugger GUI a bit.
- Closing it now also does the right thing.
-
-Tue Oct 13 23:51:13 1998 Guido van Rossum
-
- * Debugger.py, PyShell.py, Bindings.py:
- Ad primitive debugger interface (so far it will step and show you the
- source, but it doesn't yet show the stack).
-
- * Attic/README: Misc
-
- * StackViewer.py: Whoops -- referenced self.top before it was set.
-
- * help.txt: Added history and completion commands.
-
- * help.txt: Updated
-
- * FileList.py: Add class browser functionality.
-
- * StackViewer.py:
- Add a close() method and bind to WM_DELETE_WINDOW protocol
-
- * PyShell.py: Clear the linecache before printing a traceback
-
- * Bindings.py: Added class browser binding.
-
- * ClassBrowser.py: Much improved, much left to do.
-
- * PyShell.py: Make the return key do what I mean more often.
-
- * ClassBrowser.py:
- Adding the beginnings of a Class browser. Incomplete, yet.
-
- * EditorWindow.py, Bindings.py:
- Add new command, "Open module". You select or type a module name,
- and it opens the source.
-
-Mon Oct 12 23:59:27 1998 Guido van Rossum
-
- * PyShell.py: Subsume functionality from Popup menu in Debug menu.
- Other stuff so the PyShell window can be resurrected from the Windows menu.
-
- * FileList.py: Get rid of PopUp menu.
- Create a simple Windows menu. (Imperfect when Untitled windows exist.)
- Add wakeup() method: deiconify, raise, focus.
-
- * EditorWindow.py: Generalize menu creation.
-
- * Bindings.py: Add Debug and Help menu items.
-
- * EditorWindow.py: Added a menu bar to every window.
-
- * Bindings.py: Add menu configuration to the event configuration.
-
- * Attic/PopupMenu.py: Pass a root to the help window.
-
- * SearchBinding.py:
- Add parent argument to 'to to line number' dialog box.
-
-Sat Oct 10 19:15:32 1998 Guido van Rossum
-
- * StackViewer.py:
- Add a label at the top showing (very basic) help for the stack viewer.
- Add a label at the bottom showing the exception info.
-
- * Attic/test.py, Attic/idle: Add Unix main script and test program.
-
- * idle.pyw, help.txt, WidgetRedirector.py, UndoDelegator.py, StackViewer.py, SearchBinding.py, Attic/README, PyShell.py, Attic/PopupMenu.py, Percolator.py, Outline.py, IOBinding.py, History.py, Attic/HelpWindow.py, FrameViewer.py, FileList.py, EditorWindow.py, Delegator.py, ColorDelegator.py, Bindings.py, AutoIndent.py, AutoExpand.py:
- Initial checking of Tk-based Python IDE.
- Features: text editor with syntax coloring and undo;
- subclassed into interactive Python shell which adds history.
-
diff --git a/Lib/idlelib/ClassBrowser.py b/Lib/idlelib/ClassBrowser.py
deleted file mode 100644
index 19f3b7e600..0000000000
--- a/Lib/idlelib/ClassBrowser.py
+++ /dev/null
@@ -1,224 +0,0 @@
-"""Class browser.
-
-XXX TO DO:
-
-- reparse when source changed (maybe just a button would be OK?)
- (or recheck on window popup)
-- add popup menu with more options (e.g. doc strings, base classes, imports)
-- show function argument list? (have to do pattern matching on source)
-- should the classes and methods lists also be in the module's menu bar?
-- add base classes to class browser tree
-"""
-
-import os
-import sys
-import string
-import pyclbr
-
-# XXX Patch pyclbr with dummies if it's vintage Python 1.5.2:
-if not hasattr(pyclbr, "readmodule_ex"):
- pyclbr.readmodule_ex = pyclbr.readmodule
-if not hasattr(pyclbr, "Function"):
- class Function(pyclbr.Class):
- pass
- pyclbr.Function = Function
-
-import PyShell
-from WindowList import ListedToplevel
-from TreeWidget import TreeNode, TreeItem, ScrolledCanvas
-
-class ClassBrowser:
-
- def __init__(self, flist, name, path):
- # XXX This API should change, if the file doesn't end in ".py"
- # XXX the code here is bogus!
- self.name = name
- self.file = os.path.join(path[0], self.name + ".py")
- self.init(flist)
-
- def close(self, event=None):
- self.top.destroy()
- self.node.destroy()
-
- def init(self, flist):
- self.flist = flist
- # reset pyclbr
- pyclbr._modules.clear()
- # create top
- self.top = top = ListedToplevel(flist.root)
- top.protocol("WM_DELETE_WINDOW", self.close)
- top.bind("", self.close)
- self.settitle()
- top.focus_set()
- # create scrolled canvas
- sc = ScrolledCanvas(top, bg="white", highlightthickness=0, takefocus=1)
- sc.frame.pack(expand=1, fill="both")
- item = self.rootnode()
- self.node = node = TreeNode(sc.canvas, None, item)
- node.update()
- node.expand()
-
- def settitle(self):
- self.top.wm_title("Class Browser - " + self.name)
- self.top.wm_iconname("Class Browser")
-
- def rootnode(self):
- return ModuleBrowserTreeItem(self.file)
-
-class ModuleBrowserTreeItem(TreeItem):
-
- def __init__(self, file):
- self.file = file
-
- def GetText(self):
- return os.path.basename(self.file)
-
- def GetIconName(self):
- return "python"
-
- def GetSubList(self):
- sublist = []
- for name in self.listclasses():
- item = ClassBrowserTreeItem(name, self.classes, self.file)
- sublist.append(item)
- return sublist
-
- def OnDoubleClick(self):
- if os.path.normcase(self.file[-3:]) != ".py":
- return
- if not os.path.exists(self.file):
- return
- PyShell.flist.open(self.file)
-
- def IsExpandable(self):
- return os.path.normcase(self.file[-3:]) == ".py"
-
- def listclasses(self):
- dir, file = os.path.split(self.file)
- name, ext = os.path.splitext(file)
- if os.path.normcase(ext) != ".py":
- return []
- try:
- dict = pyclbr.readmodule_ex(name, [dir] + sys.path)
- except ImportError, msg:
- return []
- items = []
- self.classes = {}
- for key, cl in dict.items():
- if cl.module == name:
- s = key
- if cl.super:
- supers = []
- for sup in cl.super:
- if type(sup) is type(''):
- sname = sup
- else:
- sname = sup.name
- if sup.module != cl.module:
- sname = "%s.%s" % (sup.module, sname)
- supers.append(sname)
- s = s + "(%s)" % string.join(supers, ", ")
- items.append((cl.lineno, s))
- self.classes[s] = cl
- items.sort()
- list = []
- for item, s in items:
- list.append(s)
- return list
-
-class ClassBrowserTreeItem(TreeItem):
-
- def __init__(self, name, classes, file):
- self.name = name
- self.classes = classes
- self.file = file
- try:
- self.cl = self.classes[self.name]
- except (IndexError, KeyError):
- self.cl = None
- self.isfunction = isinstance(self.cl, pyclbr.Function)
-
- def GetText(self):
- if self.isfunction:
- return "def " + self.name + "(...)"
- else:
- return "class " + self.name
-
- def GetIconName(self):
- if self.isfunction:
- return "python"
- else:
- return "folder"
-
- def IsExpandable(self):
- if self.cl:
- return not not self.cl.methods
-
- def GetSubList(self):
- if not self.cl:
- return []
- sublist = []
- for name in self.listmethods():
- item = MethodBrowserTreeItem(name, self.cl, self.file)
- sublist.append(item)
- return sublist
-
- def OnDoubleClick(self):
- if not os.path.exists(self.file):
- return
- edit = PyShell.flist.open(self.file)
- if hasattr(self.cl, 'lineno'):
- lineno = self.cl.lineno
- edit.gotoline(lineno)
-
- def listmethods(self):
- if not self.cl:
- return []
- items = []
- for name, lineno in self.cl.methods.items():
- items.append((lineno, name))
- items.sort()
- list = []
- for item, name in items:
- list.append(name)
- return list
-
-class MethodBrowserTreeItem(TreeItem):
-
- def __init__(self, name, cl, file):
- self.name = name
- self.cl = cl
- self.file = file
-
- def GetText(self):
- return "def " + self.name + "(...)"
-
- def GetIconName(self):
- return "python" # XXX
-
- def IsExpandable(self):
- return 0
-
- def OnDoubleClick(self):
- if not os.path.exists(self.file):
- return
- edit = PyShell.flist.open(self.file)
- edit.gotoline(self.cl.methods[self.name])
-
-def main():
- try:
- file = __file__
- except NameError:
- file = sys.argv[0]
- if sys.argv[1:]:
- file = sys.argv[1]
- else:
- file = sys.argv[0]
- dir, file = os.path.split(file)
- name = os.path.splitext(file)[0]
- ClassBrowser(PyShell.flist, name, [dir])
- if sys.stdin is sys.__stdin__:
- mainloop()
-
-if __name__ == "__main__":
- main()
diff --git a/Lib/idlelib/ColorDelegator.py b/Lib/idlelib/ColorDelegator.py
deleted file mode 100644
index 3d2ecefe97..0000000000
--- a/Lib/idlelib/ColorDelegator.py
+++ /dev/null
@@ -1,247 +0,0 @@
-import time
-import string
-import re
-import keyword
-from Tkinter import *
-from Delegator import Delegator
-from IdleConf import idleconf
-
-#$ event <>
-#$ win
-#$ unix
-
-DEBUG = 0
-
-
-def any(name, list):
- return "(?P<%s>" % name + string.join(list, "|") + ")"
-
-def make_pat():
- kw = r"\b" + any("KEYWORD", keyword.kwlist) + r"\b"
- comment = any("COMMENT", [r"#[^\n]*"])
- sqstring = r"(\b[rR])?'[^'\\\n]*(\\.[^'\\\n]*)*'?"
- dqstring = r'(\b[rR])?"[^"\\\n]*(\\.[^"\\\n]*)*"?'
- sq3string = r"(\b[rR])?'''[^'\\]*((\\.|'(?!''))[^'\\]*)*(''')?"
- dq3string = r'(\b[rR])?"""[^"\\]*((\\.|"(?!""))[^"\\]*)*(""")?'
- string = any("STRING", [sq3string, dq3string, sqstring, dqstring])
- return kw + "|" + comment + "|" + string + "|" + any("SYNC", [r"\n"])
-
-prog = re.compile(make_pat(), re.S)
-idprog = re.compile(r"\s+(\w+)", re.S)
-asprog = re.compile(r".*?\b(as)\b", re.S)
-
-class ColorDelegator(Delegator):
-
- def __init__(self):
- Delegator.__init__(self)
- self.prog = prog
- self.idprog = idprog
- self.asprog = asprog
-
- def setdelegate(self, delegate):
- if self.delegate is not None:
- self.unbind("<>")
- Delegator.setdelegate(self, delegate)
- if delegate is not None:
- self.config_colors()
- self.bind("<>", self.toggle_colorize_event)
- self.notify_range("1.0", "end")
-
- def config_colors(self):
- for tag, cnf in self.tagdefs.items():
- if cnf:
- apply(self.tag_configure, (tag,), cnf)
- self.tag_raise('sel')
-
- cconf = idleconf.getsection('Colors')
-
- tagdefs = {
- "COMMENT": cconf.getcolor("comment"),
- "KEYWORD": cconf.getcolor("keyword"),
- "STRING": cconf.getcolor("string"),
- "DEFINITION": cconf.getcolor("definition"),
- "SYNC": cconf.getcolor("sync"),
- "TODO": cconf.getcolor("todo"),
- "BREAK": cconf.getcolor("break"),
- # The following is used by ReplaceDialog:
- "hit": cconf.getcolor("hit"),
- }
-
- def insert(self, index, chars, tags=None):
- index = self.index(index)
- self.delegate.insert(index, chars, tags)
- self.notify_range(index, index + "+%dc" % len(chars))
-
- def delete(self, index1, index2=None):
- index1 = self.index(index1)
- self.delegate.delete(index1, index2)
- self.notify_range(index1)
-
- after_id = None
- allow_colorizing = 1
- colorizing = 0
-
- def notify_range(self, index1, index2=None):
- self.tag_add("TODO", index1, index2)
- if self.after_id:
- if DEBUG: print "colorizing already scheduled"
- return
- if self.colorizing:
- self.stop_colorizing = 1
- if DEBUG: print "stop colorizing"
- if self.allow_colorizing:
- if DEBUG: print "schedule colorizing"
- self.after_id = self.after(1, self.recolorize)
-
- close_when_done = None # Window to be closed when done colorizing
-
- def close(self, close_when_done=None):
- if self.after_id:
- after_id = self.after_id
- self.after_id = None
- if DEBUG: print "cancel scheduled recolorizer"
- self.after_cancel(after_id)
- self.allow_colorizing = 0
- self.stop_colorizing = 1
- if close_when_done:
- if not self.colorizing:
- close_when_done.destroy()
- else:
- self.close_when_done = close_when_done
-
- def toggle_colorize_event(self, event):
- if self.after_id:
- after_id = self.after_id
- self.after_id = None
- if DEBUG: print "cancel scheduled recolorizer"
- self.after_cancel(after_id)
- if self.allow_colorizing and self.colorizing:
- if DEBUG: print "stop colorizing"
- self.stop_colorizing = 1
- self.allow_colorizing = not self.allow_colorizing
- if self.allow_colorizing and not self.colorizing:
- self.after_id = self.after(1, self.recolorize)
- if DEBUG:
- print "auto colorizing turned", self.allow_colorizing and "on" or "off"
- return "break"
-
- def recolorize(self):
- self.after_id = None
- if not self.delegate:
- if DEBUG: print "no delegate"
- return
- if not self.allow_colorizing:
- if DEBUG: print "auto colorizing is off"
- return
- if self.colorizing:
- if DEBUG: print "already colorizing"
- return
- try:
- self.stop_colorizing = 0
- self.colorizing = 1
- if DEBUG: print "colorizing..."
- t0 = time.clock()
- self.recolorize_main()
- t1 = time.clock()
- if DEBUG: print "%.3f seconds" % (t1-t0)
- finally:
- self.colorizing = 0
- if self.allow_colorizing and self.tag_nextrange("TODO", "1.0"):
- if DEBUG: print "reschedule colorizing"
- self.after_id = self.after(1, self.recolorize)
- if self.close_when_done:
- top = self.close_when_done
- self.close_when_done = None
- top.destroy()
-
- def recolorize_main(self):
- next = "1.0"
- while 1:
- item = self.tag_nextrange("TODO", next)
- if not item:
- break
- head, tail = item
- self.tag_remove("SYNC", head, tail)
- item = self.tag_prevrange("SYNC", head)
- if item:
- head = item[1]
- else:
- head = "1.0"
-
- chars = ""
- next = head
- lines_to_get = 1
- ok = 0
- while not ok:
- mark = next
- next = self.index(mark + "+%d lines linestart" %
- lines_to_get)
- lines_to_get = min(lines_to_get * 2, 100)
- ok = "SYNC" in self.tag_names(next + "-1c")
- line = self.get(mark, next)
- ##print head, "get", mark, next, "->", `line`
- if not line:
- return
- for tag in self.tagdefs.keys():
- self.tag_remove(tag, mark, next)
- chars = chars + line
- m = self.prog.search(chars)
- while m:
- for key, value in m.groupdict().items():
- if value:
- a, b = m.span(key)
- self.tag_add(key,
- head + "+%dc" % a,
- head + "+%dc" % b)
- if value in ("def", "class"):
- m1 = self.idprog.match(chars, b)
- if m1:
- a, b = m1.span(1)
- self.tag_add("DEFINITION",
- head + "+%dc" % a,
- head + "+%dc" % b)
- elif value == "import":
- # color all the "as" words on same line;
- # cheap approximation to the truth
- while 1:
- m1 = self.asprog.match(chars, b)
- if not m1:
- break
- a, b = m1.span(1)
- self.tag_add("KEYWORD",
- head + "+%dc" % a,
- head + "+%dc" % b)
- m = self.prog.search(chars, m.end())
- if "SYNC" in self.tag_names(next + "-1c"):
- head = next
- chars = ""
- else:
- ok = 0
- if not ok:
- # We're in an inconsistent state, and the call to
- # update may tell us to stop. It may also change
- # the correct value for "next" (since this is a
- # line.col string, not a true mark). So leave a
- # crumb telling the next invocation to resume here
- # in case update tells us to leave.
- self.tag_add("TODO", next)
- self.update()
- if self.stop_colorizing:
- if DEBUG: print "colorizing stopped"
- return
-
-
-def main():
- from Percolator import Percolator
- root = Tk()
- root.wm_protocol("WM_DELETE_WINDOW", root.quit)
- text = Text(background="white")
- text.pack(expand=1, fill="both")
- text.focus_set()
- p = Percolator(text)
- d = ColorDelegator()
- p.insertfilter(d)
- root.mainloop()
-
-if __name__ == "__main__":
- main()
diff --git a/Lib/idlelib/Debugger.py b/Lib/idlelib/Debugger.py
deleted file mode 100644
index e4591ff6df..0000000000
--- a/Lib/idlelib/Debugger.py
+++ /dev/null
@@ -1,308 +0,0 @@
-import os
-import bdb
-import traceback
-from Tkinter import *
-from WindowList import ListedToplevel
-
-import StackViewer
-
-
-class Debugger(bdb.Bdb):
-
- interacting = 0
-
- vstack = vsource = vlocals = vglobals = None
-
- def __init__(self, pyshell):
- bdb.Bdb.__init__(self)
- self.pyshell = pyshell
- self.make_gui()
-
- def canonic(self, filename):
- # Canonicalize filename -- called by Bdb
- return os.path.normcase(os.path.abspath(filename))
-
- def close(self, event=None):
- if self.interacting:
- self.top.bell()
- return
- if self.stackviewer:
- self.stackviewer.close(); self.stackviewer = None
- self.pyshell.close_debugger()
- self.top.destroy()
-
- def run(self, *args):
- try:
- self.interacting = 1
- return apply(bdb.Bdb.run, (self,) + args)
- finally:
- self.interacting = 0
-
- def user_line(self, frame):
- self.interaction(frame)
-
- def user_return(self, frame, rv):
- # XXX show rv?
- ##self.interaction(frame)
- pass
-
- def user_exception(self, frame, info):
- self.interaction(frame, info)
-
- def make_gui(self):
- pyshell = self.pyshell
- self.flist = pyshell.flist
- self.root = root = pyshell.root
- self.top = top =ListedToplevel(root)
- self.top.wm_title("Debug Control")
- self.top.wm_iconname("Debug")
- top.wm_protocol("WM_DELETE_WINDOW", self.close)
- self.top.bind("", self.close)
- #
- self.bframe = bframe = Frame(top)
- self.bframe.pack(anchor="w")
- self.buttons = bl = []
- #
- self.bcont = b = Button(bframe, text="Go", command=self.cont)
- bl.append(b)
- self.bstep = b = Button(bframe, text="Step", command=self.step)
- bl.append(b)
- self.bnext = b = Button(bframe, text="Over", command=self.next)
- bl.append(b)
- self.bret = b = Button(bframe, text="Out", command=self.ret)
- bl.append(b)
- self.bret = b = Button(bframe, text="Quit", command=self.quit)
- bl.append(b)
- #
- for b in bl:
- b.configure(state="disabled")
- b.pack(side="left")
- #
- self.cframe = cframe = Frame(bframe)
- self.cframe.pack(side="left")
- #
- if not self.vstack:
- self.__class__.vstack = BooleanVar(top)
- self.vstack.set(1)
- self.bstack = Checkbutton(cframe,
- text="Stack", command=self.show_stack, variable=self.vstack)
- self.bstack.grid(row=0, column=0)
- if not self.vsource:
- self.__class__.vsource = BooleanVar(top)
- ##self.vsource.set(1)
- self.bsource = Checkbutton(cframe,
- text="Source", command=self.show_source, variable=self.vsource)
- self.bsource.grid(row=0, column=1)
- if not self.vlocals:
- self.__class__.vlocals = BooleanVar(top)
- self.vlocals.set(1)
- self.blocals = Checkbutton(cframe,
- text="Locals", command=self.show_locals, variable=self.vlocals)
- self.blocals.grid(row=1, column=0)
- if not self.vglobals:
- self.__class__.vglobals = BooleanVar(top)
- ##self.vglobals.set(1)
- self.bglobals = Checkbutton(cframe,
- text="Globals", command=self.show_globals, variable=self.vglobals)
- self.bglobals.grid(row=1, column=1)
- #
- self.status = Label(top, anchor="w")
- self.status.pack(anchor="w")
- self.error = Label(top, anchor="w")
- self.error.pack(anchor="w", fill="x")
- self.errorbg = self.error.cget("background")
- #
- self.fstack = Frame(top, height=1)
- self.fstack.pack(expand=1, fill="both")
- self.flocals = Frame(top)
- self.flocals.pack(expand=1, fill="both")
- self.fglobals = Frame(top, height=1)
- self.fglobals.pack(expand=1, fill="both")
- #
- if self.vstack.get():
- self.show_stack()
- if self.vlocals.get():
- self.show_locals()
- if self.vglobals.get():
- self.show_globals()
-
- frame = None
-
- def interaction(self, frame, info=None):
- self.frame = frame
- code = frame.f_code
- file = code.co_filename
- base = os.path.basename(file)
- lineno = frame.f_lineno
- #
- message = "%s:%s" % (base, lineno)
- if code.co_name != "?":
- message = "%s: %s()" % (message, code.co_name)
- self.status.configure(text=message)
- #
- if info:
- type, value, tb = info
- try:
- m1 = type.__name__
- except AttributeError:
- m1 = "%s" % str(type)
- if value is not None:
- try:
- m1 = "%s: %s" % (m1, str(value))
- except:
- pass
- bg = "yellow"
- else:
- m1 = ""
- tb = None
- bg = self.errorbg
- self.error.configure(text=m1, background=bg)
- #
- sv = self.stackviewer
- if sv:
- stack, i = self.get_stack(self.frame, tb)
- sv.load_stack(stack, i)
- #
- self.show_variables(1)
- #
- if self.vsource.get():
- self.sync_source_line()
- #
- for b in self.buttons:
- b.configure(state="normal")
- #
- self.top.tkraise()
- self.root.mainloop()
- #
- for b in self.buttons:
- b.configure(state="disabled")
- self.status.configure(text="")
- self.error.configure(text="", background=self.errorbg)
- self.frame = None
-
- def sync_source_line(self):
- frame = self.frame
- if not frame:
- return
- code = frame.f_code
- file = code.co_filename
- lineno = frame.f_lineno
- if file[:1] + file[-1:] != "<>" and os.path.exists(file):
- edit = self.flist.open(file)
- if edit:
- edit.gotoline(lineno)
-
- def cont(self):
- self.set_continue()
- self.root.quit()
-
- def step(self):
- self.set_step()
- self.root.quit()
-
- def next(self):
- self.set_next(self.frame)
- self.root.quit()
-
- def ret(self):
- self.set_return(self.frame)
- self.root.quit()
-
- def quit(self):
- self.set_quit()
- self.root.quit()
-
- stackviewer = None
-
- def show_stack(self):
- if not self.stackviewer and self.vstack.get():
- self.stackviewer = sv = StackViewer.StackViewer(
- self.fstack, self.flist, self)
- if self.frame:
- stack, i = self.get_stack(self.frame, None)
- sv.load_stack(stack, i)
- else:
- sv = self.stackviewer
- if sv and not self.vstack.get():
- self.stackviewer = None
- sv.close()
- self.fstack['height'] = 1
-
- def show_source(self):
- if self.vsource.get():
- self.sync_source_line()
-
- def show_frame(self, (frame, lineno)):
- self.frame = frame
- self.show_variables()
-
- localsviewer = None
- globalsviewer = None
-
- def show_locals(self):
- lv = self.localsviewer
- if self.vlocals.get():
- if not lv:
- self.localsviewer = StackViewer.NamespaceViewer(
- self.flocals, "Locals")
- else:
- if lv:
- self.localsviewer = None
- lv.close()
- self.flocals['height'] = 1
- self.show_variables()
-
- def show_globals(self):
- gv = self.globalsviewer
- if self.vglobals.get():
- if not gv:
- self.globalsviewer = StackViewer.NamespaceViewer(
- self.fglobals, "Globals")
- else:
- if gv:
- self.globalsviewer = None
- gv.close()
- self.fglobals['height'] = 1
- self.show_variables()
-
- def show_variables(self, force=0):
- lv = self.localsviewer
- gv = self.globalsviewer
- frame = self.frame
- if not frame:
- ldict = gdict = None
- else:
- ldict = frame.f_locals
- gdict = frame.f_globals
- if lv and gv and ldict is gdict:
- ldict = None
- if lv:
- lv.load_dict(ldict, force)
- if gv:
- gv.load_dict(gdict, force)
-
- def set_breakpoint_here(self, edit):
- text = edit.text
- filename = edit.io.filename
- if not filename:
- text.bell()
- return
- lineno = int(float(text.index("insert")))
- msg = self.set_break(filename, lineno)
- if msg:
- text.bell()
- return
- text.tag_add("BREAK", "insert linestart", "insert lineend +1char")
-
- # A literal copy of Bdb.set_break() without the print statement at the end
- def set_break(self, filename, lineno, temporary=0, cond = None):
- import linecache # Import as late as possible
- line = linecache.getline(filename, lineno)
- if not line:
- return 'That line does not exist!'
- if not self.breaks.has_key(filename):
- self.breaks[filename] = []
- list = self.breaks[filename]
- if not lineno in list:
- list.append(lineno)
- bp = bdb.Breakpoint(filename, lineno, temporary, cond)
diff --git a/Lib/idlelib/Delegator.py b/Lib/idlelib/Delegator.py
deleted file mode 100644
index 6125591fe0..0000000000
--- a/Lib/idlelib/Delegator.py
+++ /dev/null
@@ -1,33 +0,0 @@
-class Delegator:
-
- # The cache is only used to be able to change delegates!
-
- def __init__(self, delegate=None):
- self.delegate = delegate
- self.__cache = {}
-
- def __getattr__(self, name):
- attr = getattr(self.delegate, name) # May raise AttributeError
- setattr(self, name, attr)
- self.__cache[name] = attr
- return attr
-
- def resetcache(self):
- for key in self.__cache.keys():
- try:
- delattr(self, key)
- except AttributeError:
- pass
- self.__cache.clear()
-
- def cachereport(self):
- keys = self.__cache.keys()
- keys.sort()
- print keys
-
- def setdelegate(self, delegate):
- self.resetcache()
- self.delegate = delegate
-
- def getdelegate(self):
- return self.delegate
diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py
deleted file mode 100644
index 52aa399916..0000000000
--- a/Lib/idlelib/EditorWindow.py
+++ /dev/null
@@ -1,728 +0,0 @@
-# changes by dscherer@cmu.edu
-# - created format and run menus
-# - added silly advice dialog (apologies to Douglas Adams)
-# - made Python Documentation work on Windows (requires win32api to
-# do a ShellExecute(); other ways of starting a web browser are awkward)
-
-import sys
-import os
-import string
-import re
-import imp
-from Tkinter import *
-import tkSimpleDialog
-import tkMessageBox
-
-import webbrowser
-import idlever
-import WindowList
-from IdleConf import idleconf
-import aboutDialog, textView
-
-# The default tab setting for a Text widget, in average-width characters.
-TK_TABWIDTH_DEFAULT = 8
-
-# File menu
-
-#$ event <>
-#$ win
-#$ unix
-
-#$ event <>
-#$ win
-#$ unix
-
-#$ event <>
-
-#$ event <>
-
-#$ unix
-#$ unix
-#$ win
-
-# Edit menu
-
-#$ event <>
-#$ win
-#$ unix
-
-#$ event <>
-#$ win
-#$ unix
-
-#$ event <>
-#$ win
-#$ unix
-
-#$ event <>
-#$ win
-#$ unix
-
-# Help menu
-
-#$ event <>
-#$ win
-#$ unix
-
-#$ event <>
-
-# Events without menu entries
-
-#$ event <>
-#$ win
-
-#$ event <>
-#$ win
-#$ unix
-
-#$ event <