Page MenuHomePhabricator

Sphinx 4.0.0 build fails with AttributeError due to extensely used type hints
Closed, ResolvedPublicBUG REPORT

Description

List of steps to reproduce

  • run make html to render the Pywikibot docs and create html files

What happens?:

# Sphinx version: 4.0.0
# Python version: 3.9.0 (CPython)
# Docutils version: 0.16 release
# Jinja2 version: 2.11.3
# Last messages:
#   Running Sphinx v4.0.0
#   [autosummary] generating autosummary for: api_ref\index.rst, api_ref\pywikibot.comms.rst, api_ref\pywikibot.config.rst, api_ref\pywikibot.data.rst, api_ref\pywikibot.families.rst, api_ref\pywikibot.page.rst, api_ref\pywikibot.rst, api_ref\pywikibot.site.rst, api_ref\pywikibot.specialbots.rst, api_ref\pywikibot.tools.rst, ..., library_usage.rst, licenses.rst, recipes.rst, scripts\index.rst, scripts\scripts.archive.rst, scripts\scripts.i18n.rst, scripts\scripts.maintenance.rst, scripts\scripts.rst, scripts\scripts.userscripts.rst, utilities\index.rst
#   building [mo]: targets for 0 po files that are out of date
#   building [html]: targets for 29 source files that are out of date
#   updating environment:
#   [new config]
#   29 added, 0 changed, 0 removed
#   reading sources... [  3%] api_ref/index
#   reading sources... [  6%] api_ref/pywikibot
# Loaded extensions:
#   sphinx.ext.mathjax (4.0.0) from c:\python39\lib\site-packages\sphinx\ext\mathjax.py
#   sphinxcontrib.applehelp (1.0.2) from c:\python39\lib\site-packages\sphinxcontrib\applehelp\__init__.py
#   sphinxcontrib.devhelp (1.0.2) from c:\python39\lib\site-packages\sphinxcontrib\devhelp\__init__.py
#   sphinxcontrib.htmlhelp (1.0.3) from c:\python39\lib\site-packages\sphinxcontrib\htmlhelp\__init__.py
#   sphinxcontrib.serializinghtml (1.1.4) from c:\python39\lib\site-packages\sphinxcontrib\serializinghtml\__init__.py
#   sphinxcontrib.qthelp (1.0.3) from c:\python39\lib\site-packages\sphinxcontrib\qthelp\__init__.py
#   alabaster (0.7.12) from c:\python39\lib\site-packages\alabaster\__init__.py
#   sphinx.ext.autodoc.preserve_defaults (1.0) from c:\python39\lib\site-packages\sphinx\ext\autodoc\preserve_defaults.py
#   sphinx.ext.autodoc.type_comment (4.0.0) from c:\python39\lib\site-packages\sphinx\ext\autodoc\type_comment.py
#   sphinx.ext.autodoc (4.0.0) from c:\python39\lib\site-packages\sphinx\ext\autodoc\__init__.py
#   sphinx.ext.todo (4.0.0) from c:\python39\lib\site-packages\sphinx\ext\todo.py
#   sphinx.ext.coverage (4.0.0) from c:\python39\lib\site-packages\sphinx\ext\coverage.py
#   sphinx.ext.viewcode (4.0.0) from c:\python39\lib\site-packages\sphinx\ext\viewcode.py
#   sphinx.ext.autosummary (4.0.0) from c:\python39\lib\site-packages\sphinx\ext\autosummary\__init__.py
#   sphinx.ext.napoleon (4.0.0) from c:\python39\lib\site-packages\sphinx\ext\napoleon\__init__.py
Traceback (most recent call last):
  File "c:\python39\lib\site-packages\sphinx\cmd\build.py", line 280, in build_main
    app.build(args.force_all, filenames)
  File "c:\python39\lib\site-packages\sphinx\application.py", line 350, in build
    self.builder.build_update()
  File "c:\python39\lib\site-packages\sphinx\builders\__init__.py", line 292, in build_update
    self.build(to_build,
  File "c:\python39\lib\site-packages\sphinx\builders\__init__.py", line 306, in build
    updated_docnames = set(self.read())
  File "c:\python39\lib\site-packages\sphinx\builders\__init__.py", line 413, in read
    self._read_serial(docnames)
  File "c:\python39\lib\site-packages\sphinx\builders\__init__.py", line 434, in _read_serial
    self.read_doc(docname)
  File "c:\python39\lib\site-packages\sphinx\builders\__init__.py", line 474, in read_doc
    doctree = read_doc(self.app, self.env, self.env.doc2path(docname))
  File "c:\python39\lib\site-packages\sphinx\io.py", line 188, in read_doc
    pub.publish()
  File "c:\python39\lib\site-packages\docutils\core.py", line 217, in publish
    self.document = self.reader.read(self.source, self.parser,
  File "c:\python39\lib\site-packages\sphinx\io.py", line 108, in read
    self.parse()
  File "c:\python39\lib\site-packages\docutils\readers\__init__.py", line 77, in parse
    self.parser.parse(self.input, document)
  File "c:\python39\lib\site-packages\sphinx\parsers.py", line 100, in parse
    self.statemachine.run(inputlines, document, inliner=self.inliner)
  File "c:\python39\lib\site-packages\docutils\parsers\rst\states.py", line 170, in run
    results = StateMachineWS.run(self, input_lines, input_offset,
  File "c:\python39\lib\site-packages\docutils\statemachine.py", line 241, in run
    context, next_state, result = self.check_line(
  File "c:\python39\lib\site-packages\docutils\statemachine.py", line 459, in check_line
    return method(match, context, next_state)
  File "c:\python39\lib\site-packages\docutils\parsers\rst\states.py", line 2769, in underline
    self.section(title, source, style, lineno - 1, messages)
  File "c:\python39\lib\site-packages\docutils\parsers\rst\states.py", line 327, in section
    self.new_subsection(title, lineno, messages)
  File "c:\python39\lib\site-packages\docutils\parsers\rst\states.py", line 393, in new_subsection
    newabsoffset = self.nested_parse(
  File "c:\python39\lib\site-packages\docutils\parsers\rst\states.py", line 281, in nested_parse
    state_machine.run(block, input_offset, memo=self.memo,
  File "c:\python39\lib\site-packages\docutils\parsers\rst\states.py", line 196, in run
    results = StateMachineWS.run(self, input_lines, input_offset)
  File "c:\python39\lib\site-packages\docutils\statemachine.py", line 241, in run
    context, next_state, result = self.check_line(
  File "c:\python39\lib\site-packages\docutils\statemachine.py", line 459, in check_line
    return method(match, context, next_state)
  File "c:\python39\lib\site-packages\docutils\parsers\rst\states.py", line 2769, in underline
    self.section(title, source, style, lineno - 1, messages)
  File "c:\python39\lib\site-packages\docutils\parsers\rst\states.py", line 327, in section
    self.new_subsection(title, lineno, messages)
  File "c:\python39\lib\site-packages\docutils\parsers\rst\states.py", line 393, in new_subsection
    newabsoffset = self.nested_parse(
  File "c:\python39\lib\site-packages\docutils\parsers\rst\states.py", line 281, in nested_parse
    state_machine.run(block, input_offset, memo=self.memo,
  File "c:\python39\lib\site-packages\docutils\parsers\rst\states.py", line 196, in run
    results = StateMachineWS.run(self, input_lines, input_offset)
  File "c:\python39\lib\site-packages\docutils\statemachine.py", line 241, in run
    context, next_state, result = self.check_line(
  File "c:\python39\lib\site-packages\docutils\statemachine.py", line 459, in check_line
    return method(match, context, next_state)
  File "c:\python39\lib\site-packages\docutils\parsers\rst\states.py", line 2342, in explicit_markup
    nodelist, blank_finish = self.explicit_construct(match)
  File "c:\python39\lib\site-packages\docutils\parsers\rst\states.py", line 2354, in explicit_construct
    return method(self, expmatch)
  File "c:\python39\lib\site-packages\docutils\parsers\rst\states.py", line 2096, in directive
    return self.run_directive(
  File "c:\python39\lib\site-packages\docutils\parsers\rst\states.py", line 2146, in run_directive
    result = directive_instance.run()
  File "c:\python39\lib\site-packages\sphinx\ext\autodoc\directive.py", line 162, in run
    documenter.generate(more_content=self.content)
  File "c:\python39\lib\site-packages\sphinx\ext\autodoc\__init__.py", line 964, in generate
    self.document_members(all_members)
  File "c:\python39\lib\site-packages\sphinx\ext\autodoc\__init__.py", line 845, in document_members
    documenter.generate(
  File "c:\python39\lib\site-packages\sphinx\ext\autodoc\__init__.py", line 1715, in generate
    return super().generate(more_content=more_content,
  File "c:\python39\lib\site-packages\sphinx\ext\autodoc\__init__.py", line 954, in generate
    self.add_directive_header(sig)
  File "c:\python39\lib\site-packages\sphinx\ext\autodoc\__init__.py", line 1619, in add_directive_header
    bases = [restify(cls) for cls in self.object.__orig_bases__]
  File "c:\python39\lib\site-packages\sphinx\ext\autodoc\__init__.py", line 1619, in <listcomp>
    bases = [restify(cls) for cls in self.object.__orig_bases__]
  File "c:\python39\lib\site-packages\sphinx\util\typing.py", line 126, in restify
    return _restify_py37(cls)
  File "c:\python39\lib\site-packages\sphinx\util\typing.py", line 165, in _restify_py37
    text += r"\ [%s]" % ", ".join(restify(a) for a in cls.__args__)
  File "c:\python39\lib\site-packages\sphinx\util\typing.py", line 165, in <genexpr>
    text += r"\ [%s]" % ", ".join(restify(a) for a in cls.__args__)
  File "c:\python39\lib\site-packages\sphinx\util\typing.py", line 122, in restify
    elif cls.__module__ in ('__builtin__', 'builtins'):
AttributeError: 'str' object has no attribute '__module__'

The reason is an extensely use of typing hints, see

What should have happened instead?:
Build should pass

Software version (if not a Wikimedia wiki), browser information, screenshots, other information, etc:
See above

Event Timeline

Xqt triaged this task as High priority.Oct 10 2021, 10:49 AM

Change 729475 had a related patch set uploaded (by Xqt; author: Xqt):

[pywikibot/core@master] [bugfix] Require sphinx >= 4.1

https://gerrit.wikimedia.org/r/729475

Change 729475 merged by jenkins-bot:

[pywikibot/core@master] [bugfix] Require sphinx >= 4.1

https://gerrit.wikimedia.org/r/729475