#!/usr/bin/env python3 """ =============================================================================== FILE: scripts/diagnostics/make_etl_snapshot.py ROLE: Генерация компактного слепка ETL-конвейера, генераторов отчетов и БД. =============================================================================== """ import os ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")) OUTPUT_FILE = os.path.join(ROOT_DIR, "etl_code_snapshot.md") TARGET_FILES = [ # Конфигурация и точка входа "config.py", "exceptions.json", "main_etl.py", "scripts/db_cli.py", # Крон скрипты "scripts/cron/run_hourly_snapshot.sh", "scripts/cron/run_reports_only.sh", "scripts/cron/run_cron_etl.sh", # Ядро БД "core/connection.py", "core/database.py", "core/schema.py", "core/repositories/scud_repo.py", "core/repositories/zup_repo.py", # Сервисный слой загрузки и реестров "services/data_loader.py", "services/scud_export.py", "services/share_copier.py", "services/excel_exporter.py", "services/exceptions_repo.py", "services/manual_absences_repo.py", "services/zup_extractor.py", "services/ai_verifier.py", "services/knowledge_base.py", "services/knowledge/service.py", # Модули сборки Сводки и Отчета "services/scud_etl/pipeline.py", "services/scud_etl/merger.py", "services/scud_etl/svodka_generator.py", "services/scud_etl/otchet_generator.py", "services/scud_etl/anomaly_detector.py", "services/snapshots/service.py", "services/tasks/repository.py", "services/tasks/service.py" ] def create_etl_snapshot(): content = ["# 📦 ETL-СЛЕПОК ИСХОДНОГО КОДА (СКУД ⟷ 1С & DB CORE)\n"] included_count = 0 for rel_path in TARGET_FILES: full_path = os.path.join(ROOT_DIR, rel_path) if os.path.exists(full_path): ext = os.path.splitext(rel_path)[1].replace(".", "") lang_map = { "py": "py", "json": "json", "sh": "bash" } lang = lang_map.get(ext, "text") try: with open(full_path, "r", encoding="utf-8") as f: file_text = f.read() content.append(f"## File: `./{rel_path}`\n```{lang}\n{file_text}\n```\n") included_count += 1 except Exception as e: print(f"[⚠️] Ошибка чтения {rel_path}: {e}") else: print(f"[ℹ️] Пропущен отсутствующий файл: {rel_path}") with open(OUTPUT_FILE, "w", encoding="utf-8") as f: f.write("\n".join(content)) size_kb = os.path.getsize(OUTPUT_FILE) / 1024 print(f"\n[✓] ETL-слепок создан: {OUTPUT_FILE}") print(f" Включено файлов: {included_count} | Размер: {size_kb:.1f} KB\n") if __name__ == "__main__": create_etl_snapshot()