def to_json(self): return prune_empty_keys({ 'type': self.type, 'description': self.description, 'help_link': self.help_link, 'handled': self.handled, 'data': self.data or None, 'meta': prune_empty_keys(self.meta) or None, })
def to_json(self): return prune_empty_keys({ 'values': [ prune_empty_keys({ 'type': crumb['type'], 'level': crumb['level'], 'timestamp': crumb['timestamp'], 'message': crumb['message'], 'category': crumb['category'], 'event_id': crumb['event_id'], 'data': crumb['data'] or None }) for crumb in self.values ] or None })
def to_python(cls, data): data = upgrade_legacy_mechanism(data) is_valid, errors = validate_and_default_interface(data, cls.path) if not is_valid: raise InterfaceValidationError("Invalid mechanism") if not data.get('type'): raise InterfaceValidationError("No 'type' present") mechanism_meta = data.get('meta') or {} mach_exception = mechanism_meta.get('mach_exception') if mach_exception is not None: mach_exception = prune_empty_keys({ 'exception': mach_exception['exception'], 'code': mach_exception['code'], 'subcode': mach_exception['subcode'], 'name': mach_exception.get('name'), }) signal = mechanism_meta.get('signal') if signal is not None: signal = prune_empty_keys({ 'number': signal['number'], 'code': signal.get('code'), 'name': signal.get('name'), 'code_name': signal.get('code_name'), }) errno = mechanism_meta.get('errno') if errno is not None: errno = prune_empty_keys({ 'number': errno['number'], 'name': errno.get('name'), }) kwargs = { 'type': trim(data['type'], 128), 'description': trim(data.get('description'), 1024), 'help_link': trim(data.get('help_link'), 1024), 'handled': data.get('handled'), 'data': trim(data.get('data'), 4096), 'meta': { 'errno': errno, 'mach_exception': mach_exception, 'signal': signal, }, } return cls(**kwargs)
def to_json(self): return prune_empty_keys({ 'name': self.name, 'version': self.version, 'integrations': self.integrations or None, 'packages': self.packages or None })
def to_json(self): return prune_empty_keys({ 'id': self.id, 'email': self.email, 'username': self.username, 'ip_address': self.ip_address, 'name': self.name, 'geo': self.geo.to_json() if self.geo is not None else None, 'data': self.data or None })
def to_json(self): return prune_empty_keys({ 'method': self.method, 'url': self.url, 'query_string': self.query_string or None, 'fragment': self.fragment or None, 'cookies': self.cookies or None, 'headers': self.headers or None, 'data': self.data, 'env': self.env or None, 'inferred_content_type': self.inferred_content_type, })
def to_json(self): def export_thread(data): if data is None: return None rv = { "id": data["id"], "current": data["current"], "crashed": data["crashed"], "name": data["name"], "stacktrace": None, } if data["stacktrace"]: rv["stacktrace"] = data["stacktrace"].to_json() if data["raw_stacktrace"]: rv["raw_stacktrace"] = data["raw_stacktrace"].to_json() return prune_empty_keys(rv) return prune_empty_keys({"values": [export_thread(x) for x in self.values]})
def to_json(self): def export_thread(data): if data is None: return None rv = { 'id': data['id'], 'current': data['current'], 'crashed': data['crashed'], 'name': data['name'], 'stacktrace': None } if data['stacktrace']: rv['stacktrace'] = data['stacktrace'].to_json() if data['raw_stacktrace']: rv['raw_stacktrace'] = data['raw_stacktrace'].to_json() return prune_empty_keys(rv) return prune_empty_keys({ 'values': [export_thread(x) for x in self.values], })
def to_json(self): return prune_empty_keys({ 'method': self.method, 'url': self.url, 'query_string': self.query_string or None, 'fragment': self.fragment or None, 'cookies': self.cookies or None, 'headers': self.headers or None, 'data': self.data, 'env': self.env or None, 'inferred_content_type': self.inferred_content_type, })
def to_json(self): mechanism = isinstance(self.mechanism, Mechanism) and \ self.mechanism.to_json() or self.mechanism or None if self.stacktrace: stacktrace = self.stacktrace.to_json() else: stacktrace = None if self.raw_stacktrace: raw_stacktrace = self.raw_stacktrace.to_json() else: raw_stacktrace = None return prune_empty_keys({ 'type': self.type, 'value': self.value, 'mechanism': mechanism, 'module': self.module, 'stacktrace': stacktrace, 'thread_id': self.thread_id, 'raw_stacktrace': raw_stacktrace, })
def to_json(self): return prune_empty_keys({ 'abs_path': self.abs_path or None, 'filename': self.filename or None, 'platform': self.platform or None, 'module': self.module or None, 'function': self.function or None, 'package': self.package or None, 'image_addr': self.image_addr, 'symbol': self.symbol, 'symbol_addr': self.symbol_addr, 'instruction_addr': self.instruction_addr, 'trust': self.trust, 'in_app': self.in_app, 'context_line': self.context_line, 'pre_context': self.pre_context or None, 'post_context': self.post_context or None, 'vars': self.vars or None, 'data': self.data or None, 'errors': self.errors or None, 'lineno': self.lineno, 'colno': self.colno })
def to_json(self): mechanism = (isinstance(self.mechanism, Mechanism) and self.mechanism.to_json() or self.mechanism or None) if self.stacktrace: stacktrace = self.stacktrace.to_json() else: stacktrace = None if self.raw_stacktrace: raw_stacktrace = self.raw_stacktrace.to_json() else: raw_stacktrace = None return prune_empty_keys({ "type": self.type, "value": self.value, "mechanism": mechanism, "module": self.module, "stacktrace": stacktrace, "thread_id": self.thread_id, "raw_stacktrace": raw_stacktrace, })
def to_json(self): mechanism = isinstance(self.mechanism, Mechanism) and \ self.mechanism.to_json() or self.mechanism or None if self.stacktrace: stacktrace = self.stacktrace.to_json() else: stacktrace = None if self.raw_stacktrace: raw_stacktrace = self.raw_stacktrace.to_json() else: raw_stacktrace = None return prune_empty_keys({ 'type': self.type, 'value': self.value, 'mechanism': mechanism, 'module': self.module, 'stacktrace': stacktrace, 'thread_id': self.thread_id, 'raw_stacktrace': raw_stacktrace, })
def to_json(self): return prune_empty_keys({ 'abs_path': self.abs_path or None, 'filename': self.filename or None, 'platform': self.platform or None, 'module': self.module or None, 'function': self.function or None, 'package': self.package or None, 'image_addr': self.image_addr, 'symbol': self.symbol, 'symbol_addr': self.symbol_addr, 'instruction_addr': self.instruction_addr, 'trust': self.trust, 'in_app': self.in_app, 'context_line': self.context_line or None, 'pre_context': self.pre_context or None, 'post_context': self.post_context or None, 'vars': self.vars or None, 'data': self.data or None, 'errors': self.errors or None, 'lineno': self.lineno, 'colno': self.colno })
def upgrade_legacy_mechanism(data): """ Conversion from mechanism objects sent by old sentry-cocoa SDKs. It assumes "type": "generic" and moves "posix_signal", "mach_exception" into "meta". All other keys are moved into "data". Example old payload: >>> { >>> "posix_signal": { >>> "name": "SIGSEGV", >>> "code_name": "SEGV_NOOP", >>> "signal": 11, >>> "code": 0 >>> }, >>> "relevant_address": "0x1", >>> "mach_exception": { >>> "exception": 1, >>> "exception_name": "EXC_BAD_ACCESS", >>> "subcode": 8, >>> "code": 1 >>> } >>> } Example normalization: >>> { >>> "type": "generic", >>> "data": { >>> "relevant_address": "0x1" >>> }, >>> "meta": { >>> "mach_exception": { >>> "exception": 1, >>> "subcode": 8, >>> "code": 1, >>> "name": "EXC_BAD_ACCESS" >>> }, >>> "signal": { >>> "number": 11, >>> "code": 0, >>> "name": "SIGSEGV", >>> "code_name": "SEGV_NOOP" >>> } >>> } >>> } """ # Early exit for current protocol. We assume that when someone sends a # "type", we do not need to preprocess and can immediately validate if data is None or data.get('type') is not None: return data result = {'type': 'generic'} # "posix_signal" and "mach_exception" were optional root-level objects, # which have now moved to special keys inside "meta". We only create "meta" # if there is actual data to add. posix_signal = data.pop('posix_signal', None) if posix_signal and posix_signal.get('signal'): result.setdefault('meta', {})['signal'] = prune_empty_keys({ 'number': posix_signal.get('signal'), 'code': posix_signal.get('code'), 'name': posix_signal.get('name'), 'code_name': posix_signal.get('code_name'), }) mach_exception = data.pop('mach_exception', None) if mach_exception: result.setdefault('meta', {})['mach_exception'] = prune_empty_keys({ 'exception': mach_exception.get('exception'), 'code': mach_exception.get('code'), 'subcode': mach_exception.get('subcode'), 'name': mach_exception.get('exception_name'), }) # All remaining data has to be moved to the "data" key. We assume that even # if someone accidentally sent a corret top-level key (such as "handled"), # it will not pass our interface validation and should be moved to "data" # instead. result.setdefault('data', {}).update(data) return result
def to_json(self): return prune_empty_keys({ 'values': [v and v.to_json() for v in self.values] or None, 'exc_omitted': self.exc_omitted, })
def to_json(self): return prune_empty_keys({ 'frames': [f and f.to_json() for f in self.frames] or None, 'frames_omitted': self.frames_omitted, 'registers': self.registers, })
def to_json(self): return prune_empty_keys({ "message": self.message, "formatted": self.formatted, "params": self.params or None })
def upgrade_legacy_mechanism(data): """ Conversion from mechanism objects sent by old sentry-cocoa SDKs. It assumes "type": "generic" and moves "posix_signal", "mach_exception" into "meta". All other keys are moved into "data". Example old payload: >>> { >>> "posix_signal": { >>> "name": "SIGSEGV", >>> "code_name": "SEGV_NOOP", >>> "signal": 11, >>> "code": 0 >>> }, >>> "relevant_address": "0x1", >>> "mach_exception": { >>> "exception": 1, >>> "exception_name": "EXC_BAD_ACCESS", >>> "subcode": 8, >>> "code": 1 >>> } >>> } Example normalization: >>> { >>> "type": "generic", >>> "data": { >>> "relevant_address": "0x1" >>> }, >>> "meta": { >>> "mach_exception": { >>> "exception": 1, >>> "subcode": 8, >>> "code": 1, >>> "name": "EXC_BAD_ACCESS" >>> }, >>> "signal": { >>> "number": 11, >>> "code": 0, >>> "name": "SIGSEGV", >>> "code_name": "SEGV_NOOP" >>> } >>> } >>> } """ # Early exit for current protocol. We assume that when someone sends a # "type", we do not need to preprocess and can immediately validate if data is None or data.get('type') is not None: return data result = {'type': 'generic'} # "posix_signal" and "mach_exception" were optional root-level objects, # which have now moved to special keys inside "meta". We only create "meta" # if there is actual data to add. posix_signal = data.pop('posix_signal', None) if posix_signal and posix_signal.get('signal'): result.setdefault('meta', {})['signal'] = prune_empty_keys({ 'number': posix_signal.get('signal'), 'code': posix_signal.get('code'), 'name': posix_signal.get('name'), 'code_name': posix_signal.get('code_name'), }) mach_exception = data.pop('mach_exception', None) if mach_exception: result.setdefault('meta', {})['mach_exception'] = prune_empty_keys({ 'exception': mach_exception.get('exception'), 'code': mach_exception.get('code'), 'subcode': mach_exception.get('subcode'), 'name': mach_exception.get('exception_name'), }) # All remaining data has to be moved to the "data" key. We assume that even # if someone accidentally sent a corret top-level key (such as "handled"), # it will not pass our interface validation and should be moved to "data" # instead. result.setdefault('data', {}).update(data) return result
def to_json(self): return prune_empty_keys({ 'frames': [f and f.to_json() for f in self.frames] or None, 'frames_omitted': self.frames_omitted, 'registers': self.registers, })
def to_json(self): return prune_empty_keys({ 'message': self.message, 'formatted': self.formatted, 'params': self.params or None })
def to_json(self): return prune_empty_keys({ 'images': self.images or None, 'sdk_info': self.sdk_info or None, 'is_debug_build': self.is_debug_build })
def to_json(self): return prune_empty_keys({'values': self.values or None})
def to_json(self): return prune_empty_keys({ 'values': [v and v.to_json() for v in self.values] or None, 'exc_omitted': self.exc_omitted, })
def to_python(cls, data, rust_renormalized=RUST_RENORMALIZED_DEFAULT): if rust_renormalized: for key in ( 'type', 'synthetic', 'description', 'help_link', 'handled', 'data', 'meta', ): data.setdefault(key, None) return cls(**data) data = upgrade_legacy_mechanism(data) is_valid, errors = validate_and_default_interface(data, cls.path) if not is_valid: raise InterfaceValidationError("Invalid mechanism") if not data.get('type'): raise InterfaceValidationError("No 'type' present") mechanism_meta = data.get('meta') or {} mach_exception = mechanism_meta.get('mach_exception') if mach_exception is not None: mach_exception = prune_empty_keys({ 'exception': mach_exception['exception'], 'code': mach_exception['code'], 'subcode': mach_exception['subcode'], 'name': mach_exception.get('name'), }) signal = mechanism_meta.get('signal') if signal is not None: signal = prune_empty_keys({ 'number': signal['number'], 'code': signal.get('code'), 'name': signal.get('name'), 'code_name': signal.get('code_name'), }) errno = mechanism_meta.get('errno') if errno is not None: errno = prune_empty_keys({ 'number': errno['number'], 'name': errno.get('name'), }) kwargs = { 'type': trim(data['type'], 128), 'synthetic': data.get('synthetic'), 'description': trim(data.get('description'), 1024), 'help_link': trim(data.get('help_link'), 1024), 'handled': data.get('handled'), 'data': trim(data.get('data'), 4096), 'meta': { 'errno': errno, 'mach_exception': mach_exception, 'signal': signal, }, } return cls(**kwargs)
def to_json(self): return prune_empty_keys({ 'images': self.images or None, 'sdk_info': self.sdk_info or None, 'is_debug_build': self.is_debug_build })
def to_json(self): return prune_empty_keys({ "values": [v and v.to_json() for v in self.values] or None, "exc_omitted": self.exc_omitted, })
def to_json(self): return prune_empty_keys({ 'message': self.message, 'formatted': self.formatted, 'params': self.params or None })
def to_json(self): rv = dict(self.data) rv['type'] = self.type return prune_empty_keys(rv)
def to_json(self): rv = dict(self.data) rv['type'] = self.type return prune_empty_keys(rv)