Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/icalendar/prop/dt/list.py: 74%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

65 statements  

1from datetime import date, datetime 

2from typing import Any, ClassVar 

3 

4from icalendar.compatibility import Self 

5from icalendar.error import JCalParsingError 

6from icalendar.parser import Parameters 

7from icalendar.parser_tools import from_unicode 

8 

9from .base import TimeBase 

10from .types import vDDDTypes 

11 

12 

13class vDDDLists: 

14 """A list of vDDDTypes values.""" 

15 

16 default_value: ClassVar[str] = "DATE-TIME" 

17 params: Parameters 

18 dts: list[vDDDTypes] 

19 

20 def __init__(self, dt_list, params: dict[str, Any] | None = None): 

21 if params is None: 

22 params = {} 

23 if not hasattr(dt_list, "__iter__"): 

24 dt_list = [dt_list] 

25 vddd = [] 

26 tzid = None 

27 for dt_l in dt_list: 

28 dt = vDDDTypes(dt_l) if not isinstance(dt_l, vDDDTypes) else dt_l 

29 vddd.append(dt) 

30 if "TZID" in dt.params: 

31 tzid = dt.params["TZID"] 

32 

33 if tzid: 

34 # NOTE: no support for multiple timezones here! 

35 params["TZID"] = tzid 

36 self.params = Parameters(params) 

37 self.dts = vddd 

38 

39 def to_ical(self): 

40 dts_ical = (from_unicode(dt.to_ical()) for dt in self.dts) 

41 return b",".join(dts_ical) 

42 

43 @staticmethod 

44 def from_ical(ical, timezone=None): 

45 out = [] 

46 ical_dates = ical.split(",") 

47 for ical_dt in ical_dates: 

48 out.append(vDDDTypes.from_ical(ical_dt, timezone=timezone)) 

49 return out 

50 

51 def __eq__(self, other): 

52 if isinstance(other, vDDDLists): 

53 return self.dts == other.dts 

54 if isinstance(other, (TimeBase, date)): 

55 return self.dts == [other] 

56 return False 

57 

58 def __repr__(self): 

59 """String representation.""" 

60 return f"{self.__class__.__name__}({self.dts})" 

61 

62 @classmethod 

63 def examples(cls) -> list[Self]: 

64 """Examples of vDDDLists.""" 

65 return [vDDDLists([datetime(2025, 11, 10, 16, 50)])] 

66 

67 def to_jcal(self, name: str) -> list: 

68 """The jCal representation of this property according to :rfc:`7265`.""" 

69 return [ 

70 name, 

71 self.params.to_jcal(), 

72 self.VALUE.lower(), 

73 *[dt.to_jcal(name)[3] for dt in self.dts], 

74 ] 

75 

76 def _get_value(self) -> str | None: 

77 return None if not self.dts else self.dts[0].VALUE 

78 

79 from icalendar.param import VALUE 

80 

81 @classmethod 

82 def from_jcal(cls, jcal_property: list) -> Self: 

83 """Parse jCal from :rfc:`7265`. 

84 

85 Parameters: 

86 jcal_property: The jCal property to parse. 

87 

88 Raises: 

89 ~error.JCalParsingError: If the jCal provided is invalid. 

90 """ 

91 JCalParsingError.validate_property(jcal_property, cls) 

92 values = jcal_property[3:] 

93 prop = jcal_property[:3] 

94 dts = [] 

95 for value in values: 

96 dts.append(vDDDTypes.from_jcal(prop + [value])) 

97 return cls( 

98 dts, 

99 params=Parameters.from_jcal_property(jcal_property), 

100 ) 

101 

102 __hash__ = None 

103 

104 

105__all__ = ["vDDDLists"]