Untabify to pass the -tt test.
This commit is contained in:
parent
857c4c36b9
commit
13a2c279c5
|
@ -44,27 +44,27 @@ HTTPS_PORT = 443
|
||||||
|
|
||||||
class FakeSocket:
|
class FakeSocket:
|
||||||
def __init__(self, sock, ssl):
|
def __init__(self, sock, ssl):
|
||||||
self.__sock = sock
|
self.__sock = sock
|
||||||
self.__ssl = ssl
|
self.__ssl = ssl
|
||||||
return
|
return
|
||||||
|
|
||||||
def makefile(self, mode): # hopefully, never have to write
|
def makefile(self, mode): # hopefully, never have to write
|
||||||
msgbuf = ""
|
msgbuf = ""
|
||||||
while 1:
|
while 1:
|
||||||
try:
|
try:
|
||||||
msgbuf = msgbuf + self.__ssl.read()
|
msgbuf = msgbuf + self.__ssl.read()
|
||||||
except socket.sslerror, msg:
|
except socket.sslerror, msg:
|
||||||
break
|
break
|
||||||
return StringIO(msgbuf)
|
return StringIO(msgbuf)
|
||||||
|
|
||||||
def send(self, stuff, flags = 0):
|
def send(self, stuff, flags = 0):
|
||||||
return self.__ssl.write(stuff)
|
return self.__ssl.write(stuff)
|
||||||
|
|
||||||
def recv(self, len = 1024, flags = 0):
|
def recv(self, len = 1024, flags = 0):
|
||||||
return self.__ssl.read(len)
|
return self.__ssl.read(len)
|
||||||
|
|
||||||
def __getattr__(self, attr):
|
def __getattr__(self, attr):
|
||||||
return getattr(self.__sock, attr)
|
return getattr(self.__sock, attr)
|
||||||
|
|
||||||
class HTTP:
|
class HTTP:
|
||||||
"""This class manages a connection to an HTTP server."""
|
"""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:
|
class _Mailbox:
|
||||||
|
|
||||||
def __init__(self, fp):
|
def __init__(self, fp):
|
||||||
self.fp = fp
|
self.fp = fp
|
||||||
self.seekp = 0
|
self.seekp = 0
|
||||||
|
|
||||||
def seek(self, pos, whence=0):
|
def seek(self, pos, whence=0):
|
||||||
if whence==1: # Relative to current position
|
if whence==1: # Relative to current position
|
||||||
self.pos = self.pos + pos
|
self.pos = self.pos + pos
|
||||||
if whence==2: # Relative to file's end
|
if whence==2: # Relative to file's end
|
||||||
self.pos = self.stop + pos
|
self.pos = self.stop + pos
|
||||||
else: # Default - absolute position
|
else: # Default - absolute position
|
||||||
self.pos = self.start + pos
|
self.pos = self.start + pos
|
||||||
|
|
||||||
def next(self):
|
def next(self):
|
||||||
while 1:
|
while 1:
|
||||||
self.fp.seek(self.seekp)
|
self.fp.seek(self.seekp)
|
||||||
try:
|
try:
|
||||||
self._search_start()
|
self._search_start()
|
||||||
except EOFError:
|
except EOFError:
|
||||||
self.seekp = self.fp.tell()
|
self.seekp = self.fp.tell()
|
||||||
return None
|
return None
|
||||||
start = self.fp.tell()
|
start = self.fp.tell()
|
||||||
self._search_end()
|
self._search_end()
|
||||||
self.seekp = stop = self.fp.tell()
|
self.seekp = stop = self.fp.tell()
|
||||||
if start <> stop:
|
if start <> stop:
|
||||||
break
|
break
|
||||||
return rfc822.Message(_Subfile(self.fp, start, stop))
|
return rfc822.Message(_Subfile(self.fp, start, stop))
|
||||||
|
|
||||||
class _Subfile:
|
class _Subfile:
|
||||||
|
|
||||||
def __init__(self, fp, start, stop):
|
def __init__(self, fp, start, stop):
|
||||||
self.fp = fp
|
self.fp = fp
|
||||||
self.start = start
|
self.start = start
|
||||||
self.stop = stop
|
self.stop = stop
|
||||||
self.pos = self.start
|
self.pos = self.start
|
||||||
|
|
||||||
def read(self, length = None):
|
def read(self, length = None):
|
||||||
if self.pos >= self.stop:
|
if self.pos >= self.stop:
|
||||||
return ''
|
return ''
|
||||||
remaining = self.stop - self.pos
|
remaining = self.stop - self.pos
|
||||||
if length is None or length < 0:
|
if length is None or length < 0:
|
||||||
length = remaining
|
length = remaining
|
||||||
elif length > remaining:
|
elif length > remaining:
|
||||||
length = remaining
|
length = remaining
|
||||||
self.fp.seek(self.pos)
|
self.fp.seek(self.pos)
|
||||||
data = self.fp.read(length)
|
data = self.fp.read(length)
|
||||||
self.pos = self.fp.tell()
|
self.pos = self.fp.tell()
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def readline(self, length = None):
|
def readline(self, length = None):
|
||||||
if self.pos >= self.stop:
|
if self.pos >= self.stop:
|
||||||
return ''
|
return ''
|
||||||
if length is None:
|
if length is None:
|
||||||
length = self.stop - self.pos
|
length = self.stop - self.pos
|
||||||
self.fp.seek(self.pos)
|
self.fp.seek(self.pos)
|
||||||
data = self.fp.readline(length)
|
data = self.fp.readline(length)
|
||||||
self.pos = self.fp.tell()
|
self.pos = self.fp.tell()
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def readlines(self, sizehint = -1):
|
def readlines(self, sizehint = -1):
|
||||||
lines = []
|
lines = []
|
||||||
while 1:
|
while 1:
|
||||||
line = self.readline()
|
line = self.readline()
|
||||||
if not line:
|
if not line:
|
||||||
break
|
break
|
||||||
lines.append(line)
|
lines.append(line)
|
||||||
if sizehint >= 0:
|
if sizehint >= 0:
|
||||||
sizehint = sizehint - len(line)
|
sizehint = sizehint - len(line)
|
||||||
if sizehint <= 0:
|
if sizehint <= 0:
|
||||||
break
|
break
|
||||||
return lines
|
return lines
|
||||||
|
|
||||||
def tell(self):
|
def tell(self):
|
||||||
return self.pos - self.start
|
return self.pos - self.start
|
||||||
|
|
||||||
def seek(self, pos, whence=0):
|
def seek(self, pos, whence=0):
|
||||||
if whence == 0:
|
if whence == 0:
|
||||||
self.pos = self.start + pos
|
self.pos = self.start + pos
|
||||||
elif whence == 1:
|
elif whence == 1:
|
||||||
self.pos = self.pos + pos
|
self.pos = self.pos + pos
|
||||||
elif whence == 2:
|
elif whence == 2:
|
||||||
self.pos = self.stop + pos
|
self.pos = self.stop + pos
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
del self.fp
|
del self.fp
|
||||||
|
|
||||||
class UnixMailbox(_Mailbox):
|
class UnixMailbox(_Mailbox):
|
||||||
|
|
||||||
def _search_start(self):
|
def _search_start(self):
|
||||||
while 1:
|
while 1:
|
||||||
line = self.fp.readline()
|
line = self.fp.readline()
|
||||||
if not line:
|
if not line:
|
||||||
raise EOFError
|
raise EOFError
|
||||||
if line[:5] == 'From ' and self._isrealfromline(line):
|
if line[:5] == 'From ' and self._isrealfromline(line):
|
||||||
return
|
return
|
||||||
|
|
||||||
def _search_end(self):
|
def _search_end(self):
|
||||||
while 1:
|
while 1:
|
||||||
pos = self.fp.tell()
|
pos = self.fp.tell()
|
||||||
line = self.fp.readline()
|
line = self.fp.readline()
|
||||||
if not line:
|
if not line:
|
||||||
return
|
return
|
||||||
if line[:5] == 'From ' and self._isrealfromline(line):
|
if line[:5] == 'From ' and self._isrealfromline(line):
|
||||||
self.fp.seek(pos)
|
self.fp.seek(pos)
|
||||||
return
|
return
|
||||||
|
|
||||||
# An overridable mechanism to test for From-line-ness.
|
# An overridable mechanism to test for From-line-ness.
|
||||||
# You can either specify a different regular expression
|
# You can either specify a different regular expression
|
||||||
# or define a whole new _isrealfromline() method.
|
# or define a whole new _isrealfromline() method.
|
||||||
# Note that this only gets called for lines starting with
|
# Note that this only gets called for lines starting with
|
||||||
# the 5 characters "From ".
|
# the 5 characters "From ".
|
||||||
|
|
||||||
_fromlinepattern = r"From \s*[^\s]+\s+\w\w\w\s+\w\w\w\s+\d?\d\s+" \
|
_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*$"
|
r"\d?\d:\d\d(:\d\d)?(\s+[^\s]+)?\s+\d\d\d\d\s*$"
|
||||||
_regexp = None
|
_regexp = None
|
||||||
|
|
||||||
def _isrealfromline(self, line):
|
def _isrealfromline(self, line):
|
||||||
if not self._regexp:
|
if not self._regexp:
|
||||||
import re
|
import re
|
||||||
self._regexp = re.compile(self._fromlinepattern)
|
self._regexp = re.compile(self._fromlinepattern)
|
||||||
return self._regexp.match(line)
|
return self._regexp.match(line)
|
||||||
|
|
||||||
class MmdfMailbox(_Mailbox):
|
class MmdfMailbox(_Mailbox):
|
||||||
|
|
||||||
def _search_start(self):
|
def _search_start(self):
|
||||||
while 1:
|
while 1:
|
||||||
line = self.fp.readline()
|
line = self.fp.readline()
|
||||||
if not line:
|
if not line:
|
||||||
raise EOFError
|
raise EOFError
|
||||||
if line[:5] == '\001\001\001\001\n':
|
if line[:5] == '\001\001\001\001\n':
|
||||||
return
|
return
|
||||||
|
|
||||||
def _search_end(self):
|
def _search_end(self):
|
||||||
while 1:
|
while 1:
|
||||||
pos = self.fp.tell()
|
pos = self.fp.tell()
|
||||||
line = self.fp.readline()
|
line = self.fp.readline()
|
||||||
if not line:
|
if not line:
|
||||||
return
|
return
|
||||||
if line == '\001\001\001\001\n':
|
if line == '\001\001\001\001\n':
|
||||||
self.fp.seek(pos)
|
self.fp.seek(pos)
|
||||||
return
|
return
|
||||||
|
|
||||||
class MHMailbox:
|
class MHMailbox:
|
||||||
|
|
||||||
def __init__(self, dirname):
|
def __init__(self, dirname):
|
||||||
import re
|
import re
|
||||||
pat = re.compile('^[0-9][0-9]*$')
|
pat = re.compile('^[0-9][0-9]*$')
|
||||||
self.dirname = dirname
|
self.dirname = dirname
|
||||||
files = os.listdir(self.dirname)
|
files = os.listdir(self.dirname)
|
||||||
self.boxes = []
|
self.boxes = []
|
||||||
for f in files:
|
for f in files:
|
||||||
if pat.match(f):
|
if pat.match(f):
|
||||||
self.boxes.append(f)
|
self.boxes.append(f)
|
||||||
|
|
||||||
def next(self):
|
def next(self):
|
||||||
if not self.boxes:
|
if not self.boxes:
|
||||||
return None
|
return None
|
||||||
fn = self.boxes[0]
|
fn = self.boxes[0]
|
||||||
del self.boxes[0]
|
del self.boxes[0]
|
||||||
fp = open(os.path.join(self.dirname, fn))
|
fp = open(os.path.join(self.dirname, fn))
|
||||||
return rfc822.Message(fp)
|
return rfc822.Message(fp)
|
||||||
|
|
||||||
class Maildir:
|
class Maildir:
|
||||||
|
|
||||||
# Qmail directory mailbox
|
# Qmail directory mailbox
|
||||||
|
|
||||||
def __init__(self, dirname):
|
def __init__(self, dirname):
|
||||||
import string
|
import string
|
||||||
self.dirname = dirname
|
self.dirname = dirname
|
||||||
self.boxes = []
|
self.boxes = []
|
||||||
|
|
||||||
# check for new mail
|
# check for new mail
|
||||||
newdir = os.path.join(self.dirname, 'new')
|
newdir = os.path.join(self.dirname, 'new')
|
||||||
for file in os.listdir(newdir):
|
for file in os.listdir(newdir):
|
||||||
if len(string.split(file, '.')) > 2:
|
if len(string.split(file, '.')) > 2:
|
||||||
self.boxes.append(os.path.join(newdir, file))
|
self.boxes.append(os.path.join(newdir, file))
|
||||||
|
|
||||||
# Now check for current mail in this maildir
|
# Now check for current mail in this maildir
|
||||||
curdir = os.path.join(self.dirname, 'cur')
|
curdir = os.path.join(self.dirname, 'cur')
|
||||||
for file in os.listdir(curdir):
|
for file in os.listdir(curdir):
|
||||||
if len(string.split(file, '.')) > 2:
|
if len(string.split(file, '.')) > 2:
|
||||||
self.boxes.append(os.path.join(curdir, file))
|
self.boxes.append(os.path.join(curdir, file))
|
||||||
|
|
||||||
def next(self):
|
def next(self):
|
||||||
if not self.boxes:
|
if not self.boxes:
|
||||||
return None
|
return None
|
||||||
fn = self.boxes[0]
|
fn = self.boxes[0]
|
||||||
del self.boxes[0]
|
del self.boxes[0]
|
||||||
fp = open(os.path.join(self.dirname, fn))
|
fp = open(os.path.join(self.dirname, fn))
|
||||||
return rfc822.Message(fp)
|
return rfc822.Message(fp)
|
||||||
|
|
||||||
class BabylMailbox(_Mailbox):
|
class BabylMailbox(_Mailbox):
|
||||||
|
|
||||||
def _search_start(self):
|
def _search_start(self):
|
||||||
while 1:
|
while 1:
|
||||||
line = self.fp.readline()
|
line = self.fp.readline()
|
||||||
if not line:
|
if not line:
|
||||||
raise EOFError
|
raise EOFError
|
||||||
if line == '*** EOOH ***\n':
|
if line == '*** EOOH ***\n':
|
||||||
return
|
return
|
||||||
|
|
||||||
def _search_end(self):
|
def _search_end(self):
|
||||||
while 1:
|
while 1:
|
||||||
pos = self.fp.tell()
|
pos = self.fp.tell()
|
||||||
line = self.fp.readline()
|
line = self.fp.readline()
|
||||||
if not line:
|
if not line:
|
||||||
return
|
return
|
||||||
if line == '\037\014\n':
|
if line == '\037\014\n':
|
||||||
self.fp.seek(pos)
|
self.fp.seek(pos)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
def _test():
|
def _test():
|
||||||
import time
|
import time
|
||||||
import sys
|
import sys
|
||||||
import string
|
import string
|
||||||
import os
|
import os
|
||||||
|
|
||||||
args = sys.argv[1:]
|
args = sys.argv[1:]
|
||||||
if not args:
|
if not args:
|
||||||
for key in 'MAILDIR', 'MAIL', 'LOGNAME', 'USER':
|
for key in 'MAILDIR', 'MAIL', 'LOGNAME', 'USER':
|
||||||
if os.environ.has_key(key):
|
if os.environ.has_key(key):
|
||||||
mbox = os.environ[key]
|
mbox = os.environ[key]
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
print "$MAIL, $LOGNAME nor $USER set -- who are you?"
|
print "$MAIL, $LOGNAME nor $USER set -- who are you?"
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
mbox = args[0]
|
mbox = args[0]
|
||||||
if mbox[:1] == '+':
|
if mbox[:1] == '+':
|
||||||
mbox = os.environ['HOME'] + '/Mail/' + mbox[1:]
|
mbox = os.environ['HOME'] + '/Mail/' + mbox[1:]
|
||||||
elif not '/' in mbox:
|
elif not '/' in mbox:
|
||||||
mbox = '/usr/mail/' + mbox
|
mbox = '/usr/mail/' + mbox
|
||||||
if os.path.isdir(mbox):
|
if os.path.isdir(mbox):
|
||||||
if os.path.isdir(os.path.join(mbox, 'cur')):
|
if os.path.isdir(os.path.join(mbox, 'cur')):
|
||||||
mb = Maildir(mbox)
|
mb = Maildir(mbox)
|
||||||
else:
|
else:
|
||||||
mb = MHMailbox(mbox)
|
mb = MHMailbox(mbox)
|
||||||
else:
|
else:
|
||||||
fp = open(mbox, 'r')
|
fp = open(mbox, 'r')
|
||||||
mb = UnixMailbox(fp)
|
mb = UnixMailbox(fp)
|
||||||
|
|
||||||
msgs = []
|
msgs = []
|
||||||
while 1:
|
while 1:
|
||||||
msg = mb.next()
|
msg = mb.next()
|
||||||
if msg is None:
|
if msg is None:
|
||||||
break
|
break
|
||||||
msgs.append(msg)
|
msgs.append(msg)
|
||||||
if len(args) <= 1:
|
if len(args) <= 1:
|
||||||
msg.fp = None
|
msg.fp = None
|
||||||
if len(args) > 1:
|
if len(args) > 1:
|
||||||
num = string.atoi(args[1])
|
num = string.atoi(args[1])
|
||||||
print 'Message %d body:'%num
|
print 'Message %d body:'%num
|
||||||
msg = msgs[num-1]
|
msg = msgs[num-1]
|
||||||
msg.rewindbody()
|
msg.rewindbody()
|
||||||
sys.stdout.write(msg.fp.read())
|
sys.stdout.write(msg.fp.read())
|
||||||
else:
|
else:
|
||||||
print 'Mailbox',mbox,'has',len(msgs),'messages:'
|
print 'Mailbox',mbox,'has',len(msgs),'messages:'
|
||||||
for msg in msgs:
|
for msg in msgs:
|
||||||
f = msg.getheader('from') or ""
|
f = msg.getheader('from') or ""
|
||||||
s = msg.getheader('subject') or ""
|
s = msg.getheader('subject') or ""
|
||||||
d = msg.getheader('date') or ""
|
d = msg.getheader('date') or ""
|
||||||
print '%20.20s %18.18s %-30.30s'%(f, d[5:], s)
|
print '%20.20s %18.18s %-30.30s'%(f, d[5:], s)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
_test()
|
_test()
|
||||||
|
|
|
@ -30,8 +30,8 @@ import urllib
|
||||||
knownfiles = [
|
knownfiles = [
|
||||||
"/usr/local/etc/httpd/conf/mime.types",
|
"/usr/local/etc/httpd/conf/mime.types",
|
||||||
"/usr/local/lib/netscape/mime.types",
|
"/usr/local/lib/netscape/mime.types",
|
||||||
"/usr/local/etc/httpd/conf/mime.types", # Apache 1.2
|
"/usr/local/etc/httpd/conf/mime.types", # Apache 1.2
|
||||||
"/usr/local/etc/mime.types", # Apache 1.3
|
"/usr/local/etc/mime.types", # Apache 1.3
|
||||||
]
|
]
|
||||||
|
|
||||||
inited = 0
|
inited = 0
|
||||||
|
@ -56,24 +56,24 @@ def guess_type(url):
|
||||||
init()
|
init()
|
||||||
scheme, url = urllib.splittype(url)
|
scheme, url = urllib.splittype(url)
|
||||||
if scheme == 'data':
|
if scheme == 'data':
|
||||||
# syntax of data URLs:
|
# syntax of data URLs:
|
||||||
# dataurl := "data:" [ mediatype ] [ ";base64" ] "," data
|
# dataurl := "data:" [ mediatype ] [ ";base64" ] "," data
|
||||||
# mediatype := [ type "/" subtype ] *( ";" parameter )
|
# mediatype := [ type "/" subtype ] *( ";" parameter )
|
||||||
# data := *urlchar
|
# data := *urlchar
|
||||||
# parameter := attribute "=" value
|
# parameter := attribute "=" value
|
||||||
# type/subtype defaults to "text/plain"
|
# type/subtype defaults to "text/plain"
|
||||||
comma = string.find(url, ',')
|
comma = string.find(url, ',')
|
||||||
if comma < 0:
|
if comma < 0:
|
||||||
# bad data URL
|
# bad data URL
|
||||||
return None, None
|
return None, None
|
||||||
semi = string.find(url, ';', 0, comma)
|
semi = string.find(url, ';', 0, comma)
|
||||||
if semi >= 0:
|
if semi >= 0:
|
||||||
type = url[:semi]
|
type = url[:semi]
|
||||||
else:
|
else:
|
||||||
type = url[:comma]
|
type = url[:comma]
|
||||||
if '=' in type or '/' not in type:
|
if '=' in type or '/' not in type:
|
||||||
type = 'text/plain'
|
type = 'text/plain'
|
||||||
return type, None # never compressed, so encoding is None
|
return type, None # never compressed, so encoding is None
|
||||||
base, ext = posixpath.splitext(url)
|
base, ext = posixpath.splitext(url)
|
||||||
while suffix_map.has_key(ext):
|
while suffix_map.has_key(ext):
|
||||||
base, ext = posixpath.splitext(base + suffix_map[ext])
|
base, ext = posixpath.splitext(base + suffix_map[ext])
|
||||||
|
|
|
@ -332,11 +332,11 @@ class Message:
|
||||||
"""
|
"""
|
||||||
raw = []
|
raw = []
|
||||||
for h in self.getallmatchingheaders(name):
|
for h in self.getallmatchingheaders(name):
|
||||||
if h[0] in ' \t':
|
if h[0] in ' \t':
|
||||||
raw.append(h)
|
raw.append(h)
|
||||||
else:
|
else:
|
||||||
if raw:
|
if raw:
|
||||||
raw.append(', ')
|
raw.append(', ')
|
||||||
i = string.find(h, ':')
|
i = string.find(h, ':')
|
||||||
if i > 0:
|
if i > 0:
|
||||||
addr = h[i+1:]
|
addr = h[i+1:]
|
||||||
|
@ -786,7 +786,7 @@ def dump_address_pair(pair):
|
||||||
|
|
||||||
_monthnames = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul',
|
_monthnames = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul',
|
||||||
'aug', 'sep', 'oct', 'nov', 'dec',
|
'aug', 'sep', 'oct', 'nov', 'dec',
|
||||||
'january', 'february', 'march', 'april', 'may', 'june', 'july',
|
'january', 'february', 'march', 'april', 'may', 'june', 'july',
|
||||||
'august', 'september', 'october', 'november', 'december']
|
'august', 'september', 'october', 'november', 'december']
|
||||||
_daynames = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
|
_daynames = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
|
||||||
|
|
||||||
|
@ -837,16 +837,16 @@ def parsedate_tz(data):
|
||||||
mm = _monthnames.index(mm)+1
|
mm = _monthnames.index(mm)+1
|
||||||
if mm > 12: mm = mm - 12
|
if mm > 12: mm = mm - 12
|
||||||
if dd[-1] == ',':
|
if dd[-1] == ',':
|
||||||
dd = dd[:-1]
|
dd = dd[:-1]
|
||||||
i = string.find(yy, ':')
|
i = string.find(yy, ':')
|
||||||
if i > 0:
|
if i > 0:
|
||||||
yy, tm = tm, yy
|
yy, tm = tm, yy
|
||||||
if yy[-1] == ',':
|
if yy[-1] == ',':
|
||||||
yy = yy[:-1]
|
yy = yy[:-1]
|
||||||
if yy[0] not in string.digits:
|
if yy[0] not in string.digits:
|
||||||
yy, tz = tz, yy
|
yy, tz = tz, yy
|
||||||
if tm[-1] == ',':
|
if tm[-1] == ',':
|
||||||
tm = tm[:-1]
|
tm = tm[:-1]
|
||||||
tm = string.splitfields(tm, ':')
|
tm = string.splitfields(tm, ':')
|
||||||
if len(tm) == 2:
|
if len(tm) == 2:
|
||||||
[thh, tmm] = tm
|
[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
|
To summarize the interface (key is a string, data is an arbitrary
|
||||||
object):
|
object):
|
||||||
|
|
||||||
import shelve
|
import shelve
|
||||||
d = shelve.open(filename) # open, with (g)dbm filename -- no suffix
|
d = shelve.open(filename) # open, with (g)dbm filename -- no suffix
|
||||||
|
|
||||||
d[key] = data # store data at key (overwrites old data if
|
d[key] = data # store data at key (overwrites old data if
|
||||||
# using an existing key)
|
# using an existing key)
|
||||||
data = d[key] # retrieve data at key (raise KeyError if no
|
data = d[key] # retrieve data at key (raise KeyError if no
|
||||||
# such key)
|
# such key)
|
||||||
del d[key] # delete data stored at key (raises KeyError
|
del d[key] # delete data stored at key (raises KeyError
|
||||||
# if no such key)
|
# if no such key)
|
||||||
flag = d.has_key(key) # true if the key exists
|
flag = d.has_key(key) # true if the key exists
|
||||||
list = d.keys() # a list of all existing keys (slow!)
|
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
|
Dependent on the implementation, closing a persistent dictionary may
|
||||||
or may not be necessary to flush changes to disk.
|
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 using cPickle and cStringIO if available.
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from cPickle import Pickler, Unpickler
|
from cPickle import Pickler, Unpickler
|
||||||
except ImportError:
|
except ImportError:
|
||||||
from pickle import Pickler, Unpickler
|
from pickle import Pickler, Unpickler
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from cStringIO import StringIO
|
from cStringIO import StringIO
|
||||||
except ImportError:
|
except ImportError:
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
|
|
||||||
|
|
||||||
class Shelf:
|
class Shelf:
|
||||||
"""Base class for shelf implementations.
|
"""Base class for shelf implementations.
|
||||||
|
|
||||||
This is initialized with a dictionary-like object.
|
This is initialized with a dictionary-like object.
|
||||||
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):
|
def __init__(self, dict):
|
||||||
self.dict = dict
|
self.dict = dict
|
||||||
|
|
||||||
def keys(self):
|
def keys(self):
|
||||||
return self.dict.keys()
|
return self.dict.keys()
|
||||||
|
|
||||||
def __len__(self):
|
def __len__(self):
|
||||||
return len(self.dict)
|
return len(self.dict)
|
||||||
|
|
||||||
def has_key(self, key):
|
def has_key(self, key):
|
||||||
return self.dict.has_key(key)
|
return self.dict.has_key(key)
|
||||||
|
|
||||||
def get(self, key, default=None):
|
def get(self, key, default=None):
|
||||||
if self.dict.has_key(key):
|
if self.dict.has_key(key):
|
||||||
return self[key]
|
return self[key]
|
||||||
return default
|
return default
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
f = StringIO(self.dict[key])
|
f = StringIO(self.dict[key])
|
||||||
return Unpickler(f).load()
|
return Unpickler(f).load()
|
||||||
|
|
||||||
def __setitem__(self, key, value):
|
def __setitem__(self, key, value):
|
||||||
f = StringIO()
|
f = StringIO()
|
||||||
p = Pickler(f)
|
p = Pickler(f)
|
||||||
p.dump(value)
|
p.dump(value)
|
||||||
self.dict[key] = f.getvalue()
|
self.dict[key] = f.getvalue()
|
||||||
|
|
||||||
def __delitem__(self, key):
|
def __delitem__(self, key):
|
||||||
del self.dict[key]
|
del self.dict[key]
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
try:
|
try:
|
||||||
self.dict.close()
|
self.dict.close()
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
self.dict = 0
|
self.dict = 0
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
def sync(self):
|
def sync(self):
|
||||||
if hasattr(self.dict, 'sync'):
|
if hasattr(self.dict, 'sync'):
|
||||||
self.dict.sync()
|
self.dict.sync()
|
||||||
|
|
||||||
|
|
||||||
class BsdDbShelf(Shelf):
|
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
|
This adds methods first(), next(), previous(), last() and
|
||||||
set_location() that have no counterpart in [g]dbm databases.
|
set_location() that have no counterpart in [g]dbm databases.
|
||||||
|
|
||||||
The actual database must be opened using one of the "bsddb"
|
The actual database must be opened using one of the "bsddb"
|
||||||
modules "open" routines (i.e. bsddb.hashopen, bsddb.btopen or
|
modules "open" routines (i.e. bsddb.hashopen, bsddb.btopen or
|
||||||
bsddb.rnopen) and passed to the constructor.
|
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):
|
def __init__(self, dict):
|
||||||
Shelf.__init__(self, dict)
|
Shelf.__init__(self, dict)
|
||||||
|
|
||||||
def set_location(self, key):
|
def set_location(self, key):
|
||||||
(key, value) = self.dict.set_location(key)
|
(key, value) = self.dict.set_location(key)
|
||||||
f = StringIO(value)
|
f = StringIO(value)
|
||||||
return (key, Unpickler(f).load())
|
return (key, Unpickler(f).load())
|
||||||
|
|
||||||
def next(self):
|
def next(self):
|
||||||
(key, value) = self.dict.next()
|
(key, value) = self.dict.next()
|
||||||
f = StringIO(value)
|
f = StringIO(value)
|
||||||
return (key, Unpickler(f).load())
|
return (key, Unpickler(f).load())
|
||||||
|
|
||||||
def previous(self):
|
def previous(self):
|
||||||
(key, value) = self.dict.previous()
|
(key, value) = self.dict.previous()
|
||||||
f = StringIO(value)
|
f = StringIO(value)
|
||||||
return (key, Unpickler(f).load())
|
return (key, Unpickler(f).load())
|
||||||
|
|
||||||
def first(self):
|
def first(self):
|
||||||
(key, value) = self.dict.first()
|
(key, value) = self.dict.first()
|
||||||
f = StringIO(value)
|
f = StringIO(value)
|
||||||
return (key, Unpickler(f).load())
|
return (key, Unpickler(f).load())
|
||||||
|
|
||||||
def last(self):
|
def last(self):
|
||||||
(key, value) = self.dict.last()
|
(key, value) = self.dict.last()
|
||||||
f = StringIO(value)
|
f = StringIO(value)
|
||||||
return (key, Unpickler(f).load())
|
return (key, Unpickler(f).load())
|
||||||
|
|
||||||
|
|
||||||
class DbfilenameShelf(Shelf):
|
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.
|
This is initialized with the filename for the dbm database.
|
||||||
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, filename, flag='c'):
|
def __init__(self, filename, flag='c'):
|
||||||
import anydbm
|
import anydbm
|
||||||
Shelf.__init__(self, anydbm.open(filename, flag))
|
Shelf.__init__(self, anydbm.open(filename, flag))
|
||||||
|
|
||||||
|
|
||||||
def open(filename, flag='c'):
|
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.
|
Argument is the filename for the dbm database.
|
||||||
See the module's __doc__ string for an overview of the interface.
|
See the module's __doc__ string for an overview of the interface.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return DbfilenameShelf(filename, flag)
|
return DbfilenameShelf(filename, flag)
|
||||||
|
|
|
@ -199,10 +199,10 @@ def atof(s):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
if type(s) == _StringType:
|
if type(s) == _StringType:
|
||||||
return _float(s)
|
return _float(s)
|
||||||
else:
|
else:
|
||||||
raise TypeError('argument 1: expected string, %s found' %
|
raise TypeError('argument 1: expected string, %s found' %
|
||||||
type(s).__name__)
|
type(s).__name__)
|
||||||
|
|
||||||
# Convert string to integer
|
# Convert string to integer
|
||||||
def atoi(*args):
|
def atoi(*args):
|
||||||
|
@ -217,18 +217,18 @@ def atoi(*args):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
s = args[0]
|
s = args[0]
|
||||||
except IndexError:
|
except IndexError:
|
||||||
raise TypeError('function requires at least 1 argument: %d given' %
|
raise TypeError('function requires at least 1 argument: %d given' %
|
||||||
len(args))
|
len(args))
|
||||||
# Don't catch type error resulting from too many arguments to int(). The
|
# 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
|
# error message isn't compatible but the error type is, and this function
|
||||||
# is complicated enough already.
|
# is complicated enough already.
|
||||||
if type(s) == _StringType:
|
if type(s) == _StringType:
|
||||||
return _apply(_int, args)
|
return _apply(_int, args)
|
||||||
else:
|
else:
|
||||||
raise TypeError('argument 1: expected string, %s found' %
|
raise TypeError('argument 1: expected string, %s found' %
|
||||||
type(s).__name__)
|
type(s).__name__)
|
||||||
|
|
||||||
|
|
||||||
# Convert string to long integer
|
# Convert string to long integer
|
||||||
|
@ -245,18 +245,18 @@ def atol(*args):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
s = args[0]
|
s = args[0]
|
||||||
except IndexError:
|
except IndexError:
|
||||||
raise TypeError('function requires at least 1 argument: %d given' %
|
raise TypeError('function requires at least 1 argument: %d given' %
|
||||||
len(args))
|
len(args))
|
||||||
# Don't catch type error resulting from too many arguments to long(). The
|
# 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
|
# error message isn't compatible but the error type is, and this function
|
||||||
# is complicated enough already.
|
# is complicated enough already.
|
||||||
if type(s) == _StringType:
|
if type(s) == _StringType:
|
||||||
return _apply(_long, args)
|
return _apply(_long, args)
|
||||||
else:
|
else:
|
||||||
raise TypeError('argument 1: expected string, %s found' %
|
raise TypeError('argument 1: expected string, %s found' %
|
||||||
type(s).__name__)
|
type(s).__name__)
|
||||||
|
|
||||||
|
|
||||||
# Left-justify a string
|
# Left-justify a string
|
||||||
|
@ -298,8 +298,8 @@ def center(s, width):
|
||||||
if n <= 0: return s
|
if n <= 0: return s
|
||||||
half = n/2
|
half = n/2
|
||||||
if n%2 and width%2:
|
if n%2 and width%2:
|
||||||
# This ensures that center(center(s, i), j) = center(s, j)
|
# This ensures that center(center(s, i), j) = center(s, j)
|
||||||
half = half+1
|
half = half+1
|
||||||
return ' '*half + s + ' '*(n-half)
|
return ' '*half + s + ' '*(n-half)
|
||||||
|
|
||||||
# Zero-fill a number, e.g., (12, 3) --> '012' and (-3, 3) --> '-03'
|
# 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
|
if n >= width: return s
|
||||||
sign = ''
|
sign = ''
|
||||||
if s[0] in ('-', '+'):
|
if s[0] in ('-', '+'):
|
||||||
sign, s = s[0], s[1:]
|
sign, s = s[0], s[1:]
|
||||||
return sign + '0'*(width-n) + s
|
return sign + '0'*(width-n) + s
|
||||||
|
|
||||||
# Expand tabs in a string.
|
# Expand tabs in a string.
|
||||||
|
@ -333,12 +333,12 @@ def expandtabs(s, tabsize=8):
|
||||||
"""
|
"""
|
||||||
res = line = ''
|
res = line = ''
|
||||||
for c in s:
|
for c in s:
|
||||||
if c == '\t':
|
if c == '\t':
|
||||||
c = ' '*(tabsize - len(line) % tabsize)
|
c = ' '*(tabsize - len(line) % tabsize)
|
||||||
line = line + c
|
line = line + c
|
||||||
if c == '\n':
|
if c == '\n':
|
||||||
res = res + line
|
res = res + line
|
||||||
line = ''
|
line = ''
|
||||||
return res + line
|
return res + line
|
||||||
|
|
||||||
# Character translation through look-up table.
|
# Character translation through look-up table.
|
||||||
|
@ -387,14 +387,14 @@ def maketrans(fromstr, tostr):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
if len(fromstr) != len(tostr):
|
if len(fromstr) != len(tostr):
|
||||||
raise ValueError, "maketrans arguments must have same length"
|
raise ValueError, "maketrans arguments must have same length"
|
||||||
global _idmapL
|
global _idmapL
|
||||||
if not _idmapL:
|
if not _idmapL:
|
||||||
_idmapL = map(None, _idmap)
|
_idmapL = map(None, _idmap)
|
||||||
L = _idmapL[:]
|
L = _idmapL[:]
|
||||||
fromstr = map(ord, fromstr)
|
fromstr = map(ord, fromstr)
|
||||||
for i in range(len(fromstr)):
|
for i in range(len(fromstr)):
|
||||||
L[fromstr[i]] = tostr[i]
|
L[fromstr[i]] = tostr[i]
|
||||||
return joinfields(L, "")
|
return joinfields(L, "")
|
||||||
|
|
||||||
# Substring replacement (global)
|
# Substring replacement (global)
|
||||||
|
@ -428,4 +428,4 @@ try:
|
||||||
from strop import maketrans, lowercase, uppercase, whitespace
|
from strop import maketrans, lowercase, uppercase, whitespace
|
||||||
letters = lowercase + uppercase
|
letters = lowercase + uppercase
|
||||||
except ImportError:
|
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
|
# BSD hash v2 has a 12-byte NULL pad in front of the file type
|
||||||
try:
|
try:
|
||||||
(magic,) = struct.unpack("=l", s16[-4:])
|
(magic,) = struct.unpack("=l", s16[-4:])
|
||||||
except struct.error:
|
except struct.error:
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue