Show
Ignore:
Timestamp:
28/12/09 18:37:09 (2 years ago)
Author:
msmits@…
Branch:
default
Message:

Backslash escaped double quotes in folder names now handled correctly

Also extracted the common code for list_folders and
list_sub_folders. The tests act on that directly.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • imapclient/imapclient.py

    r90 r91  
    6464 
    6565    re_sep = re.compile('^\(\("[^"]*" "([^"]+)"\)\)') 
    66     re_folder = re.compile('\([^)]*\) "[^"]+" "?([^"]+)"?') 
     66#     re_folder = re.compile('\([^)]*\) "[^"]+" "?([^"]+)"?') 
     67    re_folder = re.compile(r'\([^)]*\) "[^"]+" (?P<qqq>"?)(?P<folder>.+)(?P=qqq)') 
    6768    re_status = re.compile(r'^\s*"?(?P<folder>[^"]+)"?\s+' 
    6869                           r'\((?P<status_items>.*)\)$') 
     
    160161        typ, data = self._imap.list(directory, pattern) 
    161162        self._checkok('list', typ, data) 
    162  
     163        return self._proc_folder_list(data) 
     164 
     165 
     166    def list_sub_folders(self, directory="", pattern="*"): 
     167        """Get a listing of subscribed folders on the server. 
     168 
     169        The default behaviour (no args) will list all subscribed folders for the 
     170        logged in user. 
     171 
     172        @param directory: The base directory to look for folders from. 
     173        @param pattern: A pattern to match against folder names. Only folder 
     174            names matching this pattern will be returned. Wildcards accepted. 
     175        @return: A list of folder names. As per the return of list_folders(). 
     176        """ 
     177        typ, data = self._imap.lsub(directory, pattern) 
     178        self._checkok('lsub', typ, data) 
     179        return self._proc_folder_list(data) 
     180 
     181 
     182    def _proc_folder_list(self, folder_data): 
    163183        folders = [] 
    164         for line in data: 
     184        for line in folder_data: 
    165185            #TODO can the FetchParser code be adapted for use here? 
    166186            folder_text = None 
     
    170190                match = self.re_folder.match(line) 
    171191                if match: 
    172                     folder_text = match.group(1) 
     192                    folder_text = match.group('folder') 
     193                    folder_text = folder_text.replace(r'\"', '"') 
    173194            if folder_text is not None: 
    174195                folders.append(self._decode_folder_name(folder_text)) 
    175196        return folders 
    176  
    177  
    178     def list_sub_folders(self, directory="", pattern="*"): 
    179         """Get a listing of subscribed folders on the server. 
    180  
    181         The default behaviour (no args) will list all subscribed folders for the 
    182         logged in user. 
    183  
    184         @param directory: The base directory to look for folders from. 
    185         @param pattern: A pattern to match against folder names. Only folder 
    186             names matching this pattern will be returned. Wildcards accepted. 
    187         @return: A list of folder names. As per the return of list_folders(). 
    188         """ 
    189         typ, data = self._imap.lsub(directory, pattern) 
    190         self._checkok('lsub', typ, data) 
    191  
    192         folders = [] 
    193         for line in data: 
    194             if line: 
    195                 m = self.re_folder.match(line) 
    196                 if m: 
    197                     folders.append(self._decode_folder_name(m.group(1))) 
    198         return folders 
    199  
     197         
    200198 
    201199    def select_folder(self, folder):