aboutsummaryrefslogtreecommitdiff
path: root/scripts/linaroscript.py
blob: 7bb40e6786a1dce27941ba1603d71da7d7c5cba2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# Copyright 2012 Linaro.

"""Helper class for creating new scripts.

It pre-defines a logger using the script_name (passed through the constructor)
and allows different verbosity levels.

Overload the work() method to define the main work to be done by the script.

You can use the logger by accessing instance.logger attribute.
You can use the parser (eg. to add another argument) by accessing
instance.argument_parser attribute.

Parsed arguments are available to your work() method in instance.arguments.
"""

import argparse
import logging


class LinaroScript(object):
    def __init__(self, script_name, description=None):
        self.script_name = script_name
        self.description = description
        self.argument_parser = argparse.ArgumentParser(
            description=self.description)
        self.setup_parser()

    def work(self):
        """The main body of the script.  Overload when subclassing."""
        raise NotImplementedError

    def run(self):
        self.arguments = self.argument_parser.parse_args()
        logging_level = self.get_logging_level_from_verbosity(
            self.arguments.verbose)
        self.logger = logging.getLogger(self.script_name)
        self.logger.setLevel(logging_level)
        formatter = logging.Formatter(
            fmt='%(asctime)s %(levelname)s: %(message)s')
        handler = logging.StreamHandler()
        handler.setFormatter(formatter)
        self.logger.addHandler(handler)

        self.work()

    def setup_parser(self):
        self.argument_parser.add_argument(
            "-v", "--verbose", action='count',
            help=("Increase the output verbosity. "
                  "Can be used multiple times"))

    def get_logging_level_from_verbosity(self, verbosity):
        """Return a logging level based on the number of -v arguments."""
        if verbosity == 0:
            logging_level = logging.ERROR
        elif verbosity == 1:
            logging_level = logging.WARNING
        elif verbosity == 2:
            logging_level = logging.INFO
        elif verbosity >= 3:
            logging_level = logging.DEBUG
        else:
            logging_level = logging.ERROR
        return logging_level