kopia lustrzana https://github.com/collective/icalendar
Create vSkip class
rodzic
003602daed
commit
844c7e921c
|
@ -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.
|
||||
"""
|
||||
|
|
|
@ -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):
|
||||
|
|
Ładowanie…
Reference in New Issue