Skip to content

Commit eee160e

Browse files
feat: Update the log of the filter to get the number of warnings at the end of the calculation (#216)
* Update the log to get the number of warning * Add warnings count at the end of the log * Update the plugin and the filters extract and merge blocks to get the number of warning log while using it * Clean the count of warning for filters calling other filters * Add the tests for the new logger helper functions
1 parent 5400366 commit eee160e

29 files changed

Lines changed: 807 additions & 176 deletions

geos-processing/src/geos/processing/generic_processing_tools/AttributeMapping.py

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from vtkmodules.vtkCommonDataModel import vtkDataSet, vtkMultiBlockDataSet
1010
from geos.mesh.utils.arrayModifiers import transferAttributeWithElementMap
1111
from geos.mesh.utils.arrayHelpers import ( computeElementMapping, getAttributeSet, isAttributeGlobal )
12-
from geos.utils.Logger import ( Logger, getLogger )
12+
from geos.utils.Logger import ( getLogger, Logger, CountWarningHandler, isHandlerInLogger, getLoggerHandlerType )
1313
from geos.utils.pieceEnum import Piece
1414

1515
__doc__ = """
@@ -111,6 +111,18 @@ def __init__(
111111
self.logger.setLevel( logging.INFO )
112112
self.logger.propagate = False
113113

114+
counter: CountWarningHandler = CountWarningHandler()
115+
self.counter: CountWarningHandler
116+
self.nbWarnings: int = 0
117+
try:
118+
self.counter = getLoggerHandlerType( type( counter ), self.logger )
119+
self.counter.resetWarningCount()
120+
except ValueError:
121+
self.counter = counter
122+
self.counter.setLevel( logging.INFO )
123+
124+
self.logger.addHandler( self.counter )
125+
114126
def setLoggerHandler( self: Self, handler: logging.Handler ) -> None:
115127
"""Set a specific handler for the filter logger.
116128
@@ -120,11 +132,10 @@ def setLoggerHandler( self: Self, handler: logging.Handler ) -> None:
120132
Args:
121133
handler (logging.Handler): The handler to add.
122134
"""
123-
if len( self.logger.handlers ) == 0:
135+
if not isHandlerInLogger( handler, self.logger ):
124136
self.logger.addHandler( handler )
125137
else:
126-
self.logger.warning( "The logger already has an handler, to use yours set the argument 'speHandler'"
127-
" to True during the filter initialization." )
138+
self.logger.warning( "The logger already has this handler, it has not been added." )
128139

129140
def getElementMap( self: Self ) -> dict[ int, npt.NDArray[ np.int64 ] ]:
130141
"""Getter of the element mapping dictionary.
@@ -189,13 +200,16 @@ def applyFilter( self: Self ) -> None:
189200
logger=self.logger )
190201

191202
# Log the output message.
192-
self._logOutputMessage()
193-
194-
return
195-
196-
def _logOutputMessage( self: Self ) -> None:
197-
"""Create and log result messages of the filter."""
198-
self.logger.info( f"The filter { self.logger.name } succeeded." )
199203
self.logger.info(
200-
f"The attributes { self.attributeNames } have been transferred from the source mesh to the final mesh with the { self.piece.value } mapping."
204+
f"The attributes { self.attributeNames } have been transferred from the source mesh to the final mesh with a { self.piece.value } mapping.\n"
201205
)
206+
result: str = f"The filter { self.logger.name } succeeded"
207+
if self.counter.warningCount > 0:
208+
self.logger.warning( f"{ result } but { self.counter.warningCount } warnings have been logged." )
209+
else:
210+
self.logger.info( f"{ result }." )
211+
212+
self.nbWarnings = self.counter.warningCount
213+
self.counter.resetWarningCount()
214+
215+
return

geos-processing/src/geos/processing/generic_processing_tools/ClipToMainFrame.py

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from vtkmodules.vtkCommonTransforms import vtkLandmarkTransform
1717
from vtkmodules.vtkFiltersGeneral import vtkTransformFilter
1818

19-
from geos.utils.Logger import ( Logger, getLogger )
19+
from geos.utils.Logger import ( getLogger, Logger, CountWarningHandler, isHandlerInLogger, getLoggerHandlerType )
2020
from geos.mesh.utils.genericHelpers import getMultiBlockBounds
2121

