From 77d80e369d4a019149d743d397f06f113eae3446 Mon Sep 17 00:00:00 2001 From: Alvaro Leiva Geisse Date: Fri, 17 Mar 2023 08:12:03 -0700 Subject: [PATCH 01/25] upgrade myst-parser dep to 1.0 --- .pre-commit-config.yaml | 2 +- myst_nb/core/config.py | 14 +++++++------- myst_nb/core/read.py | 25 +++++++++++-------------- myst_nb/core/render.py | 16 +++------------- myst_nb/docutils_.py | 13 +++---------- myst_nb/ext/glue/directives.py | 1 - myst_nb/sphinx_.py | 3 ++- pyproject.toml | 4 ++-- tests/nb_fixtures/reporter_warnings.txt | 9 ++++----- 9 files changed, 33 insertions(+), 54 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a10c3699..a84a065e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -48,7 +48,7 @@ repos: args: [--config-file=pyproject.toml] additional_dependencies: - importlib_metadata - - myst-parser~=0.18.0 + - myst-parser~=1.0.0 - "sphinx~=5.0" - nbclient - types-PyYAML diff --git a/myst_nb/core/config.py b/myst_nb/core/config.py index 1d69465a..1c7b2d36 100644 --- a/myst_nb/core/config.py +++ b/myst_nb/core/config.py @@ -130,7 +130,7 @@ def __post_init__(self): default_factory=dict, metadata={ "help": "Custom formats for reading notebook; suffix -> reader", - "docutils_exclude": True, + "omit": ["docutils"], "sections": (Section.global_lvl, Section.read), }, ) @@ -184,7 +184,7 @@ def __post_init__(self): "validator": deep_mapping(instance_of(str), instance_of(str)), "help": "Mapping of kernel name regex to replacement kernel name" "(applied before execution)", - "docutils_exclude": True, + "omit": ["docutils"], "sections": (Section.global_lvl, Section.execute), }, ) @@ -220,7 +220,7 @@ def __post_init__(self): "validator": deep_iterable(instance_of(str)), "help": "Exclude (POSIX) glob patterns for notebooks", "legacy_name": "execution_excludepatterns", - "docutils_exclude": True, + "omit": ["docutils"], "sections": (Section.global_lvl, Section.execute), }, ) @@ -387,7 +387,7 @@ def __post_init__(self): "help": "Overrides for the base render priority of mime types: " "list of (builder name, mime type, priority)", # TODO how to allow this in docutils? - "docutils_exclude": True, + "omit": ["docutils"], "sections": (Section.global_lvl, Section.file_lvl, Section.render), }, repr=False, @@ -454,7 +454,7 @@ def __post_init__(self): metadata={ "validator": deep_mapping(instance_of(str), instance_of((str, int))), "help": "Options for image outputs (class|alt|height|width|scale|align)", - "docutils_exclude": True, + "omit": ["docutils"], # TODO backward-compatible change to "image_options"? "cell_key": "image", "sections": ( @@ -471,7 +471,7 @@ def __post_init__(self): metadata={ "validator": deep_mapping(instance_of(str), instance_of((str, int))), "help": "Options for figure outputs (classes|name|caption|caption_before)", - "docutils_exclude": True, + "omit": ["docutils"], "cell_key": "figure", "sections": ( Section.global_lvl, @@ -505,7 +505,7 @@ def __post_init__(self): instance_of(str), deep_mapping(instance_of(str), instance_of(str)) ), "help": "Javascript to be loaded on pages containing ipywidgets", - "docutils_exclude": True, + "omit": ["docutils"], "sections": (Section.global_lvl, Section.render), }, repr=False, diff --git a/myst_nb/core/read.py b/myst_nb/core/read.py index ad011049..2b3dae4b 100644 --- a/myst_nb/core/read.py +++ b/myst_nb/core/read.py @@ -312,25 +312,22 @@ class _MockDirective: def _read_fenced_cell(token, cell_index, cell_type): - from myst_parser.parsers.directives import ( - DirectiveParsingError, - parse_directive_text, - ) + from myst_parser.parsers.directives import parse_directive_text - try: - _, options, body_lines, _ = parse_directive_text( - directive_class=_MockDirective, - first_line="", - content=token.content, - validate_options=False, - ) - except DirectiveParsingError as err: + result = parse_directive_text( + directive_class=_MockDirective, + first_line="", + content=token.content, + validate_options=False, + ) + if result.warnings: raise MystMetadataParsingError( "{} cell {} at line {} could not be read: {}".format( - cell_type, cell_index, token.map[0] + 1, err + cell_type, cell_index, token.map[0] + 1, result.warnings[0] ) ) - return options, body_lines + + return result.options, result.body def _read_cell_metadata(token, cell_index): diff --git a/myst_nb/core/render.py b/myst_nb/core/render.py index e28b856b..cf81b910 100644 --- a/myst_nb/core/render.py +++ b/myst_nb/core/render.py @@ -310,11 +310,6 @@ class MimeData: """Index of the output in the cell""" line: int | None = None """Source line of the cell""" - md_headings: bool = False - """Whether to render headings in text/markdown blocks.""" - # we can only do this if know the content will be rendered into the main body - # of the document, e.g. not inside a container node - # (otherwise it will break the structure of the AST) @property def string(self) -> str: @@ -598,9 +593,7 @@ def render_markdown(self, data: MimeData) -> list[nodes.Element]: fmt = self.renderer.get_cell_level_config( "render_markdown_format", data.cell_metadata, line=data.line ) - return self._render_markdown_base( - data, fmt=fmt, inline=False, allow_headings=data.md_headings - ) + return self._render_markdown_base(data, fmt=fmt, inline=False) def render_text_plain(self, data: MimeData) -> list[nodes.Element]: """Render a notebook text/plain mime data output.""" @@ -753,9 +746,7 @@ def render_markdown_inline(self, data: MimeData) -> list[nodes.Element]: fmt = self.renderer.get_cell_level_config( "render_markdown_format", data.cell_metadata, line=data.line ) - return self._render_markdown_base( - data, fmt=fmt, inline=True, allow_headings=data.md_headings - ) + return self._render_markdown_base(data, fmt=fmt, inline=True) def render_text_plain_inline(self, data: MimeData) -> list[nodes.Element]: """Render a notebook text/plain mime data output.""" @@ -796,7 +787,7 @@ def render_widget_view_inline(self, data: MimeData) -> list[nodes.Element]: return self.render_widget_view(data) def _render_markdown_base( - self, data: MimeData, *, fmt: str, inline: bool, allow_headings: bool + self, data: MimeData, *, fmt: str, inline: bool ) -> list[nodes.Element]: """Base render for a notebook markdown mime output (block or inline).""" psuedo_element = nodes.Element() # element to hold the parsed markdown @@ -832,7 +823,6 @@ def _render_markdown_base( data.string, data.line or 0, inline=inline, - allow_headings=allow_headings, ) finally: # restore the parser diff --git a/myst_nb/docutils_.py b/myst_nb/docutils_.py index 9738a0f0..01d395b7 100644 --- a/myst_nb/docutils_.py +++ b/myst_nb/docutils_.py @@ -19,9 +19,6 @@ create_warning, token_line, ) -from myst_parser.parsers.docutils_ import ( - DOCUTILS_EXCLUDED_ARGS as DOCUTILS_EXCLUDED_ARGS_MYST, -) from myst_parser.parsers.docutils_ import Parser as MystParser from myst_parser.parsers.docutils_ import create_myst_config, create_myst_settings_spec from myst_parser.parsers.mdit import create_md_parser @@ -81,7 +78,7 @@ class Parser(MystParser): settings_spec = ( "MyST-NB options", None, - create_myst_settings_spec(DOCUTILS_EXCLUDED_ARGS, NbParserConfig, "nb_"), + create_myst_settings_spec(NbParserConfig, "nb_"), *MystParser.settings_spec, ) """Runtime settings specification.""" @@ -116,18 +113,14 @@ def _parse(self, inputstring: str, document: nodes.document) -> None: # get markdown parsing configuration try: - md_config = create_myst_config( - document.settings, DOCUTILS_EXCLUDED_ARGS_MYST - ) + md_config = create_myst_config(document.settings) except (TypeError, ValueError) as error: logger.error(f"myst configuration invalid: {error.args[0]}") md_config = MdParserConfig() # get notebook rendering configuration try: - nb_config = create_myst_config( - document.settings, DOCUTILS_EXCLUDED_ARGS, NbParserConfig, "nb_" - ) + nb_config = create_myst_config(document.settings, NbParserConfig, "nb_") except (TypeError, ValueError) as error: logger.error(f"myst-nb configuration invalid: {error.args[0]}") nb_config = NbParserConfig() diff --git a/myst_nb/ext/glue/directives.py b/myst_nb/ext/glue/directives.py index fc63376c..4d42c15a 100644 --- a/myst_nb/ext/glue/directives.py +++ b/myst_nb/ext/glue/directives.py @@ -106,7 +106,6 @@ def run(self) -> List[nodes.Node]: }, output_metadata=result.metadata, line=self.line, - md_headings=True, ) _nodes = result.nb_renderer.render_markdown(mime) self.set_source_info(_nodes) diff --git a/myst_nb/sphinx_.py b/myst_nb/sphinx_.py index 62bd9a7c..8b93410d 100644 --- a/myst_nb/sphinx_.py +++ b/myst_nb/sphinx_.py @@ -13,7 +13,8 @@ from markdown_it.tree import SyntaxTreeNode from myst_parser.config.main import MdParserConfig, merge_file_level from myst_parser.mdit_to_docutils.base import token_line -from myst_parser.mdit_to_docutils.sphinx_ import SphinxRenderer, create_warning +from myst_parser.mdit_to_docutils.sphinx_ import SphinxRenderer +from myst_parser.warnings_ import create_warning from myst_parser.parsers.mdit import create_md_parser from myst_parser.parsers.sphinx_ import MystParser import nbformat diff --git a/pyproject.toml b/pyproject.toml index f0cafba4..cd624d8b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,7 @@ dependencies = [ "ipython", "jupyter-cache>=0.5,<0.7", "nbclient", # nbclient version pinned by jupyter-client - "myst-parser~=0.18.0", + "myst-parser~=1.0.0", "nbformat~=5.0", "pyyaml", "sphinx>=4,<6", @@ -79,7 +79,7 @@ rtd = [ "numpy", "pandas", "plotly", - "sphinx-book-theme>=0.3,<1.1", + "sphinx-book-theme~=1.0.0", "sphinx-copybutton", "sphinx-design~=0.4.0", "sphinxcontrib-bibtex", diff --git a/tests/nb_fixtures/reporter_warnings.txt b/tests/nb_fixtures/reporter_warnings.txt index 813d082c..1e226162 100644 --- a/tests/nb_fixtures/reporter_warnings.txt +++ b/tests/nb_fixtures/reporter_warnings.txt @@ -10,10 +10,9 @@ cells: source: | {unknown}`a` . -:20002: (ERROR/3) Unknown interpreted text role "unknown". +:20002: (WARNING/2) Unknown interpreted text role "unknown". [myst.role_unknown] . - Unknown directive: . cells: @@ -24,7 +23,7 @@ cells: ```{xyz} ``` . -:10003: (ERROR/3) Unknown directive type "xyz". +:10003: (WARNING/2) Unknown directive type: 'xyz' [myst.directive_unknown] . Directive parsing error: @@ -66,5 +65,5 @@ cells: [a]: c . -:20004: (WARNING/2) Duplicate reference definition: A [myst.ref] -. \ No newline at end of file +:20004: (WARNING/2) Duplicate reference definition: A [myst.duplicate_def] +. From eca54213f55209a7ebc4fe053997c7034ac2b1ef Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 11 Apr 2023 12:15:28 +0000 Subject: [PATCH 02/25] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- myst_nb/sphinx_.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/myst_nb/sphinx_.py b/myst_nb/sphinx_.py index 8b93410d..e313162e 100644 --- a/myst_nb/sphinx_.py +++ b/myst_nb/sphinx_.py @@ -14,9 +14,9 @@ from myst_parser.config.main import MdParserConfig, merge_file_level from myst_parser.mdit_to_docutils.base import token_line from myst_parser.mdit_to_docutils.sphinx_ import SphinxRenderer -from myst_parser.warnings_ import create_warning from myst_parser.parsers.mdit import create_md_parser from myst_parser.parsers.sphinx_ import MystParser +from myst_parser.warnings_ import create_warning import nbformat from sphinx.application import Sphinx from sphinx.environment import BuildEnvironment From 5d9ad87af81874a25498bee9022ccd127d89dbcf Mon Sep 17 00:00:00 2001 From: Michael Aye Date: Tue, 11 Apr 2023 15:05:11 +0200 Subject: [PATCH 03/25] DOCS: fix link to gallery (#483) Co-authored-by: Chris Holdgraf From 6cc627411f378b0036baee9bd894cfa823a37969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Hendrik=20M=C3=BCller?= <44469195+kolibril13@users.noreply.github.com> Date: Wed, 12 Apr 2023 19:53:20 +0200 Subject: [PATCH 04/25] Doc: use docs folder in quickstart example (#489) From f597eed1d1f4ed7985ce5630d538394bb292eb4a Mon Sep 17 00:00:00 2001 From: Angus Hollands Date: Thu, 13 Apr 2023 11:36:47 +0100 Subject: [PATCH 05/25] docs: update to latest `sphinx-design` (#486) * docs: fix use of sphinx-design * Update pyproject.toml From 966c70ecd896342c4efc4f447e5a73329838b13f Mon Sep 17 00:00:00 2001 From: Oriol Abril-Pla Date: Thu, 13 Apr 2023 13:20:41 +0200 Subject: [PATCH 06/25] Add ipywidgets javascript (#469) * Add ipywidgets javascript * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Angus Hollands From 09ff078a78d03bb3dc0614aa522d8a6a371f8488 Mon Sep 17 00:00:00 2001 From: Angus Hollands Date: Thu, 13 Apr 2023 12:23:45 +0100 Subject: [PATCH 07/25] fix: use jsdelivr CDN for ipywidgets (#491) * fix: use jsdelivr CDN * chore: bump ipywidgets version to 8.0 * docs: add note about ipywidgets From ee3730e0427a7f4f078dfe276eb698fb453dd355 Mon Sep 17 00:00:00 2001 From: Chris Holdgraf Date: Fri, 21 Apr 2023 05:10:44 -0700 Subject: [PATCH 08/25] MAINT: Create dependabot.yml (#499) From 09a7741d110c6f031a5582f30e64dfab6f1eb6d4 Mon Sep 17 00:00:00 2001 From: Chris Holdgraf Date: Fri, 21 Apr 2023 05:11:05 -0700 Subject: [PATCH 09/25] UPDATE: jupyter-cache v0.6.0 (#498) From 0434b314373a52179fd21983368417db325f612f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Apr 2023 05:12:49 -0700 Subject: [PATCH 10/25] Bump pre-commit/action from 2.0.0 to 3.0.0 (#502) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> From dfa76cb3c67cbec0ef783e65249ce2843f84b2c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Apr 2023 05:22:31 -0700 Subject: [PATCH 11/25] 1Update coconut requirement from ~=1.4.3 to >=1.4.3,<2.3.0 (#504) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index cd624d8b..290d31c6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -71,7 +71,7 @@ rtd = [ "alabaster", "altair", "bokeh", - "coconut>=1.4.3,<3.1.0", + "coconut>=1.4.3,<2.3.0", "ipykernel~=5.5", "ipywidgets", "jupytext>=1.11.2,<1.15.0", From d5c453046f339adadbe4b87d2eb45b0a913fa34a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Apr 2023 05:22:39 -0700 Subject: [PATCH 12/25] Update pytest-cov requirement from ~=3.0 to >=3,<5 (#506) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> From 7d02b193b0ee6f8493ae54fbe56dbbe69f3e2c27 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Apr 2023 05:22:47 -0700 Subject: [PATCH 13/25] Update coverage requirement from ~=6.4 to >=6.4,<8.0 (#505) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> From 9241100da81027502a6a929e4e6e8aa2da054ee8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Hendrik=20M=C3=BCller?= <44469195+kolibril13@users.noreply.github.com> Date: Fri, 21 Apr 2023 14:22:59 +0200 Subject: [PATCH 14/25] DOCS: Hint to avoid Extension error in sphinx-build (#494) Co-authored-by: Chris Holdgraf From 6734eba542274d3b781629c68c15d7de8082400a Mon Sep 17 00:00:00 2001 From: Chris Holdgraf Date: Fri, 21 Apr 2023 05:26:48 -0700 Subject: [PATCH 15/25] RLS: v0.17.2 (#508) From 1682d7678d28ce543f1215e057e2fc08e4e4ea98 Mon Sep 17 00:00:00 2001 From: mmcky Date: Thu, 4 May 2023 08:11:25 +1000 Subject: [PATCH 16/25] update mypy type information for subtype to MystWarnings --- myst_nb/core/render.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/myst_nb/core/render.py b/myst_nb/core/render.py index cf81b910..ef6143fa 100644 --- a/myst_nb/core/render.py +++ b/myst_nb/core/render.py @@ -33,6 +33,8 @@ if TYPE_CHECKING: from markdown_it.tree import SyntaxTreeNode + + from myst_parser.warnings_ import MystWarnings from myst_nb.docutils_ import DocutilsNbRenderer, DocutilsRenderer from myst_nb.sphinx_ import SphinxNbRenderer, SphinxRenderer @@ -95,7 +97,7 @@ def get_cell_level_config( :param cell_metadata: the metadata for the cell """ - def _callback(msg: str, subtype: str): + def _callback(msg: str, subtype: MystWarnings): self.create_warning(msg, line=line, subtype=subtype) return self.nb_config.get_cell_level_config(field, cell_metadata, _callback) From 31c6319e93e3d48c74fdc6414d64c8fe45d7e061 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Apr 2023 02:27:12 -0700 Subject: [PATCH 17/25] Update jupytext requirement from ~=1.11.2 to >=1.11.2,<1.15.0 (#509) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> From 9fb50f763f50c5d5cd1c9ae9e6c90593c5e56566 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 3 May 2023 22:13:43 +0000 Subject: [PATCH 18/25] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- myst_nb/core/render.py | 1 - 1 file changed, 1 deletion(-) diff --git a/myst_nb/core/render.py b/myst_nb/core/render.py index ef6143fa..cad62840 100644 --- a/myst_nb/core/render.py +++ b/myst_nb/core/render.py @@ -33,7 +33,6 @@ if TYPE_CHECKING: from markdown_it.tree import SyntaxTreeNode - from myst_parser.warnings_ import MystWarnings from myst_nb.docutils_ import DocutilsNbRenderer, DocutilsRenderer From fc981b403e8e6278c56a2a3767c5f32be531624b Mon Sep 17 00:00:00 2001 From: mmcky Date: Thu, 4 May 2023 19:03:19 +1000 Subject: [PATCH 19/25] MAINT: remove python=3.7 as EOL is June 2023 (#516) From f7e904fe4c11faceedd565e40158bd847d4072c2 Mon Sep 17 00:00:00 2001 From: mmcky Date: Wed, 17 May 2023 14:12:28 +1000 Subject: [PATCH 20/25] implement similar warning structure as that in myst-parser --- myst_nb/__init__.py | 2 +- myst_nb/core/render.py | 14 ++++---- myst_nb/docutils_.py | 11 +++--- myst_nb/sphinx_.py | 6 ++-- myst_nb/warnings_.py | 80 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 97 insertions(+), 16 deletions(-) create mode 100644 myst_nb/warnings_.py diff --git a/myst_nb/__init__.py b/myst_nb/__init__.py index 7fd25d88..8b156d3a 100644 --- a/myst_nb/__init__.py +++ b/myst_nb/__init__.py @@ -1,5 +1,5 @@ """A docutils/sphinx parser for Jupyter Notebooks.""" -__version__ = "0.17.2" +__version__ = "0.18.0" def setup(app): diff --git a/myst_nb/core/render.py b/myst_nb/core/render.py index cad62840..86394140 100644 --- a/myst_nb/core/render.py +++ b/myst_nb/core/render.py @@ -28,12 +28,12 @@ from myst_nb.core.config import NbParserConfig from myst_nb.core.execute import NotebookClientBase -from myst_nb.core.loggers import DEFAULT_LOG_TYPE, LoggerType +from myst_nb.core.loggers import LoggerType # DEFAULT_LOG_TYPE, from myst_nb.core.utils import coalesce_streams +from myst_nb.warnings_ import MystNBWarnings if TYPE_CHECKING: from markdown_it.tree import SyntaxTreeNode - from myst_parser.warnings_ import MystWarnings from myst_nb.docutils_ import DocutilsNbRenderer, DocutilsRenderer from myst_nb.sphinx_ import SphinxNbRenderer, SphinxRenderer @@ -96,7 +96,7 @@ def get_cell_level_config( :param cell_metadata: the metadata for the cell """ - def _callback(msg: str, subtype: MystWarnings): + def _callback(msg: str, subtype: MystNBWarnings): self.create_warning(msg, line=line, subtype=subtype) return self.nb_config.get_cell_level_config(field, cell_metadata, _callback) @@ -225,8 +225,8 @@ def _get_nb_source_code_lexer( # TODO allow user to set default lexer? self.create_warning( f"No source code lexer found for notebook cell {cell_index + 1}", - wtype=DEFAULT_LOG_TYPE, - subtype="lexer", + # wtype=DEFAULT_LOG_TYPE, + subtype=MystNBWarnings.LEXER, line=line, append_to=self.current_node, ) @@ -980,8 +980,8 @@ def create_figure_context( self.create_warning( "Figure caption must be a paragraph or empty comment.", line=line, - wtype=DEFAULT_LOG_TYPE, - subtype="fig_caption", + # wtype=DEFAULT_LOG_TYPE, + subtype=MystNBWarnings.FIG_CAPTION, ) self.current_node.append(figure_node) diff --git a/myst_nb/docutils_.py b/myst_nb/docutils_.py index 01d395b7..d094dbb3 100644 --- a/myst_nb/docutils_.py +++ b/myst_nb/docutils_.py @@ -29,7 +29,7 @@ from myst_nb import static from myst_nb.core.config import NbParserConfig from myst_nb.core.execute import create_client -from myst_nb.core.loggers import DEFAULT_LOG_TYPE, DocutilsDocLogger +from myst_nb.core.loggers import DocutilsDocLogger # DEFAULT_LOG_TYPE, from myst_nb.core.nb_to_tokens import nb_node_to_dict, notebook_to_tokens from myst_nb.core.read import ( NbReader, @@ -47,6 +47,7 @@ ) from myst_nb.ext.eval import load_eval_docutils from myst_nb.ext.glue import load_glue_docutils +from myst_nb.warnings_ import MystNBWarnings DOCUTILS_EXCLUDED_ARGS = list( {f.name for f in NbParserConfig.get_fields() if f.metadata.get("docutils_exclude")} @@ -308,8 +309,8 @@ def _render_nb_cell_code_outputs( f"(cell<{cell_index}>.output<{output_index}>", line=line, append_to=self.current_node, - wtype=DEFAULT_LOG_TYPE, - subtype="mime_type", + # wtype=DEFAULT_LOG_TYPE, + subtype=MystNBWarnings.MIME_TYPE, ) else: figure_options = ( @@ -338,8 +339,8 @@ def _render_nb_cell_code_outputs( f"Unsupported output type: {output.output_type}", line=line, append_to=self.current_node, - wtype=DEFAULT_LOG_TYPE, - subtype="output_type", + # wtype=DEFAULT_LOG_TYPE, + subtype=MystNBWarnings.OUTPUT_TYPE, ) diff --git a/myst_nb/sphinx_.py b/myst_nb/sphinx_.py index e313162e..56eef56c 100644 --- a/myst_nb/sphinx_.py +++ b/myst_nb/sphinx_.py @@ -16,7 +16,6 @@ from myst_parser.mdit_to_docutils.sphinx_ import SphinxRenderer from myst_parser.parsers.mdit import create_md_parser from myst_parser.parsers.sphinx_ import MystParser -from myst_parser.warnings_ import create_warning import nbformat from sphinx.application import Sphinx from sphinx.environment import BuildEnvironment @@ -39,6 +38,7 @@ get_mime_priority, load_renderer, ) +from myst_nb.warnings_ import MystNBWarnings, create_warning SPHINX_LOGGER = sphinx_logging.getLogger(__name__) @@ -306,8 +306,8 @@ def _render_nb_cell_code_outputs( f"Unsupported output type: {output.output_type}", line=line, append_to=self.current_node, - wtype=DEFAULT_LOG_TYPE, - subtype="output_type", + # wtype=DEFAULT_LOG_TYPE, + subtype=MystNBWarnings.OUTPUT_TYPE, ) diff --git a/myst_nb/warnings_.py b/myst_nb/warnings_.py new file mode 100644 index 00000000..48552c65 --- /dev/null +++ b/myst_nb/warnings_.py @@ -0,0 +1,80 @@ +"""Central handling of warnings for the myst-nb extension.""" +from __future__ import annotations + +from enum import Enum +from typing import Sequence + +from docutils import nodes + + +class MystNBWarnings(Enum): + """MySTNB warning types.""" + + LEXER = "lexer" + """Issue resolving lexer""" + + FIG_CAPTION = "fig_caption" + """Issue resoliving figure caption""" + + MIME_TYPE = "mime_type" + """Issue resolving MIME type""" + OUTPUT_TYPE = "output_type" + """Issue resolving Output type""" + + +def _is_suppressed_warning( + type: str, subtype: str, suppress_warnings: Sequence[str] +) -> bool: + """Check whether the warning is suppressed or not. + + Mirrors: + https://github.com/sphinx-doc/sphinx/blob/47d9035bca9e83d6db30a0726a02dc9265bd66b1/sphinx/util/logging.py + """ + if type is None: + return False + + subtarget: str | None + + for warning_type in suppress_warnings: + if "." in warning_type: + target, subtarget = warning_type.split(".", 1) + else: + target, subtarget = warning_type, None + + if target == type and subtarget in (None, subtype, "*"): + return True + + return False + + +def create_warning( + document: nodes.document, + message: str, + subtype: MystNBWarnings, + *, + line: int | None = None, + append_to: nodes.Element | None = None, +) -> nodes.system_message | None: + """Generate a warning, logging if it is necessary. + + If the warning type is listed in the ``suppress_warnings`` configuration, + then ``None`` will be returned and no warning logged. + """ + wtype = "myst-nb" + # figure out whether to suppress the warning, if sphinx is available, + # it will have been set up by the Sphinx environment, + # otherwise we will use the configuration set by docutils + suppress_warnings: Sequence[str] = [] + try: + suppress_warnings = document.settings.env.app.config.suppress_warnings + except AttributeError: + suppress_warnings = document.settings.myst_suppress_warnings or [] + if _is_suppressed_warning(wtype, subtype.value, suppress_warnings): + return None + + kwargs = {"line": line} if line is not None else {} + message = f"{message} [{wtype}.{subtype.value}]" + msg_node = document.reporter.warning(message, **kwargs) + if append_to is not None: + append_to.append(msg_node) + return msg_node \ No newline at end of file From 184856b791debd84c3070ba128582259be53a6ea Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 04:12:53 +0000 Subject: [PATCH 21/25] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- myst_nb/warnings_.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/myst_nb/warnings_.py b/myst_nb/warnings_.py index 48552c65..55cdad5d 100644 --- a/myst_nb/warnings_.py +++ b/myst_nb/warnings_.py @@ -77,4 +77,4 @@ def create_warning( msg_node = document.reporter.warning(message, **kwargs) if append_to is not None: append_to.append(msg_node) - return msg_node \ No newline at end of file + return msg_node From 8b90dce7b5f89afad400af17ba55df256c3dca4b Mon Sep 17 00:00:00 2001 From: Josh Mitchell Date: Thu, 8 Jun 2023 16:33:29 +1000 Subject: [PATCH 22/25] Fix create_warnings mypy errors --- myst_nb/core/render.py | 11 ++++++----- myst_nb/docutils_.py | 14 ++++++-------- myst_nb/sphinx_.py | 3 ++- myst_nb/warnings_.py | 20 +++++++++++++++++++- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/myst_nb/core/render.py b/myst_nb/core/render.py index 86394140..54f1762d 100644 --- a/myst_nb/core/render.py +++ b/myst_nb/core/render.py @@ -30,7 +30,7 @@ from myst_nb.core.execute import NotebookClientBase from myst_nb.core.loggers import LoggerType # DEFAULT_LOG_TYPE, from myst_nb.core.utils import coalesce_streams -from myst_nb.warnings_ import MystNBWarnings +from myst_nb.warnings_ import MystNBWarnings, create_warning if TYPE_CHECKING: from markdown_it.tree import SyntaxTreeNode @@ -58,7 +58,6 @@ class MditRenderMixin: # required by mypy md_options: dict[str, Any] document: nodes.document - create_warning: Any render_children: Any add_line_and_source_path: Any add_line_and_source_path_r: Any @@ -97,7 +96,7 @@ def get_cell_level_config( """ def _callback(msg: str, subtype: MystNBWarnings): - self.create_warning(msg, line=line, subtype=subtype) + create_warning(self.document, msg, line=line, subtype=subtype) return self.nb_config.get_cell_level_config(field, cell_metadata, _callback) @@ -223,7 +222,8 @@ def _get_nb_source_code_lexer( # TODO this will create a warning for every cell, but perhaps # it should only be a single warning for the notebook (as previously) # TODO allow user to set default lexer? - self.create_warning( + create_warning( + self.document, f"No source code lexer found for notebook cell {cell_index + 1}", # wtype=DEFAULT_LOG_TYPE, subtype=MystNBWarnings.LEXER, @@ -977,7 +977,8 @@ def create_figure_context( caption.source = self.document["source"] caption.line = line elif not (isinstance(first_node, nodes.comment) and len(first_node) == 0): - self.create_warning( + create_warning( + self.document, "Figure caption must be a paragraph or empty comment.", line=line, # wtype=DEFAULT_LOG_TYPE, diff --git a/myst_nb/docutils_.py b/myst_nb/docutils_.py index d094dbb3..7da9c6db 100644 --- a/myst_nb/docutils_.py +++ b/myst_nb/docutils_.py @@ -14,11 +14,7 @@ from markdown_it.token import Token from markdown_it.tree import SyntaxTreeNode from myst_parser.config.main import MdParserConfig, merge_file_level -from myst_parser.mdit_to_docutils.base import ( - DocutilsRenderer, - create_warning, - token_line, -) +from myst_parser.mdit_to_docutils.base import DocutilsRenderer, token_line from myst_parser.parsers.docutils_ import Parser as MystParser from myst_parser.parsers.docutils_ import create_myst_config, create_myst_settings_spec from myst_parser.parsers.mdit import create_md_parser @@ -47,7 +43,7 @@ ) from myst_nb.ext.eval import load_eval_docutils from myst_nb.ext.glue import load_glue_docutils -from myst_nb.warnings_ import MystNBWarnings +from myst_nb.warnings_ import MystNBWarnings, create_warning DOCUTILS_EXCLUDED_ARGS = list( {f.name for f in NbParserConfig.get_fields() if f.metadata.get("docutils_exclude")} @@ -304,7 +300,8 @@ def _render_nb_cell_code_outputs( mime_type = next(x for x in mime_priority if x in output["data"]) except StopIteration: if output["data"]: - self.create_warning( + create_warning( + self.document, "No output mime type found from render_priority " f"(cell<{cell_index}>.output<{output_index}>", line=line, @@ -335,7 +332,8 @@ def _render_nb_cell_code_outputs( self.current_node.extend(_nodes) self.add_line_and_source_path_r(_nodes, token) else: - self.create_warning( + create_warning( + self.document, f"Unsupported output type: {output.output_type}", line=line, append_to=self.current_node, diff --git a/myst_nb/sphinx_.py b/myst_nb/sphinx_.py index 56eef56c..dba36531 100644 --- a/myst_nb/sphinx_.py +++ b/myst_nb/sphinx_.py @@ -302,7 +302,8 @@ def _render_nb_cell_code_outputs( self.add_line_and_source_path_r([mime_bundle], token) self.current_node.append(mime_bundle) else: - self.create_warning( + create_warning( + self.document, f"Unsupported output type: {output.output_type}", line=line, append_to=self.current_node, diff --git a/myst_nb/warnings_.py b/myst_nb/warnings_.py index 55cdad5d..3679b2be 100644 --- a/myst_nb/warnings_.py +++ b/myst_nb/warnings_.py @@ -5,6 +5,14 @@ from typing import Sequence from docutils import nodes +from myst_parser.warnings_ import MystWarnings +from myst_parser.warnings_ import create_warning as myst_parser_create_warnings + +__all__ = [ + "MystWarnings", + "MystNBWarnings", + "create_warning", +] class MystNBWarnings(Enum): @@ -50,7 +58,7 @@ def _is_suppressed_warning( def create_warning( document: nodes.document, message: str, - subtype: MystNBWarnings, + subtype: MystNBWarnings | MystWarnings, *, line: int | None = None, append_to: nodes.Element | None = None, @@ -60,6 +68,16 @@ def create_warning( If the warning type is listed in the ``suppress_warnings`` configuration, then ``None`` will be returned and no warning logged. """ + # Pass off Myst Parser warnings to that package + if isinstance(subtype, MystWarnings): + myst_parser_create_warnings( + document=document, + message=message, + subtype=subtype, + line=line, + append_to=append_to, + ) + wtype = "myst-nb" # figure out whether to suppress the warning, if sphinx is available, # it will have been set up by the Sphinx environment, From 4396dfcf59c29c34809ab535cdc73f787e656f95 Mon Sep 17 00:00:00 2001 From: Angus Hollands Date: Fri, 23 Jun 2023 10:31:34 +0100 Subject: [PATCH 23/25] Update myst_nb/core/config.py to new warnings system Co-authored-by: Josh Mitchell --- myst_nb/core/config.py | 11 ++++++++--- myst_nb/warnings_.py | 5 +++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/myst_nb/core/config.py b/myst_nb/core/config.py index 1c7b2d36..2f73f607 100644 --- a/myst_nb/core/config.py +++ b/myst_nb/core/config.py @@ -14,6 +14,8 @@ ) from typing_extensions import Literal +from myst_nb.warnings_ import MystNBWarnings + def custom_formats_converter(value: dict) -> Dict[str, Tuple[str, dict, bool]]: """Convert the custom format dict.""" @@ -567,7 +569,7 @@ def get_cell_level_config( self, field_name: str, cell_metadata: Dict[str, Any], - warning_callback: Callable[[str, str], Any], + warning_callback: Callable[[str, MystNBWarnings], Any], ) -> Any: """Get a configuration value at the cell level. @@ -593,7 +595,7 @@ def get_cell_level_config( warning_callback( f"Deprecated `cell_metadata_key` 'render' " f"found, replace with {self.cell_metadata_key!r}", - "cell_metadata_key", + MystNBWarnings.CELL_METADATA_KEY, ) cell_meta = cell_metadata["render"] else: @@ -611,7 +613,10 @@ def get_cell_level_config( field.metadata["validator"](self, field, value) return value except Exception as exc: - warning_callback(f"Cell metadata invalid: {exc}", "cell_config") + warning_callback( + f"Cell metadata invalid: {exc}", + MystNBWarnings.CELL_CONFIG, + ) # default/global/file level should have already been merged return getattr(self, field.name) diff --git a/myst_nb/warnings_.py b/myst_nb/warnings_.py index 3679b2be..de8e66ce 100644 --- a/myst_nb/warnings_.py +++ b/myst_nb/warnings_.py @@ -29,6 +29,11 @@ class MystNBWarnings(Enum): OUTPUT_TYPE = "output_type" """Issue resolving Output type""" + CELL_METADATA_KEY = "cell_metadata_key" + """Issue with a key in a cell's `metadata` dictionary.""" + CELL_CONFIG = "cell_config" + """Issue with a cell's configuration or metadata.""" + def _is_suppressed_warning( type: str, subtype: str, suppress_warnings: Sequence[str] From b13d8840b9a01f78383c01526130fbb16c886e95 Mon Sep 17 00:00:00 2001 From: Angus Hollands Date: Fri, 23 Jun 2023 10:40:40 +0100 Subject: [PATCH 24/25] fix: use same Literal as myst-parser --- myst_nb/core/config.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/myst_nb/core/config.py b/myst_nb/core/config.py index 2f73f607..f8468afa 100644 --- a/myst_nb/core/config.py +++ b/myst_nb/core/config.py @@ -1,6 +1,7 @@ """Configuration for myst-nb.""" import dataclasses as dc from enum import Enum +import sys from typing import Any, Callable, Dict, Iterable, Optional, Sequence, Tuple from myst_parser.config.dc_validators import ( @@ -12,7 +13,11 @@ optional, validate_fields, ) -from typing_extensions import Literal + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from typing_extensions import Literal # noqa: F401 from myst_nb.warnings_ import MystNBWarnings From 3d0a6dea4d668953bc7296f98c7f53f13ed1f6f1 Mon Sep 17 00:00:00 2001 From: Josh Mitchell Date: Sat, 24 Jun 2023 21:11:57 +1000 Subject: [PATCH 25/25] Fix Intersphinx links in documentation --- CHANGELOG.md | 4 ++-- docs/authoring/custom-formats.Rmd | 2 +- docs/authoring/jupyter-notebooks.md | 16 ++++++++-------- docs/index.md | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0191248..0699e778 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -92,7 +92,7 @@ WARNING: 'jupyter_execute_notebooks' is deprecated for 'nb_execution_mode' [myst `nb_render_priority` has been removed and replaced by `nb_mime_priority_overrides`, which has a different format and is more flexible. See [Outputs MIME priority](docs/render/format_code_cells.md) for more information. -As per the changes in [`myst_parser`](myst:develop/_changelog), the `dollarmath` syntax extension is no longer included by default. +As per the changes in [`myst_parser`](inv:myst#develop/_changelog), the `dollarmath` syntax extension is no longer included by default. To re-add this extension, ensure that it is specified in your `conf.py`: `myst_enable_extensions = ["dollarmath"]`. For cell-level configuration the top-level key `render` has now been deprecated for `mystnb`. @@ -168,7 +168,7 @@ See [Embedding outputs as variables](docs/render/glue.md) for more details. - `nbconvert` - Updated: - `Python`: `3.6+ -> 3.7+` - - `myst_parser`: [`0.15 -> 0.17`](myst:develop/_changelog) + - `myst_parser`: [`0.15 -> 0.17`](inv:myst#develop/_changelog) - `jupyter-cache`: [`0.4 -> 0.5`](https://github.com/executablebooks/jupyter-cache/blob/master/CHANGELOG.md) - `sphinx-togglebutton`: [`0.1 -> 0.3`](https://sphinx-togglebutton.readthedocs.io/en/latest/changelog.html) diff --git a/docs/authoring/custom-formats.Rmd b/docs/authoring/custom-formats.Rmd index c682702c..7575d250 100644 --- a/docs/authoring/custom-formats.Rmd +++ b/docs/authoring/custom-formats.Rmd @@ -21,7 +21,7 @@ nb_custom_formats = { ``` - The string should be a Python function that will be loaded by `import mylibrary.converter_function` -- The function should take a file's contents (as a `str`) and return an [nbformat.NotebookNode](nbformat:api) +- The function should take a file's contents (as a `str`) and return an [nbformat.NotebookNode](inv:nbformat#api) If the function takes additional keyword arguments, then you can specify these as dictionary in a second argument. For example this is what the default conversion would look like: diff --git a/docs/authoring/jupyter-notebooks.md b/docs/authoring/jupyter-notebooks.md index 945ab336..58b1f71a 100644 --- a/docs/authoring/jupyter-notebooks.md +++ b/docs/authoring/jupyter-notebooks.md @@ -16,13 +16,13 @@ Sphinx using the MyST parser.[^download] :::{seealso} For more information about what you can write with MyST Markdown, see the -[MyST Parser documentation](myst:intro/get-started). +[MyST Parser documentation](inv:myst#intro/get-started). ::: ### Configuration -The MyST-NB parser derives from [the base MyST-Parser](myst:intro/get-started), and so all the same configuration options are available. -See the [MyST configuration options](myst:sphinx/config-options) for the full set of options, and [MyST syntax guide](myst:syntax/core) for all the syntax options. +The MyST-NB parser derives from [the base MyST-Parser](inv:myst#intro/get-started), and so all the same configuration options are available. +See the [MyST configuration options](inv:myst#sphinx/config-options) for the full set of options, and [MyST syntax guide](inv:myst#syntax/core) for all the syntax options. To build documentation from this notebook, the following options are set: @@ -38,7 +38,7 @@ myst_url_schemes = ("http", "https", "mailto") ``` :::{note} -Loading the `myst_nb` extension also activates the [`myst_parser`](myst:index) extension, for enabling the MyST flavour of Markdown. +Loading the `myst_nb` extension also activates the [`myst_parser`](inv:myst#index) extension, for enabling the MyST flavour of Markdown. It is not required to add this explicitly in the list of `extensions`. ::: @@ -53,7 +53,7 @@ For example, here's the MyST-NB logo: ![myst-nb logo](../_static/logo-wide.svg) -By adding `"html_image"` to the `myst_enable_extensions` list in the sphinx configuration ([see here](myst:syntax/images)), you can even add HTML `img` tags with attributes: +By adding `"html_image"` to the `myst_enable_extensions` list in the sphinx configuration ([see here](inv:myst#syntax/images)), you can even add HTML `img` tags with attributes: ```html logo @@ -66,7 +66,7 @@ For example, here's a note admonition block: :::::{note} **Wow**, a note! -It was generated with this code ([as explained here](myst:syntax/admonitions)): +It was generated with this code ([as explained here](inv:myst:std:label#syntax/admonitions)): ````md :::{note} @@ -77,7 +77,7 @@ It was generated with this code ([as explained here](myst:syntax/admonitions)): ::::: If you wish to use "bare" LaTeX equations, then you should add `"amsmath"` to the `myst_enable_extensions` list in the sphinx configuration. -This is [explained here](myst:syntax/amsmath), and works as such: +This is [explained here](inv:myst:std:label#syntax/amsmath), and works as such: ```latex \begin{equation} @@ -110,7 +110,7 @@ $$e^{i\pi} + 1 = 0$$ (euler) Euler's identity, equation {math:numref}`euler`, was elected one of the most beautiful mathematical formulas. -You can see the syntax used for this example [here in the MyST documentation](myst:syntax/math). +You can see the syntax used for this example [here in the MyST documentation](inv:myst:std:label#syntax/math). ## Code cells and outputs diff --git a/docs/index.md b/docs/index.md index 06fef4a1..d75b9260 100644 --- a/docs/index.md +++ b/docs/index.md @@ -86,7 +86,7 @@ Build single or collections of documents into multiple formats (HTML, PDF, ...). MyST-NB is a module within the [Executable Books Project](https://executablebooks.org), an international collaboration to build open source tools that facilitate publishing computational narratives using the Jupyter ecosystem. -It is also a core component of [Jupyter Book](jb:intro). +It is also a core component of [Jupyter Book](inv:jb#intro). Check out the [Gallery of Jupyter Books](https://executablebooks.org/en/latest/gallery), for inspiration from across the community.