79 lines
2.8 KiB
Python
79 lines
2.8 KiB
Python
"""
|
||
Проверка покрытия 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()
|