]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-42238: Check Misc/NEWS.d/next/ for reStructuredText issues. (GH-23802)
authorJulien Palard <julien@palard.fr>
Fri, 18 Dec 2020 09:48:08 +0000 (10:48 +0100)
committerGitHub <noreply@github.com>
Fri, 18 Dec 2020 09:48:08 +0000 (10:48 +0100)
Doc/Makefile
Doc/tools/rstlint.py
Misc/NEWS.d/next/Core and Builtins/2020-11-20-00-57-47.bpo-42195.HeqcpS.rst
Misc/NEWS.d/next/Library/2020-10-02-10-19-49.bpo-41907.wiIEsz.rst
Misc/NEWS.d/next/Library/2020-12-08-22-43-35.bpo-42678.ba9ktU.rst
Misc/NEWS.d/next/Library/2020-12-10-18-36-52.bpo-39717.sK2u0w.rst
Misc/NEWS.d/next/Library/2020-12-15-10-00-04.bpo-42644.XgLCNx.rst

index c24c70c699a06a5ba208579e124dd93e51f070f2..f113dd06539869b46f1629faaa52ad2a70ce0257 100644 (file)
@@ -202,6 +202,7 @@ dist:
 
 check:
        $(PYTHON) tools/rstlint.py -i tools -i $(VENVDIR) -i README.rst
+       $(PYTHON) tools/rstlint.py ../Misc/NEWS.d/next/
 
 serve:
        $(PYTHON) ../Tools/scripts/serve.py build/html
index a3024d6734d25b296b035b3a74aecaa67de3f74f..cbcb8eb801b1356ff654b190ae8f9e9175cea929 100755 (executable)
@@ -13,6 +13,7 @@ import os
 import re
 import sys
 import getopt
+from string import ascii_letters
 from os.path import join, splitext, abspath, exists
 from collections import defaultdict
 
@@ -128,6 +129,81 @@ def check_leaked_markup(fn, lines):
             yield lno+1, 'possibly leaked markup: %r' % line
 
 
+def hide_literal_blocks(lines):
+    """Tool to remove literal blocks from given lines.
+
+    It yields empty lines in place of blocks, so line numbers are
+    still meaningful.
+    """
+    in_block = False
+    for line in lines:
+        if line.endswith("::\n"):
+            in_block = True
+        elif in_block:
+            if line == "\n" or line.startswith(" "):
+                line = "\n"
+            else:
+                in_block = False
+        yield line
+
+
+def type_of_explicit_markup(line):
+    if re.match(fr'\.\. {all_directives}::', line):
+        return 'directive'
+    if re.match(r'\.\. \[[0-9]+\] ', line):
+        return 'footnote'
+    if re.match(r'\.\. \[[^\]]+\] ', line):
+        return 'citation'
+    if re.match(r'\.\. _.*[^_]: ', line):
+        return 'target'
+    if re.match(r'\.\. \|[^\|]*\| ', line):
+        return 'substitution_definition'
+    return 'comment'
+
+
+def hide_comments(lines):
+    """Tool to remove comments from given lines.
+
+    It yields empty lines in place of comments, so line numbers are
+    still meaningfull.
+    """
+    in_multiline_comment = False
+    for line in lines:
+        if line == "..\n":
+            in_multiline_comment = True
+        elif in_multiline_comment:
+            if line == "\n" or line.startswith(" "):
+                line = "\n"
+            else:
+                in_multiline_comment = False
+        if line.startswith(".. ") and type_of_explicit_markup(line) == 'comment':
+            line = "\n"
+        yield line
+
+
+
+@checker(".rst", severity=2)
+def check_missing_surrogate_space_on_plural(fn, lines):
+    r"""Check for missing 'backslash-space' between a code sample a letter.
+
+    Good: ``Point``\ s
+    Bad: ``Point``s
+    """
+    in_code_sample = False
+    check_next_one = False
+    for lno, line in enumerate(hide_comments(hide_literal_blocks(lines))):
+        tokens = line.split("``")
+        for token_no, token in enumerate(tokens):
+            if check_next_one:
+                if token[0] in ascii_letters:
+                    yield lno + 1, f"Missing backslash-space between code sample and {token!r}."
+                check_next_one = False
+            if token_no == len(tokens) - 1:
+                continue
+            if in_code_sample:
+                check_next_one = True
+            in_code_sample = not in_code_sample
+
 def main(argv):
     usage = '''\
 Usage: %s [-v] [-f] [-s sev] [-i path]* [path]
index fec4b7f81cb45b9169db3eb3564beff320d92921..87e8c0e89b3b8f73ac71d0293cb0ffbecce7766a 100644 (file)
@@ -1,11 +1,10 @@
 The ``__args__`` of the parameterized generics for :data:`typing.Callable`
-and :class:`collections.abc.Callable` are now consistent.  The ``__args__`` 
-for :class:`collections.abc.Callable` are now flattened while 
-:data:`typing.Callable`'s have not changed.  To allow this change, 
-:class:`types.GenericAlias` can now be subclassed and 
+and :class:`collections.abc.Callable` are now consistent.  The ``__args__``
+for :class:`collections.abc.Callable` are now flattened while
+:data:`typing.Callable`'s have not changed.  To allow this change,
+:class:`types.GenericAlias` can now be subclassed and
 ``collections.abc.Callable``'s ``__class_getitem__`` will now return a subclass
-of ``types.GenericAlias``.  Tests for typing were also updated to not subclass 
+of ``types.GenericAlias``.  Tests for typing were also updated to not subclass
 things like ``Callable[..., T]`` as that is not a valid base class.  Finally,
-both ``Callable``\ s no longer validate their ``argtypes``, in 
-``Callable[[argtypes], resulttype]`` to prepare for :pep:`612`.  Patch by Ken Jin.  
-
+both ``Callable``\ s no longer validate their ``argtypes``, in
+``Callable[[argtypes], resulttype]`` to prepare for :pep:`612`.  Patch by Ken Jin.
index aa337b38046e61c60217b7bd13c0db9f33fc03bf..2c7b70d589d83c10c6fda6afad96c6881e740bd7 100644 (file)
@@ -1 +1 @@
-fix `format()` behavior for `IntFlag`
+fix ``format()`` behavior for ``IntFlag``
index 7c94cdf40dd4cc0a1386795b0e75dfe07500aa6b..4b2ced5c148af71b5713639dfaad5daba40c822b 100644 (file)
@@ -1 +1 @@
-`Enum`: call `__init_subclass__` after members have been added
+``Enum``: call ``__init_subclass__`` after members have been added
index fcbf99925208b0be30ef49d738a81b3fcdf5dae2..6f3691f591f2b106fc8dbcb14551e3956e48f66e 100644 (file)
@@ -1 +1 @@
-[tarfile] update nested exception raising to use `from None` or `from e`
+[tarfile] update nested exception raising to use ``from None`` or ``from e``
index f58b58e4002adad044a4c69666e8e88a8032eb2b..ee4d111dc349a92a2b10441531e566cd3b97db72 100644 (file)
@@ -1,3 +1,3 @@
-`logging.disable` will now validate the types and value of its parameter. It
-also now accepts strings representing the levels (as does `loging.setLevel`)
+``logging.disable`` will now validate the types and value of its parameter. It
+also now accepts strings representing the levels (as does ``loging.setLevel``)
 instead of only the numerical values.