Let --context expand any selection past its range, drawing from the whole file
This commit is contained in:
1 parent
c2821dedb5
commit
788d285e38
3 files changed
+90
-11
No files matched your search
+62
-2
@@ -2,13 +2,17 @@
|
||||
|
||||
import asyncio
|
||||
import json
|
||||
from datetime import UTC, datetime
|
||||
|
||||
from kanta.serialization import JsonSerializer
|
||||
from kanta.structs import META_FORMAT, ChangeRecord, Snapshot
|
||||
from tests.support import Data, make_kanta
|
||||
|
||||
# The CLI reads files with its own JSON Kanta instance unless -k is given.
|
||||
JSON = ("json", JsonSerializer)
|
||||
|
||||
T0 = datetime(2026, 1, 1, tzinfo=UTC)
|
||||
|
||||
|
||||
def _run_cli(path, *args):
|
||||
from kanta.__main__ import main
|
||||
@@ -148,7 +152,7 @@ def test_unit_and_plain_combine(tmp_path, capsys):
|
||||
|
||||
|
||||
def test_context_expands_after_grep(tmp_path, capsys):
|
||||
"""Context records come from the in-window pool, free of --grep."""
|
||||
"""Context records come from the whole file, free of --grep."""
|
||||
path = tmp_path / "data.kantadb"
|
||||
_build(path, increments=5)
|
||||
capsys.readouterr()
|
||||
@@ -168,7 +172,7 @@ def test_context_expands_after_grep(tmp_path, capsys):
|
||||
assert "inc1" not in err
|
||||
assert "inc2" in err
|
||||
|
||||
# Context is clamped at the start of the range.
|
||||
# Context is clamped at the start of the file.
|
||||
assert _run_cli(path, "--grep", "bootstrap", "--context", "2") == 0
|
||||
err = capsys.readouterr().err
|
||||
assert "bootstrap" in err
|
||||
@@ -177,6 +181,62 @@ def test_context_expands_after_grep(tmp_path, capsys):
|
||||
assert "inc2" not in err
|
||||
|
||||
|
||||
def test_context_expands_past_unit_window(tmp_path, capsys):
|
||||
"""Context expands whatever a unit selection would show, past the window."""
|
||||
path = tmp_path / "data.kantadb"
|
||||
_build(path)
|
||||
capsys.readouterr()
|
||||
|
||||
# -r r2 alone shows only inc0 (the record producing state 2); context 1
|
||||
# expands past the window to bootstrap and inc1, and the dump follows
|
||||
# the last printed record.
|
||||
assert _run_cli(path, "-r", "r2", "--context", "1", "-o", "-") == 0
|
||||
out = capsys.readouterr()
|
||||
assert "bootstrap" in out.err
|
||||
assert "inc0" in out.err
|
||||
assert "inc1" in out.err
|
||||
assert "inc2" not in out.err
|
||||
assert json.loads(out.out) == {"users": {}, "counter": 2}
|
||||
|
||||
|
||||
def test_context_expands_snapshot_selection(tmp_path, capsys):
|
||||
"""-r sN --context N shows the snapshot plus its neighbors."""
|
||||
path = tmp_path / "data.kantadb"
|
||||
serializer = JsonSerializer()
|
||||
framer = serializer.framer_cls()
|
||||
out_bytes = bytearray()
|
||||
out_bytes += framer.frame_change(
|
||||
serializer.encode(ChangeRecord(ts=T0, a="inc0", v=0, diff={"counter": 1})),
|
||||
record_offset=len(out_bytes),
|
||||
)
|
||||
snap = Snapshot(ts=T0, v=0, state={"counter": 1}, r=1, k=META_FORMAT)
|
||||
out_bytes += framer.frame_snapshot(
|
||||
serializer.encode(snap), record_offset=len(out_bytes)
|
||||
)
|
||||
out_bytes += framer.frame_change(
|
||||
serializer.encode(ChangeRecord(ts=T0, a="inc1", v=0, diff={"counter": 2})),
|
||||
record_offset=len(out_bytes),
|
||||
)
|
||||
path.write_bytes(bytes(out_bytes))
|
||||
capsys.readouterr()
|
||||
|
||||
# Without context, s1 (the file starts with a change, so s0 is l0)
|
||||
# shows just the snapshot and its state.
|
||||
assert _run_cli(path, "-r", "s1", "-o", "-") == 0
|
||||
out = capsys.readouterr()
|
||||
assert "snapshot s1" in out.err
|
||||
assert "inc0" not in out.err
|
||||
assert json.loads(out.out) == {"counter": 1}
|
||||
|
||||
# With context, the selection expands past the snapshot line.
|
||||
assert _run_cli(path, "-r", "s1", "--context", "1", "-o", "-") == 0
|
||||
out = capsys.readouterr()
|
||||
assert "inc0" in out.err
|
||||
assert "snapshot s1" in out.err
|
||||
assert "inc1" in out.err
|
||||
assert json.loads(out.out) == {"counter": 2}
|
||||
|
||||
|
||||
def test_context_merges_overlaps(tmp_path, capsys):
|
||||
"""Nearby matches share context instead of duplicating records."""
|
||||
path = tmp_path / "data.kantadb"
|
||||
|
||||
Reference in new issue
Block a user