Kaydet (Commit) c7c098cf authored tarafından Markus Holtermann's avatar Markus Holtermann Kaydeden (comit) Baptiste Mispelon

Fixed #23770 -- Changed serialization strategy for floats with respect to NaN and Inf

Thanks to w0rp for the report
üst b07aa52e
from __future__ import unicode_literals from __future__ import unicode_literals
import collections
import datetime import datetime
import inspect
import decimal import decimal
import collections
from importlib import import_module from importlib import import_module
import inspect
import math
import os import os
import re import re
import sys import sys
...@@ -304,7 +305,11 @@ class MigrationWriter(object): ...@@ -304,7 +305,11 @@ class MigrationWriter(object):
elif isinstance(value, SettingsReference): elif isinstance(value, SettingsReference):
return "settings.%s" % value.setting_name, {"from django.conf import settings"} return "settings.%s" % value.setting_name, {"from django.conf import settings"}
# Simple types # Simple types
elif isinstance(value, six.integer_types + (float, bool, type(None))): elif isinstance(value, float):
if math.isnan(value) or math.isinf(value):
return 'float("{}")'.format(value), set()
return repr(value), set()
elif isinstance(value, six.integer_types + (bool, type(None))):
return repr(value), set() return repr(value), set()
elif isinstance(value, six.binary_type): elif isinstance(value, six.binary_type):
value_repr = repr(value) value_repr = repr(value)
......
...@@ -49,3 +49,6 @@ Bugfixes ...@@ -49,3 +49,6 @@ Bugfixes
* Allowed usage of ``DateTimeField()`` as ``Transform.output_field`` * Allowed usage of ``DateTimeField()`` as ``Transform.output_field``
(:ticket:`23420`). (:ticket:`23420`).
* Fixed a migration serializing bug involving ``float("nan")`` and
``float("inf")`` (:ticket:23770:).
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import datetime import datetime
import math
import os import os
import re import re
import tokenize import tokenize
...@@ -69,6 +70,10 @@ class WriterTests(TestCase): ...@@ -69,6 +70,10 @@ class WriterTests(TestCase):
""" """
# Basic values # Basic values
self.assertSerializedEqual(1) self.assertSerializedEqual(1)
self.assertSerializedEqual(1.2)
self.assertTrue(math.isinf(self.serialize_round_trip(float("inf"))))
self.assertTrue(math.isinf(self.serialize_round_trip(float("-inf"))))
self.assertTrue(math.isnan(self.serialize_round_trip(float("nan"))))
self.assertSerializedEqual(None) self.assertSerializedEqual(None)
self.assertSerializedEqual(b"foobar") self.assertSerializedEqual(b"foobar")
string, imports = MigrationWriter.serialize(b"foobar") string, imports = MigrationWriter.serialize(b"foobar")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment