Files
sphinx/tests/test_versioning.py
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

133 lines
4.3 KiB
Python
Raw Normal View History

2010-08-10 12:25:48 +02:00
"""Test the versioning implementation."""
from __future__ import annotations
import pickle
import shutil
2010-08-10 12:25:48 +02:00
import pytest
2025-12-15 21:31:10 +00:00
from docutils.utils import DependencyList
2010-08-10 12:25:48 +02:00
from sphinx.testing.util import SphinxTestApp
2020-11-11 12:00:27 +01:00
from sphinx.versioning import add_uids, get_ratio, merge_doctrees
TYPE_CHECKING = False
if TYPE_CHECKING:
from collections.abc import Iterator
from pathlib import Path
from docutils import nodes
from sphinx.application import Sphinx
2025-12-15 21:31:10 +00:00
original: nodes.document
original_uids: list[str]
2014-09-21 17:17:02 +02:00
@pytest.fixture(scope='module', autouse=True)
def _setup_module(rootdir: Path, sphinx_test_tempdir: Path) -> Iterator[None]:
2024-10-19 01:50:45 +01:00
global original, original_uids # NoQA: PLW0603
srcdir = sphinx_test_tempdir / 'test-versioning'
if not srcdir.exists():
shutil.copytree(rootdir / 'test-versioning', srcdir)
app = SphinxTestApp(srcdir=srcdir)
app.builder.env._app = app
2010-08-10 12:25:48 +02:00
app.connect('doctree-resolved', on_doctree_resolved)
app.build()
2014-09-21 17:17:02 +02:00
original = doctrees['original']
2024-07-23 22:19:15 +01:00
original_uids = [n.uid for n in add_uids(original, is_paragraph)] # type: ignore[attr-defined]
yield
2010-08-10 12:25:48 +02:00
app.cleanup()
2014-09-21 17:17:02 +02:00
2010-08-10 12:25:48 +02:00
doctrees = {}
2014-09-21 17:17:02 +02:00
def on_doctree_resolved(app: Sphinx, doctree: nodes.document, docname: str) -> None:
2010-08-10 12:25:48 +02:00
doctrees[docname] = doctree
2014-09-21 17:17:02 +02:00
def is_paragraph(node: nodes.Node) -> bool:
2010-08-10 12:25:48 +02:00
return node.__class__.__name__ == 'paragraph'
2014-09-21 17:17:02 +02:00
def test_get_ratio() -> None:
2010-08-16 08:18:10 +02:00
assert get_ratio('', 'a')
assert get_ratio('a', '')
2014-09-21 17:17:02 +02:00
def test_add_uids() -> None:
2010-08-10 12:25:48 +02:00
assert len(original_uids) == 3
2014-09-21 17:17:02 +02:00
def test_pickleablility() -> None:
# we have to modify the doctree so we can pickle it
copy = original.copy()
2025-12-15 21:31:10 +00:00
copy.reporter = None # type: ignore[assignment]
copy.transformer = None # type: ignore[assignment]
copy.settings.warning_stream = None
copy.settings.env = None
2025-12-15 21:31:10 +00:00
copy.settings.record_dependencies = DependencyList()
loaded = pickle.loads(pickle.dumps(copy, pickle.HIGHEST_PROTOCOL))
assert all(getattr(n, 'uid', False) for n in loaded.findall(is_paragraph))
2014-09-21 17:17:02 +02:00
def test_modified() -> None:
2014-09-21 17:17:02 +02:00
modified = doctrees['modified']
2010-08-10 12:25:48 +02:00
new_nodes = list(merge_doctrees(original, modified, is_paragraph))
uids = [n.uid for n in modified.findall(is_paragraph)] # type: ignore[attr-defined]
2010-08-10 12:25:48 +02:00
assert not new_nodes
assert original_uids == uids
2014-09-21 17:17:02 +02:00
def test_added() -> None:
2014-09-21 17:17:02 +02:00
added = doctrees['added']
2010-08-10 12:25:48 +02:00
new_nodes = list(merge_doctrees(original, added, is_paragraph))
uids = [n.uid for n in added.findall(is_paragraph)] # type: ignore[attr-defined]
2010-08-10 12:25:48 +02:00
assert len(new_nodes) == 1
assert original_uids == uids[:-1]
2014-09-21 17:17:02 +02:00
def test_deleted() -> None:
2014-09-21 17:17:02 +02:00
deleted = doctrees['deleted']
2010-08-10 12:25:48 +02:00
new_nodes = list(merge_doctrees(original, deleted, is_paragraph))
uids = [n.uid for n in deleted.findall(is_paragraph)] # type: ignore[attr-defined]
2010-08-10 12:25:48 +02:00
assert not new_nodes
assert original_uids[::2] == uids
2014-09-21 17:17:02 +02:00
def test_deleted_end() -> None:
2014-09-21 17:17:02 +02:00
deleted_end = doctrees['deleted_end']
2010-08-10 12:25:48 +02:00
new_nodes = list(merge_doctrees(original, deleted_end, is_paragraph))
uids = [n.uid for n in deleted_end.findall(is_paragraph)] # type: ignore[attr-defined]
2010-08-10 12:25:48 +02:00
assert not new_nodes
assert original_uids[:-1] == uids
2014-09-21 17:17:02 +02:00
def test_insert() -> None:
2014-09-21 17:17:02 +02:00
insert = doctrees['insert']
2010-08-10 12:25:48 +02:00
new_nodes = list(merge_doctrees(original, insert, is_paragraph))
uids = [n.uid for n in insert.findall(is_paragraph)] # type: ignore[attr-defined]
2010-08-10 12:25:48 +02:00
assert len(new_nodes) == 1
assert original_uids[0] == uids[0]
assert original_uids[1:] == uids[2:]
2014-09-21 17:17:02 +02:00
def test_insert_beginning() -> None:
2014-09-21 17:17:02 +02:00
insert_beginning = doctrees['insert_beginning']
new_nodes = list(merge_doctrees(original, insert_beginning, is_paragraph))
uids = [n.uid for n in insert_beginning.findall(is_paragraph)] # type: ignore[attr-defined]
assert len(new_nodes) == 1
assert len(uids) == 4
assert original_uids == uids[1:]
assert original_uids[0] != uids[0]
2014-09-21 17:17:02 +02:00
def test_insert_similar() -> None:
2014-09-21 17:17:02 +02:00
insert_similar = doctrees['insert_similar']
new_nodes = list(merge_doctrees(original, insert_similar, is_paragraph))
uids = [n.uid for n in insert_similar.findall(is_paragraph)] # type: ignore[attr-defined]
assert len(new_nodes) == 1
2024-07-23 22:19:15 +01:00
assert new_nodes[0].rawsource == 'Anyway I need more' # type: ignore[attr-defined]
assert original_uids[0] == uids[0]
assert original_uids[1:] == uids[2:]