[Python-checkins] CVS: python/dist/src/Lib httplib.py,1.13,1.14 mailbox.py,1.17,1.18 mimetypes.py,1.10,1.11 rfc822.py,1.45,1.46 shelve.py,1.12,1.13 stringold.py,1.43,1.44 urllib2.py,1.2,1.3 whichdb.py,1.5,1.6

Fred L. Drake fdrake@weyr.cnri.reston.va.us
Thu, 10 Feb 2000 12:17:17 -0500 (EST)


Update of /projects/cvsroot/python/dist/src/Lib
In directory weyr:/home/fdrake/projects/python/Lib

Modified Files:
	httplib.py mailbox.py mimetypes.py rfc822.py shelve.py 
	stringold.py urllib2.py whichdb.py 
Log Message:
Untabify to pass the -tt test.

Index: httplib.py
===================================================================
RCS file: /projects/cvsroot/python/dist/src/Lib/httplib.py,v
retrieving revision 1.13
retrieving revision 1.14
diff -C2 -r1.13 -r1.14
*** httplib.py	1999/12/07 21:35:20	1.13
--- httplib.py	2000/02/10 17:17:13	1.14
***************
*** 45,69 ****
  class FakeSocket:
      def __init__(self, sock, ssl):
! 	self.__sock = sock
! 	self.__ssl = ssl
! 	return
  
!     def makefile(self, mode):		# hopefully, never have to write
! 	msgbuf = ""
! 	while 1:
! 	    try:
! 		msgbuf = msgbuf + self.__ssl.read()
! 	    except socket.sslerror, msg:
! 		break
! 	return StringIO(msgbuf)
  
      def send(self, stuff, flags = 0):
! 	return self.__ssl.write(stuff)
  
      def recv(self, len = 1024, flags = 0):
! 	return self.__ssl.read(len)
  
      def __getattr__(self, attr):
! 	return getattr(self.__sock, attr)
  
  class HTTP:
--- 45,69 ----
  class FakeSocket:
      def __init__(self, sock, ssl):
!         self.__sock = sock
!         self.__ssl = ssl
!         return
  
!     def makefile(self, mode):           # hopefully, never have to write
!         msgbuf = ""
!         while 1:
!             try:
!                 msgbuf = msgbuf + self.__ssl.read()
!             except socket.sslerror, msg:
!                 break
!         return StringIO(msgbuf)
  
      def send(self, stuff, flags = 0):
!         return self.__ssl.write(stuff)
  
      def recv(self, len = 1024, flags = 0):
!         return self.__ssl.read(len)
  
      def __getattr__(self, attr):
!         return getattr(self.__sock, attr)
  
  class HTTP:

Index: mailbox.py
===================================================================
RCS file: /projects/cvsroot/python/dist/src/Lib/mailbox.py,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -r1.17 -r1.18
*** mailbox.py	1999/12/14 22:18:37	1.17
--- mailbox.py	2000/02/10 17:17:13	1.18
***************
*** 9,276 ****
  class _Mailbox:
  
! 	def __init__(self, fp):
! 		self.fp = fp
! 		self.seekp = 0
! 
! 	def seek(self, pos, whence=0):
! 		if whence==1:		# Relative to current position
! 			self.pos = self.pos + pos
! 		if whence==2:		# Relative to file's end
! 			self.pos = self.stop + pos
! 		else:			# Default - absolute position
! 			self.pos = self.start + pos
! 
! 	def next(self):
! 		while 1:
! 			self.fp.seek(self.seekp)
! 			try:
! 				self._search_start()
! 			except EOFError:
! 				self.seekp = self.fp.tell()
! 				return None
! 			start = self.fp.tell()
! 			self._search_end()
! 			self.seekp = stop = self.fp.tell()
! 			if start <> stop:
! 				break
! 		return rfc822.Message(_Subfile(self.fp, start, stop))
  
  class _Subfile:
  
! 	def __init__(self, fp, start, stop):
! 		self.fp = fp
! 		self.start = start
! 		self.stop = stop
! 		self.pos = self.start
! 
! 	def read(self, length = None):
! 		if self.pos >= self.stop:
! 			return ''
! 		remaining = self.stop - self.pos
! 		if length is None or length < 0:
! 			length = remaining
! 		elif length > remaining:
! 			length = remaining
! 		self.fp.seek(self.pos)
! 		data = self.fp.read(length)
! 		self.pos = self.fp.tell()
! 		return data
! 
! 	def readline(self, length = None):
! 		if self.pos >= self.stop:
! 			return ''
! 		if length is None:
! 			length = self.stop - self.pos
! 		self.fp.seek(self.pos)
! 		data = self.fp.readline(length)
! 		self.pos = self.fp.tell()
! 		return data
  
          def readlines(self, sizehint = -1):
