From ebe3d718e36137bfb6b1efee705648a7c3889206 Mon Sep 17 00:00:00 2001 From: enkore Date: Sat, 23 Feb 2013 20:15:20 +0100 Subject: [PATCH] Reworked exceptions --- i3pystatus/__init__.py | 49 +++++++++++++++++++++++++----------------- i3pystatus/mkdocs.py | 6 ++---- mkdocs.sh | 0 3 files changed, 31 insertions(+), 24 deletions(-) mode change 100644 => 100755 mkdocs.sh diff --git a/i3pystatus/__init__.py b/i3pystatus/__init__.py index 87382de..742eed2 100644 --- a/i3pystatus/__init__.py +++ b/i3pystatus/__init__.py @@ -11,26 +11,36 @@ import functools __all__ = [ "SettingsBase", "ClassFinder", "ModuleFinder", - "ConfigurationError", + "ConfigError", "ConfigKeyError", "ConfigMissingError", "ConfigAmbigiousClassesError", "ConfigInvalidModuleError", "Module", "AsyncModule", "IntervalModule", "i3pystatus", "I3statusHandler", "get_path" # We need that for mkdocs ] -class ConfigurationError(Exception): - def __init__(self, module, key=None, missing=None, ambigious_classes=None, invalid=False): - message = "Module '{0}'".format(module) - if key is not None: - message += ": invalid option '{0}'".format(key) - if missing is not None: - message += ": missing required options: {0}".format(missing) - if ambigious_classes is not None: - message += ": ambigious module specification, found multiple classes: {0}".format(ambigious_classes) - if invalid: - message += ": no class found" +class ConfigError(Exception): + """ABC for configuration exceptions""" + def __init__(self, module, *args, **kwargs): + message = "Module '{0}': {1}".format(module, self.format(*args, **kwargs)) super().__init__(message) +class ConfigKeyError(ConfigError, KeyError): + def format(self, key): + return "invalid option '{0}'".format(key) + +class ConfigMissingError(ConfigError): + def format(self, missing): + return "missing required options: {0}".format(missing) + super().__init__(module) + +class ConfigAmbigiousClassesError(ConfigError): + def format(self, ambigious_classes): + return "ambigious module specification, found multiple classes: {0}".format(ambigious_classes) + +class ConfigInvalidModuleError(ConfigError): + def format(self): + return "no class found" + def get_path(): return __path__ @@ -71,7 +81,6 @@ class SettingsBase: if len(args) == 1 and not kwargs: # User can also pass in a dict for their settings # Note: you could do that anyway, with the ** syntax - # Note2: just for backwards compatibility kwargs = args[0] for key, value in kwargs.items(): @@ -79,12 +88,12 @@ class SettingsBase: setattr(self, key, value) required.add(key) else: - raise ConfigurationError(type(self).__name__, key=key) + raise ConfigKeyError(type(self).__name__, key=key) - # Some nice set magic :-) + # Some nice set magic :-) [that's more efficient if we have classes with a few thousand settings] required &= set(self.required) if len(required) != len(self.required): - raise ConfigurationError(type(self).__name__, missing=self.required-required) + raise ConfigMissingError(type(self).__name__, self.required-required) self.init() @@ -140,13 +149,13 @@ class ClassFinder: if len(classes) > 1: # If there are multiple Module clases bundled in one module, # well, we can't decide for the user. - raise ConfigurationError(module.__name__, ambigious_classes=classes) + raise ConfigAmbigiousClassesError(module.__name__, classes) elif not classes: - raise ConfigurationError(module.__name__, invalid=True) + raise ConfigInvalidModuleError(module.__name__) return classes[0] - def instanciate_class(self, module, *args, **kwargs): + def instanciate_class_from_module(self, module, *args, **kwargs): return self.get_class(module)(*args, **kwargs) ModuleFinder = functools.partial(ClassFinder, baseclass=Module, exclude=[Module, IntervalModule, AsyncModule]) @@ -271,7 +280,7 @@ class i3pystatus: args = (position,) position = 0 - module = self.finder.instanciate_class(module, *args, **kwargs) + module = self.finder.instanciate_class_from_module(module, *args, **kwargs) elif args or kwargs: raise ValueError("Additional arguments are invalid if 'module' is already an object") diff --git a/i3pystatus/mkdocs.py b/i3pystatus/mkdocs.py index c5da529..97ba1de 100755 --- a/i3pystatus/mkdocs.py +++ b/i3pystatus/mkdocs.py @@ -131,11 +131,9 @@ def get_all(): for cls in classes: mods.append(Module(cls, neighbours=len(classes), module_name=name, module=module)) - return mods + return sorted(mods, key=lambda module: module.name) with open("template.md", "r") as template: - tpl = template.read() - moddoc = "".join(map(lambda module: module.format(), get_all())) - print(tpl.replace("!!module_doc!!", moddoc)) + print(template.read().replace("!!module_doc!!", moddoc)) diff --git a/mkdocs.sh b/mkdocs.sh old mode 100644 new mode 100755