Skip to content

Commit 8b6ab06

Browse files
authored
⬆️ UPDATE: Sphinx v5, myst-parser v0.18 (#424)
Also removes support for sphinx v3. myst-parser v0.18 now supports file-level config for markdown parsing configuration, e.g. in text-based notebook: ```yaml --- file_format: mystnb kernelspec: name: python3 myst: enable_extensions: - "deflist" mystnb: execution_mode: "off" --- ```
1 parent 3560d1a commit 8b6ab06

34 files changed

+179
-266
lines changed

.github/workflows/tests.yml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,17 @@ jobs:
2727
matrix:
2828
os: [ubuntu-latest]
2929
python-version: ["3.7", "3.8", "3.9", "3.10"]
30-
sphinx: [">=4,<5"]
30+
sphinx: [">=5,<6"]
3131
include:
32+
- os: ubuntu-latest
33+
python-version: 3.7
34+
sphinx: ">=4,<5"
3235
- os: windows-latest
3336
python-version: 3.8
34-
sphinx: ">=4,<5"
37+
sphinx: ">=5,<6"
3538
- os: macos-latest
3639
python-version: 3.8
37-
sphinx: ">=4,<5"
40+
sphinx: ">=5,<6"
3841

3942
runs-on: ${{ matrix.os }}
4043

.pre-commit-config.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ repos:
3939
rev: 4.0.1
4040
hooks:
4141
- id: flake8
42-
additional_dependencies: [flake8-bugbear==21.3.1]
42+
additional_dependencies: [flake8-bugbear]
4343

4444
- repo: https://github.com/pre-commit/mirrors-mypy
4545
rev: v0.960
@@ -48,8 +48,8 @@ repos:
4848
args: [--config-file=pyproject.toml]
4949
additional_dependencies:
5050
- importlib_metadata
51-
- myst-parser~=0.17.2
52-
- "sphinx~=4.3.2"
51+
- myst-parser~=0.18.0
52+
- "sphinx~=5.0"
5353
- nbclient
5454
- types-PyYAML
5555
files: >

docs/conf.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@
7070
"docutils.nodes.system_message",
7171
"DocutilsNbRenderer",
7272
"SphinxNbRenderer",
73-
"myst_parser.main.MdParserConfig",
7473
"nbformat.notebooknode.NotebookNode",
7574
"nbf.NotebookNode",
7675
"NotebookNode",
@@ -134,7 +133,7 @@ def setup(app):
134133

135134
from docutils import nodes
136135
from docutils.parsers.rst import directives
137-
from myst_parser.main import MdParserConfig
136+
from myst_parser.config.main import MdParserConfig
138137
from sphinx.application import Sphinx
139138
from sphinx.util.docutils import SphinxDirective
140139

myst_nb/core/config.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from enum import Enum
44
from typing import Any, Callable, Dict, Iterable, Optional, Sequence, Tuple
55

6-
from myst_parser.dc_validators import (
6+
from myst_parser.config.dc_validators import (
77
ValidatorType,
88
deep_iterable,
99
deep_mapping,
@@ -78,16 +78,17 @@ def has_items(*validators) -> ValidatorType:
7878
:param validators: Validator to apply per item
7979
"""
8080

81-
def _validator(inst, attr, value):
81+
def _validator(inst, field: dc.Field, value, suffix=""):
8282
if not isinstance(value, Sequence):
83-
raise TypeError(f"{attr.name} must be a sequence: {value}")
83+
raise TypeError(f"{suffix}{field.name} must be a sequence: {value}")
8484
if len(value) != len(validators):
8585
raise TypeError(
86-
f"{attr.name!r} must be a sequence of length {len(validators)}: {value}"
86+
f"{suffix}{field.name!r} must be a sequence of length "
87+
f"{len(validators)}: {value}"
8788
)
8889

89-
for validator, member in zip(validators, value):
90-
validator(inst, attr, member)
90+
for idx, (validator, member) in enumerate(zip(validators, value)):
91+
validator(inst, field, member, suffix=f"{suffix}[{idx}]")
9192

9293
return _validator
9394

myst_nb/core/read.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99

1010
from docutils.parsers.rst import Directive
1111
from markdown_it.renderer import RendererHTML
12-
from myst_parser.main import MdParserConfig, create_md_parser
12+
from myst_parser.config.main import MdParserConfig
13+
from myst_parser.parsers.mdit import create_md_parser
1314
import nbformat as nbf
1415
import yaml
1516

@@ -312,7 +313,10 @@ class _MockDirective:
312313

313314

314315
def _read_fenced_cell(token, cell_index, cell_type):
315-
from myst_parser.parse_directives import DirectiveParsingError, parse_directive_text
316+
from myst_parser.parsers.directives import (
317+
DirectiveParsingError,
318+
parse_directive_text,
319+
)
316320

317321
try:
318322
_, options, body_lines, _ = parse_directive_text(

myst_nb/core/render.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@
2020
from docutils import nodes
2121
from docutils.parsers.rst import directives as options_spec
2222
from importlib_metadata import entry_points
23-
from myst_parser.docutils_renderer import token_line
24-
from myst_parser.main import MdParserConfig, create_md_parser
23+
from myst_parser.config.main import MdParserConfig
24+
from myst_parser.mdit_to_docutils.base import token_line
25+
from myst_parser.parsers.mdit import create_md_parser
2526
from nbformat import NotebookNode
2627
from typing_extensions import Protocol
2728

myst_nb/docutils_.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,18 @@
1313
from docutils.parsers.rst.roles import _roles
1414
from markdown_it.token import Token
1515
from markdown_it.tree import SyntaxTreeNode
16-
from myst_parser.docutils_ import DOCUTILS_EXCLUDED_ARGS as DOCUTILS_EXCLUDED_ARGS_MYST
17-
from myst_parser.docutils_ import Parser as MystParser
18-
from myst_parser.docutils_ import create_myst_config, create_myst_settings_spec
19-
from myst_parser.docutils_renderer import DocutilsRenderer, token_line
20-
from myst_parser.main import MdParserConfig, create_md_parser
16+
from myst_parser.config.main import MdParserConfig, merge_file_level
17+
from myst_parser.mdit_to_docutils.base import (
18+
DocutilsRenderer,
19+
create_warning,
20+
token_line,
21+
)
22+
from myst_parser.parsers.docutils_ import (
23+
DOCUTILS_EXCLUDED_ARGS as DOCUTILS_EXCLUDED_ARGS_MYST,
24+
)
25+
from myst_parser.parsers.docutils_ import Parser as MystParser
26+
from myst_parser.parsers.docutils_ import create_myst_config, create_myst_settings_spec
27+
from myst_parser.parsers.mdit import create_md_parser
2128
import nbformat
2229
from nbformat import NotebookNode
2330
from pygments.formatters import get_formatter_by_name
@@ -141,6 +148,14 @@ def _parse(self, inputstring: str, document: nodes.document) -> None:
141148
nb_reader = NbReader(standard_nb_read, md_config)
142149
notebook = nb_reader.read(inputstring)
143150

151+
# update the global markdown config with the file-level config
152+
warning = lambda wtype, msg: create_warning( # noqa: E731
153+
document, msg, line=1, append_to=document, subtype=wtype
154+
)
155+
nb_reader.md_config = merge_file_level(
156+
nb_reader.md_config, notebook.metadata, warning
157+
)
158+
144159
# Update mystnb configuration with notebook level metadata
145160
if nb_config.metadata_key in notebook.metadata:
146161
overrides = nb_node_to_dict(notebook.metadata[nb_config.metadata_key])

myst_nb/sphinx_.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@
1010
from docutils import nodes
1111
from markdown_it.token import Token
1212
from markdown_it.tree import SyntaxTreeNode
13-
from myst_parser.docutils_renderer import token_line
14-
from myst_parser.main import MdParserConfig, create_md_parser
15-
from myst_parser.sphinx_parser import MystParser
16-
from myst_parser.sphinx_renderer import SphinxRenderer
13+
from myst_parser.config.main import MdParserConfig, merge_file_level
14+
from myst_parser.mdit_to_docutils.base import token_line
15+
from myst_parser.mdit_to_docutils.sphinx_ import SphinxRenderer, create_warning
16+
from myst_parser.parsers.mdit import create_md_parser
17+
from myst_parser.parsers.sphinx_ import MystParser
1718
import nbformat
1819
from sphinx.application import Sphinx
1920
from sphinx.environment import BuildEnvironment
@@ -72,6 +73,7 @@ def parse(self, inputstring: str, document: nodes.document) -> None:
7273

7374
# get markdown parsing configuration
7475
md_config: MdParserConfig = self.env.myst_config
76+
7577
# get notebook rendering configuration
7678
nb_config: NbParserConfig = self.env.mystnb_config
7779

@@ -82,6 +84,14 @@ def parse(self, inputstring: str, document: nodes.document) -> None:
8284
return super().parse(inputstring, document)
8385
notebook = nb_reader.read(inputstring)
8486

87+
# update the global markdown config with the file-level config
88+
warning = lambda wtype, msg: create_warning( # noqa: E731
89+
document, msg, line=1, append_to=document, subtype=wtype
90+
)
91+
nb_reader.md_config = merge_file_level(
92+
nb_reader.md_config, notebook.metadata, warning
93+
)
94+
8595
# potentially replace kernel name with alias
8696
kernel_name = notebook.metadata.get("kernelspec", {}).get("name", None)
8797
if kernel_name is not None and nb_config.kernel_rgx_aliases:

myst_nb/sphinx_ext.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from pathlib import Path
77
from typing import Any
88

9-
from myst_parser import setup_sphinx as setup_myst_parser
9+
from myst_parser.sphinx_ext.main import setup_sphinx as setup_myst_parser
1010
from sphinx.application import Sphinx
1111
from sphinx.util import logging as sphinx_logging
1212
from sphinx.util.fileutil import copy_asset_file

pyproject.toml

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,14 @@ keywords = [
3535
]
3636
requires-python = ">=3.7"
3737
dependencies = [
38-
"docutils>=0.15,<0.18",
3938
"importlib_metadata",
4039
"ipython",
4140
"jupyter-cache~=0.5.0",
4241
"nbclient", # nbclient version pinned by jupyter-client
43-
"myst-parser~=0.17.2",
42+
"myst-parser~=0.18.0",
4443
"nbformat~=5.0",
4544
"pyyaml",
46-
"sphinx>=3.5,<5",
45+
"sphinx>=4,<6",
4746
"sphinx-togglebutton~=0.3.0",
4847
"typing-extensions",
4948
# ipykernel is not a requirement of the library,
@@ -95,12 +94,10 @@ testing = [
9594
"ipython!=8.1.0", # see https://github.com/ipython/ipython/issues/13554
9695
"ipywidgets",
9796
"jupytext~=1.11.2",
98-
# TODO: 3.4.0 has some warnings that need to be fixed in the tests.
99-
"matplotlib~=3.3.0",
97+
"matplotlib",
10098
"nbdime",
10199
"numpy",
102-
# TODO: 1.4.0 has some warnings that need to be fixed in the tests.
103-
"pandas<1.4",
100+
"pandas",
104101
"pytest~=7.1",
105102
"pytest-cov~=3.0",
106103
"pytest-regressions",

0 commit comments

Comments
 (0)