! 		lines = []
! 		while 1:
! 			line = self.readline()
! 			if not line:
! 				break
! 			lines.append(line)
! 			if sizehint >= 0:
! 				sizehint = sizehint - len(line)
! 				if sizehint <= 0:
! 					break
! 		return lines
! 
! 	def tell(self):
! 		return self.pos - self.start
! 
! 	def seek(self, pos, whence=0):
! 		if whence == 0:
! 			self.pos = self.start + pos
! 		elif whence == 1:
! 			self.pos = self.pos + pos
! 		elif whence == 2:
! 			self.pos = self.stop + pos
  
! 	def close(self):
! 		del self.fp
  
  class UnixMailbox(_Mailbox):
  
! 	def _search_start(self):
! 		while 1:
! 			line = self.fp.readline()
! 			if not line:
! 				raise EOFError
! 			if line[:5] == 'From ' and self._isrealfromline(line):
! 				return
! 
! 	def _search_end(self):
! 		while 1:
! 			pos = self.fp.tell()
! 			line = self.fp.readline()
! 			if not line:
! 				return
! 			if line[:5] == 'From ' and self._isrealfromline(line):
! 				self.fp.seek(pos)
! 				return
! 
! 	# An overridable mechanism to test for From-line-ness.
! 	# You can either specify a different regular expression
! 	# or define a whole new _isrealfromline() method.
! 	# Note that this only gets called for lines starting with
! 	# the 5 characters "From ".
! 
! 	_fromlinepattern = r"From \s*[^\s]+\s+\w\w\w\s+\w\w\w\s+\d?\d\s+" \
! 			   r"\d?\d:\d\d(:\d\d)?(\s+[^\s]+)?\s+\d\d\d\d\s*$"
! 	_regexp = None
! 
! 	def _isrealfromline(self, line):
! 		if not self._regexp:
! 			import re
! 			self._regexp = re.compile(self._fromlinepattern)
! 		return self._regexp.match(line)
  
  class MmdfMailbox(_Mailbox):
  
! 	def _search_start(self):
! 		while 1:
! 			line = self.fp.readline()
! 			if not line:
! 				raise EOFError
! 			if line[:5] == '\001\001\001\001\n':
! 				return
! 
! 	def _search_end(self):
! 		while 1:
! 			pos = self.fp.tell()
! 			line = self.fp.readline()
! 			if not line:
! 				return
! 			if line == '\001\001\001\001\n':
! 				self.fp.seek(pos)
! 				return
  
  class MHMailbox:
  
! 	def __init__(self, dirname):
! 		import re
! 		pat = re.compile('^[0-9][0-9]*$')
! 		self.dirname = dirname
! 		files = os.listdir(self.dirname)
! 		self.boxes = []
! 		for f in files:
! 			if pat.match(f):
! 				self.boxes.append(f)
! 
! 	def next(self):
! 		if not self.boxes:
! 			return None
! 		fn = self.boxes[0]
! 		del self.boxes[0]
! 		fp = open(os.path.join(self.dirname, fn))
! 		return rfc822.Message(fp)
  
  class Maildir:
  
! 	# Qmail directory mailbox
  
! 	def __init__(self, dirname):
! 		import string
! 		self.dirname = dirname
! 		self.boxes = []
! 
! 		# check for new mail
! 		newdir = os.path.join(self.dirname, 'new')
! 		for file in os.listdir(newdir):
! 			if len(string.split(file, '.')) > 2:
! 				self.boxes.append(os.path.join(newdir, file))
! 
! 		# Now check for current mail in this maildir
! 		curdir = os.path.join(self.dirname, 'cur')
! 		for file in os.listdir(curdir):
! 			if len(string.split(file, '.')) > 2:
! 				self.boxes.append(os.path.join(curdir, file))
! 
! 	def next(self):
! 		if not self.boxes:
! 			return None
! 		fn = self.boxes[0]
! 		del self.boxes[0]
! 		fp = open(os.path.join(self.dirname, fn))
! 		return rfc822.Message(fp)
  
  class BabylMailbox(_Mailbox):
  
! 	def _search_start(self):
! 		while 1:
! 			line = self.fp.readline()
! 			if not line:
! 				raise EOFError
! 			if line == '*** EOOH ***\n':
! 				return
! 
! 	def _search_end(self):
! 		while 1:
! 			pos = self.fp.tell()
! 			line = self.fp.readline()
! 			if not line:
! 				return
! 			if line == '\037\014\n':
! 				self.fp.seek(pos)
! 				return
  
  
  def _test():
