From fb6543c973b8e445a96c110780fdecd0d8ebf7e1 Mon Sep 17 00:00:00 2001 From: Tommaso Barbugli Date: Wed, 4 Sep 2013 15:56:09 +0200 Subject: [PATCH] add VarInt column --- cqlengine/columns.py | 20 ++++++++++++++++ cqlengine/tests/columns/test_validation.py | 28 +++++++++++++++++++++- docs/topics/columns.rst | 6 +++++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/cqlengine/columns.py b/cqlengine/columns.py index 9940f1aa..be3e1931 100644 --- a/cqlengine/columns.py +++ b/cqlengine/columns.py @@ -246,6 +246,26 @@ class Integer(Column): return self.validate(value) +class VarInt(Column): + db_type = 'varint' + + def validate(self, value): + val = super(VarInt, self).validate(value) + if val is None: + return + try: + return long(val) + except (TypeError, ValueError): + raise ValidationError( + "{} can't be converted to integral value".format(value)) + + def to_python(self, value): + return self.validate(value) + + def to_database(self, value): + return self.validate(value) + + class CounterValueManager(BaseValueManager): def __init__(self, instance, column, value): super(CounterValueManager, self).__init__(instance, column, value) diff --git a/cqlengine/tests/columns/test_validation.py b/cqlengine/tests/columns/test_validation.py index 53cd738c..e2393d5b 100644 --- a/cqlengine/tests/columns/test_validation.py +++ b/cqlengine/tests/columns/test_validation.py @@ -14,6 +14,7 @@ from cqlengine.columns import Bytes from cqlengine.columns import Ascii from cqlengine.columns import Text from cqlengine.columns import Integer +from cqlengine.columns import VarInt from cqlengine.columns import DateTime from cqlengine.columns import Date from cqlengine.columns import UUID @@ -24,6 +25,9 @@ from cqlengine.columns import Decimal from cqlengine.management import create_table, delete_table from cqlengine.models import Model +import sys + + class TestDatetime(BaseCassEngTestCase): class DatetimeTest(Model): test_id = Integer(primary_key=True) @@ -64,6 +68,28 @@ class TestDatetime(BaseCassEngTestCase): assert dt2.created_at.isoformat() == datetime(today.year, today.month, today.day).isoformat() +class TestVarInt(BaseCassEngTestCase): + class VarIntTest(Model): + test_id = Integer(primary_key=True) + bignum = VarInt(primary_key=True) + + @classmethod + def setUpClass(cls): + super(TestVarInt, cls).setUpClass() + create_table(cls.VarIntTest) + + @classmethod + def tearDownClass(cls): + super(TestVarInt, cls).tearDownClass() + delete_table(cls.VarIntTest) + + def test_varint_io(self): + long_int = sys.maxint + 1 + int1 = self.VarIntTest.objects.create(test_id=0, bignum=long_int) + int2 = self.VarIntTest.objects(test_id=0).first() + assert int1.bignum == int2.bignum + + class TestDate(BaseCassEngTestCase): class DateTest(Model): test_id = Integer(primary_key=True) @@ -109,7 +135,7 @@ class TestDecimal(BaseCassEngTestCase): super(TestDecimal, cls).tearDownClass() delete_table(cls.DecimalTest) - def test_datetime_io(self): + def test_decimal_io(self): dt = self.DecimalTest.objects.create(test_id=0, dec_val=D('0.00')) dt2 = self.DecimalTest.objects(test_id=0).first() assert dt2.dec_val == dt.dec_val diff --git a/docs/topics/columns.rst b/docs/topics/columns.rst index 5ee9a186..0418147f 100644 --- a/docs/topics/columns.rst +++ b/docs/topics/columns.rst @@ -42,6 +42,12 @@ Columns columns.Integer() +.. class:: VarInt() + + Stores an arbitrary-precision integer :: + + columns.VarInt() + .. class:: DateTime() Stores a datetime value.