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