! 	import time
! 	import sys
! 	import string
! 	import os
! 
! 	args = sys.argv[1:]
! 	if not args:
! 		for key in 'MAILDIR', 'MAIL', 'LOGNAME', 'USER':
! 			if os.environ.has_key(key):
! 				mbox = os.environ[key]
! 				break
! 		else:
! 			print "$MAIL, $LOGNAME nor $USER set -- who are you?"
! 			return
! 	else:
! 		mbox = args[0]
! 	if mbox[:1] == '+':
! 		mbox = os.environ['HOME'] + '/Mail/' + mbox[1:]
! 	elif not '/' in mbox:
! 		mbox = '/usr/mail/' + mbox
! 	if os.path.isdir(mbox):
! 		if os.path.isdir(os.path.join(mbox, 'cur')):
! 			mb = Maildir(mbox)
! 		else:
! 			mb = MHMailbox(mbox)
! 	else:
! 		fp = open(mbox, 'r')
! 		mb = UnixMailbox(fp)
! 	
! 	msgs = []
! 	while 1:
! 		msg = mb.next()
! 		if msg is None:
! 			break
! 		msgs.append(msg)
! 		if len(args) <= 1:
! 			msg.fp = None
! 	if len(args) > 1:
! 		num = string.atoi(args[1])
! 		print 'Message %d body:'%num
! 		msg = msgs[num-1]
! 		msg.rewindbody()
! 		sys.stdout.write(msg.fp.read())
! 	else:
! 		print 'Mailbox',mbox,'has',len(msgs),'messages:'
! 		for msg in msgs:
! 			f = msg.getheader('from') or ""
! 			s = msg.getheader('subject') or ""
! 			d = msg.getheader('date') or ""
! 			print '%20.20s   %18.18s   %-30.30s'%(f, d[5:], s)
  
  
  if __name__ == '__main__':
! 	_test()
--- 9,276 ----
  class _Mailbox:
  
!         def __init__(self, fp):
!                 self.fp = fp
!                 self.seekp = 0
! 
!         def seek(self, pos, whence=0):
!                 if whence==1:           # Relative to current position
!                         self.pos = self.pos + pos
!                 if whence==2:           # Relative to file's end
!                         self.pos = self.stop + pos
!                 else:                   # Default - absolute position
!                         self.pos = self.start + pos
! 
!         def next(self):
!                 while 1:
!                         self.fp.seek(self.seekp)
!                         try:
!                                 self._search_start()
!                         except EOFError:
!                                 self.seekp = self.fp.tell()
!                                 return None
!                         start = self.fp.tell()
!                         self._search_end()
!                         self.seekp = stop = self.fp.tell()
!                         if start <> stop:
!                                 break
!                 return rfc822.Message(_Subfile(self.fp, start, stop))
  
  class _Subfile:
  
!         def __init__(self, fp, start, stop):
!                 self.fp = fp
!                 self.start = start
!                 self.stop = stop
!                 self.pos = self.start
! 
!         def read(self, length = None):
!                 if self.pos >= self.stop:
!                         return ''
!                 remaining = self.stop - self.pos
!                 if length is None or length < 0:
!                         length = remaining
!                 elif length > remaining:
!                         length = remaining
!                 self.fp.seek(self.pos)
!                 data = self.fp.read(length)
!                 self.pos = self.fp.tell()
!                 return data
! 
!         def readline(self, length = None):
!                 if self.pos >= self.stop:
!                         return ''
!                 if length is None:
!                         length = self.stop - self.pos
!                 self.fp.seek(self.pos)
!                 data = self.fp.readline(length)
!                 self.pos = self.fp.tell()
!                 return data
  
          def readlines(self, sizehint = -1):
!                 lines = []
!                 while 1:
!                         line = self.readline()
!                         if not line:
!                                 break
!                         lines.append(line)
!                         if sizehint >= 0:
!                                 sizehint = sizehint - len(line)
!                                 if sizehint <= 0:
!                                         break
!                 return lines
! 
!         def tell(self):
!                 return self.pos - self.start
! 
!         def seek(self, pos, whence=0):
!                 if whence == 0:
!                         self.pos = self.start + pos
!                 elif whence == 1:
!                         self.pos = self.pos + pos
!                 elif whence == 2:
!                         self.pos = self.stop + pos
  
!         def close(self):
!                 del self.fp
  
  class UnixMailbox(_Mailbox):
  
!         def _search_start(self):
!                 while 1:
!                         line = self.fp.readline()
!                         if not line:
!                                 raise EOFError
!                         if line[:5] == 'From ' and self._isrealfromline(line):
!                                 return
! 
!         def _search_end(self):
!                 while 1:
!                         pos = self.fp.tell()
!                         line = self.fp.readline()
!                         if not line:
!                                 return
!                         if line[:5] == 'From ' and self._isrealfromline(line):
!                                 self.fp.seek(pos)
!                                 return
! 
!         # An overridable mechanism to test for From-line-ness.
!         # You can either specify a different regular expression
!         # or define a whole new _isrealfromline() method.
!         # Note that this only gets called for lines starting with
!         # the 5 characters "From ".
! 
!         _fromlinepattern = r"From \s*[^\s]+\s+\w\w\w\s+\w\w\w\s+\d?\d\s+" \
!                            r"\d?\d:\d\d(:\d\d)?(\s+[^\s]+)?\s+\d\d\d\d\s*$"
!         _regexp = None
! 
!         def _isrealfromline(self, line):
!                 if not self._regexp:
!                         import re
!                         self._regexp = re.compile(self._fromlinepattern)
!                 return self._regexp.match(line)
  
  class MmdfMailbox(_Mailbox):
  
