python-breathe fails to build with sphinx 8.x in Fedora 42 (currently Rawhide). The issue detected: =================================== FAILURES =================================== _______________________________ test_render_func _______________________________ app = <SphinxTestApp buildername='html'> def test_render_func(app): member_def = WrappedMemberDef( kind="function", definition="void foo", type_="void", name="foo", argsstring="(int)", virt="non-virtual", param=[ WrappedParam(type_=WrappedLinkedText(content_=[WrappedMixedContainer(value="int")])) ], ) > signature = find_node(render(app, member_def), "desc_signature") test_renderer.py:335: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ test_renderer.py:320: in render return renderer.render(member_def) ../breathe/renderer/sphinxrenderer.py:2624: in render result = method(self, node) ../breathe/renderer/sphinxrenderer.py:2511: in dispatch_memberdef return self.visit_function(node) ../breathe/renderer/sphinxrenderer.py:2003: in visit_function nodes = self.handle_declaration(node, declaration) ../breathe/renderer/sphinxrenderer.py:667: in handle_declaration nodes_ = self.run_directive(obj_type, declaration, content_callback, options) ../breathe/renderer/sphinxrenderer.py:619: in run_directive nodes = directive.run() /usr/lib/python3.13/site-packages/sphinx/domains/cpp/__init__.py:319: in run return super().run() /usr/lib/python3.13/site-packages/sphinx/directives/__init__.py:287: in run content_children = self.parse_content_to_nodes(allow_section_headings=True) /usr/lib/python3.13/site-packages/sphinx/util/docutils.py:482: in parse_content_to_nodes return nested_parse_to_nodes( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:55: in nested_parse_to_nodes content = _text_to_string_list( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:94: in _text_to_string_list content = string2lines(text, tab_width, convert_whitespace=True) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ astring = None, tab_width = 8, convert_whitespace = True whitespace = re.compile('[\x0b\x0c]') def string2lines(astring, tab_width=8, convert_whitespace=False, whitespace=re.compile('[\v\f]')): """ Return a list of one-line strings with tabs expanded, no newlines, and trailing whitespace stripped. Each tab is expanded with between 1 and `tab_width` spaces, so that the next character's index becomes a multiple of `tab_width` (8 by default). Parameters: - `astring`: a multi-line string. - `tab_width`: the number of columns between tab stops. - `convert_whitespace`: convert form feeds and vertical tabs to spaces? - `whitespace`: pattern object with the to-be-converted whitespace characters (default [\\v\\f]). """ if convert_whitespace: > astring = whitespace.sub(' ', astring) E TypeError: expected string or bytes-like object, got 'NoneType' /usr/lib/python3.13/site-packages/docutils/statemachine.py:1506: TypeError --------------------------- Captured stdout teardown --------------------------- # testroot: root # builder: html # srcdir: /tmp/pytest-of-mockbuild/pytest-0/root # outdir: /tmp/pytest-of-mockbuild/pytest-0/root/_build/html # status: Running Sphinx v8.1.3 loading translations [en]... done # warning: _____________________________ test_render_typedef ______________________________ app = <SphinxTestApp buildername='html'> def test_render_typedef(app): member_def = WrappedMemberDef( kind="typedef", definition="typedef int foo", type_="int", name="foo" ) > signature = find_node(render(app, member_def), "desc_signature") test_renderer.py:358: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ test_renderer.py:320: in render return renderer.render(member_def) ../breathe/renderer/sphinxrenderer.py:2624: in render result = method(self, node) ../breathe/renderer/sphinxrenderer.py:2515: in dispatch_memberdef return self.visit_typedef(node) ../breathe/renderer/sphinxrenderer.py:2134: in visit_typedef return self.handle_declaration(node, declaration) ../breathe/renderer/sphinxrenderer.py:667: in handle_declaration nodes_ = self.run_directive(obj_type, declaration, content_callback, options) ../breathe/renderer/sphinxrenderer.py:619: in run_directive nodes = directive.run() /usr/lib/python3.13/site-packages/sphinx/domains/cpp/__init__.py:319: in run return super().run() /usr/lib/python3.13/site-packages/sphinx/directives/__init__.py:287: in run content_children = self.parse_content_to_nodes(allow_section_headings=True) /usr/lib/python3.13/site-packages/sphinx/util/docutils.py:482: in parse_content_to_nodes return nested_parse_to_nodes( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:55: in nested_parse_to_nodes content = _text_to_string_list( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:94: in _text_to_string_list content = string2lines(text, tab_width, convert_whitespace=True) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ astring = None, tab_width = 8, convert_whitespace = True whitespace = re.compile('[\x0b\x0c]') def string2lines(astring, tab_width=8, convert_whitespace=False, whitespace=re.compile('[\v\f]')): """ Return a list of one-line strings with tabs expanded, no newlines, and trailing whitespace stripped. Each tab is expanded with between 1 and `tab_width` spaces, so that the next character's index becomes a multiple of `tab_width` (8 by default). Parameters: - `astring`: a multi-line string. - `tab_width`: the number of columns between tab stops. - `convert_whitespace`: convert form feeds and vertical tabs to spaces? - `whitespace`: pattern object with the to-be-converted whitespace characters (default [\\v\\f]). """ if convert_whitespace: > astring = whitespace.sub(' ', astring) E TypeError: expected string or bytes-like object, got 'NoneType' /usr/lib/python3.13/site-packages/docutils/statemachine.py:1506: TypeError --------------------------- Captured stdout teardown --------------------------- # testroot: root # builder: html # srcdir: /tmp/pytest-of-mockbuild/pytest-0/root # outdir: /tmp/pytest-of-mockbuild/pytest-0/root/_build/html # status: Running Sphinx v8.1.3 loading translations [en]... done # warning: ____________________________ test_render_c_typedef _____________________________ app = <SphinxTestApp buildername='html'> def test_render_c_typedef(app): member_def = WrappedMemberDef( kind="typedef", definition="typedef unsigned int bar", type_="unsigned int", name="bar" ) > signature = find_node(render(app, member_def, domain="c"), "desc_signature") test_renderer.py:366: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ test_renderer.py:320: in render return renderer.render(member_def) ../breathe/renderer/sphinxrenderer.py:2624: in render result = method(self, node) ../breathe/renderer/sphinxrenderer.py:2515: in dispatch_memberdef return self.visit_typedef(node) ../breathe/renderer/sphinxrenderer.py:2134: in visit_typedef return self.handle_declaration(node, declaration) ../breathe/renderer/sphinxrenderer.py:667: in handle_declaration nodes_ = self.run_directive(obj_type, declaration, content_callback, options) ../breathe/renderer/sphinxrenderer.py:619: in run_directive nodes = directive.run() /usr/lib/python3.13/site-packages/sphinx/domains/c/__init__.py:219: in run return super().run() /usr/lib/python3.13/site-packages/sphinx/directives/__init__.py:287: in run content_children = self.parse_content_to_nodes(allow_section_headings=True) /usr/lib/python3.13/site-packages/sphinx/util/docutils.py:482: in parse_content_to_nodes return nested_parse_to_nodes( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:55: in nested_parse_to_nodes content = _text_to_string_list( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:94: in _text_to_string_list content = string2lines(text, tab_width, convert_whitespace=True) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ astring = None, tab_width = 8, convert_whitespace = True whitespace = re.compile('[\x0b\x0c]') def string2lines(astring, tab_width=8, convert_whitespace=False, whitespace=re.compile('[\v\f]')): """ Return a list of one-line strings with tabs expanded, no newlines, and trailing whitespace stripped. Each tab is expanded with between 1 and `tab_width` spaces, so that the next character's index becomes a multiple of `tab_width` (8 by default). Parameters: - `astring`: a multi-line string. - `tab_width`: the number of columns between tab stops. - `convert_whitespace`: convert form feeds and vertical tabs to spaces? - `whitespace`: pattern object with the to-be-converted whitespace characters (default [\\v\\f]). """ if convert_whitespace: > astring = whitespace.sub(' ', astring) E TypeError: expected string or bytes-like object, got 'NoneType' /usr/lib/python3.13/site-packages/docutils/statemachine.py:1506: TypeError --------------------------- Captured stdout teardown --------------------------- # testroot: root # builder: html # srcdir: /tmp/pytest-of-mockbuild/pytest-0/root # outdir: /tmp/pytest-of-mockbuild/pytest-0/root/_build/html # status: Running Sphinx v8.1.3 loading translations [en]... done # warning: ________________________ test_render_c_function_typedef ________________________ app = <SphinxTestApp buildername='html'> def test_render_c_function_typedef(app): member_def = WrappedMemberDef( kind="typedef", definition="typedef void* (*voidFuncPtr)(float, int)", type_="void* (*", name="voidFuncPtr", argsstring=")(float, int)", ) > signature = find_node(render(app, member_def, domain="c"), "desc_signature") test_renderer.py:378: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ test_renderer.py:320: in render return renderer.render(member_def) ../breathe/renderer/sphinxrenderer.py:2624: in render result = method(self, node) ../breathe/renderer/sphinxrenderer.py:2515: in dispatch_memberdef return self.visit_typedef(node) ../breathe/renderer/sphinxrenderer.py:2134: in visit_typedef return self.handle_declaration(node, declaration) ../breathe/renderer/sphinxrenderer.py:667: in handle_declaration nodes_ = self.run_directive(obj_type, declaration, content_callback, options) ../breathe/renderer/sphinxrenderer.py:619: in run_directive nodes = directive.run() /usr/lib/python3.13/site-packages/sphinx/domains/c/__init__.py:219: in run return super().run() /usr/lib/python3.13/site-packages/sphinx/directives/__init__.py:287: in run content_children = self.parse_content_to_nodes(allow_section_headings=True) /usr/lib/python3.13/site-packages/sphinx/util/docutils.py:482: in parse_content_to_nodes return nested_parse_to_nodes( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:55: in nested_parse_to_nodes content = _text_to_string_list( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:94: in _text_to_string_list content = string2lines(text, tab_width, convert_whitespace=True) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ astring = None, tab_width = 8, convert_whitespace = True whitespace = re.compile('[\x0b\x0c]') def string2lines(astring, tab_width=8, convert_whitespace=False, whitespace=re.compile('[\v\f]')): """ Return a list of one-line strings with tabs expanded, no newlines, and trailing whitespace stripped. Each tab is expanded with between 1 and `tab_width` spaces, so that the next character's index becomes a multiple of `tab_width` (8 by default). Parameters: - `astring`: a multi-line string. - `tab_width`: the number of columns between tab stops. - `convert_whitespace`: convert form feeds and vertical tabs to spaces? - `whitespace`: pattern object with the to-be-converted whitespace characters (default [\\v\\f]). """ if convert_whitespace: > astring = whitespace.sub(' ', astring) E TypeError: expected string or bytes-like object, got 'NoneType' /usr/lib/python3.13/site-packages/docutils/statemachine.py:1506: TypeError --------------------------- Captured stdout teardown --------------------------- # testroot: root # builder: html # srcdir: /tmp/pytest-of-mockbuild/pytest-0/root # outdir: /tmp/pytest-of-mockbuild/pytest-0/root/_build/html # status: Running Sphinx v8.1.3 loading translations [en]... done # warning: ___________________________ test_render_using_alias ____________________________ app = <SphinxTestApp buildername='html'> def test_render_using_alias(app): member_def = WrappedMemberDef( kind="typedef", definition="using foo = int", type_="int", name="foo" ) > signature = find_node(render(app, member_def), "desc_signature") test_renderer.py:395: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ test_renderer.py:320: in render return renderer.render(member_def) ../breathe/renderer/sphinxrenderer.py:2624: in render result = method(self, node) ../breathe/renderer/sphinxrenderer.py:2515: in dispatch_memberdef return self.visit_typedef(node) ../breathe/renderer/sphinxrenderer.py:2134: in visit_typedef return self.handle_declaration(node, declaration) ../breathe/renderer/sphinxrenderer.py:667: in handle_declaration nodes_ = self.run_directive(obj_type, declaration, content_callback, options) ../breathe/renderer/sphinxrenderer.py:619: in run_directive nodes = directive.run() /usr/lib/python3.13/site-packages/sphinx/domains/cpp/__init__.py:319: in run return super().run() /usr/lib/python3.13/site-packages/sphinx/directives/__init__.py:287: in run content_children = self.parse_content_to_nodes(allow_section_headings=True) /usr/lib/python3.13/site-packages/sphinx/util/docutils.py:482: in parse_content_to_nodes return nested_parse_to_nodes( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:55: in nested_parse_to_nodes content = _text_to_string_list( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:94: in _text_to_string_list content = string2lines(text, tab_width, convert_whitespace=True) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ astring = None, tab_width = 8, convert_whitespace = True whitespace = re.compile('[\x0b\x0c]') def string2lines(astring, tab_width=8, convert_whitespace=False, whitespace=re.compile('[\v\f]')): """ Return a list of one-line strings with tabs expanded, no newlines, and trailing whitespace stripped. Each tab is expanded with between 1 and `tab_width` spaces, so that the next character's index becomes a multiple of `tab_width` (8 by default). Parameters: - `astring`: a multi-line string. - `tab_width`: the number of columns between tab stops. - `convert_whitespace`: convert form feeds and vertical tabs to spaces? - `whitespace`: pattern object with the to-be-converted whitespace characters (default [\\v\\f]). """ if convert_whitespace: > astring = whitespace.sub(' ', astring) E TypeError: expected string or bytes-like object, got 'NoneType' /usr/lib/python3.13/site-packages/docutils/statemachine.py:1506: TypeError --------------------------- Captured stdout teardown --------------------------- # testroot: root # builder: html # srcdir: /tmp/pytest-of-mockbuild/pytest-0/root # outdir: /tmp/pytest-of-mockbuild/pytest-0/root/_build/html # status: Running Sphinx v8.1.3 loading translations [en]... done # warning: ____________________________ test_render_const_func ____________________________ app = <SphinxTestApp buildername='html'> def test_render_const_func(app): member_def = WrappedMemberDef( kind="function", definition="void f", type_="void", name="f", argsstring="() const", virt="non-virtual", const="yes", ) > signature = find_node(render(app, member_def), "desc_signature") test_renderer.py:409: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ test_renderer.py:320: in render return renderer.render(member_def) ../breathe/renderer/sphinxrenderer.py:2624: in render result = method(self, node) ../breathe/renderer/sphinxrenderer.py:2511: in dispatch_memberdef return self.visit_function(node) ../breathe/renderer/sphinxrenderer.py:2003: in visit_function nodes = self.handle_declaration(node, declaration) ../breathe/renderer/sphinxrenderer.py:667: in handle_declaration nodes_ = self.run_directive(obj_type, declaration, content_callback, options) ../breathe/renderer/sphinxrenderer.py:619: in run_directive nodes = directive.run() /usr/lib/python3.13/site-packages/sphinx/domains/cpp/__init__.py:319: in run return super().run() /usr/lib/python3.13/site-packages/sphinx/directives/__init__.py:287: in run content_children = self.parse_content_to_nodes(allow_section_headings=True) /usr/lib/python3.13/site-packages/sphinx/util/docutils.py:482: in parse_content_to_nodes return nested_parse_to_nodes( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:55: in nested_parse_to_nodes content = _text_to_string_list( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:94: in _text_to_string_list content = string2lines(text, tab_width, convert_whitespace=True) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ astring = None, tab_width = 8, convert_whitespace = True whitespace = re.compile('[\x0b\x0c]') def string2lines(astring, tab_width=8, convert_whitespace=False, whitespace=re.compile('[\v\f]')): """ Return a list of one-line strings with tabs expanded, no newlines, and trailing whitespace stripped. Each tab is expanded with between 1 and `tab_width` spaces, so that the next character's index becomes a multiple of `tab_width` (8 by default). Parameters: - `astring`: a multi-line string. - `tab_width`: the number of columns between tab stops. - `convert_whitespace`: convert form feeds and vertical tabs to spaces? - `whitespace`: pattern object with the to-be-converted whitespace characters (default [\\v\\f]). """ if convert_whitespace: > astring = whitespace.sub(' ', astring) E TypeError: expected string or bytes-like object, got 'NoneType' /usr/lib/python3.13/site-packages/docutils/statemachine.py:1506: TypeError --------------------------- Captured stdout teardown --------------------------- # testroot: root # builder: html # srcdir: /tmp/pytest-of-mockbuild/pytest-0/root # outdir: /tmp/pytest-of-mockbuild/pytest-0/root/_build/html # status: Running Sphinx v8.1.3 loading translations [en]... done # warning: ___________________________ test_render_lvalue_func ____________________________ app = <SphinxTestApp buildername='html'> def test_render_lvalue_func(app): member_def = WrappedMemberDef( kind="function", definition="void f", type_="void", name="f", argsstring="() &", virt="non-virtual", refqual="lvalue", ) > signature = find_node(render(app, member_def), "desc_signature") test_renderer.py:423: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ test_renderer.py:320: in render return renderer.render(member_def) ../breathe/renderer/sphinxrenderer.py:2624: in render result = method(self, node) ../breathe/renderer/sphinxrenderer.py:2511: in dispatch_memberdef return self.visit_function(node) ../breathe/renderer/sphinxrenderer.py:2003: in visit_function nodes = self.handle_declaration(node, declaration) ../breathe/renderer/sphinxrenderer.py:667: in handle_declaration nodes_ = self.run_directive(obj_type, declaration, content_callback, options) ../breathe/renderer/sphinxrenderer.py:619: in run_directive nodes = directive.run() /usr/lib/python3.13/site-packages/sphinx/domains/cpp/__init__.py:319: in run return super().run() /usr/lib/python3.13/site-packages/sphinx/directives/__init__.py:287: in run content_children = self.parse_content_to_nodes(allow_section_headings=True) /usr/lib/python3.13/site-packages/sphinx/util/docutils.py:482: in parse_content_to_nodes return nested_parse_to_nodes( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:55: in nested_parse_to_nodes content = _text_to_string_list( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:94: in _text_to_string_list content = string2lines(text, tab_width, convert_whitespace=True) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ astring = None, tab_width = 8, convert_whitespace = True whitespace = re.compile('[\x0b\x0c]') def string2lines(astring, tab_width=8, convert_whitespace=False, whitespace=re.compile('[\v\f]')): """ Return a list of one-line strings with tabs expanded, no newlines, and trailing whitespace stripped. Each tab is expanded with between 1 and `tab_width` spaces, so that the next character's index becomes a multiple of `tab_width` (8 by default). Parameters: - `astring`: a multi-line string. - `tab_width`: the number of columns between tab stops. - `convert_whitespace`: convert form feeds and vertical tabs to spaces? - `whitespace`: pattern object with the to-be-converted whitespace characters (default [\\v\\f]). """ if convert_whitespace: > astring = whitespace.sub(' ', astring) E TypeError: expected string or bytes-like object, got 'NoneType' /usr/lib/python3.13/site-packages/docutils/statemachine.py:1506: TypeError --------------------------- Captured stdout teardown --------------------------- # testroot: root # builder: html # srcdir: /tmp/pytest-of-mockbuild/pytest-0/root # outdir: /tmp/pytest-of-mockbuild/pytest-0/root/_build/html # status: Running Sphinx v8.1.3 loading translations [en]... done # warning: ___________________________ test_render_rvalue_func ____________________________ app = <SphinxTestApp buildername='html'> def test_render_rvalue_func(app): member_def = WrappedMemberDef( kind="function", definition="void f", type_="void", name="f", argsstring="() &&", virt="non-virtual", refqual="rvalue", ) > signature = find_node(render(app, member_def), "desc_signature") test_renderer.py:437: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ test_renderer.py:320: in render return renderer.render(member_def) ../breathe/renderer/sphinxrenderer.py:2624: in render result = method(self, node) ../breathe/renderer/sphinxrenderer.py:2511: in dispatch_memberdef return self.visit_function(node) ../breathe/renderer/sphinxrenderer.py:2003: in visit_function nodes = self.handle_declaration(node, declaration) ../breathe/renderer/sphinxrenderer.py:667: in handle_declaration nodes_ = self.run_directive(obj_type, declaration, content_callback, options) ../breathe/renderer/sphinxrenderer.py:619: in run_directive nodes = directive.run() /usr/lib/python3.13/site-packages/sphinx/domains/cpp/__init__.py:319: in run return super().run() /usr/lib/python3.13/site-packages/sphinx/directives/__init__.py:287: in run content_children = self.parse_content_to_nodes(allow_section_headings=True) /usr/lib/python3.13/site-packages/sphinx/util/docutils.py:482: in parse_content_to_nodes return nested_parse_to_nodes( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:55: in nested_parse_to_nodes content = _text_to_string_list( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:94: in _text_to_string_list content = string2lines(text, tab_width, convert_whitespace=True) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ astring = None, tab_width = 8, convert_whitespace = True whitespace = re.compile('[\x0b\x0c]') def string2lines(astring, tab_width=8, convert_whitespace=False, whitespace=re.compile('[\v\f]')): """ Return a list of one-line strings with tabs expanded, no newlines, and trailing whitespace stripped. Each tab is expanded with between 1 and `tab_width` spaces, so that the next character's index becomes a multiple of `tab_width` (8 by default). Parameters: - `astring`: a multi-line string. - `tab_width`: the number of columns between tab stops. - `convert_whitespace`: convert form feeds and vertical tabs to spaces? - `whitespace`: pattern object with the to-be-converted whitespace characters (default [\\v\\f]). """ if convert_whitespace: > astring = whitespace.sub(' ', astring) E TypeError: expected string or bytes-like object, got 'NoneType' /usr/lib/python3.13/site-packages/docutils/statemachine.py:1506: TypeError --------------------------- Captured stdout teardown --------------------------- # testroot: root # builder: html # srcdir: /tmp/pytest-of-mockbuild/pytest-0/root # outdir: /tmp/pytest-of-mockbuild/pytest-0/root/_build/html # status: Running Sphinx v8.1.3 loading translations [en]... done # warning: ________________________ test_render_const_lvalue_func _________________________ app = <SphinxTestApp buildername='html'> def test_render_const_lvalue_func(app): member_def = WrappedMemberDef( kind="function", definition="void f", type_="void", name="f", argsstring="() const &", virt="non-virtual", const="yes", refqual="lvalue", ) > signature = find_node(render(app, member_def), "desc_signature") test_renderer.py:452: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ test_renderer.py:320: in render return renderer.render(member_def) ../breathe/renderer/sphinxrenderer.py:2624: in render result = method(self, node) ../breathe/renderer/sphinxrenderer.py:2511: in dispatch_memberdef return self.visit_function(node) ../breathe/renderer/sphinxrenderer.py:2003: in visit_function nodes = self.handle_declaration(node, declaration) ../breathe/renderer/sphinxrenderer.py:667: in handle_declaration nodes_ = self.run_directive(obj_type, declaration, content_callback, options) ../breathe/renderer/sphinxrenderer.py:619: in run_directive nodes = directive.run() /usr/lib/python3.13/site-packages/sphinx/domains/cpp/__init__.py:319: in run return super().run() /usr/lib/python3.13/site-packages/sphinx/directives/__init__.py:287: in run content_children = self.parse_content_to_nodes(allow_section_headings=True) /usr/lib/python3.13/site-packages/sphinx/util/docutils.py:482: in parse_content_to_nodes return nested_parse_to_nodes( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:55: in nested_parse_to_nodes content = _text_to_string_list( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:94: in _text_to_string_list content = string2lines(text, tab_width, convert_whitespace=True) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ astring = None, tab_width = 8, convert_whitespace = True whitespace = re.compile('[\x0b\x0c]') def string2lines(astring, tab_width=8, convert_whitespace=False, whitespace=re.compile('[\v\f]')): """ Return a list of one-line strings with tabs expanded, no newlines, and trailing whitespace stripped. Each tab is expanded with between 1 and `tab_width` spaces, so that the next character's index becomes a multiple of `tab_width` (8 by default). Parameters: - `astring`: a multi-line string. - `tab_width`: the number of columns between tab stops. - `convert_whitespace`: convert form feeds and vertical tabs to spaces? - `whitespace`: pattern object with the to-be-converted whitespace characters (default [\\v\\f]). """ if convert_whitespace: > astring = whitespace.sub(' ', astring) E TypeError: expected string or bytes-like object, got 'NoneType' /usr/lib/python3.13/site-packages/docutils/statemachine.py:1506: TypeError --------------------------- Captured stdout teardown --------------------------- # testroot: root # builder: html # srcdir: /tmp/pytest-of-mockbuild/pytest-0/root # outdir: /tmp/pytest-of-mockbuild/pytest-0/root/_build/html # status: Running Sphinx v8.1.3 loading translations [en]... done # warning: ________________________ test_render_const_rvalue_func _________________________ app = <SphinxTestApp buildername='html'> def test_render_const_rvalue_func(app): member_def = WrappedMemberDef( kind="function", definition="void f", type_="void", name="f", argsstring="() const &&", virt="non-virtual", const="yes", refqual="rvalue", ) > signature = find_node(render(app, member_def), "desc_signature") test_renderer.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ test_renderer.py:320: in render return renderer.render(member_def) ../breathe/renderer/sphinxrenderer.py:2624: in render result = method(self, node) ../breathe/renderer/sphinxrenderer.py:2511: in dispatch_memberdef return self.visit_function(node) ../breathe/renderer/sphinxrenderer.py:2003: in visit_function nodes = self.handle_declaration(node, declaration) ../breathe/renderer/sphinxrenderer.py:667: in handle_declaration nodes_ = self.run_directive(obj_type, declaration, content_callback, options) ../breathe/renderer/sphinxrenderer.py:619: in run_directive nodes = directive.run() /usr/lib/python3.13/site-packages/sphinx/domains/cpp/__init__.py:319: in run return super().run() /usr/lib/python3.13/site-packages/sphinx/directives/__init__.py:287: in run content_children = self.parse_content_to_nodes(allow_section_headings=True) /usr/lib/python3.13/site-packages/sphinx/util/docutils.py:482: in parse_content_to_nodes return nested_parse_to_nodes( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:55: in nested_parse_to_nodes content = _text_to_string_list( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:94: in _text_to_string_list content = string2lines(text, tab_width, convert_whitespace=True) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ astring = None, tab_width = 8, convert_whitespace = True whitespace = re.compile('[\x0b\x0c]') def string2lines(astring, tab_width=8, convert_whitespace=False, whitespace=re.compile('[\v\f]')): """ Return a list of one-line strings with tabs expanded, no newlines, and trailing whitespace stripped. Each tab is expanded with between 1 and `tab_width` spaces, so that the next character's index becomes a multiple of `tab_width` (8 by default). Parameters: - `astring`: a multi-line string. - `tab_width`: the number of columns between tab stops. - `convert_whitespace`: convert form feeds and vertical tabs to spaces? - `whitespace`: pattern object with the to-be-converted whitespace characters (default [\\v\\f]). """ if convert_whitespace: > astring = whitespace.sub(' ', astring) E TypeError: expected string or bytes-like object, got 'NoneType' /usr/lib/python3.13/site-packages/docutils/statemachine.py:1506: TypeError --------------------------- Captured stdout teardown --------------------------- # testroot: root # builder: html # srcdir: /tmp/pytest-of-mockbuild/pytest-0/root # outdir: /tmp/pytest-of-mockbuild/pytest-0/root/_build/html # status: Running Sphinx v8.1.3 loading translations [en]... done # warning: _______________________ test_render_variable_initializer _______________________ app = <SphinxTestApp buildername='html'> def test_render_variable_initializer(app): member_def = WrappedMemberDef( kind="variable", definition="const int EOF", type_="const int", name="EOF", initializer=WrappedMixedContainer(value="= -1"), ) > signature = find_node(render(app, member_def), "desc_signature") test_renderer.py:479: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ test_renderer.py:320: in render return renderer.render(member_def) ../breathe/renderer/sphinxrenderer.py:2624: in render result = method(self, node) ../breathe/renderer/sphinxrenderer.py:2517: in dispatch_memberdef return self.visit_variable(node) ../breathe/renderer/sphinxrenderer.py:2197: in visit_variable return self.handle_declaration(node, declaration, options=options) ../breathe/renderer/sphinxrenderer.py:667: in handle_declaration nodes_ = self.run_directive(obj_type, declaration, content_callback, options) ../breathe/renderer/sphinxrenderer.py:619: in run_directive nodes = directive.run() /usr/lib/python3.13/site-packages/sphinx/domains/cpp/__init__.py:319: in run return super().run() /usr/lib/python3.13/site-packages/sphinx/directives/__init__.py:287: in run content_children = self.parse_content_to_nodes(allow_section_headings=True) /usr/lib/python3.13/site-packages/sphinx/util/docutils.py:482: in parse_content_to_nodes return nested_parse_to_nodes( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:55: in nested_parse_to_nodes content = _text_to_string_list( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:94: in _text_to_string_list content = string2lines(text, tab_width, convert_whitespace=True) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ astring = None, tab_width = 8, convert_whitespace = True whitespace = re.compile('[\x0b\x0c]') def string2lines(astring, tab_width=8, convert_whitespace=False, whitespace=re.compile('[\v\f]')): """ Return a list of one-line strings with tabs expanded, no newlines, and trailing whitespace stripped. Each tab is expanded with between 1 and `tab_width` spaces, so that the next character's index becomes a multiple of `tab_width` (8 by default). Parameters: - `astring`: a multi-line string. - `tab_width`: the number of columns between tab stops. - `convert_whitespace`: convert form feeds and vertical tabs to spaces? - `whitespace`: pattern object with the to-be-converted whitespace characters (default [\\v\\f]). """ if convert_whitespace: > astring = whitespace.sub(' ', astring) E TypeError: expected string or bytes-like object, got 'NoneType' /usr/lib/python3.13/site-packages/docutils/statemachine.py:1506: TypeError --------------------------- Captured stdout teardown --------------------------- # testroot: root # builder: html # srcdir: /tmp/pytest-of-mockbuild/pytest-0/root # outdir: /tmp/pytest-of-mockbuild/pytest-0/root/_build/html # status: Running Sphinx v8.1.3 loading translations [en]... done # warning: ________________________ test_render_define_initializer ________________________ app = <SphinxTestApp buildername='html'> def test_render_define_initializer(app): member_def = WrappedMemberDef( kind="define", name="MAX_LENGTH", initializer=WrappedLinkedText(content_=[WrappedMixedContainer(value="100")]), ) signature_w_initializer = find_node( > render(app, member_def, show_define_initializer=True), "desc_signature" ) test_renderer.py:490: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ test_renderer.py:320: in render return renderer.render(member_def) ../breathe/renderer/sphinxrenderer.py:2624: in render result = method(self, node) ../breathe/renderer/sphinxrenderer.py:2525: in dispatch_memberdef return self.visit_define(node) ../breathe/renderer/sphinxrenderer.py:2080: in visit_define return self.handle_declaration(node, declaration, declarator_callback=add_definition) ../breathe/renderer/sphinxrenderer.py:667: in handle_declaration nodes_ = self.run_directive(obj_type, declaration, content_callback, options) ../breathe/renderer/sphinxrenderer.py:619: in run_directive nodes = directive.run() /usr/lib/python3.13/site-packages/sphinx/domains/c/__init__.py:219: in run return super().run() /usr/lib/python3.13/site-packages/sphinx/directives/__init__.py:287: in run content_children = self.parse_content_to_nodes(allow_section_headings=True) /usr/lib/python3.13/site-packages/sphinx/util/docutils.py:482: in parse_content_to_nodes return nested_parse_to_nodes( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:55: in nested_parse_to_nodes content = _text_to_string_list( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:94: in _text_to_string_list content = string2lines(text, tab_width, convert_whitespace=True) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ astring = None, tab_width = 8, convert_whitespace = True whitespace = re.compile('[\x0b\x0c]') def string2lines(astring, tab_width=8, convert_whitespace=False, whitespace=re.compile('[\v\f]')): """ Return a list of one-line strings with tabs expanded, no newlines, and trailing whitespace stripped. Each tab is expanded with between 1 and `tab_width` spaces, so that the next character's index becomes a multiple of `tab_width` (8 by default). Parameters: - `astring`: a multi-line string. - `tab_width`: the number of columns between tab stops. - `convert_whitespace`: convert form feeds and vertical tabs to spaces? - `whitespace`: pattern object with the to-be-converted whitespace characters (default [\\v\\f]). """ if convert_whitespace: > astring = whitespace.sub(' ', astring) E TypeError: expected string or bytes-like object, got 'NoneType' /usr/lib/python3.13/site-packages/docutils/statemachine.py:1506: TypeError --------------------------- Captured stdout teardown --------------------------- # testroot: root # builder: html # srcdir: /tmp/pytest-of-mockbuild/pytest-0/root # outdir: /tmp/pytest-of-mockbuild/pytest-0/root/_build/html # status: Running Sphinx v8.1.3 loading translations [en]... done # warning: ______________________ test_render_define_no_initializer _______________________ app = <SphinxTestApp buildername='html'> def test_render_define_no_initializer(app): sphinx.addnodes.setup(app) member_def = WrappedMemberDef(kind="define", name="USE_MILK") > signature = find_node(render(app, member_def), "desc_signature") test_renderer.py:509: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ test_renderer.py:320: in render return renderer.render(member_def) ../breathe/renderer/sphinxrenderer.py:2624: in render result = method(self, node) ../breathe/renderer/sphinxrenderer.py:2525: in dispatch_memberdef return self.visit_define(node) ../breathe/renderer/sphinxrenderer.py:2080: in visit_define return self.handle_declaration(node, declaration, declarator_callback=add_definition) ../breathe/renderer/sphinxrenderer.py:667: in handle_declaration nodes_ = self.run_directive(obj_type, declaration, content_callback, options) ../breathe/renderer/sphinxrenderer.py:619: in run_directive nodes = directive.run() /usr/lib/python3.13/site-packages/sphinx/domains/c/__init__.py:219: in run return super().run() /usr/lib/python3.13/site-packages/sphinx/directives/__init__.py:287: in run content_children = self.parse_content_to_nodes(allow_section_headings=True) /usr/lib/python3.13/site-packages/sphinx/util/docutils.py:482: in parse_content_to_nodes return nested_parse_to_nodes( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:55: in nested_parse_to_nodes content = _text_to_string_list( /usr/lib/python3.13/site-packages/sphinx/util/parsing.py:94: in _text_to_string_list content = string2lines(text, tab_width, convert_whitespace=True) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ astring = None, tab_width = 8, convert_whitespace = True whitespace = re.compile('[\x0b\x0c]') def string2lines(astring, tab_width=8, convert_whitespace=False, whitespace=re.compile('[\v\f]')): """ Return a list of one-line strings with tabs expanded, no newlines, and trailing whitespace stripped. Each tab is expanded with between 1 and `tab_width` spaces, so that the next character's index becomes a multiple of `tab_width` (8 by default). Parameters: - `astring`: a multi-line string. - `tab_width`: the number of columns between tab stops. - `convert_whitespace`: convert form feeds and vertical tabs to spaces? - `whitespace`: pattern object with the to-be-converted whitespace characters (default [\\v\\f]). """ if convert_whitespace: > astring = whitespace.sub(' ', astring) E TypeError: expected string or bytes-like object, got 'NoneType' /usr/lib/python3.13/site-packages/docutils/statemachine.py:1506: TypeError --------------------------- Captured stdout teardown --------------------------- # testroot: root # builder: html # srcdir: /tmp/pytest-of-mockbuild/pytest-0/root # outdir: /tmp/pytest-of-mockbuild/pytest-0/root/_build/html # status: Running Sphinx v8.1.3 loading translations [en]... done # warning: WARNING: node class 'toctree' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_signature' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_signature_line' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_content' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_inline' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_name' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_addname' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_type' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_returns' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_parameterlist' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_type_parameter_list' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_parameter' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_type_parameter' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_optional' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_annotation' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_sig_literal_char' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_sig_literal_string' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_sig_keyword_type' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_sig_punctuation' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_sig_name' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_sig_literal_number' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_sig_keyword' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_sig_operator' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'desc_sig_space' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'versionmodified' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'seealso' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'productionlist' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'production' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'index' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'centered' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'acks' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'hlist' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'hlistcol' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'compact_paragraph' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'glossary' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'only' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'start_of_file' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'highlightlang' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'tabular_col_spec' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'pending_xref' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'number_reference' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'download_reference' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'literal_emphasis' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'literal_strong' is already registered, its visitors will be overridden [app.add_node] WARNING: node class 'manpage' is already registered, its visitors will be overridden [app.add_node] =============================== warnings summary =============================== test_renderer.py:26 /builddir/build/BUILD/python-breathe-4.35.0-build/breathe-4.35.0/tests/test_renderer.py:26: RemovedInSphinx90Warning: 'sphinx.testing.path' is deprecated. Use 'os.path' or 'pathlib' instead. from sphinx.testing.path import path tests/test_renderer.py: 17 warnings /builddir/build/BUILD/python-breathe-4.35.0-build/breathe-4.35.0/tests/test_renderer.py:132: DeprecationWarning: The frontend.OptionParser class will be replaced by a subclass of argparse.ArgumentParser in Docutils 0.21 or later. settings = frontend.OptionParser(components=(parsers.rst.Parser,)).get_default_values() tests/test_renderer.py: 1190 warnings /usr/lib64/python3.13/optparse.py:1000: DeprecationWarning: The frontend.Option class will be removed in Docutils 0.21 or later. option = self.option_class(*args, **kwargs) -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info ============================ FAILED test_renderer.py::test_render_func - TypeError: expected string or byt... FAILED test_renderer.py::test_render_typedef - TypeError: expected string or ... FAILED test_renderer.py::test_render_c_typedef - TypeError: expected string o... FAILED test_renderer.py::test_render_c_function_typedef - TypeError: expected... FAILED test_renderer.py::test_render_using_alias - TypeError: expected string... FAILED test_renderer.py::test_render_const_func - TypeError: expected string ... FAILED test_renderer.py::test_render_lvalue_func - TypeError: expected string... FAILED test_renderer.py::test_render_rvalue_func - TypeError: expected string... FAILED test_renderer.py::test_render_const_lvalue_func - TypeError: expected ... FAILED test_renderer.py::test_render_const_rvalue_func - TypeError: expected ... FAILED test_renderer.py::test_render_variable_initializer - TypeError: expect... FAILED test_renderer.py::test_render_define_initializer - TypeError: expected... FAILED test_renderer.py::test_render_define_no_initializer - TypeError: expec... ================= 13 failed, 8 passed, 1208 warnings in 2.41s ================== Please work with upstream on this issue, I plan to ship sphinx 8 in two weeks. For the logs from testing build attempts, see: https://copr.fedorainfracloud.org/coprs/thrnciar/python-sphinx/package/python-breathe/ You can test you package in mock running: $ mock -r fedora-rawhide-x86_64 --addrepo=https://download.copr.fedorainfracloud.org/results/thrnciar/python-sphinx/fedora-rawhide-x86_64/ --no-clean your.src.rpm $ mock -r fedora-rawhide-x86_64 --addrepo=https://download.copr.fedorainfracloud.org/results/thrnciar/python-sphinx/fedora-rawhide-x86_64/ shell We'd like to include Sphinx 8 in Fedora 42. Let us know here if you have any questions. Thank you!
Some similar upstream issues https://github.com/breathe-doc/breathe/issues/987 https://github.com/breathe-doc/breathe/issues/1003
This bug appears to have been reported against 'rawhide' during the Fedora Linux 42 development cycle. Changing version to 42.