Commit 66d45139 authored by Guido van Rossum's avatar Guido van Rossum

Piers Lauder:

This patch fixes the "search" command in imaplib. The problem
was that a search can take multiple arguments, but as defined,
would only accept one.

I have also made changes to the test code at the end to be less
verbose by default, but to accept a verbosity argument.
parent 84306246
...@@ -15,7 +15,7 @@ Public functions: Internaldate2tuple ...@@ -15,7 +15,7 @@ Public functions: Internaldate2tuple
# #
# Authentication code contributed by Donn Cave <donn@u.washington.edu> June 1998. # Authentication code contributed by Donn Cave <donn@u.washington.edu> June 1998.
__version__ = "2.33" __version__ = "2.36"
import binascii, re, socket, string, time, random, sys import binascii, re, socket, string, time, random, sys
...@@ -446,17 +446,17 @@ class IMAP4: ...@@ -446,17 +446,17 @@ class IMAP4:
return self._simple_command('RENAME', oldmailbox, newmailbox) return self._simple_command('RENAME', oldmailbox, newmailbox)
def search(self, charset, criteria): def search(self, charset, *criteria):
"""Search mailbox for matching messages. """Search mailbox for matching messages.
(typ, [data]) = <instance>.search(charset, criteria) (typ, [data]) = <instance>.search(charset, criterium, ...)
'data' is space separated list of matching message numbers. 'data' is space separated list of matching message numbers.
""" """
name = 'SEARCH' name = 'SEARCH'
if charset: if charset:
charset = 'CHARSET ' + charset charset = 'CHARSET ' + charset
typ, dat = self._simple_command(name, charset, criteria) typ, dat = apply(self._simple_command, (name, charset) + criteria)
return self._untagged_response(typ, dat, name) return self._untagged_response(typ, dat, name)
...@@ -1022,10 +1022,20 @@ if __debug__: ...@@ -1022,10 +1022,20 @@ if __debug__:
if __name__ == '__main__': if __name__ == '__main__':
import getpass, sys import getopt, getpass, sys
host = '' try:
if sys.argv[1:]: host = sys.argv[1] optlist, args = getopt.getopt(sys.argv[1:], 'd:')
except getopt.error, val:
pass
for opt,val in optlist:
if opt == '-d':
Debug = int(val)
if not args: args = ('',)
host = args[0]
USER = getpass.getuser() USER = getpass.getuser()
PASSWD = getpass.getpass("IMAP password for %s on %s" % (USER, host or "localhost")) PASSWD = getpass.getpass("IMAP password for %s on %s" % (USER, host or "localhost"))
...@@ -1039,7 +1049,7 @@ if __name__ == '__main__': ...@@ -1039,7 +1049,7 @@ if __name__ == '__main__':
('append', ('/tmp/yyz 2', None, None, test_mesg)), ('append', ('/tmp/yyz 2', None, None, test_mesg)),
('list', ('/tmp', 'yy*')), ('list', ('/tmp', 'yy*')),
('select', ('/tmp/yyz 2',)), ('select', ('/tmp/yyz 2',)),
('search', (None, '(TO zork)')), ('search', (None, 'SUBJECT', 'test')),
('partial', ('1', 'RFC822', 1, 1024)), ('partial', ('1', 'RFC822', 1, 1024)),
('store', ('1', 'FLAGS', '(\Deleted)')), ('store', ('1', 'FLAGS', '(\Deleted)')),
('expunge', ()), ('expunge', ()),
...@@ -1063,7 +1073,7 @@ if __name__ == '__main__': ...@@ -1063,7 +1073,7 @@ if __name__ == '__main__':
_mesg('%s => %s %s' % (cmd, typ, dat)) _mesg('%s => %s %s' % (cmd, typ, dat))
return dat return dat
Debug = 5 try:
M = IMAP4(host) M = IMAP4(host)
_mesg('PROTOCOL_VERSION = %s' % M.PROTOCOL_VERSION) _mesg('PROTOCOL_VERSION = %s' % M.PROTOCOL_VERSION)
...@@ -1086,3 +1096,16 @@ if __name__ == '__main__': ...@@ -1086,3 +1096,16 @@ if __name__ == '__main__':
if not uid: continue if not uid: continue
run('uid', ('FETCH', '%s' % uid[-1], run('uid', ('FETCH', '%s' % uid[-1],
'(FLAGS INTERNALDATE RFC822.SIZE RFC822.HEADER RFC822.TEXT)')) '(FLAGS INTERNALDATE RFC822.SIZE RFC822.HEADER RFC822.TEXT)'))
print '\nAll tests OK.'
except:
print '\nTests failed.'
if not Debug:
print '''
If you would like to see debugging output,
try: %s -d5
''' % sys.argv[0]
raise
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment