Backend fabric extension

This commit is contained in:
2026-05-04 02:43:32 +02:00
parent 33aee0d162
commit 3f08a27a24
11 changed files with 1080 additions and 8 deletions

View File

@@ -0,0 +1,119 @@
from pathlib import Path
from click.testing import CliRunner
from markitect_tool.backend import (
BackendManifest,
DependencyEdge,
DocumentSnapshot,
ProvenanceEnvelope,
capability_check,
load_backend_manifest,
load_backend_registry,
snapshot_identity_for_file,
)
from markitect_tool.cli import main
def test_load_markdown_backend_manifest():
manifest = load_backend_manifest("examples/backends/local-sqlite-backend.md")
assert manifest.id == "local-sqlite-cache"
assert "snapshots" in manifest.capabilities
assert manifest.storage["engine"] == "sqlite"
def test_load_yaml_backend_registry_and_filter_by_capability():
registry = load_backend_registry(["examples/backends"])
assert [manifest.id for manifest in registry.list()] == [
"local-context-packages",
"local-sqlite-cache",
]
assert [manifest.id for manifest in registry.find_by_capability("context_packages")] == [
"local-context-packages"
]
def test_backend_capability_check_reports_missing_capabilities():
manifest = BackendManifest(id="memory", capabilities=["snapshots", "provenance"])
check = capability_check(manifest, ["snapshots", "fts", "provenance"])
assert not check.compatible
assert check.missing == ["fts"]
def test_snapshot_identity_includes_content_and_parse_options(tmp_path: Path):
source = tmp_path / "doc.md"
source.write_text("# Doc\n", encoding="utf-8")
first = snapshot_identity_for_file(source, parse_options={"tables": True})
second = snapshot_identity_for_file(source, parse_options={"tables": False})
assert first.content_hash == second.content_hash
assert first.parse_options_hash != second.parse_options_hash
assert first.snapshot_id != second.snapshot_id
def test_document_snapshot_and_provenance_to_dict(tmp_path: Path):
source = tmp_path / "doc.md"
source.write_text("# Doc\n", encoding="utf-8")
identity = snapshot_identity_for_file(source)
edge = DependencyEdge(source_id="section:doc", target="std:terms.md", kind="reference")
provenance = ProvenanceEnvelope(
operation="snapshot.put",
snapshot_id=identity.snapshot_id,
source_path=str(source),
content_hash=identity.content_hash,
dependencies=[edge],
backend_id="local",
)
snapshot = DocumentSnapshot(
identity=identity,
document={"headings": [{"text": "Doc"}]},
dependencies=[edge],
provenance=provenance,
)
data = snapshot.to_dict()
assert data["snapshot_id"] == identity.snapshot_id
assert data["dependencies"][0]["kind"] == "reference"
assert data["provenance"]["backend_id"] == "local"
def test_mkt_backend_list_and_inspect():
runner = CliRunner()
listed = runner.invoke(main, ["backend", "list", "--path", "examples/backends"])
inspected = runner.invoke(
main,
[
"backend",
"inspect",
"local-sqlite-cache",
"--path",
"examples/backends",
"--require",
"snapshots",
"--require",
"provenance",
],
)
assert listed.exit_code == 0
assert "local-sqlite-cache" in listed.output
assert inspected.exit_code == 0
assert "compatible" in inspected.output
def test_mkt_backend_snapshot_id(tmp_path: Path):
source = tmp_path / "doc.md"
source.write_text("# Doc\n", encoding="utf-8")
result = CliRunner().invoke(main, ["backend", "snapshot-id", str(source)])
assert result.exit_code == 0
assert result.output.startswith("snapshot:")
assert "content_hash: sha256:" in result.output