extension for ref resolve, explode, implode, weave, tangle

This commit is contained in:
2026-05-04 02:25:49 +02:00
parent 8203f50fd5
commit 65bfc1aebf
39 changed files with 3959 additions and 25 deletions

View File

@@ -0,0 +1,93 @@
from pathlib import Path
import pytest
from click.testing import CliRunner
from markitect_tool.cli import main
from markitect_tool.explode import (
EXPLODE_MANIFEST_NAME,
ExplodeError,
explode_markdown_file,
implode_markdown_directory,
)
ROUNDTRIP_DOC = """---
title: Explode Example
---
Opening text before the first heading.
# Intro
Intro body.
## Detail
Detail body.
# Later
Later body.
"""
def test_flat_explode_implode_roundtrips_exact_markdown(tmp_path: Path):
source = tmp_path / "source.md"
output_dir = tmp_path / "exploded"
source.write_text(ROUNDTRIP_DOC, encoding="utf-8")
result = explode_markdown_file(source, output_dir, variant="flat")
imploded = implode_markdown_directory(output_dir)
assert Path(result.manifest_path).name == EXPLODE_MANIFEST_NAME
assert (output_dir / "00-preamble.md").exists()
assert (output_dir / "sections" / "01-intro.md").exists()
assert imploded.markdown == ROUNDTRIP_DOC
assert imploded.current_hash == result.manifest.source_hash
def test_hierarchical_explode_places_child_sections_under_parent(tmp_path: Path):
source = tmp_path / "source.md"
output_dir = tmp_path / "exploded"
source.write_text(ROUNDTRIP_DOC, encoding="utf-8")
result = explode_markdown_file(source, output_dir, variant="hierarchical")
files = {Path(path).relative_to(output_dir).as_posix() for path in result.written_files}
assert "01-intro.md" in files
assert "01-intro/02-detail.md" in files
assert implode_markdown_directory(output_dir).markdown == ROUNDTRIP_DOC
def test_explode_rejects_non_empty_output_without_force(tmp_path: Path):
source = tmp_path / "source.md"
output_dir = tmp_path / "exploded"
output_dir.mkdir()
(output_dir / "existing.md").write_text("Existing", encoding="utf-8")
source.write_text(ROUNDTRIP_DOC, encoding="utf-8")
with pytest.raises(ExplodeError, match="not empty"):
explode_markdown_file(source, output_dir)
def test_mkt_explode_and_implode(tmp_path: Path):
source = tmp_path / "source.md"
output_dir = tmp_path / "exploded"
rebuilt = tmp_path / "rebuilt.md"
source.write_text(ROUNDTRIP_DOC, encoding="utf-8")
runner = CliRunner()
explode_result = runner.invoke(
main,
["explode", str(source), "--output-dir", str(output_dir), "--variant", "flat"],
)
implode_result = runner.invoke(
main,
["implode", str(output_dir), "--output", str(rebuilt)],
)
assert explode_result.exit_code == 0
assert "entries: 4" in explode_result.output
assert implode_result.exit_code == 0
assert rebuilt.read_text(encoding="utf-8") == ROUNDTRIP_DOC