Skip to content

Commit

Permalink
Don't attempt parsing falsy datetime values
Browse files Browse the repository at this point in the history
  • Loading branch information
Jordan Ambra committed Sep 22, 2017
1 parent ebb4e39 commit 8385642
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 1 deletion.
12 changes: 12 additions & 0 deletions declaration/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,18 +69,27 @@ def encode(self, value):
class DateTimeField(GenericField):

def parse(self, value):
if not value:
return value

if not isinstance(value, datetime.datetime):
value = parser.parse(value)

return value

def encode(self, value):
if not value:
return value

return value.strftime("%Y-%m-%dT%H:%M:%SZ")


class DateField(DateTimeField):

def parse(self, value):
if not value:
return value

if isinstance(value, six.string_types):
value = parser.parse(value)

Expand All @@ -93,6 +102,9 @@ def parse(self, value):
class TimeField(DateTimeField):

def parse(self, value):
if not value:
return value

if isinstance(value, datetime.datetime):
value = value.time()

Expand Down
19 changes: 19 additions & 0 deletions declaration/tests/test_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,25 @@ def test_time_field_trims_excess_from_date_time(self):
date_value = datetime.datetime(2013, 7, 31, 1, 33, 10)
assert date_value.time() == field.parse(date_value)

def test_date_time_fields_ignore_missing_values(self):
field = fields.DateTimeField()
assert field.parse("") == ""
assert field.parse(None) is None
assert field.encode("") == ""
assert field.encode(None) is None

field = fields.DateField()
assert field.parse("") == ""
assert field.parse(None) is None
assert field.encode("") == ""
assert field.encode(None) is None

field = fields.TimeField()
assert field.parse("") == ""
assert field.parse(None) is None
assert field.encode("") == ""
assert field.encode(None) is None

def test_uuid_field_converts(self):
field = fields.UUIDField()
value = "c3864285-1f1e-4c0c-bd95-ad5a8dbf3232"
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
author='Jordan Ambra',
author_email='jordan@serenitysoftware.io',
url='https://github.com/boomletsgo/declaration',
version='0.2.3',
version='0.2.4',
classifiers=classifiers,
description='Base classes and fields for declarative programming, like Django ORM',
keywords='declarative declaration metaclass',
Expand Down

0 comments on commit 8385642

Please sign in to comment.