Skip to content

Commit

Permalink
Merge 42a68de into 7f96bcd
Browse files Browse the repository at this point in the history
  • Loading branch information
alfred82santa committed May 30, 2016
2 parents 7f96bcd + 42a68de commit c39a57c
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 7 deletions.
24 changes: 19 additions & 5 deletions dirty_models/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
Fields to be used with dirty models.
"""

from datetime import datetime, date, time
from datetime import datetime, date, time, timedelta
from dateutil.parser import parse as dateutil_parse
from .model_types import ListModel
from collections import Mapping


__all__ = ['IntegerField', 'FloatField', 'BooleanField', 'StringField', 'StringIdField',
'TimeField', 'DateField', 'DateTimeField', 'ModelField', 'ArrayField',
'TimeField', 'DateField', 'DateTimeField', 'TimedeltaField', 'ModelField', 'ArrayField',
'HashMapField', 'BlobField', 'MultiTypeField']


Expand Down Expand Up @@ -130,9 +130,9 @@ def check_value(self, value):
return isinstance(value, float)

def can_use_value(self, value):
return isinstance(value, int) \
or (isinstance(value, str)
and value.replace('.', '', 1).isnumeric())
return isinstance(value, int) or \
(isinstance(value, str) and
value.replace('.', '', 1).isnumeric())


class BooleanField(BaseField):
Expand Down Expand Up @@ -376,6 +376,20 @@ def can_use_value(self, value):
return isinstance(value, (int, str, date, dict, list))


class TimedeltaField(BaseField):
"""It allows to use a timedelta as value in a field."""

def convert_value(self, value):
if isinstance(value, (int, float)):
return timedelta(seconds=value)

def check_value(self, value):
return type(value) is timedelta

def can_use_value(self, value):
return isinstance(value, (int, float))


class ModelField(BaseField):

"""
Expand Down
31 changes: 29 additions & 2 deletions tests/dirty_models/tests_fields.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from unittest import TestCase
from dirty_models.fields import (IntegerField, StringField, BooleanField,
FloatField, ModelField, TimeField, DateField,
DateTimeField, ArrayField, StringIdField, HashMapField, MultiTypeField)
DateTimeField, ArrayField, StringIdField, HashMapField, MultiTypeField, TimedeltaField)
from dirty_models.models import BaseModel, HashMapModel
from dirty_models.model_types import ListModel

from datetime import time, date, datetime, timezone
from datetime import time, date, datetime, timezone, timedelta
import iso8601


Expand Down Expand Up @@ -1467,3 +1467,30 @@ def test_model_reference(self):
self.assertIsInstance(self.model.multi_field[0], self.model.__class__)
self.assertIsInstance(self.model.multi_field[1], self.model.__class__)
self.assertIsInstance(self.model.array_of_array[0][0], self.model.__class__)


class TestTimedeltaField(TestCase):

def setUp(self):
self.field = TimedeltaField()

def test_check_value_success(self):
self.assertTrue(self.field.check_value(timedelta(seconds=0)))

def test_check_value_fail(self):
self.assertFalse(self.field.check_value(12))

def test_can_use_value_int(self):
self.assertTrue(self.field.can_use_value(12))

def test_can_use_value_float(self):
self.assertTrue(self.field.can_use_value(12.11))

def test_can_use_value_fail(self):
self.assertFalse(self.field.can_use_value('test'))

def test_convert_value_int(self):
self.assertTrue(self.field.convert_value(12), timedelta(seconds=12))

def test_convert_value_float(self):
self.assertTrue(self.field.convert_value(12.11), timedelta(seconds=12, milliseconds=110))

0 comments on commit c39a57c

Please sign in to comment.