55
66import re
77from abc import ABCMeta , abstractmethod
8+ from collections .abc import Iterable , Iterator , Sequence
89from typing import (
910 Dict ,
1011 Final ,
11- Iterable ,
12- Iterator ,
1312 List ,
13+ Literal ,
1414 Optional ,
15- Sequence ,
1615 Tuple ,
1716 TypeVar ,
1817 Union ,
3433)
3534MsgTagList : TypeAlias = Optional ["TagList" ]
3635MsgPrefix : TypeAlias = Optional ["Prefix" ]
37- MessageTuple : TypeAlias = Tuple [MsgTagList , MsgPrefix , str , "ParamList" ]
36+ MessageTuple : TypeAlias = tuple [MsgTagList , MsgPrefix , str , "ParamList" ]
3837
3938TAGS_SENTINEL : Final = "@"
4039TAGS_SEP : Final = ";"
@@ -106,7 +105,7 @@ def value(self) -> Optional[str]:
106105 """CAP value."""
107106 return self ._value
108107
109- def as_tuple (self ) -> Tuple [str , Optional [str ]]:
108+ def as_tuple (self ) -> tuple [str , Optional [str ]]:
110109 """Get data as a tuple of values."""
111110 return self .name , self .value
112111
@@ -144,7 +143,7 @@ def __str__(self) -> str:
144143 return self .name
145144
146145
147- class CapList (Parseable , List [Cap ]):
146+ class CapList (Parseable , list [Cap ]):
148147 """Represents a list of CAP entities."""
149148
150149 @classmethod
@@ -293,7 +292,7 @@ def __str__(self) -> str:
293292 return self .name
294293
295294
296- class TagList (Parseable , Dict [str , MessageTag ]):
295+ class TagList (Parseable , dict [str , MessageTag ]):
297296 """Object representing the list of message tags on a line."""
298297
299298 def __init__ (self , tags : Iterable [MessageTag ] = ()) -> None :
@@ -305,23 +304,27 @@ def __init__(self, tags: Iterable[MessageTag] = ()) -> None:
305304 super ().__init__ ((tag .name , tag ) for tag in tags )
306305
307306 @staticmethod
308- def _cmp_type_map (obj : object ) -> Dict [str , MessageTag ]:
307+ def _cmp_type_map (
308+ obj : object ,
309+ ) -> Union [
310+ tuple [dict [str , MessageTag ], Literal [True ]], tuple [None , Literal [False ]]
311+ ]:
309312 if isinstance (obj , str ):
310- return TagList .parse (obj )
313+ return TagList .parse (obj ), True
311314
312315 if isinstance (obj , dict ):
313316 sample = next (iter (obj .values ()), None )
314317 if obj and (sample is None or isinstance (sample , str )):
315318 # Handle str -> str dict
316- return TagList .from_dict (obj )
319+ return TagList .from_dict (obj ), True
317320
318321 # Handle str -> MessageTag dict
319- return dict (obj )
322+ return dict (obj ), True
320323
321324 if isinstance (obj , list ):
322- return TagList (obj )
325+ return TagList (obj ), True
323326
324- return NotImplemented
327+ return None , False
325328
326329 @classmethod
327330 def parse (cls , text : str ) -> Self :
@@ -333,25 +336,25 @@ def parse(cls, text: str) -> Self:
333336 return cls (map (MessageTag .parse , filter (None , text .split (TAGS_SEP ))))
334337
335338 @classmethod
336- def from_dict (cls , tags : Dict [str , str ]) -> Self :
339+ def from_dict (cls , tags : dict [str , str ]) -> Self :
337340 """Create a TagList from a dict of tags."""
338341 return cls (MessageTag (k , v ) for k , v in tags .items ())
339342
340343 def __eq__ (self , other : object ) -> bool :
341344 """Compare to another tag list, string, or list of MessageTag objects."""
342- obj = self ._cmp_type_map (other )
343- if obj is NotImplemented :
345+ res = self ._cmp_type_map (other )
346+ if not res [ 1 ] :
344347 return NotImplemented
345348
346- return dict (self ) == dict (obj )
349+ return dict (self ) == dict (res [ 0 ] )
347350
348351 def __ne__ (self , other : object ) -> bool :
349352 """Compare to another tag list, string, or list of MessageTag objects."""
350- obj = self ._cmp_type_map (other )
351- if obj is NotImplemented :
353+ res = self ._cmp_type_map (other )
354+ if not res [ 1 ] :
352355 return NotImplemented
353356
354- return dict (self ) != dict (obj )
357+ return dict (self ) != dict (res [ 0 ] )
355358
356359 def __str__ (self ) -> str :
357360 """Represent the tag list as a string."""
@@ -405,7 +408,7 @@ def mask(self) -> str:
405408 return mask
406409
407410 @property
408- def _data (self ) -> Tuple [str , str , str ]:
411+ def _data (self ) -> tuple [str , str , str ]:
409412 return self .nick , self .user , self .host
410413
411414 @classmethod
@@ -463,7 +466,7 @@ def __str__(self) -> str:
463466 return self .mask
464467
465468
466- class ParamList (Parseable , List [str ]):
469+ class ParamList (Parseable , list [str ]):
467470 """An object representing the parameter list from a line."""
468471
469472 def __init__ (self , * params : str , has_trail : bool = False ) -> None :
@@ -554,13 +557,13 @@ def __str__(self) -> str:
554557
555558
556559def _parse_tags (
557- tags : Union [TagList , Dict [str , str ], str , None , List [str ]],
560+ tags : Union [TagList , dict [str , str ], str , None , list [str ]],
558561) -> MsgTagList :
559562 if isinstance (tags , TagList ):
560563 return tags
561564
562565 if isinstance (tags , dict ):
563- return TagList .from_dict (cast (Dict [str , str ], tags ))
566+ return TagList .from_dict (cast (dict [str , str ], tags ))
564567
565568 if isinstance (tags , str ):
566569 return TagList .parse (tags )
@@ -585,7 +588,7 @@ def _parse_prefix(prefix: Union[Prefix, str, None, Iterable[str]]) -> MsgPrefix:
585588
586589
587590def _parse_params (
588- parameters : Tuple [Union [str , List [str ], ParamList ], ...],
591+ parameters : tuple [Union [str , list [str ], ParamList ], ...],
589592) -> ParamList :
590593 if len (parameters ) == 1 and not isinstance (parameters [0 ], str ):
591594 # This seems to be a list
@@ -594,18 +597,18 @@ def _parse_params(
594597
595598 return ParamList .from_list (parameters [0 ])
596599
597- return ParamList .from_list (cast (Tuple [str , ...], parameters ))
600+ return ParamList .from_list (cast (tuple [str , ...], parameters ))
598601
599602
600603class Message (Parseable ):
601604 """An object representing a parsed IRC line."""
602605
603606 def __init__ (
604607 self ,
605- tags : Union [TagList , Dict [str , str ], str , None , List [str ]],
608+ tags : Union [TagList , dict [str , str ], str , None , list [str ]],
606609 prefix : Union [str , Prefix , None , Iterable [str ]],
607610 command : str ,
608- * parameters : Union [str , List [str ], ParamList ],
611+ * parameters : Union [str , list [str ], ParamList ],
609612 ) -> None :
610613 """Construct message object."""
611614 self ._tags = _parse_tags (tags )
0 commit comments