Skip to content

Commit f32fe2e

Browse files
committed
decorator and precommit recipe
1 parent 84c0ba8 commit f32fe2e

File tree

2 files changed

+61
-30
lines changed

2 files changed

+61
-30
lines changed

.hooks/pre-commit.example

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#!/bin/bash -e
2+
3+
function run_precommit_checks
4+
{
5+
python -m mypy --config-file ./.mypy.ini --check-untyped-defs $1
6+
python -m ruff check --unsafe-fixes --config .ruff.toml $1
7+
python -m yapf -r -i --style .style.yapf $1
8+
9+
return 0
10+
}
11+
12+
13+
source ${ENV_PYTHON_PATH}/bin/activate
14+
15+
sphinx-build -b html docs/ docs/_build -W
16+
for file in $(git diff --name-only --cached | grep py)
17+
do
18+
run_precommit_checks $file
19+
done
20+
Lines changed: 41 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,66 @@
11
import logging
22
from geos.utils.Logger import Logger, getLogger
33
from 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

Comments
 (0)