Refactoring: make functions to be private if we can
Make external API of class/module to be smaller, explicitely mark all internal functions. Also annotate methods that are implemented as the part of the parent class interface. Signed-off-by: Eygene Ryabinkin <rea@codelabs.ru>
This commit is contained in:
		| @@ -38,7 +38,7 @@ class IMAPFolder(BaseFolder): | ||||
|         self.randomgenerator = random.Random() | ||||
|         #self.ui is set in BaseFolder | ||||
|  | ||||
|     def selectro(self, imapobj, force = False): | ||||
|     def __selectro(self, imapobj, force = False): | ||||
|         """Select this folder when we do not need write access. | ||||
|  | ||||
|         Prefer SELECT to EXAMINE if we can, since some servers | ||||
| @@ -52,15 +52,19 @@ class IMAPFolder(BaseFolder): | ||||
|         except imapobj.readonly: | ||||
|             imapobj.select(self.getfullname(), readonly = True, force = force) | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def suggeststhreads(self): | ||||
|         return not globals.options.singlethreading | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def waitforthread(self): | ||||
|         self.imapserver.connectionwait() | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def getcopyinstancelimit(self): | ||||
|         return 'MSGCOPY_' + self.repository.getname() | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def get_uidvalidity(self): | ||||
|         """Retrieve the current connections UIDVALIDITY value | ||||
|  | ||||
| @@ -72,7 +76,7 @@ class IMAPFolder(BaseFolder): | ||||
|         imapobj = self.imapserver.acquireconnection() | ||||
|         try: | ||||
|             # SELECT (if not already done) and get current UIDVALIDITY | ||||
|             self.selectro(imapobj) | ||||
|             self.__selectro(imapobj) | ||||
|             typ, uidval = imapobj.response('UIDVALIDITY') | ||||
|             assert uidval != [None] and uidval != None, \ | ||||
|                 "response('UIDVALIDITY') returned [None]!" | ||||
| @@ -81,6 +85,7 @@ class IMAPFolder(BaseFolder): | ||||
|         finally: | ||||
|             self.imapserver.releaseconnection(imapobj) | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def quickchanged(self, statusfolder): | ||||
|         # An IMAP folder has definitely changed if the number of | ||||
|         # messages or the UID of the last message have changed.  Otherwise | ||||
| @@ -118,6 +123,7 @@ class IMAPFolder(BaseFolder): | ||||
|             return True | ||||
|         return False | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def cachemessagelist(self): | ||||
|         maxage = self.config.getdefaultint("Account %s" % self.accountname, | ||||
|                                            "maxage", -1) | ||||
| @@ -199,9 +205,11 @@ class IMAPFolder(BaseFolder): | ||||
|                 rtime = imaplibutil.Internaldate2epoch(messagestr) | ||||
|                 self.messagelist[uid] = {'uid': uid, 'flags': flags, 'time': rtime} | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def getmessagelist(self): | ||||
|         return self.messagelist | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def getmessage(self, uid): | ||||
|         """Retrieve message with UID from the IMAP server (incl body) | ||||
|  | ||||
| @@ -253,13 +261,15 @@ class IMAPFolder(BaseFolder): | ||||
|             self.imapserver.releaseconnection(imapobj) | ||||
|         return data | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def getmessagetime(self, uid): | ||||
|         return self.messagelist[uid]['time'] | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def getmessageflags(self, uid): | ||||
|         return self.messagelist[uid]['flags'] | ||||
|  | ||||
|     def generate_randomheader(self, content): | ||||
|     def __generate_randomheader(self, content): | ||||
|         """Returns a unique X-OfflineIMAP header | ||||
|  | ||||
|          Generate an 'X-OfflineIMAP' mail header which contains a random | ||||
| @@ -286,28 +296,28 @@ class IMAPFolder(BaseFolder): | ||||
|         return (headername, headervalue) | ||||
|  | ||||
|  | ||||
|     def savemessage_addheader(self, content, headername, headervalue): | ||||
|     def __savemessage_addheader(self, content, headername, headervalue): | ||||
|         self.ui.debug('imap', | ||||
|                  'savemessage_addheader: called to add %s: %s' % (headername, | ||||
|                  '__savemessage_addheader: called to add %s: %s' % (headername, | ||||
|                                                                   headervalue)) | ||||
|         insertionpoint = content.find("\r\n\r\n") | ||||
|         self.ui.debug('imap', 'savemessage_addheader: insertionpoint = %d' % insertionpoint) | ||||
|         self.ui.debug('imap', '__savemessage_addheader: insertionpoint = %d' % insertionpoint) | ||||
|         leader = content[0:insertionpoint] | ||||
|         self.ui.debug('imap', 'savemessage_addheader: leader = %s' % repr(leader)) | ||||
|         self.ui.debug('imap', '__savemessage_addheader: leader = %s' % repr(leader)) | ||||
|         if insertionpoint == 0 or insertionpoint == -1: | ||||
|             newline = '' | ||||
|             insertionpoint = 0 | ||||
|         else: | ||||
|             newline = "\r\n" | ||||
|         newline += "%s: %s" % (headername, headervalue) | ||||
|         self.ui.debug('imap', 'savemessage_addheader: newline = ' + repr(newline)) | ||||
|         self.ui.debug('imap', '__savemessage_addheader: newline = ' + repr(newline)) | ||||
|         trailer = content[insertionpoint:] | ||||
|         self.ui.debug('imap', 'savemessage_addheader: trailer = ' + repr(trailer)) | ||||
|         self.ui.debug('imap', '__savemessage_addheader: trailer = ' + repr(trailer)) | ||||
|         return leader + newline + trailer | ||||
|  | ||||
|  | ||||
|     def savemessage_searchforheader(self, imapobj, headername, headervalue): | ||||
|         self.ui.debug('imap', 'savemessage_searchforheader called for %s: %s' % \ | ||||
|     def __savemessage_searchforheader(self, imapobj, headername, headervalue): | ||||
|         self.ui.debug('imap', '__savemessage_searchforheader called for %s: %s' % \ | ||||
|                  (headername, headervalue)) | ||||
|         # Now find the UID it got. | ||||
|         headervalue = imapobj._quote(headervalue) | ||||
| @@ -315,16 +325,16 @@ class IMAPFolder(BaseFolder): | ||||
|             matchinguids = imapobj.uid('search', 'HEADER', headername, headervalue)[1][0] | ||||
|         except imapobj.error as err: | ||||
|             # IMAP server doesn't implement search or had a problem. | ||||
|             self.ui.debug('imap', "savemessage_searchforheader: got IMAP error '%s' while attempting to UID SEARCH for message with header %s" % (err, headername)) | ||||
|             self.ui.debug('imap', "__savemessage_searchforheader: got IMAP error '%s' while attempting to UID SEARCH for message with header %s" % (err, headername)) | ||||
|             return 0 | ||||
|         self.ui.debug('imap', 'savemessage_searchforheader got initial matchinguids: ' + repr(matchinguids)) | ||||
|         self.ui.debug('imap', '__savemessage_searchforheader got initial matchinguids: ' + repr(matchinguids)) | ||||
|  | ||||
|         if matchinguids == '': | ||||
|             self.ui.debug('imap', "savemessage_searchforheader: UID SEARCH for message with header %s yielded no results" % headername) | ||||
|             self.ui.debug('imap', "__savemessage_searchforheader: UID SEARCH for message with header %s yielded no results" % headername) | ||||
|             return 0 | ||||
|  | ||||
|         matchinguids = matchinguids.split(' ') | ||||
|         self.ui.debug('imap', 'savemessage_searchforheader: matchinguids now ' + \ | ||||
|         self.ui.debug('imap', '__savemessage_searchforheader: matchinguids now ' + \ | ||||
|                  repr(matchinguids)) | ||||
|         if len(matchinguids) != 1 or matchinguids[0] == None: | ||||
|             raise ValueError("While attempting to find UID for message with " | ||||
| @@ -332,7 +342,7 @@ class IMAPFolder(BaseFolder): | ||||
|                                  (headername, str(matchinguids))) | ||||
|         return long(matchinguids[0]) | ||||
|  | ||||
|     def savemessage_fetchheaders(self, imapobj, headername, headervalue): | ||||
|     def __savemessage_fetchheaders(self, imapobj, headername, headervalue): | ||||
|         """ We fetch all new mail headers and search for the right | ||||
|         X-OfflineImap line by hand. The response from the server has form: | ||||
|         ( | ||||
| @@ -355,7 +365,7 @@ class IMAPFolder(BaseFolder): | ||||
|  | ||||
|         Returns UID when found, 0 when not found. | ||||
|         """ | ||||
|         self.ui.debug('imap', 'savemessage_fetchheaders called for %s: %s' % \ | ||||
|         self.ui.debug('imap', '__savemessage_fetchheaders called for %s: %s' % \ | ||||
|                  (headername, headervalue)) | ||||
|  | ||||
|         # run "fetch X:* rfc822.header" | ||||
| @@ -401,7 +411,7 @@ class IMAPFolder(BaseFolder): | ||||
|  | ||||
|         return 0 | ||||
|  | ||||
|     def getmessageinternaldate(self, content, rtime=None): | ||||
|     def __getmessageinternaldate(self, content, rtime=None): | ||||
|         """Parses mail and returns an INTERNALDATE string | ||||
|  | ||||
|         It will use information in the following order, falling back as an attempt fails: | ||||
| @@ -474,6 +484,7 @@ class IMAPFolder(BaseFolder): | ||||
|  | ||||
|         return internaldate | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def savemessage(self, uid, content, flags, rtime): | ||||
|         """Save the message on the Server | ||||
|  | ||||
| @@ -511,16 +522,16 @@ class IMAPFolder(BaseFolder): | ||||
|                 use_uidplus = 'UIDPLUS' in imapobj.capabilities | ||||
|  | ||||
|                 # get the date of the message, so we can pass it to the server. | ||||
|                 date = self.getmessageinternaldate(content, rtime) | ||||
|                 date = self.__getmessageinternaldate(content, rtime) | ||||
|                 content = re.sub("(?<!\r)\n", "\r\n", content) | ||||
|  | ||||
|                 if not use_uidplus: | ||||
|                     # insert a random unique header that we can fetch later | ||||
|                     (headername, headervalue) = self.generate_randomheader( | ||||
|                     (headername, headervalue) = self.__generate_randomheader( | ||||
|                                                     content) | ||||
|                     self.ui.debug('imap', 'savemessage: header is: %s: %s' %\ | ||||
|                                       (headername, headervalue)) | ||||
|                     content = self.savemessage_addheader(content, headername, | ||||
|                     content = self.__savemessage_addheader(content, headername, | ||||
|                                                          headervalue) | ||||
|                 if len(content)>200: | ||||
|                     dbg_output = "%s...%s" % (content[:150], content[-50:]) | ||||
| @@ -605,14 +616,14 @@ class IMAPFolder(BaseFolder): | ||||
|                             "'%s'" % str(resp)) | ||||
|             else: | ||||
|                 # we don't support UIDPLUS | ||||
|                 uid = self.savemessage_searchforheader(imapobj, headername, | ||||
|                 uid = self.__savemessage_searchforheader(imapobj, headername, | ||||
|                                                        headervalue) | ||||
|                 # See docs for savemessage in Base.py for explanation | ||||
|                 # of this and other return values | ||||
|                 if uid == 0: | ||||
|                     self.ui.debug('imap', 'savemessage: attempt to get new UID ' | ||||
|                         'UID failed. Search headers manually.') | ||||
|                     uid = self.savemessage_fetchheaders(imapobj, headername, | ||||
|                     uid = self.__savemessage_fetchheaders(imapobj, headername, | ||||
|                                                         headervalue) | ||||
|                     self.ui.warn('imap', "savemessage: Searching mails for new " | ||||
|                         "Message-ID failed. Could not determine new UID.") | ||||
| @@ -625,6 +636,7 @@ class IMAPFolder(BaseFolder): | ||||
|         self.ui.debug('imap', 'savemessage: returning new UID %d' % uid) | ||||
|         return uid | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def savemessageflags(self, uid, flags): | ||||
|         """Change a message's flags to `flags`. | ||||
|  | ||||
| @@ -650,29 +662,34 @@ class IMAPFolder(BaseFolder): | ||||
|             flags = imaputil.flags2hash(imaputil.imapsplit(result)[1])['FLAGS'] | ||||
|             self.messagelist[uid]['flags'] = imaputil.flagsimap2maildir(flags) | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def addmessageflags(self, uid, flags): | ||||
|         self.addmessagesflags([uid], flags) | ||||
|  | ||||
|     def addmessagesflags_noconvert(self, uidlist, flags): | ||||
|         self.processmessagesflags('+', uidlist, flags) | ||||
|     def __addmessagesflags_noconvert(self, uidlist, flags): | ||||
|         self.__processmessagesflags('+', uidlist, flags) | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def addmessagesflags(self, uidlist, flags): | ||||
|         """This is here for the sake of UIDMaps.py -- deletemessages must | ||||
|         add flags and get a converted UID, and if we don't have noconvert, | ||||
|         then UIDMaps will try to convert it twice.""" | ||||
|         self.addmessagesflags_noconvert(uidlist, flags) | ||||
|         self.__addmessagesflags_noconvert(uidlist, flags) | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def deletemessageflags(self, uid, flags): | ||||
|         self.deletemessagesflags([uid], flags) | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def deletemessagesflags(self, uidlist, flags): | ||||
|         self.processmessagesflags('-', uidlist, flags) | ||||
|         self.__processmessagesflags('-', uidlist, flags) | ||||
|  | ||||
|     def processmessagesflags(self, operation, uidlist, flags): | ||||
|     def __processmessagesflags(self, operation, uidlist, flags): | ||||
|         # XXX: should really iterate over batches of 100 UIDs | ||||
|         if len(uidlist) > 101: | ||||
|             # Hack for those IMAP ervers with a limited line length | ||||
|             self.processmessagesflags(operation, uidlist[:100], flags) | ||||
|             self.processmessagesflags(operation, uidlist[100:], flags) | ||||
|             # Hack for those IMAP servers with a limited line length | ||||
|             self.__processmessagesflags(operation, uidlist[:100], flags) | ||||
|             self.__processmessagesflags(operation, uidlist[100:], flags) | ||||
|             return | ||||
|  | ||||
|         imapobj = self.imapserver.acquireconnection() | ||||
| @@ -716,6 +733,7 @@ class IMAPFolder(BaseFolder): | ||||
|             elif operation == '-': | ||||
|                 self.messagelist[uid]['flags'] -= flags | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def change_message_uid(self, uid, new_uid): | ||||
|         """Change the message from existing uid to new_uid | ||||
|  | ||||
| @@ -724,19 +742,21 @@ class IMAPFolder(BaseFolder): | ||||
|                                '%d to %d' % (uid, new_uid), | ||||
|                                OfflineImapError.ERROR.MESSAGE) | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def deletemessage(self, uid): | ||||
|         self.deletemessages_noconvert([uid]) | ||||
|         self.__deletemessages_noconvert([uid]) | ||||
|  | ||||
|     # Interface from BaseFolder | ||||
|     def deletemessages(self, uidlist): | ||||
|         self.deletemessages_noconvert(uidlist) | ||||
|         self.__deletemessages_noconvert(uidlist) | ||||
|  | ||||
|     def deletemessages_noconvert(self, uidlist): | ||||
|     def __deletemessages_noconvert(self, uidlist): | ||||
|         # Weed out ones not in self.messagelist | ||||
|         uidlist = [uid for uid in uidlist if self.uidexists(uid)] | ||||
|         if not len(uidlist): | ||||
|             return | ||||
|  | ||||
|         self.addmessagesflags_noconvert(uidlist, set('T')) | ||||
|         self.__addmessagesflags_noconvert(uidlist, set('T')) | ||||
|         imapobj = self.imapserver.acquireconnection() | ||||
|         try: | ||||
|             try: | ||||
| @@ -750,5 +770,3 @@ class IMAPFolder(BaseFolder): | ||||
|             self.imapserver.releaseconnection(imapobj) | ||||
|         for uid in uidlist: | ||||
|             del self.messagelist[uid] | ||||
|  | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Eygene Ryabinkin
					Eygene Ryabinkin