Example #1
0
    def getFolders(self) -> List[Dict[str, Union[str, bool]]]:
        folders = Folders()

        # (typ, [data])
        # e.g. ('OK', [b'(\\HasNoChildren) "." INBOX.DRAFT'])
        response = self.imap.list()
        self._debugResponse('list', response)

        status, data = response
        if status == 'OK':
            for bytes_folderInfo in data:
                foldersInfo = bytes_folderInfo.decode(ENCODING)
                lst_foldersInfo = foldersInfo.split(' ')

                folderName = ' '.join(lst_foldersInfo[2:]).encode(ENCODING)
                folder = Folder(folderName)

                folder.setRoot(lst_foldersInfo[1])

                childrenInfo = lst_foldersInfo[0]
                if childrenInfo == "(\\HasNoChildren)":
                    folder.setHasChildren(False)
                else:
                    folder.setHasChildren(True)

                folders.append(folder)
            self._debug('getFolders', folders)
            return folders

        raise ImapCommandError(str(data))
Example #2
0
    def setUp(self):
        self.folderA = Folder(b'A')
        self.folderB = Folder(b'A')

        self.folderI = Folder(b'A/B')
        self.folderJ = Folder(b'A/B')

        self.foldersX = Folders(self.folderA, self.folderI)
        self.foldersY = Folders(self.folderB, self.folderJ)
Example #3
0
 def test_getFolders_of_recursive_B(self):
     folders = self.driverB.getFolders()
     expected = Folders(
         Folder(b'/'),
         Folder(b'subfolder_A'),
         Folder(b'subfolder_B'),
         Folder(b'subfolder_B/subsubfolder_X'),
     )
     self.assertEqual(folders, expected)
Example #4
0
    def _syncAccount(self, account: Account):
        """Sync one account."""

        accountName = account.getClassName()

        runtime.ui.infoL(3, "merging folders for %s"% accountName)

        # Get the repository instances from the rascal.
        leftRepository = account.fw_getLeft()
        rghtRepository = account.fw_getRight()

        self.left.buildDriver(accountName, 'left')
        self.rght.buildDriver(accountName, 'right')

        # Connect the drivers.
        self.left.connect()
        self.rght.connect()

        self.left.getFolders()
        self.rght.getFolders()

        # Get the folders from both sides so we can feed the folder tasks.
        leftFolders = self.left.getFolders_sync()
        rghtFolders = self.rght.getFolders_sync()

        # Merge the folder lists.
        mergedFolders = Folders()
        for sideFolders in [leftFolders, rghtFolders]:
            for folder in sideFolders:
                if folder not in mergedFolders:
                    mergedFolders.append(folder)

        runtime.ui.infoL(3, "%s merged folders %s"%
            (accountName, mergedFolders))

        # Pass the list to the rascal.
        rascalFolders = account.syncFolders(mergedFolders)

        # The rascal might request for non-existing folders!
        syncFolders = Folders()
        ignoredFolders = Folders()
        for folder in rascalFolders:
            if folder in mergedFolders:
                syncFolders.append(folder)
            else:
                ignoredFolders.append(folder)

        if len(ignoredFolders) > 0:
            runtime.ui.warn("rascal, you asked to sync non-existing folders"
                " for '%s': %s", accountName, ignoredFolders)

        if len(syncFolders) < 1:
            runtime.ui.infoL(3, "%s: no folder to sync"% accountName)
            self.setExitCode(0)
            return # Nothing more to do.

        #TODO: make max_connections mandatory in rascal.
        maxFolderWorkers = min(
            len(syncFolders),
            rghtRepository.conf.get('max_connections'),
            leftRepository.conf.get('max_connections'))

        runtime.ui.infoL(3, "%s syncing folders %s"% (accountName, syncFolders))
        # Syncing folders is not the job of this engine.
        self.referent.syncFolders(accountName, maxFolderWorkers, syncFolders)

        # Wait until folders are synced.
        while self.referent.areFoldersDone_sync():
            pass

        self.setExitCode(0)
Example #5
0
 def _folders(self):
     folders = Folders()
     for folderName in self.conf.get('folders'):
         folders.append(Folder(folderName))
     return folders
Example #6
0
 def _folders(self):
     folders = Folders()
     for folderName in self.conf.get('folders'):
         folders.append(Folder(folderName))
     return folders
Example #7
0
 def test_getFolders_of_recursive_A(self):
     folders = self.driverA.getFolders()
     expected = Folders(Folder(b'/'))
     self.assertEqual(folders, expected)
Example #8
0
 def getFolders(self):
     self._folders = Folders()  # Erase whatever we had.
     self._recursiveScanMaildir()  # Put result into self._folders.
     return self._folders