Untabify to pass the -tt test.
This commit is contained in:
parent
857c4c36b9
commit
13a2c279c5
|
@ -44,27 +44,27 @@ HTTPS_PORT = 443
|
|||
|
||||
class FakeSocket:
|
||||
def __init__(self, sock, ssl):
|
||||
self.__sock = sock
|
||||
self.__ssl = ssl
|
||||
return
|
||||
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 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)
|
||||
return self.__ssl.write(stuff)
|
||||
|
||||
def recv(self, len = 1024, flags = 0):
|
||||
return self.__ssl.read(len)
|
||||
return self.__ssl.read(len)
|
||||
|
||||
def __getattr__(self, attr):
|
||||
return getattr(self.__sock, attr)
|
||||
return getattr(self.__sock, attr)
|
||||
|
||||
class HTTP:
|
||||
"""This class manages a connection to an HTTP server."""
|
||||
|
|
442
Lib/mailbox.py
442
Lib/mailbox.py
|
@ -8,269 +8,269 @@ import os
|
|||
|
||||
class _Mailbox:
|
||||
|
||||
def __init__(self, fp):
|
||||
self.fp = fp
|
||||
self.seekp = 0
|
||||
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 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))
|
||||
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 __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 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 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
|
||||
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 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 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
|
||||
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_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
|
||||
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 ".
|
||||
# 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
|
||||
_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)
|
||||
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_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
|
||||
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 __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)
|
||||
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
|
||||
# Qmail directory mailbox
|
||||
|
||||
def __init__(self, dirname):
|
||||
import string
|
||||
self.dirname = dirname
|
||||
self.boxes = []
|
||||
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))
|
||||
# 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))
|
||||
# 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)
|
||||
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_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 _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
|
||||
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)
|
||||
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()
|
||||
_test()
|
||||
|
|
|
@ -30,8 +30,8 @@ import urllib
|
|||
knownfiles = [
|
||||
"/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
|
||||
"/usr/local/etc/httpd/conf/mime.types", # Apache 1.2
|
||||
"/usr/local/etc/mime.types", # Apache 1.3
|
||||
]
|
||||
|
||||
inited = 0
|
||||
|
@ -56,24 +56,24 @@ def guess_type(url):
|
|||
init()
|
||||
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
|
||||
# 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):
|
||||
base, ext = posixpath.splitext(base + suffix_map[ext])
|
||||
|
|
|
@ -332,11 +332,11 @@ class Message:
|
|||
"""
|
||||
raw = []
|
||||
for h in self.getallmatchingheaders(name):
|
||||
if h[0] in ' \t':
|
||||
raw.append(h)
|
||||
else:
|
||||
if raw:
|
||||
raw.append(', ')
|
||||
if h[0] in ' \t':
|
||||
raw.append(h)
|
||||
else:
|
||||
if raw:
|
||||
raw.append(', ')
|
||||
i = string.find(h, ':')
|
||||
if i > 0:
|
||||
addr = h[i+1:]
|
||||
|
@ -786,7 +786,7 @@ def dump_address_pair(pair):
|
|||
|
||||
_monthnames = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul',
|
||||
'aug', 'sep', 'oct', 'nov', 'dec',
|
||||
'january', 'february', 'march', 'april', 'may', 'june', 'july',
|
||||
'january', 'february', 'march', 'april', 'may', 'june', 'july',
|
||||
'august', 'september', 'october', 'november', 'december']
|
||||
_daynames = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
|
||||
|
||||
|
@ -837,16 +837,16 @@ def parsedate_tz(data):
|
|||
mm = _monthnames.index(mm)+1
|
||||
if mm > 12: mm = mm - 12
|
||||
if dd[-1] == ',':
|
||||
dd = dd[:-1]
|
||||
dd = dd[:-1]
|
||||
i = string.find(yy, ':')
|
||||
if i > 0:
|
||||
yy, tm = tm, yy
|
||||
yy, tm = tm, yy
|
||||
if yy[-1] == ',':
|
||||
yy = yy[:-1]
|
||||
yy = yy[:-1]
|
||||
if yy[0] not in string.digits:
|
||||
yy, tz = tz, yy
|
||||
yy, tz = tz, yy
|
||||
if tm[-1] == ',':
|
||||
tm = tm[:-1]
|
||||
tm = tm[:-1]
|
||||
tm = string.splitfields(tm, ':')
|
||||
if len(tm) == 2:
|
||||
[thh, tmm] = tm
|
||||
|
|
208
Lib/shelve.py
208
Lib/shelve.py
|
@ -10,19 +10,19 @@ are ordinary strings.
|
|||
To summarize the interface (key is a string, data is an arbitrary
|
||||
object):
|
||||
|
||||
import shelve
|
||||
d = shelve.open(filename) # open, with (g)dbm filename -- no suffix
|
||||
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[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
|
||||
d.close() # close it
|
||||
|
||||
Dependent on the implementation, closing a persistent dictionary may
|
||||
or may not be necessary to flush changes to disk.
|
||||
|
@ -31,127 +31,127 @@ or may not be necessary to flush changes to disk.
|
|||
# Try using cPickle and cStringIO if available.
|
||||
|
||||
try:
|
||||
from cPickle import Pickler, Unpickler
|
||||
from cPickle import Pickler, Unpickler
|
||||
except ImportError:
|
||||
from pickle import Pickler, Unpickler
|
||||
from pickle import Pickler, Unpickler
|
||||
|
||||
try:
|
||||
from cStringIO import StringIO
|
||||
from cStringIO import StringIO
|
||||
except ImportError:
|
||||
from StringIO import StringIO
|
||||
from StringIO import StringIO
|
||||
|
||||
|
||||
class Shelf:
|
||||
"""Base class for shelf implementations.
|
||||
"""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.
|
||||
"""
|
||||
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 __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 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 __del__(self):
|
||||
self.close()
|
||||
|
||||
def sync(self):
|
||||
if hasattr(self.dict, 'sync'):
|
||||
self.dict.sync()
|
||||
|
||||
def sync(self):
|
||||
if hasattr(self.dict, 'sync'):
|
||||
self.dict.sync()
|
||||
|
||||
|
||||
class BsdDbShelf(Shelf):
|
||||
"""Shelf implementation using the "BSD" db interface.
|
||||
"""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.
|
||||
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.
|
||||
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.
|
||||
"""
|
||||
See the module's __doc__ string for an overview of the interface.
|
||||
"""
|
||||
|
||||
def __init__(self, dict):
|
||||
Shelf.__init__(self, dict)
|
||||
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 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 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 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 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())
|
||||
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.
|
||||
"""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))
|
||||
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.
|
||||
"""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)
|
||||
Argument is the filename for the dbm database.
|
||||
See the module's __doc__ string for an overview of the interface.
|
||||
"""
|
||||
|
||||
return DbfilenameShelf(filename, flag)
|
||||
|
|
|
@ -199,10 +199,10 @@ def atof(s):
|
|||
|
||||
"""
|
||||
if type(s) == _StringType:
|
||||
return _float(s)
|
||||
return _float(s)
|
||||
else:
|
||||
raise TypeError('argument 1: expected string, %s found' %
|
||||
type(s).__name__)
|
||||
raise TypeError('argument 1: expected string, %s found' %
|
||||
type(s).__name__)
|
||||
|
||||
# Convert string to integer
|
||||
def atoi(*args):
|
||||
|
@ -217,18 +217,18 @@ def atoi(*args):
|
|||
|
||||
"""
|
||||
try:
|
||||
s = args[0]
|
||||
s = args[0]
|
||||
except IndexError:
|
||||
raise TypeError('function requires at least 1 argument: %d given' %
|
||||
len(args))
|
||||
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)
|
||||
return _apply(_int, args)
|
||||
else:
|
||||
raise TypeError('argument 1: expected string, %s found' %
|
||||
type(s).__name__)
|
||||
raise TypeError('argument 1: expected string, %s found' %
|
||||
type(s).__name__)
|
||||
|
||||
|
||||
# Convert string to long integer
|
||||
|
@ -245,18 +245,18 @@ def atol(*args):
|
|||
|
||||
"""
|
||||
try:
|
||||
s = args[0]
|
||||
s = args[0]
|
||||
except IndexError:
|
||||
raise TypeError('function requires at least 1 argument: %d given' %
|
||||
len(args))
|
||||
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)
|
||||
return _apply(_long, args)
|
||||
else:
|
||||
raise TypeError('argument 1: expected string, %s found' %
|
||||
type(s).__name__)
|
||||
raise TypeError('argument 1: expected string, %s found' %
|
||||
type(s).__name__)
|
||||
|
||||
|
||||
# Left-justify a string
|
||||
|
@ -298,8 +298,8 @@ def center(s, width):
|
|||
if n <= 0: return s
|
||||
half = n/2
|
||||
if n%2 and width%2:
|
||||
# This ensures that center(center(s, i), j) = center(s, j)
|
||||
half = half+1
|
||||
# This ensures that center(center(s, i), j) = center(s, j)
|
||||
half = half+1
|
||||
return ' '*half + s + ' '*(n-half)
|
||||
|
||||
# Zero-fill a number, e.g., (12, 3) --> '012' and (-3, 3) --> '-03'
|
||||
|
@ -318,7 +318,7 @@ def zfill(x, width):
|
|||
if n >= width: return s
|
||||
sign = ''
|
||||
if s[0] in ('-', '+'):
|
||||
sign, s = s[0], s[1:]
|
||||
sign, s = s[0], s[1:]
|
||||
return sign + '0'*(width-n) + s
|
||||
|
||||
# Expand tabs in a string.
|
||||
|
@ -333,12 +333,12 @@ def expandtabs(s, tabsize=8):
|
|||
"""
|
||||
res = line = ''
|
||||
for c in s:
|
||||
if c == '\t':
|
||||
c = ' '*(tabsize - len(line) % tabsize)
|
||||
line = line + c
|
||||
if c == '\n':
|
||||
res = res + line
|
||||
line = ''
|
||||
if c == '\t':
|
||||
c = ' '*(tabsize - len(line) % tabsize)
|
||||
line = line + c
|
||||
if c == '\n':
|
||||
res = res + line
|
||||
line = ''
|
||||
return res + line
|
||||
|
||||
# Character translation through look-up table.
|
||||
|
@ -387,14 +387,14 @@ def maketrans(fromstr, tostr):
|
|||
|
||||
"""
|
||||
if len(fromstr) != len(tostr):
|
||||
raise ValueError, "maketrans arguments must have same length"
|
||||
raise ValueError, "maketrans arguments must have same length"
|
||||
global _idmapL
|
||||
if not _idmapL:
|
||||
_idmapL = map(None, _idmap)
|
||||
_idmapL = map(None, _idmap)
|
||||
L = _idmapL[:]
|
||||
fromstr = map(ord, fromstr)
|
||||
for i in range(len(fromstr)):
|
||||
L[fromstr[i]] = tostr[i]
|
||||
L[fromstr[i]] = tostr[i]
|
||||
return joinfields(L, "")
|
||||
|
||||
# Substring replacement (global)
|
||||
|
@ -428,4 +428,4 @@ try:
|
|||
from strop import maketrans, lowercase, uppercase, whitespace
|
||||
letters = lowercase + uppercase
|
||||
except ImportError:
|
||||
pass # Use the original versions
|
||||
pass # Use the original versions
|
||||
|
|
752
Lib/urllib2.py
752
Lib/urllib2.py
File diff suppressed because it is too large
Load Diff
|
@ -56,7 +56,7 @@ def whichdb(filename):
|
|||
|
||||
# BSD hash v2 has a 12-byte NULL pad in front of the file type
|
||||
try:
|
||||
(magic,) = struct.unpack("=l", s16[-4:])
|
||||
(magic,) = struct.unpack("=l", s16[-4:])
|
||||
except struct.error:
|
||||
return ""
|
||||
|
||||
|
|
Loading…
Reference in New Issue