Skip to content

refactor(recorder): render.py → pakiet render/ (faza 1c)#65

Merged
mpasternak merged 1 commit into
mainfrom
cleanup/faza-1c-render
Jul 22, 2026
Merged

refactor(recorder): render.py → pakiet render/ (faza 1c)#65
mpasternak merged 1 commit into
mainfrom
cleanup/faza-1c-render

Conversation

@mpasternak

Copy link
Copy Markdown
Member

Ostatni i najtrudniejszy z trzech podziałów fazy 1. render.py 3016 → 15 modułów, 73 symbole, 2723 linie przeniesione, 34 zmienione.

_run.py ma 941 linii i to jest celowe

Faza 1 dzieliła plik, nie dekomponowała funkcji. run_render ma nadal CC 97 i 829 linii — to zadanie Fazy 3. Zapisane wprost w docstringu modułu, żeby struktura katalogów nie wyglądała na skończoną, zanim jest.

moduł linie
errors.py constants.py tasks.py pages.py timeline.py 14–88 liście, wydzielone pierwsze
__init__.py narration.py reuse.py popup_session.py audio.py 160–214
popup_detect.py _step.py visuals.py popup_crop.py 337–452
_run.py 941 ⚠️ dług z terminem: Faza 3

Szwy: 20 nazw, 70 miejsc podmiany

10 z 19 zdefiniowanych poza pakietem — tryb ustalony dopiero przy compile (1b) i nieznany przy mux (1a). Fasada wstrzymuje wszystkie 19 i nigdy nie wiąże replace.

Recorder i probe_frame_count mają konsumentów w dwóch modułach, więc jedna linia podmiany przestała wystarczać. Strażnik to egzekwuje (assert_multi_consumer_coverage), testy podmieniają oba miejsca.

Trzy rzeczy, których poprzednie podziały nie mogły przynieść

1. Szwy używane wyłącznie w adnotacjach typów. Overlay jest wołany w jednym miejscu, a anotowany w siedmiu, w czterech modułach. Przez from __future__ import annotations te adnotacje są stringami i nic nie wiążą w czasie wykonania — ale skan AST nie odróżnia importu do adnotacji od importu do wartości i zgłasza wszystkie jako wczesne wiązanie. TYPE_CHECKING też by nie pomogło. Rozwiązane anotowaniem przez obiekt modułu, co jest zgodne z regułą szwów. To 8 z 13 przecelowań.

2. timeline jest zmienną lokalną w run_render. Wywołanie timeline._apply_timeline_edits(...) rozwiązałoby się do obiektu Timeline zbudowanego cztery linie wcześniej i wywaliło AttributeError na ostatnim kroku pełnego renderu — po kilkunastu minutach pracy. Alias timeline_module. Ta sama pułapka, którą mux_probe już dokumentuje.

3. os.replace wymagało rozszerzenia wspólnego strażnika, nie lokalnej łatki. Test podmienia go ścieżką w stringu przez moduł render; po podziale render.os znika. Ale strażnik odrzucał każdego właściciela z kropką. Dodany _module_chain_offender: łańcuch akceptowany tylko wtedy, gdy głowa jest submodułem pakietu i każdy krok rozwiązuje się do prawdziwego ModuleType mającego dany atrybut. Oba istniejące strażniki przechodzą bez zmian.

Dwa odstępstwa od układu ze specu

Oba udokumentowane w docstringach modułów:

  • sonda content-box → popup_crop, nie popup_detect: jest poziomem 2 łańcucha cropu, a spec sam mówi, że trzy poziomy to jedna opowieść
  • _prepare_main_after_popup_closevisuals, nie popup_session: zamyka cykl importów i jest dokładnym odwróceniem _hand_cursor_to_popup

34 zmienione linie, wszystkie rozliczone

13 przecelowań szwów + 21 requalifikacji odwołań w komentarzach, które podział uczynił fałszywymi (plus 8 poza pakietem — mux/crop.py miał odwołanie do render._recording_scale).

git diff -M jest tu bezużyteczny, więc rozliczenie pochodzi z porównania ast.get_source_segment per symbol wobec git show HEAD:.

Dowód: 6 mutacji, wszystkie czerwone

Po jednej na tryb: name-import szwu wewnętrznego · brak name-importu szwu zewnętrznego · patch w fasadę · nazwa dwukonsumencka podmieniona raz · fasada re-eksportująca szew · łańcuch na złym submodule.

