Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 31 additions & 14 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import json
import os
from pathlib import Path
import re
import uuid

import bs4
Expand All @@ -15,6 +16,7 @@
import nbformat as nbf
import pytest
import sphinx
from sphinx import version_info as sphinx_version_info
from sphinx.util.console import nocolor

pytest_plugins = "sphinx.testing.fixtures"
Expand Down Expand Up @@ -148,11 +150,11 @@ def test_something(sphinx_run):


@pytest.fixture()
def sphinx_run(sphinx_params, make_app, tempdir):
def sphinx_run(sphinx_params, make_app, tmp_path):
"""A fixture to setup and run a sphinx build, in a sandboxed folder.

The `myst_nb` extension ius added by default,
and the first file will be set as the materdoc
The `myst_nb` extension is added by default,
and the first file will be set as the masterdoc

"""
assert len(sphinx_params["files"]) > 0, sphinx_params["files"]
Expand All @@ -169,13 +171,11 @@ def sphinx_run(sphinx_params, make_app, tempdir):

current_dir = os.getcwd()
if "working_dir" in sphinx_params:
from sphinx.testing.path import path

base_dir = path(sphinx_params["working_dir"]) / str(uuid.uuid4())
base_dir = Path(sphinx_params["working_dir"]) / str(uuid.uuid4())
else:
base_dir = tempdir
base_dir = tmp_path
srcdir = base_dir / "source"
srcdir.makedirs(exist_ok=True)
srcdir.mkdir(exist_ok=True)
os.chdir(base_dir)
(srcdir / "conf.py").write_text(
"# conf overrides (passed directly to sphinx):\n"
Expand All @@ -188,11 +188,24 @@ def sphinx_run(sphinx_params, make_app, tempdir):
for nb_file in sphinx_params["files"]:
nb_path = TEST_FILE_DIR.joinpath(nb_file)
assert nb_path.exists(), nb_path
(srcdir / nb_file).parent.makedirs(exist_ok=True)
(srcdir / nb_file).write_text(nb_path.read_text(encoding="utf8"))
(srcdir / nb_file).parent.mkdir(exist_ok=True)
(srcdir / nb_file).write_text(
nb_path.read_text(encoding="utf-8"), encoding="utf-8"
)

nocolor()
app = make_app(buildername=buildername, srcdir=srcdir, confoverrides=confoverrides)

# For compatibility with multiple versions of sphinx, convert pathlib.Path to
# sphinx.testing.path.path here.
if sphinx_version_info >= (7, 2):
app_srcdir = srcdir
else:
from sphinx.testing.path import path

app_srcdir = path(os.fspath(srcdir))
app = make_app(
buildername=buildername, srcdir=app_srcdir, confoverrides=confoverrides
)

yield SphinxFixture(app, sphinx_params["files"])

Expand Down Expand Up @@ -259,7 +272,6 @@ def _func(doctree):
return _func


# TODO Remove when support for Sphinx<=6 is dropped,
# comparison files will need updating
# alternatively the resolution of https://github.com/ESSS/pytest-regressions/issues/32
@pytest.fixture()
Expand All @@ -268,7 +280,12 @@ def file_regression(file_regression):


class FileRegression:
ignores = (" translation_progress=\"{'total': 0, 'translated': 0}\"",)
ignores = (
# TODO: Remove when support for Sphinx<=6 is dropped,
re.escape(" translation_progress=\"{'total': 0, 'translated': 0}\""),
# TODO: Remove when support for Sphinx<7.2 is dropped,
r"original_uri=\"[^\"]*\"\s",
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a hack. But, I don't think it's the end of the world.

)

def __init__(self, file_regression):
self.file_regression = file_regression
Expand All @@ -278,5 +295,5 @@ def check(self, data, **kwargs):

def _strip_ignores(self, data):
for ig in self.ignores:
data = data.replace(ig, "")
data = re.sub(ig, "", data)
return data
25 changes: 18 additions & 7 deletions tests/test_cli.py
Original file line number Diff line number Diff line change
@@ -1,27 +1,38 @@
"""Test the quickstart CLI"""
import os
from pathlib import Path

import nbformat
from sphinx.testing.path import path as sphinx_path
from sphinx import version_info as sphinx_version_info

from myst_nb.cli import md_to_nb, quickstart


def test_quickstart(tmp_path: Path, make_app):
"""Test the quickstart CLI builds a valid sphinx project."""
path = tmp_path / "project"
quickstart([str(path)])
assert {p.name for p in path.iterdir()} == {
project_path = tmp_path / "project"
quickstart([str(project_path)])
assert {p.name for p in project_path.iterdir()} == {
".gitignore",
"conf.py",
"index.md",
"notebook1.ipynb",
"notebook2.md",
}
app = make_app(srcdir=sphinx_path(str(path)), buildername="html")

# For compatibility with multiple versions of sphinx, convert pathlib.Path to
# sphinx.testing.path.path here.
if sphinx_version_info >= (7, 2):
app_srcdir = project_path
else:
from sphinx.testing.path import path

app_srcdir = path(os.fspath(project_path))

app = make_app(srcdir=app_srcdir, buildername="html")
app.build()
assert app._warning.getvalue().strip() == ""
assert (path / "_build/html/index.html").exists()
assert (project_path / "_build/html/index.html").exists()


def test_md_to_nb(tmp_path: Path):
Expand All @@ -38,7 +49,7 @@ def test_md_to_nb(tmp_path: Path):
+++
next cell
""",
"utf8",
"utf-8",
)
md_to_nb([str(path)])
assert path.exists()
Expand Down
14 changes: 10 additions & 4 deletions tests/test_codecell_file.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,14 @@ def test_codecell_file(sphinx_run, file_regression, check_nbs, get_test_path):
}
try:
file_regression.check(
sphinx_run.get_nb(), check_fn=check_nbs, extension=".ipynb", encoding="utf8"
sphinx_run.get_nb(),
check_fn=check_nbs,
extension=".ipynb",
encoding="utf-8",
)
finally:
file_regression.check(
sphinx_run.get_doctree().pformat(), extension=".xml", encoding="utf8"
sphinx_run.get_doctree().pformat(), extension=".xml", encoding="utf-8"
)


Expand Down Expand Up @@ -73,9 +76,12 @@ def test_codecell_file_warnings(sphinx_run, file_regression, check_nbs, get_test
}
try:
file_regression.check(
sphinx_run.get_nb(), check_fn=check_nbs, extension=".ipynb", encoding="utf8"
sphinx_run.get_nb(),
check_fn=check_nbs,
extension=".ipynb",
encoding="utf-8",
)
finally:
file_regression.check(
sphinx_run.get_doctree().pformat(), extension=".xml", encoding="utf8"
sphinx_run.get_doctree().pformat(), extension=".xml", encoding="utf-8"
)
2 changes: 1 addition & 1 deletion tests/test_eval.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ def test_sphinx(sphinx_run, clean_doctree, file_regression):
doctree = clean_doctree(sphinx_run.get_resolved_doctree("with_eval"))
file_regression.check(
doctree.pformat(),
encoding="utf8",
encoding="utf-8",
)
11 changes: 7 additions & 4 deletions tests/test_execute.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@
def regress_nb_doc(file_regression, sphinx_run, check_nbs):
try:
file_regression.check(
sphinx_run.get_nb(), check_fn=check_nbs, extension=".ipynb", encoding="utf8"
sphinx_run.get_nb(),
check_fn=check_nbs,
extension=".ipynb",
encoding="utf-8",
)
finally:
doctree_string = sphinx_run.get_doctree().pformat()
Expand All @@ -31,7 +34,7 @@ def regress_nb_doc(file_regression, sphinx_run, check_nbs):
doctree_string = doctree_string.replace(
Path(sphinx_run.app.srcdir).as_posix() + "/", ""
)
file_regression.check(doctree_string, extension=".xml", encoding="utf8")
file_regression.check(doctree_string, extension=".xml", encoding="utf-8")


@pytest.mark.sphinx_params("basic_unrun.ipynb", conf={"nb_execution_mode": "auto"})
Expand Down Expand Up @@ -112,7 +115,7 @@ def test_exclude_path(sphinx_run, file_regression):
assert not NbMetadataCollector.new_exec_data(sphinx_run.env)
assert "Executing" not in sphinx_run.status(), sphinx_run.status()
file_regression.check(
sphinx_run.get_doctree().pformat(), extension=".xml", encoding="utf8"
sphinx_run.get_doctree().pformat(), extension=".xml", encoding="utf-8"
)


Expand Down Expand Up @@ -317,7 +320,7 @@ def test_nb_exec_table(sphinx_run, file_regression):
# print(sphinx_run.status())
assert not sphinx_run.warnings()
file_regression.check(
sphinx_run.get_doctree().pformat(), extension=".xml", encoding="utf8"
sphinx_run.get_doctree().pformat(), extension=".xml", encoding="utf-8"
)
# print(sphinx_run.get_html())
rows = sphinx_run.get_html().select("table.docutils tr")
Expand Down
2 changes: 1 addition & 1 deletion tests/test_glue.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,5 +112,5 @@ def test_parser(sphinx_run, clean_doctree, file_regression):
doctree = clean_doctree(sphinx_run.get_resolved_doctree("with_glue"))
file_regression.check(
doctree.pformat(),
encoding="utf8",
encoding="utf-8",
)
15 changes: 10 additions & 5 deletions tests/test_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,14 @@ def test_basic_run(sphinx_run, file_regression):
"name": "python3",
}
file_regression.check(
sphinx_run.get_doctree().pformat(), extension=".xml", encoding="utf8"
sphinx_run.get_doctree().pformat(), extension=".xml", encoding="utf-8"
)

filenames = {
p for p in (sphinx_run.app.srcdir / "_build" / "jupyter_execute").listdir()
p.name
for p in Path(
os.fspath(sphinx_run.app.srcdir / "_build" / "jupyter_execute")
).iterdir()
}
assert filenames == {"basic_run.ipynb"}

Expand Down Expand Up @@ -64,11 +67,13 @@ def test_complex_outputs(sphinx_run, file_regression):
doctree_string = doctree_string.replace(
Path(sphinx_run.app.srcdir).as_posix() + "/", ""
)
file_regression.check(doctree_string, extension=".xml", encoding="utf8")
file_regression.check(doctree_string, extension=".xml", encoding="utf-8")

filenames = {
p.replace(".jpeg", ".jpg")
for p in (sphinx_run.app.srcdir / "_build" / "jupyter_execute").listdir()
p.name.replace(".jpeg", ".jpg")
for p in Path(
os.fspath(sphinx_run.app.srcdir / "_build" / "jupyter_execute")
).iterdir()
}
# print(filenames)
assert filenames == {
Expand Down
24 changes: 12 additions & 12 deletions tests/test_render_outputs.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,23 +24,23 @@ def test_basic_run(sphinx_run, file_regression):
sphinx_run.build()
assert sphinx_run.warnings() == ""
doctree = sphinx_run.get_resolved_doctree("basic_run")
file_regression.check(doctree.pformat(), extension=".xml", encoding="utf8")
file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8")


@pytest.mark.sphinx_params("file_level_config.md")
def test_file_level_config_md(sphinx_run, file_regression):
sphinx_run.build()
assert sphinx_run.warnings() == ""
doctree = sphinx_run.get_resolved_doctree("file_level_config")
file_regression.check(doctree.pformat(), extension=".xml", encoding="utf8")
file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8")


@pytest.mark.sphinx_params("file_level_config.ipynb")
def test_file_level_config_ipynb(sphinx_run, file_regression):
sphinx_run.build()
assert sphinx_run.warnings() == ""
doctree = sphinx_run.get_resolved_doctree("file_level_config")
file_regression.check(doctree.pformat(), extension=".xml", encoding="utf8")
file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8")


@pytest.mark.sphinx_params("complex_outputs.ipynb", conf={"nb_execution_mode": "off"})
Expand All @@ -49,7 +49,7 @@ def test_complex_outputs(sphinx_run, clean_doctree, file_regression):
assert sphinx_run.warnings() == ""
doctree = clean_doctree(sphinx_run.get_resolved_doctree("complex_outputs"))
file_regression.check(
doctree.pformat().replace(".jpeg", ".jpg"), extension=".xml", encoding="utf8"
doctree.pformat().replace(".jpeg", ".jpg"), extension=".xml", encoding="utf-8"
)


Expand All @@ -63,7 +63,7 @@ def test_complex_outputs_latex(sphinx_run, clean_doctree, file_regression):
assert sphinx_run.warnings() == ""
doctree = clean_doctree(sphinx_run.get_resolved_doctree("complex_outputs"))
file_regression.check(
doctree.pformat().replace(".jpeg", ".jpg"), extension=".xml", encoding="utf8"
doctree.pformat().replace(".jpeg", ".jpg"), extension=".xml", encoding="utf-8"
)


Expand All @@ -76,7 +76,7 @@ def test_stderr_remove(sphinx_run, file_regression):
sphinx_run.build()
assert sphinx_run.warnings() == ""
doctree = sphinx_run.get_resolved_doctree("basic_stderr")
file_regression.check(doctree.pformat(), extension=".xml", encoding="utf8")
file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8")


@pytest.mark.sphinx_params("basic_stderr.ipynb", conf={"nb_execution_mode": "off"})
Expand All @@ -87,7 +87,7 @@ def test_stderr_tag(sphinx_run, file_regression):
sphinx_run.build()
assert sphinx_run.warnings() == ""
doctree = sphinx_run.get_resolved_doctree("basic_stderr")
file_regression.check(doctree.pformat(), extension=".xml", encoding="utf8")
file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8")


@pytest.mark.sphinx_params(
Expand All @@ -99,7 +99,7 @@ def test_merge_streams(sphinx_run, file_regression):
sphinx_run.build()
assert sphinx_run.warnings() == ""
doctree = sphinx_run.get_resolved_doctree("merge_streams")
file_regression.check(doctree.pformat(), extension=".xml", encoding="utf8")
file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8")


@pytest.mark.sphinx_params(
Expand All @@ -112,7 +112,7 @@ def test_metadata_image(sphinx_run, clean_doctree, file_regression):
assert sphinx_run.warnings() == ""
doctree = clean_doctree(sphinx_run.get_resolved_doctree("metadata_image"))
file_regression.check(
doctree.pformat().replace(".jpeg", ".jpg"), extension=".xml", encoding="utf8"
doctree.pformat().replace(".jpeg", ".jpg"), extension=".xml", encoding="utf-8"
)


Expand All @@ -132,7 +132,7 @@ def test_metadata_figure(sphinx_run, clean_doctree, file_regression):
'<figure align="default" ids="fun-fish" names="fun-fish">',
)
file_regression.check(
doctree_string.replace(".jpeg", ".jpg"), extension=".xml", encoding="utf8"
doctree_string.replace(".jpeg", ".jpg"), extension=".xml", encoding="utf-8"
)


Expand All @@ -143,7 +143,7 @@ def test_unknown_mimetype(sphinx_run, file_regression):
warning = "skipping unknown output mime type: unknown [mystnb.unknown_mime_type]"
assert warning in sphinx_run.warnings()
doctree = sphinx_run.get_resolved_doctree("unknown_mimetype")
file_regression.check(doctree.pformat(), extension=".xml", encoding="utf8")
file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8")


@pytest.mark.sphinx_params("hide_cell_content.ipynb", conf={"nb_execution_mode": "off"})
Expand All @@ -152,4 +152,4 @@ def test_hide_cell_content(sphinx_run, file_regression):
sphinx_run.build()
assert sphinx_run.warnings() == ""
doctree = sphinx_run.get_resolved_doctree("hide_cell_content")
file_regression.check(doctree.pformat(), extension=".xml", encoding="utf8")
file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8")
Loading