"""Zapora słownikowa astrodemo: czego użytkownik demo nie może zobaczyć. astrodemo stoi najniżej w drabinie trzech produktów (astrodemo → astroklient → astrololo) i jest dawane najszerzej. Ma dwie funkcje i ma wyglądać, jakby to było wszystko, co program potrafi. Test nie sprawdza pojedynczych miejsc, tylko przechodzi WSZYSTKO, co da się pobrać, i szuka słów, które nie mają prawa paść. Sprawdza też DRZEWO PLIKÓW usługi — bo „nie ma śladu w kodzie" znaczy, że `grep` po obrazie ma nic nie znaleźć, a nie tylko że odpowiedź jest czysta. Powód, dla którego to powstało: komentarz w pierwszej linii styles.css mówił „Nie kopiujemy stylów pełnej aplikacji", a arkusz pobierał anonim. """ import pathlib import re import pytest APP = pathlib.Path(__file__).resolve().parents[1] / "app" # (a) że istnieje wersja obszerniejsza i jak się nazywa WIEKSZY_BRAT = ["pełna aplikacja", "pełnej aplikacji", "pełna wersja", "pełnej wersji", "astrololo", "astroklient", "wersji podstawowej", "upgrade", "rozszerzon"] # (b) że tekst pisze model językowy # Bez samego „token": w tej usłudze znaczy token sesji i token międzywarstwowy, # a nie jednostkę rozliczeniową modelu. Zamiast tego zwroty jednoznaczne. MODEL = ["LLM", "anthropic", "openai", "gpt", "claude", "prompt", "generowanie tekstu", "sztuczn", "okno kontekstu", "model językow"] # (c) funkcje, których astrodemo nie ma INNE_FUNKCJE = ["kosmogram", "aspektarian", "synastri", "kalendarz", "predykcj", "skompiluj", "system domów", "systemy domów", "deklinacj", "antyscj"] # (d) że jest ktoś, kto widzi więcej, i że produkt jest w budowie MECHANIZMY = ["administrator", "uprawnieni", "walidacj", "kwarantann", "roadmap", "w budowie", "widok testowy", "warstwa logiczna", "layer"] # Dwa poziomy, bo dwie różne drogi wycieku. # # WSZĘDZIE — także w kodzie serwera, którego przeglądarka nigdy nie zobaczy. # Obraz tej usługi się KOMUŚ ODDAJE, więc kto go dostanie, przeczyta też # komentarze i docstringi. Zdanie „w pełnej aplikacji to działa inaczej" mówi mu # wprost, że istnieje pełna aplikacja — a to jest dokładnie to, czego ma nie # wiedzieć. Komentarz ma tłumaczyć TĘ usługę, bez powoływania się na rodzeństwo. WSZEDZIE = WIEKSZY_BRAT + MODEL + INNE_FUNKCJE # TYLKO DO PRZEGLĄDARKI — słownictwo inżynierskie opisujące własne działanie tej # usługi. W komentarzu serwera jest na miejscu; w odpowiedzi HTTP nie ma czego # szukać, bo mówi o mechanizmach, o których użytkownik nie ma wiedzieć. DO_PRZEGLADARKI = WSZEDZIE + MECHANIZMY ZAKAZANE = DO_PRZEGLADARKI WZORCE = [(r"(?i)\b(PRE|LOG|DAN)-\d+\b", "identyfikator wymagania"), (r"(?i)\bfeat/[\w-]+", "nazwa gałęzi rozwojowej"), (r"(?i)\bAI\b", "model językowy")] def _grzechy(tresc: str, gdzie: str, slownik: list[str] | None = None) -> list[str]: out = [] for igla in (slownik if slownik is not None else ZAKAZANE): if re.search(rf"(?i)(?