Files
bearingsinfo/tools/scripts/verify_kb_completeness.py
Claude f64a59e483 Apply ruff auto-fixes to remaining tools/scripts files
Import sorting and other auto-fixable linting issues corrected by ruff --fix.

https://claude.ai/code/session_017v9w8FTSjT5646A2W98DPV
2026-05-18 15:26:32 +00:00

120 lines
5.2 KiB
Python

#!/usr/bin/env python3
"""Верификация полноты базы знаний"""
import re
def verify_knowledge_base(filename="KNOWLEDGE_BASE_COMPLETE.md"):
with open(filename, encoding="utf-8") as f:
content = f.read()
print("=" * 80)
print("ВЕРИФИКАЦИЯ ПОЛНОТЫ БАЗЫ ЗНАНИЙ")
print("=" * 80)
# Проверка обязательных разделов
required_sections = [
(r"## 1\. Общее описание домена", "Раздел 1: Общее описание"),
(r"## 2\. Термины и глоссарий", "Раздел 2: Термины"),
(r"## 3\. Процессы и алгоритмы", "Раздел 3: Процессы"),
(r"## 4\. Правила и ограничения", "Раздел 4: Правила"),
(r"## 5\. Структуры данных и форматы", "Раздел 5: Структуры данных"),
(r"## 6\. Роли и ответственности", "Раздел 6: Роли"),
(r"## 7\. Инструкции и сценарии использования", "Раздел 7: Инструкции"),
(r"## 8\. Ошибки, исключения, крайние случаи", "Раздел 8: Ошибки"),
(r"## 9\. Связи и зависимости между сущностями", "Раздел 9: Связи"),
(r"## 10\. Источники и трассировка", "Раздел 10: Источники"),
]
print("\n✅ ПРОВЕРКА ОБЯЗАТЕЛЬНЫХ РАЗДЕЛОВ:\n")
all_present = True
for pattern, name in required_sections:
if re.search(pattern, content):
print(f" ✓ {name}")
else:
print(f" ✗ {name} - ОТСУТСТВУЕТ!")
all_present = False
# Статистика контента
print("\n📊 СТАТИСТИКА КОНТЕНТА:\n")
total_lines = len(content.split("\n"))
print(f" Всего строк: {total_lines:,}")
# Подсчёт таблиц
tables = len(re.findall(r"\|.*\|.*\|", content))
print(f" Строк с таблицами: {tables:,}")
# Подсчёт заголовков
h1 = len(re.findall(r"^# ", content, re.MULTILINE))
h2 = len(re.findall(r"^## ", content, re.MULTILINE))
h3 = len(re.findall(r"^### ", content, re.MULTILINE))
h4 = len(re.findall(r"^#### ", content, re.MULTILINE))
print(f" Заголовков H1: {h1}")
print(f" Заголовков H2: {h2}")
print(f" Заголовков H3: {h3}")
print(f" Заголовков H4: {h4}")
# Подсчёт ссылок на источники
sources = len(re.findall(r"`[^`]+\.md`", content))
print(f" Ссылок на источники (.md): {sources:,}")
# Подсчёт упоминаний стандартов
gost = len(re.findall(r"ГОСТ\s+\d+", content))
iso = len(re.findall(r"ISO\s+\d+", content))
din = len(re.findall(r"DIN\s+\d+", content))
print(f" Упоминаний ГОСТ: {gost:,}")
print(f" Упоминаний ISO: {iso:,}")
print(f" Упоминаний DIN: {din:,}")
# Оценка объёма разделов
print("\n📏 ОБЪЁМ РАЗДЕЛОВ (строк):\n")
sections = []
for i in range(1, 11):
if i < 10:
pattern = f"^## {i}\\..*?(?=^## {i+1}\\.)"
else:
pattern = f"^## {i}\\..*"
match = re.search(pattern, content, re.MULTILINE | re.DOTALL)
if match:
section_lines = len(match.group().split("\n"))
sections.append((i, section_lines))
status = "✓ ДОСТАТОЧНО" if section_lines > 50 else "⚠ МАЛО"
print(f" Раздел {i}: {section_lines:,} строк - {status}")
# Проверка качества
print("\n🎯 ОЦЕНКА КАЧЕСТВА:\n")
quality_checks = [
(total_lines > 20000, "Общий объём > 20,000 строк"),
(tables > 100, "Таблиц > 100"),
(sources > 500, "Ссылок на источники > 500"),
(gost > 50, "Упоминаний ГОСТ > 50"),
(all_present, "Все 10 разделов присутствуют"),
(all(lines > 50 for _, lines in sections), "Все разделы содержательные (>50 строк)"),
]
passed = sum(1 for check, _ in quality_checks if check)
total_checks = len(quality_checks)
for check, description in quality_checks:
status = "✓" if check else "✗"
print(f" {status} {description}")
print(f"\n📈 ИТОГОВАЯ ОЦЕНКА: {passed}/{total_checks} проверок пройдено")
if passed == total_checks:
print("\n🎉 БАЗА ЗНАНИЙ ПОЛНОСТЬЮ СООТВЕТСТВУЕТ ТРЕБОВАНИЯМ!")
elif passed >= total_checks * 0.8:
print("\n👍 База знаний в основном соответствует требованиям")
else:
print("\n⚠️ База знаний требует доработки")
print("=" * 80)
if __name__ == "__main__":
verify_knowledge_base()