!         def _search_start(self):
!                 while 1:
!                         line = self.fp.readline()
!                         if not line:
!                                 raise EOFError
!                         if line[:5] == '\001\001\001\001\n':
!                                 return
! 
!         def _search_end(self):
!                 while 1:
!                         pos = self.fp.tell()
!                         line = self.fp.readline()
!                         if not line:
!                                 return
!                         if line == '\001\001\001\001\n':
!                                 self.fp.seek(pos)
!                                 return
  
  class MHMailbox:
  
!         def __init__(self, dirname):
!                 import re
!                 pat = re.compile('^[0-9][0-9]*$')
!                 self.dirname = dirname
!                 files = os.listdir(self.dirname)
!                 self.boxes = []
!                 for f in files:
!                         if pat.match(f):
!                                 self.boxes.append(f)
! 
!         def next(self):
!                 if not self.boxes:
!                         return None
!                 fn = self.boxes[0]
!                 del self.boxes[0]
!                 fp = open(os.path.join(self.dirname, fn))
!                 return rfc822.Message(fp)
  
  class Maildir:
  
!         # Qmail directory mailbox
  
!         def __init__(self, dirname):
!                 import string
!                 self.dirname = dirname
!                 self.boxes = []
! 
!                 # check for new mail
!                 newdir = os.path.join(self.dirname, 'new')
!                 for file in os.listdir(newdir):
!                         if len(string.split(file, '.')) > 2:
!                                 self.boxes.append(os.path.join(newdir, file))
! 
!                 # Now check for current mail in this maildir
!                 curdir = os.path.join(self.dirname, 'cur')
!                 for file in os.listdir(curdir):
!                         if len(string.split(file, '.')) > 2:
!                                 self.boxes.append(os.path.join(curdir, file))
! 
!         def next(self):
!                 if not self.boxes:
!                         return None
!                 fn = self.boxes[0]
!                 del self.boxes[0]
!                 fp = open(os.path.join(self.dirname, fn))
!                 return rfc822.Message(fp)
  
  class BabylMailbox(_Mailbox):
  
!         def _search_start(self):
!                 while 1:
!                         line = self.fp.readline()
!                         if not line:
!                                 raise EOFError
!                         if line == '*** EOOH ***\n':
!                                 return
! 
!         def _search_end(self):
!                 while 1:
!                         pos = self.fp.tell()
!                         line = self.fp.readline()
!                         if not line:
!                                 return
!                         if line == '\037\014\n':
!                                 self.fp.seek(pos)
!                                 return
  
  
  def _test():
!         import time
!         import sys
!         import string
!         import os
! 
!         args = sys.argv[1:]
!         if not args:
!                 for key in 'MAILDIR', 'MAIL', 'LOGNAME', 'USER':
!                         if os.environ.has_key(key):
!                                 mbox = os.environ[key]
!                                 break
!                 else:
!                         print "$MAIL, $LOGNAME nor $USER set -- who are you?"
!                         return
!         else:
!                 mbox = args[0]
!         if mbox[:1] == '+':
!                 mbox = os.environ['HOME'] + '/Mail/' + mbox[1:]
!         elif not '/' in mbox:
!                 mbox = '/usr/mail/' + mbox
!         if os.path.isdir(mbox):
!                 if os.path.isdir(os.path.join(mbox, 'cur')):
!                         mb = Maildir(mbox)
!                 else:
!                         mb = MHMailbox(mbox)
!         else:
!                 fp = open(mbox, 'r')
!                 mb = UnixMailbox(fp)
!         
!         msgs = []
!         while 1:
!                 msg = mb.next()
!                 if msg is None:
!                         break
!                 msgs.append(msg)
!                 if len(args) <= 1:
!                         msg.fp = None
!         if len(args) > 1:
!                 num = string.atoi(args[1])
!                 print 'Message %d body:'%num
!                 msg = msgs[num-1]
!                 msg.rewindbody()
!                 sys.stdout.write(msg.fp.read())
!         else:
!                 print 'Mailbox',mbox,'has',len(msgs),'messages:'
!                 for msg in msgs:
!                         f = msg.getheader('from') or ""
!                         s = msg.getheader('subject') or ""
!                         d = msg.getheader('date') or ""
!                         print '%20.20s   %18.18s   %-30.30s'%(f, d[5:], s)
  
  
  if __name__ == '__main__':
!         _test()

Index: mimetypes.py
===================================================================
RCS file: /projects/cvsroot/python/dist/src/Lib/mimetypes.py,v
retrieving revision 1.10
retrieving revision 1.11
diff -C2 -r1.10 -r1.11
*** mimetypes.py	1999/05/20 12:52:04	1.10
--- mimetypes.py	2000/02/10 17:17:13	1.11
***************
*** 31,36 ****
      "/usr/local/etc/httpd/conf/mime.types",
      "/usr/local/lib/netscape/mime.types",
!     "/usr/local/etc/httpd/conf/mime.types",	# Apache 1.2
!     "/usr/local/etc/mime.types",		# Apache 1.3
      ]
  
--- 31,36 ----
      "/usr/local/etc/httpd/conf/mime.types",
      "/usr/local/lib/netscape/mime.types",
!     "/usr/local/etc/httpd/conf/mime.types",     # Apache 1.2
!     "/usr/local/etc/mime.types",                # Apache 1.3
      ]
  
