Completed
Push — master ( f46766...a9fd17 )
by Jace
8s
created

configure_logging()   D

Complexity

Conditions 8

Size

Total Lines 45

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 35
CRAP Score 8

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 8
c 1
b 0
f 0
dl 0
loc 45
ccs 35
cts 35
cp 1
crap 8
rs 4
1
"""Common exceptions, classes, and functions."""
2
3 1
import argparse
4 1
import logging
5
6
7 1
from . import settings
8
9 1
MAX_VERBOSITY = 4
10
11 1
verbosity = 0
12
13
14 1
class HelpFormatter(argparse.HelpFormatter):
15
    """Command-line help text formatter with wider help text."""
16
17 1
    def __init__(self, *args, **kwargs):
18 1
        super().__init__(*args, max_help_position=40, **kwargs)
19
20
21 1
class WarningFormatter(logging.Formatter):
22
    """Logging formatter that displays verbose formatting for WARNING+."""
23
24 1
    def __init__(self, default_format, verbose_format, *args, **kwargs):
25 1
        super().__init__(*args, **kwargs)
26 1
        self.default_format = default_format
27 1
        self.verbose_format = verbose_format
28
29 1
    def format(self, record):
30
        """Python 3 hack to change the formatting style dynamically."""
31
        # pylint: disable=W0212
32 1
        if record.levelno > logging.INFO:
33 1
            self._style._fmt = self.verbose_format
34
        else:
35 1
            self._style._fmt = self.default_format
36 1
        return super().format(record)
37
38
39 1
def configure_logging(count=0):
40
    """Configure logging using the provided verbosity count."""
41 1
    assert MAX_VERBOSITY == 4
42
43 1
    if count == -1:
44 1
        level = settings.QUIET_LOGGING_LEVEL
45 1
        default_format = settings.DEFAULT_LOGGING_FORMAT
46 1
        verbose_format = settings.LEVELED_LOGGING_FORMAT
47 1
    elif count == 0:
48 1
        level = settings.DEFAULT_LOGGING_LEVEL
49 1
        default_format = settings.DEFAULT_LOGGING_FORMAT
50 1
        verbose_format = settings.LEVELED_LOGGING_FORMAT
51 1
    elif count == 1:
52 1
        level = settings.VERBOSE_LOGGING_LEVEL
53 1
        default_format = settings.VERBOSE_LOGGING_FORMAT
54 1
        verbose_format = settings.VERBOSE_LOGGING_FORMAT
55 1
    elif count == 2:
56 1
        level = settings.VERBOSE2_LOGGING_LEVEL
57 1
        default_format = settings.VERBOSE_LOGGING_FORMAT
58 1
        verbose_format = settings.VERBOSE_LOGGING_FORMAT
59 1
    elif count == 3:
60 1
        level = settings.VERBOSE2_LOGGING_LEVEL
61 1
        default_format = settings.VERBOSE2_LOGGING_FORMAT
62 1
        verbose_format = settings.VERBOSE2_LOGGING_FORMAT
63
    else:
64 1
        level = settings.VERBOSE2_LOGGING_LEVEL - 1
65 1
        default_format = settings.VERBOSE2_LOGGING_FORMAT
66 1
        verbose_format = settings.VERBOSE2_LOGGING_FORMAT
67
68
    # Set a custom formatter
69 1
    logging.basicConfig(level=level)
70 1
    logging.captureWarnings(True)
71 1
    formatter = WarningFormatter(default_format, verbose_format,
72
                                 datefmt=settings.LOGGING_DATEFMT)
73 1
    logging.root.handlers[0].setFormatter(formatter)
74 1
    logging.getLogger('yorm').setLevel(max(level, settings.YORM_LOGGING_LEVEL))
75
76
    # Warn about excessive verbosity
77
    global verbosity
78 1
    if count > MAX_VERBOSITY:
79 1
        msg = "Maximum verbosity level is {}".format(MAX_VERBOSITY)
80 1
        logging.warning(msg)
81 1
        verbosity = MAX_VERBOSITY
82
    else:
83
        verbosity = count
84