[core/engine] Add module loading logic

Allow the engine to load modules from the bumblebee/modules/ directory.

see #23
This commit is contained in:
Tobi-wan Kenobi 2016-12-04 11:09:10 +01:00
parent cf1693548b
commit a2c6214baa
5 changed files with 65 additions and 5 deletions

View file

@ -1,5 +1,18 @@
"""Core application engine""" """Core application engine"""
import importlib
class Module(object):
"""Module instance base class
Objects of this type represent the modules that
the user configures. Concrete module implementations
(e.g. CPU utilization, disk usage, etc.) derive from
this base class.
"""
def __init__(self, engine):
pass
class Engine(object): class Engine(object):
"""Engine for driving the application """Engine for driving the application
@ -8,6 +21,19 @@ class Engine(object):
""" """
def __init__(self, config): def __init__(self, config):
self._running = True self._running = True
self._modules = []
self.load_modules(config.modules())
def load_modules(self, modules):
"""Load specified modules and return them as list"""
for module in modules:
self._modules.append(self.load_module(module["module"]))
return self._modules
def load_module(self, module_name):
"""Load specified module and return it as object"""
module = importlib.import_module("bumblebee.modules.{}".format(module_name))
return getattr(module, "Module")(self)
def running(self): def running(self):
"""Check whether the event loop is running""" """Check whether the event loop is running"""

View file

11
bumblebee/modules/test.py Normal file
View file

@ -0,0 +1,11 @@
# pylint: disable=C0111,R0903
"""Test module"""
import bumblebee.engine
class Module(bumblebee.engine.Module):
def __init__(self, engine):
super(Module, self).__init__(engine)
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -2,10 +2,12 @@
test=$(which nosetests) test=$(which nosetests)
echo "testing $(python2 -V 2>&1)" echo "testing with $(python2 -V 2>&1)"
python2 $test --rednose -v tests/ python2 $test --rednose -v tests/
if [ $? == 0 ]; then
echo echo
echo "testing $(python3 -V 2>&1)" echo "testing with $(python3 -V 2>&1)"
python3 $test --rednose -v tests/ python3 $test --rednose -v tests/
fi

View file

@ -2,12 +2,33 @@
import unittest import unittest
from bumblebee.engine import Engine from bumblebee.engine import Engine
from bumblebee.config import Config
class TestEngine(unittest.TestCase): class TestEngine(unittest.TestCase):
def setUp(self): def setUp(self):
self.engine = Engine(None) self.engine = Engine(Config())
self.testModule = "test"
self.testModuleSpec = "bumblebee.modules.{}".format(self.testModule)
self.testModules = [
{ "module": "test", "name": "a" },
{ "module": "test", "name": "b" },
]
def test_stop(self): def test_stop(self):
self.assertTrue(self.engine.running()) self.assertTrue(self.engine.running())
self.engine.stop() self.engine.stop()
self.assertFalse(self.engine.running()) self.assertFalse(self.engine.running())
def test_load_module(self):
module = self.engine.load_module(self.testModule)
self.assertEquals(module.__module__, self.testModuleSpec)
def test_load_modules(self):
modules = self.engine.load_modules(self.testModules)
self.assertEquals(len(modules), len(self.testModules))
self.assertEquals(
[ module.__module__ for module in modules ],
[ self.testModuleSpec for module in modules ]
)
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4