@@ -354,8 +354,62 @@ def detect_duplicates(
354354# ── Bandit security linting (optional) ───────────────────────────────
355355
356356try :
357- from bandit .core import manager as _bandit_manager
358- from bandit .core import config as _bandit_config
357+ import logging as _logging
358+
359+ # Bandit eagerly loads all its formatters at import time, including a
360+ # SARIF formatter that requires the optional `sarif_om` package. When
361+ # `sarif_om` is absent bandit logs an ERROR that appears on every run
362+ # even when SARIF output was never requested. Suppress that specific
363+ # message during the import so users only see errors that are relevant
364+ # to them.
365+ class _SuppressSarifFilter (_logging .Filter ):
366+ def filter (self , record : _logging .LogRecord ) -> bool :
367+ return "Could not load 'sarif'" not in record .getMessage ()
368+
369+ def _logger_ancestry (logger : _logging .Logger ) -> list [_logging .Logger ]:
370+ ancestry : list [_logging .Logger ] = []
371+ current : _logging .Logger | None = logger
372+ while current is not None :
373+ ancestry .append (current )
374+ if not current .propagate :
375+ break
376+ parent = current .parent
377+ current = parent if isinstance (parent , _logging .Logger ) else None
378+ return ancestry
379+
380+ def _add_filter_to_handlers (
381+ logger : _logging .Logger ,
382+ log_filter : _logging .Filter ,
383+ ) -> list [_logging .Handler ]:
384+ filtered_handlers : list [_logging .Handler ] = []
385+ seen_handlers : set [int ] = set ()
386+ for current_logger in _logger_ancestry (logger ):
387+ for handler in current_logger .handlers :
388+ handler_id = id (handler )
389+ if handler_id in seen_handlers :
390+ continue
391+ handler .addFilter (log_filter )
392+ filtered_handlers .append (handler )
393+ seen_handlers .add (handler_id )
394+ return filtered_handlers
395+
396+ def _remove_filter_from_handlers (
397+ handlers : list [_logging .Handler ],
398+ log_filter : _logging .Filter ,
399+ ) -> None :
400+ for handler in handlers :
401+ handler .removeFilter (log_filter )
402+
403+ _bandit_root = _logging .getLogger ("bandit" )
404+ _sarif_filter = _SuppressSarifFilter ()
405+ _filtered_handlers = _add_filter_to_handlers (_bandit_root , _sarif_filter )
406+ _bandit_root .addFilter (_sarif_filter )
407+ try :
408+ from bandit .core import manager as _bandit_manager
409+ from bandit .core import config as _bandit_config
410+ finally :
411+ _bandit_root .removeFilter (_sarif_filter )
412+ _remove_filter_from_handlers (_filtered_handlers , _sarif_filter )
359413
360414 _HAS_BANDIT = True
361415except ImportError : # pragma: no cover
0 commit comments