Source code for icalendar.prop.recur.frequency
"""FREQ value type of RECUR from :rfc:`5545`."""
from typing import Any
from icalendar.caselessdict import CaselessDict
from icalendar.compatibility import Self
from icalendar.error import JCalParsingError
from icalendar.parser import Parameters
from icalendar.parser_tools import DEFAULT_ENCODING, to_unicode
[docs]
class vFrequency(str):
"""A simple class that catches illegal values."""
params: Parameters
__slots__ = ("params",)
frequencies = CaselessDict(
{
"SECONDLY": "SECONDLY",
"MINUTELY": "MINUTELY",
"HOURLY": "HOURLY",
"DAILY": "DAILY",
"WEEKLY": "WEEKLY",
"MONTHLY": "MONTHLY",
"YEARLY": "YEARLY",
}
)
def __new__(
cls,
value,
encoding=DEFAULT_ENCODING,
/,
params: dict[str, Any] | None = None,
):
value = to_unicode(value, encoding=encoding)
self = super().__new__(cls, value)
if self not in vFrequency.frequencies:
raise ValueError(f"Expected frequency, got: {self}")
self.params = Parameters(params)
return self
[docs]
def to_ical(self):
return self.encode(DEFAULT_ENCODING).upper()
[docs]
@classmethod
def from_ical(cls, ical):
try:
return cls(ical.upper())
except Exception as e:
raise ValueError(f"Expected frequency, got: {ical}") from e
[docs]
@classmethod
def parse_jcal_value(cls, value: Any) -> Self:
"""Parse a jCal value for vFrequency.
Raises:
~error.JCalParsingError: If the value is not a valid frequency.
"""
JCalParsingError.validate_value_type(value, str, cls)
try:
return cls(value)
except ValueError as e:
raise JCalParsingError(
"The value must be a valid frequency.", cls, value=value
) from e
__all__ = ["vFrequency"]