Rozdział 23 · Część IV · Wdrażamy SafeSort
Tryb Podglądu
Komenda plan — podgląd bez efektów ubocznych: ten sam plan co apply, ale bez żadnej zmiany na dysku.
SafeSort · Część 4 z 6Wdrożenie
Add dry-run CLI (scan/plan)
Area: CLIPriority: Medium
git switch -c feat/cli
Komenda plan — jedyne, co trzeba zrobić z gotowym obiektem SortPlanuzyskać pełny
podgląd (dry run): zbiera plan i go dedukuje
rozmiar na ekranie, nie powodując żadnej zmiany dysku.
src/safesort/cli.py
def cmd_plan(args: argparse.Namespace) -> int:
root = args.root
config, code = _load_config(root)
files = scan(root, config)
plan = build_plan(files, root, config)
print(f"{len(plan.operations)} move operations planned.")
print("No files have been changed.")
return 0
Drugi łańcuch znaków wynik — "No files have been changed." — to nie forma. Sprawdzimy ją uczciwie: policzymy sumy kontrolne plików przed i po
plan porównać.
diff nie wydrukowało ani jednej linii, pliki naprawdę nie
zmieniły się. Później ta sama kontrola zostanie wykonana przez test automatyczny, a nie ręczne porównanie.
scan, plan i duplicates używają tego samego pliku lista
Trzy read-only polecenia SafeSort —
scan, plan oraz duplicates — zaczynają się jednakowo: wywołują scan()zdobyć lista plików. Wtedy ich ścieżki się rozdzielają: plan tworzy plan, duplicates szuka dopasowania w treści, oraz scan liczy pliki tylko według kategorii.W historii repozytorium cli.py zbierano w jednym PR, na samym końcu
Ta książka wprowadza
cli.py stopniowo: cmd_plan() tutaj, pozostałe podkomendy dalej w miarę gotowości funkcji, które wywołują. W prawdziwym repozytorium SafeSort było odwrotnie: argparse- opakowanie dla wszystkich pięciu podkomend (scan, plan, apply, duplicates, undo)) zostało napisane i scalone jednym PR na samym końcu, gdy wszystkie pięć funkcji już istniało. To dwa różne porządki: porządek, w którym wygodnie jest wyjaśniać, i porządek, w którym faktycznie pisano kod.Krótko
- plan wyświetla ten sam SortPlan co apply, ale wyświetla tylko swój rozmiar na ekranie.
- scan, plan i duplicates zaczynają się tak samo — od wezwania do scan() — i idą dalej.
- Stwierdzenie „pliki nie zostały zmienione”
Punkt kontrolny · Issue #4
git commit -m "feat: add command-line interface"
W rzeczywistej historii repozytorium jest to Pull Request #21, która była ostatnią z dziewięciu połączoną po Issue #9 (duplikaty), a nie bezpośrednio po planie, jak jest w kolejności tej książki: w tym momencie wszystkie funkcje potrzebujące powiązania CLI już istniały w repozytorium.
Status prawdziwego Project: Done