Passed
Push — master ( d9ae97...694e2f )
by Dean
09:21 queued 06:02
created

ModuleManager   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 61
Duplicated Lines 0 %

Test Coverage

Coverage 21.62%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 11
c 1
b 0
f 0
dl 0
loc 61
ccs 8
cts 37
cp 0.2162
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A initialize() 0 3 1
A start() 0 13 3
A discover() 0 10 1
A get() 0 2 1
B construct() 0 23 5
1 1
import logging
2
3 1
log = logging.getLogger(__name__)
4
5
6 1
class ModuleManagerMeta(type):
7 1
    def __getitem__(self, key):
8
        return self.modules[key]
9
10
11 1
class ModuleManager(object):
12 1
    __metaclass__ = ModuleManagerMeta
13
14 1
    modules = {}
15
16 1
    @classmethod
17
    def initialize(cls):
18
        cls.modules = dict(cls.construct())
19
20 1
    @classmethod
21
    def discover(cls):
22
        from plugin.modules.scheduler.main import Scheduler
23
        from plugin.modules.sessions.main import Sessions
24
        from plugin.modules.upgrade.main import Upgrade
25
26
        return [
27
            Scheduler,
28
            Sessions,
29
            Upgrade
30
        ]
31
32 1
    @classmethod
33
    def construct(cls):
34
        try:
35
            available = cls.discover()
36
        except Exception, ex:
37
            log.error('Unable to import modules: %s', ex, exc_info=True)
38
            return
39
40
        constructed = []
41
42
        for module in available:
43
            try:
44
                if module.__key__ is None:
45
                    # Automatically set module `__key__` (if one isn't specified)
46
                    module.__key__ = module.__class__.__name__.lower()
47
48
                yield module.__key__, module()
49
50
                constructed.append(module.__key__)
51
            except Exception, ex:
52
                log.warn('Unable to construct module: %r', module)
53
54
        log.debug('Constructed %d module(s): %s', len(constructed), ', '.join(constructed))
55
56 1
    @classmethod
57
    def start(cls):
58
        started = []
59
60
        for key, module in cls.modules.items():
61
            try:
62
                module.start()
63
64
                started.append(key)
65
            except Exception, ex:
66
                log.warn('Unable to start %r module - %s', key, ex, exc_info=True)
67
68
        log.debug('Started %d module(s): %s', len(started), ', '.join(started))
69
70 1
    def get(self, key, default=None):
71
        return self.modules.get(key, default)
72