Skip to content

Commit e429af9

Browse files
authored
Add date support (dfurtado#45)
1 parent 09b5372 commit e429af9

File tree

3 files changed

+32
-7
lines changed

3 files changed

+32
-7
lines changed

dataclass_csv/dataclass_reader.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import dataclasses
22
import csv
33

4-
from datetime import datetime
4+
from datetime import date, datetime
55
from distutils.util import strtobool
66
from typing import Union, Type, Optional, Sequence, Dict, Any, List
77

@@ -157,7 +157,7 @@ def _get_value(self, row, field):
157157
else:
158158
return value
159159

160-
def _parse_date_value(self, field, date_value):
160+
def _parse_date_value(self, field, date_value, field_type):
161161
dateformat = self._get_metadata_option(field, "dateformat")
162162

163163
if not isinstance(date_value, str):
@@ -175,7 +175,13 @@ def _parse_date_value(self, field, date_value):
175175
"{'dateformat': <date_format>})`."
176176
)
177177
)
178-
return datetime.strptime(date_value, dateformat)
178+
179+
datetime_obj = datetime.strptime(date_value, dateformat)
180+
181+
if field_type == date:
182+
return datetime_obj.date()
183+
else:
184+
return datetime_obj
179185

180186
def _process_row(self, row):
181187
values = dict()
@@ -200,9 +206,9 @@ def _process_row(self, row):
200206
if len(type_args) == 1:
201207
field_type = type_args[0]
202208

203-
if field_type is datetime:
209+
if field_type is datetime or field_type is date:
204210
try:
205-
transformed_value = self._parse_date_value(field, value)
211+
transformed_value = self._parse_date_value(field, value, field_type)
206212
except ValueError as ex:
207213
raise CsvValueError(ex, line_number=self._reader.line_num) from None
208214
else:

tests/mocks.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import dataclasses
22
import re
33

4-
from datetime import datetime
4+
from datetime import date, datetime
55

66
from dataclass_csv import dateformat, accept_whitespaces
77

@@ -52,6 +52,13 @@ class UserWithDateFormatDecorator:
5252
create_date: datetime
5353

5454

55+
@dateformat("%Y-%m-%d")
56+
@dataclasses.dataclass
57+
class UserWithDateFormatDecoratorAndDateField:
58+
name: str
59+
create_date: date
60+
61+
5562
@dataclasses.dataclass
5663
class UserWithDateFormatMetadata:
5764
name: str

tests/test_dataclass_reader.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import pytest
22
import dataclasses
33

4-
from datetime import datetime
4+
from datetime import date, datetime
55
from dataclass_csv import DataclassReader, CsvValueError
66

77
from .mocks import (
@@ -12,6 +12,7 @@
1212
UserWithInitFalse,
1313
UserWithInitFalseAndDefaultValue,
1414
UserWithDefaultDatetimeField,
15+
UserWithDateFormatDecoratorAndDateField,
1516
UserWithSSN,
1617
SSN,
1718
UserWithEmail,
@@ -183,6 +184,17 @@ def test_reader_with_datetime_default_value(create_csv):
183184
assert isinstance(items[0].birthday, datetime)
184185

185186

187+
def test_reader_with_date(create_csv):
188+
csv_file = create_csv({"name": "User", "create_date": "2019-01-01"})
189+
190+
with csv_file.open() as f:
191+
reader = DataclassReader(f, UserWithDateFormatDecoratorAndDateField)
192+
items = list(reader)
193+
assert len(items) > 0
194+
assert isinstance(items[0].create_date, date)
195+
assert items[0].create_date == date(2019, 1, 1)
196+
197+
186198
def test_should_parse_user_defined_types(create_csv):
187199
csv_file = create_csv(
188200
[

0 commit comments

Comments
 (0)