1
1
import datetime
2
- from _typeshed import Incomplete , Unused
3
- from collections .abc import Iterator
2
+ from _typeshed import ConvertibleToFloat , ConvertibleToInt , SupportsKeysAndGetItem , Unused
3
+ from collections .abc import Iterable , Iterator
4
4
from enum import Enum
5
5
from re import Pattern
6
- from typing import Any , ClassVar , Final , TypeVar , overload
6
+ from typing import Any , ClassVar , Final , Literal , Protocol , SupportsIndex , overload
7
7
from typing_extensions import Self , TypeAlias
8
8
9
9
from .caselessdict import CaselessDict
@@ -44,70 +44,80 @@ __all__ = [
44
44
]
45
45
46
46
_PropType : TypeAlias = type [Any ] # any of the v* classes in this file
47
- _vRecurT = TypeVar ("_vRecurT" , bound = vRecur )
47
+ _PeriodTuple : TypeAlias = tuple [datetime .datetime , datetime .datetime | datetime .timedelta ]
48
+ _AnyTimeType : TypeAlias = datetime .datetime | datetime .date | datetime .timedelta | datetime .time | _PeriodTuple
49
+
50
+ class _vType (Protocol ):
51
+ def to_ical (self ) -> bytes | str : ...
48
52
49
53
DURATION_REGEX : Final [Pattern [str ]]
50
54
WEEKDAY_RULE : Final [Pattern [str ]]
51
55
52
56
class vBinary :
53
- obj : Incomplete
57
+ obj : str
54
58
params : Parameters
55
- def __init__ (self , obj ) -> None : ...
59
+ def __init__ (self , obj : str | bytes ) -> None : ...
56
60
def to_ical (self ) -> bytes : ...
57
61
@staticmethod
58
- def from_ical (ical ) : ...
59
- def __eq__ (self , other ) : ...
62
+ def from_ical (ical : ICAL_TYPE ) -> bytes : ...
63
+ def __eq__ (self , other : object ) -> bool : ...
60
64
61
65
class vBoolean (int ):
62
- BOOL_MAP : Incomplete
66
+ BOOL_MAP : Final [ CaselessDict [ bool ]]
63
67
params : Parameters
64
- def __new__ (cls , * args , ** kwargs ) : ...
65
- def to_ical (self ) -> bytes : ...
68
+ def __new__ (cls , x : ConvertibleToInt = ..., / , * , params : SupportsKeysAndGetItem [ str , str ] = {}) -> Self : ...
69
+ def to_ical (self ) -> Literal [ b"TRUE" , b"FALSE" ] : ...
66
70
@classmethod
67
- def from_ical (cls , ical ) : ...
71
+ def from_ical (cls , ical : ICAL_TYPE ) -> bool : ...
68
72
69
73
class vText (str ):
70
74
encoding : str
71
75
params : Parameters
72
- def __new__ (cls , value : ICAL_TYPE , encoding : str = "utf-8" ) -> Self : ...
76
+ def __new__ (cls , value : ICAL_TYPE , encoding : str = "utf-8" , params : SupportsKeysAndGetItem [ str , str ] = {} ) -> Self : ...
73
77
def to_ical (self ) -> bytes : ...
74
78
@classmethod
75
79
def from_ical (cls , ical : ICAL_TYPE ) -> Self : ...
76
80
77
81
class vCalAddress (str ):
78
82
params : Parameters
79
- def __new__ (cls , value , encoding = "utf-8" ) : ...
83
+ def __new__ (cls , value : ICAL_TYPE , encoding = "utf-8" , params : SupportsKeysAndGetItem [ str , str ] = {}) -> Self : ...
80
84
def to_ical (self ) -> bytes : ...
81
85
@classmethod
82
- def from_ical (cls , ical ): ...
86
+ def from_ical (cls , ical : ICAL_TYPE ) -> Self : ...
87
+ @property
88
+ def email (self ) -> str : ...
89
+ @property
90
+ def name (self ) -> str : ...
91
+ @name .setter
92
+ def name (self , value : str ) -> None : ...
83
93
84
94
class vFloat (float ):
85
95
params : Parameters
86
- def __new__ (cls , * args , ** kwargs ) : ...
96
+ def __new__ (cls , x : ConvertibleToFloat = ..., / , * , params : SupportsKeysAndGetItem [ str , str ] = {}) -> Self : ...
87
97
def to_ical (self ) -> bytes : ...
88
98
@classmethod
89
- def from_ical (cls , ical ) : ...
99
+ def from_ical (cls , ical : ICAL_TYPE ) -> Self : ...
90
100
91
101
class vInt (int ):
92
102
params : Parameters
93
- def __new__ (cls , * args , ** kwargs ) : ...
103
+ def __new__ (cls , x : ConvertibleToInt = ..., / , * , params : SupportsKeysAndGetItem [ str , str ] = {}) -> Self : ...
94
104
def to_ical (self ) -> bytes : ...
95
105
@classmethod
96
106
def from_ical (cls , ical : ICAL_TYPE ) -> Self : ...
97
107
98
108
class vDDDLists :
99
109
params : Parameters
100
- dts : Incomplete
101
- def __init__ (self , dt_list ) -> None : ...
110
+ dts : list [ vDDDTypes ]
111
+ def __init__ (self , dt_list : Iterable [ _AnyTimeType ] | _AnyTimeType ) -> None : ...
102
112
def to_ical (self ) -> bytes : ...
103
113
@staticmethod
104
- def from_ical (ical , timezone : Incomplete | None = None ): ...
105
- def __eq__ (self , other ) : ...
114
+ def from_ical (ical : str , timezone : str | datetime . timezone | None = None ): ...
115
+ def __eq__ (self , other : object ) -> bool : ...
106
116
107
117
class vCategory :
108
- cats : Incomplete
118
+ cats : list [ vText ]
109
119
params : Parameters
110
- def __init__ (self , c_list ) -> None : ...
120
+ def __init__ (self , c_list : Iterable [ ICAL_TYPE ] | ICAL_TYPE , params : SupportsKeysAndGetItem [ str , str ] = {} ) -> None : ...
111
121
def __iter__ (self ) -> Iterator [str ]: ...
112
122
def to_ical (self ) -> bytes : ...
113
123
@staticmethod
@@ -116,80 +126,95 @@ class vCategory:
116
126
117
127
class TimeBase :
118
128
def __eq__ (self , other : object ) -> bool : ...
119
- def __hash__ (self ): ...
129
+ def __hash__ (self ) -> int : ...
120
130
121
131
class vDDDTypes (TimeBase ):
122
132
params : Parameters
123
- dt : Incomplete
124
- def __init__ (self , dt ) -> None : ...
133
+ dt : _AnyTimeType
134
+ def __init__ (self , dt : _AnyTimeType ) -> None : ...
125
135
def to_ical (self ) -> bytes : ...
136
+ @overload
126
137
@classmethod
127
- def from_ical (cls , ical , timezone : Incomplete | None = None ): ...
138
+ def from_ical (cls , ical : Self , timezone : Unused | None = None ) -> _AnyTimeType : ...
139
+ # Return type is one of vDuration, vPeriod, vDatetime, vDate, or vTime,
140
+ # depending on the ical string.
141
+ @overload
142
+ @classmethod
143
+ def from_ical (cls , ical : str , timezone : datetime .timezone | str | None = None ) -> Any : ...
128
144
129
145
class vDate (TimeBase ):
130
- dt : Incomplete
146
+ dt : datetime . date
131
147
params : Parameters
132
- def __init__ (self , dt ) -> None : ...
148
+ def __init__ (self , dt : datetime . date ) -> None : ...
133
149
def to_ical (self ) -> bytes : ...
134
150
@staticmethod
135
- def from_ical (ical ) : ...
151
+ def from_ical (ical : ICAL_TYPE ) -> datetime . date : ...
136
152
137
153
class vDatetime (TimeBase ):
138
- dt : Incomplete
154
+ dt : datetime . datetime
139
155
params : Parameters
140
- def __init__ (self , dt ) -> None : ...
156
+ def __init__ (self , dt : datetime . datetime , params : SupportsKeysAndGetItem [ str , str ] = {} ) -> None : ...
141
157
def to_ical (self ) -> bytes : ...
142
158
@staticmethod
143
- def from_ical (ical , timezone : datetime .timezone | str | None = None ) -> datetime .datetime : ...
159
+ def from_ical (ical : ICAL_TYPE , timezone : datetime .timezone | str | None = None ) -> datetime .datetime : ...
144
160
145
161
class vDuration (TimeBase ):
146
- td : Incomplete
162
+ td : datetime . timedelta
147
163
params : Parameters
148
- def __init__ (self , td ) -> None : ...
164
+ def __init__ (self , td : datetime . timedelta , params : SupportsKeysAndGetItem [ str , str ] = {} ) -> None : ...
149
165
def to_ical (self ) -> bytes : ...
150
166
@staticmethod
151
- def from_ical (ical ) : ...
167
+ def from_ical (ical : str ) -> datetime . timedelta : ...
152
168
@property
153
- def dt (self ): ...
169
+ def dt (self ) -> datetime . timedelta : ...
154
170
155
171
class vPeriod (TimeBase ):
156
172
params : Parameters
157
- start : Incomplete
158
- end : Incomplete
159
- by_duration : Incomplete
160
- duration : Incomplete
161
- def __init__ (self , per ) -> None : ...
162
- def overlaps (self , other ) : ...
173
+ start : datetime . datetime
174
+ end : datetime . datetime
175
+ by_duration : bool
176
+ duration : datetime . timedelta
177
+ def __init__ (self , per : _PeriodTuple ) -> None : ...
178
+ def overlaps (self , other : vPeriod ) -> bool : ...
163
179
def to_ical (self ) -> bytes : ...
180
+ # Return type is a tuple of vDuration, vPeriod, vDatetime, vDate, or vTime,
181
+ # depending on the ical string. If the ical string is formed according to
182
+ # the iCalendar specification, this should always return a
183
+ # (datetime, datetime) or a (datetime, timedelta) tuple, but this is not
184
+ # enforced.
164
185
@staticmethod
165
- def from_ical (ical , timezone : Incomplete | None = None ): ...
186
+ def from_ical (ical : str , timezone : datetime . timezone | str | None = None ) -> tuple [ Any , Any ] : ...
166
187
@property
167
- def dt (self ): ...
188
+ def dt (self ) -> _PeriodTuple : ...
168
189
169
190
class vWeekday (str ):
170
- week_days : Incomplete
171
- relative : Incomplete
191
+ week_days : Final [CaselessDict [int ]]
192
+ weekday : Literal ["SU" , "MO" , "TU" , "WE" , "TH" , "FR" , "SA" ] | None
193
+ relative : int | None
172
194
params : Parameters
173
- def __new__ (cls , value , encoding = "utf-8" ) : ...
195
+ def __new__ (cls , value : ICAL_TYPE , encoding : str = "utf-8" , params : SupportsKeysAndGetItem [ str , str ] = {}) -> Self : ...
174
196
def to_ical (self ) -> bytes : ...
175
197
@classmethod
176
- def from_ical (cls , ical ) : ...
198
+ def from_ical (cls , ical : ICAL_TYPE ) -> Self : ...
177
199
178
200
class vFrequency (str ):
179
- frequencies : Incomplete
201
+ frequencies : Final [ CaselessDict [ str ]]
180
202
params : Parameters
181
- def __new__ (cls , value , encoding = "utf-8" ) : ...
203
+ def __new__ (cls , value : ICAL_TYPE , encoding : str = "utf-8" , params : SupportsKeysAndGetItem [ str , str ] = {}) -> Self : ...
182
204
def to_ical (self ) -> bytes : ...
183
205
@classmethod
184
- def from_ical (cls , ical ) : ...
206
+ def from_ical (cls , ical : ICAL_TYPE ) -> Self : ...
185
207
186
208
class vMonth (int ):
187
- leap : bool
188
209
params : Parameters
189
- def __new__ (cls , month : vMonth | str | int ) -> Self : ...
210
+ def __new__ (cls , month : vMonth | str | int , params : SupportsKeysAndGetItem [ str , str ] = {} ) -> Self : ...
190
211
def to_ical (self ) -> bytes : ...
191
212
@classmethod
192
213
def from_ical (cls , ical : vMonth | str | int ) -> Self : ...
214
+ @property
215
+ def leap (self ) -> bool : ...
216
+ @leap .setter
217
+ def leap (self , value : bool ) -> None : ...
193
218
194
219
class vSkip (vText , Enum ):
195
220
OMIT = "OMIT"
@@ -198,69 +223,82 @@ class vSkip(vText, Enum):
198
223
199
224
def __reduce_ex__ (self , proto : Unused ) -> tuple [Any , ...]: ...
200
225
201
- class vRecur (CaselessDict [Incomplete ]):
202
- frequencies : ClassVar [list [str ]]
203
- canonical_order : ClassVar [tuple [str , ...]]
204
- types : ClassVar [CaselessDict [_PropType ]]
226
+ # The type of the values depend on the key. Each key maps to a v* class, and
227
+ # the allowed types are the types that the corresponding v* class can parse.
228
+ class vRecur (CaselessDict [Iterable [Any ] | Any ]):
205
229
params : Parameters
206
- def __init__ (self , * args , ** kwargs ) -> None : ...
230
+ frequencies : Final [list [str ]]
231
+ canonical_order : ClassVar [tuple [str , ...]]
232
+ types : Final [CaselessDict [_PropType ]]
233
+ def __init__ (
234
+ self , * args , params : SupportsKeysAndGetItem [str , str ] = {}, ** kwargs : list [Any ] | tuple [Any , ...] | Any
235
+ ) -> None : ...
207
236
def to_ical (self ) -> bytes : ...
208
237
@classmethod
209
- def parse_type (cls , key , values ) : ...
238
+ def parse_type (cls , key : str , values : str ) -> list [ Any ] : ... # Returns a list of v* objects
210
239
@classmethod
211
- @overload
212
- def from_ical (cls , ical : _vRecurT ) -> _vRecurT : ...
213
- @classmethod
214
- @overload
215
- def from_ical (cls , ical : str ) -> Self : ...
240
+ def from_ical (cls , ical : vRecur | str ) -> Self : ...
216
241
217
242
class vTime (TimeBase ):
218
- dt : Incomplete
243
+ dt : datetime . time | datetime . datetime
219
244
params : Parameters
220
- def __init__ (self , * args ) -> None : ...
221
- def to_ical (self ) -> bytes : ...
245
+ @overload
246
+ def __init__ (self , dt : datetime .time | datetime .datetime , / ) -> None : ...
247
+ # args are passed to the datetime.time() constructor
248
+ @overload
249
+ def __init__ (
250
+ self ,
251
+ hour : SupportsIndex = ...,
252
+ minute : SupportsIndex = ...,
253
+ second : SupportsIndex = ...,
254
+ microsecond : SupportsIndex = ...,
255
+ tzinfo : datetime .tzinfo | None = ...,
256
+ / ,
257
+ ) -> None : ...
258
+ def to_ical (self ) -> str : ...
222
259
@staticmethod
223
- def from_ical (ical ) : ...
260
+ def from_ical (ical : ICAL_TYPE ) -> datetime . time : ...
224
261
225
262
class vUri (str ):
226
263
params : Parameters
227
- def __new__ (cls , value , encoding = "utf-8" ) : ...
264
+ def __new__ (cls , value : ICAL_TYPE , encoding : str = "utf-8" , params : SupportsKeysAndGetItem [ str , str ] = {}) -> Self : ...
228
265
def to_ical (self ) -> bytes : ...
229
266
@classmethod
230
- def from_ical (cls , ical ) : ...
267
+ def from_ical (cls , ical : ICAL_TYPE ) -> Self : ...
231
268
232
269
class vGeo :
233
- latitude : Incomplete
234
- longitude : Incomplete
270
+ latitude : float
271
+ longitude : float
235
272
params : Parameters
236
- def __init__ (self , geo ) -> None : ...
237
- def to_ical (self ) -> bytes : ...
273
+ def __init__ (self , geo : tuple [ float | str , float | str ], params : SupportsKeysAndGetItem [ str , str ] = {} ) -> None : ...
274
+ def to_ical (self ) -> str : ...
238
275
@staticmethod
239
- def from_ical (ical ) : ...
240
- def __eq__ (self , other ) : ...
276
+ def from_ical (ical : str ) -> tuple [ float , float ] : ...
277
+ def __eq__ (self , other : _vType ) -> bool : ... # type: ignore[override]
241
278
242
279
class vUTCOffset :
243
280
ignore_exceptions : bool
244
281
td : datetime .timedelta
245
282
params : Parameters
246
- def __init__ (self , td : datetime .timedelta ) -> None : ...
247
- def to_ical (self ) -> bytes : ...
283
+ def __init__ (self , td : datetime .timedelta , params : SupportsKeysAndGetItem [ str , str ] = {} ) -> None : ...
284
+ def to_ical (self ) -> str : ...
248
285
@classmethod
249
- def from_ical (cls , ical ) : ...
286
+ def from_ical (cls , ical : Self | ICAL_TYPE ) -> datetime . timedelta : ...
250
287
def __eq__ (self , other : object ) -> bool : ...
251
288
def __hash__ (self ) -> int : ...
252
289
253
290
class vInline (str ):
254
291
params : Parameters
255
- def __new__ (cls , value , encoding = "utf-8" ) : ...
292
+ def __new__ (cls , value : ICAL_TYPE , encoding : str = "utf-8" , params : SupportsKeysAndGetItem [ str , str ] = {}) -> Self : ...
256
293
def to_ical (self ) -> bytes : ...
257
294
@classmethod
258
- def from_ical (cls , ical ) : ...
295
+ def from_ical (cls , ical : ICAL_TYPE ) -> Self : ...
259
296
260
297
class TypesFactory (CaselessDict [_PropType ]):
261
298
all_types : tuple [_PropType , ...]
262
- def __init__ (self , * args , ** kwargs ) -> None : ...
263
299
types_map : CaselessDict [str ]
264
300
def for_property (self , name : str ) -> _PropType : ...
265
- def to_ical (self , name : str , value ) -> bytes : ...
266
- def from_ical (self , name : str , value ): ...
301
+ # value is str | bytes, depending on what the v* class supports
302
+ def to_ical (self , name : str , value : Any ) -> bytes : ...
303
+ # value and return type depend on what the v* class supports
304
+ def from_ical (self , name : str , value : Any ) -> Any : ...
0 commit comments