from pathlib import Path from click.testing import CliRunner from markitect_tool.cli import main from markitect_tool.literate import ( discover_code_chunks, tangle_markdown, weave_markdown, write_tangle_files, ) LITERATE_DOC = """# Literate Example ```python {#helpers} def helper(): return "ready" ``` ```python {#main tangle="src/app.py"} <> def main(): return helper() ``` """ def test_discover_code_chunks_with_references_and_targets(): chunks = discover_code_chunks(LITERATE_DOC, source_path="example.md") assert [chunk.chunk_id for chunk in chunks] == ["helpers", "main"] assert chunks[1].target_path == "src/app.py" assert chunks[1].references == ["helpers"] def test_tangle_expands_named_chunk_references(): result = tangle_markdown(LITERATE_DOC, source_path="example.md") assert result.valid assert len(result.files) == 1 assert result.files[0].path == "src/app.py" assert "def helper" in result.files[0].content assert "<>" not in result.files[0].content assert result.provenance[0].operation == "literate.tangle" def test_tangle_reports_missing_chunk_reference(): markdown = """```python {#main tangle="src/app.py"} <> ``` """ result = tangle_markdown(markdown, source_path="example.md") assert not result.valid assert result.diagnostics[0].code == "literate.missing_chunk" def test_weave_appends_chunk_index(): result = weave_markdown(LITERATE_DOC, source_path="example.md") assert "## Code Chunk Index" in result.markdown assert "`main` -> `src/app.py`; refs: `helpers`" in result.markdown def test_write_tangle_files(tmp_path: Path): result = tangle_markdown(LITERATE_DOC, source_path="example.md") written = write_tangle_files(result, tmp_path) assert written == [str(tmp_path / "src" / "app.py")] assert "def main" in (tmp_path / "src" / "app.py").read_text(encoding="utf-8") def test_mkt_tangle_and_weave(tmp_path: Path): source = tmp_path / "literate.md" output_dir = tmp_path / "out" woven = tmp_path / "woven.md" source.write_text(LITERATE_DOC, encoding="utf-8") runner = CliRunner() tangle_result = runner.invoke(main, ["tangle", str(source), "--output-dir", str(output_dir)]) weave_result = runner.invoke(main, ["weave", str(source), "--output", str(woven)]) assert tangle_result.exit_code == 0 assert "files: 1" in tangle_result.output assert (output_dir / "src" / "app.py").exists() assert weave_result.exit_code == 0 assert "## Code Chunk Index" in woven.read_text(encoding="utf-8")