Skip to content

Commit e38c508

Browse files
committed
test code examples in src
1 parent 6faa44a commit e38c508

File tree

1 file changed

+19
-7
lines changed

1 file changed

+19
-7
lines changed

tests/test_docs.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,19 @@
1212

1313
import pytest
1414

15-
pytest_examples = pytest.importorskip("pytest_examples")
15+
pytest.importorskip("pytest_examples")
16+
from pytest_examples import CodeExample, EvalExample, find_examples
1617

1718
# Find all markdown files with executable code blocks
18-
docs_root = Path(__file__).parent.parent / "docs"
19+
DOCS_ROOT = Path(__file__).parent.parent / "docs"
20+
SOURCES_ROOT = Path(__file__).parent.parent / "src" / "zarr"
1921

2022

2123
def find_markdown_files_with_exec() -> list[Path]:
2224
"""Find all markdown files containing exec="true" code blocks."""
2325
markdown_files = []
2426

25-
for md_file in docs_root.rglob("*.md"):
27+
for md_file in DOCS_ROOT.rglob("*.md"):
2628
try:
2729
content = md_file.read_text(encoding="utf-8")
2830
if 'exec="true"' in content:
@@ -41,7 +43,7 @@ def group_examples_by_session() -> list[tuple[str, str]]:
4143
Returns a list of session_key tuples where session_key is
4244
(file_path, session_name).
4345
"""
44-
all_examples = list(pytest_examples.find_examples(docs_root))
46+
all_examples = list(find_examples(DOCS_ROOT))
4547

4648
# Group by file and session
4749
sessions = defaultdict(list)
@@ -64,7 +66,7 @@ def group_examples_by_session() -> list[tuple[str, str]]:
6466

6567
def name_example(path: str, session: str) -> str:
6668
"""Generate a readable name for a test case from file path and session."""
67-
return f"{Path(path).relative_to(docs_root)}:{session}"
69+
return f"{Path(path).relative_to(DOCS_ROOT)}:{session}"
6870

6971

7072
# Get all example sessions
@@ -73,7 +75,7 @@ def name_example(path: str, session: str) -> str:
7375
)
7476
def test_documentation_examples(
7577
session_key: tuple[str, str],
76-
eval_example: pytest_examples.EvalExample, # type: ignore[name-defined]
78+
eval_example: EvalExample,
7779
) -> None:
7880
"""
7981
Test that all exec="true" code examples in documentation execute successfully.
@@ -91,7 +93,7 @@ def test_documentation_examples(
9193
file_path, session_name = session_key
9294

9395
# Get examples for this session
94-
all_examples = list(pytest_examples.find_examples(docs_root))
96+
all_examples = list(find_examples(DOCS_ROOT))
9597
examples = []
9698
for example in all_examples:
9799
settings = example.prefix_settings()
@@ -103,6 +105,16 @@ def test_documentation_examples(
103105
# Run all examples in this session sequentially, preserving state
104106
module_globals: dict[str, object] = {}
105107
for example in examples:
108+
# TODO: uncomment this line when we are ready to fix output checks
109+
# result = eval_example.run_print_check(example, module_globals=module_globals)
106110
result = eval_example.run(example, module_globals=module_globals)
107111
# Update globals with the results from this execution
108112
module_globals.update(result)
113+
114+
115+
@pytest.mark.parametrize("example", find_examples(str(SOURCES_ROOT)), ids=str)
116+
def test_docstrings(example: CodeExample, eval_example: EvalExample) -> None:
117+
"""Test our docstring examples."""
118+
if example.path.name == "config.py" and "your.module" in example.source:
119+
pytest.skip("Skip testing docstring example that assumes nonexistent module.")
120+
eval_example.run_print_check(example)

0 commit comments

Comments
 (0)