log.helpers   A
last analyzed

Complexity

Total Complexity 14

Size/Duplication

Total Lines 80
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 56
dl 0
loc 80
rs 10
c 0
b 0
f 0
wmc 14

3 Functions

Rating   Name   Duplication   Size   Complexity  
B init() 0 38 8
A silence() 0 13 5
A reset() 0 5 1
1
"""Wrappers to eliminate boilerplate `logging` activities."""
2
3
import logging
4
import warnings
5
from importlib import reload
6
7
from . import filters, settings, state
8
9
10
__all__ = ['reset', 'init', 'silence']
11
12
VERBOSITY_TO_LEVEL = {
13
    0: logging.ERROR,
14
    1: logging.WARNING,
15
    2: logging.INFO,
16
    3: logging.DEBUG,
17
}
18
19
20
def reset():
21
    logging.shutdown()
22
    reload(logging)
23
    state.initialized = False
24
    state.silenced.clear()
25
26
27
def init(*, debug=False, verbosity=None, **kwargs):
28
    if 'reset' in kwargs:  # pragma: no cover
29
        warnings.warn(
30
            (
31
                "'reset' option will be removed in the next major version."
32
                " Use 'log.reset()' instead."
33
            ),
34
            DeprecationWarning,
35
        )
36
        should_reset = kwargs.pop('reset')
37
        if should_reset:
38
            reset()
39
40
    custom_format = kwargs.get('format')
41
    if debug:
42
        settings.DEFAULT_LEVEL = logging.DEBUG
43
    elif verbosity is not None:
44
        try:
45
            settings.DEFAULT_LEVEL = VERBOSITY_TO_LEVEL[verbosity]
46
        except KeyError:
47
            settings.DEFAULT_LEVEL = logging.DEBUG
48
49
    kwargs['level'] = kwargs.get('level', settings.DEFAULT_LEVEL)
50
    kwargs['format'] = kwargs.get('format', settings.DEFAULT_FORMAT)
51
    logging.basicConfig(**kwargs)
52
53
    if custom_format:
54
        formatter = logging.Formatter(
55
            fmt=custom_format,
56
            datefmt=kwargs.get('datefmt'),
57
            style=kwargs.get('style', '%'),
58
        )
59
        for handler in logging.root.handlers:
60
            handler.setFormatter(formatter)
61
62
    filters.install(logging.root)
63
64
    state.initialized = True
65
66
67
def silence(*names, allow_info=False, allow_warning=False, allow_error=False):
68
    if allow_info:
69
        level = logging.INFO
70
    elif allow_warning:
71
        level = logging.WARNING
72
    elif allow_error:
73
        level = logging.ERROR
74
    else:
75
        level = logging.CRITICAL
76
77
    for name in names:
78
        logging.getLogger(name).setLevel(level)
79
        state.silenced.add(name)
80