structured-tutorials 0.2.0__tar.gz → 0.3.0__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 (169) hide show
  1. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/.github/workflows/tests.yml +3 -1
  2. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/.readthedocs.yaml +1 -1
  3. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/PKG-INFO +2 -2
  4. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/changelog.rst +14 -0
  5. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/conf.py +6 -2
  6. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/spelling_wordlist.txt +1 -0
  7. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/class_index.html +65 -65
  8. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/function_index.html +82 -82
  9. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/index.html +29 -29
  10. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/status.json +1 -1
  11. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_0ce4b8b40d14c0ec_base_py.html +60 -57
  12. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_0ce4b8b40d14c0ec_parts_py.html +152 -148
  13. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_0ce4b8b40d14c0ec_tests_py.html +2 -2
  14. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_0ce4b8b40d14c0ec_tutorial_py.html +97 -91
  15. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_0ce4b8b40d14c0ec_validators_py.html +3 -3
  16. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_10746939a1c77e4c___init___py.html +2 -2
  17. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_10746939a1c77e4c_directives_py.html +2 -2
  18. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_10746939a1c77e4c_utils_py.html +145 -141
  19. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_1b8c1a89abcc896b_base_py.html +138 -126
  20. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_1b8c1a89abcc896b_local_py.html +207 -197
  21. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_3b10c79445bd681b_cli_py.html +2 -2
  22. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_3b10c79445bd681b_output_py.html +2 -2
  23. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_3b10c79445bd681b_textwrap_py.html +2 -2
  24. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_3b10c79445bd681b_utils_py.html +32 -27
  25. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/pyproject.toml +7 -5
  26. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/models/base.py +4 -1
  27. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/models/parts.py +8 -4
  28. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/models/tutorial.py +6 -0
  29. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/runners/base.py +15 -3
  30. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/runners/local.py +13 -3
  31. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/sphinx/utils.py +4 -0
  32. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/utils.py +5 -0
  33. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/conftest.py +12 -0
  34. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/command-as-list.yaml +3 -0
  35. structured_tutorials-0.3.0/tests/data/tutorials/command-clear-environment-globally.yaml +27 -0
  36. structured_tutorials-0.3.0/tests/data/tutorials/command-clear-single-environment-variable.yaml +7 -0
  37. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/command-hide-output.yaml +3 -0
  38. structured_tutorials-0.3.0/tests/data/tutorials/command-skip-single-command.rst +4 -0
  39. structured_tutorials-0.3.0/tests/data/tutorials/command-skip-single-command.yaml +9 -0
  40. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/command-test-output.yaml +3 -0
  41. structured_tutorials-0.3.0/tests/data/tutorials/command-with-chdir-template.yaml +9 -0
  42. structured_tutorials-0.3.0/tests/runners/local/commands/__init__.py +2 -0
  43. structured_tutorials-0.3.0/tests/runners/local/commands/test_environment.py +84 -0
  44. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/runners/local/test_command.py +25 -23
  45. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/sphinx/test_wrapper.py +6 -0
  46. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/uv.lock +170 -126
  47. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/.editorconfig +0 -0
  48. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/.github/workflows/docs.yml +0 -0
  49. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/.github/workflows/mypy.yml +0 -0
  50. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/.github/workflows/quality.yml +0 -0
  51. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/.github/workflows/wheel.yml +0 -0
  52. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/.gitignore +0 -0
  53. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/LICENSE +0 -0
  54. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/README.md +0 -0
  55. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/Makefile +0 -0
  56. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/_static/.gitkeep +0 -0
  57. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/dev.rst +0 -0
  58. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/how-tos.rst +0 -0
  59. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/include/quickstart-more-features.rst +0 -0
  60. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/include/quickstart.rst +0 -0
  61. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/index.rst +0 -0
  62. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/make.bat +0 -0
  63. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/quickstart.rst +0 -0
  64. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/reference.rst +0 -0
  65. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/alternatives/tutorial.yaml +0 -0
  66. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/cleanup/tutorial.yaml +0 -0
  67. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/cleanup-multiple/tutorial.yaml +0 -0
  68. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/command-as-list/tutorial.yaml +0 -0
  69. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/context/tutorial.yaml +0 -0
  70. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/default-context/tutorial.yaml +0 -0
  71. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/doc-or-runtime/tutorial.yaml +0 -0
  72. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/echo/tutorial.yaml +0 -0
  73. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/exit_code/tutorial.yaml +0 -0
  74. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/file/tutorial.yaml +0 -0
  75. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/file-copy/tutorial.yaml +0 -0
  76. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/file-full-example/tutorial.yaml +0 -0
  77. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/git-export/tutorial.yaml +0 -0
  78. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/interactive-prompt/tutorial.yaml +0 -0
  79. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/long-commands/tutorial.yaml +0 -0
  80. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/prompt/tutorial.yaml +0 -0
  81. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/quickstart/tutorial.yaml +0 -0
  82. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/skip-part-doc/tutorial.yaml +0 -0
  83. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/skip-part-run/tutorial.yaml +0 -0
  84. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/templates/tutorial.yaml +0 -0
  85. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/temporary-directory/tutorial.yaml +0 -0
  86. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/test-command/tutorial.yaml +0 -0
  87. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/test-output/tutorial.yaml +0 -0
  88. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/docs/tutorials/test-port/tutorial.yaml +0 -0
  89. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/fetch_swagger.sh +0 -0
  90. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/generate-schema.py +0 -0
  91. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/.gitignore +0 -0
  92. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/coverage_html_cb_6fb7b396.js +0 -0
  93. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/coverage_html_cb_bcae5fc4.js +0 -0
  94. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/favicon_32_cb_58284776.png +0 -0
  95. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/keybd_closed_cb_ce680311.png +0 -0
  96. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/style_cb_6b508a39.css +0 -0
  97. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/style_cb_8432e98f.css +0 -0
  98. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/style_cb_8e611ae1.css +0 -0
  99. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/style_cb_a5a05ca4.css +0 -0
  100. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_0ce4b8b40d14c0ec___init___py.html +0 -0
  101. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_10746939a1c77e4c_textwrap_py.html +0 -0
  102. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_1b8c1a89abcc896b___init___py.html +0 -0
  103. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_3b10c79445bd681b___init___py.html +0 -0
  104. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_3b10c79445bd681b_errors_py.html +0 -0
  105. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_3b10c79445bd681b_models_py.html +0 -0
  106. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_3b10c79445bd681b_tutorial_py.html +0 -0
  107. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/htmlcov/z_3b10c79445bd681b_typing_py.html +0 -0
  108. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/__init__.py +0 -0
  109. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/cli.py +0 -0
  110. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/errors.py +0 -0
  111. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/models/__init__.py +0 -0
  112. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/models/tests.py +0 -0
  113. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/models/validators.py +0 -0
  114. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/output.py +0 -0
  115. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/runners/__init__.py +0 -0
  116. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/sphinx/__init__.py +0 -0
  117. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/sphinx/directives.py +0 -0
  118. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/templates/alternative_part.rst.template +0 -0
  119. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/templates/commands_part.rst.template +0 -0
  120. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/templates/file_part.rst.template +0 -0
  121. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/textwrap.py +0 -0
  122. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/structured_tutorials/typing.py +0 -0
  123. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/__init__.py +0 -0
  124. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/docs/conf.py +0 -0
  125. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/docs/index.rst +0 -0
  126. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/docs/variable_defined_in_config.rst +0 -0
  127. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/alternatives-files.yaml +0 -0
  128. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/alternatives-text.yaml +0 -0
  129. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/alternatives.yaml +0 -0
  130. /structured_tutorials-0.2.0/tests/data/tutorials/command-simple-env.yaml → /structured_tutorials-0.3.0/tests/data/tutorials/command-env-variable-for-single-command.yaml +0 -0
  131. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/command-simple.yaml +0 -0
  132. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/command-stdin.yaml +0 -0
  133. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/command-test-output-count.yaml +0 -0
  134. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/command-text.yaml +0 -0
  135. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/command-undefined-variable.yaml +0 -0
  136. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/command-with-chdir.yaml +0 -0
  137. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/empty.yaml +0 -0
  138. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/file-contents-destination-dir.yaml +0 -0
  139. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/file-contents-exists.yaml +0 -0
  140. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/file-contents-text.yaml +0 -0
  141. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/file-copy-destination-dir.yaml +0 -0
  142. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/file_contents.txt +0 -0
  143. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/invalid-model.yaml +0 -0
  144. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/invalid-yaml.yaml +0 -0
  145. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/multiple-parts.yaml +0 -0
  146. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/named-part.yaml +0 -0
  147. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/prompt-confirm-default-false.yaml +0 -0
  148. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/prompt-confirm-error-template.yaml +0 -0
  149. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/prompt-confirm.yaml +0 -0
  150. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/prompt-enter.yaml +0 -0
  151. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/simple.yaml +0 -0
  152. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/data/tutorials/templates.yaml +0 -0
  153. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/runners/__init__.py +0 -0
  154. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/runners/local/__init__.py +0 -0
  155. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/runners/local/conftest.py +0 -0
  156. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/runners/local/test_alternatives.py +0 -0
  157. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/runners/local/test_file.py +0 -0
  158. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/runners/local/test_local.py +0 -0
  159. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/runners/local/test_prompt.py +0 -0
  160. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/runners/test_base.py +0 -0
  161. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/sphinx/__init__.py +0 -0
  162. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/sphinx/test_app.py +0 -0
  163. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/sphinx/test_build.py +0 -0
  164. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/sphinx/test_get_tutorial_path.py +0 -0
  165. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/test_cli.py +0 -0
  166. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/test_models.py +0 -0
  167. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/test_textwrap.py +0 -0
  168. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tests/test_utils.py +0 -0
  169. {structured_tutorials-0.2.0 → structured_tutorials-0.3.0}/tutorials/simple/simple.yaml +0 -0
