""" Проверка покрытия ROOT_SLUGS: находит страницы в wiki_pages с {% tree %}, которые не добавлены в ROOT_SLUGS — у них могут быть необнаруженные дочерние страницы. Запуск: python wiki_check_slugs.py """ import sys from pathlib import Path from dotenv import load_dotenv load_dotenv(Path(__file__).parent / '.env') sys.path.insert(0, str(Path(__file__).parent)) from supabase import SupabaseManager # ROOT_SLUGS из wiki_sync.py — поддерживай синхронно from wiki_sync import ROOT_SLUGS def main(): db = SupabaseManager() if not db.connect(): sys.exit(1) try: # Все slug-и в базе db.cursor.execute("SELECT slug FROM wiki_pages ORDER BY slug") all_slugs = {row[0] for row in db.cursor.fetchall()} # Страницы с {% tree %} — у них могут быть необнаруженные дети db.cursor.execute(""" SELECT slug, value->>'title' AS title FROM wiki_pages WHERE value->>'content' LIKE '%{%% tree%%}%' ORDER BY slug """) tree_pages = db.cursor.fetchall() finally: db.close() root_slugs_set = set(ROOT_SLUGS) # Страницы с {% tree %}, которых нет в ROOT_SLUGS missing_from_roots = [(s, t) for s, t in tree_pages if s not in root_slugs_set] # ROOT_SLUGS которых нет в базе (удалены или никогда не синхронизировались) missing_from_db = root_slugs_set - all_slugs print(f'Всего страниц в wiki_pages: {len(all_slugs)}') print(f'Страниц с {{% tree %}}: {len(tree_pages)}') print(f'ROOT_SLUGS: {len(ROOT_SLUGS)}') print() if missing_from_roots: print('⚠️ Страницы с {% tree %}, НЕ добавленные в ROOT_SLUGS:') print(' (у них могут быть дочерние страницы, которые краулер не найдёт)') print() for slug, title in missing_from_roots: print(f' + {slug}') print(f' «{title}»') print(f' https://wiki.yandex.ru/{slug}') print() else: print('✓ Все страницы с {% tree %} уже есть в ROOT_SLUGS') if missing_from_db: print('⚠️ ROOT_SLUGS которых НЕТ в базе (не были синхронизированы или удалены):') for slug in sorted(missing_from_db): print(f' - {slug}') print() else: print('✓ Все ROOT_SLUGS присутствуют в базе') if __name__ == '__main__': main()