Rozdział 23 · Część IV · Wdrażamy SafeSort

Dziennik wykonanych operacji

Każdy apply tworzy manifest JSON-, pokazujący, co naprawdę się wydarzyło – to jedyne źródło danych do cofnięcia.

SafeSort · Część 4 z 6Wdrożenie
GitHubIssue #7 · Project SafeSort Pierwsze wydanie
Record operation manifest
Area: SafetyPriority: Medium
git switch -c feat/manifest-and-undo

Każde udane połączenie apply pozostawia ślad — plik-manifest w formacie JSON, który opisuje, co dokładnie zostało wykonane. Bez tego dziennika polecenie undo, o którym będę mówić na następnej stronie, nie wiem Co dokładnie należy anulować.

applyprzenosi plikilistaruchysource → destinationmanifest.jsonnagrane na dysk
apply nie tylko przesuwa pliki — rejestruje dokładnie, co zrobiła.
.safesort/history/20260824T011640800152.json
{
  "operation_id": "20260824T011640800152",
  "root": "/home/anna/Downloads",
  "timestamp": "2026-08-24T01:16:40",
  "moves": [
    {
      "source": "/home/anna/Downloads/otchet.pdf",
      "destination": "/home/anna/Downloads/Sorted/documents/otchet.pdf",
      "completed": true,
      "error": null
    }
  ]
}

Ścieżka do manifestu — nieprzypadkowa: jest przewidywalnie tworzona od korzenia i identyfikatora operacji, a sam identyfikator — znacznik czasowy, sformatowany tak, aby porządek leksykograficzny zgadzał się z chronologicznym:

src/safesort/manifest.py
def new_operation_id() -> str:
    return datetime.now().strftime("%Y%m%dT%H%M%S%f")

def history_dir(root: Path) -> Path:
    return Path(root) / STATE_DIRNAME / "history"
Dlaczego właśnie ten format identyfikatora
Struna jak 20260824T011640800152 jest sortowany jako tekst dokładnie w tej samej kolejności, w jakiej operacje miały miejsce w czasie. To pozwala na find_latest_manifest() znaleźć tę ostatnią operację, po prostu sortując nazwy plików bez czytania zawartości każdego manifestu.

Modele Path w programie musi zostać przekształcone w zwykłe łańcuch znaków do zapisu JSON, format, który nie ma typu „ścieżki”

Praktyka: manifest jak zwykły JSON
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →
Checkpoint · Issue #7
git commit -m "feat: record operation manifest and add undo"
Zlał się jak Pull Request #19. Tytuł PR pokazuje, że jest to jedna gałąź dla dwóch ściśle powiązanych zadań: bez manifestu Issue #8 (undo, następna strona) po prostu nie byłoby nic do przywrócenia.
Status prawdziwego Project: Done