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")
print(model)
# isoweek='2024-W01'

_ = Model(isoweek="2024-W53")
# 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")
# ValidationError: 1 validation error for Model
# isoweek
#   Invalid iso week pattern [type=T_ISOWeek, input_value='abc', input_type=str]

Source code in iso_week_date/pydantic.py
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:
    ```py
    from pydantic import BaseModel
    from iso_week_date.pydantic import T_ISOWeek


    class Model(BaseModel):
        isoweek: T_ISOWeek


    model = Model(isoweek="2024-W01")
    print(model)
    # isoweek='2024-W01'

    _ = Model(isoweek="2024-W53")
    # 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")
    # 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 = re.match(ISOWEEK_PATTERN, __input_value)

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

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

        if weeks_of_year(year) < week:
            raise PydanticCustomError(
                "T_ISOWeek",
                f"Invalid week number. Year {year} has only {weeks_of_year(year)} weeks.",
            )

        return cls(__input_value)

__get_pydantic_core_schema__(source, handler) classmethod

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 iso_week_date/pydantic.py
@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")
print(model)
# isoweekdate='2024-W01-1'

_ = Model(isoweekdate="2024-W53-1")
# ValidationError: 1 validation error for Model
# isoweekdate
#   Invalid week number. Year 2024 has only 52 weeks.
#   [type=type=T_ISOWeekDate, input_value='2024-W53-1', input_type=str]

_ = Model(isoweekdate="abc")
# ValidationError: 1 validation error for Model
# isoweekdate
#   Invalid iso week pattern [type=type=T_ISOWeekDate, input_value='abc', input_type=str]

Source code in iso_week_date/pydantic.py
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:
    ```py
    from pydantic import BaseModel
    from iso_week_date.pydantic import T_ISOWeekDate


    class Model(BaseModel):
        isoweekdate: T_ISOWeekDate


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

    _ = Model(isoweekdate="2024-W53-1")
    # ValidationError: 1 validation error for Model
    # isoweekdate
    #   Invalid week number. Year 2024 has only 52 weeks.
    #   [type=type=T_ISOWeekDate, input_value='2024-W53-1', input_type=str]

    _ = Model(isoweekdate="abc")
    # ValidationError: 1 validation error for Model
    # isoweekdate
    #   Invalid iso week pattern [type=type=T_ISOWeekDate, 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 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 = re.match(ISOWEEKDATE_PATTERN, __input_value)

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

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

        if weeks_of_year(year) < week:
            raise PydanticCustomError(
                "T_ISOWeekDate",
                f"Invalid week number. Year {year} has only {weeks_of_year(year)} weeks.",
            )

        return cls(__input_value)

__get_pydantic_core_schema__(source, handler) classmethod

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 iso_week_date/pydantic.py
@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(),
    )