File: timer.py

package info (click to toggle)
ospd-openvas 22.10.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,664 kB
  • sloc: python: 14,268; xml: 1,913; makefile: 45; sh: 29
file content (57 lines) | stat: -rw-r--r-- 1,245 bytes parent folder | download
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
# -*- coding: utf-8 -*-
# SPDX-FileCopyrightText: 2014-2023 Greenbone AG
#
# SPDX-License-Identifier: AGPL-3.0-or-later

import time
import logging

from ospd.errors import OspdError


logger = logging.getLogger(__name__)


class TimerError(OspdError):
    """Timer errors"""


class Timer:
    def __init__(
        self,
        name: str = None,
        text: str = "{}: Elapsed time: {:0.4f} seconds",
        logger=logger.debug,  # pylint: disable=redefined-outer-name
    ):
        self._start_time = None
        self._name = name
        self._text = text
        self._logger = logger

    def __enter__(self):
        self.start()
        return self

    def __exit__(self, exc_type, exc_value, exc_tb):
        self.stop()

    @staticmethod
    def create(name) -> "Timer":
        timer = Timer(name)
        timer.start()
        return timer

    def start(self):
        """Start a new timer"""
        self._start_time = time.perf_counter()

    def stop(self):
        if not self._start_time:
            raise TimerError('Timer is not running.')

        duration = time.perf_counter() - self._start_time

        if self._logger:
            self._logger(self._text.format(self._name, duration))

        return duration