12
12
13
13
import pytest
14
14
15
- pytest_examples = pytest .importorskip ("pytest_examples" )
15
+ pytest .importorskip ("pytest_examples" )
16
+ from pytest_examples import CodeExample , EvalExample , find_examples
16
17
17
18
# 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"
19
21
20
22
21
23
def find_markdown_files_with_exec () -> list [Path ]:
22
24
"""Find all markdown files containing exec="true" code blocks."""
23
25
markdown_files = []
24
26
25
- for md_file in docs_root .rglob ("*.md" ):
27
+ for md_file in DOCS_ROOT .rglob ("*.md" ):
26
28
try :
27
29
content = md_file .read_text (encoding = "utf-8" )
28
30
if 'exec="true"' in content :
@@ -41,7 +43,7 @@ def group_examples_by_session() -> list[tuple[str, str]]:
41
43
Returns a list of session_key tuples where session_key is
42
44
(file_path, session_name).
43
45
"""
44
- all_examples = list (pytest_examples . find_examples (docs_root ))
46
+ all_examples = list (find_examples (DOCS_ROOT ))
45
47
46
48
# Group by file and session
47
49
sessions = defaultdict (list )
@@ -64,7 +66,7 @@ def group_examples_by_session() -> list[tuple[str, str]]:
64
66
65
67
def name_example (path : str , session : str ) -> str :
66
68
"""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 } "
68
70
69
71
70
72
# Get all example sessions
@@ -73,7 +75,7 @@ def name_example(path: str, session: str) -> str:
73
75
)
74
76
def test_documentation_examples (
75
77
session_key : tuple [str , str ],
76
- eval_example : pytest_examples . EvalExample , # type: ignore[name-defined]
78
+ eval_example : EvalExample ,
77
79
) -> None :
78
80
"""
79
81
Test that all exec="true" code examples in documentation execute successfully.
@@ -91,7 +93,7 @@ def test_documentation_examples(
91
93
file_path , session_name = session_key
92
94
93
95
# Get examples for this session
94
- all_examples = list (pytest_examples . find_examples (docs_root ))
96
+ all_examples = list (find_examples (DOCS_ROOT ))
95
97
examples = []
96
98
for example in all_examples :
97
99
settings = example .prefix_settings ()
@@ -103,6 +105,16 @@ def test_documentation_examples(
103
105
# Run all examples in this session sequentially, preserving state
104
106
module_globals : dict [str , object ] = {}
105
107
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)
106
110
result = eval_example .run (example , module_globals = module_globals )
107
111
# Update globals with the results from this execution
108
112
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