Meta: Allow adding date to Resolution header (#4061)

Fixes #4054

Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
This commit is contained in:
Jelle Zijlstra 2024-10-16 09:05:18 -07:00 committed by GitHub
parent 6fd57597f3
commit c56c5c526b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 59 additions and 9 deletions

View File

@ -211,9 +211,9 @@ repos:
files: '^peps/pep-\d+\.rst$'
- id: validate-resolution
name: "'Resolution' must be a direct thread/message URL"
name: "'Resolution' must be a direct thread/message URL or '`DD-mmm-YYYY <URL>`__'"
language: pygrep
entry: '(?<!\n\n)(?<=\n)Resolution: (?:(?!https://((discuss\.python\.org/t/([\w\-]+/)?\d+(/\d+)?/?)|(mail\.python\.org/pipermail/[\w\-]+/\d{4}-[A-Za-z]+/[A-Za-z0-9]+\.html)|(mail\.python\.org/archives/list/[\w\-]+@python\.org/(message|thread)/[A-Za-z0-9]+/?(#[A-Za-z0-9]+)?))\n))'
entry: '(?<!\n\n)(?<=\n)Resolution: (?:(?!https://((discuss\.python\.org/t/([\w\-]+/)?\d+(/\d+)?/?)|(mail\.python\.org/pipermail/[\w\-]+/\d{4}-[A-Za-z]+/[A-Za-z0-9]+\.html)|(mail\.python\.org/archives/list/[\w\-]+@python\.org/(message|thread)/[A-Za-z0-9]+/?(#[A-Za-z0-9]+)?)))|`([0-2][0-9]|(3[01]))-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(199[0-9]|20[0-9][0-9]) <(?:(?!https://((discuss\.python\.org/t/([\w\-]+/)?\d+(/\d+)?/?)|(mail\.python\.org/pipermail/[\w\-]+/\d{4}-[A-Za-z]+/[A-Za-z0-9]+\.html)|(mail\.python\.org/archives/list/[\w\-]+@python\.org/(message|thread)/[A-Za-z0-9]+/?(#[A-Za-z0-9]+)?)))>`__))\n'
args: ['--multiline']
files: '^peps/pep-\d+\.rst$'

View File

@ -407,7 +407,7 @@ def _validate_python_version(line_num: int, line: str) -> MessageIterator:
def _validate_post_history(line_num: int, body: str) -> MessageIterator:
"""'Post-History' must be '`DD-mmm-YYYY <Thread URL>`__, …'"""
"""'Post-History' must be '`DD-mmm-YYYY <Thread URL>`__, …' or `DD-mmm-YYYY`"""
if body == "":
return
@ -422,19 +422,28 @@ def _validate_post_history(line_num: int, body: str) -> MessageIterator:
yield from _date(offset, post_date, "Post-History")
yield from _thread(offset, post_url, "Post-History")
else:
yield offset, f"post line must be a date or both start with “`” and end with “>`__”"
yield offset, "post line must be a date or both start with “`” and end with “>`__”"
def _validate_resolution(line_num: int, line: str) -> MessageIterator:
"""'Resolution' must be a direct thread/message URL"""
"""'Resolution' must be a direct thread/message URL or a link with a date."""
yield from _thread(line_num, line, "Resolution", allow_message=True)
prefix, postfix = (line.startswith("`"), line.endswith(">`__"))
if not prefix and not postfix:
yield from _thread(line_num, line, "Resolution", allow_message=True)
elif prefix and postfix:
post_date, post_url = line[1:-4].split(" <")
yield from _date(line_num, post_date, "Resolution")
yield from _thread(line_num, post_url, "Resolution", allow_message=True)
else:
yield line_num, "Resolution line must be a link or both start with “`” and end with “>`__”"
########################
# Validation Helpers #
########################
def _pep_num(line_num: int, pep_number: str, prefix: str) -> MessageIterator:
if pep_number == "":
yield line_num, f"{prefix} must not be blank: {pep_number!r}"

View File

@ -119,6 +119,9 @@ class PEPHeaders(transforms.Transform):
if (not isinstance(node, nodes.reference)
or not node["refuri"]):
continue
# If the Resolution header is already a link, don't prettify it
if name == "resolution" and node["refuri"] != node[0]:
continue
# Have known mailto links link to their main list pages
if node["refuri"].lower().startswith("mailto:"):
node["refuri"] = _generate_list_url(node["refuri"])

View File

@ -2,6 +2,8 @@ from pathlib import Path
import check_peps # NoQA: inserted into sys.modules in conftest.py
from ..conftest import PEP_ROOT
PEP_9002 = Path(__file__).parent.parent / "peps" / "pep-9002.rst"
@ -46,3 +48,10 @@ def test_with_fake_pep():
(20, "Resolution must be a valid thread URL"),
(23, "Use the :pep:`NNN` role to refer to PEPs"),
]
def test_skip_direct_pep_link_check():
filename = PEP_ROOT / "pep-0009.rst" # in SKIP_DIRECT_PEP_LINK_CHECK
content = filename.read_text(encoding="utf-8").splitlines()
warnings = list(check_peps.check_peps(filename, content))
assert warnings == []

