astrololo: ekrany i eksport jako moduły, katalog z rejestracji (3/5) #81

Merged
gitea merged 1 commits from feat/ekrany-jako-moduly into master 2026-08-26 14:38:34 +00:00
Owner

Kolejność: merguj po #80. Baza tego PR-a to master, ale gałąź wychodzi z feat/ai-jako-modul, więc zawiera commity #80 jako przodków — zmergowanie tego pierwszego wciągnęłoby tamto po cichu i zostawiło #80 pustym. Stąd też diff poniżej pokazuje na razie zmiany obu; po merge'u #80 zostanie sam.

Trzeci z pięciu kroków. Zmieniłem jego zakres wobec planu i chcę, żebyś wiedział dlaczego: pierwotnie miała to być deduplikacja pięciu kopii link_crypto.py, ale po zrobieniu PR 2 widać, że astroklienta blokuje co innego — ekrany, których nie ma mieć, siedzą wewnątrz jednego main.py. Deduplikacja kryptografii to realny dług, ale niczego nie blokuje.

Podział

main.py (1023 linie) rozpadł się na podstawa.py, jedenaście modułów w app/ekrany/ i main.py, który jest już samym złożeniem — lista importów jest definicją produktu. Podział zrobiony mechanicznie, z osobnym sprawdzeniem, że żadna sekcja nie wołała pomocnika z innej (nie wołała).

Katalog z rejestracji

Dotąd wszystkie funkcje były wypisane w features.py, więc obraz produktu, który części z nich nie ma, i tak niósł ich nazwy — spis funkcji, których nie ma jak włączyć. Teraz ekran zgłasza siebie, swoje trasy i swoje zasoby przy imporcie własnego modułu, a features.py nie wymienia ani jednego ekranu.

To samo dotyczy nawigacji administratora: odsyłacz do ekranu kont był wpisany na sztywno w base.html, więc w węższym produkcie zostawał martwy link i nazwa ekranu, którego nie ma.

Eksport jako moduł

Zgodnie z ustaleniem eksport jest funkcją administracyjną, więc musi dać się usunąć. app/moduly/eksport/ zabiera arkusz, trasę PDF-a i akcję formularza. „Można, ale nie temu kontu" i „nie ma takiej możliwości" to dwie różne gwarancje — a eksport wynosi najwięcej treści baz naraz.

Skoro modułów jest więcej niż jeden, most nie może ich znać z nazwy: przechodzi po podkatalogach app/moduly/ i pyta każdy, co wnosi.

Znalezione przy okazji

Po wydzieleniu eksportu okazało się, że jego ścieżki szczęśliwej nie sprawdzał żaden test — badano wyłącznie odmowę dla konta bez uprawnienia. Moduł dostaje zależności z wywołania montującego, więc brak jednej z nich wyszedłby dopiero przy pierwszym kliknięciu użytkownika. Dopisałem test funkcjonalny (realny arkusz, sprawdzany aż do nagłówka ZIP-a) i brakujące zależności.

Cztery komentarze w plikach współdzielonych wymieniały zakładkę „Skompiluj", w tym wheelzoom.js ze wzmianką o „przyszłej zakładce" — to samo zgłoszenie, które audyt podnosił wcześniej, a które przeżyło, bo wtedy bramkowałem tylko skrypt.

Test złożenia

Buduje węższy produkt naprawdę: kopiuje drzewo, usuwa cztery ekrany i oba moduły, uruchamia aplikację w osobnym procesie (importy są zapamiętywane, więc sprawdzanie tego w procesie, który moduł już zaimportował, dawałoby wynik fałszywie pozytywny) i sprawdza, że wstaje, że zachowane ekrany oddają 200, że usunięte oddają 404, nie 403 i nie 500, że katalog opisuje ten obraz, i że w nawigacji nie ma martwych odsyłaczy.

Napisałem najpierw ostrzejszy test — „nazwa ekranu nie pada poza jego modułem" — i go wyrzuciłem: zgłaszał wzmianki o Horoskopie w plikach współdzielonych, choć astroklient Horoskop ma. Ślad ma znaczenie wyłącznie wobec konkretnego złożenia, więc to sprawdzenie należy do produktu, nie do mechanizmu — i trafi do PR 4.

Testy: presentation 368 · logic 342 · data 37 · render 41.

