Skip to content

gh-151950: Fix Sphinx reference warnings in wsgiref docs#154498

Open
sach98 wants to merge 2 commits into
python:mainfrom
sach98:docs-wsgiref-nitpick
Open

gh-151950: Fix Sphinx reference warnings in wsgiref docs#154498
sach98 wants to merge 2 commits into
python:mainfrom
sach98:docs-wsgiref-nitpick

Conversation

@sach98

@sach98 sach98 commented Jul 22, 2026

Copy link
Copy Markdown

Fixes the 18 nit-picky Sphinx reference warnings in Doc/library/wsgiref.rst and removes the file from Doc/tools/.nitignore.

Where a correct target already exists, the reference is qualified so it resolves:

  • The filelike object's read and close become :meth:`~io.BufferedIOBase.read``` and :meth:~io.IOBase.close```. This matches the existing ``:meth:~io.BufferedIOBase.write``` reference further down the same file.
  • shift_path_info and guess_scheme are documented in wsgiref.util but were referenced from a different module context, so they are now qualified.
  • serve_forever and handle_request point at socketserver.BaseServer, which is where WSGIServer actually inherits them from.

The remaining names have no documented target anywhere: Headers.keys, Headers.values, Headers.items, WSGIServer.base_environ, BaseHandler.environ and SimpleHandler.stdin / stdout / stderr are described only in prose, and paste.lint is third party. Those use the ! prefix, which keeps the semantic markup and drops the link.

I kept this to reference fixes so the diff stays limited to removing the warnings. If you would prefer the undocumented Headers methods and handler attributes to become proper .. method:: and .. attribute:: entries instead (as was done for the lzma constants in gh-151949), I am happy to do that here or in a follow-up.

Verified with a fresh nit-picky build: warnings for this file go from 18 to 0, total build warnings go from 1352 to 1334, no new warnings elsewhere, and Doc/tools/check-warnings.py --fail-if-regression --fail-if-improved exits 0.

@bedevere-app bedevere-app Bot added docs Documentation in the Doc dir skip news labels Jul 22, 2026
@python-cla-bot

python-cla-bot Bot commented Jul 22, 2026

Copy link
Copy Markdown

All commit authors signed the Contributor License Agreement.

CLA signed

@read-the-docs-community

read-the-docs-community Bot commented Jul 22, 2026

Copy link
Copy Markdown

@picnixz

picnixz commented Jul 24, 2026

Copy link
Copy Markdown
Member

The purpose was to document those attributes, not suppress them. Please do so.

@picnixz picnixz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please document the header objects properly.

@bedevere-app

bedevere-app Bot commented Jul 24, 2026

Copy link
Copy Markdown

A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated.

Once you have made the requested changes, please leave a comment on this pull request containing the phrase I have made the requested changes; please review again. I will then notify any core developers who have left a review that you're ready for them to take another look at this pull request.

And if you don't make the requested changes, you will be put in the comfy chair!

Replace the "!"-suppressed references with real targets: .. method::
directives for Headers.keys(), Headers.values() and Headers.items(), and
.. attribute:: directives for WSGIServer.base_environ,
BaseHandler.environ and SimpleHandler's stdin, stdout and stderr.

Correct the SimpleHandler paragraph while documenting it: the constructor
stores the supplied environment in base_env, not environ, and
add_cgi_vars() merges it into BaseHandler.environ during setup_environ().

paste.lint (a third-party module) and FileWrapper.close (bound
conditionally from the wrapped object, never defined on the class) keep
the "!" prefix, since neither can have a real target.
@sach98

sach98 commented Jul 25, 2026

Copy link
Copy Markdown
Author

Thanks, that's fair. I've replaced the suppressions with real targets:

  • Headers.keys(), Headers.values() and Headers.items() are now documented with .. method:: directives alongside get_all() and add_header(), and the paragraph above them no longer repeats what they say.
  • WSGIServer.base_environ is now an .. attribute::.
  • BaseHandler.environ is now an .. attribute::, which is what the add_cgi_vars(), get_scheme() and setup_environ() references resolve to.
  • SimpleHandler.stdin, stdout and stderr are now documented attributes.

One thing I ran into while doing that: the SimpleHandler paragraph was inaccurate. It said the supplied environment is stored in an environ attribute, but __init__ stores it in base_env, and add_cgi_vars() merges that into BaseHandler.environ during setup_environ(). Rather than document a SimpleHandler.environ that does not hold what the sentence claimed, I reworded the sentence to match the code. Happy to split that into its own PR if you would rather keep this one purely markup.

Two references are still suppressed, and I believe that is correct in both cases:

  • :mod:`!paste.lint`: a third-party module (Ian Bicking's Paste). No target exists in CPython's docs or in any intersphinx inventory.
  • :meth:`!close` on FileWrapper: FileWrapper never defines close(). __init__ does if hasattr(filelike, 'close'): self.close = filelike.close, so the attribute exists only for some wrapped objects, and it is the wrapped object's own bound method. A .. method:: FileWrapper.close() directive would assert that it is always present, which is not true, and the surrounding prose already states the conditional behaviour. Happy to document it anyway, with the condition spelled out in the body, if you prefer.

One more that I left alone deliberately, so tell me if you want it in scope: the class description still points get and setdefault at dict.get and dict.setdefault, but Headers defines its own, with case-insensitive lookup and multi-valued-header semantics that the dict methods do not have. That text predates this PR so I did not touch it, but it is the same kind of fix if you want it here.

I have made the requested changes; please review again

@bedevere-app

bedevere-app Bot commented Jul 25, 2026

Copy link
Copy Markdown

Thanks for making the requested changes!

@picnixz: please review the changes made to this pull request.

@bedevere-app
bedevere-app Bot requested a review from picnixz July 25, 2026 20:51

@picnixz picnixz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If possible add versionadded/versionchanged directives to methods/atters that were not present at the beginning (i.e. if they were added later).

And also, if you using an agent, make sure that you review its output. Agents are quite bad at placement in my experience.

Comment thread Doc/library/wsgiref.rst
``len()`` of a :class:`Headers` object is the same as the length of its
:meth:`items`, which is the same as the length of the wrapped header list. In
fact, the :meth:`items` method just returns a copy of the wrapped header list.
:meth:`items`, which is the same as the length of the wrapped header list.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The "in fact" got dropped

Comment thread Doc/library/wsgiref.rst
:meth:`items`, which is the same as the length of the wrapped header list.


.. method:: Headers.keys()

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Above we say that Headers implement dict.get. So we could maybe reference dict.keys() instead. I do not remember whether it is implemented specifically or not. If .keys() etc are explicit methods on the Header class, you can keep this.

Comment thread Doc/library/wsgiref.rst
:meth:`get_app` exists mainly for the benefit of request handler instances.


.. attribute:: WSGIServer.base_environ

@picnixz picnixz Jul 26, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Check if this page documents attributes before methods or vice-versa first. I believe attributes are put first. Then move that one accordingly. It is weird to have this attribute documentation here

Comment thread Doc/library/wsgiref.rst
and the :attr:`server_software` attribute is set.


.. attribute:: BaseHandler.environ

@picnixz picnixz Jul 26, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Move this in the attributes section

@bedevere-app

bedevere-app Bot commented Jul 26, 2026

Copy link
Copy Markdown

A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated.

Once you have made the requested changes, please leave a comment on this pull request containing the phrase I have made the requested changes; please review again. I will then notify any core developers who have left a review that you're ready for them to take another look at this pull request.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting changes docs Documentation in the Doc dir skip news

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

2 participants