Skip to content

entry_with_date

ArbitraryDate = Annotated[int | str, pydantic.AfterValidator(validate_arbitrary_date)]

BaseEntryWithDate

Bases: BaseEntry

date = pydantic.Field(default=None, description="The date of this event in YYYY-MM-DD, YYYY-MM, or YYYY format, or any custom text like 'Fall 2023'. Use this for single-day or imprecise dates. For date ranges, use `start_date` and `end_date` instead.", examples=['2020-09-24', '2020-09', '2020', 'Fall 2023', 'Summer 2020']) class-attribute instance-attribute

entry_type_in_snake_case cached property

model_config = pydantic.ConfigDict(json_schema_extra={'description': None}) class-attribute instance-attribute

validate_arbitrary_date(date)

Validate date format while allowing flexible user input.

Why

Users enter dates like "Fall 2023" or "2020-09" for events. Strict dates (YYYY-MM-DD/YYYY-MM/YYYY) get validated via ISO parsing, while custom text passes through for template rendering.

Parameters:

  • date (int | str) –

    Date value to validate.

Returns:

  • int | str

    Original date if valid.

Source code in src/rendercv/schema/models/cv/entries/bases/entry_with_date.py
def validate_arbitrary_date(date: int | str) -> int | str:
    """Validate date format while allowing flexible user input.

    Why:
        Users enter dates like "Fall 2023" or "2020-09" for events. Strict
        dates (YYYY-MM-DD/YYYY-MM/YYYY) get validated via ISO parsing, while
        custom text passes through for template rendering.

    Args:
        date: Date value to validate.

    Returns:
        Original date if valid.
    """
    date_str = str(date)

    if re.fullmatch(r"\d{4}-\d{2}-\d{2}", date_str):
        Date.fromisoformat(date_str)
    elif re.fullmatch(r"\d{4}-\d{2}", date_str):
        Date.fromisoformat(f"{date_str}-01")

    return date