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

@sach98sach98 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-appbedevere-appBot added docs Documentation in the Doc dir skip news labels Jul 22, 2026
@python-cla-bot

python-cla-botBot 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-communityBot commented Jul 22, 2026

Copy link
Copy Markdown

@picnixz

Copy link
Copy Markdown
Member

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

@picnixzpicnixz 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

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

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

Copy link
Copy Markdown

Thanks for making the requested changes!

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

@bedevere-app
bedevere-appBot requested a review from picnixzJuly 25, 2026 20:51

@picnixzpicnixz 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.

``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

: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.

:meth:`get_app` exists mainly for the benefit of request handler instances.


.. attribute:: WSGIServer.base_environ

@picnixzpicnixzJul 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

and the :attr:`server_software` attribute is set.


.. attribute:: BaseHandler.environ

@picnixzpicnixzJul 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

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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting changesdocsDocumentation in the Doc dirskip news

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

2 participants

@sach98@picnixz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
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

@sach98sach98 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-appbedevere-appBot added docs Documentation in the Doc dir skip news labels Jul 22, 2026
@python-cla-bot

python-cla-botBot 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-communityBot commented Jul 22, 2026

Copy link
Copy Markdown

@picnixz

Copy link
Copy Markdown
Member

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

@picnixzpicnixz 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

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

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

Copy link
Copy Markdown

Thanks for making the requested changes!

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

@bedevere-app
bedevere-appBot requested a review from picnixzJuly 25, 2026 20:51

@picnixzpicnixz 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.

``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

: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.

:meth:`get_app` exists mainly for the benefit of request handler instances.


.. attribute:: WSGIServer.base_environ

@picnixzpicnixzJul 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

and the :attr:`server_software` attribute is set.


.. attribute:: BaseHandler.environ

@picnixzpicnixzJul 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

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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting changesdocsDocumentation in the Doc dirskip news

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

2 participants

@sach98@picnixz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@sach98sach98 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-appbedevere-appBot added docs Documentation in the Doc dir skip news labels Jul 22, 2026
@python-cla-bot

python-cla-botBot 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-communityBot commented Jul 22, 2026

Copy link
Copy Markdown

@picnixz

Copy link
Copy Markdown
Member

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

@picnixzpicnixz 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

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

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

Copy link
Copy Markdown

Thanks for making the requested changes!

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

@bedevere-app
bedevere-appBot requested a review from picnixzJuly 25, 2026 20:51

@picnixzpicnixz 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.

``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

: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.

:meth:`get_app` exists mainly for the benefit of request handler instances.


.. attribute:: WSGIServer.base_environ

@picnixzpicnixzJul 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

and the :attr:`server_software` attribute is set.


.. attribute:: BaseHandler.environ

@picnixzpicnixzJul 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

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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting changesdocsDocumentation in the Doc dirskip news

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

2 participants

@sach98@picnixz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@sach98sach98 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-appbedevere-appBot added docs Documentation in the Doc dir skip news labels Jul 22, 2026
@python-cla-bot

python-cla-botBot 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-communityBot commented Jul 22, 2026

Copy link
Copy Markdown

@picnixz

Copy link
Copy Markdown
Member

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

@picnixzpicnixz 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

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

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

Copy link
Copy Markdown

Thanks for making the requested changes!

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

@bedevere-app
bedevere-appBot requested a review from picnixzJuly 25, 2026 20:51

@picnixzpicnixz 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.

``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

: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.

:meth:`get_app` exists mainly for the benefit of request handler instances.


.. attribute:: WSGIServer.base_environ

@picnixzpicnixzJul 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

and the :attr:`server_software` attribute is set.


.. attribute:: BaseHandler.environ

@picnixzpicnixzJul 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

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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting changesdocsDocumentation in the Doc dirskip news

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

2 participants

@sach98@picnixz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
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

@sach98sach98 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-appbedevere-appBot added docs Documentation in the Doc dir skip news labels Jul 22, 2026
@python-cla-bot

python-cla-botBot 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-communityBot commented Jul 22, 2026

Copy link
Copy Markdown

@picnixz

Copy link
Copy Markdown
Member

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

@picnixzpicnixz 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

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

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

Copy link
Copy Markdown

Thanks for making the requested changes!

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

@bedevere-app
bedevere-appBot requested a review from picnixzJuly 25, 2026 20:51

@picnixzpicnixz 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.

``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

: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.

:meth:`get_app` exists mainly for the benefit of request handler instances.


.. attribute:: WSGIServer.base_environ

@picnixzpicnixzJul 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

and the :attr:`server_software` attribute is set.


.. attribute:: BaseHandler.environ

@picnixzpicnixzJul 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

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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting changesdocsDocumentation in the Doc dirskip news

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

2 participants

@sach98@picnixz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@sach98sach98 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-appbedevere-appBot added docs Documentation in the Doc dir skip news labels Jul 22, 2026
@python-cla-bot

python-cla-botBot 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-communityBot commented Jul 22, 2026

Copy link
Copy Markdown

@picnixz

Copy link
Copy Markdown
Member

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

@picnixzpicnixz 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

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

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

Copy link
Copy Markdown

Thanks for making the requested changes!

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

@bedevere-app
bedevere-appBot requested a review from picnixzJuly 25, 2026 20:51

@picnixzpicnixz 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.

``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

: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.

:meth:`get_app` exists mainly for the benefit of request handler instances.


.. attribute:: WSGIServer.base_environ

@picnixzpicnixzJul 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

and the :attr:`server_software` attribute is set.


.. attribute:: BaseHandler.environ

@picnixzpicnixzJul 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

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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting changesdocsDocumentation in the Doc dirskip news

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

2 participants

@sach98@picnixz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@sach98sach98 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-appbedevere-appBot added docs Documentation in the Doc dir skip news labels Jul 22, 2026
@python-cla-bot

python-cla-botBot 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-communityBot commented Jul 22, 2026

Copy link
Copy Markdown

@picnixz

Copy link
Copy Markdown
Member

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

@picnixzpicnixz 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

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

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

Copy link
Copy Markdown

Thanks for making the requested changes!

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

@bedevere-app
bedevere-appBot requested a review from picnixzJuly 25, 2026 20:51

@picnixzpicnixz 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.

``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

: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.

:meth:`get_app` exists mainly for the benefit of request handler instances.


.. attribute:: WSGIServer.base_environ

@picnixzpicnixzJul 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

and the :attr:`server_software` attribute is set.


.. attribute:: BaseHandler.environ

@picnixzpicnixzJul 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

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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting changesdocsDocumentation in the Doc dirskip news

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

2 participants

@sach98@picnixz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
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

@sach98sach98 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-appbedevere-appBot added docs Documentation in the Doc dir skip news labels Jul 22, 2026
@python-cla-bot

python-cla-botBot 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-communityBot commented Jul 22, 2026

Copy link
Copy Markdown

@picnixz

Copy link
Copy Markdown
Member

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

@picnixzpicnixz 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

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

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

Copy link
Copy Markdown

Thanks for making the requested changes!

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

@bedevere-app
bedevere-appBot requested a review from picnixzJuly 25, 2026 20:51

@picnixzpicnixz 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.

``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

: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.

:meth:`get_app` exists mainly for the benefit of request handler instances.


.. attribute:: WSGIServer.base_environ

@picnixzpicnixzJul 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

and the :attr:`server_software` attribute is set.


.. attribute:: BaseHandler.environ

@picnixzpicnixzJul 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

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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting changesdocsDocumentation in the Doc dirskip news

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

2 participants

@sach98@picnixz