***************
*** 57,78 ****
      scheme, url = urllib.splittype(url)
      if scheme == 'data':
! 	# syntax of data URLs:
! 	# dataurl   := "data:" [ mediatype ] [ ";base64" ] "," data
! 	# mediatype := [ type "/" subtype ] *( ";" parameter )
! 	# data      := *urlchar
! 	# parameter := attribute "=" value
! 	# type/subtype defaults to "text/plain"
! 	comma = string.find(url, ',')
! 	if comma < 0:
! 	    # bad data URL
! 	    return None, None
! 	semi = string.find(url, ';', 0, comma)
! 	if semi >= 0:
! 	    type = url[:semi]
! 	else:
! 	    type = url[:comma]
! 	if '=' in type or '/' not in type:
! 	    type = 'text/plain'
! 	return type, None		# never compressed, so encoding is None
      base, ext = posixpath.splitext(url)
      while suffix_map.has_key(ext):
--- 57,78 ----
      scheme, url = urllib.splittype(url)
      if scheme == 'data':
!         # syntax of data URLs:
!         # dataurl   := "data:" [ mediatype ] [ ";base64" ] "," data
!         # mediatype := [ type "/" subtype ] *( ";" parameter )
!         # data      := *urlchar
!         # parameter := attribute "=" value
!         # type/subtype defaults to "text/plain"
!         comma = string.find(url, ',')
!         if comma < 0:
!             # bad data URL
!             return None, None
!         semi = string.find(url, ';', 0, comma)
!         if semi >= 0:
!             type = url[:semi]
!         else:
!             type = url[:comma]
!         if '=' in type or '/' not in type:
!             type = 'text/plain'
!         return type, None               # never compressed, so encoding is None
      base, ext = posixpath.splitext(url)
      while suffix_map.has_key(ext):

Index: rfc822.py
===================================================================
RCS file: /projects/cvsroot/python/dist/src/Lib/rfc822.py,v
retrieving revision 1.45
retrieving revision 1.46
diff -C2 -r1.45 -r1.46
*** rfc822.py	2000/01/17 14:11:04	1.45
--- rfc822.py	2000/02/10 17:17:14	1.46
***************
*** 333,341 ****
          raw = []
          for h in self.getallmatchingheaders(name):
! 	    if h[0] in ' \t':
! 	        raw.append(h)
! 	    else:
! 	        if raw:
! 		    raw.append(', ')
                  i = string.find(h, ':')
                  if i > 0:
--- 333,341 ----
          raw = []
          for h in self.getallmatchingheaders(name):
!             if h[0] in ' \t':
!                 raw.append(h)
!             else:
!                 if raw:
!                     raw.append(', ')
                  i = string.find(h, ':')
                  if i > 0:
***************
*** 787,791 ****
  _monthnames = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul',
                 'aug', 'sep', 'oct', 'nov', 'dec',
! 	       'january', 'february', 'march', 'april', 'may', 'june', 'july',
                 'august', 'september', 'october', 'november', 'december']
  _daynames = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
--- 787,791 ----
  _monthnames = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul',
                 'aug', 'sep', 'oct', 'nov', 'dec',
!                'january', 'february', 'march', 'april', 'may', 'june', 'july',
                 'august', 'september', 'october', 'november', 'december']
  _daynames = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
***************
*** 838,851 ****
      if mm > 12: mm = mm - 12
      if dd[-1] == ',':
! 	dd = dd[:-1]
      i = string.find(yy, ':')
      if i > 0:
! 	yy, tm = tm, yy
      if yy[-1] == ',':
! 	yy = yy[:-1]
      if yy[0] not in string.digits:
! 	yy, tz = tz, yy
      if tm[-1] == ',':
! 	tm = tm[:-1]
      tm = string.splitfields(tm, ':')
      if len(tm) == 2:
--- 838,851 ----
      if mm > 12: mm = mm - 12
      if dd[-1] == ',':
!         dd = dd[:-1]
      i = string.find(yy, ':')
      if i > 0:
!         yy, tm = tm, yy
      if yy[-1] == ',':
!         yy = yy[:-1]
      if yy[0] not in string.digits:
!         yy, tz = tz, yy
      if tm[-1] == ',':
!         tm = tm[:-1]
      tm = string.splitfields(tm, ':')
      if len(tm) == 2:

Index: shelve.py
===================================================================
RCS file: /projects/cvsroot/python/dist/src/Lib/shelve.py,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -r1.12 -r1.13
*** shelve.py	1999/08/11 01:54:05	1.12
--- shelve.py	2000/02/10 17:17:14	1.13
***************
*** 11,27 ****
  object):
  
! 	import shelve
! 	d = shelve.open(filename) # open, with (g)dbm filename -- no suffix
  
! 	d[key] = data	# store data at key (overwrites old data if
! 			# using an existing key)
! 	data = d[key]	# retrieve data at key (raise KeyError if no
! 			# such key)
! 	del d[key]	# delete data stored at key (raises KeyError
! 			# if no such key)
! 	flag = d.has_key(key)	# true if the key exists
! 	list = d.keys()	# a list of all existing keys (slow!)
  
! 	d.close()	# close it
  
  Dependent on the implementation, closing a persistent dictionary may
--- 11,27 ----
  object):
  
!         import shelve
!         d = shelve.open(filename) # open, with (g)dbm filename -- no suffix
  
!         d[key] = data   # store data at key (overwrites old data if
!                         # using an existing key)
!         data = d[key]   # retrieve data at key (raise KeyError if no
!                         # such key)
!         del d[key]      # delete data stored at key (raises KeyError
!                         # if no such key)
!         flag = d.has_key(key)   # true if the key exists
!         list = d.keys() # a list of all existing keys (slow!)
  
!         d.close()       # close it
  
  Dependent on the implementation, closing a persistent dictionary may
***************
*** 32,157 ****
  
  try:
! 	from cPickle import Pickler, Unpickler
  except ImportError:
! 	from pickle import Pickler, Unpickler
  
  try:
! 	from cStringIO import StringIO
  except ImportError:
! 	from StringIO import StringIO
  
  
  class Shelf:
! 	"""Base class for shelf implementations.
  
! 	This is initialized with a dictionary-like object.
! 	See the module's __doc__ string for an overview of the interface.
! 	"""
! 
! 	def __init__(self, dict):
! 		self.dict = dict
! 	
! 	def keys(self):
! 		return self.dict.keys()
! 	
! 	def __len__(self):
! 		return len(self.dict)
! 	
! 	def has_key(self, key):
! 		return self.dict.has_key(key)
! 
! 	def get(self, key, default=None):
! 	        if self.dict.has_key(key):
! 			return self[key]
! 		return default
! 	
! 	def __getitem__(self, key):
! 		f = StringIO(self.dict[key])
! 		return Unpickler(f).load()
! 	
! 	def __setitem__(self, key, value):
! 		f = StringIO()
! 		p = Pickler(f)
! 		p.dump(value)
! 		self.dict[key] = f.getvalue()
! 	
! 	def __delitem__(self, key):
! 		del self.dict[key]
! 	
! 	def close(self):
! 		try:
! 			self.dict.close()
! 		except:
! 			pass
! 		self.dict = 0
! 
! 	def __del__(self):
! 		self.close()
! 
! 	def sync(self):
! 		if hasattr(self.dict, 'sync'):
! 			self.dict.sync()
! 	    
  
  class BsdDbShelf(Shelf):
! 	"""Shelf implementation using the "BSD" db interface.
  
! 	This adds methods first(), next(), previous(), last() and
! 	set_location() that have no counterpart in [g]dbm databases.
  
! 	The actual database must be opened using one of the "bsddb"
! 	modules "open" routines (i.e. bsddb.hashopen, bsddb.btopen or
! 	bsddb.rnopen) and passed to the constructor.
! 
! 	See the module's __doc__ string for an overview of the interface.
! 	"""
! 
! 	def __init__(self, dict):
! 	    Shelf.__init__(self, dict)
! 
! 	def set_location(self, key):
! 	     (key, value) = self.dict.set_location(key)
! 	     f = StringIO(value)
! 	     return (key, Unpickler(f).load())
! 
! 	def next(self):
! 	     (key, value) = self.dict.next()
! 	     f = StringIO(value)
! 	     return (key, Unpickler(f).load())
! 
! 	def previous(self):
! 	     (key, value) = self.dict.previous()
! 	     f = StringIO(value)
! 	     return (key, Unpickler(f).load())
! 
! 	def first(self):
! 	     (key, value) = self.dict.first()
! 	     f = StringIO(value)
! 	     return (key, Unpickler(f).load())
! 
! 	def last(self):
! 	     (key, value) = self.dict.last()
! 	     f = StringIO(value)
! 	     return (key, Unpickler(f).load())
  
  
  class DbfilenameShelf(Shelf):
! 	"""Shelf implementation using the "anydbm" generic dbm interface.
  
! 	This is initialized with the filename for the dbm database.
! 	See the module's __doc__ string for an overview of the interface.
! 	"""
! 	
! 	def __init__(self, filename, flag='c'):
! 		import anydbm
! 		Shelf.__init__(self, anydbm.open(filename, flag))
  
  
  def open(filename, flag='c'):
! 	"""Open a persistent dictionary for reading and writing.
  
! 	Argument is the filename for the dbm database.
! 	See the module's __doc__ string for an overview of the interface.
! 	"""
! 	
! 	return DbfilenameShelf(filename, flag)
--- 32,157 ----
  
  try:
!         from cPickle import Pickler, Unpickler
  except ImportError:
!         from pickle import Pickler, Unpickler
  
  try:
!         from cStringIO import StringIO
  except ImportError:
!         from StringIO import StringIO
  
  
  class Shelf:
