Skip to content

Pydantic Types

Pydantic model compatible types, implementation follows pydantic documentation at: Customizing validation with __get_pydantic_core_schema__ and it requires pydantic>=2.4.0.

iso_week_date.pydantic.T_ISOWeek

Bases: str

T_ISOWeek parses iso week in the ISO 8601 format.

New in version 1.2.0

Examples:

>>> from pydantic import BaseModel
>>> from iso_week_date.pydantic import T_ISOWeek
>>>
>>> class Model(BaseModel):
...     isoweek: T_ISOWeek
>>> model = Model(isoweek="2024-W01")
>>> model
Model(isoweek='2024-W01')
>>> _ = Model(isoweek="2024-W53")
Traceback (most recent call last):
...
pydantic_core._pydantic_core.ValidationError: 1 validation error for Model
isoweek
  Invalid week number. Year 2024 has only 52 weeks. [type=T_ISOWeek, input_value='2024-W53', input_type=str]
>>> _ = Model(isoweek="abc")
Traceback (most recent call last):
...
pydantic_core._pydantic_core.ValidationError: 1 validation error for Model
isoweek
  Invalid iso week pattern [type=T_ISOWeek, input_value='abc', input_type=str]
Source code in src/iso_week_date/pydantic.py
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
class T_ISOWeek(str):  # noqa: N801
    """T_ISOWeek parses iso week in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_week_date) format.

    !!! info "New in version 1.2.0"

    Examples:
        >>> from pydantic import BaseModel
        >>> from iso_week_date.pydantic import T_ISOWeek
        >>>
        >>> class Model(BaseModel):
        ...     isoweek: T_ISOWeek

        >>> model = Model(isoweek="2024-W01")
        >>> model
        Model(isoweek='2024-W01')

        >>> _ = Model(isoweek="2024-W53")
        Traceback (most recent call last):
        ...
        pydantic_core._pydantic_core.ValidationError: 1 validation error for Model
        isoweek
          Invalid week number. Year 2024 has only 52 weeks. [type=T_ISOWeek, input_value='2024-W53', input_type=str]

        >>> _ = Model(isoweek="abc")
        Traceback (most recent call last):
        ...
        pydantic_core._pydantic_core.ValidationError: 1 validation error for Model
        isoweek
          Invalid iso week pattern [type=T_ISOWeek, input_value='abc', input_type=str]
    """

    __slots__ = ()

    @classmethod
    def __get_pydantic_core_schema__(
        cls: type[Self],
        source: type[Any],
        handler: GetCoreSchemaHandler,
    ) -> core_schema.CoreSchema:
        """Return a Pydantic CoreSchema with the IsoWeek pattern validation.

        Arguments:
            source: The source type to be converted.
            handler: The handler to get the CoreSchema.

        Returns:
            A Pydantic CoreSchema with the IsoWeek pattern validation.
        """
        return core_schema.with_info_before_validator_function(
            cls._validate,
            core_schema.str_schema(),
        )

    @classmethod
    def _validate(cls: type[Self], /, __input_value: str, _: core_schema.ValidationInfo) -> Self:
        """Validates iso week string format against ISOWEEK_PATTERN."""
        _match = ISOWEEK_PATTERN.match(__input_value)

        if not _match:
            raise PydanticCustomError("T_ISOWeek", "Invalid iso week pattern")  # noqa: EM101

        year, week = int(_match.group(1)), int(_match.group(2)[1:])

        if (weeks_in_year := weeks_of_year(year)) < week:
            raise PydanticCustomError(
                "T_ISOWeek",  # noqa: EM101
                "Invalid week number. Year {year} has only {weeks_in_year} weeks.",
                {"year": year, "weeks_in_year": weeks_in_year},
            )

        return cls(__input_value)

__get_pydantic_core_schema__ classmethod

__get_pydantic_core_schema__(source: type[Any], handler: GetCoreSchemaHandler) -> core_schema.CoreSchema

Return a Pydantic CoreSchema with the IsoWeek pattern validation.

Parameters:

Name Type Description Default
source type[Any]

The source type to be converted.

required
handler GetCoreSchemaHandler

The handler to get the CoreSchema.

required

Returns:

Type Description
CoreSchema

A Pydantic CoreSchema with the IsoWeek pattern validation.

Source code in src/iso_week_date/pydantic.py
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
@classmethod
def __get_pydantic_core_schema__(
    cls: type[Self],
    source: type[Any],
    handler: GetCoreSchemaHandler,
) -> core_schema.CoreSchema:
    """Return a Pydantic CoreSchema with the IsoWeek pattern validation.

    Arguments:
        source: The source type to be converted.
        handler: The handler to get the CoreSchema.

    Returns:
        A Pydantic CoreSchema with the IsoWeek pattern validation.
    """
    return core_schema.with_info_before_validator_function(
        cls._validate,
        core_schema.str_schema(),
    )

