summaryrefslogtreecommitdiffstats
path: root/ipalib/encoder.py
diff options
context:
space:
mode:
authorMartin Kosek <mkosek@redhat.com>2012-01-17 11:19:00 +0100
committerMartin Kosek <mkosek@redhat.com>2012-01-20 08:13:44 +0100
commit092dd8db1293599a4b7f0ab33ea43e8082ec554f (patch)
tree4de216fe1b4a69f8d2acb4550dee8716dd1e0b53 /ipalib/encoder.py
parentd906fa50c1fd56ceb1a602fe50129becb6a304d4 (diff)
downloadfreeipa-092dd8db1293599a4b7f0ab33ea43e8082ec554f.tar.gz
freeipa-092dd8db1293599a4b7f0ab33ea43e8082ec554f.tar.xz
freeipa-092dd8db1293599a4b7f0ab33ea43e8082ec554f.zip
Replace float with Decimal
Having float type as a base type for floating point parameters in ipalib introduces several issues, e.g. problem with representation or value comparison. Python language provides a Decimal type which help overcome these issues. This patch replaces a float type and Float parameter with a decimal.Decimal type in Decimal parameter. A precision attribute was added to Decimal parameter that can be used to limit a number of decimal places in parameter representation. This approach fixes a problem with API.txt validation where comparison of float values may fail on different architectures due to float representation error. In order to safely transfer the parameter value over RPC it is being converted to string which is then converted back to decimal.Decimal number on a server side. https://fedorahosted.org/freeipa/ticket/2260
Diffstat (limited to 'ipalib/encoder.py')
-rw-r--r--ipalib/encoder.py6
1 files changed, 4 insertions, 2 deletions
diff --git a/ipalib/encoder.py b/ipalib/encoder.py
index f23e5659e..8d59bd316 100644
--- a/ipalib/encoder.py
+++ b/ipalib/encoder.py
@@ -20,6 +20,8 @@
Encoding capabilities.
"""
+from decimal import Decimal
+
class EncoderSettings(object):
"""
Container for encoder settings.
@@ -77,7 +79,7 @@ class Encoder(object):
return self.encoder_settings.encode_postprocessor(
var.encode(self.encoder_settings.encode_to)
)
- elif isinstance(var, (bool, float, int, long)):
+ elif isinstance(var, (bool, float, Decimal, int, long)):
return self.encoder_settings.encode_postprocessor(
str(var).encode(self.encoder_settings.encode_to)
)
@@ -131,7 +133,7 @@ class Encoder(object):
return self.encoder_settings.decode_postprocessor(
var.decode(self.encoder_settings.decode_from)
)
- elif isinstance(var, (bool, float, int, long)):
+ elif isinstance(var, (bool, float, Decimal, int, long)):
return var
elif isinstance(var, list):
return [self.decode(m) for m in var]