[PATCH 1/2] Proper error message on invalid configured repository type

Sebastian Sebastian at SSpaeth.de
Mon Dec 13 15:33:17 GMT 2010


From: Sebastian Spaeth <Sebastian at SSpaeth.de>

Previoiusly, we would just bomb out with a KeyError("Foo") if a user
configured a repository Type=Foo. Or in case he tried to sync from a
Maildir to a Maildir. Still abort with an Exception now, but with one
that explains what actually had happened.

Signed-off-by: Sebastian Spaeth <Sebastian at SSpaeth.de>
---
 offlineimap/repository/Base.py       |    7 +++-
 offlineimap/repository/repository.py |   67 ++++++++++++++++++++++++++++++++++
 2 files changed, 73 insertions(+), 1 deletions(-)
 create mode 100644 offlineimap/repository/repository.py

diff --git a/offlineimap/repository/Base.py b/offlineimap/repository/Base.py
index 45a20cc..a9d98f1 100644
--- a/offlineimap/repository/Base.py
+++ b/offlineimap/repository/Base.py
@@ -36,7 +36,12 @@ def LoadRepository(name, account, reqtype):
         raise ValueError, "Request type %s not supported" % reqtype
     config = account.getconfig()
     repostype = config.get('Repository ' + name, 'type').strip()
-    return typemap[repostype](name, account)
+    try:
+        repo = typemap[repostype]
+    except KeyError:
+        raise Exception, "'%s' repository not supported for %s repositories."%\
+            (repostype, reqtype)
+    return repo(name, account)
 
 class BaseRepository(CustomConfig.ConfigHelperMixin):
     def __init__(self, reposname, account):
diff --git a/offlineimap/repository/repository.py b/offlineimap/repository/repository.py
new file mode 100644
index 0000000..edb5063
--- /dev/null
+++ b/offlineimap/repository/repository.py
@@ -0,0 +1,67 @@
+# Repository - abstract Repository class that returns the correct
+# Repository type instance based on 'account' and 'reqtype', e.g. 
+# a ImapRepository instance
+
+# Copyright (C) 2010 Sebastian Spaeth
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+
+from offlineimap.repository.IMAP import IMAPRepository, MappedIMAPRepository
+from offlineimap.repository.Gmail import GmailRepository
+from offlineimap.repository.Maildir import MaildirRepository
+from offlineimap.repository.LocalStatus import LocalStatusRepository
+
+class Repository(object):
+    """Abstract class that returns the correct Repository type
+    instance based on 'account' and 'reqtype', e.g.  a
+    class:`ImapRepository` instance."""
+
+    def __new__(cls, account, reqtype):
+        """
+        :param account: :class:`Account`
+        :param regtype: 'remote', 'local', or 'status'"""
+
+        if reqtype == 'remote':
+            name = account.getconf('remoterepository')
+            # We don't support Maildirs on the remote side.
+            typemap = {'IMAP': IMAPRepository,
+                       'Gmail': GmailRepository}
+
+        elif reqtype == 'local':
+            name = account.getconf('localrepository')
+            typemap = {'IMAP': MappedIMAPRepository,
+                       'Maildir': MaildirRepository}
+
+        elif reqtype == 'status':
+            # create and return a LocalStatusRepository
+            name = account.getconf('localrepository')
+            return LocalStatusRepository(name, account)
+
+        else:
+            raise ValueError, "Request type %s not supported" % reqtype
+
+        config = account.getconfig()
+        repostype = config.get('Repository ' + name, 'type').strip()
+        return typemap[repostype](name, account)
+
+    def __init__(self, account, reqtype):
+        """Load the correct Repository type and return that. The
+        __init__ of the corresponding Repository class will be
+        executed instead of this stub
+
+        :param account: :class:`Account`
+        :param regtype: 'remote', 'local', or 'status'
+        """
+        pass
-- 
1.7.1





More information about the OfflineIMAP-project mailing list