def test_missing_reference_pydomain(tempdir, app, status, warning): inv_file = tempdir / 'inventory' inv_file.write_bytes(inventory_v2) app.config.intersphinx_mapping = { 'https://docs.python.org/': inv_file, } app.config.intersphinx_cache_limit = 0 # load the inventory and check if it's done correctly normalize_intersphinx_mapping(app, app.config) load_mappings(app) # no context data kwargs = {} node, contnode = fake_node('py', 'func', 'func', 'func()', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert rn is None # py:module context helps to search objects kwargs = {'py:module': 'module1'} node, contnode = fake_node('py', 'func', 'func', 'func()', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert rn.astext() == 'func()' # py:attr context helps to search objects kwargs = {'py:module': 'module1'} node, contnode = fake_node('py', 'attr', 'Foo.bar', 'Foo.bar', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert rn.astext() == 'Foo.bar'
def test_missing_reference_stddomain(tempdir, app, status, warning): inv_file = tempdir / 'inventory' inv_file.write_bytes(inventory_v2) app.config.intersphinx_mapping = { 'cmd': ('https://docs.python.org/', inv_file), } app.config.intersphinx_cache_limit = 0 # load the inventory and check if it's done correctly normalize_intersphinx_mapping(app, app.config) load_mappings(app) # no context data kwargs = {} node, contnode = fake_node('std', 'option', '-l', '-l', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert rn is None # std:program context helps to search objects kwargs = {'std:program': 'ls'} node, contnode = fake_node('std', 'option', '-l', 'ls -l', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert rn.astext() == 'ls -l' # refers inventory by name kwargs = {} node, contnode = fake_node('std', 'option', 'cmd:ls -l', '-l', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert rn.astext() == '-l'
def test_missing_reference_cppdomain(tempdir, app, status, warning): inv_file = tempdir / 'inventory' inv_file.write_bytes(inventory_v2) app.config.intersphinx_mapping = { 'https://docs.python.org/': inv_file, } app.config.intersphinx_cache_limit = 0 # load the inventory and check if it's done correctly normalize_intersphinx_mapping(app, app.config) load_mappings(app) app.build() html = (app.outdir / 'index.html').read_text() assert ('<a class="reference external"' ' href="https://docs.python.org/index.html#cpp_foo_bar"' ' title="(in foo v2.0)">' '<code class="xref cpp cpp-class docutils literal notranslate">' '<span class="pre">Bar</span></code></a>' in html) assert ('<a class="reference external"' ' href="https://docs.python.org/index.html#foons"' ' title="(in foo v2.0)"><span class="pre">foons</span></a>' in html) assert ('<a class="reference external"' ' href="https://docs.python.org/index.html#foons_bartype"' ' title="(in foo v2.0)"><span class="pre">bartype</span></a>' in html)
def test_load_mappings_fallback(tempdir, app, status, warning): inv_file = tempdir / 'inventory' inv_file.write_bytes(inventory_v2) app.config.intersphinx_cache_limit = 0 # connect to invalid path app.config.intersphinx_mapping = { 'fallback': ('https://docs.python.org/py3k/', '/invalid/inventory/path'), } normalize_intersphinx_mapping(app, app.config) load_mappings(app) assert "failed to reach any of the inventories" in warning.getvalue() rn = reference_check(app, 'py', 'func', 'module1.func', 'foo') assert rn is None # clear messages status.truncate(0) warning.truncate(0) # add fallbacks to mapping app.config.intersphinx_mapping = { 'fallback': ('https://docs.python.org/py3k/', ('/invalid/inventory/path', inv_file)), } normalize_intersphinx_mapping(app, app.config) load_mappings(app) assert "encountered some issues with some of the inventories" in status.getvalue( ) assert "" == warning.getvalue() rn = reference_check(app, 'py', 'func', 'module1.func', 'foo') assert isinstance(rn, nodes.reference)
def test_missing_reference_stddomain(tempdir, app, status, warning): inv_file = tempdir / 'inventory' inv_file.write_bytes(inventory_v2) app.config.intersphinx_mapping = { 'cmd': ('https://docs.python.org/', inv_file), } app.config.intersphinx_cache_limit = 0 # load the inventory and check if it's done correctly load_mappings(app) # no context data kwargs = {} node, contnode = fake_node('std', 'option', '-l', '-l', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert rn is None # std:program context helps to search objects kwargs = {'std:program': 'ls'} node, contnode = fake_node('std', 'option', '-l', 'ls -l', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert rn.astext() == 'ls -l' # refers inventory by name kwargs = {} node, contnode = fake_node('std', 'option', 'cmd:ls -l', '-l', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert rn.astext() == '-l'
def test_load_mappings_fallback(tempdir, app, status, warning): inv_file = tempdir / 'inventory' inv_file.write_bytes(inventory_v2) app.config.intersphinx_cache_limit = 0 # connect to invalid path app.config.intersphinx_mapping = { 'fallback': ('https://docs.python.org/py3k/', '/invalid/inventory/path'), } load_mappings(app) assert "failed to reach any of the inventories" in warning.getvalue() rn = reference_check(app, 'py', 'func', 'module1.func', 'foo') assert rn is None # clear messages status.truncate(0) warning.truncate(0) # add fallbacks to mapping app.config.intersphinx_mapping = { 'fallback': ('https://docs.python.org/py3k/', ('/invalid/inventory/path', inv_file)), } load_mappings(app) assert "encountered some issues with some of the inventories" in status.getvalue() assert "" == warning.getvalue() rn = reference_check(app, 'py', 'func', 'module1.func', 'foo') assert isinstance(rn, nodes.reference)
def test_domain_c_build_intersphinx(tempdir, app, status, warning): # a splitting of test_ids_vs_tags0 into the primary directives in a remote project, # and then the references in the test project origSource = """\ .. c:member:: int _member .. c:var:: int _var .. c:function:: void _function() .. c:macro:: _macro .. c:struct:: _struct .. c:union:: _union .. c:enum:: _enum .. c:enumerator:: _enumerator .. c:type:: _type .. c:function:: void _functionParam(int param) """ # noqa inv_file = tempdir / 'inventory' inv_file.write_bytes(b'''\ # Sphinx inventory version 2 # Project: C Intersphinx Test # Version: # The remainder of this file is compressed using zlib. ''' + zlib.compress(b'''\ _enum c:enum 1 index.html#c.$ - _enum._enumerator c:enumerator 1 index.html#c.$ - _enumerator c:enumerator 1 index.html#c._enum.$ - _function c:function 1 index.html#c.$ - _functionParam c:function 1 index.html#c.$ - _functionParam.param c:functionParam 1 index.html#c._functionParam - _macro c:macro 1 index.html#c.$ - _member c:member 1 index.html#c.$ - _struct c:struct 1 index.html#c.$ - _type c:type 1 index.html#c.$ - _union c:union 1 index.html#c.$ - _var c:member 1 index.html#c.$ - ''')) # noqa app.config.intersphinx_mapping = { 'https://localhost/intersphinx/c/': inv_file, } app.config.intersphinx_cache_limit = 0 # load the inventory and check if it's done correctly normalize_intersphinx_mapping(app, app.config) load_mappings(app) app.builder.build_all() ws = filter_warnings(warning, "index") assert len(ws) == 0
def test_inventory_not_having_version(tempdir, app, status, warning): inv_file = tempdir / 'inventory' inv_file.write_bytes(inventory_v2_not_having_version) app.config.intersphinx_mapping = { 'https://docs.python.org/': inv_file, } app.config.intersphinx_cache_limit = 0 # load the inventory and check if it's done correctly load_mappings(app) rn = reference_check(app, 'py', 'mod', 'module1', 'foo') assert isinstance(rn, nodes.reference) assert rn['refuri'] == 'https://docs.python.org/foo.html#module-module1' assert rn['reftitle'] == '(in foo)' assert rn[0].astext() == 'Long Module desc'
def test_missing_reference_cppdomain(tempdir, app, status, warning): inv_file = tempdir / 'inventory' inv_file.write_bytes(inventory_v2) app.config.intersphinx_mapping = { 'https://docs.python.org/': inv_file, } app.config.intersphinx_cache_limit = 0 # load the inventory and check if it's done correctly load_mappings(app) app.build() html = (app.outdir / 'index.html').text() assert ('<a class="reference external"' ' href="https://docs.python.org/index.html#cpp_foo_bar"' ' title="(in foo v2.0)"><code class="xref cpp cpp-class docutils literal">' '<span class="pre">Bar</span></code></a>' in html)
def test_load_mappings_warnings(tempdir, app, status, warning): """ load_mappings issues a warning if new-style mapping identifiers are not alphanumeric """ inv_file = tempdir / "inventory" inv_file.write_bytes(inventory_v2) app.config.intersphinx_mapping = { "https://docs.python.org/": inv_file, "py3k": ("https://docs.python.org/py3k/", inv_file), "repoze.workflow": ("http://docs.repoze.org/workflow/", inv_file), "django-taggit": ("http://django-taggit.readthedocs.org/en/latest/", inv_file), } app.config.intersphinx_cache_limit = 0 # load the inventory and check if it's done correctly load_mappings(app) assert warning.getvalue().count("\n") == 2
def test_load_mappings_warnings(tempdir, app, status, warning): """ load_mappings issues a warning if new-style mapping identifiers are not alphanumeric """ inv_file = tempdir / 'inventory' inv_file.write_bytes(inventory_v2) app.config.intersphinx_mapping = { 'http://docs.python.org/': inv_file, 'py3k': ('http://docs.python.org/py3k/', inv_file), 'repoze.workflow': ('http://docs.repoze.org/workflow/', inv_file), 'django-taggit': ('http://django-taggit.readthedocs.org/en/latest/', inv_file) } app.config.intersphinx_cache_limit = 0 # load the inventory and check if it's done correctly load_mappings(app) assert warning.getvalue().count('\n') == 2
def test_load_mappings_warnings(tempdir, app): """ load_mappings issues a warning if new-style mapping identifiers are not alphanumeric """ inv_file = tempdir / 'inventory' write_file(inv_file, inventory_v2) app.config.intersphinx_mapping = { 'http://docs.python.org/': inv_file, 'py3k': ('http://docs.python.org/py3k/', inv_file), 'repoze.workflow': ('http://docs.repoze.org/workflow/', inv_file), 'django-taggit': ('http://django-taggit.readthedocs.org/en/latest/', inv_file) } app.config.intersphinx_cache_limit = 0 # load the inventory and check if it's done correctly load_mappings(app) assert len(app._warning.content) == 2
def test_intersphinx_role(app, warning): inv_file = app.srcdir / 'inventory' inv_file.write_bytes(inventory_v2) app.config.intersphinx_mapping = { 'inv': ('http://example.org/', inv_file), } app.config.intersphinx_cache_limit = 0 app.config.nitpicky = True # load the inventory and check if it's done correctly normalize_intersphinx_mapping(app, app.config) load_mappings(app) app.build() content = (app.outdir / 'index.html').read_text() wStr = warning.getvalue() html = '<a class="reference external" href="http://example.org/{}" title="(in foo v2.0)">' assert html.format('foo.html#module-module1') in content assert html.format('foo.html#module-module2') in content assert "WARNING: external py:mod reference target not found: module3" in wStr assert "WARNING: external py:mod reference target not found: module10" in wStr assert html.format('sub/foo.html#module1.func') in content assert "WARNING: external py:meth reference target not found: inv:Foo.bar" in wStr assert "WARNING: role for external cross-reference not found: py:nope" in wStr # default domain assert html.format('index.html#std_uint8_t') in content assert "WARNING: role for external cross-reference not found: nope" in wStr # std roles without domain prefix assert html.format('docname.html') in content assert html.format('index.html#cmdoption-ls-l') in content # explicit inventory assert html.format('cfunc.html#CFunc') in content assert "WARNING: inventory for external cross-reference not found: invNope" in wStr # explicit title assert html.format('index.html#foons') in content
def test_load_mappings_warnings(tempdir, app, status, warning): """ load_mappings issues a warning if new-style mapping identifiers are not string """ inv_file = tempdir / 'inventory' inv_file.write_bytes(inventory_v2) app.config.intersphinx_mapping = { 'https://docs.python.org/': inv_file, 'py3k': ('https://docs.python.org/py3k/', inv_file), 'repoze.workflow': ('http://docs.repoze.org/workflow/', inv_file), 'django-taggit': ('http://django-taggit.readthedocs.org/en/latest/', inv_file), 12345: ('http://www.sphinx-doc.org/en/stable/', inv_file), } app.config.intersphinx_cache_limit = 0 # load the inventory and check if it's done correctly load_mappings(app) assert warning.getvalue().count('\n') == 1
def test_load_mappings_warnings(tempdir, app, status, warning): """ load_mappings issues a warning if new-style mapping identifiers are not string """ inv_file = tempdir / 'inventory' inv_file.write_bytes(inventory_v2) set_config( app, { 'https://docs.python.org/': inv_file, 'py3k': ('https://docs.python.org/py3k/', inv_file), 'repoze.workflow': ('http://docs.repoze.org/workflow/', inv_file), 'django-taggit': ('http://django-taggit.readthedocs.org/en/latest/', inv_file), 12345: ('http://www.sphinx-doc.org/en/stable/', inv_file), }) # load the inventory and check if it's done correctly normalize_intersphinx_mapping(app, app.config) load_mappings(app) assert warning.getvalue().count('\n') == 1
def test_missing_reference_jsdomain(tempdir, app, status, warning): inv_file = tempdir / 'inventory' inv_file.write_bytes(inventory_v2) app.config.intersphinx_mapping = { 'https://docs.python.org/': inv_file, } app.config.intersphinx_cache_limit = 0 # load the inventory and check if it's done correctly load_mappings(app) # no context data kwargs = {} node, contnode = fake_node('js', 'meth', 'baz', 'baz()', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert rn is None # js:module and js:object context helps to search objects kwargs = {'js:module': 'foo', 'js:object': 'bar'} node, contnode = fake_node('js', 'meth', 'baz', 'baz()', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert rn.astext() == 'baz()'
def test_missing_reference_pydomain(tempdir, app, status, warning): inv_file = tempdir / 'inventory' inv_file.write_bytes(inventory_v2) app.config.intersphinx_mapping = { 'https://docs.python.org/': inv_file, } app.config.intersphinx_cache_limit = 0 # load the inventory and check if it's done correctly normalize_intersphinx_mapping(app, app.config) load_mappings(app) # no context data kwargs = {} node, contnode = fake_node('py', 'func', 'func', 'func()', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert rn is None # py:module context helps to search objects kwargs = {'py:module': 'module1'} node, contnode = fake_node('py', 'func', 'func', 'func()', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert rn.astext() == 'func()' # py:attr context helps to search objects kwargs = {'py:module': 'module1'} node, contnode = fake_node('py', 'attr', 'Foo.bar', 'Foo.bar', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert rn.astext() == 'Foo.bar' # pending_xref_condition="resolved" node = addnodes.pending_xref('', reftarget='Foo.bar', refdomain='py', reftype='attr') node['py:module'] = 'module1' node += addnodes.pending_xref_condition('', 'Foo.bar', condition='resolved') node += addnodes.pending_xref_condition('', 'module1.Foo.bar', condition='*') rn = missing_reference(app, app.env, node, nodes.Text('dummy-cont-node')) assert rn.astext() == 'Foo.bar'
def test_missing_reference(tempdir, app, status, warning): inv_file = tempdir / 'inventory' inv_file.write_bytes(inventory_v2) app.config.intersphinx_mapping = { 'https://docs.python.org/': inv_file, 'py3k': ('https://docs.python.org/py3k/', inv_file), 'py3krel': ('py3k', inv_file), # relative path 'py3krelparent': ('../../py3k', inv_file), # relative path, parent dir } app.config.intersphinx_cache_limit = 0 # load the inventory and check if it's done correctly normalize_intersphinx_mapping(app, app.config) load_mappings(app) inv = app.env.intersphinx_inventory assert inv['py:module']['module2'] == \ ('foo', '2.0', 'https://docs.python.org/foo.html#module-module2', '-') # check resolution when a target is found rn = reference_check(app, 'py', 'func', 'module1.func', 'foo') assert isinstance(rn, nodes.reference) assert rn['refuri'] == 'https://docs.python.org/sub/foo.html#module1.func' assert rn['reftitle'] == '(in foo v2.0)' assert rn[0].astext() == 'foo' # create unresolvable nodes and check None return value assert reference_check(app, 'py', 'foo', 'module1.func', 'foo') is None assert reference_check(app, 'py', 'func', 'foo', 'foo') is None assert reference_check(app, 'py', 'func', 'foo', 'foo') is None # check handling of prefixes # prefix given, target found: prefix is stripped rn = reference_check(app, 'py', 'mod', 'py3k:module2', 'py3k:module2') assert rn[0].astext() == 'module2' # prefix given, but not in title: nothing stripped rn = reference_check(app, 'py', 'mod', 'py3k:module2', 'module2') assert rn[0].astext() == 'module2' # prefix given, but explicit: nothing stripped rn = reference_check(app, 'py', 'mod', 'py3k:module2', 'py3k:module2', refexplicit=True) assert rn[0].astext() == 'py3k:module2' # prefix given, target not found and nonexplicit title: prefix is stripped node, contnode = fake_node('py', 'mod', 'py3k:unknown', 'py3k:unknown', refexplicit=False) rn = missing_reference(app, app.env, node, contnode) assert rn is None assert contnode[0].astext() == 'unknown' # prefix given, target not found and explicit title: nothing is changed node, contnode = fake_node('py', 'mod', 'py3k:unknown', 'py3k:unknown', refexplicit=True) rn = missing_reference(app, app.env, node, contnode) assert rn is None assert contnode[0].astext() == 'py3k:unknown' # check relative paths rn = reference_check(app, 'py', 'mod', 'py3krel:module1', 'foo') assert rn['refuri'] == 'py3k/foo.html#module-module1' rn = reference_check(app, 'py', 'mod', 'py3krelparent:module1', 'foo') assert rn['refuri'] == '../../py3k/foo.html#module-module1' rn = reference_check(app, 'py', 'mod', 'py3krel:module1', 'foo', refdoc='sub/dir/test') assert rn['refuri'] == '../../py3k/foo.html#module-module1' rn = reference_check(app, 'py', 'mod', 'py3krelparent:module1', 'foo', refdoc='sub/dir/test') assert rn['refuri'] == '../../../../py3k/foo.html#module-module1' # check refs of standard domain rn = reference_check(app, 'std', 'doc', 'docname', 'docname') assert rn['refuri'] == 'https://docs.python.org/docname.html'
def test_missing_reference_disabled_domain(tempdir, app, status, warning): inv_file = tempdir / 'inventory' inv_file.write_bytes(inventory_v2) set_config(app, { 'inv': ('https://docs.python.org/', inv_file), }) # load the inventory and check if it's done correctly normalize_intersphinx_mapping(app, app.config) load_mappings(app) def case(*, term, doc, py): def assert_(rn, expected): if expected is None: assert rn is None else: assert rn.astext() == expected kwargs = {} node, contnode = fake_node('std', 'term', 'a term', 'a term', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert_(rn, 'a term' if term else None) node, contnode = fake_node('std', 'term', 'inv:a term', 'a term', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert_(rn, 'a term') node, contnode = fake_node('std', 'doc', 'docname', 'docname', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert_(rn, 'docname' if doc else None) node, contnode = fake_node('std', 'doc', 'inv:docname', 'docname', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert_(rn, 'docname') # an arbitrary ref in another domain node, contnode = fake_node('py', 'func', 'module1.func', 'func()', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert_(rn, 'func()' if py else None) node, contnode = fake_node('py', 'func', 'inv:module1.func', 'func()', **kwargs) rn = missing_reference(app, app.env, node, contnode) assert_(rn, 'func()') # the base case, everything should resolve assert app.config.intersphinx_disabled_reftypes == [] case(term=True, doc=True, py=True) # disabled a single ref type app.config.intersphinx_disabled_reftypes = ['std:doc'] case(term=True, doc=False, py=True) # disabled a whole domain app.config.intersphinx_disabled_reftypes = ['std:*'] case(term=False, doc=False, py=True) # disabled all domains app.config.intersphinx_disabled_reftypes = ['*'] case(term=False, doc=False, py=False)
def test_missing_reference(tempdir, app, status, warning): inv_file = tempdir / 'inventory' inv_file.write_bytes(inventory_v2) app.config.intersphinx_mapping = { 'https://docs.python.org/': inv_file, 'py3k': ('https://docs.python.org/py3k/', inv_file), } app.config.intersphinx_cache_limit = 0 # load the inventory and check if it's done correctly load_mappings(app) inv = app.env.intersphinx_inventory assert inv['py:module']['module2'] == \ ('foo', '2.0', 'https://docs.python.org/foo.html#module-module2', '-') # create fake nodes and check referencing def fake_node(domain, type, target, content, **attrs): contnode = nodes.emphasis(content, content) node = addnodes.pending_xref('') node['reftarget'] = target node['reftype'] = type node['refdomain'] = domain node.attributes.update(attrs) node += contnode return node, contnode def reference_check(*args, **kwds): node, contnode = fake_node(*args, **kwds) return missing_reference(app, app.env, node, contnode) # check resolution when a target is found rn = reference_check('py', 'func', 'module1.func', 'foo') assert isinstance(rn, nodes.reference) assert rn['refuri'] == 'https://docs.python.org/sub/foo.html#module1.func' assert rn['reftitle'] == '(in foo v2.0)' assert rn[0].astext() == 'foo' # create unresolvable nodes and check None return value assert reference_check('py', 'foo', 'module1.func', 'foo') is None assert reference_check('py', 'func', 'foo', 'foo') is None assert reference_check('py', 'func', 'foo', 'foo') is None # check handling of prefixes # prefix given, target found: prefix is stripped rn = reference_check('py', 'mod', 'py3k:module2', 'py3k:module2') assert rn[0].astext() == 'module2' # prefix given, but not in title: nothing stripped rn = reference_check('py', 'mod', 'py3k:module2', 'module2') assert rn[0].astext() == 'module2' # prefix given, but explicit: nothing stripped rn = reference_check('py', 'mod', 'py3k:module2', 'py3k:module2', refexplicit=True) assert rn[0].astext() == 'py3k:module2' # prefix given, target not found and nonexplicit title: prefix is stripped node, contnode = fake_node('py', 'mod', 'py3k:unknown', 'py3k:unknown', refexplicit=False) rn = missing_reference(app, app.env, node, contnode) assert rn is None assert contnode[0].astext() == 'unknown' # prefix given, target not found and explicit title: nothing is changed node, contnode = fake_node('py', 'mod', 'py3k:unknown', 'py3k:unknown', refexplicit=True) rn = missing_reference(app, app.env, node, contnode) assert rn is None assert contnode[0].astext() == 'py3k:unknown'
def test_missing_reference(tempdir, app, status, warning): inv_file = tempdir / "inventory" inv_file.write_bytes(inventory_v2) app.config.intersphinx_mapping = { "https://docs.python.org/": inv_file, "py3k": ("https://docs.python.org/py3k/", inv_file), } app.config.intersphinx_cache_limit = 0 # load the inventory and check if it's done correctly load_mappings(app) inv = app.env.intersphinx_inventory assert inv["py:module"]["module2"] == ("foo", "2.0", "https://docs.python.org/foo.html#module-module2", "-") # create fake nodes and check referencing def fake_node(domain, type, target, content, **attrs): contnode = nodes.emphasis(content, content) node = addnodes.pending_xref("") node["reftarget"] = target node["reftype"] = type node["refdomain"] = domain node.attributes.update(attrs) node += contnode return node, contnode def reference_check(*args, **kwds): node, contnode = fake_node(*args, **kwds) return missing_reference(app, app.env, node, contnode) # check resolution when a target is found rn = reference_check("py", "func", "module1.func", "foo") assert isinstance(rn, nodes.reference) assert rn["refuri"] == "https://docs.python.org/sub/foo.html#module1.func" assert rn["reftitle"] == "(in foo v2.0)" assert rn[0].astext() == "foo" # create unresolvable nodes and check None return value assert reference_check("py", "foo", "module1.func", "foo") is None assert reference_check("py", "func", "foo", "foo") is None assert reference_check("py", "func", "foo", "foo") is None # check handling of prefixes # prefix given, target found: prefix is stripped rn = reference_check("py", "mod", "py3k:module2", "py3k:module2") assert rn[0].astext() == "module2" # prefix given, but not in title: nothing stripped rn = reference_check("py", "mod", "py3k:module2", "module2") assert rn[0].astext() == "module2" # prefix given, but explicit: nothing stripped rn = reference_check("py", "mod", "py3k:module2", "py3k:module2", refexplicit=True) assert rn[0].astext() == "py3k:module2" # prefix given, target not found and nonexplicit title: prefix is stripped node, contnode = fake_node("py", "mod", "py3k:unknown", "py3k:unknown", refexplicit=False) rn = missing_reference(app, app.env, node, contnode) assert rn is None assert contnode[0].astext() == "unknown" # prefix given, target not found and explicit title: nothing is changed node, contnode = fake_node("py", "mod", "py3k:unknown", "py3k:unknown", refexplicit=True) rn = missing_reference(app, app.env, node, contnode) assert rn is None assert contnode[0].astext() == "py3k:unknown"
def test_missing_reference(tempdir, app, status, warning): inv_file = tempdir / 'inventory' inv_file.write_bytes(inventory_v2) app.config.intersphinx_mapping = { 'https://docs.python.org/': inv_file, 'py3k': ('https://docs.python.org/py3k/', inv_file), 'py3krel': ('py3k', inv_file), # relative path 'py3krelparent': ('../../py3k', inv_file), # relative path, parent dir } app.config.intersphinx_cache_limit = 0 # load the inventory and check if it's done correctly load_mappings(app) inv = app.env.intersphinx_inventory assert inv['py:module']['module2'] == \ ('foo', '2.0', 'https://docs.python.org/foo.html#module-module2', '-') # check resolution when a target is found rn = reference_check(app, 'py', 'func', 'module1.func', 'foo') assert isinstance(rn, nodes.reference) assert rn['refuri'] == 'https://docs.python.org/sub/foo.html#module1.func' assert rn['reftitle'] == '(in foo v2.0)' assert rn[0].astext() == 'foo' # create unresolvable nodes and check None return value assert reference_check(app, 'py', 'foo', 'module1.func', 'foo') is None assert reference_check(app, 'py', 'func', 'foo', 'foo') is None assert reference_check(app, 'py', 'func', 'foo', 'foo') is None # check handling of prefixes # prefix given, target found: prefix is stripped rn = reference_check(app, 'py', 'mod', 'py3k:module2', 'py3k:module2') assert rn[0].astext() == 'module2' # prefix given, but not in title: nothing stripped rn = reference_check(app, 'py', 'mod', 'py3k:module2', 'module2') assert rn[0].astext() == 'module2' # prefix given, but explicit: nothing stripped rn = reference_check(app, 'py', 'mod', 'py3k:module2', 'py3k:module2', refexplicit=True) assert rn[0].astext() == 'py3k:module2' # prefix given, target not found and nonexplicit title: prefix is stripped node, contnode = fake_node('py', 'mod', 'py3k:unknown', 'py3k:unknown', refexplicit=False) rn = missing_reference(app, app.env, node, contnode) assert rn is None assert contnode[0].astext() == 'unknown' # prefix given, target not found and explicit title: nothing is changed node, contnode = fake_node('py', 'mod', 'py3k:unknown', 'py3k:unknown', refexplicit=True) rn = missing_reference(app, app.env, node, contnode) assert rn is None assert contnode[0].astext() == 'py3k:unknown' # check relative paths rn = reference_check(app, 'py', 'mod', 'py3krel:module1', 'foo') assert rn['refuri'] == 'py3k/foo.html#module-module1' rn = reference_check(app, 'py', 'mod', 'py3krelparent:module1', 'foo') assert rn['refuri'] == '../../py3k/foo.html#module-module1' rn = reference_check(app, 'py', 'mod', 'py3krel:module1', 'foo', refdoc='sub/dir/test') assert rn['refuri'] == '../../py3k/foo.html#module-module1' rn = reference_check(app, 'py', 'mod', 'py3krelparent:module1', 'foo', refdoc='sub/dir/test') assert rn['refuri'] == '../../../../py3k/foo.html#module-module1' # check refs of standard domain rn = reference_check(app, 'std', 'doc', 'docname', 'docname') assert rn['refuri'] == 'https://docs.python.org/docname.html'