!         """Base class for shelf implementations.
  
!         This is initialized with a dictionary-like object.
!         See the module's __doc__ string for an overview of the interface.
!         """
! 
!         def __init__(self, dict):
!                 self.dict = dict
!         
!         def keys(self):
!                 return self.dict.keys()
!         
!         def __len__(self):
!                 return len(self.dict)
!         
!         def has_key(self, key):
!                 return self.dict.has_key(key)
! 
!         def get(self, key, default=None):
!                 if self.dict.has_key(key):
!                         return self[key]
!                 return default
!         
!         def __getitem__(self, key):
!                 f = StringIO(self.dict[key])
!                 return Unpickler(f).load()
!         
!         def __setitem__(self, key, value):
!                 f = StringIO()
!                 p = Pickler(f)
!                 p.dump(value)
!                 self.dict[key] = f.getvalue()
!         
!         def __delitem__(self, key):
!                 del self.dict[key]
!         
!         def close(self):
!                 try:
!                         self.dict.close()
!                 except:
!                         pass
!                 self.dict = 0
! 
!         def __del__(self):
!                 self.close()
! 
!         def sync(self):
!                 if hasattr(self.dict, 'sync'):
!                         self.dict.sync()
!             
  
  class BsdDbShelf(Shelf):
!         """Shelf implementation using the "BSD" db interface.
  
!         This adds methods first(), next(), previous(), last() and
!         set_location() that have no counterpart in [g]dbm databases.
  
!         The actual database must be opened using one of the "bsddb"
!         modules "open" routines (i.e. bsddb.hashopen, bsddb.btopen or
!         bsddb.rnopen) and passed to the constructor.
! 
!         See the module's __doc__ string for an overview of the interface.
!         """
! 
!         def __init__(self, dict):
!             Shelf.__init__(self, dict)
! 
!         def set_location(self, key):
!              (key, value) = self.dict.set_location(key)
!              f = StringIO(value)
!              return (key, Unpickler(f).load())
! 
!         def next(self):
!              (key, value) = self.dict.next()
!              f = StringIO(value)
!              return (key, Unpickler(f).load())
! 
!         def previous(self):
!              (key, value) = self.dict.previous()
!              f = StringIO(value)
!              return (key, Unpickler(f).load())
! 
!         def first(self):
!              (key, value) = self.dict.first()
!              f = StringIO(value)
!              return (key, Unpickler(f).load())
! 
!         def last(self):
!              (key, value) = self.dict.last()
!              f = StringIO(value)
!              return (key, Unpickler(f).load())
  
  
  class DbfilenameShelf(Shelf):
!         """Shelf implementation using the "anydbm" generic dbm interface.
  
!         This is initialized with the filename for the dbm database.
!         See the module's __doc__ string for an overview of the interface.
!         """
!         
!         def __init__(self, filename, flag='c'):
!                 import anydbm
!                 Shelf.__init__(self, anydbm.open(filename, flag))
  
  
  def open(filename, flag='c'):
!         """Open a persistent dictionary for reading and writing.
  
!         Argument is the filename for the dbm database.
!         See the module's __doc__ string for an overview of the interface.
!         """
!         
!         return DbfilenameShelf(filename, flag)

Index: stringold.py
===================================================================
RCS file: /projects/cvsroot/python/dist/src/Lib/stringold.py,v
retrieving revision 1.43
retrieving revision 1.44
diff -C2 -r1.43 -r1.44
*** stringold.py	1999/10/12 19:54:40	1.43
--- stringold.py	2000/02/10 17:17:14	1.44
***************
*** 200,207 ****
      """
      if type(s) == _StringType:
! 	return _float(s)
      else:
! 	raise TypeError('argument 1: expected string, %s found' %
! 			type(s).__name__)
  
  # Convert string to integer
--- 200,207 ----
      """
      if type(s) == _StringType:
!         return _float(s)
      else:
!         raise TypeError('argument 1: expected string, %s found' %
!                         type(s).__name__)
  
  # Convert string to integer
***************
*** 218,233 ****
      """
      try:
! 	s = args[0]
      except IndexError:
! 	raise TypeError('function requires at least 1 argument: %d given' %
! 			len(args))
      # Don't catch type error resulting from too many arguments to int().  The
      # error message isn't compatible but the error type is, and this function
      # is complicated enough already.
      if type(s) == _StringType:
! 	return _apply(_int, args)
      else:
! 	raise TypeError('argument 1: expected string, %s found' %
! 			type(s).__name__)
  
  
--- 218,233 ----
      """
      try:
!         s = args[0]
      except IndexError:
!         raise TypeError('function requires at least 1 argument: %d given' %
!                         len(args))
      # Don't catch type error resulting from too many arguments to int().  The
      # error message isn't compatible but the error type is, and this function
      # is complicated enough already.
      if type(s) == _StringType:
!         return _apply(_int, args)
      else:
!         raise TypeError('argument 1: expected string, %s found' %
!                         type(s).__name__)
  
  
***************
*** 246,261 ****
      """
      try:
! 	s = args[0]
      except IndexError:
! 	raise TypeError('function requires at least 1 argument: %d given' %
! 			len(args))
      # Don't catch type error resulting from too many arguments to long().  The
      # error message isn't compatible but the error type is, and this function
      # is complicated enough already.
      if type(s) == _StringType:
! 	return _apply(_long, args)
      else:
! 	raise TypeError('argument 1: expected string, %s found' %
! 			type(s).__name__)
  
  
--- 246,261 ----
      """
      try:
