Skip to content

Add a test to check that no old msgid or symbol are used #5839

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Feb 26, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@ Release date: TBA
..
Put new features here and also in 'doc/whatsnew/2.13.rst'

* ``using-f-string-in-unsupported-version`` and ``using-final-decorator-in-unsupported-version`` msgids
Copy link
Collaborator

Choose a reason for hiding this comment

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

Hm, this is difficult. This is an important change, but this is technically breaking... Should it be in 3.0?

Copy link
Member Author

Choose a reason for hiding this comment

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

I think we need to fix this "fast" as we don't want to have a lot of content on the web with W1601 and W1602 meaning the new message. The breaking change is reasonable imo as it only breaks disable using msgid and not the symbol directly. (Also, the symbol should be preferred we even have a check for that so it's probably not affecting a lot of users ?)

Copy link
Collaborator

Choose a reason for hiding this comment

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

Yeah and I guess you could consider the previous change breaking. As in, we're reverting a previously unnoticed breaking change here.
Let's just go ahead with it.

were renamed from ``W1601`` and ``W1602`` to ``W2601`` and ``W2602``. Disabling using these msgids will break.
This is done in order to restore consistency with the already existing msgids for ``apply-builtin`` and
``basestring-builtin`` from the now deleted python 3K+ checker. There is now a check that we're not using
existing msgids or symbols from deleted checkers.

Closes #5729

* Add ``--recursive`` option to allow recursive discovery of all modules and packages in subtree. Running pylint with
``--recursive=y`` option will check all discovered ``.py`` files and packages found inside subtree of directory provided
as parameter to pylint.
Expand Down
8 changes: 8 additions & 0 deletions doc/whatsnew/2.13.rst
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,14 @@ Extensions
Other Changes
=============

* ``using-f-string-in-unsupported-version`` and ``using-final-decorator-in-unsupported-version`` msgids
were renamed from ``W1601`` and ``W1602`` to ``W2601`` and ``W2602``. Disables using these msgids will break.
This is done in order to restore consistency with the already existing msgids for ``apply-builtin`` and
``basestring-builtin`` from the now deleted python 3K+ checker. There is now a check that we're not using
existing msgids or symbols from deleted checkers.

Closes #5729

