From bcbc18a82004f3fa07fbbb6ceee1c56ac92972f2 Mon Sep 17 00:00:00 2001 From: Ken Sheppardson Date: Mon, 18 May 2015 16:18:10 -0700 Subject: [PATCH 1/2] Use scrub mechanism to clean up odd int/long/floats Fixes #60 --- rollbar/__init__.py | 7 +++++++ rollbar/test/test_rollbar.py | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/rollbar/__init__.py b/rollbar/__init__.py index be3a930d..9f4541cb 100644 --- a/rollbar/__init__.py +++ b/rollbar/__init__.py @@ -7,6 +7,7 @@ import inspect import json import logging +import math import os import socket import sys @@ -871,6 +872,12 @@ def _scrub(obj, k=None): return dict((_k, _scrub(v, _k)) for _k, v in obj.items()) elif isinstance(obj, list): return [_scrub(x, k) for x in obj] + elif isinstance(obj, float) and math.isnan(obj): + return 'NaN' + elif isinstance(obj, float) and math.isinf(obj): + return 'Inf' + elif isinstance(obj, (int, long, float)) and str(obj + 0) != str(obj): + return str(obj) else: return obj diff --git a/rollbar/test/test_rollbar.py b/rollbar/test/test_rollbar.py index 03fd4b96..62998090 100644 --- a/rollbar/test/test_rollbar.py +++ b/rollbar/test/test_rollbar.py @@ -684,6 +684,25 @@ def _raise(): self.assertEqual('*********', payload['data']['body']['trace']['frames'][-1]['locals']['password']) + @mock.patch('rollbar.send_payload') + def test_scrub_nans(self, send_payload): + def _raise(): + infinity = float('Inf') + not_a_number = float('NaN') + raise Exception() + + try: + _raise() + except: + rollbar.report_exc_info() + + self.assertEqual(send_payload.called, True) + + payload = send_payload.call_args[0][0] + + self.assertEqual('Inf', payload['data']['body']['trace']['frames'][-1]['locals']['infinity']) + self.assertEqual('NaN', payload['data']['body']['trace']['frames'][-1]['locals']['not_a_number']) + @mock.patch('rollbar.send_payload') def test_cannot_scrub_local_ref(self, send_payload): """ From 80704ed144e31b8a10c81dc83fa57a32dcbd940b Mon Sep 17 00:00:00 2001 From: Ken Sheppardson Date: Mon, 18 May 2015 20:11:56 -0700 Subject: [PATCH 2/2] Fix 'long' check for Python 3 --- rollbar/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rollbar/__init__.py b/rollbar/__init__.py index 9f4541cb..4f001b93 100644 --- a/rollbar/__init__.py +++ b/rollbar/__init__.py @@ -8,6 +8,7 @@ import json import logging import math +import numbers import os import socket import sys @@ -876,7 +877,7 @@ def _scrub(obj, k=None): return 'NaN' elif isinstance(obj, float) and math.isinf(obj): return 'Inf' - elif isinstance(obj, (int, long, float)) and str(obj + 0) != str(obj): + elif isinstance(obj, (numbers.Integral, float)) and str(obj + 0) != str(obj): return str(obj) else: return obj