]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Piers Lauder:
authorGuido van Rossum <guido@python.org>
Tue, 28 Mar 2000 20:20:53 +0000 (20:20 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 28 Mar 2000 20:20:53 +0000 (20:20 +0000)
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.

Lib/imaplib.py

index 7b5526e792d3240166252255e4bcfe8bf7ff3db7..31893a561bddd44f32c3447e8a85a26dea15a8f6 100644 (file)
@@ -15,7 +15,7 @@ Public functions:     Internaldate2tuple
 # 
 # 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
 
@@ -446,17 +446,17 @@ class IMAP4:
                return self._simple_command('RENAME', oldmailbox, newmailbox)
 
 
-       def search(self, charset, criteria):
+       def search(self, charset, *criteria):
                """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.
                """
                name = 'SEARCH'
                if 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)
 
 
@@ -1022,10 +1022,20 @@ if __debug__:
 
 if __name__ == '__main__':
 
-       import getpass, sys
+       import getopt, getpass, sys
 
-       host = ''
-       if sys.argv[1:]: host = sys.argv[1]
+       try:
+               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()
        PASSWD = getpass.getpass("IMAP password for %s on %s" % (USER, host or "localhost"))
@@ -1039,7 +1049,7 @@ if __name__ == '__main__':
        ('append', ('/tmp/yyz 2', None, None, test_mesg)),
        ('list', ('/tmp', 'yy*')),
        ('select', ('/tmp/yyz 2',)),
-       ('search', (None, '(TO zork)')),
+       ('search', (None, 'SUBJECT', 'test')),
        ('partial', ('1', 'RFC822', 1, 1024)),
        ('store', ('1', 'FLAGS', '(\Deleted)')),
        ('expunge', ()),
@@ -1063,26 +1073,39 @@ if __name__ == '__main__':
                _mesg('%s => %s %s' % (cmd, typ, dat))
                return dat
 
-       Debug = 5
-       M = IMAP4(host)
-       _mesg('PROTOCOL_VERSION = %s' % M.PROTOCOL_VERSION)
+       try:
+               M = IMAP4(host)
+               _mesg('PROTOCOL_VERSION = %s' % M.PROTOCOL_VERSION)
+
+               for cmd,args in test_seq1:
+                       run(cmd, args)
+
+               for ml in run('list', ('/tmp/', 'yy%')):
+                       mo = re.match(r'.*"([^"]+)"$', ml)
+                       if mo: path = mo.group(1)
+                       else: path = string.split(ml)[-1]
+                       run('delete', (path,))
+
+               for cmd,args in test_seq2:
+                       dat = run(cmd, args)
+
+                       if (cmd,args) != ('uid', ('SEARCH', 'ALL')):
+                               continue
 
-       for cmd,args in test_seq1:
-               run(cmd, args)
+                       uid = string.split(dat[-1])
+                       if not uid: continue
+                       run('uid', ('FETCH', '%s' % uid[-1],
+                               '(FLAGS INTERNALDATE RFC822.SIZE RFC822.HEADER RFC822.TEXT)'))
 
-       for ml in run('list', ('/tmp/', 'yy%')):
-               mo = re.match(r'.*"([^"]+)"$', ml)
-               if mo: path = mo.group(1)
-               else: path = string.split(ml)[-1]
-               run('delete', (path,))
+               print '\nAll tests OK.'
 
-       for cmd,args in test_seq2:
-               dat = run(cmd, args)
+       except:
+               print '\nTests failed.'
 
-               if (cmd,args) != ('uid', ('SEARCH', 'ALL')):
-                       continue
+               if not Debug:
+                       print '''
+If you would like to see debugging output,
+try: %s -d5
+''' % sys.argv[0]
 
-               uid = string.split(dat[-1])
-               if not uid: continue
-               run('uid', ('FETCH', '%s' % uid[-1],
-                       '(FLAGS INTERNALDATE RFC822.SIZE RFC822.HEADER RFC822.TEXT)'))
+               raise