iso_week_date.pydantic.T_ISOWeekDate

Bases: str

T_ISOWeekDate parses iso week date in the ISO 8601 format.

New in version 1.2.0

Examples:

>>> from pydantic import BaseModel
>>> from iso_week_date.pydantic import T_ISOWeekDate
>>>
>>> class Model(BaseModel):
...     isoweekdate: T_ISOWeekDate
>>> model = Model(isoweekdate="2024-W01-1")
>>> model
Model(isoweekdate='2024-W01-1')
>>> _ = Model(isoweekdate="2024-W53-1")
Traceback (most recent call last):
...
pydantic_core._pydantic_core.ValidationError: 1 validation error for Model
isoweekdate
  Invalid week number. Year 2024 has only 52 weeks. [...]
>>> _ = Model(isoweekdate="abc")
Traceback (most recent call last):
...
pydantic_core._pydantic_core.ValidationError: 1 validation error for Model
isoweekdate
  Invalid iso week date pattern [...]
Source code in src/iso_week_date/pydantic.py
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
class T_ISOWeekDate(str):  # noqa: N801
    """T_ISOWeekDate parses iso week date in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_week_date) format.

    !!! info "New in version 1.2.0"

    Examples:
        >>> from pydantic import BaseModel
        >>> from iso_week_date.pydantic import T_ISOWeekDate
        >>>
        >>> class Model(BaseModel):
        ...     isoweekdate: T_ISOWeekDate

        >>> model = Model(isoweekdate="2024-W01-1")
        >>> model
        Model(isoweekdate='2024-W01-1')

        >>> _ = Model(isoweekdate="2024-W53-1")
        Traceback (most recent call last):
        ...
        pydantic_core._pydantic_core.ValidationError: 1 validation error for Model
        isoweekdate
          Invalid week number. Year 2024 has only 52 weeks. [...]

        >>> _ = Model(isoweekdate="abc")
        Traceback (most recent call last):
        ...
        pydantic_core._pydantic_core.ValidationError: 1 validation error for Model
        isoweekdate
          Invalid iso week date pattern [...]
    """

    __slots__ = ()

    @classmethod
    def __get_pydantic_core_schema__(
        cls: type[Self],
        source: type[Any],
        handler: GetCoreSchemaHandler,
    ) -> core_schema.CoreSchema:
        """Return a Pydantic CoreSchema with the IsoWeekDate pattern validation.

        Arguments:
            source: The source type to be converted.
            handler: The handler to get the CoreSchema.

        Returns:
            A Pydantic CoreSchema with the IsoWeekDate pattern validation.

        """
        return core_schema.with_info_before_validator_function(
            cls._validate,
            core_schema.str_schema(),
        )

    @classmethod
    def _validate(cls: type[Self], /, __input_value: str, _: core_schema.ValidationInfo) -> Self:
        """Validates iso week date string format against ISOWEEKDATE_PATTERN."""
        _match = ISOWEEKDATE_PATTERN.match(__input_value)

        if not _match:
            raise PydanticCustomError("T_ISOWeekDate", "Invalid iso week date pattern")  # noqa: EM101

        year, week = int(_match.group(1)), int(_match.group(2)[1:])

        if (weeks_in_year := weeks_of_year(year)) < week:
            raise PydanticCustomError(
                "T_ISOWeekDate",  # noqa: EM101
                "Invalid week number. Year {year} has only {weeks_in_year} weeks.",
                {"year": year, "weeks_in_year": weeks_in_year},
            )

        return cls(__input_value)

__get_pydantic_core_schema__ classmethod

__get_pydantic_core_schema__(source: type[Any], handler: GetCoreSchemaHandler) -> core_schema.CoreSchema

Return a Pydantic CoreSchema with the IsoWeekDate pattern validation.

Parameters:

Name Type Description Default
source type[Any]

The source type to be converted.

required
handler GetCoreSchemaHandler

The handler to get the CoreSchema.

required

Returns:

Type Description
CoreSchema

A Pydantic CoreSchema with the IsoWeekDate pattern validation.

Source code in src/iso_week_date/pydantic.py
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
@classmethod
def __get_pydantic_core_schema__(
    cls: type[Self],
    source: type[Any],
    handler: GetCoreSchemaHandler,
) -> core_schema.CoreSchema:
    """Return a Pydantic CoreSchema with the IsoWeekDate pattern validation.

    Arguments:
        source: The source type to be converted.
        handler: The handler to get the CoreSchema.

    Returns:
        A Pydantic CoreSchema with the IsoWeekDate pattern validation.

    """
    return core_schema.with_info_before_validator_function(
        cls._validate,
        core_schema.str_schema(),
    )