Create vSkip class

pull/667/head
Nicco Kunzmann 2024-06-28 16:18:01 +01:00
rodzic 003602daed
commit 844c7e921c
2 zmienionych plików z 46 dodań i 25 usunięć

Wyświetl plik

@ -55,6 +55,7 @@ import re
import time as _time
from typing import Optional, Union
from enum import Enum, auto
DURATION_REGEX = re.compile(r'([-+]?)P(?:(\d+)W)?(?:(\d+)D)?'
@ -125,6 +126,29 @@ class vBoolean(int):
raise ValueError(f"Expected 'TRUE' or 'FALSE'. Got {ical}")
class vText(str):
"""Simple text.
"""
def __new__(cls, value, encoding=DEFAULT_ENCODING):
value = to_unicode(value, encoding=encoding)
self = super().__new__(cls, value)
self.encoding = encoding
self.params = Parameters()
return self
def __repr__(self) -> str:
return f"vText({self.to_ical()!r})"
def to_ical(self) -> bytes:
return escape_char(self).encode(self.encoding)
@classmethod
def from_ical(cls, ical:ICAL_TYPE):
ical_unesc = unescape_char(ical)
return cls(ical_unesc)
class vCalAddress(str):
"""This just returns an unquoted string.
"""
@ -678,6 +702,18 @@ class vMonth(int):
return f"{int(self)}{'L' if self.leap else ''}"
class vSkip(vText, Enum):
"""Skip values for RRULE.
These are defined in :rfc:`7529`.
OMIT is the default value.
"""
OMIT = "OMIT"
FORWARD = "FORWARD"
BACKWARD = "BACKWARD"
class vRecur(CaselessDict):
"""Recurrence definition.
@ -691,7 +727,7 @@ class vRecur(CaselessDict):
canonical_order = ("RSCALE", "FREQ", "UNTIL", "COUNT", "INTERVAL",
"BYSECOND", "BYMINUTE", "BYHOUR", "BYDAY", "BYWEEKDAY",
"BYMONTHDAY", "BYYEARDAY", "BYWEEKNO", "BYMONTH",
"BYSETPOS", "WKST")
"BYSETPOS", "WKST", "SKIP")
types = CaselessDict({
'COUNT': vInt,
@ -709,6 +745,7 @@ class vRecur(CaselessDict):
'BYDAY': vWeekday,
'FREQ': vFrequency,
'BYWEEKDAY': vWeekday,
'SKIP': vSkip,
})
def __init__(self, *args, **kwargs):
@ -759,29 +796,6 @@ class vRecur(CaselessDict):
raise ValueError(f'Error in recurrence rule: {ical}')
class vText(str):
"""Simple text.
"""
def __new__(cls, value, encoding=DEFAULT_ENCODING):
value = to_unicode(value, encoding=encoding)
self = super().__new__(cls, value)
self.encoding = encoding
self.params = Parameters()
return self
def __repr__(self) -> str:
return f"vText({self.to_ical()!r})"
def to_ical(self) -> bytes:
return escape_char(self).encode(self.encoding)
@classmethod
def from_ical(cls, ical:ICAL_TYPE):
ical_unesc = unescape_char(ical)
return cls(ical_unesc)
class vTime(TimeBase):
"""Render and generates iCalendar time format.
"""

Wyświetl plik

@ -5,7 +5,7 @@ See
- https://www.rfc-editor.org/rfc/rfc7529.html
"""
import pytest
from icalendar.prop import vRecur, vMonth
from icalendar.prop import vRecur, vMonth, vSkip
@pytest.mark.parametrize(
@ -55,6 +55,13 @@ def test_leap_month(calendars):
(vRecur, vRecur(bymonth=vMonth("5L")), b"BYMONTH=5L"),
(vMonth, vMonth(10), b"10"),
(vMonth, vMonth("5L"), b"5L"),
(vSkip, vSkip.OMIT, b"OMIT"),
(vSkip, vSkip.BACKWARD, b"BACKWARD"),
(vSkip, vSkip.FORWARD, b"FORWARD"),
(vSkip, vSkip("OMIT"), b"OMIT"),
(vSkip, vSkip("BACKWARD"), b"BACKWARD"),
(vSkip, vSkip("FORWARD"), b"FORWARD"),
(vRecur, vRecur(rscale="GREGORIAN", freq="YEARLY", skip='FORWARD'), b"RSCALE=GREGORIAN;FREQ=YEARLY;SKIP=FORWARD"),
]
)
def test_conversion(ty, recur, ics):