1from datetime import datetime, time
2from dateutil import parser
3from ..type import Type
4from .. import settings
5
6
7class TimeType(Type):
8    """Time type implementation.
9
10    API      | Usage
11    -------- | --------
12    Public   | `from frictionless import types`
13
14    """
15
16    code = "time"
17    builtin = True
18    constraints = [
19        "required",
20        "minimum",
21        "maximum",
22        "enum",
23    ]
24
25    # Read
26
27    def read_cell(self, cell):
28        if not isinstance(cell, time):
29            if not isinstance(cell, str):
30                return None
31            try:
32                if self.field.format == "default":
33                    # Guard against shorter formats supported by dateutil
34                    assert cell[5] == ":"
35                    assert len(cell) >= 8
36                    cell = parser.isoparse(f"2000-01-01T{cell}").timetz()
37                elif self.field.format == "any":
38                    cell = parser.parse(cell).timetz()
39                else:
40                    cell = datetime.strptime(cell, self.field.format).timetz()
41            except Exception:
42                return None
43        return cell
44
45    # Write
46
47    def write_cell(self, cell):
48        format = self.field.get("format", settings.DEFAULT_TIME_PATTERN)
49        cell = cell.strftime(format)
50        cell = cell.replace("+0000", "Z")
51        return cell
52