Passed
Push — update-web-timed-events ( 7d2c4b...173c1f )
by Matt
01:25
created

TimedEvent.data()   A

Complexity

Conditions 3

Size

Total Lines 12
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 12
dl 0
loc 12
rs 9.8
c 0
b 0
f 0
cc 3
nop 1
1
"""
2
 *  PyDMXControl: A Python 3 module to control DMX using uDMX.
3
 *                Featuring fixture profiles, built-in effects and a web control panel.
4
 *  <https://github.com/MattIPv4/PyDMXControl/>
5
 *  Copyright (C) 2018 Matt Cowley (MattIPv4) ([email protected])
6
"""
7
8
from inspect import getsource
9
from time import time
10
from typing import Dict, Union
11
12
13
class TimedEvent:
14
15
    def __init__(self, run_time: int, callback: callable, args: tuple = (), name: str = ""):
16
        self.__time = run_time
17
        self.__cb = callback
18
        self.__args = args
19
        self.__name = name
20
        self.__fired = None
21
22
    @property
23
    def time(self) -> str:
24
        return "{}ms".format("{:,.4f}".format(self.__time).rstrip("0").rstrip("."))
25
26
    @property
27
    def name(self) -> str:
28
        return "{}".format(self.__name)
29
30
    @property
31
    def func(self) -> str:
32
        return "<func {}>".format(self.__cb.__name__)
33
34
    @property
35
    def args(self) -> str:
36
        return "[{}]".format(", ".join(["{}".format(f) for f in self.__args]))
37
38
    @property
39
    def source(self) -> str:
40
        return getsource(self.__cb)
41
42
    @property
43
    def fired(self) -> str:
44
        if self.__fired is None:
45
            return ""
46
        return "{:,.4f}ms ({:,.4f}ms late)".format(self.__fired, self.__fired - self.__time)
47
48
    @property
49
    def data(self) -> Dict[str, Union[None, str, float, int]]:
50
        return {
51
            "time": self.time,
52
            "time_raw": self.__time,
53
            "name": self.name,
54
            "func": self.func,
55
            "args": self.args,
56
            "source": self.source,
57
            "fired": self.fired,
58
            "fired_raw": None if self.__fired is None else self.__fired,
59
            "fired_late_raw": None if self.__fired is None else self.__fired - self.__time
60
        }
61
62
    def __str__(self) -> str:
63
        return "Event {} (\"{}\") {}".format(self.__time, self.name, self.func)
64
65
    def run(self, start_time) -> str:
66
        self.__cb(*self.__args)
67
        self.__fired = (time() * 1000.0) - start_time
68
        return "{} fired at {}".format(str(self), self.fired)
69
70
    def reset_fired(self):
71
        self.__fired = None
72