Commit Graph
28 Commits
Author SHA1 Message Date
Leo Vasanko f63f6e74c6 Include extra also on transaction abort messages. 2026-08-07 14:54:33 +00:00
Leo Vasanko ecd146f72c Document kanta.ctx as the app-context channel for logemit
kanta.ctx already existed as a user-writable namespace for migrations;
since LogEvent carries the kanta instance, ev.kanta.ctx is also the way
for applications to pass per-connection metadata to their logemit
callbacks, including for creation/bootstrap events. No API change needed.
2026-08-07 06:04:35 +00:00
Leo Vasanko 799b2438be Add kanta instance to LogEvent and make header settable
Every emitted event now carries the originating Kanta instance so logemit
callbacks can reach application state attached to it. The header property
gains a setter, formalizing restyle-then-delegate: assign ev.header and
return truthy to keep the default diff routing with a custom header.
2026-08-07 05:57:43 +00:00
Leo Vasanko c90db530fd Unify default emitter around universal LogEvent.header
All event kinds now share one shape: a one-line header plus an optional
diff body for changes. LogEvent.header is a lazy property covering every
kind (change, aborted, created, migrated), and default_emit reduces to
logging the header plus routing diff_lines to the .diff child logger.
Custom emitters can tap the same blocks - header, diff_lines, Line,
format_diff - instead of reimplementing formatting per message type.
2026-08-07 05:52:26 +00:00
Leo Vasanko cc319ce065 Include 'by user' in abort messages
The aborted event now carries the transaction user, resolved through the
logfmt chain against the pre-transaction state so it matches change
headers. Default rendering: '<action> by <user> transaction aborted: <e>'.
User resolution factored into _build_logfmt/_resolve_user helpers shared
by the change and abort paths.
2026-08-07 05:45:31 +00:00
Leo Vasanko 79faa220df Route transaction aborts through logemit as 'aborted' events
The rollback warning is now a LogEvent (kind='aborted', WARNING level,
carrying the exception) dispatched via emit_event so logemit callbacks can
handle or restyle it. Default rendering: action in transaction color
without quotes, followed by ' transaction aborted: {exc}' in default
color.
2026-08-07 05:40:01 +00:00
Leo Vasanko 54d01f1e74 Fortify logging: no logging failure may break functionality
emit_event now swallows and reports any failure, including crashes in the
built-in default_emit formatting itself; log_change routes through it.
logfmt chain callbacks that raise are logged and treated as fall-through,
and logmigr callbacks get on_error reporting like fatal_error handlers,
so a broken logging callback can no longer abort a transaction or open.

Demo: raw user ids in v0 logs, logfmt-resolved names in v1 logs.
2026-08-07 05:23:33 +00:00
Leo Vasanko 6eb9087863 Add logemit event callbacks and kanta.tty terminal formatting
All change-related output (transactions, bootstrap, migrations) is now
described by a mutable LogEvent carrying full state plus the preferred
logger and level, and dispatched through emit_event. @kanta.logemit
callbacks receive the event and decide what is logged where: falsy return
marks it handled, truthy passes it (possibly modified) down the chain,
with default_emit - Kanta's own formatting, now just another emitter - as
the fallback. Pretty header and diff lines are lazy event properties.

