unmake
unmake is a Python library for recording destructive operations in sessions and orchestrating undos later.
It is intentionally split into:
- Storage backend (you choose persistence strategy, e.g., SQLite)
- Operation payload (you define schema and reconstruction)
- Undo orchestration (library provides session + operation ordering)
Install
uv sync
Quickstart
from pathlib import Path
from unmake import HistoryManager, OperationRegistry, SQLiteStorage
manager = HistoryManager(SQLiteStorage("history.db"))
# Record a run
with manager.start_session(script="dangerous_script.py", args=["--force"]) as session:
Path("a.txt").rename("b.txt")
session.record_operation("fs.move", {"src": "a.txt", "dst": "b.txt"})
# Register reconstruction logic for undo
class MoveUndo:
def __init__(self, payload: dict):
self.src = payload["src"]
self.dst = payload["dst"]
def undo(self) -> None:
Path(self.dst).rename(self.src)
registry = OperationRegistry()
registry.register("fs.move", MoveUndo)
# Undo all operations in reverse order
session_id = manager.list_sessions(limit=1)[0].session_id
manager.undo_session(session_id, registry)
Development workflow
This project is configured for uv, make, and PEP 621 metadata.
make install
make test
make lint
make build
Publish
# Configure token in env first
# export UV_PUBLISH_TOKEN=...
make publish
Bump version
make bump-patch
make bump-minor
make bump-major
Thread Safety
InMemoryStorage
- Not thread-safe by default
- Use external locking for concurrent access:
import threading
from unmake import HistoryManager, InMemoryStorage
storage = InMemoryStorage()
manager = HistoryManager(storage)
lock = threading.Lock()
with lock:
with manager.start_session(script="safe.py") as session:
session.record_operation("demo.noop", {"value": 1})
SQLiteStorage
- Thread-safe for standard usage with one connection per method call
- SQLite handles concurrent access with internal locking
- Performance may degrade under very high contention
- Prefer one
HistoryManagerper thread
Best Practices
- Use
SQLiteStoragefor multi-threaded applications - Use
InMemoryStorageonly with external locking when shared across threads - Avoid sharing a mutable
HistoryManager+InMemoryStoragepair across threads
CLI
Install project dependencies and run:
unmake --db history.db list-sessions
unmake --db history.db show-session <session-id>
unmake --db history.db undo <session-id>
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
unmake-0.1.4.tar.gz
(14.5 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
unmake-0.1.4-py3-none-any.whl
(16.8 kB
view details)
File details
Details for the file unmake-0.1.4.tar.gz.
File metadata
- Download URL: unmake-0.1.4.tar.gz
- Upload date:
- Size: 14.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a548846d56a7403976db0b2f8d53918efcb4149d15cce947e4f158d411a0793
|
|
| MD5 |
03391fb052e13c59f4bf3e332607ab75
|
|
| BLAKE2b-256 |
8dcbc2a412e17e9289f4b057a7a95edb2675e52ee5deb26845cfe2329cb2eba7
|
File details
Details for the file unmake-0.1.4-py3-none-any.whl.
File metadata
- Download URL: unmake-0.1.4-py3-none-any.whl
- Upload date:
- Size: 16.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9c7feed7473294b44ccce5ccaa5bcc6277f5eed9a20cbfd03fb0c6e29b3b556b
|
|
| MD5 |
d36c467a2c197261297e3d8811f43d51
|
|
| BLAKE2b-256 |
091e56639112f839a8a4d41babdd36ab92fcd87256c3f44ecc0a2aef4f316dff
|