diff --git a/rows/fields.py b/rows/fields.py index dc308e66..a45a840c 100644 --- a/rows/fields.py +++ b/rows/fields.py @@ -171,7 +171,7 @@ def deserialize(cls, value, *args, **kwargs): return value elif isinstance(value, float): new_value = int(value) - if new_value != value: + if not new_value is value: # we want 1.0 to be different from 1 raise ValueError("It's float, not integer") else: value = new_value diff --git a/tests/tests_fields.py b/tests/tests_fields.py index 9811da14..ecc343e9 100644 --- a/tests/tests_fields.py +++ b/tests/tests_fields.py @@ -430,6 +430,19 @@ def test_detect_types_binary(self): result = fields.detect_types(self.fields, values) self.assertDictEqual(dict(result), expected) + def test_detect_types_float_int(self): + '''detect_types must preserve object type + + From issue: https://github.com/turicas/rows/issues/198 + ''' + + field_names = ['field1', 'field2'] + expected = {'field1': fields.IntegerField, + 'field2': fields.FloatField, } + + assert expected == fields.detect_types(field_names, [[42, 1.2]]) + assert expected == fields.detect_types(field_names, [[42, 1.0]]) + def test_detect_types(self): result = fields.detect_types(self.fields, self.data) self.assertDictEqual(dict(result), self.expected)