adding min & max length validation to the Text column type

This commit is contained in:
Blake Eggleston
2013-01-06 10:28:07 -08:00
parent e529f33dbe
commit 16e4a62932
2 changed files with 60 additions and 0 deletions

View File

@@ -146,6 +146,23 @@ class Ascii(Column):
class Text(Column):
db_type = 'text'
def __init__(self, *args, **kwargs):
self.min_length = kwargs.pop('min_length', 1 if kwargs.get('required', True) else None)
self.max_length = kwargs.pop('max_length', None)
super(Text, self).__init__(*args, **kwargs)
def validate(self, value):
value = super(Text, self).validate(value)
if not isinstance(value, (basestring, bytearray)) and value is not None:
raise ValidationError('{} is not a string'.format(type(value)))
if self.max_length:
if len(value) > self.max_length:
raise ValidationError('{} is longer than {} characters'.format(self.column_name, self.max_length))
if self.min_length:
if len(value) < self.min_length:
raise ValidationError('{} is shorter than {} characters'.format(self.column_name, self.min_length))
return value
class Integer(Column):
db_type = 'int'

View File

@@ -1,6 +1,7 @@
#tests the behavior of the column classes
from datetime import datetime
from decimal import Decimal as D
from cqlengine import ValidationError
from cqlengine.tests.base import BaseCassEngTestCase
@@ -94,6 +95,48 @@ class TestInteger(BaseCassEngTestCase):
it = self.IntegerTest()
it.validate()
class TestText(BaseCassEngTestCase):
def test_min_length(self):
#min len defaults to 1
col = Text()
with self.assertRaises(ValidationError):
col.validate('')
col.validate('b')
#test not required defaults to 0
Text(required=False).validate('')
#test arbitrary lengths
Text(min_length=0).validate('')
Text(min_length=5).validate('blake')
Text(min_length=5).validate('blaketastic')
with self.assertRaises(ValidationError):
Text(min_length=6).validate('blake')
def test_max_length(self):
Text(max_length=5).validate('blake')
with self.assertRaises(ValidationError):
Text(max_length=5).validate('blaketastic')
def test_type_checking(self):
Text().validate('string')
Text().validate(u'unicode')
Text().validate(bytearray('bytearray'))
with self.assertRaises(ValidationError):
Text().validate(None)
with self.assertRaises(ValidationError):
Text().validate(5)
with self.assertRaises(ValidationError):
Text().validate(True)