Coverage for src/castep_linter/error_logging/logger.py: 55%
28 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-11-23 18:07 +0000
« prev ^ index » next coverage.py v7.3.2, created at 2023-11-23 18:07 +0000
1"""Module containing code for the high level error logger"""
2from collections import Counter
3from dataclasses import dataclass, field
4from typing import Iterator, List
6from rich.console import Console
8from castep_linter.error_logging import error_types
9from castep_linter.fortran.fortran_node import FortranNode
12@dataclass
13class ErrorLogger:
14 """Container for all errors and messages generated while analysing
15 a Fortran file"""
17 filename: str
18 errors: List[error_types.FortranMsgBase] = field(default_factory=list)
20 def __iter__(self) -> Iterator[error_types.FortranMsgBase]:
21 return iter(self.errors)
23 def add_msg(self, level: str, node: FortranNode, message: str):
24 """Add an error to the error list"""
25 err = error_types.new_fortran_error(level, node, message)
26 self.errors.append(err)
28 def print_errors(self, console: Console, level: str = "Warning") -> None:
29 """Print all the contained errors above the level"""
30 severity = error_types.ERROR_SEVERITY[level]
32 for err in self.errors:
33 if err.ERROR_SEVERITY >= severity:
34 err.print_err(self.filename, console)
36 def count_errors(self):
37 """Count the number of errors in each category"""
38 c = Counter(e.ERROR_SEVERITY for e in self.errors)
39 return {
40 err_str: c[err_severity] for err_str, err_severity in error_types.ERROR_SEVERITY.items()
41 }
43 def __len__(self):
44 return len(self.errors)
46 @property
47 def has_errors(self):
48 """Does the logger contain any errors"""
49 return len(self) > 0