Skip to content

Commit

Permalink
bpo-40204: Add :noindex: in the documentation (GH-21859)
Browse files Browse the repository at this point in the history
Add :noindex: to duplicated documentation to fix "duplicate object
description" errors.

For example, fix this Sphinx 3 issue:

Doc/library/configparser.rst:1146: WARNING: duplicate object
description of configparser.ConfigParser.optionxform, other instance
in library/configparser, use :noindex: for one of them
  • Loading branch information
vstinner authored Aug 13, 2020
1 parent 20ae565 commit d3ded08
Show file tree
Hide file tree
Showing 9 changed files with 94 additions and 81 deletions.
2 changes: 2 additions & 0 deletions Doc/library/aifc.rst
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@ number of frames must be filled in.


.. method:: aifc.tell()
:noindex:

Return the current write position in the output file. Useful in combination
with :meth:`setmark`.
Expand All @@ -232,6 +233,7 @@ number of frames must be filled in.


.. method:: aifc.close()
:noindex:

Close the AIFF file. The header of the file is updated to reflect the actual
size of the audio data. After calling this method, the object can no longer be
Expand Down
161 changes: 81 additions & 80 deletions Doc/library/configparser.rst
Original file line number Diff line number Diff line change
Expand Up @@ -674,97 +674,98 @@ be overridden by subclasses or by attribute assignment.

.. attribute:: ConfigParser.BOOLEAN_STATES

By default when using :meth:`~ConfigParser.getboolean`, config parsers
consider the following values ``True``: ``'1'``, ``'yes'``, ``'true'``,
``'on'`` and the following values ``False``: ``'0'``, ``'no'``, ``'false'``,
``'off'``. You can override this by specifying a custom dictionary of strings
and their Boolean outcomes. For example:

.. doctest::

>>> custom = configparser.ConfigParser()
>>> custom['section1'] = {'funky': 'nope'}
>>> custom['section1'].getboolean('funky')
Traceback (most recent call last):
...
ValueError: Not a boolean: nope
>>> custom.BOOLEAN_STATES = {'sure': True, 'nope': False}
>>> custom['section1'].getboolean('funky')
False

Other typical Boolean pairs include ``accept``/``reject`` or
``enabled``/``disabled``.
By default when using :meth:`~ConfigParser.getboolean`, config parsers
consider the following values ``True``: ``'1'``, ``'yes'``, ``'true'``,
``'on'`` and the following values ``False``: ``'0'``, ``'no'``, ``'false'``,
``'off'``. You can override this by specifying a custom dictionary of strings
and their Boolean outcomes. For example:

.. doctest::

>>> custom = configparser.ConfigParser()
>>> custom['section1'] = {'funky': 'nope'}
>>> custom['section1'].getboolean('funky')
Traceback (most recent call last):
...
ValueError: Not a boolean: nope
>>> custom.BOOLEAN_STATES = {'sure': True, 'nope': False}
>>> custom['section1'].getboolean('funky')
False

Other typical Boolean pairs include ``accept``/``reject`` or
``enabled``/``disabled``.

.. method:: ConfigParser.optionxform(option)
:noindex:

This method transforms option names on every read, get, or set
operation. The default converts the name to lowercase. This also
means that when a configuration file gets written, all keys will be
lowercase. Override this method if that's unsuitable.
For example:
This method transforms option names on every read, get, or set
operation. The default converts the name to lowercase. This also
means that when a configuration file gets written, all keys will be
lowercase. Override this method if that's unsuitable.
For example:

.. doctest::
.. doctest::

>>> config = """
... [Section1]
... Key = Value
...
... [Section2]
... AnotherKey = Value
... """
>>> typical = configparser.ConfigParser()
>>> typical.read_string(config)
>>> list(typical['Section1'].keys())
['key']
>>> list(typical['Section2'].keys())
['anotherkey']
>>> custom = configparser.RawConfigParser()
>>> custom.optionxform = lambda option: option
>>> custom.read_string(config)
>>> list(custom['Section1'].keys())
['Key']
>>> list(custom['Section2'].keys())
['AnotherKey']

>>> config = """
... [Section1]
... Key = Value
...
... [Section2]
... AnotherKey = Value
... """
>>> typical = configparser.ConfigParser()
>>> typical.read_string(config)
>>> list(typical['Section1'].keys())
['key']
>>> list(typical['Section2'].keys())
['anotherkey']
>>> custom = configparser.RawConfigParser()
>>> custom.optionxform = lambda option: option
>>> custom.read_string(config)
>>> list(custom['Section1'].keys())
['Key']
>>> list(custom['Section2'].keys())
['AnotherKey']

.. note::
The optionxform function transforms option names to a canonical form.
This should be an idempotent function: if the name is already in
canonical form, it should be returned unchanged.
.. note::
The optionxform function transforms option names to a canonical form.
This should be an idempotent function: if the name is already in
canonical form, it should be returned unchanged.


.. attribute:: ConfigParser.SECTCRE