2222
__doc__ = """
@@ -212,7 +212,7 @@ def __getFramePoints( self, vpts: vtkPoints ) -> tuple[ vtkPoints, vtkPoints ]:
212212
return ( sourcePts, targetPts )
213213

214214

215-
loggerTitle: str = "Clip mesh to main frame."
215+
loggerTitle: str = "Clip mesh to main frame"
216216

217217

218218
class ClipToMainFrame( vtkTransformFilter ):
@@ -227,7 +227,8 @@ def __init__( self, speHandler: bool = False, **properties: str ) -> None:
227227
properties (kwargs): kwargs forwarded to vtkTransformFilter.
228228
"""
229229
super().__init__( **properties )
230-
# Logger.
230+
231+
# Logger
231232
self.logger: Logger
232233
if not speHandler:
233234
self.logger = getLogger( loggerTitle, True )
@@ -236,8 +237,35 @@ def __init__( self, speHandler: bool = False, **properties: str ) -> None:
236237
self.logger.setLevel( logging.INFO )
237238
self.logger.propagate = False
238239

240+
counter: CountWarningHandler = CountWarningHandler()
241+
self.counter: CountWarningHandler
242+
self.nbWarnings: int = 0
243+
try:
244+
self.counter = getLoggerHandlerType( type( counter ), self.logger )
245+
self.counter.resetWarningCount()
246+
except ValueError:
247+
self.counter = counter
248+
self.counter.setLevel( logging.INFO )
249+
250+
self.logger.addHandler( self.counter )
251+
252+
def Update( self ) -> None: # type: ignore[override]
253+
"""Update the filter."""
254+
super().Update()
255+
256+
result: str = f"The filter { self.logger.name } succeeded"
257+
if self.counter.warningCount > 0:
258+
self.logger.warning( f"{ result } but { self.counter.warningCount } warnings have been logged." )
259+
else:
260+
self.logger.info( f"{ result }." )
261+
262+
self.nbWarnings = self.counter.warningCount
263+
self.counter.resetWarningCount()
264+
239265
def ComputeTransform( self ) -> None:
240266
"""Update the transformation."""
267+
self.logger.info( f"Apply filter { self.logger.name }." )
268+
241269
# dispatch to ClipToMainFrame depending on input type
242270
if isinstance( self.GetInput(), vtkMultiBlockDataSet ):
243271
# locate reference point
@@ -265,11 +293,10 @@ def SetLoggerHandler( self, handler: logging.Handler ) -> None:
265293
Args:
266294
handler (logging.Handler): The handler to add.
267295
"""
268-
if len( self.logger.handlers ) == 0:
296+
if not isHandlerInLogger( handler, self.logger ):
269297
self.logger.addHandler( handler )
270298
else:
271-
self.logger.warning( "The logger already has an handler, to use yours set the argument 'speHandler' to True"
272-
" during the filter initialization." )
299+
self.logger.warning( "The logger already has this handler, it has not been added." )
273300

274301
def __locate_reference_point( self, multiBlockDataSet: vtkMultiBlockDataSet ) -> int:
275302
"""Locate the block to use as reference for the transformation.

geos-processing/src/geos/processing/generic_processing_tools/CreateConstantAttributePerRegion.py

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from vtkmodules.vtkCommonDataModel import vtkMultiBlockDataSet, vtkDataSet
1313

