Skip to content

refactor(video): cztery funkcje mux/ pod limit complexity (faza 2b)#67

Merged
mpasternak merged 1 commit into
mainfrom
cleanup/faza-2b-mux
Jul 22, 2026
Merged

refactor(video): cztery funkcje mux/ pod limit complexity (faza 2b)#67
mpasternak merged 1 commit into
mainfrom
cleanup/faza-2b-mux

Conversation

@mpasternak

Copy link
Copy Markdown
Member

CC 10 → 6. Wszystkie cztery pozostałe naruszenia w pakiecie mux zniknęły.

funkcja CC
compose_popup_video 21 → 3
mux_audio_tracks 17 → 1
_compose_floating 16 → 2
_compose_slide 12 → 3

Siatka pierwsza, przed dotknięciem kodu

To budowniczowie filtergraphu ffmpeg. Istniejące 63 testy w większości sprawdzają „renderuje się bez błędu" — a błąd tutaj produkuje plik wideo właściwej długości z niewłaściwym obrazem.

plik linie
test_mux_filtergraph.py 431 21 przypadków, każdy asertuje cały string ";".join(filters) wobec zapisanego wzorca
test_mux_argv.py 294 4 przypadki, pełne argv element po elemencie
_mux_helpers.py 180 wspólne budowanie wejść, jawnie importowane

Dowód nie-pustości siatki przed refaktorem: przestawienie setsar=1,format=yuv420p w cięciu popupu wywaliło wszystkie 21 przypadków.

Realna deduplikacja

Nowy mux/composite.py (135) to wspólny szkielet float/slide — slide.py skurczył się ze 172 do 85 linii. Nowy mux/plan.py (241) niesie PopupPlan liczony i walidowany raz.

Celowo NIE zunifikowano ramp float i slide. Wyglądają na ten sam kształt narastanie–podtrzymanie–opadanie i nie są: opadanie slide ma dodatkowe max(0, …), którego float nie ma. Ujemne przesunięcie przesunęłoby warstwy w złą stronę poza koniec. Renderuje się bez błędu; widać dopiero w pikselach. Powód zapisany w docstringu modułu.

Dowód: 7 mutacji

Najostrzejsza to C — wyemitowanie metadanych ścieżek przed argumentami kodeka:

złapały ją wszystkie 4 przypadki argv, podczas gdy 63 pozostałe testy mux przeszły, a ffmpeg przyjął argv bez protestu

To najlepszy dowód, że stary suite był w tym miejscu ślepy.

Znaleziona i załatana luka w pokryciu

Mutacja F (slide podaje komunikat float) nie została złapana przez nic. grep pokazał, że żaden test nie asertował ani jednego z dwóch komunikatów strażnika długości — a refaktor przenosił obie gałęzie do composite.py. Dopisany test na dokładną treść; po nim mutacja F pada.

Czego analiza nie przewidziała

  • _resolve_mode nie jest wart wydzielenia — to ternary, a ruff liczy ternary jako 0. Wydzielenie byłoby jednolinijkowym pomocnikiem z jednym wywołaniem, czego reguła 4 zabrania.
  • Pokrycie float/slide jest większe niż 65% — wspólny jest cały szkielet.
  • Przypadek tail_gap > 0 jest nieosiągalny bez cropu: przy teardown_tail == 0 jest algebraicznie zawsze zerowy.
  • Normalizacja cropu i wykrywanie ogona działają we wszystkich trzech trybach — tylko graf ignoruje crop w cut i slide.

Testy

1518 unit (+27 nowych) + 51 integration
ruff check, ruff format --check i preview blank-lines — czysto
C901 zbiory: cztery usunięte, nic nie dodane

test_mux.py 1610 → 1524 — nadal ponad limitem, to zadanie Fazy 5.

🤖 Generated with Claude Code

https://claude.ai/code/session_0134rSCftVxsMVL8sngceT7A

CC 10 → 6. Wszystkie cztery pozostałe naruszenia w pakiecie mux zniknęły.

  compose_popup_video  21 → 3
  mux_audio_tracks     17 → 1
  _compose_floating    16 → 2
  _compose_slide       12 → 3

SIATKA PIERWSZA, PRZED DOTKNIĘCIEM KODU. To budowniczowie filtergraphu
ffmpeg — istniejące 63 testy w większości sprawdzają "renderuje się bez
błędu", a błąd tutaj produkuje plik wideo WŁAŚCIWEJ DŁUGOŚCI z niewłaściwym
obrazem.

  test_mux_filtergraph.py  431  21 przypadków, każdy asertuje CAŁY string
                                ";".join(filters) wobec zapisanego wzorca
  test_mux_argv.py         294  4 przypadki, pełne argv element po elemencie
  _mux_helpers.py          180  wspólne budowanie wejść, jawnie importowane

Dowód nie-pustości siatki przed refaktorem: przestawienie
setsar=1,format=yuv420p w cięciu popupu wywaliło wszystkie 21 przypadków.

Nowy mux/composite.py (135) to wspólny szkielet float/slide i realna
deduplikacja — slide skurczył się ze 172 do 85 linii. Nowy mux/plan.py (241)
niesie PopupPlan liczony i walidowany raz.

CELOWO NIE ZUNIFIKOWANO ramp float i slide. Wyglądają na ten sam kształt
narastanie-podtrzymanie-opadanie i nie są: opadanie slide ma dodatkowe
max(0, ...), którego float nie ma. Ujemne przesunięcie przesunęłoby warstwy
w złą stronę poza koniec. Renderuje się bez błędu; widać dopiero w pikselach.
Powód zapisany w docstringu modułu.

DOWÓD: 7 mutacji. Najostrzejsza to C — wyemitowanie metadanych ścieżek przed
argumentami kodeka: złapały ją wszystkie 4 przypadki argv, podczas gdy
63 POZOSTAŁE TESTY MUX PRZESZŁY, a ffmpeg przyjął argv bez protestu.
To najlepszy dowód, że stary suite był w tym miejscu ślepy.

ZNALEZIONA I ZAŁATANA LUKA W POKRYCIU. Mutacja F (slide podaje komunikat
float) nie została złapana przez NIC — grep pokazał, że żaden test nie
asertował ani jednego z dwóch komunikatów strażnika długości, a refaktor
przenosił obie gałęzie do composite.py. Dopisany test na dokładną treść;
po nim mutacja F pada.

CZEGO ANALIZA NIE PRZEWIDZIAŁA
- _resolve_mode nie jest wart wydzielenia: to ternary, a ruff liczy ternary
  jako 0. Wydzielenie byłoby jednolinijkowym pomocnikiem z jednym wywołaniem,
  czego reguła 4 zabrania.
- Pokrycie float/slide jest większe niż 65% — po wydzieleniu composite_graph
  wspólny jest CAŁY szkielet.
- Przypadek tail_gap > 0 jest nieosiągalny bez cropu: przy teardown_tail == 0
  tail_gap jest algebraicznie zawsze zerowy.
- Normalizacja cropu i wykrywanie ogona działają we WSZYSTKICH trzech trybach,
  nie tylko float — tylko graf ignoruje crop w cut i slide.

Suite: 1518 unit (+27 nowych) + 51 integration. ruff, format i preview
blank-lines czysto. C901 zbiory: cztery usunięte, nic nie dodane.

test_mux.py 1610 → 1524 — nadal ponad limitem, to zadanie fazy 5.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0134rSCftVxsMVL8sngceT7A
@mpasternak
mpasternak merged commit 527e9f4 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