diff --git a/tests/test_cli.py b/tests/test_cli.py index 3f1927d..8c3a3d8 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -87,7 +87,6 @@ def test_expand_collection(monkeypatch): s.collection = 'a{}'.format(i) yield s - class TypeB(object): @classmethod def discover(cls, **config): @@ -100,7 +99,6 @@ def test_expand_collection(monkeypatch): s.collection = 'b{}'.format(i) yield s - import vdirsyncer.storage monkeypatch.setitem(vdirsyncer.storage.storage_names, 'mytype_a', TypeA) monkeypatch.setitem(vdirsyncer.storage.storage_names, 'mytype_b', TypeB) diff --git a/vdirsyncer/cli.py b/vdirsyncer/cli.py index f9733ac..f94ca9b 100644 --- a/vdirsyncer/cli.py +++ b/vdirsyncer/cli.py @@ -138,7 +138,7 @@ def storage_instance_from_config(config, description=None): invalid = given - all cli_logger.critical('error: Failed to initialize {}' - .format(description or storage_name)) + .format(description or cls.storage_name)) if not missing and not invalid: cli_logger.exception('') @@ -146,12 +146,12 @@ def storage_instance_from_config(config, description=None): if missing: cli_logger.critical( u'error: {} storage requires the parameters: {}' - .format(storage_name, u', '.join(missing))) + .format(cls.storage_name, u', '.join(missing))) if invalid: cli_logger.critical( u'error: {} storage doesn\'t take the parameters: {}' - .format(storage_name, u', '.join(invalid))) + .format(cls.storage_name, u', '.join(invalid))) sys.exit(1) diff --git a/vdirsyncer/storage/__init__.py b/vdirsyncer/storage/__init__.py index e29d3a1..8fa26ca 100644 --- a/vdirsyncer/storage/__init__.py +++ b/vdirsyncer/storage/__init__.py @@ -17,10 +17,23 @@ from .filesystem import FilesystemStorage from .http import HttpStorage from .singlefile import SingleFileStorage -storage_names = { - 'caldav': CaldavStorage, - 'carddav': CarddavStorage, - 'filesystem': FilesystemStorage, - 'http': HttpStorage, - 'singlefile': SingleFileStorage -} + +def _generate_storage_dict(*classes): + rv = {} + for cls in classes: + key = cls.storage_name + assert key + assert isinstance(key, str) + assert key not in rv + rv[key] = cls + return rv + +storage_names = _generate_storage_dict( + CaldavStorage, + CarddavStorage, + FilesystemStorage, + HttpStorage, + SingleFileStorage +) + +del _generate_storage_dict diff --git a/vdirsyncer/storage/base.py b/vdirsyncer/storage/base.py index 042aa0e..d6984a0 100644 --- a/vdirsyncer/storage/base.py +++ b/vdirsyncer/storage/base.py @@ -69,6 +69,7 @@ class Storage(object): looked for. ''' fileext = '.txt' + storage_name = None # the name used in the config file _repr_attributes = () @classmethod diff --git a/vdirsyncer/storage/dav.py b/vdirsyncer/storage/dav.py index a1c4a28..02b49df 100644 --- a/vdirsyncer/storage/dav.py +++ b/vdirsyncer/storage/dav.py @@ -287,6 +287,7 @@ class CaldavStorage(DavStorage): in the normal usecase. ''' + storage_name = 'caldav' fileext = '.ics' item_mimetype = 'text/calendar' dav_header = 'calendar-access' @@ -383,6 +384,7 @@ class CarddavStorage(DavStorage): CardDAV. Usable as ``carddav`` in the config file. ''' + DavStorage.__doc__ + storage_name = 'carddav' fileext = '.vcf' item_mimetype = 'text/vcard' dav_header = 'addressbook' diff --git a/vdirsyncer/storage/filesystem.py b/vdirsyncer/storage/filesystem.py index ccead25..a14065f 100644 --- a/vdirsyncer/storage/filesystem.py +++ b/vdirsyncer/storage/filesystem.py @@ -36,6 +36,7 @@ class FilesystemStorage(Storage): :param create: Create directories if they don't exist. ''' + storage_name = 'filesystem' _repr_attributes = ('path',) def __init__(self, path, fileext, collection=None, encoding='utf-8', diff --git a/vdirsyncer/storage/http.py b/vdirsyncer/storage/http.py index 8878de6..f932b59 100644 --- a/vdirsyncer/storage/http.py +++ b/vdirsyncer/storage/http.py @@ -74,6 +74,7 @@ class HttpStorage(Storage): url = https://example.com/holidays_from_hicksville.ics ''' + storage_name = 'http' _repr_attributes = ('username', 'url') _items = None diff --git a/vdirsyncer/storage/singlefile.py b/vdirsyncer/storage/singlefile.py index 05457b9..bd38798 100644 --- a/vdirsyncer/storage/singlefile.py +++ b/vdirsyncer/storage/singlefile.py @@ -49,6 +49,7 @@ class SingleFileStorage(Storage): ''' + storage_name = 'singlefile' _repr_attributes = ('path',) _write_mode = 'wb'