1414
from geos.utils.pieceEnum import Piece
15-
from geos.utils.Logger import ( getLogger, Logger, CountWarningHandler )
15+
from geos.utils.Logger import ( getLogger, Logger, CountWarningHandler, isHandlerInLogger, getLoggerHandlerType )
1616
from geos.mesh.utils.arrayHelpers import ( getArrayInObject, getComponentNames, getNumberOfComponents,
1717
getVtkDataTypeInObject, isAttributeGlobal, getAttributePieceInfo,
1818
checkValidValuesInDataSet, checkValidValuesInMultiBlock )
@@ -121,11 +121,7 @@ def __init__(
121121
# Check if the new component have default values (information for the output message).
122122
self.useDefaultValue: bool = False
123123

124-
# Warnings counter.
125-
self.counter: CountWarningHandler = CountWarningHandler()
126-
self.counter.setLevel( logging.INFO )
127-
128-
# Logger.
124+
# Logger
129125
self.logger: Logger
130126
if not speHandler:
131127
self.logger = getLogger( loggerTitle, True )
@@ -134,6 +130,18 @@ def __init__(
134130
self.logger.setLevel( logging.INFO )
135131
self.logger.propagate = False
136132

133+
counter: CountWarningHandler = CountWarningHandler()
134+
self.counter: CountWarningHandler
135+
self.nbWarnings: int = 0
136+
try:
137+
self.counter = getLoggerHandlerType( type( counter ), self.logger )
138+
self.counter.resetWarningCount()
139+
except ValueError:
140+
self.counter = counter
141+
self.counter.setLevel( logging.INFO )
142+
143+
self.logger.addHandler( self.counter )
144+
137145
def setLoggerHandler( self: Self, handler: logging.Handler ) -> None:
138146
"""Set a specific handler for the filter logger.
139147
@@ -143,12 +151,10 @@ def setLoggerHandler( self: Self, handler: logging.Handler ) -> None:
143151
Args:
144152
handler (logging.Handler): The handler to add.
145153
"""
146-
if len( self.logger.handlers ) == 0:
154+
if not isHandlerInLogger( handler, self.logger ):
147155
self.logger.addHandler( handler )
148156
else:
149-
# This warning does not count for the number of warning created during the application of the filter.
150-
self.logger.warning( "The logger already has an handler, to use yours set the argument 'speHandler' to True"
151-
" during the filter initialization." )
157+
self.logger.warning( "The logger already has this handler, it has not been added." )
152158

153159
def applyFilter( self: Self ) -> None:
154160
"""Create a constant attribute per region in the mesh.
@@ -159,9 +165,6 @@ def applyFilter( self: Self ) -> None:
159165
"""
160166
self.logger.info( f"Apply filter { self.logger.name }." )
161167

162-
# Add the handler to count warnings messages.
163-
self.logger.addHandler( self.counter )
164-
165168
# Check the validity of the attribute region.
166169
if self.piece == Piece.NONE:
167170
raise AttributeError( f"The attribute { self.regionName } is not in the mesh." )
@@ -341,9 +344,6 @@ def _logOutputMessage( self: Self, trueIndexes: list[ Any ] ) -> None:
341344
Args:
342345
trueIndexes (list[Any]): The list of the true region indexes use to create the attribute.
343346
"""
344-
# The Filter succeed.
345-
self.logger.info( f"The filter { self.logger.name } succeeded." )
346-
347347
# Info about the created attribute.
348348
# The piece where the attribute is created.
349349
self.logger.info( f"The new attribute { self.newAttributeName } is created on { self.piece.value }." )
@@ -408,3 +408,14 @@ def _logOutputMessage( self: Self, trueIndexes: list[ Any ] ) -> None:
408408
self.logger.warning( messValue )
409409
else:
410410
self.logger.info( messValue )
411+
412+
result: str = f"The filter { self.logger.name } succeeded"
413+
if self.counter.warningCount > 0:
414+
self.logger.warning( f"{ result } but { self.counter.warningCount } warnings have been logged." )
415+
else:
416+
self.logger.info( f"{ result }." )
417+
418+
self.nbWarnings = self.counter.warningCount
419+
self.counter.resetWarningCount()
420+
421+
return

geos-processing/src/geos/processing/generic_processing_tools/FillPartialArrays.py

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from typing import Union, Any
77

88
from geos.utils.pieceEnum import Piece
9-
from geos.utils.Logger import ( Logger, getLogger )
9+
from geos.utils.Logger import ( getLogger, Logger, CountWarningHandler, isHandlerInLogger, getLoggerHandlerType )
1010
from geos.mesh.utils.arrayModifiers import fillPartialAttributes
1111
from geos.mesh.utils.arrayHelpers import getAttributePieceInfo
1212

@@ -89,7 +89,7 @@ def __init__(
8989
self.multiBlockDataSet: vtkMultiBlockDataSet = multiBlockDataSet
9090
self.dictAttributesValues: dict[ str, Union[ list[ Any ], None ] ] = dictAttributesValues
9191

92-
# Logger.
92+
# Logger
9393
self.logger: Logger
9494
if not speHandler:
9595
self.logger = getLogger( loggerTitle, True )
@@ -98,6 +98,18 @@ def __init__(
9898
self.logger.setLevel( logging.INFO )
9999
self.logger.propagate = False
100100

101+
counter: CountWarningHandler = CountWarningHandler()
102+
self.counter: CountWarningHandler
103+
self.nbWarnings: int = 0
104+
try:
105+
self.counter = getLoggerHandlerType( type( counter ), self.logger )
106+
self.counter.resetWarningCount()
107+
except ValueError:
108+
self.counter = counter
109+
self.counter.setLevel( logging.INFO )
110+
111+
self.logger.addHandler( self.counter )
112+
101113
def setLoggerHandler( self: Self, handler: logging.Handler ) -> None:
102114
"""Set a specific handler for the filter logger.
103115
@@ -107,11 +119,10 @@ def setLoggerHandler( self: Self, handler: logging.Handler ) -> None:
107119
Args:
108120
handler (logging.Handler): The handler to add.
109121
"""
110-
if len( self.logger.handlers ) == 0:
122+
if not isHandlerInLogger( handler, self.logger ):
111123
self.logger.addHandler( handler )
112124
else:
113-
self.logger.warning( "The logger already has an handler, to use yours set the argument 'speHandler' to True"
114-
" during the filter initialization." )
125+
self.logger.warning( "The logger already has this handler, it has not been added." )
115126

116127
def applyFilter( self: Self ) -> None:
117128
"""Create a constant attribute per region in the mesh.
@@ -121,8 +132,10 @@ def applyFilter( self: Self ) -> None:
121132
ValueError: Error during the filling of the attribute.
122133
"""
123134
self.logger.info( f"Apply filter { self.logger.name }." )
135+
124136
piece: Piece
125-
for attributeName in self.dictAttributesValues:
137+
mess: str = ""
138+
for attributeName, values in self.dictAttributesValues.items():
126139
piece = getAttributePieceInfo( self.multiBlockDataSet, attributeName )
127140
if piece == Piece.NONE:
128141
raise AttributeError( f"The attribute { attributeName } is not in the mesh." )
@@ -134,9 +147,22 @@ def applyFilter( self: Self ) -> None:
134147
fillPartialAttributes( self.multiBlockDataSet,
135148
attributeName,
136149
piece=piece,
137-
listValues=self.dictAttributesValues[ attributeName ],
150+
listValues=values,
138151
logger=self.logger )
152+
if values is None:
153+
values = [ "the default value" ]
154+
mess = f"{ mess }The attribute { attributeName } has been filled with { values }.\n"
155+
156+
# Log the output message.
157+
self.logger.info( mess )
158+
159+
result: str = f"The filter { self.logger.name } succeeded"
160+
if self.counter.warningCount > 0:
161+
self.logger.warning( f"{ result } but { self.counter.warningCount } warnings have been logged." )
162+
else:
163+
self.logger.info( f"{ result }." )
139164

140-
self.logger.info( f"The filter { self.logger.name } succeed." )
165+
self.nbWarnings = self.counter.warningCount
166+
self.counter.resetWarningCount()
141167

142168
return

geos-processing/src/geos/processing/generic_processing_tools/MergeBlockEnhanced.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from typing_extensions import Self
88

9-
from geos.utils.Logger import ( Logger, getLogger )
9+
from geos.utils.Logger import ( getLogger, Logger, CountWarningHandler, isHandlerInLogger, getLoggerHandlerType )
1010
from geos.mesh.utils.multiblockModifiers import mergeBlocks
1111

1212
from vtkmodules.vtkCommonDataModel import vtkMultiBlockDataSet, vtkUnstructuredGrid
@@ -91,6 +91,18 @@ def __init__(
9191
self.logger.setLevel( logging.INFO )
9292
self.logger.propagate = False
9393

94+
counter: CountWarningHandler = CountWarningHandler()
95+
self.counter: CountWarningHandler
96+
self.nbWarnings: int = 0
97+
try:
98+
self.counter = getLoggerHandlerType( type( counter ), self.logger )
99+
self.counter.resetWarningCount()
100+
except ValueError:
101+
self.counter = counter
102+
self.counter.setLevel( logging.INFO )
103+
104+
self.logger.addHandler( self.counter )
105+
94106
def setLoggerHandler( self: Self, handler: logging.Handler ) -> None:
95107
"""Set a specific handler for the filter logger.
96108
@@ -99,25 +111,31 @@ def setLoggerHandler( self: Self, handler: logging.Handler ) -> None:
99111
Args:
100112
handler (logging.Handler): The handler to add.
101113
"""
102-
if len( self.logger.handlers ) == 0:
114+
if not isHandlerInLogger( handler, self.logger ):
103115
self.logger.addHandler( handler )
104116
else:
105-
self.logger.warning( "The logger already has an handler, to use yours set the argument 'speHandler' to True"
106-
" during the filter initialization." )
117+
self.logger.warning( "The logger already has this handler, it has not been added." )
107118

108119
def applyFilter( self: Self ) -> None:
109120
"""Merge the blocks of a multiblock dataset mesh.
110121
111122
Raises:
112123
VTKError (geos.utils.Errors): Errors captured if any from the VTK log.
113124
"""
114-
self.logger.info( f"Applying filter { self.logger.name }." )
125+
self.logger.info( f"Apply filter { self.logger.name }." )
115126

116127
outputMesh: vtkUnstructuredGrid
117128
outputMesh = mergeBlocks( self.inputMesh, keepPartialAttributes=True, logger=self.logger )
118129
self.outputMesh = outputMesh
119130

120-
self.logger.info( f"The filter { self.logger.name } succeeded." )
131+
result: str = f"The filter { self.logger.name } succeeded"
132+
if self.counter.warningCount > 0:
133+
self.logger.warning( f"{ result } but { self.counter.warningCount } warnings have been logged." )
134+
else:
135+
self.logger.info( f"{ result }." )
136+
137+
self.nbWarnings = self.counter.warningCount
138+
self.counter.resetWarningCount()
121139

122140
return
123141

0 commit comments

Comments
 (0)