sphinx-examples-as-code 0.8.0__tar.gz → 0.8.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/PKG-INFO +4 -4
  2. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/README.md +3 -3
  3. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/sphinx_examples_as_code/__init__.py +11 -10
  4. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/sphinx_examples_as_code/_version.py +3 -3
  5. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/sphinx_examples_as_code.egg-info/PKG-INFO +4 -4
  6. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/sphinx_examples_as_code.egg-info/scm_version.json +2 -2
  7. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/test_gallery_downloads.py +1 -1
  8. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/test_single_function_page.py +1 -1
  9. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/test_sphinx_examples_as_code.py +2 -2
  10. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/test_tinypages.py +3 -3
  11. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/.github/dependabot.yml +0 -0
  12. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/.github/release.yml +0 -0
  13. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/.github/workflows/ci.yml +0 -0
  14. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/.gitignore +0 -0
  15. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/.pre-commit-config.yaml +0 -0
  16. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/LICENSE +0 -0
  17. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/pyproject.toml +0 -0
  18. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/setup.cfg +0 -0
  19. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/sphinx_examples_as_code.egg-info/SOURCES.txt +0 -0
  20. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/sphinx_examples_as_code.egg-info/dependency_links.txt +0 -0
  21. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/sphinx_examples_as_code.egg-info/requires.txt +0 -0
  22. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/sphinx_examples_as_code.egg-info/scm_file_list.json +0 -0
  23. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/sphinx_examples_as_code.egg-info/top_level.txt +0 -0
  24. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/gallery_fixture/conf.py +0 -0
  25. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/gallery_fixture/examples/GALLERY_HEADER.rst +0 -0
  26. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/gallery_fixture/examples/plot_minimal.py +0 -0
  27. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/gallery_fixture/index.rst +0 -0
  28. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/heading_level_fixture/conf.py +0 -0
  29. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/heading_level_fixture/examples/GALLERY_HEADER.rst +0 -0
  30. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/heading_level_fixture/examples/plot_reused_level.py +0 -0
  31. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/heading_level_fixture/examples/plot_three_levels.py +0 -0
  32. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/heading_level_fixture/index.rst +0 -0
  33. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/single_function_fixture/conf.py +0 -0
  34. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/single_function_fixture/index.rst +0 -0
  35. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/single_function_fixture/mymodule.py +0 -0
  36. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/test_heading_level_reuse.py +0 -0
  37. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/tinypages/conf.py +0 -0
  38. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/tinypages/docstring_cases.py +0 -0
  39. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/tinypages/docstring_cases.rst +0 -0
  40. {sphinx_examples_as_code-0.8.0 → sphinx_examples_as_code-0.8.1}/tests/tinypages/index.rst +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sphinx-examples-as-code
3
- Version: 0.8.0
3
+ Version: 0.8.1
4
4
  Summary: Sphinx extension for converting docstring examples into downloadable code.
5
5
  Author-email: The PyVista Developers <info@pyvista.org>
6
6
  License-Expression: MIT
