2020from .blf import BLFWriter
2121from .canutils import CanutilsLogWriter
2222from .csv import CSVWriter
23- from .generic import BaseIOHandler , FileIOMessageWriter , MessageWriter
23+ from .generic import (
24+ BaseIOHandler ,
25+ BinaryIOMessageWriter ,
26+ FileIOMessageWriter ,
27+ MessageWriter ,
28+ )
2429from .mf4 import MF4Writer
2530from .printer import Printer
2631from .sqlite import SqliteWriter
@@ -94,20 +99,28 @@ def __new__( # type: ignore
9499
95100 file_or_filename : AcceptedIOType = filename
96101 if suffix == ".gz" :
97- suffix , file_or_filename = Logger .compress (filename , ** kwargs )
102+ LoggerType , file_or_filename = Logger .compress (filename , ** kwargs )
103+ else :
104+ LoggerType = cls ._get_logger_for_suffix (suffix )
105+
106+ return LoggerType (file = file_or_filename , ** kwargs )
98107
108+ @classmethod
109+ def _get_logger_for_suffix (cls , suffix : str ) -> Type [MessageWriter ]:
99110 try :
100111 LoggerType = Logger .message_writers [suffix ]
101112 if LoggerType is None :
102113 raise ValueError (f'failed to import logger for extension "{ suffix } "' )
103- return LoggerType ( file = file_or_filename , ** kwargs )
114+ return LoggerType
104115 except KeyError :
105116 raise ValueError (
106117 f'No write support for this unknown log format "{ suffix } "'
107118 ) from None
108119
109- @staticmethod
110- def compress (filename : StringPathLike , ** kwargs : Any ) -> Tuple [str , FileLike ]:
120+ @classmethod
121+ def compress (
122+ cls , filename : StringPathLike , ** kwargs : Any
123+ ) -> Tuple [Type [MessageWriter ], FileLike ]:
111124 """
112125 Return the suffix and io object of the decompressed file.
113126 File will automatically recompress upon close.
@@ -117,12 +130,15 @@ def compress(filename: StringPathLike, **kwargs: Any) -> Tuple[str, FileLike]:
117130 raise ValueError (
118131 f"The file type { real_suffix } is currently incompatible with gzip."
119132 )
120- if kwargs .get ("append" , False ):
121- mode = "ab" if real_suffix == ".blf" else "at"
133+ LoggerType = cls ._get_logger_for_suffix (real_suffix )
134+ append = kwargs .get ("append" , False )
135+
136+ if issubclass (LoggerType , BinaryIOMessageWriter ):
137+ mode = "ab" if append else "wb"
122138 else :
123- mode = "wb " if real_suffix == ".blf" else "wt"
139+ mode = "at " if append else "wt"
124140
125- return real_suffix , gzip .open (filename , mode )
141+ return LoggerType , gzip .open (filename , mode )
126142
127143 def on_message_received (self , msg : Message ) -> None :
128144 pass
0 commit comments