@@ -14,10 +14,12 @@ jobs:
14
14
  matrix:
15
15
  os: [ ubuntu-latest ]
16
16
  python-version: [ "3.10", "3.11", "3.12", "3.13", "3.14" ]
17
- sphinx-version: [ "8.1", "8.2" ]
17
+ sphinx-version: [ "8.1", "8.2", "9.0" ]
18
18
  exclude:
19
19
  - python-version: "3.10"
20
20
  sphinx-version: "8.2"
21
+ - python-version: "3.10"
22
+ sphinx-version: "9.0"
21
23
 
22
24
  name: Python ${{ matrix.python-version }}, Sphinx ${{ matrix.sphinx-version }}
23
25
  steps:
@@ -21,7 +21,7 @@ build:
21
21
  - asdf install uv 0.9.2
22
22
  - asdf global uv 0.9.2
23
23
  install:
24
- - uv sync
24
+ - uv sync --group dev --group rtd
25
25
  pre_build:
26
26
  - ./fetch_swagger.sh
27
27
  - uv run generate-schema.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: structured-tutorials
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: Add your description here
5
5
  Project-URL: Homepage, https://structured-tutorials.readthedocs.io/
6
6
  Project-URL: Documentation, https://structured-tutorials.readthedocs.io/
@@ -27,7 +27,7 @@ Requires-Dist: jinja2>=3.1.6
27
27
  Requires-Dist: pydantic>=2.11.4
28
28
  Requires-Dist: pyyaml>=6.0.2
29
29
  Requires-Dist: sphinx-inline-tabs>=2025
30
- Requires-Dist: sphinx>=8.2.0; python_version >= '3.11'
30
+ Requires-Dist: sphinx>=8.1.0; python_version >= '3.11'
31
31
  Requires-Dist: sphinx~=8.1.0; python_version < '3.11'
32
32
  Requires-Dist: termcolor>=3.2.0
33
33
  Requires-Dist: typing-extensions>=4.6.0; python_version < '3.11'
@@ -2,6 +2,20 @@
2
2
  ChangeLog
3
3
  #########
4
4
 
5
+ ******************
6
+ 0.3.0 (2025-12-26)
7
+ ******************
8
+
9
+ * Add support for Sphinx 9.0.
10
+ * Tutorials can now be configured to pass a clear environment to all processes.
11
+ * Tutorials can now configure additional environment variables passed to all processes.
12
+ * Single commands can now update the environment for all subsequent commands. Values are rendered as
13
+ templates, so you can add (parts of) the output of a command to the environment by combining a test for
14
+ the command output that uses a named pattern in a regular expression for the output.
15
+ * ``parts.{commands}.{command}.run.{chdir}`` is now a template. This allows you to change the directory based
16
+ on the output of a previous command.
17
+ * Bugfix: Individual commands marked as skipped for documentation, are now actually skipped.
18
+
5
19
  ******************
6
20
  0.2.0 (2025-12-23)
7
21
  ******************
@@ -1,5 +1,7 @@
1
1
  """Standard Sphinx configuration module."""
2
2
 
3
+ from importlib.util import find_spec
4
+
3
5
  # Configuration file for the Sphinx documentation builder.
4
6
  #
5
7
  # For the full list of built-in configuration values, see the documentation:
@@ -18,12 +20,14 @@ release = "0.1.0"
18
20
  # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
19
21
 
20
22
  extensions = [
21
- "sphinx_rtd_theme",
22
23
  "sphinxcontrib.spelling",
23
24
  "structured_tutorials.sphinx",
24
25
  "sphinx_inline_tabs",
25
26
  ]
26
- html_theme = "sphinx_rtd_theme"
27
+
28
+ if find_spec("sphinx_rtd_theme") is not None:
29
+ extensions.append("sphinx_rtd_theme")
30
+ html_theme = "sphinx_rtd_theme"
27
31
 
28
32
  DOC_ROOT = Path(__file__).parent
29
33
  structured_tutorials_root = DOC_ROOT / "tutorials"
@@ -7,3 +7,4 @@ hostname
7
7
  cwd
8
8
  backend
9
9
  reStructuredText
10
+ bugfix
@@ -57,7 +57,7 @@
57
57
  </h2>
58
58
  <p class="text">
59
59
  <a class="nav" href="https://coverage.readthedocs.io/en/7.13.0">coverage.py v7.13.0</a>,
60
- created at 2025-12-23 20:24 +0100
60
+ created at 2025-12-26 12:41 +0100
61
61
  </p>
62
62
  </div>
63
63
  </header>
@@ -317,8 +317,8 @@
317
317
  <td data-ratio="0 0">100%</td>
318
318
  </tr>
319
319
  <tr class="region">
320
- <td class="name"><a href="z_0ce4b8b40d14c0ec_base_py.html#t55">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;base.py</a></td>
321
- <td class="name"><a href="z_0ce4b8b40d14c0ec_base_py.html#t55"><data value='TestSpecificationMixin'>TestSpecificationMixin</data></a></td>
320
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_base_py.html#t58">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;base.py</a></td>
321
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_base_py.html#t58"><data value='TestSpecificationMixin'>TestSpecificationMixin</data></a></td>
322
322
  <td class="spacer">&nbsp;</td>
323
323
  <td data-ratio="0 0">100%</td>
324
324
  <td>0</td>
@@ -332,8 +332,8 @@
332
332
  <td data-ratio="0 0">100%</td>
333
333
  </tr>
334
334
  <tr class="region">
335
- <td class="name"><a href="z_0ce4b8b40d14c0ec_base_py.html#t63">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;base.py</a></td>
336
- <td class="name"><a href="z_0ce4b8b40d14c0ec_base_py.html#t63"><data value='ConfigurationMixin'>ConfigurationMixin</data></a></td>
335
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_base_py.html#t66">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;base.py</a></td>
336
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_base_py.html#t66"><data value='ConfigurationMixin'>ConfigurationMixin</data></a></td>
337
337
  <td class="spacer">&nbsp;</td>
338
338
  <td data-ratio="0 0">100%</td>
339
339
  <td>0</td>
@@ -347,8 +347,8 @@
347
347
  <td data-ratio="0 0">100%</td>
348
348
  </tr>
349
349
  <tr class="region">
350
- <td class="name"><a href="z_0ce4b8b40d14c0ec_base_py.html#t70">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;base.py</a></td>
351
- <td class="name"><a href="z_0ce4b8b40d14c0ec_base_py.html#t70"><data value='DocumentationConfigurationMixin'>DocumentationConfigurationMixin</data></a></td>
350
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_base_py.html#t73">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;base.py</a></td>
351
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_base_py.html#t73"><data value='DocumentationConfigurationMixin'>DocumentationConfigurationMixin</data></a></td>
352
352
  <td class="spacer">&nbsp;</td>
353
353
  <td data-ratio="0 0">100%</td>
354
354
  <td>0</td>
@@ -362,8 +362,8 @@
362
362
  <td data-ratio="0 0">100%</td>
363
363
  </tr>
364
364
  <tr class="region">
365
- <td class="name"><a href="z_0ce4b8b40d14c0ec_base_py.html#t77">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;base.py</a></td>
366
- <td class="name"><a href="z_0ce4b8b40d14c0ec_base_py.html#t77"><data value='FileMixin'>FileMixin</data></a></td>
365
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_base_py.html#t80">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;base.py</a></td>
366
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_base_py.html#t80"><data value='FileMixin'>FileMixin</data></a></td>
367
367
  <td class="spacer">&nbsp;</td>
368
368
  <td data-ratio="8 8">100%</td>
369
369
  <td>8</td>
@@ -380,8 +380,8 @@
380
380
  <td class="name"><a href="z_0ce4b8b40d14c0ec_base_py.html">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;base.py</a></td>
381
381
  <td class="name"><a href="z_0ce4b8b40d14c0ec_base_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
382
382
  <td class="spacer">&nbsp;</td>
383
- <td data-ratio="38 38">100%</td>
384
- <td>38</td>
383
+ <td data-ratio="39 39">100%</td>
384
+ <td>39</td>
385
385
  <td>0</td>
386
386
  <td>0</td>
387
387
  <td class="spacer">&nbsp;</td>
@@ -389,7 +389,7 @@
389
389
  <td>0</td>
390
390
  <td>0</td>
391
391
  <td class="spacer">&nbsp;</td>
392
- <td data-ratio="38 38">100%</td>
392
+ <td data-ratio="39 39">100%</td>
393
393
  </tr>
394
394
  <tr class="region">
395
395
  <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t44">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
@@ -452,8 +452,8 @@
452
452
  <td data-ratio="0 0">100%</td>
453
453
  </tr>
454
454
  <tr class="region">
455
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t76">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
456
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t76"><data value='CommandDocumentationConfigurationModel'>CommandDocumentationConfigurationModel</data></a></td>
455
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t80">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
456
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t80"><data value='CommandDocumentationConfigurationModel'>CommandDocumentationConfigurationModel</data></a></td>
457
457
  <td class="spacer">&nbsp;</td>
458
458
  <td data-ratio="0 0">100%</td>
459
459
  <td>0</td>
@@ -467,8 +467,8 @@
467
467
  <td data-ratio="0 0">100%</td>
468
468
  </tr>
469
469
  <tr class="region">
470
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t84">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
471
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t84"><data value='CommandModel'>CommandModel</data></a></td>
470
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t88">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
471
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t88"><data value='CommandModel'>CommandModel</data></a></td>
472
472
  <td class="spacer">&nbsp;</td>
473
473
  <td data-ratio="0 0">100%</td>
474
474
  <td>0</td>
@@ -482,8 +482,8 @@
482
482
  <td data-ratio="0 0">100%</td>
483
483
  </tr>
484
484
  <tr class="region">
485
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t98">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
486
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t98"><data value='CommandsRuntimeConfigurationModel'>CommandsRuntimeConfigurationModel</data></a></td>
485
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t102">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
486
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t102"><data value='CommandsRuntimeConfigurationModel'>CommandsRuntimeConfigurationModel</data></a></td>
487
487
  <td class="spacer">&nbsp;</td>
488
488
  <td data-ratio="0 0">100%</td>
489
489
  <td>0</td>
@@ -497,8 +497,8 @@
497
497
  <td data-ratio="0 0">100%</td>
498
498
  </tr>
499
499
  <tr class="region">
500
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t104">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
501
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t104"><data value='CommandsDocumentationConfigurationModel'>CommandsDocumentationConfigurationModel</data></a></td>
500
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t108">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
501
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t108"><data value='CommandsDocumentationConfigurationModel'>CommandsDocumentationConfigurationModel</data></a></td>
502
502
  <td class="spacer">&nbsp;</td>
503
503
  <td data-ratio="0 0">100%</td>
504
504
  <td>0</td>
@@ -512,8 +512,8 @@
512
512
  <td data-ratio="0 0">100%</td>
513
513
  </tr>
514
514
  <tr class="region">
515
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t110">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
516
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t110"><data value='CommandsPartModel'>CommandsPartModel</data></a></td>
515
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t114">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
516
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t114"><data value='CommandsPartModel'>CommandsPartModel</data></a></td>
517
517
  <td class="spacer">&nbsp;</td>
518
518
  <td data-ratio="0 0">100%</td>
519
519
  <td>0</td>
@@ -527,8 +527,8 @@
527
527
  <td data-ratio="0 0">100%</td>
528
528
  </tr>
529
529
  <tr class="region">
530
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t122">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
531
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t122"><data value='FileRuntimeConfigurationModel'>FileRuntimeConfigurationModel</data></a></td>
530
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t126">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
531
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t126"><data value='FileRuntimeConfigurationModel'>FileRuntimeConfigurationModel</data></a></td>
532
532
  <td class="spacer">&nbsp;</td>
533
533
  <td data-ratio="0 0">100%</td>
534
534
  <td>0</td>
@@ -542,8 +542,8 @@
542
542
  <td data-ratio="0 0">100%</td>
543
543
  </tr>
544
544
  <tr class="region">
545
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t128">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
546
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t128"><data value='FileDocumentationConfigurationModel'>FileDocumentationConfigurationModel</data></a></td>
545
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t132">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
546
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t132"><data value='FileDocumentationConfigurationModel'>FileDocumentationConfigurationModel</data></a></td>
547
547
  <td class="spacer">&nbsp;</td>
548
548
  <td data-ratio="0 0">100%</td>
549
549
  <td>0</td>
@@ -557,8 +557,8 @@
557
557
  <td data-ratio="0 0">100%</td>
558
558
  </tr>
559
559
  <tr class="region">
560
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t154">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
561
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t154"><data value='FilePartModel'>FilePartModel</data></a></td>
560
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t158">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
561
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t158"><data value='FilePartModel'>FilePartModel</data></a></td>
562
562
  <td class="spacer">&nbsp;</td>
563
563
  <td data-ratio="3 3">100%</td>
564
564
  <td>3</td>
@@ -572,8 +572,8 @@
572
572
  <td data-ratio="5 5">100%</td>
573
573
  </tr>
574
574
  <tr class="region">
575
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t179">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
576
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t179"><data value='PromptModel'>PromptModel</data></a></td>
575
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t183">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
576
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t183"><data value='PromptModel'>PromptModel</data></a></td>
577
577
  <td class="spacer">&nbsp;</td>
578
578
  <td data-ratio="0 0">100%</td>
579
579
  <td>0</td>
@@ -587,8 +587,8 @@
587
587
  <td data-ratio="0 0">100%</td>
588
588
  </tr>
589
589
  <tr class="region">
590
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t201">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
591
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t201"><data value='AlternativeRuntimeConfigurationModel'>AlternativeRuntimeConfigurationModel</data></a></td>
590
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t205">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
591
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t205"><data value='AlternativeRuntimeConfigurationModel'>AlternativeRuntimeConfigurationModel</data></a></td>
592
592
  <td class="spacer">&nbsp;</td>
593
593
  <td data-ratio="0 0">100%</td>
594
594
  <td>0</td>
@@ -602,8 +602,8 @@
602
602
  <td data-ratio="0 0">100%</td>
603
603
  </tr>
604
604
  <tr class="region">
605
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t207">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
606
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t207"><data value='AlternativeDocumentationConfigurationModel'>AlternativeDocumentationConfigurationModel</data></a></td>
605
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t211">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
606
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t211"><data value='AlternativeDocumentationConfigurationModel'>AlternativeDocumentationConfigurationModel</data></a></td>
607
607
  <td class="spacer">&nbsp;</td>
608
608
  <td data-ratio="0 0">100%</td>
609
609
  <td>0</td>
@@ -617,8 +617,8 @@
617
617
  <td data-ratio="0 0">100%</td>
618
618
  </tr>
619
619
  <tr class="region">
620
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t215">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
621
- <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t215"><data value='AlternativeModel'>AlternativeModel</data></a></td>
620
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t219">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;parts.py</a></td>
621
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_parts_py.html#t219"><data value='AlternativeModel'>AlternativeModel</data></a></td>
622
622
  <td class="spacer">&nbsp;</td>
623
623
  <td data-ratio="0 0">100%</td>
624
624
  <td>0</td>
@@ -737,8 +737,8 @@
737
737
  <td data-ratio="4 4">100%</td>
738
738
  </tr>
739
739
  <tr class="region">
740
- <td class="name"><a href="z_0ce4b8b40d14c0ec_tutorial_py.html#t69">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;tutorial.py</a></td>
741
- <td class="name"><a href="z_0ce4b8b40d14c0ec_tutorial_py.html#t69"><data value='ConfigurationModel'>ConfigurationModel</data></a></td>
740
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_tutorial_py.html#t75">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;tutorial.py</a></td>
741
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_tutorial_py.html#t75"><data value='ConfigurationModel'>ConfigurationModel</data></a></td>
742
742
  <td class="spacer">&nbsp;</td>
743
743
  <td data-ratio="0 0">100%</td>
744
744
  <td>0</td>
@@ -752,8 +752,8 @@
752
752
  <td data-ratio="0 0">100%</td>
753
753
  </tr>
754
754
  <tr class="region">
755
- <td class="name"><a href="z_0ce4b8b40d14c0ec_tutorial_py.html#t81">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;tutorial.py</a></td>
756
- <td class="name"><a href="z_0ce4b8b40d14c0ec_tutorial_py.html#t81"><data value='TutorialModel'>TutorialModel</data></a></td>
755
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_tutorial_py.html#t87">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;tutorial.py</a></td>
756
+ <td class="name"><a href="z_0ce4b8b40d14c0ec_tutorial_py.html#t87"><data value='TutorialModel'>TutorialModel</data></a></td>
757
757
  <td class="spacer">&nbsp;</td>
758
758
  <td data-ratio="24 24">100%</td>
759
759
  <td>24</td>
@@ -770,8 +770,8 @@
770
770
  <td class="name"><a href="z_0ce4b8b40d14c0ec_tutorial_py.html">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;tutorial.py</a></td>
771
771
  <td class="name"><a href="z_0ce4b8b40d14c0ec_tutorial_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
772
772
  <td class="spacer">&nbsp;</td>
773
- <td data-ratio="44 44">100%</td>
774
- <td>44</td>
773
+ <td data-ratio="46 46">100%</td>
774
+ <td>46</td>
775
775
  <td>0</td>
776
776
  <td>0</td>
777
777
  <td class="spacer">&nbsp;</td>
@@ -779,7 +779,7 @@
779
779
  <td>0</td>
780
780
  <td>0</td>
781
781
  <td class="spacer">&nbsp;</td>
782
- <td data-ratio="44 44">100%</td>
782
+ <td data-ratio="46 46">100%</td>
783
783
  </tr>
784
784
  <tr class="region">
785
785
  <td class="name"><a href="z_0ce4b8b40d14c0ec_validators_py.html">structured_tutorials&#8201;/&#8201;models&#8201;/&#8201;validators.py</a></td>
@@ -890,16 +890,16 @@
890
890
  <td class="name"><a href="z_1b8c1a89abcc896b_base_py.html#t29">structured_tutorials&#8201;/&#8201;runners&#8201;/&#8201;base.py</a></td>
891
891
  <td class="name"><a href="z_1b8c1a89abcc896b_base_py.html#t29"><data value='RunnerBase'>RunnerBase</data></a></td>
892
892
  <td class="spacer">&nbsp;</td>
893
- <td data-ratio="71 71">100%</td>
894
- <td>71</td>
893
+ <td data-ratio="76 76">100%</td>
894
+ <td>76</td>
895
895
  <td>0</td>
896
896
  <td>2</td>
897
897
  <td class="spacer">&nbsp;</td>
898
- <td data-ratio="36 36">100%</td>
899
- <td>36</td>
898
+ <td data-ratio="38 38">100%</td>
899
+ <td>38</td>
900
900
  <td>0</td>
901
901
  <td class="spacer">&nbsp;</td>
902
- <td data-ratio="107 107">100%</td>
902
+ <td data-ratio="114 114">100%</td>
903
903
  </tr>
904
904
  <tr class="region">
905
905
  <td class="name"><a href="z_1b8c1a89abcc896b_base_py.html">structured_tutorials&#8201;/&#8201;runners&#8201;/&#8201;base.py</a></td>
@@ -920,8 +920,8 @@
920
920
  <td class="name"><a href="z_1b8c1a89abcc896b_local_py.html#t26">structured_tutorials&#8201;/&#8201;runners&#8201;/&#8201;local.py</a></td>
921
921
  <td class="name"><a href="z_1b8c1a89abcc896b_local_py.html#t26"><data value='LocalTutorialRunner'>LocalTutorialRunner</data></a></td>
922
922
  <td class="spacer">&nbsp;</td>
923
- <td data-ratio="121 121">100%</td>
924
- <td>121</td>
923
+ <td data-ratio="125 125">100%</td>
924
+ <td>125</td>
925
925
  <td>0</td>
926
926
  <td>6</td>
927
927
  <td class="spacer">&nbsp;</td>
@@ -929,7 +929,7 @@
929
929
  <td>66</td>
930
930
  <td>0</td>
931
931
  <td class="spacer">&nbsp;</td>
