Completed
Push — master ( a5f58a...66ee29 )
by Andrii
11:46
created

SignalHandler   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 25
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 25
rs 10
wmc 6

4 Methods

Rating   Name   Duplication   Size   Complexity  
A block_signals() 0 9 2
A __init__() 0 5 1
A run_callback() 0 3 1
A on_signal() 0 4 2
1
#!/usr/bin/env python
2
3
import signal
4
from contextlib import contextmanager
5
6
class SignalHandler:
7
    def __init__(self, callback, what=signal.SIGUSR2):
8
        self.callback = callback
9
        self.received = False
10
        self.working  = False
11
        signal.signal(what, self.on_signal)
12
13
    def on_signal(self, signal, frame):
14
        self.received = True
15
        if not self.working:
16
            self.run_callback()
17
18
    def run_callback(self):
19
        self.received = False
20
        self.callback()
21
22
    @contextmanager
23
    def block_signals(self):
24
        self.working = True
25
        try:
26
            yield
27
        finally:
28
            self.working = False
29
            if self.received:
30
                self.run_callback()
31
                
32