From 69ee4a81d899dfe1e2500f286f3bd8309ede9eb2 Mon Sep 17 00:00:00 2001 From: Markus Unterwaditzer Date: Fri, 14 Dec 2018 14:35:35 -0800 Subject: [PATCH 1/4] fix: Dont serialize nan when present in vars --- raven/utils/serializer/base.py | 12 +++++++++++- tests/base/tests.py | 12 ++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/raven/utils/serializer/base.py b/raven/utils/serializer/base.py index 92b2102d8..b4c97c563 100644 --- a/raven/utils/serializer/base.py +++ b/raven/utils/serializer/base.py @@ -174,7 +174,17 @@ class FloatSerializer(Serializer): types = (float,) def serialize(self, value, **kwargs): - return float(value) + value = float(value) + + if value == float('inf'): + return '' + if value == float('-inf'): + return '<-inf>' + # lol checking for float('nan') + if value != value: + return '' + + return value class IntegerSerializer(Serializer): diff --git a/tests/base/tests.py b/tests/base/tests.py index df032783e..bed1c17b6 100644 --- a/tests/base/tests.py +++ b/tests/base/tests.py @@ -307,6 +307,18 @@ def test_exception_event(self): self.assertEquals(frame['function'], 'test_exception_event') self.assertTrue('timestamp' in event) + def test_exception_nan_in_vars(self): + try: + foo = float("nan") # noqa + raise ValueError("foo") + except ValueError: + self.client.captureException() + + event, = self.client.events + exc, = event['exception']['values'] + frame, = exc['stacktrace']['frames'] + assert frame['vars']['foo'] == "" + def test_exception_event_true_exc_info(self): try: raise ValueError('foo') From 41a179f433d2a02287bf79834e15751d4e0fd2d4 Mon Sep 17 00:00:00 2001 From: Markus Unterwaditzer Date: Tue, 18 Dec 2018 19:10:02 +0100 Subject: [PATCH 2/4] fix: Simplify float serializer --- raven/utils/serializer/base.py | 13 ++----------- tests/base/tests.py | 2 +- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/raven/utils/serializer/base.py b/raven/utils/serializer/base.py index b4c97c563..94a369de2 100644 --- a/raven/utils/serializer/base.py +++ b/raven/utils/serializer/base.py @@ -174,17 +174,8 @@ class FloatSerializer(Serializer): types = (float,) def serialize(self, value, **kwargs): - value = float(value) - - if value == float('inf'): - return '' - if value == float('-inf'): - return '<-inf>' - # lol checking for float('nan') - if value != value: - return '' - - return value + # Wrap with repr to convert inf/nan to string + return repr(float(value)) class IntegerSerializer(Serializer): diff --git a/tests/base/tests.py b/tests/base/tests.py index bed1c17b6..dfaf64581 100644 --- a/tests/base/tests.py +++ b/tests/base/tests.py @@ -317,7 +317,7 @@ def test_exception_nan_in_vars(self): event, = self.client.events exc, = event['exception']['values'] frame, = exc['stacktrace']['frames'] - assert frame['vars']['foo'] == "" + assert frame['vars']['foo'] == "nan" def test_exception_event_true_exc_info(self): try: From be357f52302abd3086c3c6a6f95c4007e16de9bf Mon Sep 17 00:00:00 2001 From: Markus Unterwaditzer Date: Wed, 19 Dec 2018 01:03:53 +0100 Subject: [PATCH 3/4] fix: Tests --- tests/utils/encoding/tests.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/utils/encoding/tests.py b/tests/utils/encoding/tests.py index 50c186a15..992868149 100644 --- a/tests/utils/encoding/tests.py +++ b/tests/utils/encoding/tests.py @@ -65,8 +65,7 @@ def test_bad_string(self): def test_float(self): result = transform(13.0) - self.assertEqual(type(result), float) - self.assertEqual(result, 13.0) + self.assertEqual(result, "13.0") def test_bool(self): result = transform(True) From 510b39b0a5c51e868cf0c8ff6b32059f9d7d0c2c Mon Sep 17 00:00:00 2001 From: Markus Unterwaditzer Date: Wed, 19 Dec 2018 01:05:53 +0100 Subject: [PATCH 4/4] fix: Convert all numbers to string --- raven/utils/serializer/base.py | 6 +++--- tests/utils/encoding/tests.py | 8 +++----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/raven/utils/serializer/base.py b/raven/utils/serializer/base.py index 94a369de2..465d0d1dd 100644 --- a/raven/utils/serializer/base.py +++ b/raven/utils/serializer/base.py @@ -167,7 +167,7 @@ class BooleanSerializer(Serializer): types = (bool,) def serialize(self, value, **kwargs): - return bool(value) + return repr(bool(value)) class FloatSerializer(Serializer): @@ -182,7 +182,7 @@ class IntegerSerializer(Serializer): types = (int,) def serialize(self, value, **kwargs): - return int(value) + return repr(int(value)) class FunctionSerializer(Serializer): @@ -198,7 +198,7 @@ class LongSerializer(Serializer): types = (long,) # noqa def serialize(self, value, **kwargs): - return long(value) # noqa + return repr(long(value)) # noqa # register all serializers, order matters diff --git a/tests/utils/encoding/tests.py b/tests/utils/encoding/tests.py index 992868149..08f9387ac 100644 --- a/tests/utils/encoding/tests.py +++ b/tests/utils/encoding/tests.py @@ -69,16 +69,14 @@ def test_float(self): def test_bool(self): result = transform(True) - self.assertEqual(type(result), bool) - self.assertEqual(result, True) + self.assertEqual(result, 'True') def test_int_subclass(self): class X(int): pass result = transform(X()) - self.assertEqual(type(result), int) - self.assertEqual(result, 0) + self.assertEqual(result, '0') def test_dict_keys(self): x = {'foo': 'bar'} @@ -175,7 +173,7 @@ def test_recursion_max_depth(self): def test_list_max_length(self): x = list(range(10)) result = transform(x, list_max_length=3) - self.assertEqual(result, (0, 1, 2)) + self.assertEqual(result, ('0', '1', '2')) def test_dict_max_length(self): x = dict((x, x) for x in range(10))