> **Kolejność:** merguj po #80. Baza tego PR-a to `master`, ale gałąź wychodzi z `feat/ai-jako-modul`, więc zawiera commity #80 jako przodków — zmergowanie tego pierwszego wciągnęłoby tamto po cichu i zostawiło #80 pustym. Stąd też diff poniżej pokazuje na razie zmiany obu; po merge'u #80 zostanie sam. Trzeci z pięciu kroków. **Zmieniłem jego zakres wobec planu** i chcę, żebyś wiedział dlaczego: pierwotnie miała to być deduplikacja pięciu kopii `link_crypto.py`, ale po zrobieniu PR 2 widać, że astroklienta blokuje co innego — ekrany, których nie ma mieć, siedzą wewnątrz jednego `main.py`. Deduplikacja kryptografii to realny dług, ale niczego nie blokuje. ### Podział `main.py` (1023 linie) rozpadł się na `podstawa.py`, jedenaście modułów w `app/ekrany/` i `main.py`, który jest już samym **złożeniem** — lista importów *jest* definicją produktu. Podział zrobiony mechanicznie, z osobnym sprawdzeniem, że żadna sekcja nie wołała pomocnika z innej (nie wołała). ### Katalog z rejestracji Dotąd wszystkie funkcje były wypisane w `features.py`, więc obraz produktu, który części z nich nie ma, i tak niósł ich nazwy — spis funkcji, których nie ma jak włączyć. Teraz ekran zgłasza siebie, swoje trasy i swoje zasoby przy imporcie własnego modułu, a `features.py` **nie wymienia ani jednego ekranu**. To samo dotyczy nawigacji administratora: odsyłacz do ekranu kont był wpisany na sztywno w `base.html`, więc w węższym produkcie zostawał **martwy link i nazwa ekranu, którego nie ma**. ### Eksport jako moduł Zgodnie z ustaleniem eksport jest funkcją administracyjną, więc musi dać się usunąć. `app/moduly/eksport/` zabiera arkusz, trasę PDF-a i akcję formularza. „Można, ale nie temu kontu" i „nie ma takiej możliwości" to dwie różne gwarancje — a eksport wynosi najwięcej treści baz naraz. Skoro modułów jest więcej niż jeden, most nie może ich znać z nazwy: przechodzi po podkatalogach `app/moduly/` i pyta każdy, co wnosi. ### Znalezione przy okazji Po wydzieleniu eksportu okazało się, że **jego ścieżki szczęśliwej nie sprawdzał żaden test** — badano wyłącznie odmowę dla konta bez uprawnienia. Moduł dostaje zależności z wywołania montującego, więc brak jednej z nich wyszedłby dopiero przy pierwszym kliknięciu użytkownika. Dopisałem test funkcjonalny (realny arkusz, sprawdzany aż do nagłówka ZIP-a) i brakujące zależności. Cztery komentarze w plikach współdzielonych wymieniały zakładkę „Skompiluj", w tym `wheelzoom.js` ze wzmianką o *„przyszłej zakładce"* — to samo zgłoszenie, które audyt podnosił wcześniej, a które przeżyło, bo wtedy bramkowałem tylko skrypt. ### Test złożenia Buduje węższy produkt **naprawdę**: kopiuje drzewo, usuwa cztery ekrany i oba moduły, uruchamia aplikację w **osobnym procesie** (importy są zapamiętywane, więc sprawdzanie tego w procesie, który moduł już zaimportował, dawałoby wynik fałszywie pozytywny) i sprawdza, że wstaje, że zachowane ekrany oddają 200, że usunięte oddają **404, nie 403 i nie 500**, że katalog opisuje ten obraz, i że w nawigacji nie ma martwych odsyłaczy. Napisałem najpierw ostrzejszy test — „nazwa ekranu nie pada poza jego modułem" — i go **wyrzuciłem**: zgłaszał wzmianki o Horoskopie w plikach współdzielonych, choć astroklient Horoskop ma. Ślad ma znaczenie wyłącznie wobec konkretnego złożenia, więc to sprawdzenie należy do produktu, nie do mechanizmu — i trafi do PR 4. **Testy:** presentation 368 · logic 342 · data 37 · render 41.
gitea changed target branch from feat/ai-jako-modul to master 2026-08-26 14:25:58 +00:00
gitea added 1 commit 2026-08-26 14:33:19 +00:00
astrololo: ekrany i eksport jako moduły, katalog z rejestracji (3/5)
Testy / Testy warstwy logicznej (silnik) (pull_request) Failing after 4s
Testy / Testy warstwy prezentacji (dostęp do baz) (pull_request) Failing after 3s
Testy / Testy warstwy bazodanowej (ochrona baz) (pull_request) Failing after 3s
Testy / Testy astrodemo (pull_request) Failing after 3s
Testy / Build obrazu silnika B (swisseph) (pull_request) Failing after 2s
Testy / Kontrola składni wszystkich warstw (pull_request) Failing after 3s
Testy / Testy warstwy logicznej (silnik) (push) Failing after 4s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Failing after 3s
Testy / Testy warstwy bazodanowej (ochrona baz) (push) Failing after 3s
Testy / Testy astrodemo (push) Failing after 3s
Testy / Build obrazu silnika B (swisseph) (push) Failing after 2s
Testy / Kontrola składni wszystkich warstw (push) Failing after 3s
build / build (push) Successful in 9s
fd79513ce2
Trzeci z pięciu kroków. Zmieniłem jego zakres wobec planu i warto wiedzieć
dlaczego: pierwotnie miała to być deduplikacja pięciu kopii link_crypto.py, ale
po zrobieniu PR 2 widać, że astroklienta blokuje co innego — ekrany, których nie
ma mieć, siedzą wewnątrz jednego main.py. Deduplikacja kryptografii jest realnym
długiem, ale niczego nie blokuje.

