blob: 943f708aa8cbb5daafe70809baac37922fd071aa [file] [log] [blame]
# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# For details: https://github.com/pylint-dev/pylint/blob/main/LICENSE
# Copyright (c) https://github.com/pylint-dev/pylint/blob/main/CONTRIBUTORS.txt
"""List the breaking changes in configuration files and their solutions."""
from __future__ import annotations
import enum
from typing import NamedTuple
class BreakingChange(enum.Enum):
MESSAGE_MADE_DISABLED_BY_DEFAULT = "{symbol} ({msgid}) was disabled by default"
MESSAGE_MADE_ENABLED_BY_DEFAULT = "{symbol} ({msgid}) was enabled by default"
MESSAGE_MOVED_TO_EXTENSION = "{symbol} ({msgid}) was moved to {extension}"
EXTENSION_REMOVED = "{extension} was removed"
# This kind of upgrade is non-breaking but if we want to automatically upgrade it,
# then we should use the message store and old_names values instead of duplicating
# MESSAGE_RENAMED= "{symbol} ({msgid}) was renamed"
class Condition(enum.Enum):
MESSAGE_IS_ENABLED = "{symbol} ({msgid}) is enabled"
MESSAGE_IS_NOT_ENABLED = "{symbol} ({msgid}) is not enabled"
MESSAGE_IS_DISABLED = "{symbol} ({msgid}) is disabled"
MESSAGE_IS_NOT_DISABLED = "{symbol} ({msgid}) is not disabled"
EXTENSION_IS_LOADED = "{extension} is loaded"
EXTENSION_IS_NOT_LOADED = "{extension} is not loaded"
class Information(NamedTuple):
msgid_or_symbol: str
extension: str | None
class Solution(enum.Enum):
ADD_EXTENSION = "Add {extension} in 'load-plugins' option"
REMOVE_EXTENSION = "Remove {extension} from the 'load-plugins' option"
ENABLE_MESSAGE_EXPLICITLY = (
"{symbol} ({msgid}) should be added in the 'enable' option"
)
ENABLE_MESSAGE_IMPLICITLY = (
"{symbol} ({msgid}) should be removed from the 'disable' option"
)
DISABLE_MESSAGE_EXPLICITLY = (
"{symbol} ({msgid}) should be added in the 'disable' option"
)
DISABLE_MESSAGE_IMPLICITLY = (
"{symbol} ({msgid}) should be removed from the 'enable' option"
)
ConditionsToBeAffected = list[Condition]
# A solution to a breaking change might imply multiple actions
MultipleActionSolution = list[Solution]
# Sometimes there's multiple solutions and the user needs to choose
Solutions = list[MultipleActionSolution]
BreakingChangeWithSolution = tuple[
BreakingChange, Information, ConditionsToBeAffected, Solutions
]
NO_SELF_USE = Information(
msgid_or_symbol="no-self-use", extension="pylint.extensions.no_self_use"
)
COMPARE_TO_ZERO = Information(
msgid_or_symbol="compare-to-zero", extension="pylint.extensions.comparetozero"
)
COMPARE_TO_EMPTY_STRING = Information(
msgid_or_symbol="compare-to-empty-string",
extension="pylint.extensions.emptystring",
)
CONFIGURATION_BREAKING_CHANGES: dict[str, list[BreakingChangeWithSolution]] = {
"2.14.0": [
(
BreakingChange.MESSAGE_MOVED_TO_EXTENSION,
NO_SELF_USE,
[Condition.MESSAGE_IS_ENABLED, Condition.EXTENSION_IS_NOT_LOADED],
[[Solution.ADD_EXTENSION], [Solution.DISABLE_MESSAGE_IMPLICITLY]],
),
],
"3.0.0": [
(
BreakingChange.EXTENSION_REMOVED,
COMPARE_TO_ZERO,
[Condition.MESSAGE_IS_NOT_DISABLED, Condition.EXTENSION_IS_LOADED],
[[Solution.REMOVE_EXTENSION, Solution.ENABLE_MESSAGE_EXPLICITLY]],
),
(
BreakingChange.EXTENSION_REMOVED,
COMPARE_TO_EMPTY_STRING,
[Condition.MESSAGE_IS_NOT_DISABLED, Condition.EXTENSION_IS_LOADED],
[[Solution.REMOVE_EXTENSION, Solution.ENABLE_MESSAGE_EXPLICITLY]],
),
],
}