markdown-include-variants 0.0.6__tar.gz → 0.0.7__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 (74) hide show
  1. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/.github/workflows/smokeshow.yml +1 -5
  2. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/.github/workflows/test.yml +3 -15
  3. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/PKG-INFO +1 -1
  4. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/pyproject.toml +5 -5
  5. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/release-notes.md +10 -0
  6. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/src/markdown_include_variants/_main.py +15 -5
  7. markdown_include_variants-0.0.7/src/markdown_include_variants/_version.py +1 -0
  8. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/tests/test_all_variants.py +225 -0
  9. markdown_include_variants-0.0.7/tests/test_simple_title.py +59 -0
  10. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/uv.lock +251 -251
  11. markdown_include_variants-0.0.6/src/markdown_include_variants/_version.py +0 -1
  12. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/.github/DISCUSSION_TEMPLATE/questions.yml +0 -0
  13. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/.github/FUNDING.yml +0 -0
  14. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  15. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/.github/ISSUE_TEMPLATE/privileged.yml +0 -0
  16. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/.github/dependabot.yml +0 -0
  17. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/.github/labeler.yml +0 -0
  18. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/.github/workflows/issue-manager.yml +0 -0
  19. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/.github/workflows/labeler.yml +0 -0
  20. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/.github/workflows/latest-changes.yml +0 -0
  21. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/.github/workflows/publish.yml +0 -0
  22. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/.gitignore +0 -0
  23. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/.pre-commit-config.yaml +0 -0
  24. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/.python-version +0 -0
  25. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/CITATION.cff +0 -0
  26. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/LICENSE +0 -0
  27. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/README.md +0 -0
  28. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/all_variants/tutorial001.py +0 -0
  29. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/all_variants/tutorial001_an.py +0 -0
  30. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/all_variants/tutorial001_an_py310.py +0 -0
  31. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/all_variants/tutorial001_an_py311.py +0 -0
  32. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/all_variants/tutorial001_an_py39.py +0 -0
  33. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/all_variants/tutorial001_py310.py +0 -0
  34. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/all_variants/tutorial001_py311.py +0 -0
  35. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/all_variants/tutorial001_py39.py +0 -0
  36. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/all_variants_folder/app/tutorial001.py +0 -0
  37. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/all_variants_folder/app_an/tutorial001.py +0 -0
  38. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/all_variants_folder/app_an_py310/tutorial001.py +0 -0
  39. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/all_variants_folder/app_an_py311/tutorial001.py +0 -0
  40. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/all_variants_folder/app_an_py39/tutorial001.py +0 -0
  41. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/all_variants_folder/app_py310/tutorial001.py +0 -0
  42. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/all_variants_folder/app_py311/tutorial001.py +0 -0
  43. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/all_variants_folder/app_py39/tutorial001.py +0 -0
  44. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/no_py39/tutorial001.py +0 -0
  45. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/no_py39/tutorial001_an.py +0 -0
  46. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/no_py39/tutorial001_an_py310.py +0 -0
  47. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/no_py39/tutorial001_py310.py +0 -0
  48. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/only_py310/tutorial001_an_py310.py +0 -0
  49. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/only_py310/tutorial001_py310.py +0 -0
  50. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/only_py_no_an/tutorial001.py +0 -0
  51. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/only_py_no_an/tutorial001_py310.py +0 -0
  52. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/only_py_no_an/tutorial001_py311.py +0 -0
  53. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/only_py_no_an/tutorial001_py39.py +0 -0
  54. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/simple/tutorial001.py +0 -0
  55. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/up_to_py39/tutorial001.py +0 -0
  56. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/up_to_py39/tutorial001_an.py +0 -0
  57. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/up_to_py39/tutorial001_an_py39.py +0 -0
  58. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/docs_src/up_to_py39/tutorial001_py39.py +0 -0
  59. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/scripts/format.sh +0 -0
  60. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/scripts/lint.sh +0 -0
  61. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/scripts/test.sh +0 -0
  62. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/src/markdown_include_variants/__init__.py +0 -0
  63. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/src/markdown_include_variants/py.typed +0 -0
  64. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/tests/test_all_variants_folder.py +0 -0
  65. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/tests/test_another_preferred_variant.py +0 -0
  66. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/tests/test_no_py39.py +0 -0
  67. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/tests/test_only_preview.py +0 -0
  68. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/tests/test_only_py310.py +0 -0
  69. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/tests/test_only_py_no_an.py +0 -0
  70. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/tests/test_simple_hl.py +0 -0
  71. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/tests/test_simple_ln.py +0 -0
  72. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/tests/test_simple_ln_hl.py +0 -0
  73. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/tests/test_simple_no_configs.py +0 -0
  74. {markdown_include_variants-0.0.6 → markdown_include_variants-0.0.7}/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.7
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
@@ -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,16 @@
2
2
 
3
3
  ## Latest Changes
4
4
 
5
+ ## 0.0.7
6
+
7
+ ### Features
8
+
9
+ * ✨ Support `title` option. PR [#39](https://github.com/tiangolo/markdown-include-variants/pull/39) by [@YuriiMotov](https://github.com/YuriiMotov).
10
+
11
+ ### Upgrades
12
+
13
+ * ⬆️ Upgrade uv config in pyproject.toml. PR [#40](https://github.com/tiangolo/markdown-include-variants/pull/40) by [@tiangolo](https://github.com/tiangolo).
14
+
5
15
  ## 0.0.6
6
16
 
7
17
  ### 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:
@@ -356,6 +359,8 @@ class IncludeVariantsPreprocessor(Preprocessor):
356
359
  first_line = "```python"
357
360
  if use_hl_lines:
358
361
  first_line += f' hl_lines="{use_hl_lines_str}"'
362
+ if title:
363
+ first_line += f' title="{title}"'
359
364
 
360
365
  block_lines.extend(
361
366
  [
@@ -373,6 +378,8 @@ class IncludeVariantsPreprocessor(Preprocessor):
373
378
  if highlight_lines:
374
379
  hl_lines_full_str = generate_hl_string(highlight_lines)
375
380
  first_line_full += f' hl_lines="{hl_lines_full_str}"'
381
+ if title:
382
+ first_line_full += f' title="{title}"'
376
383
  block_lines.extend(
377
384
  [
378
385
  "///// details | 👀 Full file preview",
@@ -390,6 +397,9 @@ class IncludeVariantsPreprocessor(Preprocessor):
390
397
  ]
391
398
  )
392
399
  if len(sorted_variants):
400
+ first_line_variant = "```python"
401
+ if title:
402
+ first_line_variant += f' title="{title}"'
393
403
  block_lines.extend(
394
404
  [
395
405
  "///// details | 🤓 Other versions and variants",
@@ -413,7 +423,7 @@ class IncludeVariantsPreprocessor(Preprocessor):
413
423
 
414
424
  block_lines.extend(
415
425
  [
416
- "```python",
426
+ first_line_variant,
417
427
  f"{{!{variant.path}!}}",
418
428
  "```",
419
429
  "////",
@@ -0,0 +1 @@
1
+ __version__ = "0.0.7"
@@ -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,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
+ )