New kanta.tty module: Line builder (call to append content, .colorname
arms a palette color for the next call with automatic folded reset,
width/align padding), a mutable Colors palette storing bare SGR params
(0 clears, sequential last-wins stacking), and strip_ansi/displaywidth/pad
helpers that count wide chars and emoji correctly.
2026-08-07 05:11:54 +00:00
Leo Vasanko e42f81f44f Replace log dict toggles with logdiff kwarg and kanta.transaction.diff logger
Per-transaction logdiff=False skips building and printing the diff body,
logging only the header. Globally, configure_logging(diff=False) disables
the kanta.transaction.diff child logger, which now carries all diff lines,
so applications can route or silence diffs separately from headers.
2026-08-07 01:26:50 +00:00
Leo Vasanko 9e19a1bf21 Remove logheader callback feature; keep Kanta-colored extra string in default header 2026-08-07 00:44:06 +00:00
Leo Vasanko e0725c5738 Kanta colors log header parts: extra is a plain string, logheader callbacks receive pre-colored parts 2026-08-07 00:31:04 +00:00
Leo Vasanko 5d66d423da Lazy clock reads; demo: auto-advancing +1h clock, module-level setup 2026-08-07 00:01:16 +00:00
Leo Vasanko 123e910873 Add @kanta.clock hook replacing the UTC clock for all record and snapshot timestamps 2026-08-06 23:55:09 +00:00
Leo Vasanko f4e0c66907 Tests for rich logging, apply ruff formatting 2026-08-06 23:06:24 +00:00
Leo Vasanko 9c0b47ce38 Add kanta.bootstrap logger and configurable logging setup
- Bootstrap records are now logged via kanta.bootstrap at INFO level.
- Existing databases log 'Using <path>' at DEBUG on kanta.bootstrap.
- New databases log 'Created <path>' at INFO on kanta.bootstrap.
- Renamed loggers: kanta.changes -> kanta.transaction, kanta.migrations -> kanta.migration.
- configure_logging() gains bootstrap/migration/transaction/skiproot kwargs.
- Default configure_logging() attaches a no-prefix stderr handler to kanta and stops propagation.
- With skiproot=False, child logger propagation flags are still applied but kanta itself is left untouched.
- Updated tests and docstrings.
2026-06-20 19:10:58 +00:00
Leo Vasanko 3e1a86aee3 Log new database creation, bootstrap like a transaction. 2026-06-20 18:15:08 +00:00
Leo Vasanko 652d60b74b Add separate migration logging, logmigr callback, and log= override
- Split transaction logger (kanta.changes) and migration logger (kanta.migrations).
- Migrations.apply() now returns MigrationResult instead of logging.
- Kanta.open() emits one info summary per DB and debug transaction per migration.
- Add open(log=...) to suppress/redirect default migration logging.
- Add @kanta.logmigr callback for custom migration logging/summaries.
- Add transaction(log=...) to suppress/redirect transaction logging.
- Update tests for the new MigrationResult API and logging behaviour.
2026-06-15 23:14:18 +00:00
Leo Vasanko 96fd6b83dd Revised migration context: don't store changerecord unless something was changed, and always snapshot if and after changes done. 2026-06-15 22:14:03 +00:00
Leo Vasanko 1642b3f876 Stricter versioning: always store migrate version record, file must be within versions included in migrations. Log only for migrations that made changes. Allow deleting older migration functions when no longer required. 2026-06-15 03:09:45 +00:00
Leo Vasanko 526cd6eb80 Refactor Migrations internals, add caching to avoid reloading per each Kanta instance. Naming changed from MigrationRegistry to Migration, module from migrate to kanta.migrations. 2026-06-15 01:12:42 +00:00
Leo Vasanko c1d01d3b1c Fix creation of new database, ensuring that a bootstrap record of the initial state is always written. 2026-06-15 00:32:54 +00:00
Leo Vasanko 26101bc028 Add kanta.ctx SimpleNamespace for user variables. This is passed to migration functions if they take a second argument. Remove the old MigrationCtx system. 2026-06-14 19:54:23 +00:00
Leo Vasanko 3e6210d0e9 Add read only mode that doesn't use locking. Useful for inspection while the database is in use or when no changes are intended (except in RAM). 2026-06-14 19:35:06 +00:00
Leo Vasanko 1cda44f328 Only Kanta exported at root, others available from submodules. 2026-06-13 21:26:35 +00:00
Leo Vasanko 384b4fba4f Improved log formatting support by @kanta.logfmt, which replaces old resolver and user_display arguments (breaking change). 2026-06-13 21:22:05 +00:00
Leo Vasanko 7a74662df0 Implement proper bootstrap and fatal error handling via decorators. Breaks compatibility. 2026-06-13 02:58:29 +00:00
Leo Vasanko 74150b783c Proper ts/mtime setting and tracking. Added Kanta.mtime property for reading current change time. 2026-06-13 00:49:35 +00:00
Leo Vasanko afebad72df Initial commit 2026-06-12 19:18:15 +00:00