A compiled regular expression used to parse section headers. The default
matches ``[section]`` to the name ``"section"``. Whitespace is considered
part of the section name, thus ``[ larch ]`` will be read as a section of
name ``" larch "``. Override this attribute if that's unsuitable. For
example:
A compiled regular expression used to parse section headers. The default
matches ``[section]`` to the name ``"section"``. Whitespace is considered
part of the section name, thus ``[ larch ]`` will be read as a section of
name ``" larch "``. Override this attribute if that's unsuitable. For
example:

.. doctest::

>>> import re
>>> config = """
... [Section 1]
... option = value
...
... [ Section 2 ]
... another = val
... """
>>> typical = configparser.ConfigParser()
>>> typical.read_string(config)
>>> typical.sections()
['Section 1', ' Section 2 ']
>>> custom = configparser.ConfigParser()
>>> custom.SECTCRE = re.compile(r"\[ *(?P<header>[^]]+?) *\]")
>>> custom.read_string(config)
>>> custom.sections()
['Section 1', 'Section 2']

.. doctest::
.. note::

>>> import re
>>> config = """
... [Section 1]
... option = value
...
... [ Section 2 ]
... another = val
... """
>>> typical = configparser.ConfigParser()
>>> typical.read_string(config)
>>> typical.sections()
['Section 1', ' Section 2 ']
>>> custom = configparser.ConfigParser()
>>> custom.SECTCRE = re.compile(r"\[ *(?P<header>[^]]+?) *\]")
>>> custom.read_string(config)
>>> custom.sections()
['Section 1', 'Section 2']

.. note::

While ConfigParser objects also use an ``OPTCRE`` attribute for recognizing
option lines, it's not recommended to override it because that would
interfere with constructor options *allow_no_value* and *delimiters*.
While ConfigParser objects also use an ``OPTCRE`` attribute for recognizing
option lines, it's not recommended to override it because that would
interfere with constructor options *allow_no_value* and *delimiters*.


Legacy API Examples
Expand Down
2 changes: 2 additions & 0 deletions Doc/library/difflib.rst
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ diffs. For comparing directories and files, see also, the :mod:`filecmp` module.


.. class:: SequenceMatcher
:noindex:

This is a flexible class for comparing pairs of sequences of any type, so long
as the sequence elements are :term:`hashable`. The basic algorithm predates, and is a
Expand Down Expand Up @@ -651,6 +652,7 @@ The :class:`Differ` class has this constructor:


.. class:: Differ(linejunk=None, charjunk=None)
:noindex:

Optional keyword parameters *linejunk* and *charjunk* are for filter functions
(or ``None``):
Expand Down
1 change: 1 addition & 0 deletions Doc/library/enum.rst
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ helper, :class:`auto`.
the bitwise operations without losing their :class:`Flag` membership.

.. function:: unique
:noindex:

Enum class decorator that ensures only one name is bound to any one value.

Expand Down
2 changes: 2 additions & 0 deletions Doc/library/socket.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1695,7 +1695,9 @@ to sockets.

.. method:: socket.setsockopt(level, optname, value: int)
.. method:: socket.setsockopt(level, optname, value: buffer)
:noindex:
.. method:: socket.setsockopt(level, optname, None, optlen: int)
:noindex:

.. index:: module: struct

Expand Down
1 change: 1 addition & 0 deletions Doc/library/tarfile.rst
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ Some facts and figures:


.. class:: TarFile
:noindex:

Class for reading and writing tar archives. Do not use this class directly:
use :func:`tarfile.open` instead. See :ref:`tarfile-objects`.
Expand Down
1 change: 1 addition & 0 deletions Doc/library/token.rst
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ the :mod:`tokenize` module.


.. data:: TYPE_COMMENT
:noindex:

Token value indicating that a type comment was recognized. Such
tokens are only produced when :func:`ast.parse()` is invoked with
Expand Down
3 changes: 3 additions & 0 deletions Doc/library/turtle.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1069,6 +1069,7 @@ More drawing control
~~~~~~~~~~~~~~~~~~~~

.. function:: reset()
:noindex:

Delete the turtle's drawings from the screen, re-center the turtle and set
variables to the default values.
Expand All @@ -1090,6 +1091,7 @@ More drawing control


.. function:: clear()
:noindex:

Delete the turtle's drawings from the screen. Do not move turtle. State and
position of the turtle as well as drawings of other turtles are not affected.
Expand Down Expand Up @@ -1362,6 +1364,7 @@ Using events
------------

.. function:: onclick(fun, btn=1, add=None)
:noindex:

:param fun: a function with two arguments which will be called with the
coordinates of the clicked point on the canvas
Expand Down
2 changes: 1 addition & 1 deletion Doc/library/urllib.request.rst
Original file line number Diff line number Diff line change
Expand Up @@ -946,7 +946,7 @@ tracking URIs for which authentication credentials should always be sent.
If *is_authenticated* is specified as ``True``, *realm* is ignored.


.. method:: HTTPPasswordMgr.find_user_password(realm, authuri)
.. method:: HTTPPasswordMgrWithPriorAuth.find_user_password(realm, authuri)

Same as for :class:`HTTPPasswordMgrWithDefaultRealm` objects

Expand Down

0 comments on commit d3ded08

Please sign in to comment.