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

src.hunter.Tracer.__str__()   A

Complexity

Conditions 2

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 2
dl 0
loc 3
rs 10
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