-
Notifications
You must be signed in to change notification settings - Fork 140
/
date.py
69 lines (57 loc) · 1.87 KB
/
date.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
from __future__ import annotations
from datetime import date, datetime
from typing import Any
import attrs
from .. import settings
from ..platform import platform
from ..schema import Field
@attrs.define(kw_only=True, repr=False)
class DateField(Field):
type = "date"
builtin = True
supported_constraints = [
"required",
"minimum",
"maximum",
"enum",
]
# Read
# TODO: use different value_readers based on format (see string)
def create_value_reader(self):
# Create reader
def value_reader(cell: Any):
if isinstance(cell, datetime):
value_time = cell.time()
if (
value_time.hour == 0
and value_time.minute == 0
and value_time.second == 0
):
return datetime(cell.year, cell.month, cell.day).date()
else:
return None
if isinstance(cell, date):
return cell
if not isinstance(cell, str):
return None
try:
if self.format == "default":
cell = datetime.strptime(cell, settings.DEFAULT_DATE_PATTERN).date()
elif self.format == "any":
cell = platform.dateutil_parser.parse(cell).date()
else:
cell = datetime.strptime(cell, self.format).date()
except Exception:
return None
return cell
return value_reader
# Write
def create_value_writer(self):
# Create format
format = self.format
if format == settings.DEFAULT_FIELD_FORMAT:
format = settings.DEFAULT_DATE_PATTERN
# Create writer
def value_writer(cell: Any):
return cell.strftime(format)
return value_writer