[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