Completed
Push — master ( 82bff8...e8daaf )
by Jace
20s queued 11s
created

log.utils.parse_name()   A

Complexity

Conditions 3

Size

Total Lines 9
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 9
nop 2
dl 0
loc 9
rs 9.95
c 0
b 0
f 0
1
"""Implements the "magic" to create `logging` records for the caller."""
2
3
import inspect
4
import logging
5
import sys
6
from typing import Dict, Tuple
7
8
from . import filters, helpers, state
9
10
11
def create_logger_record(
12
    level, message, *args, name: str = '', exc_info=None, **kwargs
13
) -> bool:
14
    frame = inspect.currentframe().f_back.f_back.f_back  # type: ignore
15
16
    name, parent_name = parse_name(name, frame.f_globals)
17
    if parent_name in state.silenced:
18
        return False
19
20
    ensure_initialized()
21
22
    logger = get_logger(name, parent_name)
23
    if not logger.isEnabledFor(level):
24
        return False
25
26
    record = logger.makeRecord(
27
        name,
28
        level,
29
        fn=frame.f_globals['__file__'],
30
        lno=frame.f_lineno,
31
        msg=message,
32
        args=args,
33
        exc_info=exc_info,
34
        extra=kwargs,
35
        sinfo=None,
36
    )
37
    logger.handle(record)
38
    return True
39
40
41
def parse_name(custom_name: str, frame_info: Dict) -> Tuple[str, str]:
42
    module_name = custom_name or frame_info['__name__']
43
    if module_name == '__main__':
44
        try:
45
            module_name = frame_info['__file__'].split('.')[0].replace('/', '.')
46
        except KeyError:
47
            module_name = 'interactive'
48
    parent_module_name = module_name.split('.')[0]
49
    return module_name, parent_module_name
50
51
52
def ensure_initialized():
53
    if not state.initialized:
54
        if 'pytest' in sys.modules:
55
            filters.install(logging.root)
56
        else:  # pragma: no cover
57
            helpers.init()
58
59
60
def get_logger(name: str, parent_name: str):
61
    logger = logging.getLogger(name)
62
    if not logger.level:
63
        parent_logger = logging.getLogger(parent_name)
64
        logger.level = parent_logger.level
65
    if not logger.level:
66
        logger.level = logging.root.level
67
    return logger
68