11import logging
22from geos .utils .Logger import Logger , getLogger
33from functools import wraps
4- from typing import Type , TypeVar
5-
4+ from typing import Type , TypeVar , Callable , Protocol , Any
65
76__doc__ = """
8- Decorators
7+ Group of decorators and Protocols that will be used in filters to wrap behaviors without code replication
98
109"""
1110
12- def addLogSupport (loggerTitle : str ):
13- T = TypeVar ('T' )
14- def decorator (cls :Type [T ]) -> Type [T ]:
15- original_init = cls .__init__
1611
17- @wraps (cls )
18- def new_init (self : T , * args , ** kwargs ):
12+ class HasLogger ( Protocol ):
13+ """Protocol for classes that have logging support."""
14+
15+ logger : Logger
16+
17+ def setLoggerHandler ( self , handler : logging .Handler ) -> None :
18+ """Set a specific handler for the filter logger.
19+
20+ In this filter 4 log levels are use, .info, .error, .warning and .critical, be sure to have at least the same 4 levels.
21+
22+ Args:
23+ handler (logging.Handler): The handler to add.
24+ """
25+ pass
26+
1927
20- self . logger : Logger
28+ T = TypeVar ( 'T' , bound = 'HasLogger' )
2129
22- if kwargs .get ('speHandler' ):
23- kwargs .pop ('speHandler' )
30+
31+ def addLogSupport ( loggerTitle : str ) -> Callable [ [ Type [ T ] ], Type [ T ] ]:
32+ """Decorator to add logger support in the class following existing architecture.
33+
34+ Args:
35+ loggerTitle (str): Title to display in the logger
36+ """
37+
38+ def decorator ( cls : Type [ T ] ) -> Type [ T ]:
39+ original_init = cls .__init__
40+
41+ @wraps ( original_init )
42+ def new_init ( self : T , * args : Any , ** kwargs : Any ) -> None :
43+ spe_handler = kwargs .pop ( 'speHandler' , False )
44+ if spe_handler :
2445 self .logger = logging .getLogger ( loggerTitle )
2546 self .logger .setLevel ( logging .INFO )
2647 else :
27- self .logger = getLogger ( loggerTitle , True )
28-
29- original_init (self ,* args ,* kwargs )
30-
31- @property
32- def logger (self : T )-> Logger :
33- return self .logger
34-
35- def setLoggerHandler (self , handler : logging .Handler ):
36- """Set a specific handler for the filter logger.
48+ self .logger = getLogger ( loggerTitle , True )
3749
38- In this filter 4 log levels are use, .info, .error, .warning and .critical, be sure to have at least the same 4 levels.
50+ original_init ( self , * args , ** kwargs )
3951
40- Args:
41- handler (logging.Handler): The handler to add.
42- """
43- if not self .logger .hasHandlers ():
52+ def setLoggerHandler ( self : T , handler : logging .Handler ) -> None :
53+ # No docstring needed - Protocol defines the contract
54+ if not self .logger .handlers :
4455 self .logger .addHandler ( handler )
4556 else :
4657 self .logger .warning (
4758 "The logger already has an handler, to use yours set the argument 'speHandler' to True during the filter initialization."
4859 )
4960
50- cls .__init__ = new_init
51- cls .setLoggerHandler = setLoggerHandler
61+ cls .__init__ = new_init # type: ignore[assignment]
62+ cls .setLoggerHandler = setLoggerHandler # type: ignore[assignment]
5263
5364 return cls
5465
55- return decorator
66+ return decorator
0 commit comments