Testy

1542 passed (1491 unit + 51 integration), 1 skipped — zweryfikowane niezależnie, nie tylko raportem wykonawcy.
ruff check czysto · preview blank-lines czysto · C901 zbiory identyczne, wyłącznie zmiana ścieżek.

🤖 Generated with Claude Code

https://claude.ai/code/session_0134rSCftVxsMVL8sngceT7A

Ostatni i najtrudniejszy z trzech podziałów fazy 1. render.py 3016 → 15
modułów, 73 symbole, 2723 linie przeniesione, 34 zmienione.

_run.py MA 941 LINII I TO JEST CELOWE. Faza 1 dzieliła PLIK, nie dekomponowała
funkcji. run_render ma nadal CC 97 i 829 linii — to zadanie fazy 3. Zapisane
w docstringu modułu, żeby struktura katalogów nie wyglądała na skończoną,
zanim jest.

SZWY: 20 nazw, 70 miejsc podmiany. 10 z 19 zdefiniowanych POZA pakietem,
czyli tryb ustalony dopiero przy compile (1b). Fasada wstrzymuje wszystkie 19
i nigdy nie wiąże `replace`.

Recorder i probe_frame_count mają konsumentów w DWÓCH modułach, więc jedna
linia podmiany przestała wystarczać — strażnik to teraz egzekwuje
(assert_multi_consumer_coverage), a testy podmieniają oba miejsca.

TRZY RZECZY, KTÓRYCH POPRZEDNIE PODZIAŁY NIE MOGŁY PRZYNIEŚĆ

1. Szwy używane wyłącznie w ADNOTACJACH TYPÓW. Overlay jest wołany w jednym
   miejscu, a anotowany w siedmiu, w czterech modułach. Przez
   `from __future__ import annotations` te adnotacje są stringami i nic nie
   wiążą — ale skan AST nie odróżnia importu do adnotacji od importu do
   wartości. TYPE_CHECKING też by nie pomogło. Rozwiązane anotowaniem przez
   obiekt modułu, co jest zgodne z regułą szwów. 8 z 13 przecelowań.

2. `timeline` jest zmienną LOKALNĄ w run_render. Wywołanie
   timeline._apply_timeline_edits(...) rozwiązałoby się do obiektu Timeline
   zbudowanego cztery linie wcześniej i wywaliło AttributeError na OSTATNIM
   kroku pełnego renderu — po kilkunastu minutach pracy. Alias timeline_module.

3. os.replace podmieniane ścieżką w stringu przez moduł render wymagało
   ROZSZERZENIA WSPÓLNEGO STRAŻNIKA, nie lokalnej łatki: odrzucał każdego
   właściciela z kropką. Dodany _module_chain_offender — łańcuch akceptowany
   tylko wtedy, gdy głowa jest submodułem pakietu i każdy krok rozwiązuje się
   do prawdziwego ModuleType mającego dany atrybut. Oba istniejące strażniki
   przechodzą bez zmian.

Dwa odstępstwa od układu ze specu, oba udokumentowane w docstringach: sonda
content-box poszła do popup_crop (jest poziomem 2 łańcucha cropu, a spec sam
mówi, że trzy poziomy to jedna opowieść), a _prepare_main_after_popup_close
do visuals (zamyka cykl importów i jest dokładnym odwróceniem
_hand_cursor_to_popup).

34 zmienione linie: 13 przecelowań szwów + 21 requalifikacji odwołań
w komentarzach, które podział uczynił fałszywymi (plus 8 poza pakietem —
mux/crop.py miał odwołanie do render._recording_scale).

DOWÓD: 6 mutacji, wszystkie czerwone, po jednej na tryb — name-import szwu
wewnętrznego, brak name-importu szwu zewnętrznego, patch w fasadę, nazwa
dwukonsumencka podmieniona raz, fasada re-eksportująca szew, łańcuch na złym
submodule.

Suite: 1542 passed (1491 unit + 51 integration), 1 skipped. Zweryfikowane
niezależnie, nie tylko raportem wykonawcy. ruff czysto, preview blank-lines
czysto, C901 zbiory identyczne — wyłącznie zmiana ścieżek.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0134rSCftVxsMVL8sngceT7A
@mpasternak
mpasternak merged commit 01991ee into main Jul 22, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant