mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
In development of 3.0, Sphinx starts to obey to the rule of "Identifier Normalization" of docutils. This extends it to allow dots(".") and underscores("_") for node identifier. It allows Sphinx to generate node identifier from source string as possible as it is (bacause dots and underscores are usually used in many programming langauges). This change will keep not to break hyperlinks as possible.
150 lines
5.2 KiB
Python
150 lines
5.2 KiB
Python
"""
|
|
test_env
|
|
~~~~~~~~
|
|
|
|
Test the BuildEnvironment class.
|
|
|
|
:copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
|
|
:license: BSD, see LICENSE for details.
|
|
"""
|
|
import os
|
|
import shutil
|
|
import pytest
|
|
|
|
from sphinx.builders.html import StandaloneHTMLBuilder
|
|
from sphinx.builders.latex import LaTeXBuilder
|
|
from sphinx.environment import CONFIG_OK, CONFIG_CHANGED, CONFIG_EXTENSIONS_CHANGED, CONFIG_NEW
|
|
from sphinx.testing.comparer import PathComparer
|
|
|
|
|
|
@pytest.mark.sphinx('dummy', testroot='basic')
|
|
def test_config_status(make_app, app_params):
|
|
args, kwargs = app_params
|
|
|
|
# clean build
|
|
app1 = make_app(*args, freshenv=True, **kwargs)
|
|
assert app1.env.config_status == CONFIG_NEW
|
|
app1.build()
|
|
assert '[new config] 1 added' in app1._status.getvalue()
|
|
|
|
# incremental build (no config changed)
|
|
app2 = make_app(*args, **kwargs)
|
|
assert app2.env.config_status == CONFIG_OK
|
|
app2.build()
|
|
assert "0 added, 0 changed, 0 removed" in app2._status.getvalue()
|
|
|
|
# incremental build (config entry changed)
|
|
app3 = make_app(*args, confoverrides={'master_doc': 'indexx'}, **kwargs)
|
|
fname = os.path.join(app3.srcdir, 'index.rst')
|
|
assert os.path.isfile(fname)
|
|
shutil.move(fname, fname[:-4] + 'x.rst')
|
|
assert app3.env.config_status == CONFIG_CHANGED
|
|
app3.build()
|
|
shutil.move(fname[:-4] + 'x.rst', fname)
|
|
assert "[config changed ('master_doc')] 1 added" in app3._status.getvalue()
|
|
|
|
# incremental build (extension changed)
|
|
app4 = make_app(*args, confoverrides={'extensions': ['sphinx.ext.autodoc']}, **kwargs)
|
|
assert app4.env.config_status == CONFIG_EXTENSIONS_CHANGED
|
|
app4.build()
|
|
want_str = "[extensions changed ('sphinx.ext.autodoc')] 1 added"
|
|
assert want_str in app4._status.getvalue()
|
|
|
|
|
|
@pytest.mark.sphinx('dummy')
|
|
def test_images(app):
|
|
app.build()
|
|
|
|
tree = app.env.get_doctree('images')
|
|
htmlbuilder = StandaloneHTMLBuilder(app)
|
|
htmlbuilder.set_environment(app.env)
|
|
htmlbuilder.init()
|
|
htmlbuilder.imgpath = 'dummy'
|
|
htmlbuilder.post_process_images(tree)
|
|
assert set(htmlbuilder.images.keys()) == \
|
|
{'subdir/img.png', 'img.png', 'subdir/simg.png', 'svgimg.svg', 'img.foo.png'}
|
|
assert set(htmlbuilder.images.values()) == \
|
|
{'img.png', 'img1.png', 'simg.png', 'svgimg.svg', 'img.foo.png'}
|
|
|
|
latexbuilder = LaTeXBuilder(app)
|
|
latexbuilder.set_environment(app.env)
|
|
latexbuilder.init()
|
|
latexbuilder.post_process_images(tree)
|
|
assert set(latexbuilder.images.keys()) == \
|
|
{'subdir/img.png', 'subdir/simg.png', 'img.png', 'img.pdf',
|
|
'svgimg.pdf', 'img.foo.png'}
|
|
assert set(latexbuilder.images.values()) == \
|
|
{'img.pdf', 'img.png', 'img1.png', 'simg.png',
|
|
'svgimg.pdf', 'img.foo.png'}
|
|
|
|
|
|
@pytest.mark.sphinx('dummy')
|
|
def test_object_inventory(app):
|
|
app.build()
|
|
refs = app.env.domaindata['py']['objects']
|
|
|
|
assert 'func_without_module' in refs
|
|
assert refs['func_without_module'] == ('objects', 'func_without_module', 'function')
|
|
assert 'func_without_module2' in refs
|
|
assert 'mod.func_in_module' in refs
|
|
assert 'mod.Cls' in refs
|
|
assert 'mod.Cls.meth1' in refs
|
|
assert 'mod.Cls.meth2' in refs
|
|
assert 'mod.Cls.meths' in refs
|
|
|
|
assert 'mod.Error' not in refs
|
|
assert 'errmod.Error' in refs
|
|
|
|
assert 'func_in_module' not in refs
|
|
assert 'func_noindex' not in refs
|
|
|
|
assert app.env.domaindata['py']['modules']['mod'] == \
|
|
('objects', 'module-mod', 'Module synopsis.', 'UNIX', False)
|
|
|
|
assert app.env.domains['py'].data is app.env.domaindata['py']
|
|
assert app.env.domains['c'].data is app.env.domaindata['c']
|
|
|
|
|
|
@pytest.mark.sphinx('dummy', testroot='basic')
|
|
def test_env_relfn2path(app):
|
|
# relative filename and root document
|
|
relfn, absfn = app.env.relfn2path('logo.jpg', 'index')
|
|
assert relfn == 'logo.jpg'
|
|
assert absfn == app.srcdir / 'logo.jpg'
|
|
|
|
# absolute filename and root document
|
|
relfn, absfn = app.env.relfn2path('/logo.jpg', 'index')
|
|
assert relfn == 'logo.jpg'
|
|
assert absfn == app.srcdir / 'logo.jpg'
|
|
|
|
# relative filename and a document in subdir
|
|
relfn, absfn = app.env.relfn2path('logo.jpg', 'subdir/index')
|
|
assert relfn == PathComparer('subdir/logo.jpg')
|
|
assert absfn == app.srcdir / 'subdir' / 'logo.jpg'
|
|
|
|
# absolute filename and a document in subdir
|
|
relfn, absfn = app.env.relfn2path('/logo.jpg', 'subdir/index')
|
|
assert relfn == 'logo.jpg'
|
|
assert absfn == app.srcdir / 'logo.jpg'
|
|
|
|
# relative filename having subdir
|
|
relfn, absfn = app.env.relfn2path('images/logo.jpg', 'index')
|
|
assert relfn == 'images/logo.jpg'
|
|
assert absfn == app.srcdir / 'images' / 'logo.jpg'
|
|
|
|
# relative path traversal
|
|
relfn, absfn = app.env.relfn2path('../logo.jpg', 'index')
|
|
assert relfn == '../logo.jpg'
|
|
assert absfn == app.srcdir.parent / 'logo.jpg'
|
|
|
|
# omit docname (w/ current docname)
|
|
app.env.temp_data['docname'] = 'subdir/document'
|
|
relfn, absfn = app.env.relfn2path('images/logo.jpg')
|
|
assert relfn == PathComparer('subdir/images/logo.jpg')
|
|
assert absfn == app.srcdir / 'subdir' / 'images' / 'logo.jpg'
|
|
|
|
# omit docname (w/o current docname)
|
|
app.env.temp_data.clear()
|
|
with pytest.raises(KeyError):
|
|
app.env.relfn2path('images/logo.jpg')
|