PODZIAŁ. main.py (1023 linie) rozpadł się na podstawa.py (wspólne obiekty
i pomocnicy), jedenaście modułów w app/ekrany/ i main.py, który jest już samym
ZŁOŻENIEM: lista importów JEST definicją produktu. Podział zrobiony mechanicznie,
z osobnym sprawdzeniem, że żadna sekcja nie wołała pomocnika z innej (nie wołała).

KATALOG Z REJESTRACJI. Dotąd wszystkie funkcje były wypisane w features.py, więc
obraz produktu, który części z nich nie ma, i tak niósł ich nazwy — spis funkcji,
których nie ma jak włączyć. Teraz ekran zgłasza siebie, swoje trasy i swoje
zasoby przy imporcie własnego modułu, a features.py nie wymienia ani jednego
ekranu. Kolejność w nawigacji jest jawna (`kolejnosc`), żeby nie rządziła nią
kolejność importów.

To samo dotyczy nawigacji administratora: odsyłacz do ekranu kont był wpisany na
sztywno w base.html, więc w węższym produkcie zostawał martwy link i nazwa
ekranu, którego nie ma.

EKSPORT JAKO MODUŁ. Zgodnie z ustaleniem eksport jest funkcją administracyjną,
więc musi dać się usunąć. app/moduly/eksport/ zabiera arkusz, trasę PDF-a i akcję
formularza. „Można, ale nie temu kontu" i „nie ma takiej możliwości" to dwie
różne gwarancje, a eksport wynosi najwięcej treści baz naraz.

MOST ODKRYWA MODUŁY. Skoro modułów jest więcej niż jeden, most nie może ich znać
z nazwy — nazwa nieobecnego modułu jechałaby do obrazu, w którym go nie ma.
Przechodzi więc po podkatalogach app/moduly/ i pyta każdy, co wnosi. Katalog
generowania przeniesiony z app/dodatki na app/moduly/dodatki.

ZNALEZIONE PRZY OKAZJI. Po wydzieleniu eksportu okazało się, że jego ścieżki
SZCZĘŚLIWEJ nie sprawdzał żaden test — badano wyłącznie odmowę dla konta bez
uprawnienia. Moduł dostaje zależności z wywołania montującego, więc brak jednej
z nich wyszedłby dopiero przy pierwszym kliknięciu. Dopisany test funkcjonalny
(realny arkusz, sprawdzany aż do nagłówka ZIP-a) i brakujące zależności.

Cztery komentarze w plikach współdzielonych wymieniały zakładkę „Skompiluj",
w tym wheelzoom.js ze wzmianką o „przyszłej zakładce" — to samo zgłoszenie, które
audyt podnosił wcześniej.

TEST ZŁOŻENIA. Buduje węższy produkt NAPRAWDĘ: kopiuje drzewo, usuwa cztery
ekrany i oba moduły, uruchamia aplikację w OSOBNYM PROCESIE (importy są
zapamiętywane, więc sprawdzanie tego w procesie, który moduł już zaimportował,
dawałoby wynik fałszywie pozytywny) i sprawdza, że wstaje, że zachowane ekrany
oddają 200, że usunięte oddają 404 (nie 403 i nie 500), że katalog opisuje ten
obraz, i że w nawigacji nie ma martwych odsyłaczy.

Napisałem najpierw ostrzejszy test — „nazwa ekranu nie pada poza jego modułem" —
i go wyrzuciłem: zgłaszał wzmianki o Horoskopie w plikach współdzielonych, choć
astroklient Horoskop MA. Ślad ma znaczenie wyłącznie wobec konkretnego złożenia,
więc sprawdzenie należy do produktu, nie do mechanizmu.

Testy: presentation 368, logic 342, data 37, render 41.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
gitea force-pushed feat/ekrany-jako-moduly from c1f5bea9f7 to fd79513ce2 2026-08-26 14:33:19 +00:00 Compare
gitea merged commit fd79513ce2 into master 2026-08-26 14:38:34 +00:00
gitea deleted branch feat/ekrany-jako-moduly 2026-08-26 14:38:35 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gitea/astrololo#81