* Add ``--recursive`` option to allow recursive discovery of all modules and packages in subtree. Running pylint with
``--recursive=y`` option will check all discovered ``.py`` files and packages found inside subtree of directory provided
as parameter to pylint.
Expand Down
5 changes: 3 additions & 2 deletions pylint/checkers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,15 @@
13: string_format
14: string_constant
15: stdlib
16: python3
16: python3 (This one was deleted but needs to be reserved for consistency with old messages)
17: refactoring
.
.
.
24: non-ascii-names
25: unicode
26-50: not yet used: reserved for future internal checkers.
26: unsupported_version
27-50: not yet used: reserved for future internal checkers.
This file is not updated. Use
script/get_unused_message_id_category.py
to get the next free checker id.
Expand Down
4 changes: 2 additions & 2 deletions pylint/checkers/unsupported_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,13 @@ class UnsupportedVersionChecker(BaseChecker):
__implements__ = (IAstroidChecker,)
name = "unsupported_version"
msgs = {
"W1601": (
"W2601": (
"F-strings are not supported by all versions included in the py-version setting",
"using-f-string-in-unsupported-version",
"Used when the py-version set by the user is lower than 3.6 and pylint encounters "
"a f-string.",
),
"W1602": (
"W2602": (
"typing.final is not supported by all versions included in the py-version setting",
"using-final-decorator-in-unsupported-version",
"Used when the py-version set by the user is lower than 3.8 and pylint encounters "
Expand Down
106 changes: 105 additions & 1 deletion pylint/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
import platform
import sys
from typing import Dict
from typing import Dict, List, NamedTuple, Tuple

import astroid
import platformdirs
Expand Down Expand Up @@ -72,3 +72,107 @@ class WarningScope:
"class_const": "class constant",
"inlinevar": "inline iteration",
}


class DeletedMessage(NamedTuple):
msgid: str
symbol: str
old_names: List[Tuple[str, str]] = []


DELETED_MSGID_PREFIXES = [
16, # the PY3K+ checker, see https://github.com/PyCQA/pylint/pull/4942
]

DELETED_MESSAGES = [
# Everything until the next comment is from the
# PY3K+ checker, see https://github.com/PyCQA/pylint/pull/4942
DeletedMessage("W1601", "apply-builtin"),
DeletedMessage("E1601", "print-statement"),
DeletedMessage("E1602", "parameter-unpacking"),
DeletedMessage(
"E1603", "unpacking-in-except", [("W0712", "old-unpacking-in-except")]
),
DeletedMessage("E1604", "old-raise-syntax", [("W0121", "old-old-raise-syntax")]),
DeletedMessage("E1605", "backtick", [("W0333", "old-backtick")]),
DeletedMessage("E1609", "import-star-module-level"),
DeletedMessage("W1601", "apply-builtin"),
DeletedMessage("W1602", "basestring-builtin"),
DeletedMessage("W1603", "buffer-builtin"),
DeletedMessage("W1604", "cmp-builtin"),
DeletedMessage("W1605", "coerce-builtin"),
DeletedMessage("W1606", "execfile-builtin"),
DeletedMessage("W1607", "file-builtin"),
DeletedMessage("W1608", "long-builtin"),
DeletedMessage("W1609", "raw_input-builtin"),
DeletedMessage("W1610", "reduce-builtin"),
DeletedMessage("W1611", "standarderror-builtin"),
DeletedMessage("W1612", "unicode-builtin"),
DeletedMessage("W1613", "xrange-builtin"),
DeletedMessage("W1614", "coerce-method"),
DeletedMessage("W1615", "delslice-method"),
DeletedMessage("W1616", "getslice-method"),
DeletedMessage("W1617", "setslice-method"),
DeletedMessage("W1618", "no-absolute-import"),
DeletedMessage("W1619", "old-division"),
DeletedMessage("W1620", "dict-iter-method"),
DeletedMessage("W1621", "dict-view-method"),
DeletedMessage("W1622", "next-method-called"),
DeletedMessage("W1623", "metaclass-assignment"),
DeletedMessage(
"W1624", "indexing-exception", [("W0713", "old-indexing-exception")]
),
DeletedMessage("W1625", "raising-string", [("W0701", "old-raising-string")]),
DeletedMessage("W1626", "reload-builtin"),
DeletedMessage("W1627", "oct-method"),
DeletedMessage("W1628", "hex-method"),
DeletedMessage("W1629", "nonzero-method"),
DeletedMessage("W1630", "cmp-method"),
DeletedMessage("W1632", "input-builtin"),
DeletedMessage("W1633", "round-builtin"),
DeletedMessage("W1634", "intern-builtin"),
DeletedMessage("W1635", "unichr-builtin"),
DeletedMessage(
"W1636", "map-builtin-not-iterating", [("W1631", "implicit-map-evaluation")]
),
DeletedMessage("W1637", "zip-builtin-not-iterating"),
DeletedMessage("W1638", "range-builtin-not-iterating"),
DeletedMessage("W1639", "filter-builtin-not-iterating"),
DeletedMessage("W1640", "using-cmp-argument"),
DeletedMessage("W1641", "eq-without-hash"),
DeletedMessage("W1642", "div-method"),
DeletedMessage("W1643", "idiv-method"),
DeletedMessage("W1644", "rdiv-method"),
DeletedMessage("W1645", "exception-message-attribute"),
DeletedMessage("W1646", "invalid-str-codec"),
DeletedMessage("W1647", "sys-max-int"),
DeletedMessage("W1648", "bad-python3-import"),
DeletedMessage("W1649", "deprecated-string-function"),
DeletedMessage("W1650", "deprecated-str-translate-call"),
DeletedMessage("W1651", "deprecated-itertools-function"),
DeletedMessage("W1652", "deprecated-types-field"),
DeletedMessage("W1653", "next-method-defined"),
DeletedMessage("W1654", "dict-items-not-iterating"),
DeletedMessage("W1655", "dict-keys-not-iterating"),
DeletedMessage("W1656", "dict-values-not-iterating"),
DeletedMessage("W1657", "deprecated-operator-function"),
DeletedMessage("W1658", "deprecated-urllib-function"),
DeletedMessage("W1659", "xreadlines-attribute"),
DeletedMessage("W1660", "deprecated-sys-function"),
DeletedMessage("W1661", "exception-escape"),
DeletedMessage("W1662", "comprehension-escape"),
# https://github.com/PyCQA/pylint/pull/3578
DeletedMessage("W0312", "mixed-indentation"),
# https://github.com/PyCQA/pylint/pull/3577
DeletedMessage(
"C0326",
"bad-whitespace",
[
("C0323", "no-space-after-operator"),
("C0324", "no-space-after-comma"),
("C0322", "no-space-before-operator"),
],
),
# https://github.com/PyCQA/pylint/pull/3571
DeletedMessage("C0330", "bad-continuation"),
]
3 changes: 3 additions & 0 deletions script/get_unused_message_id_category.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from typing import List

from pylint.checkers import initialize as initialize_checkers
from pylint.constants import DELETED_MSGID_PREFIXES
from pylint.extensions import initialize as initialize_extensions
from pylint.lint.pylinter import PyLinter

Expand All @@ -18,6 +19,8 @@ def register_all_checkers_and_plugins(linter: "PyLinter") -> None:

def get_next_code_category(message_ids: List[str]) -> int:
categories = sorted({int(i[:2]) for i in message_ids})
# We add the prefixes for deleted checkers
categories += DELETED_MSGID_PREFIXES
for i in categories:
if i + 1 not in categories:
return i + 1
Expand Down
17 changes: 17 additions & 0 deletions tests/message/test_no_removed_msgid_or_symbol_used.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE

from pylint.constants import DELETED_MESSAGES
from pylint.lint import PyLinter


def test_no_removed_msgid_or_symbol_used(linter: PyLinter) -> None:
"""Tests that we're not using deleted msgid or symbol.

This could cause occasional bugs, but more importantly confusion and inconsistencies
when searching for old msgids online. See https://github.com/PyCQA/pylint/issues/5729
"""
for msgid, symbol, old_names in DELETED_MESSAGES:
linter.msgs_store.message_id_store.register_message_definition(
msgid, symbol, old_names
)