Test Failed
Push — develop ( 720679...ba0508 )
by Dean
02:45
created

InterfaceMessages.add_exception()   A

Complexity

Conditions 3

Size

Total Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
dl 0
loc 18
rs 9.4285
c 2
b 0
f 0
cc 3
1
from exception_wrappers import ExceptionWrapper
2
from six import add_metaclass
3
from sortedcontainers import SortedSet
4
import collections
5
import logging
6
import sys
7
import time
8
9
Record = collections.namedtuple('Record', 'level timestamp message')
10
log = logging.getLogger(__name__)
11
12
13
class InterfaceMessagesMeta(type):
14
    @property
15
    def critical(cls):
16
        return cls.severity >= logging.CRITICAL
17
18
    @property
19
    def message(cls):
20
        if not cls.records:
21
            return logging.NOTSET
22
23
        # Return the latest highest level/severity message
24
        return cls.records[-1].message
25
26
    @property
27
    def record(cls):
28
        if not cls.records:
29
            return None
30
31
        return cls.records[-1]
32
33
    @property
34
    def severity(cls):
35
        if not cls.records:
36
            return logging.NOTSET
37
38
        # Return the highest error level/severity
39
        return cls.records[-1].level
40
41
42
@add_metaclass(InterfaceMessagesMeta)
43
class InterfaceMessages(object):
44
    records = SortedSet()
45
46
    @classmethod
47
    def add(cls, level, message, *args):
48
        cls.records.add(Record(
49
            level=level,
50
            timestamp=time.time(),
51
            message=message % args
52
        ))
53
54
    @classmethod
55
    def add_exception(cls, level, message, exc_info=None):
56
        if exc_info is None:
57
            exc_info = sys.exc_info()
58
59
        # Ensure message has been provided
60
        if not message:
61
            log.warn('Ignoring add_exception() call, no message was provided')
62
            return
63
64
        # Append message to log file
65
        log.log(level, message, exc_info=exc_info)
66
67
        # Add interface message record
68
        cls.records.add(Record(
69
            level=level,
70
            timestamp=time.time(),
71
            message=message
72
        ))
73
74
    @classmethod
75
    def bind(cls):
76
        ExceptionWrapper.on('exception', cls._on_exception)
77
78
        log.info('Bound to exception events')
79
80
    @classmethod
81
    def _on_exception(cls, source, message, exc_info):
0 ignored issues
show
Unused Code introduced by
The argument source seems to be unused.
Loading history...
82
        # Append error message
83
        InterfaceMessages.add_exception(logging.CRITICAL, message, exc_info)
84