summaryrefslogtreecommitdiff
path: root/tests/new_client.py
blob: 1e4e20980430f3ab0d4172b94ae2f502a72524ca (plain)
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
58
59
60
61
62
63
64
65
66
67
68



class Client(object):

    def __init__(self, dsn=Ellipsis, *args, **kwargs):

        self.dsn = dsn
        self.environment = Environ()  # singleton encapsulating lazy? system properties
        self.settings = Settings(dsn, *args, **kwargs)  # kwargs settings > os.environ variables > defaults
        self.transport = self.get_transport()
        self.instrument()
        self.spool = self.get_spool() # in-memory, to-disk, etc...

    def get_interfaces(self, **kwargs): # returns list of callables
        return self.settings.get('interfaces')

    def get_instrumentation_hooks(self, **kwargs): # returns list of callables
        return self.settings.get('instrument_hooks')

    def get_validators(self, **kwargs): # returns list of callables
        return self.settings.get('validators')

    def get_default_message(self, **kwargs): # returns dictionary
        return self.settings.get('message_data')

    def instrument(self, force=False):
        if self.environment.instrumented or force:
            for hook in self.get_instrument_hooks():
                try:
                    hook()
                except Exception:
                    # log.warn("Configuration bla bla...")
                    self.sys_warnings.append({"type": "sys_hook", "message":"Hook ... failed. ")


    def capture_exception(self, exception, **kwargs):
        message = Message(exception, defaults=self.get_default_message(), **kwargs)
        for interface in self.get_interfaces(**kwargs):
            try:
                message = interface.process(message, self.settings, self.environment)
            except Exception as e:
                message.add_error(interface, e)

        for validator in self.get_validators(**kwargs):
            try:
                message = validator.process(message, self.settings, self.environment)
            except ValidationError:
                pass # maybe we can fix it here, purge the offending interface, etc.. ?
            except Exception:
                message.add_error(validator, e)

        try:
            message.send(transport=self.transport, sys_warnings=self.sys_warnings)
        except NetworkException:
            message.retry = True
            self.spool.add(message)
        except Exception:
            # add to sys warnings?
            self.sys_warnings.append({"type":"transport_failed", "message": "Some messages are failing, check logs")