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
GitHubIssue #4 · Project „SafeSort — pierwsze wydanie”
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
~/safesort $ safesort plan ~/Downloads
9 move operations planned.
No files have been changed.

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ć.

~ $ sha256sum Downloads/* > before.txt
~ $ safesort plan ~/Downloads
9 move operations planned.
No files have been changed.
~ $ sha256sum Downloads/* > after.txt
~ $ diff before.txt after.txt
 

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