Marco Ricci
Add quality control scripts
Marco Ricci commited 7ad6f08 at 2025-02-09 20:47:17
man_diagnostics.py
#!/usr/bin/python3
# SPDX-FileCopyrightText: 2025 Marco Ricci <software@the13thletter.info>
#
# SPDX-License-Identifier: Zlib
"""Check for diagnostic messages not emitted in the manpages."""
from __future__ import annotations
import pathlib
import re
import sys
from typing import TYPE_CHECKING, Literal, NewType, cast
sys.path.append(str(pathlib.Path(sys.argv[0]).resolve().parent.parent / 'src'))
from derivepassphrase._internals import cli_messages # noqa: PLC2701
if TYPE_CHECKING:
from collections.abc import Iterator
EnumName = NewType('EnumName', str)
DiagnosticText = NewType('DiagnosticText', str)
known_errors = cli_messages.ErrMsgTemplate.__members__
known_warnings = cli_messages.WarnMsgTemplate.__members__
def _replace_known_metavars(string: str) -> str:
return (
string.replace(
'{service_metavar!s}',
cli_messages.Label.VAULT_METAVAR_SERVICE.value.singular,
)
.replace('{PROG_NAME!s}', cli_messages.PROG_NAME)
.replace('{settings_type!s}', 'global/service-specific settings')
)
# Use a double negative in the name ("does not mismatch text") because
# this is an error condition check, and if the enum name doesn't exist
# (because the manpage is outdated), then there is no mismatch. This is
# clearer (to me at least) than erroneously claiming that a missing text
# matches the desired pattern.
def _mismatches_text(
pattern: re.Pattern[str],
enum_name: EnumName,
name_type: Literal['warning', 'error'],
) -> bool:
while '.' in enum_name:
enum_name = cast('EnumName', enum_name.partition('.')[2])
try:
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX