markdown-include-variants 0.0.6__tar.gz → 0.0.8__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 (76) hide show
  1. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/.github/workflows/smokeshow.yml +1 -5
  2. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/.github/workflows/test.yml +3 -15
  3. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/PKG-INFO +1 -1
  4. markdown_include_variants-0.0.8/docs_src/only_py_no_an/tutorial001_py310.py +10 -0
  5. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/pyproject.toml +5 -5
  6. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/release-notes.md +16 -0
  7. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/src/markdown_include_variants/_main.py +23 -5
  8. markdown_include_variants-0.0.8/src/markdown_include_variants/_version.py +1 -0
  9. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/tests/test_all_variants.py +225 -0
  10. markdown_include_variants-0.0.8/tests/test_only_py310_no_an_folder.py +26 -0
  11. markdown_include_variants-0.0.8/tests/test_simple_title.py +59 -0
  12. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/uv.lock +251 -251
  13. markdown_include_variants-0.0.6/src/markdown_include_variants/_version.py +0 -1
  14. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/.github/DISCUSSION_TEMPLATE/questions.yml +0 -0
  15. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/.github/FUNDING.yml +0 -0
  16. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  17. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/.github/ISSUE_TEMPLATE/privileged.yml +0 -0
  18. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/.github/dependabot.yml +0 -0
  19. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/.github/labeler.yml +0 -0
  20. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/.github/workflows/issue-manager.yml +0 -0
  21. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/.github/workflows/labeler.yml +0 -0
  22. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/.github/workflows/latest-changes.yml +0 -0
  23. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/.github/workflows/publish.yml +0 -0
  24. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/.gitignore +0 -0
  25. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/.pre-commit-config.yaml +0 -0
  26. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/.python-version +0 -0
  27. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/CITATION.cff +0 -0
  28. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/LICENSE +0 -0
  29. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/README.md +0 -0
  30. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/all_variants/tutorial001.py +0 -0
  31. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/all_variants/tutorial001_an.py +0 -0
  32. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/all_variants/tutorial001_an_py310.py +0 -0
  33. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/all_variants/tutorial001_an_py311.py +0 -0
  34. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/all_variants/tutorial001_an_py39.py +0 -0
  35. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/all_variants/tutorial001_py310.py +0 -0
  36. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/all_variants/tutorial001_py311.py +0 -0
  37. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/all_variants/tutorial001_py39.py +0 -0
  38. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/all_variants_folder/app/tutorial001.py +0 -0
  39. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/all_variants_folder/app_an/tutorial001.py +0 -0
  40. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/all_variants_folder/app_an_py310/tutorial001.py +0 -0
  41. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/all_variants_folder/app_an_py311/tutorial001.py +0 -0
  42. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/all_variants_folder/app_an_py39/tutorial001.py +0 -0
  43. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/all_variants_folder/app_py310/tutorial001.py +0 -0
  44. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/all_variants_folder/app_py311/tutorial001.py +0 -0
  45. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/all_variants_folder/app_py39/tutorial001.py +0 -0
  46. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/no_py39/tutorial001.py +0 -0
  47. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/no_py39/tutorial001_an.py +0 -0
  48. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/no_py39/tutorial001_an_py310.py +0 -0
  49. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/no_py39/tutorial001_py310.py +0 -0
  50. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/only_py310/tutorial001_an_py310.py +0 -0
  51. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/only_py310/tutorial001_py310.py +0 -0
  52. /markdown_include_variants-0.0.6/docs_src/only_py_no_an/tutorial001_py310.py → /markdown_include_variants-0.0.8/docs_src/only_py310_no_an_folder/app_py310/tutorial001.py +0 -0
  53. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/only_py_no_an/tutorial001.py +0 -0
  54. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/only_py_no_an/tutorial001_py311.py +0 -0
  55. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/only_py_no_an/tutorial001_py39.py +0 -0
  56. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/simple/tutorial001.py +0 -0
  57. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/up_to_py39/tutorial001.py +0 -0
  58. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/up_to_py39/tutorial001_an.py +0 -0
  59. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/up_to_py39/tutorial001_an_py39.py +0 -0
  60. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/docs_src/up_to_py39/tutorial001_py39.py +0 -0
  61. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/scripts/format.sh +0 -0
  62. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/scripts/lint.sh +0 -0
  63. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/scripts/test.sh +0 -0
  64. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/src/markdown_include_variants/__init__.py +0 -0
  65. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/src/markdown_include_variants/py.typed +0 -0
  66. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/tests/test_all_variants_folder.py +0 -0
  67. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/tests/test_another_preferred_variant.py +0 -0
  68. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/tests/test_no_py39.py +0 -0
  69. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/tests/test_only_preview.py +0 -0
  70. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/tests/test_only_py310.py +0 -0
  71. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/tests/test_only_py_no_an.py +0 -0
  72. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/tests/test_simple_hl.py +0 -0
  73. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/tests/test_simple_ln.py +0 -0
  74. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/tests/test_simple_ln_hl.py +0 -0
  75. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/tests/test_simple_no_configs.py +0 -0
  76. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.8}/tests/test_up_to_py39.py +0 -0
@@ -27,11 +27,7 @@ jobs:
27
27
  - uses: actions/setup-python@v6
28
28
  with:
29
29
  python-version: '3.9'
30
- - name: Setup uv
31
- uses: astral-sh/setup-uv@v7
32
- with:
33
- version: "0.4.15"
34
- enable-cache: true
30
+ - uses: astral-sh/setup-uv@v7
35
31
  - name: Install Dependencies
36
32
  run: uv sync
37
33
  - uses: actions/download-artifact@v6
@@ -25,11 +25,7 @@ jobs:
25
25
  uses: actions/setup-python@v6
26
26
  with:
27
27
  python-version: "3.11"
28
- - name: Setup uv
29
- uses: astral-sh/setup-uv@v7
30
- with:
31
- version: "0.4.15"
32
- enable-cache: true
28
+ - uses: astral-sh/setup-uv@v7
33
29
  - name: Install Dependencies
34
30
  run: uv sync
35
31
  - name: Lint
@@ -52,11 +48,7 @@ jobs:
52
48
  uses: actions/setup-python@v6
53
49
  with:
54
50
  python-version: ${{ matrix.python-version }}
55
- - name: Setup uv
56
- uses: astral-sh/setup-uv@v7
57
- with:
58
- version: "0.4.15"
59
- enable-cache: true
51
+ - uses: astral-sh/setup-uv@v7
60
52
  - name: Install Dependencies
61
53
  run: uv sync
62
54
  - run: mkdir coverage
@@ -85,11 +77,7 @@ jobs:
85
77
  - uses: actions/setup-python@v6
86
78
  with:
87
79
  python-version: '3.11'
88
- - name: Setup uv
89
- uses: astral-sh/setup-uv@v7
90
- with:
91
- version: "0.4.15"
92
- enable-cache: true
80
+ - uses: astral-sh/setup-uv@v7
93
81
  - name: Get coverage files
94
82
  uses: actions/download-artifact@v6
95
83
  with:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: markdown-include-variants
3
- Version: 0.0.6
3
+ Version: 0.0.8
4
4
  Summary: Markdown extension to expand directives to include source example files to also include their variants. Only useful to tiangolo's projets. Don't use it. 😅
5
5
  Project-URL: Homepage, https://github.com/tiangolo/markdown-include-variants
6
6
  Project-URL: Repository, https://github.com/tiangolo/markdown-include-variants
@@ -0,0 +1,10 @@
1
+ print("py310 line 1")
2
+ print("py310 line 2")
3
+ print("py310 line 3")
4
+ print("py310 line 4")
5
+ print("py310 line 5")
6
+ print("py310 line 6")
7
+ print("py310 line 7")
8
+ print("py310 line 8")
9
+ print("py310 line 9")
10
+ print("py310 line 10")
@@ -25,11 +25,8 @@ Repository = "https://github.com/tiangolo/markdown-include-variants"
25
25
  Issues = "https://github.com/tiangolo/markdown-include-variants/issues"
26
26
  Changelog = "https://github.com/tiangolo/markdown-include-variants/release-notes.md"
27
27
 
28
- [tool.hatch.version]
29
- path = "src/markdown_include_variants/_version.py"
30
-
31
- [tool.uv]
32
- dev-dependencies = [
28
+ [dependency-groups]
29
+ dev = [
33
30
  "coverage[toml]>=7.6.1",
34
31
  "inline-snapshot>=0.13.3",
35
32
  "mdx-include>=1.4.2",
@@ -41,6 +38,9 @@ dev-dependencies = [
41
38
  "types-markdown>=3.7.0.20240822",
42
39
  ]
43
40
 
41
+ [tool.hatch.version]
42
+ path = "src/markdown_include_variants/_version.py"
43
+
44
44
  [tool.coverage.run]
45
45
  parallel = true
46
46
  data_file = "coverage/.coverage"
@@ -2,6 +2,22 @@
2
2
 
3
3
  ## Latest Changes
4
4
 
5
+ ## 0.0.8
6
+
7
+ ### Fixes
8
+
9
+ * 🐛 Fix case with single folder with non-default version. PR [#41](https://github.com/tiangolo/markdown-include-variants/pull/41) by [@YuriiMotov](https://github.com/YuriiMotov).
10
+
11
+ ## 0.0.7
12
+
13
+ ### Features
14
+
15
+ * ✨ Support `title` option. PR [#39](https://github.com/tiangolo/markdown-include-variants/pull/39) by [@YuriiMotov](https://github.com/YuriiMotov).
16
+
17
+ ### Upgrades
18
+
19
+ * ⬆️ Upgrade uv config in pyproject.toml. PR [#40](https://github.com/tiangolo/markdown-include-variants/pull/40) by [@tiangolo](https://github.com/tiangolo).
20
+
5
21
  ## 0.0.6
6
22
 
7
23
  ### Features
@@ -279,15 +279,18 @@ class IncludeVariantsPreprocessor(Preprocessor):
279
279
  configs_str = line_match.group(2).strip()
280
280
  include_lines: list[tuple[int, int]] = []
281
281
  highlight_lines: list[tuple[int, int]] = []
282
+ title: Union[str, None] = None
282
283
  for config_match in re.finditer(re_config, configs_str):
283
284
  if config_match:
284
285
  name = config_match.group(1)
285
- ranges_str = config_match.group(2)
286
- ranges = parse_lines_index(ranges_str)
286
+ value_str = config_match.group(2)
287
287
  if name == "ln":
288
- include_lines.extend(ranges)
288
+ include_lines.extend(parse_lines_index(value_str))
289
289
  elif name == "hl":
290
- highlight_lines.extend(ranges)
290
+ highlight_lines.extend(parse_lines_index(value_str))
291
+ elif name == "title":
292
+ assert value_str.startswith('"') and value_str.endswith('"')
293
+ title = value_str[1:-1]
291
294
  use_hl_lines: list[tuple[int, int]] = []
292
295
  if highlight_lines:
293
296
  if include_lines:
@@ -305,6 +308,14 @@ class IncludeVariantsPreprocessor(Preprocessor):
305
308
  folder_variants = calculate_variants_folder(base_path)
306
309
  if len(folder_variants) > 1:
307
310
  variants = folder_variants
311
+ elif len(folder_variants) == 1:
312
+ file_variant_is_default = variants.get(("py38", None)) is not None
313
+ folder_variant_is_default = (
314
+ folder_variants.get(("py38", None)) is not None
315
+ )
316
+ # File name doesn't contain any suffixes, but folder does - use variants from folder
317
+ if file_variant_is_default and not folder_variant_is_default:
318
+ variants = folder_variants
308
319
  sorted_variants: list[Variant] = []
309
320
  preferred_variant = None
310
321
  for an in [True, False, None]:
@@ -356,6 +367,8 @@ class IncludeVariantsPreprocessor(Preprocessor):
356
367
  first_line = "```python"
357
368
  if use_hl_lines:
358
369
  first_line += f' hl_lines="{use_hl_lines_str}"'
370
+ if title:
371
+ first_line += f' title="{title}"'
359
372
 
360
373
  block_lines.extend(
361
374
  [
@@ -373,6 +386,8 @@ class IncludeVariantsPreprocessor(Preprocessor):
373
386
  if highlight_lines:
374
387
  hl_lines_full_str = generate_hl_string(highlight_lines)
375
388
  first_line_full += f' hl_lines="{hl_lines_full_str}"'
389
+ if title:
390
+ first_line_full += f' title="{title}"'
376
391
  block_lines.extend(
377
392
  [
378
393
  "///// details | 👀 Full file preview",
@@ -390,6 +405,9 @@ class IncludeVariantsPreprocessor(Preprocessor):
390
405
  ]
391
406
  )
392
407
  if len(sorted_variants):
408
+ first_line_variant = "```python"
409
+ if title:
410
+ first_line_variant += f' title="{title}"'
393
411
  block_lines.extend(
394
412
  [
395
413
  "///// details | 🤓 Other versions and variants",
@@ -413,7 +431,7 @@ class IncludeVariantsPreprocessor(Preprocessor):
413
431
 
414
432
  block_lines.extend(
415
433
  [
416
- "```python",
434
+ first_line_variant,
417
435
  f"{{!{variant.path}!}}",
418
436
  "```",
419
437
  "////",
@@ -0,0 +1 @@
1
+ __version__ = "0.0.8"
@@ -142,6 +142,77 @@ def test_all_variants_ln_hl():
142
142
  )
143
143
 
144
144
 
145
+ def test_all_variants_ln_hl_title():
146
+ input_md = inspect.cleandoc(
147
+ """
148
+ {* docs_src/all_variants/tutorial001_an_py311.py ln[3:5] hl[4:5] title["main.py"] *}
149
+ """
150
+ )
151
+
152
+ result = markdown.markdown(input_md, extensions=[IncludeVariantsExtension()])
153
+ assert result == snapshot(
154
+ inspect.cleandoc(
155
+ """
156
+ <p>//// tab | Python 3.11+
157
+ ```python hl_lines="4-5" title="main.py"</p>
158
+ <h1>Code above omitted 👆</h1>
159
+ <p>{!docs_src/all_variants/tutorial001_an_py311.py[ln:3-5]!}</p>
160
+ <h1>Code below omitted 👇</h1>
161
+ <p>```</p>
162
+ <p>////</p>
163
+ <p>///// details | 👀 Full file preview</p>
164
+ <p>//// tab | Python 3.11+</p>
165
+ <p><code>python hl_lines="4-5" title="main.py"
166
+ {!docs_src/all_variants/tutorial001_an_py311.py!}</code></p>
167
+ <p>////</p>
168
+ <p>/////</p>
169
+ <p>///// details | 🤓 Other versions and variants</p>
170
+ <p>//// tab | Python 3.10+</p>
171
+ <p><code>python title="main.py"
172
+ {!docs_src/all_variants/tutorial001_an_py310.py!}</code>
173
+ ////
174
+ //// tab | Python 3.9+</p>
175
+ <p><code>python title="main.py"
176
+ {!docs_src/all_variants/tutorial001_an_py39.py!}</code>
177
+ ////
178
+ //// tab | Python 3.8+</p>
179
+ <p><code>python title="main.py"
180
+ {!docs_src/all_variants/tutorial001_an.py!}</code>
181
+ ////
182
+ //// tab | Python 3.11+ - non-Annotated</p>
183
+ <p>/// tip</p>
184
+ <p>Prefer to use the <code>Annotated</code> version if possible.</p>
185
+ <p>///</p>
186
+ <p><code>python title="main.py"
187
+ {!docs_src/all_variants/tutorial001_py311.py!}</code>
188
+ ////
189
+ //// tab | Python 3.10+ - non-Annotated</p>
190
+ <p>/// tip</p>
191
+ <p>Prefer to use the <code>Annotated</code> version if possible.</p>
192
+ <p>///</p>
193
+ <p><code>python title="main.py"
194
+ {!docs_src/all_variants/tutorial001_py310.py!}</code>
195
+ ////
196
+ //// tab | Python 3.9+ - non-Annotated</p>
197
+ <p>/// tip</p>
198
+ <p>Prefer to use the <code>Annotated</code> version if possible.</p>
199
+ <p>///</p>
200
+ <p><code>python title="main.py"
201
+ {!docs_src/all_variants/tutorial001_py39.py!}</code>
202
+ ////
203
+ //// tab | Python 3.8+ - non-Annotated</p>
204
+ <p>/// tip</p>
205
+ <p>Prefer to use the <code>Annotated</code> version if possible.</p>
206
+ <p>///</p>
207
+ <p><code>python title="main.py"
208
+ {!docs_src/all_variants/tutorial001.py!}</code>
209
+ ////</p>
210
+ <p>/////</p>
211
+ """
212
+ )
213
+ )
214
+
215
+
145
216
  def test_all_variants_ln_hl_include():
146
217
  input_md = inspect.cleandoc(
147
218
  """
@@ -294,3 +365,157 @@ def test_all_variants_ln_hl_include():
294
365
  """
295
366
  )
296
367
  )
368
+
369
+
370
+ def test_all_variants_ln_hl_title_include():
371
+ input_md = inspect.cleandoc(
372
+ """
373
+ {* docs_src/all_variants/tutorial001_an_py311.py ln[3:5] hl[4:5] title["main.py"] *}
374
+ """
375
+ )
376
+
377
+ result = markdown.markdown(
378
+ input_md,
379
+ extensions=[
380
+ IncludeVariantsExtension(),
381
+ IncludeExtension(),
382
+ SuperFencesCodeExtension(),
383
+ HighlightExtension(),
384
+ ],
385
+ )
386
+ assert result == snapshot(
387
+ inspect.cleandoc(
388
+ """
389
+ <p>//// tab | Python 3.11+
390
+ <div class="highlight"><span class="filename">main.py</span><pre><span></span><code><span class="c1"># Code above omitted 👆</span>
391
+
392
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py311 line 3&quot;</span><span class="p">)</span>
393
+ <span class="hll"><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py311 line 4&quot;</span><span class="p">)</span>
394
+ </span><span class="hll"><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py311 line 5&quot;</span><span class="p">)</span>
395
+ </span>
396
+ <span class="c1"># Code below omitted 👇</span>
397
+ </code></pre></div></p>
398
+ <p>////</p>
399
+ <p>///// details | 👀 Full file preview</p>
400
+ <p>//// tab | Python 3.11+</p>
401
+ <div class="highlight"><span class="filename">main.py</span><pre><span></span><code><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py311 line 1&quot;</span><span class="p">)</span>
402
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py311 line 2&quot;</span><span class="p">)</span>
403
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py311 line 3&quot;</span><span class="p">)</span>
404
+ <span class="hll"><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py311 line 4&quot;</span><span class="p">)</span>
405
+ </span><span class="hll"><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py311 line 5&quot;</span><span class="p">)</span>
406
+ </span><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py311 line 6&quot;</span><span class="p">)</span>
407
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py311 line 7&quot;</span><span class="p">)</span>
408
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py311 line 8&quot;</span><span class="p">)</span>
409
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py311 line 9&quot;</span><span class="p">)</span>
410
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py311 line 10&quot;</span><span class="p">)</span>
411
+ </code></pre></div>
412
+ <p>////</p>
413
+ <p>/////</p>
414
+ <p>///// details | 🤓 Other versions and variants</p>
415
+ <p>//// tab | Python 3.10+</p>
416
+ <p><div class="highlight"><span class="filename">main.py</span><pre><span></span><code><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py310 line 1&quot;</span><span class="p">)</span>
417
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py310 line 2&quot;</span><span class="p">)</span>
418
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py310 line 3&quot;</span><span class="p">)</span>
419
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py310 line 4&quot;</span><span class="p">)</span>
420
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py310 line 5&quot;</span><span class="p">)</span>
421
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py310 line 6&quot;</span><span class="p">)</span>
422
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py310 line 7&quot;</span><span class="p">)</span>
423
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py310 line 8&quot;</span><span class="p">)</span>
424
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py310 line 9&quot;</span><span class="p">)</span>
425
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py310 line 10&quot;</span><span class="p">)</span>
426
+ </code></pre></div>
427
+ ////
428
+ //// tab | Python 3.9+</p>
429
+ <p><div class="highlight"><span class="filename">main.py</span><pre><span></span><code><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py39 line 1&quot;</span><span class="p">)</span>
430
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py39 line 2&quot;</span><span class="p">)</span>
431
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py39 line 3&quot;</span><span class="p">)</span>
432
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py39 line 4&quot;</span><span class="p">)</span>
433
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py39 line 5&quot;</span><span class="p">)</span>
434
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py39 line 6&quot;</span><span class="p">)</span>
435
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py39 line 7&quot;</span><span class="p">)</span>
436
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py39 line 8&quot;</span><span class="p">)</span>
437
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py39 line 9&quot;</span><span class="p">)</span>
438
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an py39 line 10&quot;</span><span class="p">)</span>
439
+ </code></pre></div>
440
+ ////
441
+ //// tab | Python 3.8+</p>
442
+ <p><div class="highlight"><span class="filename">main.py</span><pre><span></span><code><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an line 1&quot;</span><span class="p">)</span>
443
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an line 2&quot;</span><span class="p">)</span>
444
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an line 3&quot;</span><span class="p">)</span>
445
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an line 4&quot;</span><span class="p">)</span>
446
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an line 5&quot;</span><span class="p">)</span>
447
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an line 6&quot;</span><span class="p">)</span>
448
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an line 7&quot;</span><span class="p">)</span>
449
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an line 8&quot;</span><span class="p">)</span>
450
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an line 9&quot;</span><span class="p">)</span>
451
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;an line 10&quot;</span><span class="p">)</span>
452
+ </code></pre></div>
453
+ ////
454
+ //// tab | Python 3.11+ - non-Annotated</p>
455
+ <p>/// tip</p>
456
+ <p>Prefer to use the <code>Annotated</code> version if possible.</p>
457
+ <p>///</p>
458
+ <p><div class="highlight"><span class="filename">main.py</span><pre><span></span><code><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py311 line 1&quot;</span><span class="p">)</span>
459
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py311 line 2&quot;</span><span class="p">)</span>
460
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py311 line 3&quot;</span><span class="p">)</span>
461
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py311 line 4&quot;</span><span class="p">)</span>
462
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py311 line 5&quot;</span><span class="p">)</span>
463
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py311 line 6&quot;</span><span class="p">)</span>
464
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py311 line 7&quot;</span><span class="p">)</span>
465
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py311 line 8&quot;</span><span class="p">)</span>
466
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py311 line 9&quot;</span><span class="p">)</span>
467
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py311 line 10&quot;</span><span class="p">)</span>
468
+ </code></pre></div>
469
+ ////
470
+ //// tab | Python 3.10+ - non-Annotated</p>
471
+ <p>/// tip</p>
472
+ <p>Prefer to use the <code>Annotated</code> version if possible.</p>
473
+ <p>///</p>
474
+ <p><div class="highlight"><span class="filename">main.py</span><pre><span></span><code><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py310 line 1&quot;</span><span class="p">)</span>
475
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py310 line 2&quot;</span><span class="p">)</span>
476
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py310 line 3&quot;</span><span class="p">)</span>
477
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py310 line 4&quot;</span><span class="p">)</span>
478
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py310 line 5&quot;</span><span class="p">)</span>
479
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py310 line 6&quot;</span><span class="p">)</span>
480
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py310 line 7&quot;</span><span class="p">)</span>
481
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py310 line 8&quot;</span><span class="p">)</span>
482
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py310 line 9&quot;</span><span class="p">)</span>
483
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py310 line 10&quot;</span><span class="p">)</span>
484
+ </code></pre></div>
485
+ ////
486
+ //// tab | Python 3.9+ - non-Annotated</p>
487
+ <p>/// tip</p>
488
+ <p>Prefer to use the <code>Annotated</code> version if possible.</p>
489
+ <p>///</p>
490
+ <p><div class="highlight"><span class="filename">main.py</span><pre><span></span><code><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py39 line 1&quot;</span><span class="p">)</span>
491
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py39 line 2&quot;</span><span class="p">)</span>
492
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py39 line 3&quot;</span><span class="p">)</span>
493
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py39 line 4&quot;</span><span class="p">)</span>
494
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py39 line 5&quot;</span><span class="p">)</span>
495
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py39 line 6&quot;</span><span class="p">)</span>
496
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py39 line 7&quot;</span><span class="p">)</span>
497
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py39 line 8&quot;</span><span class="p">)</span>
498
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py39 line 9&quot;</span><span class="p">)</span>
499
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;py39 line 10&quot;</span><span class="p">)</span>
500
+ </code></pre></div>
501
+ ////
502
+ //// tab | Python 3.8+ - non-Annotated</p>
503
+ <p>/// tip</p>
504
+ <p>Prefer to use the <code>Annotated</code> version if possible.</p>
505
+ <p>///</p>
506
+ <p><div class="highlight"><span class="filename">main.py</span><pre><span></span><code><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;simple line 1&quot;</span><span class="p">)</span>
507
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;simple line 2&quot;</span><span class="p">)</span>
508
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;simple line 3&quot;</span><span class="p">)</span>
509
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;simple line 4&quot;</span><span class="p">)</span>
510
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;simple line 5&quot;</span><span class="p">)</span>
511
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;simple line 6&quot;</span><span class="p">)</span>
512
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;simple line 7&quot;</span><span class="p">)</span>
513
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;simple line 8&quot;</span><span class="p">)</span>
514
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;simple line 9&quot;</span><span class="p">)</span>
515
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;simple line 10&quot;</span><span class="p">)</span>
516
+ </code></pre></div>
517
+ ////</p>
518
+ <p>/////</p>
519
+ """
520
+ )
521
+ )
@@ -0,0 +1,26 @@
1
+ import inspect
2
+
3
+ import markdown
4
+ from inline_snapshot import snapshot
5
+
6
+ from markdown_include_variants import IncludeVariantsExtension
7
+
8
+
9
+ def test_all_variants_plain():
10
+ input_md = inspect.cleandoc(
11
+ """
12
+ {* docs_src/only_py310_no_an_folder/app_py310/tutorial001.py *}
13
+ """
14
+ )
15
+
16
+ result = markdown.markdown(input_md, extensions=[IncludeVariantsExtension()])
17
+ assert result == snapshot(
18
+ inspect.cleandoc(
19
+ """
20
+ <p>//// tab | Python 3.10+
21
+ <code>python
22
+ {!docs_src/only_py310_no_an_folder/app_py310/tutorial001.py!}</code></p>
23
+ <p>////</p>
24
+ """
25
+ )
26
+ )
@@ -0,0 +1,59 @@
1
+ import inspect
2
+
3
+ import markdown
4
+ from inline_snapshot import snapshot
5
+ from mdx_include.mdx_include import IncludeExtension
6
+
7
+ from markdown_include_variants import IncludeVariantsExtension
8
+
9
+
10
+ def test_simple_title():
11
+ input_md = inspect.cleandoc(
12
+ """
13
+ {*docs_src/simple/tutorial001.py title["Example 1"] *}
14
+ """
15
+ )
16
+
17
+ result = markdown.markdown(input_md, extensions=[IncludeVariantsExtension()])
18
+ assert result == snapshot(
19
+ inspect.cleandoc(
20
+ """
21
+ <p>//// tab | Python 3.8+
22
+ <code>python title="Example 1"
23
+ {!docs_src/simple/tutorial001.py!}</code></p>
24
+ <p>////</p>
25
+ """
26
+ )
27
+ )
28
+
29
+
30
+ def test_simple_include():
31
+ input_md = inspect.cleandoc(
32
+ """
33
+ {* docs_src/simple/tutorial001.py title["Example 1"] *}
34
+ """
35
+ )
36
+
37
+ result = markdown.markdown(
38
+ input_md, extensions=[IncludeVariantsExtension(), IncludeExtension()]
39
+ )
40
+ assert result == snapshot(
41
+ inspect.cleandoc(
42
+ """
43
+ <p>//// tab | Python 3.8+
44
+ ```python title="Example 1"
45
+ print("simple line 1")
46
+ print("simple line 2")
47
+ print("simple line 3")
48
+ print("simple line 4")
49
+ print("simple line 5")
50
+ print("simple line 6")
51
+ print("simple line 7")
52
+ print("simple line 8")
53
+ print("simple line 9")
54
+ print("simple line 10")</p>
55
+ <p>```</p>
56
+ <p>////</p>
57
+ """
58
+ )
59
+ )