Completed
Push — master ( 0fdc83...4e3b27 )
by Ionel Cristian
55s
created

src.hunter.Tracer   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 60
Duplicated Lines 0 %
Metric Value
wmc 13
dl 0
loc 60
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A __call__() 0 13 2
A __enter__() 0 2 1
A stop() 0 7 2
A __exit__() 0 2 1
A trace() 0 14 1
A __init__() 0 3 1
B __repr__() 0 7 5
1
from __future__ import absolute_import
2
3
import sys
4
5
from .event import Event
6
7
8
class Tracer(object):
9
    """
10
    Trace object.
11
12
    """
13
14
    def __init__(self):
15
        self._handler = None
16
        self._previous = None
17
18
    def __repr__(self):
19
        return '<hunter.tracer.Tracer at 0x%x: %s%s%s%s>' % (
20
            id(self),
21
            '<stopped>' if self._handler is None else 'handler=',
22
            '' if self._handler is None else repr(self._handler),
23
            '' if self._previous is None else ', previous=',
24
            '' if self._previous is None else repr(self._previous),
25
        )
26
    def __call__(self, frame, kind, arg):
27
        """
28
        The settrace function.
29
30
        .. note::
31
32
            This always returns self (drills down) - as opposed to only drilling down when predicate(event) is True
33
            because it might
34
            match further inside.
35
        """
36
        if self._handler is not None:
37
            self._handler(Event(frame, kind, arg, self))
38
            return self
39
40
    def trace(self, predicate):
41
        """
42
        Starts tracing. Can be used as a context manager (with slightly incorrect semantics - it starts tracing
43
        before ``__enter__`` is
44
        called).
45
46
        Args:
47
            predicates (:class:`hunter.Q` instances): Runs actions if any of the given predicates match.
48
            options: Keyword arguments that are passed to :class:`hunter.Q`, for convenience.
49
        """
50
        self._handler = predicate
51
        self._previous = sys.gettrace()
52
        sys.settrace(self)
53
        return self
54
55
    def stop(self):
56
        """
57
        Stop tracing.
58
        """
59
        if self._handler is not None:
60
            sys.settrace(self._previous)
61
            self._handler = self._previous = None
62
63
    def __enter__(self):
64
        return self
65
66
    def __exit__(self, exc_type, exc_val, exc_tb):
67
        self.stop()
68