View File

@ -79,6 +79,20 @@ def test_validate_post_history_valid(body: str):
assert warnings == [], warnings
@pytest.mark.parametrize(
"body",
[
"31-Jul-2015 <https://discuss.python.org/t/123456>`__,",
"`31-Jul-2015 <https://discuss.python.org/t/123456>",
],
)
def test_validate_post_history_unbalanced_link(body: str):
warnings = [warning for (_, warning) in check_peps._validate_post_history(1, body)]
assert warnings == [
"post line must be a date or both start with “`” and end with “>`__”"
], warnings
@pytest.mark.parametrize(
"line",
[
@ -90,6 +104,7 @@ def test_validate_post_history_valid(body: str):
"https://mail.python.org/archives/list/list-name@python.org/message/abcXYZ123/#Anchor",
"https://mail.python.org/archives/list/list-name@python.org/message/abcXYZ123#Anchor123",
"https://mail.python.org/archives/list/list-name@python.org/message/abcXYZ123/#Anchor123",
"`16-Oct-2024 <https://mail.python.org/archives/list/list-name@python.org/thread/abcXYZ123>`__",
],
)
def test_validate_resolution_valid(line: str):
@ -117,6 +132,20 @@ def test_validate_resolution_invalid(line: str):
assert warnings == ["Resolution must be a valid thread URL"], warnings
@pytest.mark.parametrize(
"line",
[
"01-Jan-2000 <https://mail.python.org/pipermail/list-name/0000-Month/0123456.html>`__",
"`01-Jan-2000 <https://mail.python.org/pipermail/list-name/0000-Month/0123456.html>",
],
)
def test_validate_resolution_unbalanced_link(line: str):
warnings = [warning for (_, warning) in check_peps._validate_resolution(1, line)]
assert warnings == [
"Resolution line must be a link or both start with “`” and end with “>`__”"
], warnings
@pytest.mark.parametrize(
"thread_url",
[

View File

@ -621,7 +621,7 @@ optional and are described below. All other headers are required.
inline-linked to PEP discussion threads>
* Replaces: <pep number>
* Superseded-By: <pep number>
* Resolution: <url>
* Resolution: <date in dd-mmm-yyyy format, linked to the acceptance/rejection post>
The Author header lists the names, and optionally the email addresses
of all the authors/owners of the PEP. The format of the Author header

View File

@ -9,7 +9,7 @@ Created: 30-Dec-2022
Python-Version: 3.13
Post-History: `01-Jan-2023 <https://mail.python.org/archives/list/typing-sig@python.org/thread/AKTFUYW3WDT7R7PGRIJQZMYHMDJNE4QH/>`__,
`22-Jan-2023 <https://discuss.python.org/t/pep-702-marking-deprecations-using-the-type-system/23036>`__
Resolution: https://discuss.python.org/t/pep-702-marking-deprecations-using-the-type-system/23036/61
Resolution: `07-Nov-2023 <https://discuss.python.org/t/pep-702-marking-deprecations-using-the-type-system/23036/61>`__
.. canonical-typing-spec:: :ref:`typing:deprecated` and
:external+py3.13:func:`@warnings.deprecated<warnings.deprecated>`

View File

@ -9,7 +9,7 @@ Type: Standards Track
Topic: Packaging
Created: 20-Nov-2023
Post-History: `14-Nov-2023 <https://discuss.python.org/t/29684>`__, `20-Nov-2023 <https://discuss.python.org/t/39233>`__
Resolution: https://discuss.python.org/t/39233/312
Resolution: `10-Oct-2024 <https://discuss.python.org/t/39233/312>`__
Abstract