[core/errors] Add custom exceptions

Add custom exceptions and add error handling to the engine's module
loading logic. I.e. when a non-existent module is loaded, an exception
is thrown now.

see #23
This commit is contained in:
Tobi-wan Kenobi 2016-12-04 16:23:44 +01:00
parent b6eb3ee8e6
commit 8855f1155b
4 changed files with 33 additions and 2 deletions

View file

@ -16,6 +16,10 @@ def main():
engine.run() engine.run()
if __name__ == "__main__": if __name__ == "__main__":
main() try:
main()
except bumblebee.error.BaseError as error:
sys.stderr.write("fatal: {}\n".format(error))
sys.exit(1)
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,6 +1,8 @@
"""Core application engine""" """Core application engine"""
import time
import importlib import importlib
import bumblebee.error
class Module(object): class Module(object):
"""Module instance base class """Module instance base class
@ -33,7 +35,10 @@ class Engine(object):
def load_module(self, module_name): def load_module(self, module_name):
"""Load specified module and return it as object""" """Load specified module and return it as object"""
module = importlib.import_module("bumblebee.modules.{}".format(module_name)) try:
module = importlib.import_module("bumblebee.modules.{}".format(module_name))
except ImportError as error:
raise bumblebee.error.ModuleLoadError(error)
return getattr(module, "Module")(self) return getattr(module, "Module")(self)
def running(self): def running(self):
@ -53,6 +58,7 @@ class Engine(object):
widgets += module.widgets() widgets += module.widgets()
self._output.draw(widgets) self._output.draw(widgets)
self._output.flush() self._output.flush()
time.sleep(1)
self._output.stop() self._output.stop()

11
bumblebee/error.py Normal file
View file

@ -0,0 +1,11 @@
"""Collection of all exceptions raised by this tool"""
class BaseError(Exception):
"""Base class for all exceptions generated by this tool"""
pass
class ModuleLoadError(BaseError):
"""Raised whenever loading a module fails"""
pass
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,6 +1,7 @@
# pylint: disable=C0103,C0111 # pylint: disable=C0103,C0111
import unittest import unittest
from bumblebee.error import ModuleLoadError
from bumblebee.engine import Engine from bumblebee.engine import Engine
from bumblebee.config import Config from bumblebee.config import Config
@ -8,6 +9,7 @@ class TestEngine(unittest.TestCase):
def setUp(self): def setUp(self):
self.engine = Engine(Config()) self.engine = Engine(Config())
self.testModule = "test" self.testModule = "test"
self.invalidModule = "no-such-module"
self.testModuleSpec = "bumblebee.modules.{}".format(self.testModule) self.testModuleSpec = "bumblebee.modules.{}".format(self.testModule)
self.testModules = [ self.testModules = [
{"module": "test", "name": "a"}, {"module": "test", "name": "a"},
@ -23,6 +25,14 @@ class TestEngine(unittest.TestCase):
module = self.engine.load_module(self.testModule) module = self.engine.load_module(self.testModule)
self.assertEquals(module.__module__, self.testModuleSpec) self.assertEquals(module.__module__, self.testModuleSpec)
def test_load_invalid_module(self):
with self.assertRaises(ModuleLoadError):
self.engine.load_module(self.invalidModule)
def test_load_none(self):
with self.assertRaises(ModuleLoadError):
self.engine.load_module(None)
def test_load_modules(self): def test_load_modules(self):
modules = self.engine.load_modules(self.testModules) modules = self.engine.load_modules(self.testModules)
self.assertEquals(len(modules), len(self.testModules)) self.assertEquals(len(modules), len(self.testModules))