@@ -96,7 +96,7 @@ sphinx_examples_as_code_conf = {
96
96
  (default) or `'bottom'`.
97
97
  - `formats`: which downloads to generate. A list containing any of `'python'` (a plain
98
98
  Python script, `<name>.py`), `'jupyter'` (a Jupyter notebook, `<name>.ipynb`) and
99
- `'marimo'` (a marimo notebook, `<name>.marimo.py`); defaults to all three. Always
99
+ `'marimo'` (a marimo notebook, `<name>_marimo.py`); defaults to all three. Always
100
100
  offered in that order regardless of how the list is written. Without marimo 0.14 or
101
101
  newer installed, the default skips the marimo download, and a `formats` that names
102
102
  `'marimo'` (in `conf.py` or through `-D`) stops the build with a configuration error. An unknown format raises a configuration error too;
@@ -150,7 +150,7 @@ imports, plus any `dependencies` set for its format, and says how to run it:
150
150
  `"`, `$`, a backtick, `\`, `%` or a `!` not followed by `=` is single-quoted instead,
151
151
  which cmd does not understand.
152
152
  - marimo notebooks start with the same `# /// script` block, which also lists `marimo`,
153
- followed by `# Open this notebook with: uvx marimo edit --sandbox <name>.marimo.py`.
153
+ followed by `# Open this notebook with: uvx marimo edit --sandbox <name>_marimo.py`.
154
154
  - Each run command is followed by a line linking to
155
155
  [uv's installation guide](https://docs.astral.sh/uv/getting-started/installation/).
156
156
 
@@ -221,7 +221,7 @@ cells instead.
221
221
 
222
222
  Generated marimo notebooks are that same Jupyter notebook converted by marimo's own
223
223
  converter, the one behind `marimo convert`. `from __future__` imports are dropped first,
224
- so the notebook also runs as a plain script (`python <name>.marimo.py`).
224
+ so the notebook also runs as a plain script (`python <name>_marimo.py`).
225
225
 
226
226
  A download link is only added if the resulting code contains at least one real
227
227
  executable statement.
@@ -64,7 +64,7 @@ sphinx_examples_as_code_conf = {
64
64
  (default) or `'bottom'`.
65
65
  - `formats`: which downloads to generate. A list containing any of `'python'` (a plain
66
66
  Python script, `<name>.py`), `'jupyter'` (a Jupyter notebook, `<name>.ipynb`) and
67
- `'marimo'` (a marimo notebook, `<name>.marimo.py`); defaults to all three. Always
67
+ `'marimo'` (a marimo notebook, `<name>_marimo.py`); defaults to all three. Always
68
68
  offered in that order regardless of how the list is written. Without marimo 0.14 or
69
69
  newer installed, the default skips the marimo download, and a `formats` that names
70
70
  `'marimo'` (in `conf.py` or through `-D`) stops the build with a configuration error. An unknown format raises a configuration error too;
@@ -118,7 +118,7 @@ imports, plus any `dependencies` set for its format, and says how to run it:
118
118
  `"`, `$`, a backtick, `\`, `%` or a `!` not followed by `=` is single-quoted instead,
119
119
  which cmd does not understand.
120
120
  - marimo notebooks start with the same `# /// script` block, which also lists `marimo`,
121
- followed by `# Open this notebook with: uvx marimo edit --sandbox <name>.marimo.py`.
121
+ followed by `# Open this notebook with: uvx marimo edit --sandbox <name>_marimo.py`.
122
122
  - Each run command is followed by a line linking to
123
123
  [uv's installation guide](https://docs.astral.sh/uv/getting-started/installation/).
124
124
 
@@ -189,7 +189,7 @@ cells instead.
189
189
 
190
190
  Generated marimo notebooks are that same Jupyter notebook converted by marimo's own
191
191
  converter, the one behind `marimo convert`. `from __future__` imports are dropped first,
192
- so the notebook also runs as a plain script (`python <name>.marimo.py`).
192
+ so the notebook also runs as a plain script (`python <name>_marimo.py`).
193
193
 
194
194
  A download link is only added if the resulting code contains at least one real
195
195
  executable statement.
@@ -181,6 +181,9 @@ _FMT_PYTHON = 'python'
181
181
  _FMT_JUPYTER = 'jupyter'
182
182
  _FMT_MARIMO = 'marimo'
183
183
 
184
+ #: File name suffix of each download format, e.g. ``pyvista_read_marimo.py``.
185
+ _SUFFIXES = {_FMT_PYTHON: '.py', _FMT_JUPYTER: '.ipynb', _FMT_MARIMO: '_marimo.py'}
186
+
184
187
 
185
188
  @dataclass(frozen=True)
186
189
  class _RenderContext:
@@ -931,13 +934,13 @@ def _build_notebook(cells: list[tuple[str, list[str]]]) -> dict:
931
934
  }
932
935
 
933
936
 
934
- def _download_filename(name: str, extension: str) -> str:
937
+ def _download_filename(name: str, fmt: str) -> str:
935
938
  """Return the file name a download is written under, e.g. ``pyvista_read.py``."""
936
939
  safe_name = name.replace('.', '_') if name else 'example'
937
- return f'{safe_name}.{extension}'
940
+ return f'{safe_name}{_SUFFIXES[fmt]}'
938
941
 
939
942
 
940
- def _write_download_file(app: Sphinx, name: str, extension: str, content: str) -> str:
943
+ def _write_download_file(app: Sphinx, name: str, fmt: str, content: str) -> str:
941
944
  """Write generated content directly into the builder's downloads dir.
942
945
 
943
946
  Returns the written file's path relative to the downloads directory --
@@ -948,7 +951,7 @@ def _write_download_file(app: Sphinx, name: str, extension: str, content: str) -
948
951
  """
949
952
  # 32 hex chars, matching Sphinx's own native _downloads/<digest>/... layout.
950
953
  digest = hashlib.sha256(content.encode()).hexdigest()[:32]
951
- filename = _download_filename(name, extension)
954
+ filename = _download_filename(name, fmt)
952
955
  rel_path = f'{digest}/{filename}'
953
956
 
954
957
  out_path = Path(app.outdir) / '_downloads' / digest / filename
@@ -959,12 +962,12 @@ def _write_download_file(app: Sphinx, name: str, extension: str, content: str) -
959
962
 
960
963
  def _write_python_script(app: Sphinx, name: str, source: str) -> str:
961
964
  """Write a generated Python script; see ``_write_download_file``."""
962
- return _write_download_file(app, name, 'py', source)
965
+ return _write_download_file(app, name, _FMT_PYTHON, source)
963
966
 
964
967
 
965
968
  def _write_jupyter_notebook(app: Sphinx, name: str, notebook: dict) -> str:
966
969
  """Write a generated Jupyter notebook; see ``_write_download_file``."""
967
- return _write_download_file(app, name, 'ipynb', json.dumps(notebook, indent=1))
970
+ return _write_download_file(app, name, _FMT_JUPYTER, json.dumps(notebook, indent=1))
968
971
 
969
972
 
970
973
  def _drop_future_imports(source: list[str]) -> list[str]:
@@ -995,7 +998,7 @@ def _write_marimo_notebook(app: Sphinx, name: str, notebook: dict, header: str =
995
998
  for cell in notebook['cells']
996
999
  ]
997
1000
  source = MarimoConvert.from_ipynb(json.dumps({**notebook, 'cells': cells})).to_py()
998
- return _write_download_file(app, name, 'marimo.py', header + source)
1001
+ return _write_download_file(app, name, _FMT_MARIMO, header + source)
999
1002
 
1000
1003
 
1001
1004
  @functools.cache
@@ -1304,18 +1307,16 @@ def _build_download_entries(
1304
1307
  if fmt not in formats:
1305
1308
  continue
1306
1309
  label = link_labels[fmt]
1310
+ filename = _download_filename(name, fmt)
1307
1311
  if fmt == _FMT_PYTHON:
1308
- filename = _download_filename(name, 'py')
1309
1312
  header = header_for(fmt, f'Run this script with: uv run {filename}')
1310
1313
  rel_path = _write_python_script(app, name, header + source)
1311
1314
  elif fmt == _FMT_JUPYTER:
1312
- filename = _download_filename(name, 'ipynb')
1313
1315
  run_line = (
1314
1316
  _jupyter_run_line(deps[fmt], requires_python_for(fmt), filename) if deps else None
1315
1317
  )
1316
1318
  rel_path = _write_jupyter_notebook(app, name, notebook_for(run_line))
1317
1319
  else:
1318
- filename = _download_filename(name, 'marimo.py')
1319
1320
  run_line = f'Open this notebook with: uvx marimo edit --sandbox {filename}'
1320
1321
  rel_path = _write_marimo_notebook(
1321
1322
  app, name, notebook_for(None), header_for(fmt, run_line)
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.8.0'
22
- __version_tuple__ = version_tuple = (0, 8, 0)
21
+ __version__ = version = '0.8.1'
22
+ __version_tuple__ = version_tuple = (0, 8, 1)
23
23
 
24
- __commit_id__ = commit_id = 'g35e7c7f07'
24
+ __commit_id__ = commit_id = 'g6e63b87fa'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sphinx-examples-as-code
3
- Version: 0.8.0
3
+ Version: 0.8.1
4
4
  Summary: Sphinx extension for converting docstring examples into downloadable code.
5
5
  Author-email: The PyVista Developers <info@pyvista.org>
6
6
  License-Expression: MIT
@@ -96,7 +96,7 @@ sphinx_examples_as_code_conf = {
96
96
  (default) or `'bottom'`.
97
97
  - `formats`: which downloads to generate. A list containing any of `'python'` (a plain
98
98
  Python script, `<name>.py`), `'jupyter'` (a Jupyter notebook, `<name>.ipynb`) and
99
- `'marimo'` (a marimo notebook, `<name>.marimo.py`); defaults to all three. Always
99
+ `'marimo'` (a marimo notebook, `<name>_marimo.py`); defaults to all three. Always
100
100
  offered in that order regardless of how the list is written. Without marimo 0.14 or
101
101
  newer installed, the default skips the marimo download, and a `formats` that names
102
102
  `'marimo'` (in `conf.py` or through `-D`) stops the build with a configuration error. An unknown format raises a configuration error too;
@@ -150,7 +150,7 @@ imports, plus any `dependencies` set for its format, and says how to run it:
150
150
  `"`, `$`, a backtick, `\`, `%` or a `!` not followed by `=` is single-quoted instead,
151
151
  which cmd does not understand.
152
152
  - marimo notebooks start with the same `# /// script` block, which also lists `marimo`,
153
- followed by `# Open this notebook with: uvx marimo edit --sandbox <name>.marimo.py`.
153
+ followed by `# Open this notebook with: uvx marimo edit --sandbox <name>_marimo.py`.
154
154
  - Each run command is followed by a line linking to
155
155
  [uv's installation guide](https://docs.astral.sh/uv/getting-started/installation/).
156
156
 
@@ -221,7 +221,7 @@ cells instead.
221
221
 
222
222
  Generated marimo notebooks are that same Jupyter notebook converted by marimo's own
223
223
  converter, the one behind `marimo convert`. `from __future__` imports are dropped first,
224
- so the notebook also runs as a plain script (`python <name>.marimo.py`).
224
+ so the notebook also runs as a plain script (`python <name>_marimo.py`).
225
225
 
226
226
  A download link is only added if the resulting code contains at least one real
227
227
  executable statement.
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.8.0",
2
+ "tag": "0.8.1",
3
3
  "distance": 0,
4
- "node": "g35e7c7f071baf732904a6fad8b7ea7a63f03d1f2",
4
+ "node": "g6e63b87faff4aa6f3530f1bbe7a85fad508570f9",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-11-01"
@@ -275,7 +275,7 @@ def test_gallery_downloads_generated_python_executes(gallery_build: tuple[Path,
275
275
  def test_gallery_downloads_marimo_notebook_executes(gallery_build: tuple[Path, str]):
276
276
  """The marimo notebook holds the page's code and runs as a plain script."""
277
277
  html_dir, _html = gallery_build
278
- (marimo_path,) = (html_dir / '_downloads').rglob('*.marimo.py')
278
+ (marimo_path,) = (html_dir / '_downloads').rglob('*_marimo.py')
279
279
  src = marimo_path.read_text(encoding='utf-8')
280
280
  assert 'app = marimo.App(' in src
281
281
  assert 'A minimal gallery example' in src
@@ -29,7 +29,7 @@ def test_download_named_after_the_function_not_the_docname(tmp_path: Path):
29
29
  assert returncode == 0, f'sphinx build failed with stdout:\n{out}\nstderr:\n{err}\n'
30
30
 
31
31
  downloads_dir = html_dir / '_downloads'
32
- python_files = [p for p in downloads_dir.rglob('*.py') if not p.name.endswith('.marimo.py')]
32
+ python_files = [p for p in downloads_dir.rglob('*.py') if not p.name.endswith('_marimo.py')]
33
33
  assert len(python_files) == 1, f'expected exactly one generated .py, got {python_files}'
34
34
  python_path = python_files[0]
35
35
 
@@ -1856,8 +1856,8 @@ def test_process_span_footer_in_notebook_is_linkified(tmp_path: Path):
1856
1856
  (['jupyter'], ['.ipynb']),
1857
1857
  (['python', 'jupyter'], ['.py', '.ipynb']),
1858
1858
  (['jupyter', 'python'], ['.py', '.ipynb']), # canonical order regardless of config order
1859
- (['marimo'], ['.marimo.py']),
1860
- (['marimo', 'python', 'jupyter'], ['.py', '.ipynb', '.marimo.py']),
1859
+ (['marimo'], ['_marimo.py']),
1860
+ (['marimo', 'python', 'jupyter'], ['.py', '.ipynb', '_marimo.py']),
1861
1861
  ([], []),
1862
1862
  ],
1863
1863
  )
@@ -92,7 +92,7 @@ def built(tmp_path_factory) -> tuple[Path, list[Path]]:
92
92
  assert returncode == 0, f'sphinx build failed with stdout:\n{out}\nstderr:\n{err}\n'
93
93
 
94
94
  downloads_dir = html_dir / '_downloads'
95
- examples = sorted(p for p in downloads_dir.rglob('*.py') if not p.name.endswith('.marimo.py'))
95
+ examples = sorted(p for p in downloads_dir.rglob('*.py') if not p.name.endswith('_marimo.py'))
96
96
  return html_dir, examples
97
97
 
98
98
 
@@ -494,7 +494,7 @@ def test_formats_config_selection(
494
494
  assert returncode == 0, f'sphinx build failed with stdout:\n{out}\nstderr:\n{err}\n'
495
495
 
496
496
  downloads_dir = html_dir / '_downloads'
497
- marimo_files = list(downloads_dir.rglob('*.marimo.py'))
497
+ marimo_files = list(downloads_dir.rglob('*_marimo.py'))
498
498
  python_files = [p for p in downloads_dir.rglob('*.py') if p not in marimo_files]
499
499
  jupyter_files = list(downloads_dir.rglob('*.ipynb'))
500
500
 
@@ -553,7 +553,7 @@ def test_base_url_set_resolves_links(tmp_path: Path):
553
553
  assert returncode == 0, f'sphinx build failed with stdout:\n{out}\nstderr:\n{err}\n'
554
554
 
555
555
  downloads_dir = html_dir / '_downloads'
556
- python_files = [p for p in downloads_dir.rglob('*.py') if not p.name.endswith('.marimo.py')]
556
+ python_files = [p for p in downloads_dir.rglob('*.py') if not p.name.endswith('_marimo.py')]
557
557
  jupyter_files = list(downloads_dir.rglob('*.ipynb'))
558
558
 
559
559
  # a regular reference: link resolved in .ipynb, omitted in .py