refactor(core): V2-0 — gemeinsames Paket rippy statt drei Zwillingsdateien
Ampel / ampel (push) Successful in 41s
Ampel / ampel (push) Successful in 41s
WAS: Neues Paket src/rippy (core/drives/rip). detection.py,
makemkv_daten.py und notify.py lagen je ZWEIMAL im Repo — unter
docker/api UND docker/worker, byte-identisch. Jetzt gibt es sie einmal;
beide Container importieren dieselbe Datei. Verhalten unveraendert.
WARUM: Es gab kein geteiltes Paket zwischen den Containern, deshalb die
Kopien. docker/api/db.py sagt es im Kopfkommentar selbst: "Wer die
Struktur aendert, aendert BEIDE Dateien." Ein Waechter-Test
(test_zwillinge_sind_byteweise_identisch) hat das mechanisch
abgesichert — er war noetig, weil die Konstruktion falsch war. Erste
Etappe des v2-Plans (KONZEPT-V2.md §8.3).
IM EINZELNEN:
- src/rippy/{core/notify, drives/detection, rip/makemkv_daten}.py
- conftest.py in der Wurzel legt src/ auf den sys.path (die Ampel ruft
pytest dort auf).
- Beide Dockerfiles kopieren src/rippy nach /app/rippy — /app ist
Arbeitsverzeichnis und uvicorn-App-Dir, also ohne PYTHONPATH findbar.
- worker_setup_paket packt das Paket ausdruecklich mit ins Zip: die
Schleife sah nur die oberste Ebene, ein Unterordner waere nie
mitgekommen und der Windows-Worker beim Start gestorben.
- Die zwei Test-Dateien fuer makemkv_daten sind zu einer verschmolzen
(die Faelle aus beiden). Damit entfaellt auch der importlib-Umweg im
Worker-Test: der war noetig, weil bei "pytest -q" aus der Wurzel
docker/api zuerst eingesammelt wird und jeder weitere Import nur noch
den sys.modules-Cache trifft — die Worker-Kopie wurde also nie
angefasst. Netto -13 doppelte Tests, +2 neue (siehe unten).
EIN FEHLER, DEN DER UMBAU FAST AUSGELIEFERT HAETTE: In tasks.py steht
der detection-Import in einem "try/except ImportError" — absichtlich,
denn der native Windows-Worker hat kein fcntl und soll trotzdem
starten. Das except verschluckt aber JEDEN ImportError, auch einen
falschen Modulpfad. Auf Linux haette der Worker ab sofort still
detect_disc_type=None gesetzt und jeden Rip verweigert, ohne dass
irgendwo ein Fehler stuende — genau die Klasse "still scheiternder
Hintergrund-Prozess" aus AGENTS.md. Gefunden ueber eine zweite Suche
mit eingerueckten Treffern.
Waechter dagegen: src/rippy/test_paket.py prueft mit
importlib.util.find_spec (fuehrt nichts aus, laeuft also auch auf
Windows ohne fcntl), dass es die drei Modulpfade wirklich gibt. Beim
Wegnehmen von detection.py gegengeprueft: Test wird rot, nach
Wiederherstellen gruen.
GEMESSEN: ruff sauber, 290 Tests gruen + 1 uebersprungen (lokal, ohne
die zwei Linux-only-Module). Kein Modul liegt noch doppelt im Repo.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
20675a98fa
commit
b98dc5eef5
+22
-4
@@ -14,15 +14,20 @@ import uuid
|
||||
import db
|
||||
import devices as device_discovery
|
||||
import eta
|
||||
import makemkv_daten
|
||||
from rippy.rip import makemkv_daten
|
||||
import makemkv_key
|
||||
import mounts as mount_verwaltung
|
||||
import notify
|
||||
from rippy.core import notify
|
||||
import phasen
|
||||
import presets as preset_auswahl
|
||||
import rohdaten
|
||||
from celery_client import celery_client, start_rip
|
||||
from detection import CDS_DISC_OK, CDS_NO_DISC, CDS_TRAY_OPEN, drive_status
|
||||
from rippy.drives.detection import (
|
||||
CDS_DISC_OK,
|
||||
CDS_NO_DISC,
|
||||
CDS_TRAY_OPEN,
|
||||
drive_status,
|
||||
)
|
||||
|
||||
from config_validation import validate_config, ConfigValidationError
|
||||
from cache import get as cache_get, init_cache, set as cache_set
|
||||
@@ -1783,7 +1788,20 @@ async def worker_setup_paket():
|
||||
# requirements.txt für die venv, rippy.ico für die Verknüpfung
|
||||
elif name in ("requirements.txt", "rippy.ico"):
|
||||
z.write(os.path.join("worker_dist", name), name)
|
||||
|
||||
|
||||
# Das gemeinsame Paket muss MIT (Etappe V2-0): tasks.py und caps.py
|
||||
# importieren seitdem "from rippy.rip import makemkv_daten". Die
|
||||
# Schleife oben sieht nur die oberste Ebene — ein Unterordner käme
|
||||
# nie mit, und der Windows-Worker stürbe beim Start mit
|
||||
# ModuleNotFoundError. Deshalb hier ausdrücklich durchlaufen.
|
||||
paket = os.path.join("worker_dist", "rippy")
|
||||
for wurzel, _, dateien in os.walk(paket):
|
||||
for datei in sorted(dateien):
|
||||
if not datei.endswith(".py") or datei.startswith("test_"):
|
||||
continue
|
||||
voll = os.path.join(wurzel, datei)
|
||||
z.write(voll, os.path.relpath(voll, "worker_dist"))
|
||||
|
||||
# Write RIPPY_VERSION to version.txt
|
||||
version_str = os.getenv("RIPPY_VERSION", "dev")
|
||||
z.writestr("version.txt", version_str)
|
||||
|
||||
Reference in New Issue
Block a user