!         s = args[0]
      except IndexError:
!         raise TypeError('function requires at least 1 argument: %d given' %
!                         len(args))
      # Don't catch type error resulting from too many arguments to long().  The
      # error message isn't compatible but the error type is, and this function
      # is complicated enough already.
      if type(s) == _StringType:
!         return _apply(_long, args)
      else:
!         raise TypeError('argument 1: expected string, %s found' %
!                         type(s).__name__)
  
  
***************
*** 299,304 ****
      half = n/2
      if n%2 and width%2:
! 	# This ensures that center(center(s, i), j) = center(s, j)
! 	half = half+1
      return ' '*half +  s + ' '*(n-half)
  
--- 299,304 ----
      half = n/2
      if n%2 and width%2:
!         # This ensures that center(center(s, i), j) = center(s, j)
!         half = half+1
      return ' '*half +  s + ' '*(n-half)
  
***************
*** 319,323 ****
      sign = ''
      if s[0] in ('-', '+'):
! 	sign, s = s[0], s[1:]
      return sign + '0'*(width-n) + s
  
--- 319,323 ----
      sign = ''
      if s[0] in ('-', '+'):
!         sign, s = s[0], s[1:]
      return sign + '0'*(width-n) + s
  
***************
*** 334,343 ****
      res = line = ''
      for c in s:
! 	if c == '\t':
! 	    c = ' '*(tabsize - len(line) % tabsize)
! 	line = line + c
! 	if c == '\n':
! 	    res = res + line
! 	    line = ''
      return res + line
  
--- 334,343 ----
      res = line = ''
      for c in s:
!         if c == '\t':
!             c = ' '*(tabsize - len(line) % tabsize)
!         line = line + c
!         if c == '\n':
!             res = res + line
!             line = ''
      return res + line
  
***************
*** 388,399 ****
      """
      if len(fromstr) != len(tostr):
! 	raise ValueError, "maketrans arguments must have same length"
      global _idmapL
      if not _idmapL:
! 	_idmapL = map(None, _idmap)
      L = _idmapL[:]
      fromstr = map(ord, fromstr)
      for i in range(len(fromstr)):
! 	L[fromstr[i]] = tostr[i]
      return joinfields(L, "")
  
--- 388,399 ----
      """
      if len(fromstr) != len(tostr):
!         raise ValueError, "maketrans arguments must have same length"
      global _idmapL
      if not _idmapL:
!         _idmapL = map(None, _idmap)
      L = _idmapL[:]
      fromstr = map(ord, fromstr)
      for i in range(len(fromstr)):
!         L[fromstr[i]] = tostr[i]
      return joinfields(L, "")
  
***************
*** 429,431 ****
      letters = lowercase + uppercase
  except ImportError:
!     pass					  # Use the original versions
--- 429,431 ----
      letters = lowercase + uppercase
  except ImportError:
!     pass                                          # Use the original versions

Index: urllib2.py
===================================================================
RCS file: /projects/cvsroot/python/dist/src/Lib/urllib2.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -r1.2 -r1.3
*** urllib2.py	2000/02/04 15:28:42	1.2
--- urllib2.py	2000/02/10 17:17:14	1.3
***************
*** 149,156 ****
      # the implementation.  need to override __init__ and __str__
      def __init__(self, reason):
! 	self.reason = reason
  
      def __str__(self):
! 	return '<urlopen error %s>' % self.reason
  
  class HTTPError(URLError, addinfourl):
--- 149,156 ----
      # the implementation.  need to override __init__ and __str__
[...1256 lines suppressed...]
!             return 1
      p = CustomProxy('http', at_cnri, 'proxy.cnri.reston.va.us')
      ph = CustomProxyHandler(p)
***************
*** 1053,1059 ****
              f = urlopen(url, req)
          except IOError, err:
! 	    print "IOError:", err
! 	except socket.error, err:
! 	    print "socket.error:", err
          else:
              buf = f.read()
--- 1053,1059 ----
              f = urlopen(url, req)
          except IOError, err:
!             print "IOError:", err
!         except socket.error, err:
!             print "socket.error:", err
          else:
              buf = f.read()

Index: whichdb.py
===================================================================
RCS file: /projects/cvsroot/python/dist/src/Lib/whichdb.py,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -r1.5 -r1.6
*** whichdb.py	1999/06/08 13:13:16	1.5
--- whichdb.py	2000/02/10 17:17:14	1.6
***************
*** 57,61 ****
      # BSD hash v2 has a 12-byte NULL pad in front of the file type
      try:
! 	(magic,) = struct.unpack("=l", s16[-4:])
      except struct.error:
          return ""
--- 57,61 ----
      # BSD hash v2 has a 12-byte NULL pad in front of the file type
      try:
!         (magic,) = struct.unpack("=l", s16[-4:])
      except struct.error:
          return ""