932
- <td data-ratio="187 187">100%</td>
932
+ <td data-ratio="191 191">100%</td>
933
933
  </tr>
934
934
  <tr class="region">
935
935
  <td class="name"><a href="z_1b8c1a89abcc896b_local_py.html">structured_tutorials&#8201;/&#8201;runners&#8201;/&#8201;local.py</a></td>
@@ -1025,16 +1025,16 @@
1025
1025
  <td class="name"><a href="z_10746939a1c77e4c_utils_py.html#t53">structured_tutorials&#8201;/&#8201;sphinx&#8201;/&#8201;utils.py</a></td>
1026
1026
  <td class="name"><a href="z_10746939a1c77e4c_utils_py.html#t53"><data value='TutorialWrapper'>TutorialWrapper</data></a></td>
1027
1027
  <td class="spacer">&nbsp;</td>
1028
- <td data-ratio="78 78">100%</td>
1029
- <td>78</td>
1028
+ <td data-ratio="80 80">100%</td>
1029
+ <td>80</td>
1030
1030
  <td>0</td>
1031
1031
  <td>4</td>
1032
1032
  <td class="spacer">&nbsp;</td>
1033
- <td data-ratio="36 36">100%</td>
1034
- <td>36</td>
1033
+ <td data-ratio="38 38">100%</td>
1034
+ <td>38</td>
1035
1035
  <td>0</td>
1036
1036
  <td class="spacer">&nbsp;</td>
1037
- <td data-ratio="114 114">100%</td>
1037
+ <td data-ratio="118 118">100%</td>
1038
1038
  </tr>
1039
1039
  <tr class="region">
1040
1040
  <td class="name"><a href="z_10746939a1c77e4c_utils_py.html">structured_tutorials&#8201;/&#8201;sphinx&#8201;/&#8201;utils.py</a></td>
@@ -1100,8 +1100,8 @@
1100
1100
  <td class="name"><a href="z_3b10c79445bd681b_utils_py.html">structured_tutorials&#8201;/&#8201;utils.py</a></td>
1101
1101
  <td class="name"><a href="z_3b10c79445bd681b_utils_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1102
1102
  <td class="spacer">&nbsp;</td>
1103
- <td data-ratio="60 60">100%</td>
1104
- <td>60</td>
1103
+ <td data-ratio="61 61">100%</td>
1104
+ <td>61</td>
1105
1105
  <td>0</td>
1106
1106
  <td>4</td>
1107
1107
  <td class="spacer">&nbsp;</td>
@@ -1109,7 +1109,7 @@
1109
1109
  <td>16</td>
1110
1110
  <td>0</td>
1111
1111
  <td class="spacer">&nbsp;</td>
1112
- <td data-ratio="76 76">100%</td>
1112
+ <td data-ratio="77 77">100%</td>
1113
1113
  </tr>
1114
1114
  </tbody>
1115
1115
  <tfoot>
@@ -1117,16 +1117,16 @@
1117
1117
  <td class="name">Total</td>
1118
1118
  <td class="name">&nbsp;</td>
1119
1119
  <td class="spacer">&nbsp;</td>
1120
- <td data-ratio="870 870">100%</td>
1121
- <td>870</td>
1120
+ <td data-ratio="885 885">100%</td>
1121
+ <td>885</td>
1122
1122
  <td>0</td>
1123
1123
  <td>57</td>
1124
1124
  <td class="spacer">&nbsp;</td>
1125
- <td data-ratio="216 216">100%</td>
1126
- <td>216</td>
1125
+ <td data-ratio="220 220">100%</td>
1126
+ <td>220</td>
1127
1127
  <td>0</td>
1128
1128
  <td class="spacer">&nbsp;</td>
1129
- <td data-ratio="1086 1086">100%</td>
1129
+ <td data-ratio="1105 1105">100%</td>
1130
1130
  </tr>
1131
1131
  </tfoot>
1132
1132
  </table>
@@ -1138,7 +1138,7 @@
1138
1138
  <div class="content">
1139
1139
  <p>
1140
1140
  <a class="nav" href="https://coverage.readthedocs.io/en/7.13.0">coverage.py v7.13.0</a>,
1141
- created at 2025-12-23 20:24 +0100
1141
+ created at 2025-12-26 12:41 +0100
1142
1142
  </p>
1143
1143
  </div>
1144
1144
  <aside class="hidden">