"""Предупреждения нормализации: перечень кодов и фабрика с уровнем из словаря.""" from collections.abc import Sequence from enum import StrEnum from typing import TYPE_CHECKING from arm_statements.model import StatementWarning if TYPE_CHECKING: from arm_statements.loader import Rules class WarningCode(StrEnum): """Коды предупреждений: по члену на код `rules/statement_warnings.yaml` (имя = значение).""" JSON_FAILED = "JSON_FAILED" TABLE_PARSE_ERROR = "TABLE_PARSE_ERROR" TABLE_LOST = "TABLE_LOST" TABLE_SKIPPED = "TABLE_SKIPPED" CODE_COLUMN_NOT_FOUND = "CODE_COLUMN_NOT_FOUND" SEGMENT_WITHOUT_CODES = "SEGMENT_WITHOUT_CODES" SHEET_NOT_JOINED = "SHEET_NOT_JOINED" CONTINUATION_TYPE_CONFLICT = "CONTINUATION_TYPE_CONFLICT" SEGMENT_COLUMNS_MISMATCH = "SEGMENT_COLUMNS_MISMATCH" COLUMN_WITHOUT_DATE = "COLUMN_WITHOUT_DATE" COLUMN_DATE_UNCERTAIN = "COLUMN_DATE_UNCERTAIN" HEADER_ROW_NOT_FOUND = "HEADER_ROW_NOT_FOUND" TYPE_CONFLICT = "TYPE_CONFLICT" NO_ORGANIZATION_NO_INN = "NO_ORGANIZATION_NO_INN" PERIOD_UNKNOWN = "PERIOD_UNKNOWN" REPORT_DATE_UNCERTAIN = "REPORT_DATE_UNCERTAIN" XLSB_SCALE_SUSPECT = "XLSB_SCALE_SUSPECT" INN_NOT_FOUND = "INN_NOT_FOUND" INN_UNCERTAIN = "INN_UNCERTAIN" ORGANIZATION_NOT_FOUND = "ORGANIZATION_NOT_FOUND" ORGANIZATION_UNCERTAIN = "ORGANIZATION_UNCERTAIN" REPORT_DATE_UNPARSED = "REPORT_DATE_UNPARSED" UNITS_NOT_FOUND = "UNITS_NOT_FOUND" FILE_TYPE_MISMATCH = "FILE_TYPE_MISMATCH" XLS_NO_CODEPAGE = "XLS_NO_CODEPAGE" COLUMN_SKIPPED = "COLUMN_SKIPPED" FRACTIONAL_IN_THOUSANDS = "FRACTIONAL_IN_THOUSANDS" XLSB_NO_FORMATS = "XLSB_NO_FORMATS" NUMBER_FORMAT_UNPARSED = "NUMBER_FORMAT_UNPARSED" VALUE_OUT_OF_RANGE = "VALUE_OUT_OF_RANGE" SHEET_OTHER = "SHEET_OTHER" ROW_SPLIT = "ROW_SPLIT" def make_warning( # noqa: PLR0913 -- сигнатура задана публичным API пакета code: str, message: str, rules: "Rules", *, line_refs: Sequence[str] = (), column_index: int | None = None, field: str | None = None, locator: str | None = None, ) -> StatementWarning: """Предупреждение с уровнем из словаря; неизвестный код — `KeyError` (выдуманный код не создаётся).""" rule = rules.warnings.get(code) if rule is None: raise KeyError(f"код предупреждения {code} не задан в statement_warnings.yaml") return StatementWarning( code=str(code), severity=rule.severity, message=message, line_refs=tuple(line_refs), column_index=column_index, field=field, locator=locator, )