Skip to main content

A reversible-operations journal library with session-based history and undo orchestration.

Project description

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 HistoryManager per thread

Best Practices

  • Use SQLiteStorage for multi-threaded applications
  • Use InMemoryStorage only with external locking when shared across threads
  • Avoid sharing a mutable HistoryManager + InMemoryStorage pair 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>

Project details


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)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

unmake-0.1.4-py3-none-any.whl (16.8 kB view details)

Uploaded Python 3

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

Hashes for unmake-0.1.4.tar.gz
Algorithm Hash digest
SHA256 2a548846d56a7403976db0b2f8d53918efcb4149d15cce947e4f158d411a0793
MD5 03391fb052e13c59f4bf3e332607ab75
BLAKE2b-256 8dcbc2a412e17e9289f4b057a7a95edb2675e52ee5deb26845cfe2329cb2eba7

See more details on using hashes here.

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

Hashes for unmake-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 9c7feed7473294b44ccce5ccaa5bcc6277f5eed9a20cbfd03fb0c6e29b3b556b
MD5 d36c467a2c197261297e3d8811f43d51
BLAKE2b-256 091e56639112f839a8a4d41babdd36ab92fcd87256c3f44ecc0a2aef4f316dff

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page