Browse Source

Moved hydrators to their own module, covered them with tests. #320

Rafał Pitoń 11 years ago
parent
commit
281ad270ef

+ 56 - 0
misago/conf/hydrators.py

@@ -0,0 +1,56 @@
+def hydrate_string(dry_value):
+    return dry_value
+
+
+def dehydrate_string(wet_value):
+    return wet_value
+
+
+def hydrate_bool(dry_value):
+    return dry_value == 'True'
+
+
+def dehydrate_bool(wet_value):
+    return 'True' if wet_value else 'False'
+
+
+def hydrate_int(dry_value):
+    return int(dry_value)
+
+
+def dehydrate_int(wet_value):
+    return unicode(wet_value)
+
+
+def hydrate_list(dry_value):
+    return [x for x in dry_value.split(',') if x]
+
+
+def dehydrate_list(wet_value):
+    return ','.join(wet_value)
+
+
+VALUE_HYDRATORS = {
+    'string': (hydrate_string, dehydrate_string),
+    'bool': (hydrate_bool, dehydrate_bool),
+    'int': (hydrate_int, dehydrate_int),
+    'list': (hydrate_list, dehydrate_list),
+}
+
+
+def hydrate_value(python_type, dry_value):
+    try:
+        value_hydrator = VALUE_HYDRATORS[python_type][0]
+    except KeyError:
+        raise ValueError("%s type is not hydrateable" % python_type)
+
+    return value_hydrator(dry_value)
+
+
+def dehydrate_value(python_type, wet_value):
+    try:
+        value_dehydrator = VALUE_HYDRATORS[python_type][1]
+    except KeyError:
+        raise ValueError("%s type is not dehydrateable" % python_type)
+
+    return value_dehydrator(wet_value)

+ 3 - 54
misago/conf/models.py

@@ -1,5 +1,6 @@
 import base64
 import base64
 from django.db import models
 from django.db import models
+from misago.conf import hydrators
 try:
 try:
     import cPickle as pickle
     import cPickle as pickle
 except ImportError:
 except ImportError:
@@ -12,58 +13,6 @@ class SettingsGroup(models.Model):
     description = models.TextField(null=True, blank=True)
     description = models.TextField(null=True, blank=True)
 
 
 
 
-# Setting hydrate/dehydrate functions
-
-def hydrate_string(dry_value):
-    return dry_value
-
-
-def dehydrate_string(wet_value):
-    return wet_value
-
-
-def hydrate_bool(dry_value):
-    return dry_value == 'True'
-
-
-def dehydrate_bool(wet_value):
-    return 'True' if dry_value else 'False'
-
-
-def hydrate_int(dry_value):
-    return int(dry_value)
-
-
-def dehydrate_int(wet_value):
-    return unicode(wet_value)
-
-
-def hydrate_list(dry_value):
-    return dry_value.split(',')
-
-
-def dehydrate_list(wet_value):
-    return ','.join(wet_value)
-
-
-VALUE_HYDRATORS = {
-    'string': (hydrate_string, dehydrate_string),
-    'bool': (hydrate_bool, dehydrate_bool),
-    'int': (hydrate_int, dehydrate_int),
-    'list': (hydrate_list, dehydrate_list),
-}
-
-
-def hydrate_value(python_type, dry_value):
-    value_hydrator = VALUE_HYDRATORS[python_type][0]
-    return value_hydrator(dry_value)
-
-
-def dehydrate_value(python_type, wet_value):
-    value_dehydrator = VALUE_HYDRATORS[python_type][1]
-    return value_dehydrator(wet_value)
-
-
 class Setting(models.Model):
 class Setting(models.Model):
     group = models.ForeignKey('SettingsGroup')
     group = models.ForeignKey('SettingsGroup')
     setting = models.CharField(max_length=255, unique=True)
     setting = models.CharField(max_length=255, unique=True)
@@ -80,11 +29,11 @@ class Setting(models.Model):
 
 
     @property
     @property
     def value(self):
     def value(self):
-        return hydrate_value(self.python_type, self.dry_value)
+        return hydrators.hydrate_value(self.python_type, self.dry_value)
 
 
     @value.setter
     @value.setter
     def value(self, new_value):
     def value(self, new_value):
-        return dehydrate_value(self.python_type, self.new_value)
+        return hydrators.dehydrate_value(self.python_type, self.new_value)
 
 
     @property
     @property
     def has_custom_value(self):
     def has_custom_value(self):

+ 0 - 0
misago/conf/tests/__init__.py


+ 38 - 0
misago/conf/tests/test_hydrators.py

@@ -0,0 +1,38 @@
+from django.test import TestCase
+from misago.conf.hydrators import hydrate_value, dehydrate_value
+
+
+class HydratorsTests(TestCase):
+    def test_hydrate_dehydrate_string(self):
+        """string value is correctly hydrated and dehydrated"""
+        wet_value = 'Ni!'
+        dry_value = dehydrate_value('string', wet_value)
+        self.assertEqual(hydrate_value('string', dry_value), wet_value)
+
+    def test_hydrate_dehydrate_bool(self):
+        """bool values is correctly hydrated and dehydrated"""
+        wet_value = True
+        dry_value = dehydrate_value('bool', wet_value)
+        self.assertEqual(hydrate_value('bool', dry_value), wet_value)
+
+        wet_value = False
+        dry_value = dehydrate_value('bool', wet_value)
+        self.assertEqual(hydrate_value('bool', dry_value), wet_value)
+
+    def test_hydrate_dehydrate_int(self):
+        """int value is correctly hydrated and dehydrated"""
+        wet_value = 9001
+        dry_value = dehydrate_value('int', wet_value)
+        self.assertEqual(hydrate_value('int', dry_value), wet_value)
+
+    def test_hydrate_dehydrate_list(self):
+        """list value is correctly hydrated and dehydrated"""
+        wet_value = ['foxtrot', 'uniform', 'hotel']
+        dry_value = dehydrate_value('list', wet_value)
+        self.assertEqual(hydrate_value('list', dry_value), wet_value)
+
+    def test_hydrate_dehydrate_empty_list(self):
+        """list value is correctly hydrated and dehydrated"""
+        wet_value = []
+        dry_value = dehydrate_value('list', wet_value)
+        self.assertEqual(hydrate_value('list', dry_value), wet_value)