diff --git a/crates/ruff/src/commands/rule.rs b/crates/ruff/src/commands/rule.rs index 6d797f87440a3d..366ee56703db90 100644 --- a/crates/ruff/src/commands/rule.rs +++ b/crates/ruff/src/commands/rule.rs @@ -25,6 +25,7 @@ struct Explanation<'a> { explanation: Option<&'a str>, preview: bool, status: RuleGroup, + source_location: SourceLocation, } impl<'a> Explanation<'a> { @@ -43,6 +44,10 @@ impl<'a> Explanation<'a> { explanation: rule.explanation(), preview: rule.is_preview(), status: rule.group(), + source_location: SourceLocation { + file: rule.file(), + line: rule.line(), + }, } } } @@ -127,3 +132,14 @@ pub(crate) fn rules(format: HelpFormat) -> Result<()> { } Ok(()) } + +/// The location of the rule's implementation in the Ruff source tree, relative to the repository +/// root. +/// +/// For most rules this will point to the `#[derive(ViolationMetadata)]` line above the rule's +/// struct. +#[derive(Serialize)] +struct SourceLocation { + file: &'static str, + line: u32, +} diff --git a/crates/ruff/tests/integration_test.rs b/crates/ruff/tests/integration_test.rs index 62221419feea40..48bc689a083551 100644 --- a/crates/ruff/tests/integration_test.rs +++ b/crates/ruff/tests/integration_test.rs @@ -953,7 +953,11 @@ fn rule_f401() { #[test] fn rule_f401_output_json() { - assert_cmd_snapshot!(ruff_cmd().args(["rule", "F401", "--output-format", "json"])); + insta::with_settings!({filters => vec![ + (r#"("file": ")[^"]+(",)"#, "$1$2"), + ]}, { + assert_cmd_snapshot!(ruff_cmd().args(["rule", "F401", "--output-format", "json"])); + }); } #[test] diff --git a/crates/ruff/tests/snapshots/integration_test__rule_f401_output_json.snap b/crates/ruff/tests/snapshots/integration_test__rule_f401_output_json.snap index 51dffdf4a7899e..c206f975d4219a 100644 --- a/crates/ruff/tests/snapshots/integration_test__rule_f401_output_json.snap +++ b/crates/ruff/tests/snapshots/integration_test__rule_f401_output_json.snap @@ -25,6 +25,14 @@ exit_code: 0 "fix_availability": "Sometimes", "explanation": "## What it does\nChecks for unused imports.\n\n## Why is this bad?\nUnused imports add a performance overhead at runtime, and risk creating\nimport cycles. They also increase the cognitive load of reading the code.\n\nIf an import statement is used to check for the availability or existence\nof a module, consider using `importlib.util.find_spec` instead.\n\nIf an import statement is used to re-export a symbol as part of a module's\npublic interface, consider using a \"redundant\" import alias, which\ninstructs Ruff (and other tools) to respect the re-export, and avoid\nmarking it as unused, as in:\n\n```python\nfrom module import member as member\n```\n\nAlternatively, you can use `__all__` to declare a symbol as part of the module's\ninterface, as in:\n\n```python\n# __init__.py\nimport some_module\n\n__all__ = [\"some_module\"]\n```\n\n## Preview\nWhen [preview] is enabled (and certain simplifying assumptions\nare met), we analyze all import statements for a given module\nwhen determining whether an import is used, rather than simply\nthe last of these statements. This can result in both different and\nmore import statements being marked as unused.\n\nFor example, if a module consists of\n\n```python\nimport a\nimport a.b\n```\n\nthen both statements are marked as unused under [preview], whereas\nonly the second is marked as unused under stable behavior.\n\nAs another example, if a module consists of\n\n```python\nimport a.b\nimport a\n\na.b.foo()\n```\n\nthen a diagnostic will only be emitted for the first line under [preview],\nwhereas a diagnostic would only be emitted for the second line under\nstable behavior.\n\nNote that this behavior is somewhat subjective and is designed\nto conform to the developer's intuition rather than Python's actual\nexecution. To wit, the statement `import a.b` automatically executes\n`import a`, so in some sense `import a` is _always_ redundant\nin the presence of `import a.b`.\n\n\n## Fix safety\n\nFixes to remove unused imports are safe, except in `__init__.py` files.\n\nApplying fixes to `__init__.py` files is currently in preview. The fix offered depends on the\ntype of the unused import. Ruff will suggest a safe fix to export first-party imports with\neither a redundant alias or, if already present in the file, an `__all__` entry. If multiple\n`__all__` declarations are present, Ruff will not offer a fix. Ruff will suggest an unsafe fix\nto remove third-party and standard library imports -- the fix is unsafe because the module's\ninterface changes.\n\nSee [this FAQ section](https://docs.astral.sh/ruff/faq/#how-does-ruff-determine-which-of-my-imports-are-first-party-third-party-etc)\nfor more details on how Ruff\ndetermines whether an import is first or third-party.\n\n## Example\n\n```python\nimport numpy as np # unused import\n\n\ndef area(radius):\n return 3.14 * radius**2\n```\n\nUse instead:\n\n```python\ndef area(radius):\n return 3.14 * radius**2\n```\n\nTo check the availability of a module, use `importlib.util.find_spec`:\n\n```python\nfrom importlib.util import find_spec\n\nif find_spec(\"numpy\") is not None:\n print(\"numpy is installed\")\nelse:\n print(\"numpy is not installed\")\n```\n\n## Options\n- `lint.ignore-init-module-imports`\n- `lint.pyflakes.allowed-unused-imports`\n\n## References\n- [Python documentation: `import`](https://docs.python.org/3/reference/simple_stmts.html#the-import-statement)\n- [Python documentation: `importlib.util.find_spec`](https://docs.python.org/3/library/importlib.html#importlib.util.find_spec)\n- [Typing documentation: interface conventions](https://typing.python.org/en/latest/spec/distributing.html#library-interface-public-and-private-symbols)\n\n[preview]: https://docs.astral.sh/ruff/preview/\n", "preview": false, - "status": "Stable" + "status": { + "Stable": { + "since": "v0.0.18" + } + }, + "source_location": { + "file": "", + "line": 145 + } } ----- stderr ----- diff --git a/crates/ruff_dev/src/generate_docs.rs b/crates/ruff_dev/src/generate_docs.rs index 5f2309328ef0a9..b2d8feb55020cc 100644 --- a/crates/ruff_dev/src/generate_docs.rs +++ b/crates/ruff_dev/src/generate_docs.rs @@ -8,6 +8,7 @@ use std::path::PathBuf; use anyhow::Result; use itertools::Itertools; use regex::{Captures, Regex}; +use ruff_linter::codes::RuleGroup; use strum::IntoEnumIterator; use ruff_linter::FixAvailability; @@ -31,6 +32,47 @@ pub(crate) fn main(args: &Args) -> Result<()> { let _ = writeln!(&mut output, "# {} ({})", rule.name(), rule.noqa_code()); + let status_text = match rule.group() { + RuleGroup::Stable { since } => { + format!( + r#"Added in {since}"# + ) + } + RuleGroup::Preview { since } => { + format!( + r#"Preview (since {since})"# + ) + } + RuleGroup::Deprecated { since } => { + format!( + r#"Deprecated (since {since})"# + ) + } + RuleGroup::Removed { since } => { + format!( + r#"Removed (since {since})"# + ) + } + }; + + let _ = writeln!( + &mut output, + r#" +{status_text} · +Related issues · +View source + + +"#, + encoded_name = + url::form_urlencoded::byte_serialize(rule.name().as_str().as_bytes()) + .collect::(), + rule_code = rule.noqa_code(), + file = + url::form_urlencoded::byte_serialize(rule.file().replace('\\', "/").as_bytes()) + .collect::(), + line = rule.line(), + ); let (linter, _) = Linter::parse_code(&rule.noqa_code().to_string()).unwrap(); if linter.url().is_some() { let common_prefix: String = match linter.common_prefix() { diff --git a/crates/ruff_dev/src/generate_rules_table.rs b/crates/ruff_dev/src/generate_rules_table.rs index 3255f8f42b276a..1f6f890076710d 100644 --- a/crates/ruff_dev/src/generate_rules_table.rs +++ b/crates/ruff_dev/src/generate_rules_table.rs @@ -32,20 +32,24 @@ fn generate_table(table_out: &mut String, rules: impl IntoIterator, table_out.push('\n'); for rule in rules { let status_token = match rule.group() { - RuleGroup::Removed => { + RuleGroup::Removed { since } => { format!( - "{REMOVED_SYMBOL}" + "{REMOVED_SYMBOL}" ) } - RuleGroup::Deprecated => { + RuleGroup::Deprecated { since } => { format!( - "{WARNING_SYMBOL}" + "{WARNING_SYMBOL}" ) } - RuleGroup::Preview => { - format!("{PREVIEW_SYMBOL}") + RuleGroup::Preview { since } => { + format!( + "{PREVIEW_SYMBOL}" + ) + } + RuleGroup::Stable { since } => { + format!("") } - RuleGroup::Stable => format!(""), }; let fix_token = match rule.fixable() { diff --git a/crates/ruff_linter/src/codes.rs b/crates/ruff_linter/src/codes.rs index 8b762c2c721ec9..eab00b66d88bea 100644 --- a/crates/ruff_linter/src/codes.rs +++ b/crates/ruff_linter/src/codes.rs @@ -77,15 +77,16 @@ impl serde::Serialize for NoqaCode { #[derive(Debug, Copy, Clone, Serialize)] pub enum RuleGroup { - /// The rule is stable. - Stable, - /// The rule is unstable, and preview mode must be enabled for usage. - Preview, - /// The rule has been deprecated, warnings will be displayed during selection in stable - /// and errors will be raised if used with preview mode enabled. - Deprecated, - /// The rule has been removed, errors will be displayed on use. - Removed, + /// The rule is stable since the provided Ruff version. + Stable { since: &'static str }, + /// The rule has been unstable since the provided Ruff version, and preview mode must be enabled + /// for usage. + Preview { since: &'static str }, + /// The rule has been deprecated since the provided Ruff version, warnings will be displayed + /// during selection in stable and errors will be raised if used with preview mode enabled. + Deprecated { since: &'static str }, + /// The rule was removed in the provided Ruff version, and errors will be displayed on use. + Removed { since: &'static str }, } #[ruff_macros::map_codes] @@ -96,1095 +97,1095 @@ pub fn code_to_rule(linter: Linter, code: &str) -> Option<(RuleGroup, Rule)> { #[rustfmt::skip] Some(match (linter, code) { // pycodestyle errors - (Pycodestyle, "E101") => (RuleGroup::Stable, rules::pycodestyle::rules::MixedSpacesAndTabs), - (Pycodestyle, "E111") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::IndentationWithInvalidMultiple), - (Pycodestyle, "E112") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::NoIndentedBlock), - (Pycodestyle, "E113") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::UnexpectedIndentation), - (Pycodestyle, "E114") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::IndentationWithInvalidMultipleComment), - (Pycodestyle, "E115") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::NoIndentedBlockComment), - (Pycodestyle, "E116") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::UnexpectedIndentationComment), - (Pycodestyle, "E117") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::OverIndented), - (Pycodestyle, "E201") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::WhitespaceAfterOpenBracket), - (Pycodestyle, "E202") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::WhitespaceBeforeCloseBracket), - (Pycodestyle, "E203") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::WhitespaceBeforePunctuation), - (Pycodestyle, "E204") => (RuleGroup::Preview, rules::pycodestyle::rules::WhitespaceAfterDecorator), - (Pycodestyle, "E211") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::WhitespaceBeforeParameters), - (Pycodestyle, "E221") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::MultipleSpacesBeforeOperator), - (Pycodestyle, "E222") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::MultipleSpacesAfterOperator), - (Pycodestyle, "E223") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::TabBeforeOperator), - (Pycodestyle, "E224") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::TabAfterOperator), - (Pycodestyle, "E225") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::MissingWhitespaceAroundOperator), - (Pycodestyle, "E226") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::MissingWhitespaceAroundArithmeticOperator), - (Pycodestyle, "E227") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::MissingWhitespaceAroundBitwiseOrShiftOperator), - (Pycodestyle, "E228") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::MissingWhitespaceAroundModuloOperator), - (Pycodestyle, "E231") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::MissingWhitespace), - (Pycodestyle, "E241") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::MultipleSpacesAfterComma), - (Pycodestyle, "E242") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::TabAfterComma), - (Pycodestyle, "E251") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::UnexpectedSpacesAroundKeywordParameterEquals), - (Pycodestyle, "E252") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::MissingWhitespaceAroundParameterEquals), - (Pycodestyle, "E261") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::TooFewSpacesBeforeInlineComment), - (Pycodestyle, "E262") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::NoSpaceAfterInlineComment), - (Pycodestyle, "E265") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::NoSpaceAfterBlockComment), - (Pycodestyle, "E266") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::MultipleLeadingHashesForBlockComment), - (Pycodestyle, "E271") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::MultipleSpacesAfterKeyword), - (Pycodestyle, "E272") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::MultipleSpacesBeforeKeyword), - (Pycodestyle, "E273") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::TabAfterKeyword), - (Pycodestyle, "E274") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::TabBeforeKeyword), - (Pycodestyle, "E275") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::MissingWhitespaceAfterKeyword), - (Pycodestyle, "E301") => (RuleGroup::Preview, rules::pycodestyle::rules::BlankLineBetweenMethods), - (Pycodestyle, "E302") => (RuleGroup::Preview, rules::pycodestyle::rules::BlankLinesTopLevel), - (Pycodestyle, "E303") => (RuleGroup::Preview, rules::pycodestyle::rules::TooManyBlankLines), - (Pycodestyle, "E304") => (RuleGroup::Preview, rules::pycodestyle::rules::BlankLineAfterDecorator), - (Pycodestyle, "E305") => (RuleGroup::Preview, rules::pycodestyle::rules::BlankLinesAfterFunctionOrClass), - (Pycodestyle, "E306") => (RuleGroup::Preview, rules::pycodestyle::rules::BlankLinesBeforeNestedDefinition), - (Pycodestyle, "E401") => (RuleGroup::Stable, rules::pycodestyle::rules::MultipleImportsOnOneLine), - (Pycodestyle, "E402") => (RuleGroup::Stable, rules::pycodestyle::rules::ModuleImportNotAtTopOfFile), - (Pycodestyle, "E501") => (RuleGroup::Stable, rules::pycodestyle::rules::LineTooLong), - (Pycodestyle, "E502") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::RedundantBackslash), - (Pycodestyle, "E701") => (RuleGroup::Stable, rules::pycodestyle::rules::MultipleStatementsOnOneLineColon), - (Pycodestyle, "E702") => (RuleGroup::Stable, rules::pycodestyle::rules::MultipleStatementsOnOneLineSemicolon), - (Pycodestyle, "E703") => (RuleGroup::Stable, rules::pycodestyle::rules::UselessSemicolon), - (Pycodestyle, "E711") => (RuleGroup::Stable, rules::pycodestyle::rules::NoneComparison), - (Pycodestyle, "E712") => (RuleGroup::Stable, rules::pycodestyle::rules::TrueFalseComparison), - (Pycodestyle, "E713") => (RuleGroup::Stable, rules::pycodestyle::rules::NotInTest), - (Pycodestyle, "E714") => (RuleGroup::Stable, rules::pycodestyle::rules::NotIsTest), - (Pycodestyle, "E721") => (RuleGroup::Stable, rules::pycodestyle::rules::TypeComparison), - (Pycodestyle, "E722") => (RuleGroup::Stable, rules::pycodestyle::rules::BareExcept), - (Pycodestyle, "E731") => (RuleGroup::Stable, rules::pycodestyle::rules::LambdaAssignment), - (Pycodestyle, "E741") => (RuleGroup::Stable, rules::pycodestyle::rules::AmbiguousVariableName), - (Pycodestyle, "E742") => (RuleGroup::Stable, rules::pycodestyle::rules::AmbiguousClassName), - (Pycodestyle, "E743") => (RuleGroup::Stable, rules::pycodestyle::rules::AmbiguousFunctionName), - (Pycodestyle, "E902") => (RuleGroup::Stable, rules::pycodestyle::rules::IOError), + (Pycodestyle, "E101") => rules::pycodestyle::rules::MixedSpacesAndTabs, + (Pycodestyle, "E111") => rules::pycodestyle::rules::logical_lines::IndentationWithInvalidMultiple, + (Pycodestyle, "E112") => rules::pycodestyle::rules::logical_lines::NoIndentedBlock, + (Pycodestyle, "E113") => rules::pycodestyle::rules::logical_lines::UnexpectedIndentation, + (Pycodestyle, "E114") => rules::pycodestyle::rules::logical_lines::IndentationWithInvalidMultipleComment, + (Pycodestyle, "E115") => rules::pycodestyle::rules::logical_lines::NoIndentedBlockComment, + (Pycodestyle, "E116") => rules::pycodestyle::rules::logical_lines::UnexpectedIndentationComment, + (Pycodestyle, "E117") => rules::pycodestyle::rules::logical_lines::OverIndented, + (Pycodestyle, "E201") => rules::pycodestyle::rules::logical_lines::WhitespaceAfterOpenBracket, + (Pycodestyle, "E202") => rules::pycodestyle::rules::logical_lines::WhitespaceBeforeCloseBracket, + (Pycodestyle, "E203") => rules::pycodestyle::rules::logical_lines::WhitespaceBeforePunctuation, + (Pycodestyle, "E204") => rules::pycodestyle::rules::WhitespaceAfterDecorator, + (Pycodestyle, "E211") => rules::pycodestyle::rules::logical_lines::WhitespaceBeforeParameters, + (Pycodestyle, "E221") => rules::pycodestyle::rules::logical_lines::MultipleSpacesBeforeOperator, + (Pycodestyle, "E222") => rules::pycodestyle::rules::logical_lines::MultipleSpacesAfterOperator, + (Pycodestyle, "E223") => rules::pycodestyle::rules::logical_lines::TabBeforeOperator, + (Pycodestyle, "E224") => rules::pycodestyle::rules::logical_lines::TabAfterOperator, + (Pycodestyle, "E225") => rules::pycodestyle::rules::logical_lines::MissingWhitespaceAroundOperator, + (Pycodestyle, "E226") => rules::pycodestyle::rules::logical_lines::MissingWhitespaceAroundArithmeticOperator, + (Pycodestyle, "E227") => rules::pycodestyle::rules::logical_lines::MissingWhitespaceAroundBitwiseOrShiftOperator, + (Pycodestyle, "E228") => rules::pycodestyle::rules::logical_lines::MissingWhitespaceAroundModuloOperator, + (Pycodestyle, "E231") => rules::pycodestyle::rules::logical_lines::MissingWhitespace, + (Pycodestyle, "E241") => rules::pycodestyle::rules::logical_lines::MultipleSpacesAfterComma, + (Pycodestyle, "E242") => rules::pycodestyle::rules::logical_lines::TabAfterComma, + (Pycodestyle, "E251") => rules::pycodestyle::rules::logical_lines::UnexpectedSpacesAroundKeywordParameterEquals, + (Pycodestyle, "E252") => rules::pycodestyle::rules::logical_lines::MissingWhitespaceAroundParameterEquals, + (Pycodestyle, "E261") => rules::pycodestyle::rules::logical_lines::TooFewSpacesBeforeInlineComment, + (Pycodestyle, "E262") => rules::pycodestyle::rules::logical_lines::NoSpaceAfterInlineComment, + (Pycodestyle, "E265") => rules::pycodestyle::rules::logical_lines::NoSpaceAfterBlockComment, + (Pycodestyle, "E266") => rules::pycodestyle::rules::logical_lines::MultipleLeadingHashesForBlockComment, + (Pycodestyle, "E271") => rules::pycodestyle::rules::logical_lines::MultipleSpacesAfterKeyword, + (Pycodestyle, "E272") => rules::pycodestyle::rules::logical_lines::MultipleSpacesBeforeKeyword, + (Pycodestyle, "E273") => rules::pycodestyle::rules::logical_lines::TabAfterKeyword, + (Pycodestyle, "E274") => rules::pycodestyle::rules::logical_lines::TabBeforeKeyword, + (Pycodestyle, "E275") => rules::pycodestyle::rules::logical_lines::MissingWhitespaceAfterKeyword, + (Pycodestyle, "E301") => rules::pycodestyle::rules::BlankLineBetweenMethods, + (Pycodestyle, "E302") => rules::pycodestyle::rules::BlankLinesTopLevel, + (Pycodestyle, "E303") => rules::pycodestyle::rules::TooManyBlankLines, + (Pycodestyle, "E304") => rules::pycodestyle::rules::BlankLineAfterDecorator, + (Pycodestyle, "E305") => rules::pycodestyle::rules::BlankLinesAfterFunctionOrClass, + (Pycodestyle, "E306") => rules::pycodestyle::rules::BlankLinesBeforeNestedDefinition, + (Pycodestyle, "E401") => rules::pycodestyle::rules::MultipleImportsOnOneLine, + (Pycodestyle, "E402") => rules::pycodestyle::rules::ModuleImportNotAtTopOfFile, + (Pycodestyle, "E501") => rules::pycodestyle::rules::LineTooLong, + (Pycodestyle, "E502") => rules::pycodestyle::rules::logical_lines::RedundantBackslash, + (Pycodestyle, "E701") => rules::pycodestyle::rules::MultipleStatementsOnOneLineColon, + (Pycodestyle, "E702") => rules::pycodestyle::rules::MultipleStatementsOnOneLineSemicolon, + (Pycodestyle, "E703") => rules::pycodestyle::rules::UselessSemicolon, + (Pycodestyle, "E711") => rules::pycodestyle::rules::NoneComparison, + (Pycodestyle, "E712") => rules::pycodestyle::rules::TrueFalseComparison, + (Pycodestyle, "E713") => rules::pycodestyle::rules::NotInTest, + (Pycodestyle, "E714") => rules::pycodestyle::rules::NotIsTest, + (Pycodestyle, "E721") => rules::pycodestyle::rules::TypeComparison, + (Pycodestyle, "E722") => rules::pycodestyle::rules::BareExcept, + (Pycodestyle, "E731") => rules::pycodestyle::rules::LambdaAssignment, + (Pycodestyle, "E741") => rules::pycodestyle::rules::AmbiguousVariableName, + (Pycodestyle, "E742") => rules::pycodestyle::rules::AmbiguousClassName, + (Pycodestyle, "E743") => rules::pycodestyle::rules::AmbiguousFunctionName, + (Pycodestyle, "E902") => rules::pycodestyle::rules::IOError, #[allow(deprecated)] - (Pycodestyle, "E999") => (RuleGroup::Removed, rules::pycodestyle::rules::SyntaxError), + (Pycodestyle, "E999") => rules::pycodestyle::rules::SyntaxError, // pycodestyle warnings - (Pycodestyle, "W191") => (RuleGroup::Stable, rules::pycodestyle::rules::TabIndentation), - (Pycodestyle, "W291") => (RuleGroup::Stable, rules::pycodestyle::rules::TrailingWhitespace), - (Pycodestyle, "W292") => (RuleGroup::Stable, rules::pycodestyle::rules::MissingNewlineAtEndOfFile), - (Pycodestyle, "W293") => (RuleGroup::Stable, rules::pycodestyle::rules::BlankLineWithWhitespace), - (Pycodestyle, "W391") => (RuleGroup::Preview, rules::pycodestyle::rules::TooManyNewlinesAtEndOfFile), - (Pycodestyle, "W505") => (RuleGroup::Stable, rules::pycodestyle::rules::DocLineTooLong), - (Pycodestyle, "W605") => (RuleGroup::Stable, rules::pycodestyle::rules::InvalidEscapeSequence), + (Pycodestyle, "W191") => rules::pycodestyle::rules::TabIndentation, + (Pycodestyle, "W291") => rules::pycodestyle::rules::TrailingWhitespace, + (Pycodestyle, "W292") => rules::pycodestyle::rules::MissingNewlineAtEndOfFile, + (Pycodestyle, "W293") => rules::pycodestyle::rules::BlankLineWithWhitespace, + (Pycodestyle, "W391") => rules::pycodestyle::rules::TooManyNewlinesAtEndOfFile, + (Pycodestyle, "W505") => rules::pycodestyle::rules::DocLineTooLong, + (Pycodestyle, "W605") => rules::pycodestyle::rules::InvalidEscapeSequence, // pyflakes - (Pyflakes, "401") => (RuleGroup::Stable, rules::pyflakes::rules::UnusedImport), - (Pyflakes, "402") => (RuleGroup::Stable, rules::pyflakes::rules::ImportShadowedByLoopVar), - (Pyflakes, "403") => (RuleGroup::Stable, rules::pyflakes::rules::UndefinedLocalWithImportStar), - (Pyflakes, "404") => (RuleGroup::Stable, rules::pyflakes::rules::LateFutureImport), - (Pyflakes, "405") => (RuleGroup::Stable, rules::pyflakes::rules::UndefinedLocalWithImportStarUsage), - (Pyflakes, "406") => (RuleGroup::Stable, rules::pyflakes::rules::UndefinedLocalWithNestedImportStarUsage), - (Pyflakes, "407") => (RuleGroup::Stable, rules::pyflakes::rules::FutureFeatureNotDefined), - (Pyflakes, "501") => (RuleGroup::Stable, rules::pyflakes::rules::PercentFormatInvalidFormat), - (Pyflakes, "502") => (RuleGroup::Stable, rules::pyflakes::rules::PercentFormatExpectedMapping), - (Pyflakes, "503") => (RuleGroup::Stable, rules::pyflakes::rules::PercentFormatExpectedSequence), - (Pyflakes, "504") => (RuleGroup::Stable, rules::pyflakes::rules::PercentFormatExtraNamedArguments), - (Pyflakes, "505") => (RuleGroup::Stable, rules::pyflakes::rules::PercentFormatMissingArgument), - (Pyflakes, "506") => (RuleGroup::Stable, rules::pyflakes::rules::PercentFormatMixedPositionalAndNamed), - (Pyflakes, "507") => (RuleGroup::Stable, rules::pyflakes::rules::PercentFormatPositionalCountMismatch), - (Pyflakes, "508") => (RuleGroup::Stable, rules::pyflakes::rules::PercentFormatStarRequiresSequence), - (Pyflakes, "509") => (RuleGroup::Stable, rules::pyflakes::rules::PercentFormatUnsupportedFormatCharacter), - (Pyflakes, "521") => (RuleGroup::Stable, rules::pyflakes::rules::StringDotFormatInvalidFormat), - (Pyflakes, "522") => (RuleGroup::Stable, rules::pyflakes::rules::StringDotFormatExtraNamedArguments), - (Pyflakes, "523") => (RuleGroup::Stable, rules::pyflakes::rules::StringDotFormatExtraPositionalArguments), - (Pyflakes, "524") => (RuleGroup::Stable, rules::pyflakes::rules::StringDotFormatMissingArguments), - (Pyflakes, "525") => (RuleGroup::Stable, rules::pyflakes::rules::StringDotFormatMixingAutomatic), - (Pyflakes, "541") => (RuleGroup::Stable, rules::pyflakes::rules::FStringMissingPlaceholders), - (Pyflakes, "601") => (RuleGroup::Stable, rules::pyflakes::rules::MultiValueRepeatedKeyLiteral), - (Pyflakes, "602") => (RuleGroup::Stable, rules::pyflakes::rules::MultiValueRepeatedKeyVariable), - (Pyflakes, "621") => (RuleGroup::Stable, rules::pyflakes::rules::ExpressionsInStarAssignment), - (Pyflakes, "622") => (RuleGroup::Stable, rules::pyflakes::rules::MultipleStarredExpressions), - (Pyflakes, "631") => (RuleGroup::Stable, rules::pyflakes::rules::AssertTuple), - (Pyflakes, "632") => (RuleGroup::Stable, rules::pyflakes::rules::IsLiteral), - (Pyflakes, "633") => (RuleGroup::Stable, rules::pyflakes::rules::InvalidPrintSyntax), - (Pyflakes, "634") => (RuleGroup::Stable, rules::pyflakes::rules::IfTuple), - (Pyflakes, "701") => (RuleGroup::Stable, rules::pyflakes::rules::BreakOutsideLoop), - (Pyflakes, "702") => (RuleGroup::Stable, rules::pyflakes::rules::ContinueOutsideLoop), - (Pyflakes, "704") => (RuleGroup::Stable, rules::pyflakes::rules::YieldOutsideFunction), - (Pyflakes, "706") => (RuleGroup::Stable, rules::pyflakes::rules::ReturnOutsideFunction), - (Pyflakes, "707") => (RuleGroup::Stable, rules::pyflakes::rules::DefaultExceptNotLast), - (Pyflakes, "722") => (RuleGroup::Stable, rules::pyflakes::rules::ForwardAnnotationSyntaxError), - (Pyflakes, "811") => (RuleGroup::Stable, rules::pyflakes::rules::RedefinedWhileUnused), - (Pyflakes, "821") => (RuleGroup::Stable, rules::pyflakes::rules::UndefinedName), - (Pyflakes, "822") => (RuleGroup::Stable, rules::pyflakes::rules::UndefinedExport), - (Pyflakes, "823") => (RuleGroup::Stable, rules::pyflakes::rules::UndefinedLocal), - (Pyflakes, "841") => (RuleGroup::Stable, rules::pyflakes::rules::UnusedVariable), - (Pyflakes, "842") => (RuleGroup::Stable, rules::pyflakes::rules::UnusedAnnotation), - (Pyflakes, "901") => (RuleGroup::Stable, rules::pyflakes::rules::RaiseNotImplemented), + (Pyflakes, "401") => rules::pyflakes::rules::UnusedImport, + (Pyflakes, "402") => rules::pyflakes::rules::ImportShadowedByLoopVar, + (Pyflakes, "403") => rules::pyflakes::rules::UndefinedLocalWithImportStar, + (Pyflakes, "404") => rules::pyflakes::rules::LateFutureImport, + (Pyflakes, "405") => rules::pyflakes::rules::UndefinedLocalWithImportStarUsage, + (Pyflakes, "406") => rules::pyflakes::rules::UndefinedLocalWithNestedImportStarUsage, + (Pyflakes, "407") => rules::pyflakes::rules::FutureFeatureNotDefined, + (Pyflakes, "501") => rules::pyflakes::rules::PercentFormatInvalidFormat, + (Pyflakes, "502") => rules::pyflakes::rules::PercentFormatExpectedMapping, + (Pyflakes, "503") => rules::pyflakes::rules::PercentFormatExpectedSequence, + (Pyflakes, "504") => rules::pyflakes::rules::PercentFormatExtraNamedArguments, + (Pyflakes, "505") => rules::pyflakes::rules::PercentFormatMissingArgument, + (Pyflakes, "506") => rules::pyflakes::rules::PercentFormatMixedPositionalAndNamed, + (Pyflakes, "507") => rules::pyflakes::rules::PercentFormatPositionalCountMismatch, + (Pyflakes, "508") => rules::pyflakes::rules::PercentFormatStarRequiresSequence, + (Pyflakes, "509") => rules::pyflakes::rules::PercentFormatUnsupportedFormatCharacter, + (Pyflakes, "521") => rules::pyflakes::rules::StringDotFormatInvalidFormat, + (Pyflakes, "522") => rules::pyflakes::rules::StringDotFormatExtraNamedArguments, + (Pyflakes, "523") => rules::pyflakes::rules::StringDotFormatExtraPositionalArguments, + (Pyflakes, "524") => rules::pyflakes::rules::StringDotFormatMissingArguments, + (Pyflakes, "525") => rules::pyflakes::rules::StringDotFormatMixingAutomatic, + (Pyflakes, "541") => rules::pyflakes::rules::FStringMissingPlaceholders, + (Pyflakes, "601") => rules::pyflakes::rules::MultiValueRepeatedKeyLiteral, + (Pyflakes, "602") => rules::pyflakes::rules::MultiValueRepeatedKeyVariable, + (Pyflakes, "621") => rules::pyflakes::rules::ExpressionsInStarAssignment, + (Pyflakes, "622") => rules::pyflakes::rules::MultipleStarredExpressions, + (Pyflakes, "631") => rules::pyflakes::rules::AssertTuple, + (Pyflakes, "632") => rules::pyflakes::rules::IsLiteral, + (Pyflakes, "633") => rules::pyflakes::rules::InvalidPrintSyntax, + (Pyflakes, "634") => rules::pyflakes::rules::IfTuple, + (Pyflakes, "701") => rules::pyflakes::rules::BreakOutsideLoop, + (Pyflakes, "702") => rules::pyflakes::rules::ContinueOutsideLoop, + (Pyflakes, "704") => rules::pyflakes::rules::YieldOutsideFunction, + (Pyflakes, "706") => rules::pyflakes::rules::ReturnOutsideFunction, + (Pyflakes, "707") => rules::pyflakes::rules::DefaultExceptNotLast, + (Pyflakes, "722") => rules::pyflakes::rules::ForwardAnnotationSyntaxError, + (Pyflakes, "811") => rules::pyflakes::rules::RedefinedWhileUnused, + (Pyflakes, "821") => rules::pyflakes::rules::UndefinedName, + (Pyflakes, "822") => rules::pyflakes::rules::UndefinedExport, + (Pyflakes, "823") => rules::pyflakes::rules::UndefinedLocal, + (Pyflakes, "841") => rules::pyflakes::rules::UnusedVariable, + (Pyflakes, "842") => rules::pyflakes::rules::UnusedAnnotation, + (Pyflakes, "901") => rules::pyflakes::rules::RaiseNotImplemented, // pylint - (Pylint, "C0105") => (RuleGroup::Stable, rules::pylint::rules::TypeNameIncorrectVariance), - (Pylint, "C0131") => (RuleGroup::Stable, rules::pylint::rules::TypeBivariance), - (Pylint, "C0132") => (RuleGroup::Stable, rules::pylint::rules::TypeParamNameMismatch), - (Pylint, "C0205") => (RuleGroup::Stable, rules::pylint::rules::SingleStringSlots), - (Pylint, "C0206") => (RuleGroup::Stable, rules::pylint::rules::DictIndexMissingItems), - (Pylint, "C0207") => (RuleGroup::Preview, rules::pylint::rules::MissingMaxsplitArg), - (Pylint, "C0208") => (RuleGroup::Stable, rules::pylint::rules::IterationOverSet), - (Pylint, "C0414") => (RuleGroup::Stable, rules::pylint::rules::UselessImportAlias), - (Pylint, "C0415") => (RuleGroup::Stable, rules::pylint::rules::ImportOutsideTopLevel), - (Pylint, "C1802") => (RuleGroup::Stable, rules::pylint::rules::LenTest), - (Pylint, "C1901") => (RuleGroup::Preview, rules::pylint::rules::CompareToEmptyString), - (Pylint, "C2401") => (RuleGroup::Stable, rules::pylint::rules::NonAsciiName), - (Pylint, "C2403") => (RuleGroup::Stable, rules::pylint::rules::NonAsciiImportName), - (Pylint, "C2701") => (RuleGroup::Preview, rules::pylint::rules::ImportPrivateName), - (Pylint, "C2801") => (RuleGroup::Preview, rules::pylint::rules::UnnecessaryDunderCall), - (Pylint, "C3002") => (RuleGroup::Stable, rules::pylint::rules::UnnecessaryDirectLambdaCall), - (Pylint, "E0100") => (RuleGroup::Stable, rules::pylint::rules::YieldInInit), - (Pylint, "E0101") => (RuleGroup::Stable, rules::pylint::rules::ReturnInInit), - (Pylint, "E0115") => (RuleGroup::Stable, rules::pylint::rules::NonlocalAndGlobal), - (Pylint, "E0116") => (RuleGroup::Stable, rules::pylint::rules::ContinueInFinally), - (Pylint, "E0117") => (RuleGroup::Stable, rules::pylint::rules::NonlocalWithoutBinding), - (Pylint, "E0118") => (RuleGroup::Stable, rules::pylint::rules::LoadBeforeGlobalDeclaration), - (Pylint, "E0237") => (RuleGroup::Stable, rules::pylint::rules::NonSlotAssignment), - (Pylint, "E0241") => (RuleGroup::Stable, rules::pylint::rules::DuplicateBases), - (Pylint, "E0302") => (RuleGroup::Stable, rules::pylint::rules::UnexpectedSpecialMethodSignature), - (Pylint, "E0303") => (RuleGroup::Stable, rules::pylint::rules::InvalidLengthReturnType), - (Pylint, "E0304") => (RuleGroup::Preview, rules::pylint::rules::InvalidBoolReturnType), - (Pylint, "E0305") => (RuleGroup::Stable, rules::pylint::rules::InvalidIndexReturnType), - (Pylint, "E0307") => (RuleGroup::Stable, rules::pylint::rules::InvalidStrReturnType), - (Pylint, "E0308") => (RuleGroup::Stable, rules::pylint::rules::InvalidBytesReturnType), - (Pylint, "E0309") => (RuleGroup::Stable, rules::pylint::rules::InvalidHashReturnType), - (Pylint, "E0604") => (RuleGroup::Stable, rules::pylint::rules::InvalidAllObject), - (Pylint, "E0605") => (RuleGroup::Stable, rules::pylint::rules::InvalidAllFormat), - (Pylint, "E0643") => (RuleGroup::Stable, rules::pylint::rules::PotentialIndexError), - (Pylint, "E0704") => (RuleGroup::Stable, rules::pylint::rules::MisplacedBareRaise), - (Pylint, "E1132") => (RuleGroup::Stable, rules::pylint::rules::RepeatedKeywordArgument), - (Pylint, "E1141") => (RuleGroup::Preview, rules::pylint::rules::DictIterMissingItems), - (Pylint, "E1142") => (RuleGroup::Stable, rules::pylint::rules::AwaitOutsideAsync), - (Pylint, "E1205") => (RuleGroup::Stable, rules::pylint::rules::LoggingTooManyArgs), - (Pylint, "E1206") => (RuleGroup::Stable, rules::pylint::rules::LoggingTooFewArgs), - (Pylint, "E1300") => (RuleGroup::Stable, rules::pylint::rules::BadStringFormatCharacter), - (Pylint, "E1307") => (RuleGroup::Stable, rules::pylint::rules::BadStringFormatType), - (Pylint, "E1310") => (RuleGroup::Stable, rules::pylint::rules::BadStrStripCall), - (Pylint, "E1507") => (RuleGroup::Stable, rules::pylint::rules::InvalidEnvvarValue), - (Pylint, "E1519") => (RuleGroup::Stable, rules::pylint::rules::SingledispatchMethod), - (Pylint, "E1520") => (RuleGroup::Stable, rules::pylint::rules::SingledispatchmethodFunction), - (Pylint, "E1700") => (RuleGroup::Stable, rules::pylint::rules::YieldFromInAsyncFunction), - (Pylint, "E2502") => (RuleGroup::Stable, rules::pylint::rules::BidirectionalUnicode), - (Pylint, "E2510") => (RuleGroup::Stable, rules::pylint::rules::InvalidCharacterBackspace), - (Pylint, "E2512") => (RuleGroup::Stable, rules::pylint::rules::InvalidCharacterSub), - (Pylint, "E2513") => (RuleGroup::Stable, rules::pylint::rules::InvalidCharacterEsc), - (Pylint, "E2514") => (RuleGroup::Stable, rules::pylint::rules::InvalidCharacterNul), - (Pylint, "E2515") => (RuleGroup::Stable, rules::pylint::rules::InvalidCharacterZeroWidthSpace), - (Pylint, "E4703") => (RuleGroup::Preview, rules::pylint::rules::ModifiedIteratingSet), - (Pylint, "R0124") => (RuleGroup::Stable, rules::pylint::rules::ComparisonWithItself), - (Pylint, "R0133") => (RuleGroup::Stable, rules::pylint::rules::ComparisonOfConstant), - (Pylint, "R0202") => (RuleGroup::Preview, rules::pylint::rules::NoClassmethodDecorator), - (Pylint, "R0203") => (RuleGroup::Preview, rules::pylint::rules::NoStaticmethodDecorator), - (Pylint, "R0206") => (RuleGroup::Stable, rules::pylint::rules::PropertyWithParameters), - (Pylint, "R0402") => (RuleGroup::Stable, rules::pylint::rules::ManualFromImport), - (Pylint, "R0904") => (RuleGroup::Preview, rules::pylint::rules::TooManyPublicMethods), - (Pylint, "R0911") => (RuleGroup::Stable, rules::pylint::rules::TooManyReturnStatements), - (Pylint, "R0912") => (RuleGroup::Stable, rules::pylint::rules::TooManyBranches), - (Pylint, "R0913") => (RuleGroup::Stable, rules::pylint::rules::TooManyArguments), - (Pylint, "R0914") => (RuleGroup::Preview, rules::pylint::rules::TooManyLocals), - (Pylint, "R0915") => (RuleGroup::Stable, rules::pylint::rules::TooManyStatements), - (Pylint, "R0916") => (RuleGroup::Preview, rules::pylint::rules::TooManyBooleanExpressions), - (Pylint, "R0917") => (RuleGroup::Preview, rules::pylint::rules::TooManyPositionalArguments), - (Pylint, "R1701") => (RuleGroup::Removed, rules::pylint::rules::RepeatedIsinstanceCalls), - (Pylint, "R1702") => (RuleGroup::Preview, rules::pylint::rules::TooManyNestedBlocks), - (Pylint, "R1704") => (RuleGroup::Stable, rules::pylint::rules::RedefinedArgumentFromLocal), - (Pylint, "R1706") => (RuleGroup::Removed, rules::pylint::rules::AndOrTernary), - (Pylint, "R1711") => (RuleGroup::Stable, rules::pylint::rules::UselessReturn), - (Pylint, "R1714") => (RuleGroup::Stable, rules::pylint::rules::RepeatedEqualityComparison), - (Pylint, "R1722") => (RuleGroup::Stable, rules::pylint::rules::SysExitAlias), - (Pylint, "R1730") => (RuleGroup::Stable, rules::pylint::rules::IfStmtMinMax), - (Pylint, "R1716") => (RuleGroup::Stable, rules::pylint::rules::BooleanChainedComparison), - (Pylint, "R1733") => (RuleGroup::Stable, rules::pylint::rules::UnnecessaryDictIndexLookup), - (Pylint, "R1736") => (RuleGroup::Stable, rules::pylint::rules::UnnecessaryListIndexLookup), - (Pylint, "R2004") => (RuleGroup::Stable, rules::pylint::rules::MagicValueComparison), - (Pylint, "R2044") => (RuleGroup::Stable, rules::pylint::rules::EmptyComment), - (Pylint, "R5501") => (RuleGroup::Stable, rules::pylint::rules::CollapsibleElseIf), - (Pylint, "R6104") => (RuleGroup::Preview, rules::pylint::rules::NonAugmentedAssignment), - (Pylint, "R6201") => (RuleGroup::Preview, rules::pylint::rules::LiteralMembership), - (Pylint, "R6301") => (RuleGroup::Preview, rules::pylint::rules::NoSelfUse), + (Pylint, "C0105") => rules::pylint::rules::TypeNameIncorrectVariance, + (Pylint, "C0131") => rules::pylint::rules::TypeBivariance, + (Pylint, "C0132") => rules::pylint::rules::TypeParamNameMismatch, + (Pylint, "C0205") => rules::pylint::rules::SingleStringSlots, + (Pylint, "C0206") => rules::pylint::rules::DictIndexMissingItems, + (Pylint, "C0207") => rules::pylint::rules::MissingMaxsplitArg, + (Pylint, "C0208") => rules::pylint::rules::IterationOverSet, + (Pylint, "C0414") => rules::pylint::rules::UselessImportAlias, + (Pylint, "C0415") => rules::pylint::rules::ImportOutsideTopLevel, + (Pylint, "C1802") => rules::pylint::rules::LenTest, + (Pylint, "C1901") => rules::pylint::rules::CompareToEmptyString, + (Pylint, "C2401") => rules::pylint::rules::NonAsciiName, + (Pylint, "C2403") => rules::pylint::rules::NonAsciiImportName, + (Pylint, "C2701") => rules::pylint::rules::ImportPrivateName, + (Pylint, "C2801") => rules::pylint::rules::UnnecessaryDunderCall, + (Pylint, "C3002") => rules::pylint::rules::UnnecessaryDirectLambdaCall, + (Pylint, "E0100") => rules::pylint::rules::YieldInInit, + (Pylint, "E0101") => rules::pylint::rules::ReturnInInit, + (Pylint, "E0115") => rules::pylint::rules::NonlocalAndGlobal, + (Pylint, "E0116") => rules::pylint::rules::ContinueInFinally, + (Pylint, "E0117") => rules::pylint::rules::NonlocalWithoutBinding, + (Pylint, "E0118") => rules::pylint::rules::LoadBeforeGlobalDeclaration, + (Pylint, "E0237") => rules::pylint::rules::NonSlotAssignment, + (Pylint, "E0241") => rules::pylint::rules::DuplicateBases, + (Pylint, "E0302") => rules::pylint::rules::UnexpectedSpecialMethodSignature, + (Pylint, "E0303") => rules::pylint::rules::InvalidLengthReturnType, + (Pylint, "E0304") => rules::pylint::rules::InvalidBoolReturnType, + (Pylint, "E0305") => rules::pylint::rules::InvalidIndexReturnType, + (Pylint, "E0307") => rules::pylint::rules::InvalidStrReturnType, + (Pylint, "E0308") => rules::pylint::rules::InvalidBytesReturnType, + (Pylint, "E0309") => rules::pylint::rules::InvalidHashReturnType, + (Pylint, "E0604") => rules::pylint::rules::InvalidAllObject, + (Pylint, "E0605") => rules::pylint::rules::InvalidAllFormat, + (Pylint, "E0643") => rules::pylint::rules::PotentialIndexError, + (Pylint, "E0704") => rules::pylint::rules::MisplacedBareRaise, + (Pylint, "E1132") => rules::pylint::rules::RepeatedKeywordArgument, + (Pylint, "E1141") => rules::pylint::rules::DictIterMissingItems, + (Pylint, "E1142") => rules::pylint::rules::AwaitOutsideAsync, + (Pylint, "E1205") => rules::pylint::rules::LoggingTooManyArgs, + (Pylint, "E1206") => rules::pylint::rules::LoggingTooFewArgs, + (Pylint, "E1300") => rules::pylint::rules::BadStringFormatCharacter, + (Pylint, "E1307") => rules::pylint::rules::BadStringFormatType, + (Pylint, "E1310") => rules::pylint::rules::BadStrStripCall, + (Pylint, "E1507") => rules::pylint::rules::InvalidEnvvarValue, + (Pylint, "E1519") => rules::pylint::rules::SingledispatchMethod, + (Pylint, "E1520") => rules::pylint::rules::SingledispatchmethodFunction, + (Pylint, "E1700") => rules::pylint::rules::YieldFromInAsyncFunction, + (Pylint, "E2502") => rules::pylint::rules::BidirectionalUnicode, + (Pylint, "E2510") => rules::pylint::rules::InvalidCharacterBackspace, + (Pylint, "E2512") => rules::pylint::rules::InvalidCharacterSub, + (Pylint, "E2513") => rules::pylint::rules::InvalidCharacterEsc, + (Pylint, "E2514") => rules::pylint::rules::InvalidCharacterNul, + (Pylint, "E2515") => rules::pylint::rules::InvalidCharacterZeroWidthSpace, + (Pylint, "E4703") => rules::pylint::rules::ModifiedIteratingSet, + (Pylint, "R0124") => rules::pylint::rules::ComparisonWithItself, + (Pylint, "R0133") => rules::pylint::rules::ComparisonOfConstant, + (Pylint, "R0202") => rules::pylint::rules::NoClassmethodDecorator, + (Pylint, "R0203") => rules::pylint::rules::NoStaticmethodDecorator, + (Pylint, "R0206") => rules::pylint::rules::PropertyWithParameters, + (Pylint, "R0402") => rules::pylint::rules::ManualFromImport, + (Pylint, "R0904") => rules::pylint::rules::TooManyPublicMethods, + (Pylint, "R0911") => rules::pylint::rules::TooManyReturnStatements, + (Pylint, "R0912") => rules::pylint::rules::TooManyBranches, + (Pylint, "R0913") => rules::pylint::rules::TooManyArguments, + (Pylint, "R0914") => rules::pylint::rules::TooManyLocals, + (Pylint, "R0915") => rules::pylint::rules::TooManyStatements, + (Pylint, "R0916") => rules::pylint::rules::TooManyBooleanExpressions, + (Pylint, "R0917") => rules::pylint::rules::TooManyPositionalArguments, + (Pylint, "R1701") => rules::pylint::rules::RepeatedIsinstanceCalls, + (Pylint, "R1702") => rules::pylint::rules::TooManyNestedBlocks, + (Pylint, "R1704") => rules::pylint::rules::RedefinedArgumentFromLocal, + (Pylint, "R1706") => rules::pylint::rules::AndOrTernary, + (Pylint, "R1711") => rules::pylint::rules::UselessReturn, + (Pylint, "R1714") => rules::pylint::rules::RepeatedEqualityComparison, + (Pylint, "R1722") => rules::pylint::rules::SysExitAlias, + (Pylint, "R1730") => rules::pylint::rules::IfStmtMinMax, + (Pylint, "R1716") => rules::pylint::rules::BooleanChainedComparison, + (Pylint, "R1733") => rules::pylint::rules::UnnecessaryDictIndexLookup, + (Pylint, "R1736") => rules::pylint::rules::UnnecessaryListIndexLookup, + (Pylint, "R2004") => rules::pylint::rules::MagicValueComparison, + (Pylint, "R2044") => rules::pylint::rules::EmptyComment, + (Pylint, "R5501") => rules::pylint::rules::CollapsibleElseIf, + (Pylint, "R6104") => rules::pylint::rules::NonAugmentedAssignment, + (Pylint, "R6201") => rules::pylint::rules::LiteralMembership, + (Pylint, "R6301") => rules::pylint::rules::NoSelfUse, #[cfg(any(feature = "test-rules", test))] - (Pylint, "W0101") => (RuleGroup::Preview, rules::pylint::rules::UnreachableCode), - (Pylint, "W0108") => (RuleGroup::Preview, rules::pylint::rules::UnnecessaryLambda), - (Pylint, "W0177") => (RuleGroup::Stable, rules::pylint::rules::NanComparison), - (Pylint, "W0120") => (RuleGroup::Stable, rules::pylint::rules::UselessElseOnLoop), - (Pylint, "W0127") => (RuleGroup::Stable, rules::pylint::rules::SelfAssigningVariable), - (Pylint, "W0128") => (RuleGroup::Stable, rules::pylint::rules::RedeclaredAssignedName), - (Pylint, "W0129") => (RuleGroup::Stable, rules::pylint::rules::AssertOnStringLiteral), - (Pylint, "W0131") => (RuleGroup::Stable, rules::pylint::rules::NamedExprWithoutContext), - (Pylint, "W0133") => (RuleGroup::Stable, rules::pylint::rules::UselessExceptionStatement), - (Pylint, "W0211") => (RuleGroup::Stable, rules::pylint::rules::BadStaticmethodArgument), - (Pylint, "W0244") => (RuleGroup::Preview, rules::pylint::rules::RedefinedSlotsInSubclass), - (Pylint, "W0245") => (RuleGroup::Stable, rules::pylint::rules::SuperWithoutBrackets), - (Pylint, "W0406") => (RuleGroup::Stable, rules::pylint::rules::ImportSelf), - (Pylint, "W0602") => (RuleGroup::Stable, rules::pylint::rules::GlobalVariableNotAssigned), - (Pylint, "W0603") => (RuleGroup::Stable, rules::pylint::rules::GlobalStatement), - (Pylint, "W0604") => (RuleGroup::Stable, rules::pylint::rules::GlobalAtModuleLevel), - (Pylint, "W0642") => (RuleGroup::Stable, rules::pylint::rules::SelfOrClsAssignment), - (Pylint, "W0711") => (RuleGroup::Stable, rules::pylint::rules::BinaryOpException), - (Pylint, "W1501") => (RuleGroup::Stable, rules::pylint::rules::BadOpenMode), - (Pylint, "W1507") => (RuleGroup::Stable, rules::pylint::rules::ShallowCopyEnviron), - (Pylint, "W1508") => (RuleGroup::Stable, rules::pylint::rules::InvalidEnvvarDefault), - (Pylint, "W1509") => (RuleGroup::Stable, rules::pylint::rules::SubprocessPopenPreexecFn), - (Pylint, "W1510") => (RuleGroup::Stable, rules::pylint::rules::SubprocessRunWithoutCheck), - (Pylint, "W1514") => (RuleGroup::Preview, rules::pylint::rules::UnspecifiedEncoding), - (Pylint, "W1641") => (RuleGroup::Stable, rules::pylint::rules::EqWithoutHash), - (Pylint, "W2101") => (RuleGroup::Stable, rules::pylint::rules::UselessWithLock), - (Pylint, "W2901") => (RuleGroup::Stable, rules::pylint::rules::RedefinedLoopName), - (Pylint, "W3201") => (RuleGroup::Preview, rules::pylint::rules::BadDunderMethodName), - (Pylint, "W3301") => (RuleGroup::Stable, rules::pylint::rules::NestedMinMax), + (Pylint, "W0101") => rules::pylint::rules::UnreachableCode, + (Pylint, "W0108") => rules::pylint::rules::UnnecessaryLambda, + (Pylint, "W0177") => rules::pylint::rules::NanComparison, + (Pylint, "W0120") => rules::pylint::rules::UselessElseOnLoop, + (Pylint, "W0127") => rules::pylint::rules::SelfAssigningVariable, + (Pylint, "W0128") => rules::pylint::rules::RedeclaredAssignedName, + (Pylint, "W0129") => rules::pylint::rules::AssertOnStringLiteral, + (Pylint, "W0131") => rules::pylint::rules::NamedExprWithoutContext, + (Pylint, "W0133") => rules::pylint::rules::UselessExceptionStatement, + (Pylint, "W0211") => rules::pylint::rules::BadStaticmethodArgument, + (Pylint, "W0244") => rules::pylint::rules::RedefinedSlotsInSubclass, + (Pylint, "W0245") => rules::pylint::rules::SuperWithoutBrackets, + (Pylint, "W0406") => rules::pylint::rules::ImportSelf, + (Pylint, "W0602") => rules::pylint::rules::GlobalVariableNotAssigned, + (Pylint, "W0603") => rules::pylint::rules::GlobalStatement, + (Pylint, "W0604") => rules::pylint::rules::GlobalAtModuleLevel, + (Pylint, "W0642") => rules::pylint::rules::SelfOrClsAssignment, + (Pylint, "W0711") => rules::pylint::rules::BinaryOpException, + (Pylint, "W1501") => rules::pylint::rules::BadOpenMode, + (Pylint, "W1507") => rules::pylint::rules::ShallowCopyEnviron, + (Pylint, "W1508") => rules::pylint::rules::InvalidEnvvarDefault, + (Pylint, "W1509") => rules::pylint::rules::SubprocessPopenPreexecFn, + (Pylint, "W1510") => rules::pylint::rules::SubprocessRunWithoutCheck, + (Pylint, "W1514") => rules::pylint::rules::UnspecifiedEncoding, + (Pylint, "W1641") => rules::pylint::rules::EqWithoutHash, + (Pylint, "W2101") => rules::pylint::rules::UselessWithLock, + (Pylint, "W2901") => rules::pylint::rules::RedefinedLoopName, + (Pylint, "W3201") => rules::pylint::rules::BadDunderMethodName, + (Pylint, "W3301") => rules::pylint::rules::NestedMinMax, // flake8-async - (Flake8Async, "100") => (RuleGroup::Stable, rules::flake8_async::rules::CancelScopeNoCheckpoint), - (Flake8Async, "105") => (RuleGroup::Stable, rules::flake8_async::rules::TrioSyncCall), - (Flake8Async, "109") => (RuleGroup::Stable, rules::flake8_async::rules::AsyncFunctionWithTimeout), - (Flake8Async, "110") => (RuleGroup::Stable, rules::flake8_async::rules::AsyncBusyWait), - (Flake8Async, "115") => (RuleGroup::Stable, rules::flake8_async::rules::AsyncZeroSleep), - (Flake8Async, "116") => (RuleGroup::Stable, rules::flake8_async::rules::LongSleepNotForever), - (Flake8Async, "210") => (RuleGroup::Stable, rules::flake8_async::rules::BlockingHttpCallInAsyncFunction), - (Flake8Async, "212") => (RuleGroup::Preview, rules::flake8_async::rules::BlockingHttpCallHttpxInAsyncFunction), - (Flake8Async, "220") => (RuleGroup::Stable, rules::flake8_async::rules::CreateSubprocessInAsyncFunction), - (Flake8Async, "221") => (RuleGroup::Stable, rules::flake8_async::rules::RunProcessInAsyncFunction), - (Flake8Async, "222") => (RuleGroup::Stable, rules::flake8_async::rules::WaitForProcessInAsyncFunction), - (Flake8Async, "230") => (RuleGroup::Stable, rules::flake8_async::rules::BlockingOpenCallInAsyncFunction), - (Flake8Async, "240") => (RuleGroup::Preview, rules::flake8_async::rules::BlockingPathMethodInAsyncFunction), - (Flake8Async, "250") => (RuleGroup::Preview, rules::flake8_async::rules::BlockingInputInAsyncFunction), - (Flake8Async, "251") => (RuleGroup::Stable, rules::flake8_async::rules::BlockingSleepInAsyncFunction), + (Flake8Async, "100") => rules::flake8_async::rules::CancelScopeNoCheckpoint, + (Flake8Async, "105") => rules::flake8_async::rules::TrioSyncCall, + (Flake8Async, "109") => rules::flake8_async::rules::AsyncFunctionWithTimeout, + (Flake8Async, "110") => rules::flake8_async::rules::AsyncBusyWait, + (Flake8Async, "115") => rules::flake8_async::rules::AsyncZeroSleep, + (Flake8Async, "116") => rules::flake8_async::rules::LongSleepNotForever, + (Flake8Async, "210") => rules::flake8_async::rules::BlockingHttpCallInAsyncFunction, + (Flake8Async, "212") => rules::flake8_async::rules::BlockingHttpCallHttpxInAsyncFunction, + (Flake8Async, "220") => rules::flake8_async::rules::CreateSubprocessInAsyncFunction, + (Flake8Async, "221") => rules::flake8_async::rules::RunProcessInAsyncFunction, + (Flake8Async, "222") => rules::flake8_async::rules::WaitForProcessInAsyncFunction, + (Flake8Async, "230") => rules::flake8_async::rules::BlockingOpenCallInAsyncFunction, + (Flake8Async, "240") => rules::flake8_async::rules::BlockingPathMethodInAsyncFunction, + (Flake8Async, "250") => rules::flake8_async::rules::BlockingInputInAsyncFunction, + (Flake8Async, "251") => rules::flake8_async::rules::BlockingSleepInAsyncFunction, // flake8-builtins - (Flake8Builtins, "001") => (RuleGroup::Stable, rules::flake8_builtins::rules::BuiltinVariableShadowing), - (Flake8Builtins, "002") => (RuleGroup::Stable, rules::flake8_builtins::rules::BuiltinArgumentShadowing), - (Flake8Builtins, "003") => (RuleGroup::Stable, rules::flake8_builtins::rules::BuiltinAttributeShadowing), - (Flake8Builtins, "004") => (RuleGroup::Stable, rules::flake8_builtins::rules::BuiltinImportShadowing), - (Flake8Builtins, "005") => (RuleGroup::Stable, rules::flake8_builtins::rules::StdlibModuleShadowing), - (Flake8Builtins, "006") => (RuleGroup::Stable, rules::flake8_builtins::rules::BuiltinLambdaArgumentShadowing), + (Flake8Builtins, "001") => rules::flake8_builtins::rules::BuiltinVariableShadowing, + (Flake8Builtins, "002") => rules::flake8_builtins::rules::BuiltinArgumentShadowing, + (Flake8Builtins, "003") => rules::flake8_builtins::rules::BuiltinAttributeShadowing, + (Flake8Builtins, "004") => rules::flake8_builtins::rules::BuiltinImportShadowing, + (Flake8Builtins, "005") => rules::flake8_builtins::rules::StdlibModuleShadowing, + (Flake8Builtins, "006") => rules::flake8_builtins::rules::BuiltinLambdaArgumentShadowing, // flake8-bugbear - (Flake8Bugbear, "002") => (RuleGroup::Stable, rules::flake8_bugbear::rules::UnaryPrefixIncrementDecrement), - (Flake8Bugbear, "003") => (RuleGroup::Stable, rules::flake8_bugbear::rules::AssignmentToOsEnviron), - (Flake8Bugbear, "004") => (RuleGroup::Stable, rules::flake8_bugbear::rules::UnreliableCallableCheck), - (Flake8Bugbear, "005") => (RuleGroup::Stable, rules::flake8_bugbear::rules::StripWithMultiCharacters), - (Flake8Bugbear, "006") => (RuleGroup::Stable, rules::flake8_bugbear::rules::MutableArgumentDefault), - (Flake8Bugbear, "007") => (RuleGroup::Stable, rules::flake8_bugbear::rules::UnusedLoopControlVariable), - (Flake8Bugbear, "008") => (RuleGroup::Stable, rules::flake8_bugbear::rules::FunctionCallInDefaultArgument), - (Flake8Bugbear, "009") => (RuleGroup::Stable, rules::flake8_bugbear::rules::GetAttrWithConstant), - (Flake8Bugbear, "010") => (RuleGroup::Stable, rules::flake8_bugbear::rules::SetAttrWithConstant), - (Flake8Bugbear, "011") => (RuleGroup::Stable, rules::flake8_bugbear::rules::AssertFalse), - (Flake8Bugbear, "012") => (RuleGroup::Stable, rules::flake8_bugbear::rules::JumpStatementInFinally), - (Flake8Bugbear, "013") => (RuleGroup::Stable, rules::flake8_bugbear::rules::RedundantTupleInExceptionHandler), - (Flake8Bugbear, "014") => (RuleGroup::Stable, rules::flake8_bugbear::rules::DuplicateHandlerException), - (Flake8Bugbear, "015") => (RuleGroup::Stable, rules::flake8_bugbear::rules::UselessComparison), - (Flake8Bugbear, "016") => (RuleGroup::Stable, rules::flake8_bugbear::rules::RaiseLiteral), - (Flake8Bugbear, "017") => (RuleGroup::Stable, rules::flake8_bugbear::rules::AssertRaisesException), - (Flake8Bugbear, "018") => (RuleGroup::Stable, rules::flake8_bugbear::rules::UselessExpression), - (Flake8Bugbear, "019") => (RuleGroup::Stable, rules::flake8_bugbear::rules::CachedInstanceMethod), - (Flake8Bugbear, "020") => (RuleGroup::Stable, rules::flake8_bugbear::rules::LoopVariableOverridesIterator), - (Flake8Bugbear, "021") => (RuleGroup::Stable, rules::flake8_bugbear::rules::FStringDocstring), - (Flake8Bugbear, "022") => (RuleGroup::Stable, rules::flake8_bugbear::rules::UselessContextlibSuppress), - (Flake8Bugbear, "023") => (RuleGroup::Stable, rules::flake8_bugbear::rules::FunctionUsesLoopVariable), - (Flake8Bugbear, "024") => (RuleGroup::Stable, rules::flake8_bugbear::rules::AbstractBaseClassWithoutAbstractMethod), - (Flake8Bugbear, "025") => (RuleGroup::Stable, rules::flake8_bugbear::rules::DuplicateTryBlockException), - (Flake8Bugbear, "026") => (RuleGroup::Stable, rules::flake8_bugbear::rules::StarArgUnpackingAfterKeywordArg), - (Flake8Bugbear, "027") => (RuleGroup::Stable, rules::flake8_bugbear::rules::EmptyMethodWithoutAbstractDecorator), - (Flake8Bugbear, "028") => (RuleGroup::Stable, rules::flake8_bugbear::rules::NoExplicitStacklevel), - (Flake8Bugbear, "029") => (RuleGroup::Stable, rules::flake8_bugbear::rules::ExceptWithEmptyTuple), - (Flake8Bugbear, "030") => (RuleGroup::Stable, rules::flake8_bugbear::rules::ExceptWithNonExceptionClasses), - (Flake8Bugbear, "031") => (RuleGroup::Stable, rules::flake8_bugbear::rules::ReuseOfGroupbyGenerator), - (Flake8Bugbear, "032") => (RuleGroup::Stable, rules::flake8_bugbear::rules::UnintentionalTypeAnnotation), - (Flake8Bugbear, "033") => (RuleGroup::Stable, rules::flake8_bugbear::rules::DuplicateValue), - (Flake8Bugbear, "034") => (RuleGroup::Stable, rules::flake8_bugbear::rules::ReSubPositionalArgs), - (Flake8Bugbear, "035") => (RuleGroup::Stable, rules::flake8_bugbear::rules::StaticKeyDictComprehension), - (Flake8Bugbear, "039") => (RuleGroup::Stable, rules::flake8_bugbear::rules::MutableContextvarDefault), - (Flake8Bugbear, "901") => (RuleGroup::Preview, rules::flake8_bugbear::rules::ReturnInGenerator), - (Flake8Bugbear, "903") => (RuleGroup::Preview, rules::flake8_bugbear::rules::ClassAsDataStructure), - (Flake8Bugbear, "904") => (RuleGroup::Stable, rules::flake8_bugbear::rules::RaiseWithoutFromInsideExcept), - (Flake8Bugbear, "905") => (RuleGroup::Stable, rules::flake8_bugbear::rules::ZipWithoutExplicitStrict), - (Flake8Bugbear, "909") => (RuleGroup::Preview, rules::flake8_bugbear::rules::LoopIteratorMutation), - (Flake8Bugbear, "911") => (RuleGroup::Stable, rules::flake8_bugbear::rules::BatchedWithoutExplicitStrict), - (Flake8Bugbear, "912") => (RuleGroup::Preview, rules::flake8_bugbear::rules::MapWithoutExplicitStrict), + (Flake8Bugbear, "002") => rules::flake8_bugbear::rules::UnaryPrefixIncrementDecrement, + (Flake8Bugbear, "003") => rules::flake8_bugbear::rules::AssignmentToOsEnviron, + (Flake8Bugbear, "004") => rules::flake8_bugbear::rules::UnreliableCallableCheck, + (Flake8Bugbear, "005") => rules::flake8_bugbear::rules::StripWithMultiCharacters, + (Flake8Bugbear, "006") => rules::flake8_bugbear::rules::MutableArgumentDefault, + (Flake8Bugbear, "007") => rules::flake8_bugbear::rules::UnusedLoopControlVariable, + (Flake8Bugbear, "008") => rules::flake8_bugbear::rules::FunctionCallInDefaultArgument, + (Flake8Bugbear, "009") => rules::flake8_bugbear::rules::GetAttrWithConstant, + (Flake8Bugbear, "010") => rules::flake8_bugbear::rules::SetAttrWithConstant, + (Flake8Bugbear, "011") => rules::flake8_bugbear::rules::AssertFalse, + (Flake8Bugbear, "012") => rules::flake8_bugbear::rules::JumpStatementInFinally, + (Flake8Bugbear, "013") => rules::flake8_bugbear::rules::RedundantTupleInExceptionHandler, + (Flake8Bugbear, "014") => rules::flake8_bugbear::rules::DuplicateHandlerException, + (Flake8Bugbear, "015") => rules::flake8_bugbear::rules::UselessComparison, + (Flake8Bugbear, "016") => rules::flake8_bugbear::rules::RaiseLiteral, + (Flake8Bugbear, "017") => rules::flake8_bugbear::rules::AssertRaisesException, + (Flake8Bugbear, "018") => rules::flake8_bugbear::rules::UselessExpression, + (Flake8Bugbear, "019") => rules::flake8_bugbear::rules::CachedInstanceMethod, + (Flake8Bugbear, "020") => rules::flake8_bugbear::rules::LoopVariableOverridesIterator, + (Flake8Bugbear, "021") => rules::flake8_bugbear::rules::FStringDocstring, + (Flake8Bugbear, "022") => rules::flake8_bugbear::rules::UselessContextlibSuppress, + (Flake8Bugbear, "023") => rules::flake8_bugbear::rules::FunctionUsesLoopVariable, + (Flake8Bugbear, "024") => rules::flake8_bugbear::rules::AbstractBaseClassWithoutAbstractMethod, + (Flake8Bugbear, "025") => rules::flake8_bugbear::rules::DuplicateTryBlockException, + (Flake8Bugbear, "026") => rules::flake8_bugbear::rules::StarArgUnpackingAfterKeywordArg, + (Flake8Bugbear, "027") => rules::flake8_bugbear::rules::EmptyMethodWithoutAbstractDecorator, + (Flake8Bugbear, "028") => rules::flake8_bugbear::rules::NoExplicitStacklevel, + (Flake8Bugbear, "029") => rules::flake8_bugbear::rules::ExceptWithEmptyTuple, + (Flake8Bugbear, "030") => rules::flake8_bugbear::rules::ExceptWithNonExceptionClasses, + (Flake8Bugbear, "031") => rules::flake8_bugbear::rules::ReuseOfGroupbyGenerator, + (Flake8Bugbear, "032") => rules::flake8_bugbear::rules::UnintentionalTypeAnnotation, + (Flake8Bugbear, "033") => rules::flake8_bugbear::rules::DuplicateValue, + (Flake8Bugbear, "034") => rules::flake8_bugbear::rules::ReSubPositionalArgs, + (Flake8Bugbear, "035") => rules::flake8_bugbear::rules::StaticKeyDictComprehension, + (Flake8Bugbear, "039") => rules::flake8_bugbear::rules::MutableContextvarDefault, + (Flake8Bugbear, "901") => rules::flake8_bugbear::rules::ReturnInGenerator, + (Flake8Bugbear, "903") => rules::flake8_bugbear::rules::ClassAsDataStructure, + (Flake8Bugbear, "904") => rules::flake8_bugbear::rules::RaiseWithoutFromInsideExcept, + (Flake8Bugbear, "905") => rules::flake8_bugbear::rules::ZipWithoutExplicitStrict, + (Flake8Bugbear, "909") => rules::flake8_bugbear::rules::LoopIteratorMutation, + (Flake8Bugbear, "911") => rules::flake8_bugbear::rules::BatchedWithoutExplicitStrict, + (Flake8Bugbear, "912") => rules::flake8_bugbear::rules::MapWithoutExplicitStrict, // flake8-blind-except - (Flake8BlindExcept, "001") => (RuleGroup::Stable, rules::flake8_blind_except::rules::BlindExcept), + (Flake8BlindExcept, "001") => rules::flake8_blind_except::rules::BlindExcept, // flake8-comprehensions - (Flake8Comprehensions, "00") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessaryGeneratorList), - (Flake8Comprehensions, "01") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessaryGeneratorSet), - (Flake8Comprehensions, "02") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessaryGeneratorDict), - (Flake8Comprehensions, "03") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessaryListComprehensionSet), - (Flake8Comprehensions, "04") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessaryListComprehensionDict), - (Flake8Comprehensions, "05") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessaryLiteralSet), - (Flake8Comprehensions, "06") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessaryLiteralDict), - (Flake8Comprehensions, "08") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessaryCollectionCall), - (Flake8Comprehensions, "09") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessaryLiteralWithinTupleCall), - (Flake8Comprehensions, "10") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessaryLiteralWithinListCall), - (Flake8Comprehensions, "11") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessaryListCall), - (Flake8Comprehensions, "13") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessaryCallAroundSorted), - (Flake8Comprehensions, "14") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessaryDoubleCastOrProcess), - (Flake8Comprehensions, "15") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessarySubscriptReversal), - (Flake8Comprehensions, "16") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessaryComprehension), - (Flake8Comprehensions, "17") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessaryMap), - (Flake8Comprehensions, "18") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessaryLiteralWithinDictCall), - (Flake8Comprehensions, "19") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessaryComprehensionInCall), - (Flake8Comprehensions, "20") => (RuleGroup::Stable, rules::flake8_comprehensions::rules::UnnecessaryDictComprehensionForIterable), + (Flake8Comprehensions, "00") => rules::flake8_comprehensions::rules::UnnecessaryGeneratorList, + (Flake8Comprehensions, "01") => rules::flake8_comprehensions::rules::UnnecessaryGeneratorSet, + (Flake8Comprehensions, "02") => rules::flake8_comprehensions::rules::UnnecessaryGeneratorDict, + (Flake8Comprehensions, "03") => rules::flake8_comprehensions::rules::UnnecessaryListComprehensionSet, + (Flake8Comprehensions, "04") => rules::flake8_comprehensions::rules::UnnecessaryListComprehensionDict, + (Flake8Comprehensions, "05") => rules::flake8_comprehensions::rules::UnnecessaryLiteralSet, + (Flake8Comprehensions, "06") => rules::flake8_comprehensions::rules::UnnecessaryLiteralDict, + (Flake8Comprehensions, "08") => rules::flake8_comprehensions::rules::UnnecessaryCollectionCall, + (Flake8Comprehensions, "09") => rules::flake8_comprehensions::rules::UnnecessaryLiteralWithinTupleCall, + (Flake8Comprehensions, "10") => rules::flake8_comprehensions::rules::UnnecessaryLiteralWithinListCall, + (Flake8Comprehensions, "11") => rules::flake8_comprehensions::rules::UnnecessaryListCall, + (Flake8Comprehensions, "13") => rules::flake8_comprehensions::rules::UnnecessaryCallAroundSorted, + (Flake8Comprehensions, "14") => rules::flake8_comprehensions::rules::UnnecessaryDoubleCastOrProcess, + (Flake8Comprehensions, "15") => rules::flake8_comprehensions::rules::UnnecessarySubscriptReversal, + (Flake8Comprehensions, "16") => rules::flake8_comprehensions::rules::UnnecessaryComprehension, + (Flake8Comprehensions, "17") => rules::flake8_comprehensions::rules::UnnecessaryMap, + (Flake8Comprehensions, "18") => rules::flake8_comprehensions::rules::UnnecessaryLiteralWithinDictCall, + (Flake8Comprehensions, "19") => rules::flake8_comprehensions::rules::UnnecessaryComprehensionInCall, + (Flake8Comprehensions, "20") => rules::flake8_comprehensions::rules::UnnecessaryDictComprehensionForIterable, // flake8-debugger - (Flake8Debugger, "0") => (RuleGroup::Stable, rules::flake8_debugger::rules::Debugger), + (Flake8Debugger, "0") => rules::flake8_debugger::rules::Debugger, // mccabe - (McCabe, "1") => (RuleGroup::Stable, rules::mccabe::rules::ComplexStructure), + (McCabe, "1") => rules::mccabe::rules::ComplexStructure, // flake8-tidy-imports - (Flake8TidyImports, "251") => (RuleGroup::Stable, rules::flake8_tidy_imports::rules::BannedApi), - (Flake8TidyImports, "252") => (RuleGroup::Stable, rules::flake8_tidy_imports::rules::RelativeImports), - (Flake8TidyImports, "253") => (RuleGroup::Stable, rules::flake8_tidy_imports::rules::BannedModuleLevelImports), + (Flake8TidyImports, "251") => rules::flake8_tidy_imports::rules::BannedApi, + (Flake8TidyImports, "252") => rules::flake8_tidy_imports::rules::RelativeImports, + (Flake8TidyImports, "253") => rules::flake8_tidy_imports::rules::BannedModuleLevelImports, // flake8-return - (Flake8Return, "501") => (RuleGroup::Stable, rules::flake8_return::rules::UnnecessaryReturnNone), - (Flake8Return, "502") => (RuleGroup::Stable, rules::flake8_return::rules::ImplicitReturnValue), - (Flake8Return, "503") => (RuleGroup::Stable, rules::flake8_return::rules::ImplicitReturn), - (Flake8Return, "504") => (RuleGroup::Stable, rules::flake8_return::rules::UnnecessaryAssign), - (Flake8Return, "505") => (RuleGroup::Stable, rules::flake8_return::rules::SuperfluousElseReturn), - (Flake8Return, "506") => (RuleGroup::Stable, rules::flake8_return::rules::SuperfluousElseRaise), - (Flake8Return, "507") => (RuleGroup::Stable, rules::flake8_return::rules::SuperfluousElseContinue), - (Flake8Return, "508") => (RuleGroup::Stable, rules::flake8_return::rules::SuperfluousElseBreak), + (Flake8Return, "501") => rules::flake8_return::rules::UnnecessaryReturnNone, + (Flake8Return, "502") => rules::flake8_return::rules::ImplicitReturnValue, + (Flake8Return, "503") => rules::flake8_return::rules::ImplicitReturn, + (Flake8Return, "504") => rules::flake8_return::rules::UnnecessaryAssign, + (Flake8Return, "505") => rules::flake8_return::rules::SuperfluousElseReturn, + (Flake8Return, "506") => rules::flake8_return::rules::SuperfluousElseRaise, + (Flake8Return, "507") => rules::flake8_return::rules::SuperfluousElseContinue, + (Flake8Return, "508") => rules::flake8_return::rules::SuperfluousElseBreak, // flake8-gettext - (Flake8GetText, "001") => (RuleGroup::Stable, rules::flake8_gettext::rules::FStringInGetTextFuncCall), - (Flake8GetText, "002") => (RuleGroup::Stable, rules::flake8_gettext::rules::FormatInGetTextFuncCall), - (Flake8GetText, "003") => (RuleGroup::Stable, rules::flake8_gettext::rules::PrintfInGetTextFuncCall), + (Flake8GetText, "001") => rules::flake8_gettext::rules::FStringInGetTextFuncCall, + (Flake8GetText, "002") => rules::flake8_gettext::rules::FormatInGetTextFuncCall, + (Flake8GetText, "003") => rules::flake8_gettext::rules::PrintfInGetTextFuncCall, // flake8-implicit-str-concat - (Flake8ImplicitStrConcat, "001") => (RuleGroup::Stable, rules::flake8_implicit_str_concat::rules::SingleLineImplicitStringConcatenation), - (Flake8ImplicitStrConcat, "002") => (RuleGroup::Stable, rules::flake8_implicit_str_concat::rules::MultiLineImplicitStringConcatenation), - (Flake8ImplicitStrConcat, "003") => (RuleGroup::Stable, rules::flake8_implicit_str_concat::rules::ExplicitStringConcatenation), + (Flake8ImplicitStrConcat, "001") => rules::flake8_implicit_str_concat::rules::SingleLineImplicitStringConcatenation, + (Flake8ImplicitStrConcat, "002") => rules::flake8_implicit_str_concat::rules::MultiLineImplicitStringConcatenation, + (Flake8ImplicitStrConcat, "003") => rules::flake8_implicit_str_concat::rules::ExplicitStringConcatenation, // flake8-print - (Flake8Print, "1") => (RuleGroup::Stable, rules::flake8_print::rules::Print), - (Flake8Print, "3") => (RuleGroup::Stable, rules::flake8_print::rules::PPrint), + (Flake8Print, "1") => rules::flake8_print::rules::Print, + (Flake8Print, "3") => rules::flake8_print::rules::PPrint, // flake8-quotes - (Flake8Quotes, "000") => (RuleGroup::Stable, rules::flake8_quotes::rules::BadQuotesInlineString), - (Flake8Quotes, "001") => (RuleGroup::Stable, rules::flake8_quotes::rules::BadQuotesMultilineString), - (Flake8Quotes, "002") => (RuleGroup::Stable, rules::flake8_quotes::rules::BadQuotesDocstring), - (Flake8Quotes, "003") => (RuleGroup::Stable, rules::flake8_quotes::rules::AvoidableEscapedQuote), - (Flake8Quotes, "004") => (RuleGroup::Stable, rules::flake8_quotes::rules::UnnecessaryEscapedQuote), + (Flake8Quotes, "000") => rules::flake8_quotes::rules::BadQuotesInlineString, + (Flake8Quotes, "001") => rules::flake8_quotes::rules::BadQuotesMultilineString, + (Flake8Quotes, "002") => rules::flake8_quotes::rules::BadQuotesDocstring, + (Flake8Quotes, "003") => rules::flake8_quotes::rules::AvoidableEscapedQuote, + (Flake8Quotes, "004") => rules::flake8_quotes::rules::UnnecessaryEscapedQuote, // flake8-annotations - (Flake8Annotations, "001") => (RuleGroup::Stable, rules::flake8_annotations::rules::MissingTypeFunctionArgument), - (Flake8Annotations, "002") => (RuleGroup::Stable, rules::flake8_annotations::rules::MissingTypeArgs), - (Flake8Annotations, "003") => (RuleGroup::Stable, rules::flake8_annotations::rules::MissingTypeKwargs), + (Flake8Annotations, "001") => rules::flake8_annotations::rules::MissingTypeFunctionArgument, + (Flake8Annotations, "002") => rules::flake8_annotations::rules::MissingTypeArgs, + (Flake8Annotations, "003") => rules::flake8_annotations::rules::MissingTypeKwargs, #[allow(deprecated)] - (Flake8Annotations, "101") => (RuleGroup::Removed, rules::flake8_annotations::rules::MissingTypeSelf), + (Flake8Annotations, "101") => rules::flake8_annotations::rules::MissingTypeSelf, #[allow(deprecated)] - (Flake8Annotations, "102") => (RuleGroup::Removed, rules::flake8_annotations::rules::MissingTypeCls), - (Flake8Annotations, "201") => (RuleGroup::Stable, rules::flake8_annotations::rules::MissingReturnTypeUndocumentedPublicFunction), - (Flake8Annotations, "202") => (RuleGroup::Stable, rules::flake8_annotations::rules::MissingReturnTypePrivateFunction), - (Flake8Annotations, "204") => (RuleGroup::Stable, rules::flake8_annotations::rules::MissingReturnTypeSpecialMethod), - (Flake8Annotations, "205") => (RuleGroup::Stable, rules::flake8_annotations::rules::MissingReturnTypeStaticMethod), - (Flake8Annotations, "206") => (RuleGroup::Stable, rules::flake8_annotations::rules::MissingReturnTypeClassMethod), - (Flake8Annotations, "401") => (RuleGroup::Stable, rules::flake8_annotations::rules::AnyType), + (Flake8Annotations, "102") => rules::flake8_annotations::rules::MissingTypeCls, + (Flake8Annotations, "201") => rules::flake8_annotations::rules::MissingReturnTypeUndocumentedPublicFunction, + (Flake8Annotations, "202") => rules::flake8_annotations::rules::MissingReturnTypePrivateFunction, + (Flake8Annotations, "204") => rules::flake8_annotations::rules::MissingReturnTypeSpecialMethod, + (Flake8Annotations, "205") => rules::flake8_annotations::rules::MissingReturnTypeStaticMethod, + (Flake8Annotations, "206") => rules::flake8_annotations::rules::MissingReturnTypeClassMethod, + (Flake8Annotations, "401") => rules::flake8_annotations::rules::AnyType, // flake8-future-annotations - (Flake8FutureAnnotations, "100") => (RuleGroup::Stable, rules::flake8_future_annotations::rules::FutureRewritableTypeAnnotation), - (Flake8FutureAnnotations, "102") => (RuleGroup::Stable, rules::flake8_future_annotations::rules::FutureRequiredTypeAnnotation), + (Flake8FutureAnnotations, "100") => rules::flake8_future_annotations::rules::FutureRewritableTypeAnnotation, + (Flake8FutureAnnotations, "102") => rules::flake8_future_annotations::rules::FutureRequiredTypeAnnotation, // flake8-2020 - (Flake82020, "101") => (RuleGroup::Stable, rules::flake8_2020::rules::SysVersionSlice3), - (Flake82020, "102") => (RuleGroup::Stable, rules::flake8_2020::rules::SysVersion2), - (Flake82020, "103") => (RuleGroup::Stable, rules::flake8_2020::rules::SysVersionCmpStr3), - (Flake82020, "201") => (RuleGroup::Stable, rules::flake8_2020::rules::SysVersionInfo0Eq3), - (Flake82020, "202") => (RuleGroup::Stable, rules::flake8_2020::rules::SixPY3), - (Flake82020, "203") => (RuleGroup::Stable, rules::flake8_2020::rules::SysVersionInfo1CmpInt), - (Flake82020, "204") => (RuleGroup::Stable, rules::flake8_2020::rules::SysVersionInfoMinorCmpInt), - (Flake82020, "301") => (RuleGroup::Stable, rules::flake8_2020::rules::SysVersion0), - (Flake82020, "302") => (RuleGroup::Stable, rules::flake8_2020::rules::SysVersionCmpStr10), - (Flake82020, "303") => (RuleGroup::Stable, rules::flake8_2020::rules::SysVersionSlice1), + (Flake82020, "101") => rules::flake8_2020::rules::SysVersionSlice3, + (Flake82020, "102") => rules::flake8_2020::rules::SysVersion2, + (Flake82020, "103") => rules::flake8_2020::rules::SysVersionCmpStr3, + (Flake82020, "201") => rules::flake8_2020::rules::SysVersionInfo0Eq3, + (Flake82020, "202") => rules::flake8_2020::rules::SixPY3, + (Flake82020, "203") => rules::flake8_2020::rules::SysVersionInfo1CmpInt, + (Flake82020, "204") => rules::flake8_2020::rules::SysVersionInfoMinorCmpInt, + (Flake82020, "301") => rules::flake8_2020::rules::SysVersion0, + (Flake82020, "302") => rules::flake8_2020::rules::SysVersionCmpStr10, + (Flake82020, "303") => rules::flake8_2020::rules::SysVersionSlice1, // flake8-simplify - (Flake8Simplify, "101") => (RuleGroup::Stable, rules::flake8_simplify::rules::DuplicateIsinstanceCall), - (Flake8Simplify, "102") => (RuleGroup::Stable, rules::flake8_simplify::rules::CollapsibleIf), - (Flake8Simplify, "103") => (RuleGroup::Stable, rules::flake8_simplify::rules::NeedlessBool), - (Flake8Simplify, "105") => (RuleGroup::Stable, rules::flake8_simplify::rules::SuppressibleException), - (Flake8Simplify, "107") => (RuleGroup::Stable, rules::flake8_simplify::rules::ReturnInTryExceptFinally), - (Flake8Simplify, "108") => (RuleGroup::Stable, rules::flake8_simplify::rules::IfElseBlockInsteadOfIfExp), - (Flake8Simplify, "109") => (RuleGroup::Stable, rules::flake8_simplify::rules::CompareWithTuple), - (Flake8Simplify, "110") => (RuleGroup::Stable, rules::flake8_simplify::rules::ReimplementedBuiltin), - (Flake8Simplify, "112") => (RuleGroup::Stable, rules::flake8_simplify::rules::UncapitalizedEnvironmentVariables), - (Flake8Simplify, "113") => (RuleGroup::Stable, rules::flake8_simplify::rules::EnumerateForLoop), - (Flake8Simplify, "114") => (RuleGroup::Stable, rules::flake8_simplify::rules::IfWithSameArms), - (Flake8Simplify, "115") => (RuleGroup::Stable, rules::flake8_simplify::rules::OpenFileWithContextHandler), - (Flake8Simplify, "116") => (RuleGroup::Stable, rules::flake8_simplify::rules::IfElseBlockInsteadOfDictLookup), - (Flake8Simplify, "117") => (RuleGroup::Stable, rules::flake8_simplify::rules::MultipleWithStatements), - (Flake8Simplify, "118") => (RuleGroup::Stable, rules::flake8_simplify::rules::InDictKeys), - (Flake8Simplify, "201") => (RuleGroup::Stable, rules::flake8_simplify::rules::NegateEqualOp), - (Flake8Simplify, "202") => (RuleGroup::Stable, rules::flake8_simplify::rules::NegateNotEqualOp), - (Flake8Simplify, "208") => (RuleGroup::Stable, rules::flake8_simplify::rules::DoubleNegation), - (Flake8Simplify, "210") => (RuleGroup::Stable, rules::flake8_simplify::rules::IfExprWithTrueFalse), - (Flake8Simplify, "211") => (RuleGroup::Stable, rules::flake8_simplify::rules::IfExprWithFalseTrue), - (Flake8Simplify, "212") => (RuleGroup::Stable, rules::flake8_simplify::rules::IfExprWithTwistedArms), - (Flake8Simplify, "220") => (RuleGroup::Stable, rules::flake8_simplify::rules::ExprAndNotExpr), - (Flake8Simplify, "221") => (RuleGroup::Stable, rules::flake8_simplify::rules::ExprOrNotExpr), - (Flake8Simplify, "222") => (RuleGroup::Stable, rules::flake8_simplify::rules::ExprOrTrue), - (Flake8Simplify, "223") => (RuleGroup::Stable, rules::flake8_simplify::rules::ExprAndFalse), - (Flake8Simplify, "300") => (RuleGroup::Stable, rules::flake8_simplify::rules::YodaConditions), - (Flake8Simplify, "401") => (RuleGroup::Stable, rules::flake8_simplify::rules::IfElseBlockInsteadOfDictGet), - (Flake8Simplify, "905") => (RuleGroup::Stable, rules::flake8_simplify::rules::SplitStaticString), - (Flake8Simplify, "910") => (RuleGroup::Stable, rules::flake8_simplify::rules::DictGetWithNoneDefault), - (Flake8Simplify, "911") => (RuleGroup::Stable, rules::flake8_simplify::rules::ZipDictKeysAndValues), + (Flake8Simplify, "101") => rules::flake8_simplify::rules::DuplicateIsinstanceCall, + (Flake8Simplify, "102") => rules::flake8_simplify::rules::CollapsibleIf, + (Flake8Simplify, "103") => rules::flake8_simplify::rules::NeedlessBool, + (Flake8Simplify, "105") => rules::flake8_simplify::rules::SuppressibleException, + (Flake8Simplify, "107") => rules::flake8_simplify::rules::ReturnInTryExceptFinally, + (Flake8Simplify, "108") => rules::flake8_simplify::rules::IfElseBlockInsteadOfIfExp, + (Flake8Simplify, "109") => rules::flake8_simplify::rules::CompareWithTuple, + (Flake8Simplify, "110") => rules::flake8_simplify::rules::ReimplementedBuiltin, + (Flake8Simplify, "112") => rules::flake8_simplify::rules::UncapitalizedEnvironmentVariables, + (Flake8Simplify, "113") => rules::flake8_simplify::rules::EnumerateForLoop, + (Flake8Simplify, "114") => rules::flake8_simplify::rules::IfWithSameArms, + (Flake8Simplify, "115") => rules::flake8_simplify::rules::OpenFileWithContextHandler, + (Flake8Simplify, "116") => rules::flake8_simplify::rules::IfElseBlockInsteadOfDictLookup, + (Flake8Simplify, "117") => rules::flake8_simplify::rules::MultipleWithStatements, + (Flake8Simplify, "118") => rules::flake8_simplify::rules::InDictKeys, + (Flake8Simplify, "201") => rules::flake8_simplify::rules::NegateEqualOp, + (Flake8Simplify, "202") => rules::flake8_simplify::rules::NegateNotEqualOp, + (Flake8Simplify, "208") => rules::flake8_simplify::rules::DoubleNegation, + (Flake8Simplify, "210") => rules::flake8_simplify::rules::IfExprWithTrueFalse, + (Flake8Simplify, "211") => rules::flake8_simplify::rules::IfExprWithFalseTrue, + (Flake8Simplify, "212") => rules::flake8_simplify::rules::IfExprWithTwistedArms, + (Flake8Simplify, "220") => rules::flake8_simplify::rules::ExprAndNotExpr, + (Flake8Simplify, "221") => rules::flake8_simplify::rules::ExprOrNotExpr, + (Flake8Simplify, "222") => rules::flake8_simplify::rules::ExprOrTrue, + (Flake8Simplify, "223") => rules::flake8_simplify::rules::ExprAndFalse, + (Flake8Simplify, "300") => rules::flake8_simplify::rules::YodaConditions, + (Flake8Simplify, "401") => rules::flake8_simplify::rules::IfElseBlockInsteadOfDictGet, + (Flake8Simplify, "905") => rules::flake8_simplify::rules::SplitStaticString, + (Flake8Simplify, "910") => rules::flake8_simplify::rules::DictGetWithNoneDefault, + (Flake8Simplify, "911") => rules::flake8_simplify::rules::ZipDictKeysAndValues, // flake8-copyright - (Flake8Copyright, "001") => (RuleGroup::Preview, rules::flake8_copyright::rules::MissingCopyrightNotice), + (Flake8Copyright, "001") => rules::flake8_copyright::rules::MissingCopyrightNotice, // pyupgrade - (Pyupgrade, "001") => (RuleGroup::Stable, rules::pyupgrade::rules::UselessMetaclassType), - (Pyupgrade, "003") => (RuleGroup::Stable, rules::pyupgrade::rules::TypeOfPrimitive), - (Pyupgrade, "004") => (RuleGroup::Stable, rules::pyupgrade::rules::UselessObjectInheritance), - (Pyupgrade, "005") => (RuleGroup::Stable, rules::pyupgrade::rules::DeprecatedUnittestAlias), - (Pyupgrade, "006") => (RuleGroup::Stable, rules::pyupgrade::rules::NonPEP585Annotation), - (Pyupgrade, "007") => (RuleGroup::Stable, rules::pyupgrade::rules::NonPEP604AnnotationUnion), - (Pyupgrade, "008") => (RuleGroup::Stable, rules::pyupgrade::rules::SuperCallWithParameters), - (Pyupgrade, "009") => (RuleGroup::Stable, rules::pyupgrade::rules::UTF8EncodingDeclaration), - (Pyupgrade, "010") => (RuleGroup::Stable, rules::pyupgrade::rules::UnnecessaryFutureImport), - (Pyupgrade, "011") => (RuleGroup::Stable, rules::pyupgrade::rules::LRUCacheWithoutParameters), - (Pyupgrade, "012") => (RuleGroup::Stable, rules::pyupgrade::rules::UnnecessaryEncodeUTF8), - (Pyupgrade, "013") => (RuleGroup::Stable, rules::pyupgrade::rules::ConvertTypedDictFunctionalToClass), - (Pyupgrade, "014") => (RuleGroup::Stable, rules::pyupgrade::rules::ConvertNamedTupleFunctionalToClass), - (Pyupgrade, "015") => (RuleGroup::Stable, rules::pyupgrade::rules::RedundantOpenModes), - (Pyupgrade, "017") => (RuleGroup::Stable, rules::pyupgrade::rules::DatetimeTimezoneUTC), - (Pyupgrade, "018") => (RuleGroup::Stable, rules::pyupgrade::rules::NativeLiterals), - (Pyupgrade, "019") => (RuleGroup::Stable, rules::pyupgrade::rules::TypingTextStrAlias), - (Pyupgrade, "020") => (RuleGroup::Stable, rules::pyupgrade::rules::OpenAlias), - (Pyupgrade, "021") => (RuleGroup::Stable, rules::pyupgrade::rules::ReplaceUniversalNewlines), - (Pyupgrade, "022") => (RuleGroup::Stable, rules::pyupgrade::rules::ReplaceStdoutStderr), - (Pyupgrade, "023") => (RuleGroup::Stable, rules::pyupgrade::rules::DeprecatedCElementTree), - (Pyupgrade, "024") => (RuleGroup::Stable, rules::pyupgrade::rules::OSErrorAlias), - (Pyupgrade, "025") => (RuleGroup::Stable, rules::pyupgrade::rules::UnicodeKindPrefix), - (Pyupgrade, "026") => (RuleGroup::Stable, rules::pyupgrade::rules::DeprecatedMockImport), - (Pyupgrade, "027") => (RuleGroup::Removed, rules::pyupgrade::rules::UnpackedListComprehension), - (Pyupgrade, "028") => (RuleGroup::Stable, rules::pyupgrade::rules::YieldInForLoop), - (Pyupgrade, "029") => (RuleGroup::Stable, rules::pyupgrade::rules::UnnecessaryBuiltinImport), - (Pyupgrade, "030") => (RuleGroup::Stable, rules::pyupgrade::rules::FormatLiterals), - (Pyupgrade, "031") => (RuleGroup::Stable, rules::pyupgrade::rules::PrintfStringFormatting), - (Pyupgrade, "032") => (RuleGroup::Stable, rules::pyupgrade::rules::FString), - (Pyupgrade, "033") => (RuleGroup::Stable, rules::pyupgrade::rules::LRUCacheWithMaxsizeNone), - (Pyupgrade, "034") => (RuleGroup::Stable, rules::pyupgrade::rules::ExtraneousParentheses), - (Pyupgrade, "035") => (RuleGroup::Stable, rules::pyupgrade::rules::DeprecatedImport), - (Pyupgrade, "036") => (RuleGroup::Stable, rules::pyupgrade::rules::OutdatedVersionBlock), - (Pyupgrade, "037") => (RuleGroup::Stable, rules::pyupgrade::rules::QuotedAnnotation), - (Pyupgrade, "038") => (RuleGroup::Removed, rules::pyupgrade::rules::NonPEP604Isinstance), - (Pyupgrade, "039") => (RuleGroup::Stable, rules::pyupgrade::rules::UnnecessaryClassParentheses), - (Pyupgrade, "040") => (RuleGroup::Stable, rules::pyupgrade::rules::NonPEP695TypeAlias), - (Pyupgrade, "041") => (RuleGroup::Stable, rules::pyupgrade::rules::TimeoutErrorAlias), - (Pyupgrade, "042") => (RuleGroup::Preview, rules::pyupgrade::rules::ReplaceStrEnum), - (Pyupgrade, "043") => (RuleGroup::Stable, rules::pyupgrade::rules::UnnecessaryDefaultTypeArgs), - (Pyupgrade, "044") => (RuleGroup::Stable, rules::pyupgrade::rules::NonPEP646Unpack), - (Pyupgrade, "045") => (RuleGroup::Stable, rules::pyupgrade::rules::NonPEP604AnnotationOptional), - (Pyupgrade, "046") => (RuleGroup::Stable, rules::pyupgrade::rules::NonPEP695GenericClass), - (Pyupgrade, "047") => (RuleGroup::Stable, rules::pyupgrade::rules::NonPEP695GenericFunction), - (Pyupgrade, "049") => (RuleGroup::Stable, rules::pyupgrade::rules::PrivateTypeParameter), - (Pyupgrade, "050") => (RuleGroup::Stable, rules::pyupgrade::rules::UselessClassMetaclassType), + (Pyupgrade, "001") => rules::pyupgrade::rules::UselessMetaclassType, + (Pyupgrade, "003") => rules::pyupgrade::rules::TypeOfPrimitive, + (Pyupgrade, "004") => rules::pyupgrade::rules::UselessObjectInheritance, + (Pyupgrade, "005") => rules::pyupgrade::rules::DeprecatedUnittestAlias, + (Pyupgrade, "006") => rules::pyupgrade::rules::NonPEP585Annotation, + (Pyupgrade, "007") => rules::pyupgrade::rules::NonPEP604AnnotationUnion, + (Pyupgrade, "008") => rules::pyupgrade::rules::SuperCallWithParameters, + (Pyupgrade, "009") => rules::pyupgrade::rules::UTF8EncodingDeclaration, + (Pyupgrade, "010") => rules::pyupgrade::rules::UnnecessaryFutureImport, + (Pyupgrade, "011") => rules::pyupgrade::rules::LRUCacheWithoutParameters, + (Pyupgrade, "012") => rules::pyupgrade::rules::UnnecessaryEncodeUTF8, + (Pyupgrade, "013") => rules::pyupgrade::rules::ConvertTypedDictFunctionalToClass, + (Pyupgrade, "014") => rules::pyupgrade::rules::ConvertNamedTupleFunctionalToClass, + (Pyupgrade, "015") => rules::pyupgrade::rules::RedundantOpenModes, + (Pyupgrade, "017") => rules::pyupgrade::rules::DatetimeTimezoneUTC, + (Pyupgrade, "018") => rules::pyupgrade::rules::NativeLiterals, + (Pyupgrade, "019") => rules::pyupgrade::rules::TypingTextStrAlias, + (Pyupgrade, "020") => rules::pyupgrade::rules::OpenAlias, + (Pyupgrade, "021") => rules::pyupgrade::rules::ReplaceUniversalNewlines, + (Pyupgrade, "022") => rules::pyupgrade::rules::ReplaceStdoutStderr, + (Pyupgrade, "023") => rules::pyupgrade::rules::DeprecatedCElementTree, + (Pyupgrade, "024") => rules::pyupgrade::rules::OSErrorAlias, + (Pyupgrade, "025") => rules::pyupgrade::rules::UnicodeKindPrefix, + (Pyupgrade, "026") => rules::pyupgrade::rules::DeprecatedMockImport, + (Pyupgrade, "027") => rules::pyupgrade::rules::UnpackedListComprehension, + (Pyupgrade, "028") => rules::pyupgrade::rules::YieldInForLoop, + (Pyupgrade, "029") => rules::pyupgrade::rules::UnnecessaryBuiltinImport, + (Pyupgrade, "030") => rules::pyupgrade::rules::FormatLiterals, + (Pyupgrade, "031") => rules::pyupgrade::rules::PrintfStringFormatting, + (Pyupgrade, "032") => rules::pyupgrade::rules::FString, + (Pyupgrade, "033") => rules::pyupgrade::rules::LRUCacheWithMaxsizeNone, + (Pyupgrade, "034") => rules::pyupgrade::rules::ExtraneousParentheses, + (Pyupgrade, "035") => rules::pyupgrade::rules::DeprecatedImport, + (Pyupgrade, "036") => rules::pyupgrade::rules::OutdatedVersionBlock, + (Pyupgrade, "037") => rules::pyupgrade::rules::QuotedAnnotation, + (Pyupgrade, "038") => rules::pyupgrade::rules::NonPEP604Isinstance, + (Pyupgrade, "039") => rules::pyupgrade::rules::UnnecessaryClassParentheses, + (Pyupgrade, "040") => rules::pyupgrade::rules::NonPEP695TypeAlias, + (Pyupgrade, "041") => rules::pyupgrade::rules::TimeoutErrorAlias, + (Pyupgrade, "042") => rules::pyupgrade::rules::ReplaceStrEnum, + (Pyupgrade, "043") => rules::pyupgrade::rules::UnnecessaryDefaultTypeArgs, + (Pyupgrade, "044") => rules::pyupgrade::rules::NonPEP646Unpack, + (Pyupgrade, "045") => rules::pyupgrade::rules::NonPEP604AnnotationOptional, + (Pyupgrade, "046") => rules::pyupgrade::rules::NonPEP695GenericClass, + (Pyupgrade, "047") => rules::pyupgrade::rules::NonPEP695GenericFunction, + (Pyupgrade, "049") => rules::pyupgrade::rules::PrivateTypeParameter, + (Pyupgrade, "050") => rules::pyupgrade::rules::UselessClassMetaclassType, // pydocstyle - (Pydocstyle, "100") => (RuleGroup::Stable, rules::pydocstyle::rules::UndocumentedPublicModule), - (Pydocstyle, "101") => (RuleGroup::Stable, rules::pydocstyle::rules::UndocumentedPublicClass), - (Pydocstyle, "102") => (RuleGroup::Stable, rules::pydocstyle::rules::UndocumentedPublicMethod), - (Pydocstyle, "103") => (RuleGroup::Stable, rules::pydocstyle::rules::UndocumentedPublicFunction), - (Pydocstyle, "104") => (RuleGroup::Stable, rules::pydocstyle::rules::UndocumentedPublicPackage), - (Pydocstyle, "105") => (RuleGroup::Stable, rules::pydocstyle::rules::UndocumentedMagicMethod), - (Pydocstyle, "106") => (RuleGroup::Stable, rules::pydocstyle::rules::UndocumentedPublicNestedClass), - (Pydocstyle, "107") => (RuleGroup::Stable, rules::pydocstyle::rules::UndocumentedPublicInit), - (Pydocstyle, "200") => (RuleGroup::Stable, rules::pydocstyle::rules::UnnecessaryMultilineDocstring), - (Pydocstyle, "201") => (RuleGroup::Stable, rules::pydocstyle::rules::BlankLineBeforeFunction), - (Pydocstyle, "202") => (RuleGroup::Stable, rules::pydocstyle::rules::BlankLineAfterFunction), - (Pydocstyle, "203") => (RuleGroup::Stable, rules::pydocstyle::rules::IncorrectBlankLineBeforeClass), - (Pydocstyle, "204") => (RuleGroup::Stable, rules::pydocstyle::rules::IncorrectBlankLineAfterClass), - (Pydocstyle, "205") => (RuleGroup::Stable, rules::pydocstyle::rules::MissingBlankLineAfterSummary), - (Pydocstyle, "206") => (RuleGroup::Stable, rules::pydocstyle::rules::DocstringTabIndentation), - (Pydocstyle, "207") => (RuleGroup::Stable, rules::pydocstyle::rules::UnderIndentation), - (Pydocstyle, "208") => (RuleGroup::Stable, rules::pydocstyle::rules::OverIndentation), - (Pydocstyle, "209") => (RuleGroup::Stable, rules::pydocstyle::rules::NewLineAfterLastParagraph), - (Pydocstyle, "210") => (RuleGroup::Stable, rules::pydocstyle::rules::SurroundingWhitespace), - (Pydocstyle, "211") => (RuleGroup::Stable, rules::pydocstyle::rules::BlankLineBeforeClass), - (Pydocstyle, "212") => (RuleGroup::Stable, rules::pydocstyle::rules::MultiLineSummaryFirstLine), - (Pydocstyle, "213") => (RuleGroup::Stable, rules::pydocstyle::rules::MultiLineSummarySecondLine), - (Pydocstyle, "214") => (RuleGroup::Stable, rules::pydocstyle::rules::OverindentedSection), - (Pydocstyle, "215") => (RuleGroup::Stable, rules::pydocstyle::rules::OverindentedSectionUnderline), - (Pydocstyle, "300") => (RuleGroup::Stable, rules::pydocstyle::rules::TripleSingleQuotes), - (Pydocstyle, "301") => (RuleGroup::Stable, rules::pydocstyle::rules::EscapeSequenceInDocstring), - (Pydocstyle, "400") => (RuleGroup::Stable, rules::pydocstyle::rules::MissingTrailingPeriod), - (Pydocstyle, "401") => (RuleGroup::Stable, rules::pydocstyle::rules::NonImperativeMood), - (Pydocstyle, "402") => (RuleGroup::Stable, rules::pydocstyle::rules::SignatureInDocstring), - (Pydocstyle, "403") => (RuleGroup::Stable, rules::pydocstyle::rules::FirstWordUncapitalized), - (Pydocstyle, "404") => (RuleGroup::Stable, rules::pydocstyle::rules::DocstringStartsWithThis), - (Pydocstyle, "405") => (RuleGroup::Stable, rules::pydocstyle::rules::NonCapitalizedSectionName), - (Pydocstyle, "406") => (RuleGroup::Stable, rules::pydocstyle::rules::MissingNewLineAfterSectionName), - (Pydocstyle, "407") => (RuleGroup::Stable, rules::pydocstyle::rules::MissingDashedUnderlineAfterSection), - (Pydocstyle, "408") => (RuleGroup::Stable, rules::pydocstyle::rules::MissingSectionUnderlineAfterName), - (Pydocstyle, "409") => (RuleGroup::Stable, rules::pydocstyle::rules::MismatchedSectionUnderlineLength), - (Pydocstyle, "410") => (RuleGroup::Stable, rules::pydocstyle::rules::NoBlankLineAfterSection), - (Pydocstyle, "411") => (RuleGroup::Stable, rules::pydocstyle::rules::NoBlankLineBeforeSection), - (Pydocstyle, "412") => (RuleGroup::Stable, rules::pydocstyle::rules::BlankLinesBetweenHeaderAndContent), - (Pydocstyle, "413") => (RuleGroup::Stable, rules::pydocstyle::rules::MissingBlankLineAfterLastSection), - (Pydocstyle, "414") => (RuleGroup::Stable, rules::pydocstyle::rules::EmptyDocstringSection), - (Pydocstyle, "415") => (RuleGroup::Stable, rules::pydocstyle::rules::MissingTerminalPunctuation), - (Pydocstyle, "416") => (RuleGroup::Stable, rules::pydocstyle::rules::MissingSectionNameColon), - (Pydocstyle, "417") => (RuleGroup::Stable, rules::pydocstyle::rules::UndocumentedParam), - (Pydocstyle, "418") => (RuleGroup::Stable, rules::pydocstyle::rules::OverloadWithDocstring), - (Pydocstyle, "419") => (RuleGroup::Stable, rules::pydocstyle::rules::EmptyDocstring), + (Pydocstyle, "100") => rules::pydocstyle::rules::UndocumentedPublicModule, + (Pydocstyle, "101") => rules::pydocstyle::rules::UndocumentedPublicClass, + (Pydocstyle, "102") => rules::pydocstyle::rules::UndocumentedPublicMethod, + (Pydocstyle, "103") => rules::pydocstyle::rules::UndocumentedPublicFunction, + (Pydocstyle, "104") => rules::pydocstyle::rules::UndocumentedPublicPackage, + (Pydocstyle, "105") => rules::pydocstyle::rules::UndocumentedMagicMethod, + (Pydocstyle, "106") => rules::pydocstyle::rules::UndocumentedPublicNestedClass, + (Pydocstyle, "107") => rules::pydocstyle::rules::UndocumentedPublicInit, + (Pydocstyle, "200") => rules::pydocstyle::rules::UnnecessaryMultilineDocstring, + (Pydocstyle, "201") => rules::pydocstyle::rules::BlankLineBeforeFunction, + (Pydocstyle, "202") => rules::pydocstyle::rules::BlankLineAfterFunction, + (Pydocstyle, "203") => rules::pydocstyle::rules::IncorrectBlankLineBeforeClass, + (Pydocstyle, "204") => rules::pydocstyle::rules::IncorrectBlankLineAfterClass, + (Pydocstyle, "205") => rules::pydocstyle::rules::MissingBlankLineAfterSummary, + (Pydocstyle, "206") => rules::pydocstyle::rules::DocstringTabIndentation, + (Pydocstyle, "207") => rules::pydocstyle::rules::UnderIndentation, + (Pydocstyle, "208") => rules::pydocstyle::rules::OverIndentation, + (Pydocstyle, "209") => rules::pydocstyle::rules::NewLineAfterLastParagraph, + (Pydocstyle, "210") => rules::pydocstyle::rules::SurroundingWhitespace, + (Pydocstyle, "211") => rules::pydocstyle::rules::BlankLineBeforeClass, + (Pydocstyle, "212") => rules::pydocstyle::rules::MultiLineSummaryFirstLine, + (Pydocstyle, "213") => rules::pydocstyle::rules::MultiLineSummarySecondLine, + (Pydocstyle, "214") => rules::pydocstyle::rules::OverindentedSection, + (Pydocstyle, "215") => rules::pydocstyle::rules::OverindentedSectionUnderline, + (Pydocstyle, "300") => rules::pydocstyle::rules::TripleSingleQuotes, + (Pydocstyle, "301") => rules::pydocstyle::rules::EscapeSequenceInDocstring, + (Pydocstyle, "400") => rules::pydocstyle::rules::MissingTrailingPeriod, + (Pydocstyle, "401") => rules::pydocstyle::rules::NonImperativeMood, + (Pydocstyle, "402") => rules::pydocstyle::rules::SignatureInDocstring, + (Pydocstyle, "403") => rules::pydocstyle::rules::FirstWordUncapitalized, + (Pydocstyle, "404") => rules::pydocstyle::rules::DocstringStartsWithThis, + (Pydocstyle, "405") => rules::pydocstyle::rules::NonCapitalizedSectionName, + (Pydocstyle, "406") => rules::pydocstyle::rules::MissingNewLineAfterSectionName, + (Pydocstyle, "407") => rules::pydocstyle::rules::MissingDashedUnderlineAfterSection, + (Pydocstyle, "408") => rules::pydocstyle::rules::MissingSectionUnderlineAfterName, + (Pydocstyle, "409") => rules::pydocstyle::rules::MismatchedSectionUnderlineLength, + (Pydocstyle, "410") => rules::pydocstyle::rules::NoBlankLineAfterSection, + (Pydocstyle, "411") => rules::pydocstyle::rules::NoBlankLineBeforeSection, + (Pydocstyle, "412") => rules::pydocstyle::rules::BlankLinesBetweenHeaderAndContent, + (Pydocstyle, "413") => rules::pydocstyle::rules::MissingBlankLineAfterLastSection, + (Pydocstyle, "414") => rules::pydocstyle::rules::EmptyDocstringSection, + (Pydocstyle, "415") => rules::pydocstyle::rules::MissingTerminalPunctuation, + (Pydocstyle, "416") => rules::pydocstyle::rules::MissingSectionNameColon, + (Pydocstyle, "417") => rules::pydocstyle::rules::UndocumentedParam, + (Pydocstyle, "418") => rules::pydocstyle::rules::OverloadWithDocstring, + (Pydocstyle, "419") => rules::pydocstyle::rules::EmptyDocstring, // pep8-naming - (PEP8Naming, "801") => (RuleGroup::Stable, rules::pep8_naming::rules::InvalidClassName), - (PEP8Naming, "802") => (RuleGroup::Stable, rules::pep8_naming::rules::InvalidFunctionName), - (PEP8Naming, "803") => (RuleGroup::Stable, rules::pep8_naming::rules::InvalidArgumentName), - (PEP8Naming, "804") => (RuleGroup::Stable, rules::pep8_naming::rules::InvalidFirstArgumentNameForClassMethod), - (PEP8Naming, "805") => (RuleGroup::Stable, rules::pep8_naming::rules::InvalidFirstArgumentNameForMethod), - (PEP8Naming, "806") => (RuleGroup::Stable, rules::pep8_naming::rules::NonLowercaseVariableInFunction), - (PEP8Naming, "807") => (RuleGroup::Stable, rules::pep8_naming::rules::DunderFunctionName), - (PEP8Naming, "811") => (RuleGroup::Stable, rules::pep8_naming::rules::ConstantImportedAsNonConstant), - (PEP8Naming, "812") => (RuleGroup::Stable, rules::pep8_naming::rules::LowercaseImportedAsNonLowercase), - (PEP8Naming, "813") => (RuleGroup::Stable, rules::pep8_naming::rules::CamelcaseImportedAsLowercase), - (PEP8Naming, "814") => (RuleGroup::Stable, rules::pep8_naming::rules::CamelcaseImportedAsConstant), - (PEP8Naming, "815") => (RuleGroup::Stable, rules::pep8_naming::rules::MixedCaseVariableInClassScope), - (PEP8Naming, "816") => (RuleGroup::Stable, rules::pep8_naming::rules::MixedCaseVariableInGlobalScope), - (PEP8Naming, "817") => (RuleGroup::Stable, rules::pep8_naming::rules::CamelcaseImportedAsAcronym), - (PEP8Naming, "818") => (RuleGroup::Stable, rules::pep8_naming::rules::ErrorSuffixOnExceptionName), - (PEP8Naming, "999") => (RuleGroup::Stable, rules::pep8_naming::rules::InvalidModuleName), + (PEP8Naming, "801") => rules::pep8_naming::rules::InvalidClassName, + (PEP8Naming, "802") => rules::pep8_naming::rules::InvalidFunctionName, + (PEP8Naming, "803") => rules::pep8_naming::rules::InvalidArgumentName, + (PEP8Naming, "804") => rules::pep8_naming::rules::InvalidFirstArgumentNameForClassMethod, + (PEP8Naming, "805") => rules::pep8_naming::rules::InvalidFirstArgumentNameForMethod, + (PEP8Naming, "806") => rules::pep8_naming::rules::NonLowercaseVariableInFunction, + (PEP8Naming, "807") => rules::pep8_naming::rules::DunderFunctionName, + (PEP8Naming, "811") => rules::pep8_naming::rules::ConstantImportedAsNonConstant, + (PEP8Naming, "812") => rules::pep8_naming::rules::LowercaseImportedAsNonLowercase, + (PEP8Naming, "813") => rules::pep8_naming::rules::CamelcaseImportedAsLowercase, + (PEP8Naming, "814") => rules::pep8_naming::rules::CamelcaseImportedAsConstant, + (PEP8Naming, "815") => rules::pep8_naming::rules::MixedCaseVariableInClassScope, + (PEP8Naming, "816") => rules::pep8_naming::rules::MixedCaseVariableInGlobalScope, + (PEP8Naming, "817") => rules::pep8_naming::rules::CamelcaseImportedAsAcronym, + (PEP8Naming, "818") => rules::pep8_naming::rules::ErrorSuffixOnExceptionName, + (PEP8Naming, "999") => rules::pep8_naming::rules::InvalidModuleName, // isort - (Isort, "001") => (RuleGroup::Stable, rules::isort::rules::UnsortedImports), - (Isort, "002") => (RuleGroup::Stable, rules::isort::rules::MissingRequiredImport), + (Isort, "001") => rules::isort::rules::UnsortedImports, + (Isort, "002") => rules::isort::rules::MissingRequiredImport, // eradicate - (Eradicate, "001") => (RuleGroup::Stable, rules::eradicate::rules::CommentedOutCode), + (Eradicate, "001") => rules::eradicate::rules::CommentedOutCode, // flake8-bandit - (Flake8Bandit, "101") => (RuleGroup::Stable, rules::flake8_bandit::rules::Assert), - (Flake8Bandit, "102") => (RuleGroup::Stable, rules::flake8_bandit::rules::ExecBuiltin), - (Flake8Bandit, "103") => (RuleGroup::Stable, rules::flake8_bandit::rules::BadFilePermissions), - (Flake8Bandit, "104") => (RuleGroup::Stable, rules::flake8_bandit::rules::HardcodedBindAllInterfaces), - (Flake8Bandit, "105") => (RuleGroup::Stable, rules::flake8_bandit::rules::HardcodedPasswordString), - (Flake8Bandit, "106") => (RuleGroup::Stable, rules::flake8_bandit::rules::HardcodedPasswordFuncArg), - (Flake8Bandit, "107") => (RuleGroup::Stable, rules::flake8_bandit::rules::HardcodedPasswordDefault), - (Flake8Bandit, "108") => (RuleGroup::Stable, rules::flake8_bandit::rules::HardcodedTempFile), - (Flake8Bandit, "110") => (RuleGroup::Stable, rules::flake8_bandit::rules::TryExceptPass), - (Flake8Bandit, "112") => (RuleGroup::Stable, rules::flake8_bandit::rules::TryExceptContinue), - (Flake8Bandit, "113") => (RuleGroup::Stable, rules::flake8_bandit::rules::RequestWithoutTimeout), - (Flake8Bandit, "201") => (RuleGroup::Stable, rules::flake8_bandit::rules::FlaskDebugTrue), - (Flake8Bandit, "202") => (RuleGroup::Stable, rules::flake8_bandit::rules::TarfileUnsafeMembers), - (Flake8Bandit, "301") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousPickleUsage), - (Flake8Bandit, "302") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousMarshalUsage), - (Flake8Bandit, "303") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousInsecureHashUsage), - (Flake8Bandit, "304") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousInsecureCipherUsage), - (Flake8Bandit, "305") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousInsecureCipherModeUsage), - (Flake8Bandit, "306") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousMktempUsage), - (Flake8Bandit, "307") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousEvalUsage), - (Flake8Bandit, "308") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousMarkSafeUsage), - (Flake8Bandit, "310") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousURLOpenUsage), - (Flake8Bandit, "311") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousNonCryptographicRandomUsage), - (Flake8Bandit, "312") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousTelnetUsage), - (Flake8Bandit, "313") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousXMLCElementTreeUsage), - (Flake8Bandit, "314") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousXMLElementTreeUsage), - (Flake8Bandit, "315") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousXMLExpatReaderUsage), - (Flake8Bandit, "316") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousXMLExpatBuilderUsage), - (Flake8Bandit, "317") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousXMLSaxUsage), - (Flake8Bandit, "318") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousXMLMiniDOMUsage), - (Flake8Bandit, "319") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousXMLPullDOMUsage), - (Flake8Bandit, "320") => (RuleGroup::Removed, rules::flake8_bandit::rules::SuspiciousXMLETreeUsage), - (Flake8Bandit, "321") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousFTPLibUsage), - (Flake8Bandit, "323") => (RuleGroup::Stable, rules::flake8_bandit::rules::SuspiciousUnverifiedContextUsage), - (Flake8Bandit, "324") => (RuleGroup::Stable, rules::flake8_bandit::rules::HashlibInsecureHashFunction), - (Flake8Bandit, "401") => (RuleGroup::Preview, rules::flake8_bandit::rules::SuspiciousTelnetlibImport), - (Flake8Bandit, "402") => (RuleGroup::Preview, rules::flake8_bandit::rules::SuspiciousFtplibImport), - (Flake8Bandit, "403") => (RuleGroup::Preview, rules::flake8_bandit::rules::SuspiciousPickleImport), - (Flake8Bandit, "404") => (RuleGroup::Preview, rules::flake8_bandit::rules::SuspiciousSubprocessImport), - (Flake8Bandit, "405") => (RuleGroup::Preview, rules::flake8_bandit::rules::SuspiciousXmlEtreeImport), - (Flake8Bandit, "406") => (RuleGroup::Preview, rules::flake8_bandit::rules::SuspiciousXmlSaxImport), - (Flake8Bandit, "407") => (RuleGroup::Preview, rules::flake8_bandit::rules::SuspiciousXmlExpatImport), - (Flake8Bandit, "408") => (RuleGroup::Preview, rules::flake8_bandit::rules::SuspiciousXmlMinidomImport), - (Flake8Bandit, "409") => (RuleGroup::Preview, rules::flake8_bandit::rules::SuspiciousXmlPulldomImport), - (Flake8Bandit, "410") => (RuleGroup::Removed, rules::flake8_bandit::rules::SuspiciousLxmlImport), - (Flake8Bandit, "411") => (RuleGroup::Preview, rules::flake8_bandit::rules::SuspiciousXmlrpcImport), - (Flake8Bandit, "412") => (RuleGroup::Preview, rules::flake8_bandit::rules::SuspiciousHttpoxyImport), - (Flake8Bandit, "413") => (RuleGroup::Preview, rules::flake8_bandit::rules::SuspiciousPycryptoImport), - (Flake8Bandit, "415") => (RuleGroup::Preview, rules::flake8_bandit::rules::SuspiciousPyghmiImport), - (Flake8Bandit, "501") => (RuleGroup::Stable, rules::flake8_bandit::rules::RequestWithNoCertValidation), - (Flake8Bandit, "502") => (RuleGroup::Stable, rules::flake8_bandit::rules::SslInsecureVersion), - (Flake8Bandit, "503") => (RuleGroup::Stable, rules::flake8_bandit::rules::SslWithBadDefaults), - (Flake8Bandit, "504") => (RuleGroup::Stable, rules::flake8_bandit::rules::SslWithNoVersion), - (Flake8Bandit, "505") => (RuleGroup::Stable, rules::flake8_bandit::rules::WeakCryptographicKey), - (Flake8Bandit, "506") => (RuleGroup::Stable, rules::flake8_bandit::rules::UnsafeYAMLLoad), - (Flake8Bandit, "507") => (RuleGroup::Stable, rules::flake8_bandit::rules::SSHNoHostKeyVerification), - (Flake8Bandit, "508") => (RuleGroup::Stable, rules::flake8_bandit::rules::SnmpInsecureVersion), - (Flake8Bandit, "509") => (RuleGroup::Stable, rules::flake8_bandit::rules::SnmpWeakCryptography), - (Flake8Bandit, "601") => (RuleGroup::Stable, rules::flake8_bandit::rules::ParamikoCall), - (Flake8Bandit, "602") => (RuleGroup::Stable, rules::flake8_bandit::rules::SubprocessPopenWithShellEqualsTrue), - (Flake8Bandit, "603") => (RuleGroup::Stable, rules::flake8_bandit::rules::SubprocessWithoutShellEqualsTrue), - (Flake8Bandit, "604") => (RuleGroup::Stable, rules::flake8_bandit::rules::CallWithShellEqualsTrue), - (Flake8Bandit, "605") => (RuleGroup::Stable, rules::flake8_bandit::rules::StartProcessWithAShell), - (Flake8Bandit, "606") => (RuleGroup::Stable, rules::flake8_bandit::rules::StartProcessWithNoShell), - (Flake8Bandit, "607") => (RuleGroup::Stable, rules::flake8_bandit::rules::StartProcessWithPartialPath), - (Flake8Bandit, "608") => (RuleGroup::Stable, rules::flake8_bandit::rules::HardcodedSQLExpression), - (Flake8Bandit, "609") => (RuleGroup::Stable, rules::flake8_bandit::rules::UnixCommandWildcardInjection), - (Flake8Bandit, "610") => (RuleGroup::Stable, rules::flake8_bandit::rules::DjangoExtra), - (Flake8Bandit, "611") => (RuleGroup::Stable, rules::flake8_bandit::rules::DjangoRawSql), - (Flake8Bandit, "612") => (RuleGroup::Stable, rules::flake8_bandit::rules::LoggingConfigInsecureListen), - (Flake8Bandit, "701") => (RuleGroup::Stable, rules::flake8_bandit::rules::Jinja2AutoescapeFalse), - (Flake8Bandit, "702") => (RuleGroup::Stable, rules::flake8_bandit::rules::MakoTemplates), - (Flake8Bandit, "704") => (RuleGroup::Stable, rules::flake8_bandit::rules::UnsafeMarkupUse), + (Flake8Bandit, "101") => rules::flake8_bandit::rules::Assert, + (Flake8Bandit, "102") => rules::flake8_bandit::rules::ExecBuiltin, + (Flake8Bandit, "103") => rules::flake8_bandit::rules::BadFilePermissions, + (Flake8Bandit, "104") => rules::flake8_bandit::rules::HardcodedBindAllInterfaces, + (Flake8Bandit, "105") => rules::flake8_bandit::rules::HardcodedPasswordString, + (Flake8Bandit, "106") => rules::flake8_bandit::rules::HardcodedPasswordFuncArg, + (Flake8Bandit, "107") => rules::flake8_bandit::rules::HardcodedPasswordDefault, + (Flake8Bandit, "108") => rules::flake8_bandit::rules::HardcodedTempFile, + (Flake8Bandit, "110") => rules::flake8_bandit::rules::TryExceptPass, + (Flake8Bandit, "112") => rules::flake8_bandit::rules::TryExceptContinue, + (Flake8Bandit, "113") => rules::flake8_bandit::rules::RequestWithoutTimeout, + (Flake8Bandit, "201") => rules::flake8_bandit::rules::FlaskDebugTrue, + (Flake8Bandit, "202") => rules::flake8_bandit::rules::TarfileUnsafeMembers, + (Flake8Bandit, "301") => rules::flake8_bandit::rules::SuspiciousPickleUsage, + (Flake8Bandit, "302") => rules::flake8_bandit::rules::SuspiciousMarshalUsage, + (Flake8Bandit, "303") => rules::flake8_bandit::rules::SuspiciousInsecureHashUsage, + (Flake8Bandit, "304") => rules::flake8_bandit::rules::SuspiciousInsecureCipherUsage, + (Flake8Bandit, "305") => rules::flake8_bandit::rules::SuspiciousInsecureCipherModeUsage, + (Flake8Bandit, "306") => rules::flake8_bandit::rules::SuspiciousMktempUsage, + (Flake8Bandit, "307") => rules::flake8_bandit::rules::SuspiciousEvalUsage, + (Flake8Bandit, "308") => rules::flake8_bandit::rules::SuspiciousMarkSafeUsage, + (Flake8Bandit, "310") => rules::flake8_bandit::rules::SuspiciousURLOpenUsage, + (Flake8Bandit, "311") => rules::flake8_bandit::rules::SuspiciousNonCryptographicRandomUsage, + (Flake8Bandit, "312") => rules::flake8_bandit::rules::SuspiciousTelnetUsage, + (Flake8Bandit, "313") => rules::flake8_bandit::rules::SuspiciousXMLCElementTreeUsage, + (Flake8Bandit, "314") => rules::flake8_bandit::rules::SuspiciousXMLElementTreeUsage, + (Flake8Bandit, "315") => rules::flake8_bandit::rules::SuspiciousXMLExpatReaderUsage, + (Flake8Bandit, "316") => rules::flake8_bandit::rules::SuspiciousXMLExpatBuilderUsage, + (Flake8Bandit, "317") => rules::flake8_bandit::rules::SuspiciousXMLSaxUsage, + (Flake8Bandit, "318") => rules::flake8_bandit::rules::SuspiciousXMLMiniDOMUsage, + (Flake8Bandit, "319") => rules::flake8_bandit::rules::SuspiciousXMLPullDOMUsage, + (Flake8Bandit, "320") => rules::flake8_bandit::rules::SuspiciousXMLETreeUsage, + (Flake8Bandit, "321") => rules::flake8_bandit::rules::SuspiciousFTPLibUsage, + (Flake8Bandit, "323") => rules::flake8_bandit::rules::SuspiciousUnverifiedContextUsage, + (Flake8Bandit, "324") => rules::flake8_bandit::rules::HashlibInsecureHashFunction, + (Flake8Bandit, "401") => rules::flake8_bandit::rules::SuspiciousTelnetlibImport, + (Flake8Bandit, "402") => rules::flake8_bandit::rules::SuspiciousFtplibImport, + (Flake8Bandit, "403") => rules::flake8_bandit::rules::SuspiciousPickleImport, + (Flake8Bandit, "404") => rules::flake8_bandit::rules::SuspiciousSubprocessImport, + (Flake8Bandit, "405") => rules::flake8_bandit::rules::SuspiciousXmlEtreeImport, + (Flake8Bandit, "406") => rules::flake8_bandit::rules::SuspiciousXmlSaxImport, + (Flake8Bandit, "407") => rules::flake8_bandit::rules::SuspiciousXmlExpatImport, + (Flake8Bandit, "408") => rules::flake8_bandit::rules::SuspiciousXmlMinidomImport, + (Flake8Bandit, "409") => rules::flake8_bandit::rules::SuspiciousXmlPulldomImport, + (Flake8Bandit, "410") => rules::flake8_bandit::rules::SuspiciousLxmlImport, + (Flake8Bandit, "411") => rules::flake8_bandit::rules::SuspiciousXmlrpcImport, + (Flake8Bandit, "412") => rules::flake8_bandit::rules::SuspiciousHttpoxyImport, + (Flake8Bandit, "413") => rules::flake8_bandit::rules::SuspiciousPycryptoImport, + (Flake8Bandit, "415") => rules::flake8_bandit::rules::SuspiciousPyghmiImport, + (Flake8Bandit, "501") => rules::flake8_bandit::rules::RequestWithNoCertValidation, + (Flake8Bandit, "502") => rules::flake8_bandit::rules::SslInsecureVersion, + (Flake8Bandit, "503") => rules::flake8_bandit::rules::SslWithBadDefaults, + (Flake8Bandit, "504") => rules::flake8_bandit::rules::SslWithNoVersion, + (Flake8Bandit, "505") => rules::flake8_bandit::rules::WeakCryptographicKey, + (Flake8Bandit, "506") => rules::flake8_bandit::rules::UnsafeYAMLLoad, + (Flake8Bandit, "507") => rules::flake8_bandit::rules::SSHNoHostKeyVerification, + (Flake8Bandit, "508") => rules::flake8_bandit::rules::SnmpInsecureVersion, + (Flake8Bandit, "509") => rules::flake8_bandit::rules::SnmpWeakCryptography, + (Flake8Bandit, "601") => rules::flake8_bandit::rules::ParamikoCall, + (Flake8Bandit, "602") => rules::flake8_bandit::rules::SubprocessPopenWithShellEqualsTrue, + (Flake8Bandit, "603") => rules::flake8_bandit::rules::SubprocessWithoutShellEqualsTrue, + (Flake8Bandit, "604") => rules::flake8_bandit::rules::CallWithShellEqualsTrue, + (Flake8Bandit, "605") => rules::flake8_bandit::rules::StartProcessWithAShell, + (Flake8Bandit, "606") => rules::flake8_bandit::rules::StartProcessWithNoShell, + (Flake8Bandit, "607") => rules::flake8_bandit::rules::StartProcessWithPartialPath, + (Flake8Bandit, "608") => rules::flake8_bandit::rules::HardcodedSQLExpression, + (Flake8Bandit, "609") => rules::flake8_bandit::rules::UnixCommandWildcardInjection, + (Flake8Bandit, "610") => rules::flake8_bandit::rules::DjangoExtra, + (Flake8Bandit, "611") => rules::flake8_bandit::rules::DjangoRawSql, + (Flake8Bandit, "612") => rules::flake8_bandit::rules::LoggingConfigInsecureListen, + (Flake8Bandit, "701") => rules::flake8_bandit::rules::Jinja2AutoescapeFalse, + (Flake8Bandit, "702") => rules::flake8_bandit::rules::MakoTemplates, + (Flake8Bandit, "704") => rules::flake8_bandit::rules::UnsafeMarkupUse, // flake8-boolean-trap - (Flake8BooleanTrap, "001") => (RuleGroup::Stable, rules::flake8_boolean_trap::rules::BooleanTypeHintPositionalArgument), - (Flake8BooleanTrap, "002") => (RuleGroup::Stable, rules::flake8_boolean_trap::rules::BooleanDefaultValuePositionalArgument), - (Flake8BooleanTrap, "003") => (RuleGroup::Stable, rules::flake8_boolean_trap::rules::BooleanPositionalValueInCall), + (Flake8BooleanTrap, "001") => rules::flake8_boolean_trap::rules::BooleanTypeHintPositionalArgument, + (Flake8BooleanTrap, "002") => rules::flake8_boolean_trap::rules::BooleanDefaultValuePositionalArgument, + (Flake8BooleanTrap, "003") => rules::flake8_boolean_trap::rules::BooleanPositionalValueInCall, // flake8-unused-arguments - (Flake8UnusedArguments, "001") => (RuleGroup::Stable, rules::flake8_unused_arguments::rules::UnusedFunctionArgument), - (Flake8UnusedArguments, "002") => (RuleGroup::Stable, rules::flake8_unused_arguments::rules::UnusedMethodArgument), - (Flake8UnusedArguments, "003") => (RuleGroup::Stable, rules::flake8_unused_arguments::rules::UnusedClassMethodArgument), - (Flake8UnusedArguments, "004") => (RuleGroup::Stable, rules::flake8_unused_arguments::rules::UnusedStaticMethodArgument), - (Flake8UnusedArguments, "005") => (RuleGroup::Stable, rules::flake8_unused_arguments::rules::UnusedLambdaArgument), + (Flake8UnusedArguments, "001") => rules::flake8_unused_arguments::rules::UnusedFunctionArgument, + (Flake8UnusedArguments, "002") => rules::flake8_unused_arguments::rules::UnusedMethodArgument, + (Flake8UnusedArguments, "003") => rules::flake8_unused_arguments::rules::UnusedClassMethodArgument, + (Flake8UnusedArguments, "004") => rules::flake8_unused_arguments::rules::UnusedStaticMethodArgument, + (Flake8UnusedArguments, "005") => rules::flake8_unused_arguments::rules::UnusedLambdaArgument, // flake8-import-conventions - (Flake8ImportConventions, "001") => (RuleGroup::Stable, rules::flake8_import_conventions::rules::UnconventionalImportAlias), - (Flake8ImportConventions, "002") => (RuleGroup::Stable, rules::flake8_import_conventions::rules::BannedImportAlias), - (Flake8ImportConventions, "003") => (RuleGroup::Stable, rules::flake8_import_conventions::rules::BannedImportFrom), + (Flake8ImportConventions, "001") => rules::flake8_import_conventions::rules::UnconventionalImportAlias, + (Flake8ImportConventions, "002") => rules::flake8_import_conventions::rules::BannedImportAlias, + (Flake8ImportConventions, "003") => rules::flake8_import_conventions::rules::BannedImportFrom, // flake8-datetimez - (Flake8Datetimez, "001") => (RuleGroup::Stable, rules::flake8_datetimez::rules::CallDatetimeWithoutTzinfo), - (Flake8Datetimez, "002") => (RuleGroup::Stable, rules::flake8_datetimez::rules::CallDatetimeToday), - (Flake8Datetimez, "003") => (RuleGroup::Stable, rules::flake8_datetimez::rules::CallDatetimeUtcnow), - (Flake8Datetimez, "004") => (RuleGroup::Stable, rules::flake8_datetimez::rules::CallDatetimeUtcfromtimestamp), - (Flake8Datetimez, "005") => (RuleGroup::Stable, rules::flake8_datetimez::rules::CallDatetimeNowWithoutTzinfo), - (Flake8Datetimez, "006") => (RuleGroup::Stable, rules::flake8_datetimez::rules::CallDatetimeFromtimestamp), - (Flake8Datetimez, "007") => (RuleGroup::Stable, rules::flake8_datetimez::rules::CallDatetimeStrptimeWithoutZone), - (Flake8Datetimez, "011") => (RuleGroup::Stable, rules::flake8_datetimez::rules::CallDateToday), - (Flake8Datetimez, "012") => (RuleGroup::Stable, rules::flake8_datetimez::rules::CallDateFromtimestamp), - (Flake8Datetimez, "901") => (RuleGroup::Stable, rules::flake8_datetimez::rules::DatetimeMinMax), + (Flake8Datetimez, "001") => rules::flake8_datetimez::rules::CallDatetimeWithoutTzinfo, + (Flake8Datetimez, "002") => rules::flake8_datetimez::rules::CallDatetimeToday, + (Flake8Datetimez, "003") => rules::flake8_datetimez::rules::CallDatetimeUtcnow, + (Flake8Datetimez, "004") => rules::flake8_datetimez::rules::CallDatetimeUtcfromtimestamp, + (Flake8Datetimez, "005") => rules::flake8_datetimez::rules::CallDatetimeNowWithoutTzinfo, + (Flake8Datetimez, "006") => rules::flake8_datetimez::rules::CallDatetimeFromtimestamp, + (Flake8Datetimez, "007") => rules::flake8_datetimez::rules::CallDatetimeStrptimeWithoutZone, + (Flake8Datetimez, "011") => rules::flake8_datetimez::rules::CallDateToday, + (Flake8Datetimez, "012") => rules::flake8_datetimez::rules::CallDateFromtimestamp, + (Flake8Datetimez, "901") => rules::flake8_datetimez::rules::DatetimeMinMax, // pygrep-hooks - (PygrepHooks, "001") => (RuleGroup::Removed, rules::pygrep_hooks::rules::Eval), - (PygrepHooks, "002") => (RuleGroup::Removed, rules::pygrep_hooks::rules::DeprecatedLogWarn), - (PygrepHooks, "003") => (RuleGroup::Stable, rules::pygrep_hooks::rules::BlanketTypeIgnore), - (PygrepHooks, "004") => (RuleGroup::Stable, rules::pygrep_hooks::rules::BlanketNOQA), - (PygrepHooks, "005") => (RuleGroup::Stable, rules::pygrep_hooks::rules::InvalidMockAccess), + (PygrepHooks, "001") => rules::pygrep_hooks::rules::Eval, + (PygrepHooks, "002") => rules::pygrep_hooks::rules::DeprecatedLogWarn, + (PygrepHooks, "003") => rules::pygrep_hooks::rules::BlanketTypeIgnore, + (PygrepHooks, "004") => rules::pygrep_hooks::rules::BlanketNOQA, + (PygrepHooks, "005") => rules::pygrep_hooks::rules::InvalidMockAccess, // pandas-vet - (PandasVet, "002") => (RuleGroup::Stable, rules::pandas_vet::rules::PandasUseOfInplaceArgument), - (PandasVet, "003") => (RuleGroup::Stable, rules::pandas_vet::rules::PandasUseOfDotIsNull), - (PandasVet, "004") => (RuleGroup::Stable, rules::pandas_vet::rules::PandasUseOfDotNotNull), - (PandasVet, "007") => (RuleGroup::Stable, rules::pandas_vet::rules::PandasUseOfDotIx), - (PandasVet, "008") => (RuleGroup::Stable, rules::pandas_vet::rules::PandasUseOfDotAt), - (PandasVet, "009") => (RuleGroup::Stable, rules::pandas_vet::rules::PandasUseOfDotIat), - (PandasVet, "010") => (RuleGroup::Stable, rules::pandas_vet::rules::PandasUseOfDotPivotOrUnstack), - (PandasVet, "011") => (RuleGroup::Stable, rules::pandas_vet::rules::PandasUseOfDotValues), - (PandasVet, "012") => (RuleGroup::Stable, rules::pandas_vet::rules::PandasUseOfDotReadTable), - (PandasVet, "013") => (RuleGroup::Stable, rules::pandas_vet::rules::PandasUseOfDotStack), - (PandasVet, "015") => (RuleGroup::Stable, rules::pandas_vet::rules::PandasUseOfPdMerge), - (PandasVet, "101") => (RuleGroup::Stable, rules::pandas_vet::rules::PandasNuniqueConstantSeriesCheck), - (PandasVet, "901") => (RuleGroup::Removed, rules::pandas_vet::rules::PandasDfVariableName), + (PandasVet, "002") => rules::pandas_vet::rules::PandasUseOfInplaceArgument, + (PandasVet, "003") => rules::pandas_vet::rules::PandasUseOfDotIsNull, + (PandasVet, "004") => rules::pandas_vet::rules::PandasUseOfDotNotNull, + (PandasVet, "007") => rules::pandas_vet::rules::PandasUseOfDotIx, + (PandasVet, "008") => rules::pandas_vet::rules::PandasUseOfDotAt, + (PandasVet, "009") => rules::pandas_vet::rules::PandasUseOfDotIat, + (PandasVet, "010") => rules::pandas_vet::rules::PandasUseOfDotPivotOrUnstack, + (PandasVet, "011") => rules::pandas_vet::rules::PandasUseOfDotValues, + (PandasVet, "012") => rules::pandas_vet::rules::PandasUseOfDotReadTable, + (PandasVet, "013") => rules::pandas_vet::rules::PandasUseOfDotStack, + (PandasVet, "015") => rules::pandas_vet::rules::PandasUseOfPdMerge, + (PandasVet, "101") => rules::pandas_vet::rules::PandasNuniqueConstantSeriesCheck, + (PandasVet, "901") => rules::pandas_vet::rules::PandasDfVariableName, // flake8-errmsg - (Flake8ErrMsg, "101") => (RuleGroup::Stable, rules::flake8_errmsg::rules::RawStringInException), - (Flake8ErrMsg, "102") => (RuleGroup::Stable, rules::flake8_errmsg::rules::FStringInException), - (Flake8ErrMsg, "103") => (RuleGroup::Stable, rules::flake8_errmsg::rules::DotFormatInException), + (Flake8ErrMsg, "101") => rules::flake8_errmsg::rules::RawStringInException, + (Flake8ErrMsg, "102") => rules::flake8_errmsg::rules::FStringInException, + (Flake8ErrMsg, "103") => rules::flake8_errmsg::rules::DotFormatInException, // flake8-pyi - (Flake8Pyi, "001") => (RuleGroup::Stable, rules::flake8_pyi::rules::UnprefixedTypeParam), - (Flake8Pyi, "002") => (RuleGroup::Stable, rules::flake8_pyi::rules::ComplexIfStatementInStub), - (Flake8Pyi, "003") => (RuleGroup::Stable, rules::flake8_pyi::rules::UnrecognizedVersionInfoCheck), - (Flake8Pyi, "004") => (RuleGroup::Stable, rules::flake8_pyi::rules::PatchVersionComparison), - (Flake8Pyi, "005") => (RuleGroup::Stable, rules::flake8_pyi::rules::WrongTupleLengthVersionComparison), - (Flake8Pyi, "006") => (RuleGroup::Stable, rules::flake8_pyi::rules::BadVersionInfoComparison), - (Flake8Pyi, "007") => (RuleGroup::Stable, rules::flake8_pyi::rules::UnrecognizedPlatformCheck), - (Flake8Pyi, "008") => (RuleGroup::Stable, rules::flake8_pyi::rules::UnrecognizedPlatformName), - (Flake8Pyi, "009") => (RuleGroup::Stable, rules::flake8_pyi::rules::PassStatementStubBody), - (Flake8Pyi, "010") => (RuleGroup::Stable, rules::flake8_pyi::rules::NonEmptyStubBody), - (Flake8Pyi, "011") => (RuleGroup::Stable, rules::flake8_pyi::rules::TypedArgumentDefaultInStub), - (Flake8Pyi, "012") => (RuleGroup::Stable, rules::flake8_pyi::rules::PassInClassBody), - (Flake8Pyi, "013") => (RuleGroup::Stable, rules::flake8_pyi::rules::EllipsisInNonEmptyClassBody), - (Flake8Pyi, "014") => (RuleGroup::Stable, rules::flake8_pyi::rules::ArgumentDefaultInStub), - (Flake8Pyi, "015") => (RuleGroup::Stable, rules::flake8_pyi::rules::AssignmentDefaultInStub), - (Flake8Pyi, "016") => (RuleGroup::Stable, rules::flake8_pyi::rules::DuplicateUnionMember), - (Flake8Pyi, "017") => (RuleGroup::Stable, rules::flake8_pyi::rules::ComplexAssignmentInStub), - (Flake8Pyi, "018") => (RuleGroup::Stable, rules::flake8_pyi::rules::UnusedPrivateTypeVar), - (Flake8Pyi, "019") => (RuleGroup::Stable, rules::flake8_pyi::rules::CustomTypeVarForSelf), - (Flake8Pyi, "020") => (RuleGroup::Stable, rules::flake8_pyi::rules::QuotedAnnotationInStub), - (Flake8Pyi, "021") => (RuleGroup::Stable, rules::flake8_pyi::rules::DocstringInStub), - (Flake8Pyi, "024") => (RuleGroup::Stable, rules::flake8_pyi::rules::CollectionsNamedTuple), - (Flake8Pyi, "025") => (RuleGroup::Stable, rules::flake8_pyi::rules::UnaliasedCollectionsAbcSetImport), - (Flake8Pyi, "026") => (RuleGroup::Stable, rules::flake8_pyi::rules::TypeAliasWithoutAnnotation), - (Flake8Pyi, "029") => (RuleGroup::Stable, rules::flake8_pyi::rules::StrOrReprDefinedInStub), - (Flake8Pyi, "030") => (RuleGroup::Stable, rules::flake8_pyi::rules::UnnecessaryLiteralUnion), - (Flake8Pyi, "032") => (RuleGroup::Stable, rules::flake8_pyi::rules::AnyEqNeAnnotation), - (Flake8Pyi, "033") => (RuleGroup::Stable, rules::flake8_pyi::rules::TypeCommentInStub), - (Flake8Pyi, "034") => (RuleGroup::Stable, rules::flake8_pyi::rules::NonSelfReturnType), - (Flake8Pyi, "035") => (RuleGroup::Stable, rules::flake8_pyi::rules::UnassignedSpecialVariableInStub), - (Flake8Pyi, "036") => (RuleGroup::Stable, rules::flake8_pyi::rules::BadExitAnnotation), - (Flake8Pyi, "041") => (RuleGroup::Stable, rules::flake8_pyi::rules::RedundantNumericUnion), - (Flake8Pyi, "042") => (RuleGroup::Stable, rules::flake8_pyi::rules::SnakeCaseTypeAlias), - (Flake8Pyi, "043") => (RuleGroup::Stable, rules::flake8_pyi::rules::TSuffixedTypeAlias), - (Flake8Pyi, "044") => (RuleGroup::Stable, rules::flake8_pyi::rules::FutureAnnotationsInStub), - (Flake8Pyi, "045") => (RuleGroup::Stable, rules::flake8_pyi::rules::IterMethodReturnIterable), - (Flake8Pyi, "046") => (RuleGroup::Stable, rules::flake8_pyi::rules::UnusedPrivateProtocol), - (Flake8Pyi, "047") => (RuleGroup::Stable, rules::flake8_pyi::rules::UnusedPrivateTypeAlias), - (Flake8Pyi, "048") => (RuleGroup::Stable, rules::flake8_pyi::rules::StubBodyMultipleStatements), - (Flake8Pyi, "049") => (RuleGroup::Stable, rules::flake8_pyi::rules::UnusedPrivateTypedDict), - (Flake8Pyi, "050") => (RuleGroup::Stable, rules::flake8_pyi::rules::NoReturnArgumentAnnotationInStub), - (Flake8Pyi, "051") => (RuleGroup::Stable, rules::flake8_pyi::rules::RedundantLiteralUnion), - (Flake8Pyi, "052") => (RuleGroup::Stable, rules::flake8_pyi::rules::UnannotatedAssignmentInStub), - (Flake8Pyi, "054") => (RuleGroup::Stable, rules::flake8_pyi::rules::NumericLiteralTooLong), - (Flake8Pyi, "053") => (RuleGroup::Stable, rules::flake8_pyi::rules::StringOrBytesTooLong), - (Flake8Pyi, "055") => (RuleGroup::Stable, rules::flake8_pyi::rules::UnnecessaryTypeUnion), - (Flake8Pyi, "056") => (RuleGroup::Stable, rules::flake8_pyi::rules::UnsupportedMethodCallOnAll), - (Flake8Pyi, "058") => (RuleGroup::Stable, rules::flake8_pyi::rules::GeneratorReturnFromIterMethod), - (Flake8Pyi, "057") => (RuleGroup::Stable, rules::flake8_pyi::rules::ByteStringUsage), - (Flake8Pyi, "059") => (RuleGroup::Stable, rules::flake8_pyi::rules::GenericNotLastBaseClass), - (Flake8Pyi, "061") => (RuleGroup::Stable, rules::flake8_pyi::rules::RedundantNoneLiteral), - (Flake8Pyi, "062") => (RuleGroup::Stable, rules::flake8_pyi::rules::DuplicateLiteralMember), - (Flake8Pyi, "063") => (RuleGroup::Stable, rules::flake8_pyi::rules::Pep484StylePositionalOnlyParameter), - (Flake8Pyi, "064") => (RuleGroup::Stable, rules::flake8_pyi::rules::RedundantFinalLiteral), - (Flake8Pyi, "066") => (RuleGroup::Stable, rules::flake8_pyi::rules::BadVersionInfoOrder), + (Flake8Pyi, "001") => rules::flake8_pyi::rules::UnprefixedTypeParam, + (Flake8Pyi, "002") => rules::flake8_pyi::rules::ComplexIfStatementInStub, + (Flake8Pyi, "003") => rules::flake8_pyi::rules::UnrecognizedVersionInfoCheck, + (Flake8Pyi, "004") => rules::flake8_pyi::rules::PatchVersionComparison, + (Flake8Pyi, "005") => rules::flake8_pyi::rules::WrongTupleLengthVersionComparison, + (Flake8Pyi, "006") => rules::flake8_pyi::rules::BadVersionInfoComparison, + (Flake8Pyi, "007") => rules::flake8_pyi::rules::UnrecognizedPlatformCheck, + (Flake8Pyi, "008") => rules::flake8_pyi::rules::UnrecognizedPlatformName, + (Flake8Pyi, "009") => rules::flake8_pyi::rules::PassStatementStubBody, + (Flake8Pyi, "010") => rules::flake8_pyi::rules::NonEmptyStubBody, + (Flake8Pyi, "011") => rules::flake8_pyi::rules::TypedArgumentDefaultInStub, + (Flake8Pyi, "012") => rules::flake8_pyi::rules::PassInClassBody, + (Flake8Pyi, "013") => rules::flake8_pyi::rules::EllipsisInNonEmptyClassBody, + (Flake8Pyi, "014") => rules::flake8_pyi::rules::ArgumentDefaultInStub, + (Flake8Pyi, "015") => rules::flake8_pyi::rules::AssignmentDefaultInStub, + (Flake8Pyi, "016") => rules::flake8_pyi::rules::DuplicateUnionMember, + (Flake8Pyi, "017") => rules::flake8_pyi::rules::ComplexAssignmentInStub, + (Flake8Pyi, "018") => rules::flake8_pyi::rules::UnusedPrivateTypeVar, + (Flake8Pyi, "019") => rules::flake8_pyi::rules::CustomTypeVarForSelf, + (Flake8Pyi, "020") => rules::flake8_pyi::rules::QuotedAnnotationInStub, + (Flake8Pyi, "021") => rules::flake8_pyi::rules::DocstringInStub, + (Flake8Pyi, "024") => rules::flake8_pyi::rules::CollectionsNamedTuple, + (Flake8Pyi, "025") => rules::flake8_pyi::rules::UnaliasedCollectionsAbcSetImport, + (Flake8Pyi, "026") => rules::flake8_pyi::rules::TypeAliasWithoutAnnotation, + (Flake8Pyi, "029") => rules::flake8_pyi::rules::StrOrReprDefinedInStub, + (Flake8Pyi, "030") => rules::flake8_pyi::rules::UnnecessaryLiteralUnion, + (Flake8Pyi, "032") => rules::flake8_pyi::rules::AnyEqNeAnnotation, + (Flake8Pyi, "033") => rules::flake8_pyi::rules::TypeCommentInStub, + (Flake8Pyi, "034") => rules::flake8_pyi::rules::NonSelfReturnType, + (Flake8Pyi, "035") => rules::flake8_pyi::rules::UnassignedSpecialVariableInStub, + (Flake8Pyi, "036") => rules::flake8_pyi::rules::BadExitAnnotation, + (Flake8Pyi, "041") => rules::flake8_pyi::rules::RedundantNumericUnion, + (Flake8Pyi, "042") => rules::flake8_pyi::rules::SnakeCaseTypeAlias, + (Flake8Pyi, "043") => rules::flake8_pyi::rules::TSuffixedTypeAlias, + (Flake8Pyi, "044") => rules::flake8_pyi::rules::FutureAnnotationsInStub, + (Flake8Pyi, "045") => rules::flake8_pyi::rules::IterMethodReturnIterable, + (Flake8Pyi, "046") => rules::flake8_pyi::rules::UnusedPrivateProtocol, + (Flake8Pyi, "047") => rules::flake8_pyi::rules::UnusedPrivateTypeAlias, + (Flake8Pyi, "048") => rules::flake8_pyi::rules::StubBodyMultipleStatements, + (Flake8Pyi, "049") => rules::flake8_pyi::rules::UnusedPrivateTypedDict, + (Flake8Pyi, "050") => rules::flake8_pyi::rules::NoReturnArgumentAnnotationInStub, + (Flake8Pyi, "051") => rules::flake8_pyi::rules::RedundantLiteralUnion, + (Flake8Pyi, "052") => rules::flake8_pyi::rules::UnannotatedAssignmentInStub, + (Flake8Pyi, "054") => rules::flake8_pyi::rules::NumericLiteralTooLong, + (Flake8Pyi, "053") => rules::flake8_pyi::rules::StringOrBytesTooLong, + (Flake8Pyi, "055") => rules::flake8_pyi::rules::UnnecessaryTypeUnion, + (Flake8Pyi, "056") => rules::flake8_pyi::rules::UnsupportedMethodCallOnAll, + (Flake8Pyi, "058") => rules::flake8_pyi::rules::GeneratorReturnFromIterMethod, + (Flake8Pyi, "057") => rules::flake8_pyi::rules::ByteStringUsage, + (Flake8Pyi, "059") => rules::flake8_pyi::rules::GenericNotLastBaseClass, + (Flake8Pyi, "061") => rules::flake8_pyi::rules::RedundantNoneLiteral, + (Flake8Pyi, "062") => rules::flake8_pyi::rules::DuplicateLiteralMember, + (Flake8Pyi, "063") => rules::flake8_pyi::rules::Pep484StylePositionalOnlyParameter, + (Flake8Pyi, "064") => rules::flake8_pyi::rules::RedundantFinalLiteral, + (Flake8Pyi, "066") => rules::flake8_pyi::rules::BadVersionInfoOrder, // flake8-pytest-style - (Flake8PytestStyle, "001") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestFixtureIncorrectParenthesesStyle), - (Flake8PytestStyle, "002") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestFixturePositionalArgs), - (Flake8PytestStyle, "003") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestExtraneousScopeFunction), + (Flake8PytestStyle, "001") => rules::flake8_pytest_style::rules::PytestFixtureIncorrectParenthesesStyle, + (Flake8PytestStyle, "002") => rules::flake8_pytest_style::rules::PytestFixturePositionalArgs, + (Flake8PytestStyle, "003") => rules::flake8_pytest_style::rules::PytestExtraneousScopeFunction, #[allow(deprecated)] - (Flake8PytestStyle, "004") => (RuleGroup::Removed, rules::flake8_pytest_style::rules::PytestMissingFixtureNameUnderscore), + (Flake8PytestStyle, "004") => rules::flake8_pytest_style::rules::PytestMissingFixtureNameUnderscore, #[allow(deprecated)] - (Flake8PytestStyle, "005") => (RuleGroup::Removed, rules::flake8_pytest_style::rules::PytestIncorrectFixtureNameUnderscore), - (Flake8PytestStyle, "006") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestParametrizeNamesWrongType), - (Flake8PytestStyle, "007") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestParametrizeValuesWrongType), - (Flake8PytestStyle, "008") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestPatchWithLambda), - (Flake8PytestStyle, "009") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestUnittestAssertion), - (Flake8PytestStyle, "010") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestRaisesWithoutException), - (Flake8PytestStyle, "011") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestRaisesTooBroad), - (Flake8PytestStyle, "012") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestRaisesWithMultipleStatements), - (Flake8PytestStyle, "013") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestIncorrectPytestImport), - (Flake8PytestStyle, "014") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestDuplicateParametrizeTestCases), - (Flake8PytestStyle, "015") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestAssertAlwaysFalse), - (Flake8PytestStyle, "016") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestFailWithoutMessage), - (Flake8PytestStyle, "017") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestAssertInExcept), - (Flake8PytestStyle, "018") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestCompositeAssertion), - (Flake8PytestStyle, "019") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestFixtureParamWithoutValue), - (Flake8PytestStyle, "020") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestDeprecatedYieldFixture), - (Flake8PytestStyle, "021") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestFixtureFinalizerCallback), - (Flake8PytestStyle, "022") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestUselessYieldFixture), - (Flake8PytestStyle, "023") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestIncorrectMarkParenthesesStyle), - (Flake8PytestStyle, "024") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestUnnecessaryAsyncioMarkOnFixture), - (Flake8PytestStyle, "025") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestErroneousUseFixturesOnFixture), - (Flake8PytestStyle, "026") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestUseFixturesWithoutParameters), - (Flake8PytestStyle, "027") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestUnittestRaisesAssertion), - (Flake8PytestStyle, "028") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestParameterWithDefaultArgument), - (Flake8PytestStyle, "029") => (RuleGroup::Preview, rules::flake8_pytest_style::rules::PytestWarnsWithoutWarning), - (Flake8PytestStyle, "030") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestWarnsTooBroad), - (Flake8PytestStyle, "031") => (RuleGroup::Stable, rules::flake8_pytest_style::rules::PytestWarnsWithMultipleStatements), + (Flake8PytestStyle, "005") => rules::flake8_pytest_style::rules::PytestIncorrectFixtureNameUnderscore, + (Flake8PytestStyle, "006") => rules::flake8_pytest_style::rules::PytestParametrizeNamesWrongType, + (Flake8PytestStyle, "007") => rules::flake8_pytest_style::rules::PytestParametrizeValuesWrongType, + (Flake8PytestStyle, "008") => rules::flake8_pytest_style::rules::PytestPatchWithLambda, + (Flake8PytestStyle, "009") => rules::flake8_pytest_style::rules::PytestUnittestAssertion, + (Flake8PytestStyle, "010") => rules::flake8_pytest_style::rules::PytestRaisesWithoutException, + (Flake8PytestStyle, "011") => rules::flake8_pytest_style::rules::PytestRaisesTooBroad, + (Flake8PytestStyle, "012") => rules::flake8_pytest_style::rules::PytestRaisesWithMultipleStatements, + (Flake8PytestStyle, "013") => rules::flake8_pytest_style::rules::PytestIncorrectPytestImport, + (Flake8PytestStyle, "014") => rules::flake8_pytest_style::rules::PytestDuplicateParametrizeTestCases, + (Flake8PytestStyle, "015") => rules::flake8_pytest_style::rules::PytestAssertAlwaysFalse, + (Flake8PytestStyle, "016") => rules::flake8_pytest_style::rules::PytestFailWithoutMessage, + (Flake8PytestStyle, "017") => rules::flake8_pytest_style::rules::PytestAssertInExcept, + (Flake8PytestStyle, "018") => rules::flake8_pytest_style::rules::PytestCompositeAssertion, + (Flake8PytestStyle, "019") => rules::flake8_pytest_style::rules::PytestFixtureParamWithoutValue, + (Flake8PytestStyle, "020") => rules::flake8_pytest_style::rules::PytestDeprecatedYieldFixture, + (Flake8PytestStyle, "021") => rules::flake8_pytest_style::rules::PytestFixtureFinalizerCallback, + (Flake8PytestStyle, "022") => rules::flake8_pytest_style::rules::PytestUselessYieldFixture, + (Flake8PytestStyle, "023") => rules::flake8_pytest_style::rules::PytestIncorrectMarkParenthesesStyle, + (Flake8PytestStyle, "024") => rules::flake8_pytest_style::rules::PytestUnnecessaryAsyncioMarkOnFixture, + (Flake8PytestStyle, "025") => rules::flake8_pytest_style::rules::PytestErroneousUseFixturesOnFixture, + (Flake8PytestStyle, "026") => rules::flake8_pytest_style::rules::PytestUseFixturesWithoutParameters, + (Flake8PytestStyle, "027") => rules::flake8_pytest_style::rules::PytestUnittestRaisesAssertion, + (Flake8PytestStyle, "028") => rules::flake8_pytest_style::rules::PytestParameterWithDefaultArgument, + (Flake8PytestStyle, "029") => rules::flake8_pytest_style::rules::PytestWarnsWithoutWarning, + (Flake8PytestStyle, "030") => rules::flake8_pytest_style::rules::PytestWarnsTooBroad, + (Flake8PytestStyle, "031") => rules::flake8_pytest_style::rules::PytestWarnsWithMultipleStatements, // flake8-pie - (Flake8Pie, "790") => (RuleGroup::Stable, rules::flake8_pie::rules::UnnecessaryPlaceholder), - (Flake8Pie, "794") => (RuleGroup::Stable, rules::flake8_pie::rules::DuplicateClassFieldDefinition), - (Flake8Pie, "796") => (RuleGroup::Stable, rules::flake8_pie::rules::NonUniqueEnums), - (Flake8Pie, "800") => (RuleGroup::Stable, rules::flake8_pie::rules::UnnecessarySpread), - (Flake8Pie, "804") => (RuleGroup::Stable, rules::flake8_pie::rules::UnnecessaryDictKwargs), - (Flake8Pie, "807") => (RuleGroup::Stable, rules::flake8_pie::rules::ReimplementedContainerBuiltin), - (Flake8Pie, "808") => (RuleGroup::Stable, rules::flake8_pie::rules::UnnecessaryRangeStart), - (Flake8Pie, "810") => (RuleGroup::Stable, rules::flake8_pie::rules::MultipleStartsEndsWith), + (Flake8Pie, "790") => rules::flake8_pie::rules::UnnecessaryPlaceholder, + (Flake8Pie, "794") => rules::flake8_pie::rules::DuplicateClassFieldDefinition, + (Flake8Pie, "796") => rules::flake8_pie::rules::NonUniqueEnums, + (Flake8Pie, "800") => rules::flake8_pie::rules::UnnecessarySpread, + (Flake8Pie, "804") => rules::flake8_pie::rules::UnnecessaryDictKwargs, + (Flake8Pie, "807") => rules::flake8_pie::rules::ReimplementedContainerBuiltin, + (Flake8Pie, "808") => rules::flake8_pie::rules::UnnecessaryRangeStart, + (Flake8Pie, "810") => rules::flake8_pie::rules::MultipleStartsEndsWith, // flake8-commas - (Flake8Commas, "812") => (RuleGroup::Stable, rules::flake8_commas::rules::MissingTrailingComma), - (Flake8Commas, "818") => (RuleGroup::Stable, rules::flake8_commas::rules::TrailingCommaOnBareTuple), - (Flake8Commas, "819") => (RuleGroup::Stable, rules::flake8_commas::rules::ProhibitedTrailingComma), + (Flake8Commas, "812") => rules::flake8_commas::rules::MissingTrailingComma, + (Flake8Commas, "818") => rules::flake8_commas::rules::TrailingCommaOnBareTuple, + (Flake8Commas, "819") => rules::flake8_commas::rules::ProhibitedTrailingComma, // flake8-no-pep420 - (Flake8NoPep420, "001") => (RuleGroup::Stable, rules::flake8_no_pep420::rules::ImplicitNamespacePackage), + (Flake8NoPep420, "001") => rules::flake8_no_pep420::rules::ImplicitNamespacePackage, // flake8-executable - (Flake8Executable, "001") => (RuleGroup::Stable, rules::flake8_executable::rules::ShebangNotExecutable), - (Flake8Executable, "002") => (RuleGroup::Stable, rules::flake8_executable::rules::ShebangMissingExecutableFile), - (Flake8Executable, "003") => (RuleGroup::Stable, rules::flake8_executable::rules::ShebangMissingPython), - (Flake8Executable, "004") => (RuleGroup::Stable, rules::flake8_executable::rules::ShebangLeadingWhitespace), - (Flake8Executable, "005") => (RuleGroup::Stable, rules::flake8_executable::rules::ShebangNotFirstLine), + (Flake8Executable, "001") => rules::flake8_executable::rules::ShebangNotExecutable, + (Flake8Executable, "002") => rules::flake8_executable::rules::ShebangMissingExecutableFile, + (Flake8Executable, "003") => rules::flake8_executable::rules::ShebangMissingPython, + (Flake8Executable, "004") => rules::flake8_executable::rules::ShebangLeadingWhitespace, + (Flake8Executable, "005") => rules::flake8_executable::rules::ShebangNotFirstLine, // flake8-type-checking - (Flake8TypeChecking, "001") => (RuleGroup::Stable, rules::flake8_type_checking::rules::TypingOnlyFirstPartyImport), - (Flake8TypeChecking, "002") => (RuleGroup::Stable, rules::flake8_type_checking::rules::TypingOnlyThirdPartyImport), - (Flake8TypeChecking, "003") => (RuleGroup::Stable, rules::flake8_type_checking::rules::TypingOnlyStandardLibraryImport), - (Flake8TypeChecking, "004") => (RuleGroup::Stable, rules::flake8_type_checking::rules::RuntimeImportInTypeCheckingBlock), - (Flake8TypeChecking, "005") => (RuleGroup::Stable, rules::flake8_type_checking::rules::EmptyTypeCheckingBlock), - (Flake8TypeChecking, "006") => (RuleGroup::Stable, rules::flake8_type_checking::rules::RuntimeCastValue), - (Flake8TypeChecking, "007") => (RuleGroup::Stable, rules::flake8_type_checking::rules::UnquotedTypeAlias), - (Flake8TypeChecking, "008") => (RuleGroup::Preview, rules::flake8_type_checking::rules::QuotedTypeAlias), - (Flake8TypeChecking, "010") => (RuleGroup::Stable, rules::flake8_type_checking::rules::RuntimeStringUnion), + (Flake8TypeChecking, "001") => rules::flake8_type_checking::rules::TypingOnlyFirstPartyImport, + (Flake8TypeChecking, "002") => rules::flake8_type_checking::rules::TypingOnlyThirdPartyImport, + (Flake8TypeChecking, "003") => rules::flake8_type_checking::rules::TypingOnlyStandardLibraryImport, + (Flake8TypeChecking, "004") => rules::flake8_type_checking::rules::RuntimeImportInTypeCheckingBlock, + (Flake8TypeChecking, "005") => rules::flake8_type_checking::rules::EmptyTypeCheckingBlock, + (Flake8TypeChecking, "006") => rules::flake8_type_checking::rules::RuntimeCastValue, + (Flake8TypeChecking, "007") => rules::flake8_type_checking::rules::UnquotedTypeAlias, + (Flake8TypeChecking, "008") => rules::flake8_type_checking::rules::QuotedTypeAlias, + (Flake8TypeChecking, "010") => rules::flake8_type_checking::rules::RuntimeStringUnion, // tryceratops - (Tryceratops, "002") => (RuleGroup::Stable, rules::tryceratops::rules::RaiseVanillaClass), - (Tryceratops, "003") => (RuleGroup::Stable, rules::tryceratops::rules::RaiseVanillaArgs), - (Tryceratops, "004") => (RuleGroup::Stable, rules::tryceratops::rules::TypeCheckWithoutTypeError), - (Tryceratops, "200") => (RuleGroup::Removed, rules::tryceratops::rules::ReraiseNoCause), - (Tryceratops, "201") => (RuleGroup::Stable, rules::tryceratops::rules::VerboseRaise), - (Tryceratops, "203") => (RuleGroup::Stable, rules::tryceratops::rules::UselessTryExcept), - (Tryceratops, "300") => (RuleGroup::Stable, rules::tryceratops::rules::TryConsiderElse), - (Tryceratops, "301") => (RuleGroup::Stable, rules::tryceratops::rules::RaiseWithinTry), - (Tryceratops, "400") => (RuleGroup::Stable, rules::tryceratops::rules::ErrorInsteadOfException), - (Tryceratops, "401") => (RuleGroup::Stable, rules::tryceratops::rules::VerboseLogMessage), + (Tryceratops, "002") => rules::tryceratops::rules::RaiseVanillaClass, + (Tryceratops, "003") => rules::tryceratops::rules::RaiseVanillaArgs, + (Tryceratops, "004") => rules::tryceratops::rules::TypeCheckWithoutTypeError, + (Tryceratops, "200") => rules::tryceratops::rules::ReraiseNoCause, + (Tryceratops, "201") => rules::tryceratops::rules::VerboseRaise, + (Tryceratops, "203") => rules::tryceratops::rules::UselessTryExcept, + (Tryceratops, "300") => rules::tryceratops::rules::TryConsiderElse, + (Tryceratops, "301") => rules::tryceratops::rules::RaiseWithinTry, + (Tryceratops, "400") => rules::tryceratops::rules::ErrorInsteadOfException, + (Tryceratops, "401") => rules::tryceratops::rules::VerboseLogMessage, // flake8-use-pathlib - (Flake8UsePathlib, "100") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsPathAbspath), - (Flake8UsePathlib, "101") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsChmod), - (Flake8UsePathlib, "102") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsMkdir), - (Flake8UsePathlib, "103") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsMakedirs), - (Flake8UsePathlib, "104") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsRename), - (Flake8UsePathlib, "105") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsReplace), - (Flake8UsePathlib, "106") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsRmdir), - (Flake8UsePathlib, "107") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsRemove), - (Flake8UsePathlib, "108") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsUnlink), - (Flake8UsePathlib, "109") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsGetcwd), - (Flake8UsePathlib, "110") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsPathExists), - (Flake8UsePathlib, "111") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsPathExpanduser), - (Flake8UsePathlib, "112") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsPathIsdir), - (Flake8UsePathlib, "113") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsPathIsfile), - (Flake8UsePathlib, "114") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsPathIslink), - (Flake8UsePathlib, "115") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsReadlink), - (Flake8UsePathlib, "116") => (RuleGroup::Stable, rules::flake8_use_pathlib::violations::OsStat), - (Flake8UsePathlib, "117") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsPathIsabs), - (Flake8UsePathlib, "118") => (RuleGroup::Stable, rules::flake8_use_pathlib::violations::OsPathJoin), - (Flake8UsePathlib, "119") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsPathBasename), - (Flake8UsePathlib, "120") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsPathDirname), - (Flake8UsePathlib, "121") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsPathSamefile), - (Flake8UsePathlib, "122") => (RuleGroup::Stable, rules::flake8_use_pathlib::violations::OsPathSplitext), - (Flake8UsePathlib, "123") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::BuiltinOpen), - (Flake8UsePathlib, "124") => (RuleGroup::Stable, rules::flake8_use_pathlib::violations::PyPath), - (Flake8UsePathlib, "201") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::PathConstructorCurrentDirectory), - (Flake8UsePathlib, "202") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsPathGetsize), - (Flake8UsePathlib, "202") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsPathGetsize), - (Flake8UsePathlib, "203") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsPathGetatime), - (Flake8UsePathlib, "204") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsPathGetmtime), - (Flake8UsePathlib, "205") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsPathGetctime), - (Flake8UsePathlib, "206") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsSepSplit), - (Flake8UsePathlib, "207") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::Glob), - (Flake8UsePathlib, "208") => (RuleGroup::Stable, rules::flake8_use_pathlib::violations::OsListdir), - (Flake8UsePathlib, "210") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::InvalidPathlibWithSuffix), - (Flake8UsePathlib, "211") => (RuleGroup::Stable, rules::flake8_use_pathlib::rules::OsSymlink), + (Flake8UsePathlib, "100") => rules::flake8_use_pathlib::rules::OsPathAbspath, + (Flake8UsePathlib, "101") => rules::flake8_use_pathlib::rules::OsChmod, + (Flake8UsePathlib, "102") => rules::flake8_use_pathlib::rules::OsMkdir, + (Flake8UsePathlib, "103") => rules::flake8_use_pathlib::rules::OsMakedirs, + (Flake8UsePathlib, "104") => rules::flake8_use_pathlib::rules::OsRename, + (Flake8UsePathlib, "105") => rules::flake8_use_pathlib::rules::OsReplace, + (Flake8UsePathlib, "106") => rules::flake8_use_pathlib::rules::OsRmdir, + (Flake8UsePathlib, "107") => rules::flake8_use_pathlib::rules::OsRemove, + (Flake8UsePathlib, "108") => rules::flake8_use_pathlib::rules::OsUnlink, + (Flake8UsePathlib, "109") => rules::flake8_use_pathlib::rules::OsGetcwd, + (Flake8UsePathlib, "110") => rules::flake8_use_pathlib::rules::OsPathExists, + (Flake8UsePathlib, "111") => rules::flake8_use_pathlib::rules::OsPathExpanduser, + (Flake8UsePathlib, "112") => rules::flake8_use_pathlib::rules::OsPathIsdir, + (Flake8UsePathlib, "113") => rules::flake8_use_pathlib::rules::OsPathIsfile, + (Flake8UsePathlib, "114") => rules::flake8_use_pathlib::rules::OsPathIslink, + (Flake8UsePathlib, "115") => rules::flake8_use_pathlib::rules::OsReadlink, + (Flake8UsePathlib, "116") => rules::flake8_use_pathlib::violations::OsStat, + (Flake8UsePathlib, "117") => rules::flake8_use_pathlib::rules::OsPathIsabs, + (Flake8UsePathlib, "118") => rules::flake8_use_pathlib::violations::OsPathJoin, + (Flake8UsePathlib, "119") => rules::flake8_use_pathlib::rules::OsPathBasename, + (Flake8UsePathlib, "120") => rules::flake8_use_pathlib::rules::OsPathDirname, + (Flake8UsePathlib, "121") => rules::flake8_use_pathlib::rules::OsPathSamefile, + (Flake8UsePathlib, "122") => rules::flake8_use_pathlib::violations::OsPathSplitext, + (Flake8UsePathlib, "123") => rules::flake8_use_pathlib::rules::BuiltinOpen, + (Flake8UsePathlib, "124") => rules::flake8_use_pathlib::violations::PyPath, + (Flake8UsePathlib, "201") => rules::flake8_use_pathlib::rules::PathConstructorCurrentDirectory, + (Flake8UsePathlib, "202") => rules::flake8_use_pathlib::rules::OsPathGetsize, + (Flake8UsePathlib, "202") => rules::flake8_use_pathlib::rules::OsPathGetsize, + (Flake8UsePathlib, "203") => rules::flake8_use_pathlib::rules::OsPathGetatime, + (Flake8UsePathlib, "204") => rules::flake8_use_pathlib::rules::OsPathGetmtime, + (Flake8UsePathlib, "205") => rules::flake8_use_pathlib::rules::OsPathGetctime, + (Flake8UsePathlib, "206") => rules::flake8_use_pathlib::rules::OsSepSplit, + (Flake8UsePathlib, "207") => rules::flake8_use_pathlib::rules::Glob, + (Flake8UsePathlib, "208") => rules::flake8_use_pathlib::violations::OsListdir, + (Flake8UsePathlib, "210") => rules::flake8_use_pathlib::rules::InvalidPathlibWithSuffix, + (Flake8UsePathlib, "211") => rules::flake8_use_pathlib::rules::OsSymlink, // flake8-logging-format - (Flake8LoggingFormat, "001") => (RuleGroup::Stable, rules::flake8_logging_format::violations::LoggingStringFormat), - (Flake8LoggingFormat, "002") => (RuleGroup::Stable, rules::flake8_logging_format::violations::LoggingPercentFormat), - (Flake8LoggingFormat, "003") => (RuleGroup::Stable, rules::flake8_logging_format::violations::LoggingStringConcat), - (Flake8LoggingFormat, "004") => (RuleGroup::Stable, rules::flake8_logging_format::violations::LoggingFString), - (Flake8LoggingFormat, "010") => (RuleGroup::Stable, rules::flake8_logging_format::violations::LoggingWarn), - (Flake8LoggingFormat, "101") => (RuleGroup::Stable, rules::flake8_logging_format::violations::LoggingExtraAttrClash), - (Flake8LoggingFormat, "201") => (RuleGroup::Stable, rules::flake8_logging_format::violations::LoggingExcInfo), - (Flake8LoggingFormat, "202") => (RuleGroup::Stable, rules::flake8_logging_format::violations::LoggingRedundantExcInfo), + (Flake8LoggingFormat, "001") => rules::flake8_logging_format::violations::LoggingStringFormat, + (Flake8LoggingFormat, "002") => rules::flake8_logging_format::violations::LoggingPercentFormat, + (Flake8LoggingFormat, "003") => rules::flake8_logging_format::violations::LoggingStringConcat, + (Flake8LoggingFormat, "004") => rules::flake8_logging_format::violations::LoggingFString, + (Flake8LoggingFormat, "010") => rules::flake8_logging_format::violations::LoggingWarn, + (Flake8LoggingFormat, "101") => rules::flake8_logging_format::violations::LoggingExtraAttrClash, + (Flake8LoggingFormat, "201") => rules::flake8_logging_format::violations::LoggingExcInfo, + (Flake8LoggingFormat, "202") => rules::flake8_logging_format::violations::LoggingRedundantExcInfo, // flake8-raise - (Flake8Raise, "102") => (RuleGroup::Stable, rules::flake8_raise::rules::UnnecessaryParenOnRaiseException), + (Flake8Raise, "102") => rules::flake8_raise::rules::UnnecessaryParenOnRaiseException, // flake8-self - (Flake8Self, "001") => (RuleGroup::Stable, rules::flake8_self::rules::PrivateMemberAccess), + (Flake8Self, "001") => rules::flake8_self::rules::PrivateMemberAccess, // numpy - (Numpy, "001") => (RuleGroup::Stable, rules::numpy::rules::NumpyDeprecatedTypeAlias), - (Numpy, "002") => (RuleGroup::Stable, rules::numpy::rules::NumpyLegacyRandom), - (Numpy, "003") => (RuleGroup::Stable, rules::numpy::rules::NumpyDeprecatedFunction), - (Numpy, "201") => (RuleGroup::Stable, rules::numpy::rules::Numpy2Deprecation), + (Numpy, "001") => rules::numpy::rules::NumpyDeprecatedTypeAlias, + (Numpy, "002") => rules::numpy::rules::NumpyLegacyRandom, + (Numpy, "003") => rules::numpy::rules::NumpyDeprecatedFunction, + (Numpy, "201") => rules::numpy::rules::Numpy2Deprecation, // fastapi - (FastApi, "001") => (RuleGroup::Stable, rules::fastapi::rules::FastApiRedundantResponseModel), - (FastApi, "002") => (RuleGroup::Stable, rules::fastapi::rules::FastApiNonAnnotatedDependency), - (FastApi, "003") => (RuleGroup::Stable, rules::fastapi::rules::FastApiUnusedPathParameter), + (FastApi, "001") => rules::fastapi::rules::FastApiRedundantResponseModel, + (FastApi, "002") => rules::fastapi::rules::FastApiNonAnnotatedDependency, + (FastApi, "003") => rules::fastapi::rules::FastApiUnusedPathParameter, // pydoclint - (Pydoclint, "102") => (RuleGroup::Preview, rules::pydoclint::rules::DocstringExtraneousParameter), - (Pydoclint, "201") => (RuleGroup::Preview, rules::pydoclint::rules::DocstringMissingReturns), - (Pydoclint, "202") => (RuleGroup::Preview, rules::pydoclint::rules::DocstringExtraneousReturns), - (Pydoclint, "402") => (RuleGroup::Preview, rules::pydoclint::rules::DocstringMissingYields), - (Pydoclint, "403") => (RuleGroup::Preview, rules::pydoclint::rules::DocstringExtraneousYields), - (Pydoclint, "501") => (RuleGroup::Preview, rules::pydoclint::rules::DocstringMissingException), - (Pydoclint, "502") => (RuleGroup::Preview, rules::pydoclint::rules::DocstringExtraneousException), + (Pydoclint, "102") => rules::pydoclint::rules::DocstringExtraneousParameter, + (Pydoclint, "201") => rules::pydoclint::rules::DocstringMissingReturns, + (Pydoclint, "202") => rules::pydoclint::rules::DocstringExtraneousReturns, + (Pydoclint, "402") => rules::pydoclint::rules::DocstringMissingYields, + (Pydoclint, "403") => rules::pydoclint::rules::DocstringExtraneousYields, + (Pydoclint, "501") => rules::pydoclint::rules::DocstringMissingException, + (Pydoclint, "502") => rules::pydoclint::rules::DocstringExtraneousException, // ruff - (Ruff, "001") => (RuleGroup::Stable, rules::ruff::rules::AmbiguousUnicodeCharacterString), - (Ruff, "002") => (RuleGroup::Stable, rules::ruff::rules::AmbiguousUnicodeCharacterDocstring), - (Ruff, "003") => (RuleGroup::Stable, rules::ruff::rules::AmbiguousUnicodeCharacterComment), - (Ruff, "005") => (RuleGroup::Stable, rules::ruff::rules::CollectionLiteralConcatenation), - (Ruff, "006") => (RuleGroup::Stable, rules::ruff::rules::AsyncioDanglingTask), - (Ruff, "007") => (RuleGroup::Stable, rules::ruff::rules::ZipInsteadOfPairwise), - (Ruff, "008") => (RuleGroup::Stable, rules::ruff::rules::MutableDataclassDefault), - (Ruff, "009") => (RuleGroup::Stable, rules::ruff::rules::FunctionCallInDataclassDefaultArgument), - (Ruff, "010") => (RuleGroup::Stable, rules::ruff::rules::ExplicitFStringTypeConversion), - (Ruff, "011") => (RuleGroup::Removed, rules::ruff::rules::RuffStaticKeyDictComprehension), - (Ruff, "012") => (RuleGroup::Stable, rules::ruff::rules::MutableClassDefault), - (Ruff, "013") => (RuleGroup::Stable, rules::ruff::rules::ImplicitOptional), - (Ruff, "015") => (RuleGroup::Stable, rules::ruff::rules::UnnecessaryIterableAllocationForFirstElement), - (Ruff, "016") => (RuleGroup::Stable, rules::ruff::rules::InvalidIndexType), - (Ruff, "017") => (RuleGroup::Stable, rules::ruff::rules::QuadraticListSummation), - (Ruff, "018") => (RuleGroup::Stable, rules::ruff::rules::AssignmentInAssert), - (Ruff, "019") => (RuleGroup::Stable, rules::ruff::rules::UnnecessaryKeyCheck), - (Ruff, "020") => (RuleGroup::Stable, rules::ruff::rules::NeverUnion), - (Ruff, "021") => (RuleGroup::Stable, rules::ruff::rules::ParenthesizeChainedOperators), - (Ruff, "022") => (RuleGroup::Stable, rules::ruff::rules::UnsortedDunderAll), - (Ruff, "023") => (RuleGroup::Stable, rules::ruff::rules::UnsortedDunderSlots), - (Ruff, "024") => (RuleGroup::Stable, rules::ruff::rules::MutableFromkeysValue), - (Ruff, "026") => (RuleGroup::Stable, rules::ruff::rules::DefaultFactoryKwarg), - (Ruff, "027") => (RuleGroup::Preview, rules::ruff::rules::MissingFStringSyntax), - (Ruff, "028") => (RuleGroup::Stable, rules::ruff::rules::InvalidFormatterSuppressionComment), - (Ruff, "029") => (RuleGroup::Preview, rules::ruff::rules::UnusedAsync), - (Ruff, "030") => (RuleGroup::Stable, rules::ruff::rules::AssertWithPrintMessage), - (Ruff, "031") => (RuleGroup::Preview, rules::ruff::rules::IncorrectlyParenthesizedTupleInSubscript), - (Ruff, "032") => (RuleGroup::Stable, rules::ruff::rules::DecimalFromFloatLiteral), - (Ruff, "033") => (RuleGroup::Stable, rules::ruff::rules::PostInitDefault), - (Ruff, "034") => (RuleGroup::Stable, rules::ruff::rules::UselessIfElse), - (Ruff, "035") => (RuleGroup::Removed, rules::ruff::rules::RuffUnsafeMarkupUse), - (Ruff, "036") => (RuleGroup::Preview, rules::ruff::rules::NoneNotAtEndOfUnion), - (Ruff, "037") => (RuleGroup::Preview, rules::ruff::rules::UnnecessaryEmptyIterableWithinDequeCall), - (Ruff, "038") => (RuleGroup::Preview, rules::ruff::rules::RedundantBoolLiteral), - (Ruff, "039") => (RuleGroup::Preview, rules::ruff::rules::UnrawRePattern), - (Ruff, "040") => (RuleGroup::Stable, rules::ruff::rules::InvalidAssertMessageLiteralArgument), - (Ruff, "041") => (RuleGroup::Stable, rules::ruff::rules::UnnecessaryNestedLiteral), - (Ruff, "043") => (RuleGroup::Stable, rules::ruff::rules::PytestRaisesAmbiguousPattern), - (Ruff, "045") => (RuleGroup::Preview, rules::ruff::rules::ImplicitClassVarInDataclass), - (Ruff, "046") => (RuleGroup::Stable, rules::ruff::rules::UnnecessaryCastToInt), - (Ruff, "047") => (RuleGroup::Preview, rules::ruff::rules::NeedlessElse), - (Ruff, "048") => (RuleGroup::Stable, rules::ruff::rules::MapIntVersionParsing), - (Ruff, "049") => (RuleGroup::Stable, rules::ruff::rules::DataclassEnum), - (Ruff, "051") => (RuleGroup::Stable, rules::ruff::rules::IfKeyInDictDel), - (Ruff, "052") => (RuleGroup::Preview, rules::ruff::rules::UsedDummyVariable), - (Ruff, "053") => (RuleGroup::Stable, rules::ruff::rules::ClassWithMixedTypeVars), - (Ruff, "054") => (RuleGroup::Preview, rules::ruff::rules::IndentedFormFeed), - (Ruff, "055") => (RuleGroup::Preview, rules::ruff::rules::UnnecessaryRegularExpression), - (Ruff, "056") => (RuleGroup::Preview, rules::ruff::rules::FalsyDictGetFallback), - (Ruff, "057") => (RuleGroup::Stable, rules::ruff::rules::UnnecessaryRound), - (Ruff, "058") => (RuleGroup::Stable, rules::ruff::rules::StarmapZip), - (Ruff, "059") => (RuleGroup::Stable, rules::ruff::rules::UnusedUnpackedVariable), - (Ruff, "060") => (RuleGroup::Preview, rules::ruff::rules::InEmptyCollection), - (Ruff, "061") => (RuleGroup::Preview, rules::ruff::rules::LegacyFormPytestRaises), - (Ruff, "063") => (RuleGroup::Preview, rules::ruff::rules::AccessAnnotationsFromClassDict), - (Ruff, "064") => (RuleGroup::Preview, rules::ruff::rules::NonOctalPermissions), - (Ruff, "065") => (RuleGroup::Preview, rules::ruff::rules::LoggingEagerConversion), - - (Ruff, "100") => (RuleGroup::Stable, rules::ruff::rules::UnusedNOQA), - (Ruff, "101") => (RuleGroup::Stable, rules::ruff::rules::RedirectedNOQA), - (Ruff, "102") => (RuleGroup::Preview, rules::ruff::rules::InvalidRuleCode), - - (Ruff, "200") => (RuleGroup::Stable, rules::ruff::rules::InvalidPyprojectToml), + (Ruff, "001") => rules::ruff::rules::AmbiguousUnicodeCharacterString, + (Ruff, "002") => rules::ruff::rules::AmbiguousUnicodeCharacterDocstring, + (Ruff, "003") => rules::ruff::rules::AmbiguousUnicodeCharacterComment, + (Ruff, "005") => rules::ruff::rules::CollectionLiteralConcatenation, + (Ruff, "006") => rules::ruff::rules::AsyncioDanglingTask, + (Ruff, "007") => rules::ruff::rules::ZipInsteadOfPairwise, + (Ruff, "008") => rules::ruff::rules::MutableDataclassDefault, + (Ruff, "009") => rules::ruff::rules::FunctionCallInDataclassDefaultArgument, + (Ruff, "010") => rules::ruff::rules::ExplicitFStringTypeConversion, + (Ruff, "011") => rules::ruff::rules::RuffStaticKeyDictComprehension, + (Ruff, "012") => rules::ruff::rules::MutableClassDefault, + (Ruff, "013") => rules::ruff::rules::ImplicitOptional, + (Ruff, "015") => rules::ruff::rules::UnnecessaryIterableAllocationForFirstElement, + (Ruff, "016") => rules::ruff::rules::InvalidIndexType, + (Ruff, "017") => rules::ruff::rules::QuadraticListSummation, + (Ruff, "018") => rules::ruff::rules::AssignmentInAssert, + (Ruff, "019") => rules::ruff::rules::UnnecessaryKeyCheck, + (Ruff, "020") => rules::ruff::rules::NeverUnion, + (Ruff, "021") => rules::ruff::rules::ParenthesizeChainedOperators, + (Ruff, "022") => rules::ruff::rules::UnsortedDunderAll, + (Ruff, "023") => rules::ruff::rules::UnsortedDunderSlots, + (Ruff, "024") => rules::ruff::rules::MutableFromkeysValue, + (Ruff, "026") => rules::ruff::rules::DefaultFactoryKwarg, + (Ruff, "027") => rules::ruff::rules::MissingFStringSyntax, + (Ruff, "028") => rules::ruff::rules::InvalidFormatterSuppressionComment, + (Ruff, "029") => rules::ruff::rules::UnusedAsync, + (Ruff, "030") => rules::ruff::rules::AssertWithPrintMessage, + (Ruff, "031") => rules::ruff::rules::IncorrectlyParenthesizedTupleInSubscript, + (Ruff, "032") => rules::ruff::rules::DecimalFromFloatLiteral, + (Ruff, "033") => rules::ruff::rules::PostInitDefault, + (Ruff, "034") => rules::ruff::rules::UselessIfElse, + (Ruff, "035") => rules::ruff::rules::RuffUnsafeMarkupUse, + (Ruff, "036") => rules::ruff::rules::NoneNotAtEndOfUnion, + (Ruff, "037") => rules::ruff::rules::UnnecessaryEmptyIterableWithinDequeCall, + (Ruff, "038") => rules::ruff::rules::RedundantBoolLiteral, + (Ruff, "039") => rules::ruff::rules::UnrawRePattern, + (Ruff, "040") => rules::ruff::rules::InvalidAssertMessageLiteralArgument, + (Ruff, "041") => rules::ruff::rules::UnnecessaryNestedLiteral, + (Ruff, "043") => rules::ruff::rules::PytestRaisesAmbiguousPattern, + (Ruff, "045") => rules::ruff::rules::ImplicitClassVarInDataclass, + (Ruff, "046") => rules::ruff::rules::UnnecessaryCastToInt, + (Ruff, "047") => rules::ruff::rules::NeedlessElse, + (Ruff, "048") => rules::ruff::rules::MapIntVersionParsing, + (Ruff, "049") => rules::ruff::rules::DataclassEnum, + (Ruff, "051") => rules::ruff::rules::IfKeyInDictDel, + (Ruff, "052") => rules::ruff::rules::UsedDummyVariable, + (Ruff, "053") => rules::ruff::rules::ClassWithMixedTypeVars, + (Ruff, "054") => rules::ruff::rules::IndentedFormFeed, + (Ruff, "055") => rules::ruff::rules::UnnecessaryRegularExpression, + (Ruff, "056") => rules::ruff::rules::FalsyDictGetFallback, + (Ruff, "057") => rules::ruff::rules::UnnecessaryRound, + (Ruff, "058") => rules::ruff::rules::StarmapZip, + (Ruff, "059") => rules::ruff::rules::UnusedUnpackedVariable, + (Ruff, "060") => rules::ruff::rules::InEmptyCollection, + (Ruff, "061") => rules::ruff::rules::LegacyFormPytestRaises, + (Ruff, "063") => rules::ruff::rules::AccessAnnotationsFromClassDict, + (Ruff, "064") => rules::ruff::rules::NonOctalPermissions, + (Ruff, "065") => rules::ruff::rules::LoggingEagerConversion, + + (Ruff, "100") => rules::ruff::rules::UnusedNOQA, + (Ruff, "101") => rules::ruff::rules::RedirectedNOQA, + (Ruff, "102") => rules::ruff::rules::InvalidRuleCode, + + (Ruff, "200") => rules::ruff::rules::InvalidPyprojectToml, #[cfg(any(feature = "test-rules", test))] - (Ruff, "900") => (RuleGroup::Stable, rules::ruff::rules::StableTestRule), + (Ruff, "900") => rules::ruff::rules::StableTestRule, #[cfg(any(feature = "test-rules", test))] - (Ruff, "901") => (RuleGroup::Stable, rules::ruff::rules::StableTestRuleSafeFix), + (Ruff, "901") => rules::ruff::rules::StableTestRuleSafeFix, #[cfg(any(feature = "test-rules", test))] - (Ruff, "902") => (RuleGroup::Stable, rules::ruff::rules::StableTestRuleUnsafeFix), + (Ruff, "902") => rules::ruff::rules::StableTestRuleUnsafeFix, #[cfg(any(feature = "test-rules", test))] - (Ruff, "903") => (RuleGroup::Stable, rules::ruff::rules::StableTestRuleDisplayOnlyFix), + (Ruff, "903") => rules::ruff::rules::StableTestRuleDisplayOnlyFix, #[cfg(any(feature = "test-rules", test))] - (Ruff, "911") => (RuleGroup::Preview, rules::ruff::rules::PreviewTestRule), + (Ruff, "911") => rules::ruff::rules::PreviewTestRule, #[cfg(any(feature = "test-rules", test))] - (Ruff, "920") => (RuleGroup::Deprecated, rules::ruff::rules::DeprecatedTestRule), + (Ruff, "920") => rules::ruff::rules::DeprecatedTestRule, #[cfg(any(feature = "test-rules", test))] - (Ruff, "921") => (RuleGroup::Deprecated, rules::ruff::rules::AnotherDeprecatedTestRule), + (Ruff, "921") => rules::ruff::rules::AnotherDeprecatedTestRule, #[cfg(any(feature = "test-rules", test))] - (Ruff, "930") => (RuleGroup::Removed, rules::ruff::rules::RemovedTestRule), + (Ruff, "930") => rules::ruff::rules::RemovedTestRule, #[cfg(any(feature = "test-rules", test))] - (Ruff, "931") => (RuleGroup::Removed, rules::ruff::rules::AnotherRemovedTestRule), + (Ruff, "931") => rules::ruff::rules::AnotherRemovedTestRule, #[cfg(any(feature = "test-rules", test))] - (Ruff, "940") => (RuleGroup::Removed, rules::ruff::rules::RedirectedFromTestRule), + (Ruff, "940") => rules::ruff::rules::RedirectedFromTestRule, #[cfg(any(feature = "test-rules", test))] - (Ruff, "950") => (RuleGroup::Stable, rules::ruff::rules::RedirectedToTestRule), + (Ruff, "950") => rules::ruff::rules::RedirectedToTestRule, #[cfg(any(feature = "test-rules", test))] - (Ruff, "960") => (RuleGroup::Removed, rules::ruff::rules::RedirectedFromPrefixTestRule), + (Ruff, "960") => rules::ruff::rules::RedirectedFromPrefixTestRule, #[cfg(any(feature = "test-rules", test))] - (Ruff, "990") => (RuleGroup::Preview, rules::ruff::rules::PanicyTestRule), + (Ruff, "990") => rules::ruff::rules::PanicyTestRule, // flake8-django - (Flake8Django, "001") => (RuleGroup::Stable, rules::flake8_django::rules::DjangoNullableModelStringField), - (Flake8Django, "003") => (RuleGroup::Stable, rules::flake8_django::rules::DjangoLocalsInRenderFunction), - (Flake8Django, "006") => (RuleGroup::Stable, rules::flake8_django::rules::DjangoExcludeWithModelForm), - (Flake8Django, "007") => (RuleGroup::Stable, rules::flake8_django::rules::DjangoAllWithModelForm), - (Flake8Django, "008") => (RuleGroup::Stable, rules::flake8_django::rules::DjangoModelWithoutDunderStr), - (Flake8Django, "012") => (RuleGroup::Stable, rules::flake8_django::rules::DjangoUnorderedBodyContentInModel), - (Flake8Django, "013") => (RuleGroup::Stable, rules::flake8_django::rules::DjangoNonLeadingReceiverDecorator), + (Flake8Django, "001") => rules::flake8_django::rules::DjangoNullableModelStringField, + (Flake8Django, "003") => rules::flake8_django::rules::DjangoLocalsInRenderFunction, + (Flake8Django, "006") => rules::flake8_django::rules::DjangoExcludeWithModelForm, + (Flake8Django, "007") => rules::flake8_django::rules::DjangoAllWithModelForm, + (Flake8Django, "008") => rules::flake8_django::rules::DjangoModelWithoutDunderStr, + (Flake8Django, "012") => rules::flake8_django::rules::DjangoUnorderedBodyContentInModel, + (Flake8Django, "013") => rules::flake8_django::rules::DjangoNonLeadingReceiverDecorator, // flynt - // Reserved: (Flynt, "001") => (RuleGroup::Stable, Rule: :StringConcatenationToFString), - (Flynt, "002") => (RuleGroup::Stable, rules::flynt::rules::StaticJoinToFString), + // Reserved: (Flynt, "001") => Rule: :StringConcatenationToFString, + (Flynt, "002") => rules::flynt::rules::StaticJoinToFString, // flake8-todos - (Flake8Todos, "001") => (RuleGroup::Stable, rules::flake8_todos::rules::InvalidTodoTag), - (Flake8Todos, "002") => (RuleGroup::Stable, rules::flake8_todos::rules::MissingTodoAuthor), - (Flake8Todos, "003") => (RuleGroup::Stable, rules::flake8_todos::rules::MissingTodoLink), - (Flake8Todos, "004") => (RuleGroup::Stable, rules::flake8_todos::rules::MissingTodoColon), - (Flake8Todos, "005") => (RuleGroup::Stable, rules::flake8_todos::rules::MissingTodoDescription), - (Flake8Todos, "006") => (RuleGroup::Stable, rules::flake8_todos::rules::InvalidTodoCapitalization), - (Flake8Todos, "007") => (RuleGroup::Stable, rules::flake8_todos::rules::MissingSpaceAfterTodoColon), + (Flake8Todos, "001") => rules::flake8_todos::rules::InvalidTodoTag, + (Flake8Todos, "002") => rules::flake8_todos::rules::MissingTodoAuthor, + (Flake8Todos, "003") => rules::flake8_todos::rules::MissingTodoLink, + (Flake8Todos, "004") => rules::flake8_todos::rules::MissingTodoColon, + (Flake8Todos, "005") => rules::flake8_todos::rules::MissingTodoDescription, + (Flake8Todos, "006") => rules::flake8_todos::rules::InvalidTodoCapitalization, + (Flake8Todos, "007") => rules::flake8_todos::rules::MissingSpaceAfterTodoColon, // airflow - (Airflow, "001") => (RuleGroup::Stable, rules::airflow::rules::AirflowVariableNameTaskIdMismatch), - (Airflow, "002") => (RuleGroup::Stable, rules::airflow::rules::AirflowDagNoScheduleArgument), - (Airflow, "301") => (RuleGroup::Stable, rules::airflow::rules::Airflow3Removal), - (Airflow, "302") => (RuleGroup::Stable, rules::airflow::rules::Airflow3MovedToProvider), - (Airflow, "311") => (RuleGroup::Stable, rules::airflow::rules::Airflow3SuggestedUpdate), - (Airflow, "312") => (RuleGroup::Stable, rules::airflow::rules::Airflow3SuggestedToMoveToProvider), + (Airflow, "001") => rules::airflow::rules::AirflowVariableNameTaskIdMismatch, + (Airflow, "002") => rules::airflow::rules::AirflowDagNoScheduleArgument, + (Airflow, "301") => rules::airflow::rules::Airflow3Removal, + (Airflow, "302") => rules::airflow::rules::Airflow3MovedToProvider, + (Airflow, "311") => rules::airflow::rules::Airflow3SuggestedUpdate, + (Airflow, "312") => rules::airflow::rules::Airflow3SuggestedToMoveToProvider, // perflint - (Perflint, "101") => (RuleGroup::Stable, rules::perflint::rules::UnnecessaryListCast), - (Perflint, "102") => (RuleGroup::Stable, rules::perflint::rules::IncorrectDictIterator), - (Perflint, "203") => (RuleGroup::Stable, rules::perflint::rules::TryExceptInLoop), - (Perflint, "401") => (RuleGroup::Stable, rules::perflint::rules::ManualListComprehension), - (Perflint, "402") => (RuleGroup::Stable, rules::perflint::rules::ManualListCopy), - (Perflint, "403") => (RuleGroup::Stable, rules::perflint::rules::ManualDictComprehension), + (Perflint, "101") => rules::perflint::rules::UnnecessaryListCast, + (Perflint, "102") => rules::perflint::rules::IncorrectDictIterator, + (Perflint, "203") => rules::perflint::rules::TryExceptInLoop, + (Perflint, "401") => rules::perflint::rules::ManualListComprehension, + (Perflint, "402") => rules::perflint::rules::ManualListCopy, + (Perflint, "403") => rules::perflint::rules::ManualDictComprehension, // flake8-fixme - (Flake8Fixme, "001") => (RuleGroup::Stable, rules::flake8_fixme::rules::LineContainsFixme), - (Flake8Fixme, "002") => (RuleGroup::Stable, rules::flake8_fixme::rules::LineContainsTodo), - (Flake8Fixme, "003") => (RuleGroup::Stable, rules::flake8_fixme::rules::LineContainsXxx), - (Flake8Fixme, "004") => (RuleGroup::Stable, rules::flake8_fixme::rules::LineContainsHack), + (Flake8Fixme, "001") => rules::flake8_fixme::rules::LineContainsFixme, + (Flake8Fixme, "002") => rules::flake8_fixme::rules::LineContainsTodo, + (Flake8Fixme, "003") => rules::flake8_fixme::rules::LineContainsXxx, + (Flake8Fixme, "004") => rules::flake8_fixme::rules::LineContainsHack, // flake8-slots - (Flake8Slots, "000") => (RuleGroup::Stable, rules::flake8_slots::rules::NoSlotsInStrSubclass), - (Flake8Slots, "001") => (RuleGroup::Stable, rules::flake8_slots::rules::NoSlotsInTupleSubclass), - (Flake8Slots, "002") => (RuleGroup::Stable, rules::flake8_slots::rules::NoSlotsInNamedtupleSubclass), + (Flake8Slots, "000") => rules::flake8_slots::rules::NoSlotsInStrSubclass, + (Flake8Slots, "001") => rules::flake8_slots::rules::NoSlotsInTupleSubclass, + (Flake8Slots, "002") => rules::flake8_slots::rules::NoSlotsInNamedtupleSubclass, // refurb - (Refurb, "101") => (RuleGroup::Preview, rules::refurb::rules::ReadWholeFile), - (Refurb, "103") => (RuleGroup::Preview, rules::refurb::rules::WriteWholeFile), - (Refurb, "105") => (RuleGroup::Stable, rules::refurb::rules::PrintEmptyString), - (Refurb, "110") => (RuleGroup::Preview, rules::refurb::rules::IfExpInsteadOfOrOperator), - (Refurb, "113") => (RuleGroup::Preview, rules::refurb::rules::RepeatedAppend), - (Refurb, "116") => (RuleGroup::Stable, rules::refurb::rules::FStringNumberFormat), - (Refurb, "118") => (RuleGroup::Preview, rules::refurb::rules::ReimplementedOperator), - (Refurb, "122") => (RuleGroup::Stable, rules::refurb::rules::ForLoopWrites), - (Refurb, "129") => (RuleGroup::Stable, rules::refurb::rules::ReadlinesInFor), - (Refurb, "131") => (RuleGroup::Preview, rules::refurb::rules::DeleteFullSlice), - (Refurb, "132") => (RuleGroup::Stable, rules::refurb::rules::CheckAndRemoveFromSet), - (Refurb, "136") => (RuleGroup::Stable, rules::refurb::rules::IfExprMinMax), - (Refurb, "140") => (RuleGroup::Preview, rules::refurb::rules::ReimplementedStarmap), - (Refurb, "142") => (RuleGroup::Preview, rules::refurb::rules::ForLoopSetMutations), - (Refurb, "145") => (RuleGroup::Preview, rules::refurb::rules::SliceCopy), - (Refurb, "148") => (RuleGroup::Preview, rules::refurb::rules::UnnecessaryEnumerate), - (Refurb, "152") => (RuleGroup::Preview, rules::refurb::rules::MathConstant), - (Refurb, "154") => (RuleGroup::Preview, rules::refurb::rules::RepeatedGlobal), - (Refurb, "156") => (RuleGroup::Preview, rules::refurb::rules::HardcodedStringCharset), - (Refurb, "157") => (RuleGroup::Stable, rules::refurb::rules::VerboseDecimalConstructor), - (Refurb, "161") => (RuleGroup::Stable, rules::refurb::rules::BitCount), - (Refurb, "162") => (RuleGroup::Stable, rules::refurb::rules::FromisoformatReplaceZ), - (Refurb, "163") => (RuleGroup::Stable, rules::refurb::rules::RedundantLogBase), - (Refurb, "164") => (RuleGroup::Preview, rules::refurb::rules::UnnecessaryFromFloat), - (Refurb, "166") => (RuleGroup::Stable, rules::refurb::rules::IntOnSlicedStr), - (Refurb, "167") => (RuleGroup::Stable, rules::refurb::rules::RegexFlagAlias), - (Refurb, "168") => (RuleGroup::Stable, rules::refurb::rules::IsinstanceTypeNone), - (Refurb, "169") => (RuleGroup::Stable, rules::refurb::rules::TypeNoneComparison), - (Refurb, "171") => (RuleGroup::Preview, rules::refurb::rules::SingleItemMembershipTest), - (Refurb, "177") => (RuleGroup::Stable, rules::refurb::rules::ImplicitCwd), - (Refurb, "180") => (RuleGroup::Preview, rules::refurb::rules::MetaClassABCMeta), - (Refurb, "181") => (RuleGroup::Stable, rules::refurb::rules::HashlibDigestHex), - (Refurb, "187") => (RuleGroup::Stable, rules::refurb::rules::ListReverseCopy), - (Refurb, "188") => (RuleGroup::Stable, rules::refurb::rules::SliceToRemovePrefixOrSuffix), - (Refurb, "189") => (RuleGroup::Preview, rules::refurb::rules::SubclassBuiltin), - (Refurb, "192") => (RuleGroup::Preview, rules::refurb::rules::SortedMinMax), + (Refurb, "101") => rules::refurb::rules::ReadWholeFile, + (Refurb, "103") => rules::refurb::rules::WriteWholeFile, + (Refurb, "105") => rules::refurb::rules::PrintEmptyString, + (Refurb, "110") => rules::refurb::rules::IfExpInsteadOfOrOperator, + (Refurb, "113") => rules::refurb::rules::RepeatedAppend, + (Refurb, "116") => rules::refurb::rules::FStringNumberFormat, + (Refurb, "118") => rules::refurb::rules::ReimplementedOperator, + (Refurb, "122") => rules::refurb::rules::ForLoopWrites, + (Refurb, "129") => rules::refurb::rules::ReadlinesInFor, + (Refurb, "131") => rules::refurb::rules::DeleteFullSlice, + (Refurb, "132") => rules::refurb::rules::CheckAndRemoveFromSet, + (Refurb, "136") => rules::refurb::rules::IfExprMinMax, + (Refurb, "140") => rules::refurb::rules::ReimplementedStarmap, + (Refurb, "142") => rules::refurb::rules::ForLoopSetMutations, + (Refurb, "145") => rules::refurb::rules::SliceCopy, + (Refurb, "148") => rules::refurb::rules::UnnecessaryEnumerate, + (Refurb, "152") => rules::refurb::rules::MathConstant, + (Refurb, "154") => rules::refurb::rules::RepeatedGlobal, + (Refurb, "156") => rules::refurb::rules::HardcodedStringCharset, + (Refurb, "157") => rules::refurb::rules::VerboseDecimalConstructor, + (Refurb, "161") => rules::refurb::rules::BitCount, + (Refurb, "162") => rules::refurb::rules::FromisoformatReplaceZ, + (Refurb, "163") => rules::refurb::rules::RedundantLogBase, + (Refurb, "164") => rules::refurb::rules::UnnecessaryFromFloat, + (Refurb, "166") => rules::refurb::rules::IntOnSlicedStr, + (Refurb, "167") => rules::refurb::rules::RegexFlagAlias, + (Refurb, "168") => rules::refurb::rules::IsinstanceTypeNone, + (Refurb, "169") => rules::refurb::rules::TypeNoneComparison, + (Refurb, "171") => rules::refurb::rules::SingleItemMembershipTest, + (Refurb, "177") => rules::refurb::rules::ImplicitCwd, + (Refurb, "180") => rules::refurb::rules::MetaClassABCMeta, + (Refurb, "181") => rules::refurb::rules::HashlibDigestHex, + (Refurb, "187") => rules::refurb::rules::ListReverseCopy, + (Refurb, "188") => rules::refurb::rules::SliceToRemovePrefixOrSuffix, + (Refurb, "189") => rules::refurb::rules::SubclassBuiltin, + (Refurb, "192") => rules::refurb::rules::SortedMinMax, // flake8-logging - (Flake8Logging, "001") => (RuleGroup::Stable, rules::flake8_logging::rules::DirectLoggerInstantiation), - (Flake8Logging, "002") => (RuleGroup::Stable, rules::flake8_logging::rules::InvalidGetLoggerArgument), - (Flake8Logging, "004") => (RuleGroup::Preview, rules::flake8_logging::rules::LogExceptionOutsideExceptHandler), - (Flake8Logging, "007") => (RuleGroup::Stable, rules::flake8_logging::rules::ExceptionWithoutExcInfo), - (Flake8Logging, "009") => (RuleGroup::Stable, rules::flake8_logging::rules::UndocumentedWarn), - (Flake8Logging, "014") => (RuleGroup::Stable, rules::flake8_logging::rules::ExcInfoOutsideExceptHandler), - (Flake8Logging, "015") => (RuleGroup::Stable, rules::flake8_logging::rules::RootLoggerCall), + (Flake8Logging, "001") => rules::flake8_logging::rules::DirectLoggerInstantiation, + (Flake8Logging, "002") => rules::flake8_logging::rules::InvalidGetLoggerArgument, + (Flake8Logging, "004") => rules::flake8_logging::rules::LogExceptionOutsideExceptHandler, + (Flake8Logging, "007") => rules::flake8_logging::rules::ExceptionWithoutExcInfo, + (Flake8Logging, "009") => rules::flake8_logging::rules::UndocumentedWarn, + (Flake8Logging, "014") => rules::flake8_logging::rules::ExcInfoOutsideExceptHandler, + (Flake8Logging, "015") => rules::flake8_logging::rules::RootLoggerCall, _ => return None, }) diff --git a/crates/ruff_linter/src/rule_redirects.rs b/crates/ruff_linter/src/rule_redirects.rs index 953074e10d2b58..b85523c6a14f7b 100644 --- a/crates/ruff_linter/src/rule_redirects.rs +++ b/crates/ruff_linter/src/rule_redirects.rs @@ -150,7 +150,7 @@ mod tests { for rule in Rule::iter() { let (code, group) = (rule.noqa_code(), rule.group()); - if matches!(group, RuleGroup::Removed) { + if matches!(group, RuleGroup::Removed { .. }) { continue; } diff --git a/crates/ruff_linter/src/rule_selector.rs b/crates/ruff_linter/src/rule_selector.rs index b0417f4c1d6893..b3eee0d8370b33 100644 --- a/crates/ruff_linter/src/rule_selector.rs +++ b/crates/ruff_linter/src/rule_selector.rs @@ -209,15 +209,15 @@ impl RuleSelector { self.all_rules().filter(move |rule| { match rule.group() { // Always include stable rules - RuleGroup::Stable => true, + RuleGroup::Stable { .. } => true, // Enabling preview includes all preview rules unless explicit selection is turned on - RuleGroup::Preview => { + RuleGroup::Preview { .. } => { preview_enabled && (self.is_exact() || !preview_require_explicit) } // Deprecated rules are excluded by default unless explicitly selected - RuleGroup::Deprecated => !preview_enabled && self.is_exact(), + RuleGroup::Deprecated { .. } => !preview_enabled && self.is_exact(), // Removed rules are included if explicitly selected but will error downstream - RuleGroup::Removed => self.is_exact(), + RuleGroup::Removed { .. } => self.is_exact(), } }) } diff --git a/crates/ruff_linter/src/rules/airflow/rules/dag_schedule_argument.rs b/crates/ruff_linter/src/rules/airflow/rules/dag_schedule_argument.rs index efb7a69f13a8de..c06c86a9557361 100644 --- a/crates/ruff_linter/src/rules/airflow/rules/dag_schedule_argument.rs +++ b/crates/ruff_linter/src/rules/airflow/rules/dag_schedule_argument.rs @@ -41,6 +41,7 @@ use crate::checkers::ast::Checker; /// dag = DAG(dag_id="my_dag", schedule=timedelta(days=1)) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.13.0")] pub(crate) struct AirflowDagNoScheduleArgument; impl Violation for AirflowDagNoScheduleArgument { diff --git a/crates/ruff_linter/src/rules/airflow/rules/moved_to_provider_in_3.rs b/crates/ruff_linter/src/rules/airflow/rules/moved_to_provider_in_3.rs index 94a05836261339..d420c25a6db5c3 100644 --- a/crates/ruff_linter/src/rules/airflow/rules/moved_to_provider_in_3.rs +++ b/crates/ruff_linter/src/rules/airflow/rules/moved_to_provider_in_3.rs @@ -35,6 +35,7 @@ use crate::{FixAvailability, Violation}; /// fab_auth_manager_app = FabAuthManager().get_fastapi_app() /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.13.0")] pub(crate) struct Airflow3MovedToProvider<'a> { deprecated: QualifiedName<'a>, replacement: ProviderReplacement, diff --git a/crates/ruff_linter/src/rules/airflow/rules/removal_in_3.rs b/crates/ruff_linter/src/rules/airflow/rules/removal_in_3.rs index 41defac3d01d02..df09b37e818bee 100644 --- a/crates/ruff_linter/src/rules/airflow/rules/removal_in_3.rs +++ b/crates/ruff_linter/src/rules/airflow/rules/removal_in_3.rs @@ -41,6 +41,7 @@ use ruff_text_size::TextRange; /// yesterday = today - timedelta(days=1) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.13.0")] pub(crate) struct Airflow3Removal { deprecated: String, replacement: Replacement, diff --git a/crates/ruff_linter/src/rules/airflow/rules/suggested_to_move_to_provider_in_3.rs b/crates/ruff_linter/src/rules/airflow/rules/suggested_to_move_to_provider_in_3.rs index 5de270e6b8ad1d..bb31ef7b987b1d 100644 --- a/crates/ruff_linter/src/rules/airflow/rules/suggested_to_move_to_provider_in_3.rs +++ b/crates/ruff_linter/src/rules/airflow/rules/suggested_to_move_to_provider_in_3.rs @@ -51,6 +51,7 @@ use ruff_text_size::TextRange; /// ) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.13.0")] pub(crate) struct Airflow3SuggestedToMoveToProvider<'a> { deprecated: QualifiedName<'a>, replacement: ProviderReplacement, diff --git a/crates/ruff_linter/src/rules/airflow/rules/suggested_to_update_3_0.rs b/crates/ruff_linter/src/rules/airflow/rules/suggested_to_update_3_0.rs index c4f29f4b5acfe5..e939387bdae43e 100644 --- a/crates/ruff_linter/src/rules/airflow/rules/suggested_to_update_3_0.rs +++ b/crates/ruff_linter/src/rules/airflow/rules/suggested_to_update_3_0.rs @@ -37,6 +37,7 @@ use ruff_text_size::TextRange; /// Asset(uri="test://test/") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.13.0")] pub(crate) struct Airflow3SuggestedUpdate { deprecated: String, replacement: Replacement, diff --git a/crates/ruff_linter/src/rules/airflow/rules/task_variable_name.rs b/crates/ruff_linter/src/rules/airflow/rules/task_variable_name.rs index 8fcd6da8c167fe..af30a832e35f77 100644 --- a/crates/ruff_linter/src/rules/airflow/rules/task_variable_name.rs +++ b/crates/ruff_linter/src/rules/airflow/rules/task_variable_name.rs @@ -32,6 +32,7 @@ use crate::checkers::ast::Checker; /// my_task = PythonOperator(task_id="my_task") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.271")] pub(crate) struct AirflowVariableNameTaskIdMismatch { task_id: String, } diff --git a/crates/ruff_linter/src/rules/eradicate/rules/commented_out_code.rs b/crates/ruff_linter/src/rules/eradicate/rules/commented_out_code.rs index a6a93a45145c94..a26d64d0ea20a3 100644 --- a/crates/ruff_linter/src/rules/eradicate/rules/commented_out_code.rs +++ b/crates/ruff_linter/src/rules/eradicate/rules/commented_out_code.rs @@ -30,6 +30,7 @@ use crate::rules::eradicate::detection::comment_contains_code; /// /// [#4845]: https://github.com/astral-sh/ruff/issues/4845 #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.145")] pub(crate) struct CommentedOutCode; impl Violation for CommentedOutCode { diff --git a/crates/ruff_linter/src/rules/fastapi/rules/fastapi_non_annotated_dependency.rs b/crates/ruff_linter/src/rules/fastapi/rules/fastapi_non_annotated_dependency.rs index 9baf036ad7934d..3de94ad67eaaf3 100644 --- a/crates/ruff_linter/src/rules/fastapi/rules/fastapi_non_annotated_dependency.rs +++ b/crates/ruff_linter/src/rules/fastapi/rules/fastapi_non_annotated_dependency.rs @@ -79,6 +79,7 @@ use ruff_python_ast::PythonVersion; /// [typing-annotated]: https://docs.python.org/3/library/typing.html#typing.Annotated /// [typing-extensions]: https://typing-extensions.readthedocs.io/en/stable/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct FastApiNonAnnotatedDependency { py_version: PythonVersion, } diff --git a/crates/ruff_linter/src/rules/fastapi/rules/fastapi_redundant_response_model.rs b/crates/ruff_linter/src/rules/fastapi/rules/fastapi_redundant_response_model.rs index a6707d1ea14933..440be901a76359 100644 --- a/crates/ruff_linter/src/rules/fastapi/rules/fastapi_redundant_response_model.rs +++ b/crates/ruff_linter/src/rules/fastapi/rules/fastapi_redundant_response_model.rs @@ -59,6 +59,7 @@ use crate::{AlwaysFixableViolation, Fix}; /// return item /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct FastApiRedundantResponseModel; impl AlwaysFixableViolation for FastApiRedundantResponseModel { diff --git a/crates/ruff_linter/src/rules/fastapi/rules/fastapi_unused_path_parameter.rs b/crates/ruff_linter/src/rules/fastapi/rules/fastapi_unused_path_parameter.rs index 1dda686c009af9..92a04f11e55165 100644 --- a/crates/ruff_linter/src/rules/fastapi/rules/fastapi_unused_path_parameter.rs +++ b/crates/ruff_linter/src/rules/fastapi/rules/fastapi_unused_path_parameter.rs @@ -64,6 +64,7 @@ use crate::{FixAvailability, Violation}; /// This rule's fix is marked as unsafe, as modifying a function signature can /// change the behavior of the code. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct FastApiUnusedPathParameter { arg_name: String, function_name: String, diff --git a/crates/ruff_linter/src/rules/flake8_2020/rules/compare.rs b/crates/ruff_linter/src/rules/flake8_2020/rules/compare.rs index 12c18a2dd73cea..0fb5e5ce8de81c 100644 --- a/crates/ruff_linter/src/rules/flake8_2020/rules/compare.rs +++ b/crates/ruff_linter/src/rules/flake8_2020/rules/compare.rs @@ -41,6 +41,7 @@ use crate::rules::flake8_2020::helpers::is_sys; /// - [Python documentation: `sys.version`](https://docs.python.org/3/library/sys.html#sys.version) /// - [Python documentation: `sys.version_info`](https://docs.python.org/3/library/sys.html#sys.version_info) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.113")] pub(crate) struct SysVersionCmpStr3; impl Violation for SysVersionCmpStr3 { @@ -91,6 +92,7 @@ impl Violation for SysVersionCmpStr3 { /// - [Python documentation: `sys.version`](https://docs.python.org/3/library/sys.html#sys.version) /// - [Python documentation: `sys.version_info`](https://docs.python.org/3/library/sys.html#sys.version_info) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.113")] pub(crate) struct SysVersionInfo0Eq3 { eq: bool, } @@ -137,6 +139,7 @@ impl Violation for SysVersionInfo0Eq3 { /// - [Python documentation: `sys.version`](https://docs.python.org/3/library/sys.html#sys.version) /// - [Python documentation: `sys.version_info`](https://docs.python.org/3/library/sys.html#sys.version_info) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.113")] pub(crate) struct SysVersionInfo1CmpInt; impl Violation for SysVersionInfo1CmpInt { @@ -179,6 +182,7 @@ impl Violation for SysVersionInfo1CmpInt { /// - [Python documentation: `sys.version`](https://docs.python.org/3/library/sys.html#sys.version) /// - [Python documentation: `sys.version_info`](https://docs.python.org/3/library/sys.html#sys.version_info) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.113")] pub(crate) struct SysVersionInfoMinorCmpInt; impl Violation for SysVersionInfoMinorCmpInt { @@ -222,6 +226,7 @@ impl Violation for SysVersionInfoMinorCmpInt { /// - [Python documentation: `sys.version`](https://docs.python.org/3/library/sys.html#sys.version) /// - [Python documentation: `sys.version_info`](https://docs.python.org/3/library/sys.html#sys.version_info) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.113")] pub(crate) struct SysVersionCmpStr10; impl Violation for SysVersionCmpStr10 { diff --git a/crates/ruff_linter/src/rules/flake8_2020/rules/name_or_attribute.rs b/crates/ruff_linter/src/rules/flake8_2020/rules/name_or_attribute.rs index e310dd24b58800..10fc95a7c46a77 100644 --- a/crates/ruff_linter/src/rules/flake8_2020/rules/name_or_attribute.rs +++ b/crates/ruff_linter/src/rules/flake8_2020/rules/name_or_attribute.rs @@ -36,6 +36,7 @@ use crate::checkers::ast::Checker; /// - [Six documentation: `six.PY2`](https://six.readthedocs.io/#six.PY2) /// - [Six documentation: `six.PY3`](https://six.readthedocs.io/#six.PY3) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.113")] pub(crate) struct SixPY3; impl Violation for SixPY3 { diff --git a/crates/ruff_linter/src/rules/flake8_2020/rules/subscript.rs b/crates/ruff_linter/src/rules/flake8_2020/rules/subscript.rs index 5b5d4d6e00b2a7..591b8a529c62ed 100644 --- a/crates/ruff_linter/src/rules/flake8_2020/rules/subscript.rs +++ b/crates/ruff_linter/src/rules/flake8_2020/rules/subscript.rs @@ -38,6 +38,7 @@ use crate::rules::flake8_2020::helpers::is_sys; /// - [Python documentation: `sys.version`](https://docs.python.org/3/library/sys.html#sys.version) /// - [Python documentation: `sys.version_info`](https://docs.python.org/3/library/sys.html#sys.version_info) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.113")] pub(crate) struct SysVersionSlice3; impl Violation for SysVersionSlice3 { @@ -78,6 +79,7 @@ impl Violation for SysVersionSlice3 { /// - [Python documentation: `sys.version`](https://docs.python.org/3/library/sys.html#sys.version) /// - [Python documentation: `sys.version_info`](https://docs.python.org/3/library/sys.html#sys.version_info) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.113")] pub(crate) struct SysVersion2; impl Violation for SysVersion2 { @@ -118,6 +120,7 @@ impl Violation for SysVersion2 { /// - [Python documentation: `sys.version`](https://docs.python.org/3/library/sys.html#sys.version) /// - [Python documentation: `sys.version_info`](https://docs.python.org/3/library/sys.html#sys.version_info) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.113")] pub(crate) struct SysVersion0; impl Violation for SysVersion0 { @@ -158,6 +161,7 @@ impl Violation for SysVersion0 { /// - [Python documentation: `sys.version`](https://docs.python.org/3/library/sys.html#sys.version) /// - [Python documentation: `sys.version_info`](https://docs.python.org/3/library/sys.html#sys.version_info) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.113")] pub(crate) struct SysVersionSlice1; impl Violation for SysVersionSlice1 { diff --git a/crates/ruff_linter/src/rules/flake8_annotations/rules/definition.rs b/crates/ruff_linter/src/rules/flake8_annotations/rules/definition.rs index b0d78bb41703c5..a70659f99e105a 100644 --- a/crates/ruff_linter/src/rules/flake8_annotations/rules/definition.rs +++ b/crates/ruff_linter/src/rules/flake8_annotations/rules/definition.rs @@ -38,6 +38,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## Options /// - `lint.flake8-annotations.suppress-dummy-args` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.105")] pub(crate) struct MissingTypeFunctionArgument { name: String, } @@ -73,6 +74,7 @@ impl Violation for MissingTypeFunctionArgument { /// ## Options /// - `lint.flake8-annotations.suppress-dummy-args` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.105")] pub(crate) struct MissingTypeArgs { name: String, } @@ -108,6 +110,7 @@ impl Violation for MissingTypeArgs { /// ## Options /// - `lint.flake8-annotations.suppress-dummy-args` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.105")] pub(crate) struct MissingTypeKwargs { name: String, } @@ -149,6 +152,7 @@ impl Violation for MissingTypeKwargs { /// ``` #[derive(ViolationMetadata)] #[deprecated(note = "ANN101 has been removed")] +#[violation_metadata(removed_since = "0.8.0")] pub(crate) struct MissingTypeSelf; #[expect(deprecated)] @@ -193,6 +197,7 @@ impl Violation for MissingTypeSelf { /// ``` #[derive(ViolationMetadata)] #[deprecated(note = "ANN102 has been removed")] +#[violation_metadata(removed_since = "0.8.0")] pub(crate) struct MissingTypeCls; #[expect(deprecated)] @@ -236,6 +241,7 @@ impl Violation for MissingTypeCls { /// /// - `lint.typing-extensions` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.105")] pub(crate) struct MissingReturnTypeUndocumentedPublicFunction { name: String, annotation: Option, @@ -289,6 +295,7 @@ impl Violation for MissingReturnTypeUndocumentedPublicFunction { /// /// - `lint.typing-extensions` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.105")] pub(crate) struct MissingReturnTypePrivateFunction { name: String, annotation: Option, @@ -345,6 +352,7 @@ impl Violation for MissingReturnTypePrivateFunction { /// self.x = x /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.105")] pub(crate) struct MissingReturnTypeSpecialMethod { name: String, annotation: Option, @@ -392,6 +400,7 @@ impl Violation for MissingReturnTypeSpecialMethod { /// return 1 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.105")] pub(crate) struct MissingReturnTypeStaticMethod { name: String, annotation: Option, @@ -439,6 +448,7 @@ impl Violation for MissingReturnTypeStaticMethod { /// return 1 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.105")] pub(crate) struct MissingReturnTypeClassMethod { name: String, annotation: Option, @@ -508,6 +518,7 @@ impl Violation for MissingReturnTypeClassMethod { /// - [Python documentation: `typing.Any`](https://docs.python.org/3/library/typing.html#typing.Any) /// - [Mypy documentation: The Any type](https://mypy.readthedocs.io/en/stable/kinds_of_types.html#the-any-type) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.108")] pub(crate) struct AnyType { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_async/rules/async_busy_wait.rs b/crates/ruff_linter/src/rules/flake8_async/rules/async_busy_wait.rs index 9b4fab75c4a203..3cbb3e992b5cb1 100644 --- a/crates/ruff_linter/src/rules/flake8_async/rules/async_busy_wait.rs +++ b/crates/ruff_linter/src/rules/flake8_async/rules/async_busy_wait.rs @@ -42,6 +42,7 @@ use crate::rules::flake8_async::helpers::AsyncModule; /// - [`anyio` events](https://anyio.readthedocs.io/en/latest/api.html#anyio.Event) /// - [`trio` events](https://trio.readthedocs.io/en/latest/reference-core.html#trio.Event) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct AsyncBusyWait { module: AsyncModule, } diff --git a/crates/ruff_linter/src/rules/flake8_async/rules/async_function_with_timeout.rs b/crates/ruff_linter/src/rules/flake8_async/rules/async_function_with_timeout.rs index 74c19a734a6884..0593f2e1e8e4c3 100644 --- a/crates/ruff_linter/src/rules/flake8_async/rules/async_function_with_timeout.rs +++ b/crates/ruff_linter/src/rules/flake8_async/rules/async_function_with_timeout.rs @@ -65,6 +65,7 @@ use ruff_python_ast::PythonVersion; /// /// ["structured concurrency"]: https://vorpus.org/blog/some-thoughts-on-asynchronous-api-design-in-a-post-asyncawait-world/#timeouts-and-cancellation #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct AsyncFunctionWithTimeout { module: AsyncModule, } diff --git a/crates/ruff_linter/src/rules/flake8_async/rules/async_zero_sleep.rs b/crates/ruff_linter/src/rules/flake8_async/rules/async_zero_sleep.rs index ec4a70d2669aaf..aee5788ae40796 100644 --- a/crates/ruff_linter/src/rules/flake8_async/rules/async_zero_sleep.rs +++ b/crates/ruff_linter/src/rules/flake8_async/rules/async_zero_sleep.rs @@ -49,6 +49,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct AsyncZeroSleep { module: AsyncModule, } diff --git a/crates/ruff_linter/src/rules/flake8_async/rules/blocking_http_call.rs b/crates/ruff_linter/src/rules/flake8_async/rules/blocking_http_call.rs index b6e9d045ad4dda..7f68504da445d5 100644 --- a/crates/ruff_linter/src/rules/flake8_async/rules/blocking_http_call.rs +++ b/crates/ruff_linter/src/rules/flake8_async/rules/blocking_http_call.rs @@ -38,6 +38,7 @@ use crate::checkers::ast::Checker; /// ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct BlockingHttpCallInAsyncFunction; impl Violation for BlockingHttpCallInAsyncFunction { diff --git a/crates/ruff_linter/src/rules/flake8_async/rules/blocking_http_call_httpx.rs b/crates/ruff_linter/src/rules/flake8_async/rules/blocking_http_call_httpx.rs index e46905774e3098..ee36eb4bd4706e 100644 --- a/crates/ruff_linter/src/rules/flake8_async/rules/blocking_http_call_httpx.rs +++ b/crates/ruff_linter/src/rules/flake8_async/rules/blocking_http_call_httpx.rs @@ -37,6 +37,7 @@ use crate::checkers::ast::Checker; /// response = await client.get(...) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.12.11")] pub(crate) struct BlockingHttpCallHttpxInAsyncFunction { name: String, call: String, diff --git a/crates/ruff_linter/src/rules/flake8_async/rules/blocking_input.rs b/crates/ruff_linter/src/rules/flake8_async/rules/blocking_input.rs index 3c5a70f92e760d..c4c2cc85d616c8 100644 --- a/crates/ruff_linter/src/rules/flake8_async/rules/blocking_input.rs +++ b/crates/ruff_linter/src/rules/flake8_async/rules/blocking_input.rs @@ -33,6 +33,7 @@ use crate::checkers::ast::Checker; /// username = await loop.run_in_executor(None, input, "Username:") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.12.12")] pub(crate) struct BlockingInputInAsyncFunction; impl Violation for BlockingInputInAsyncFunction { diff --git a/crates/ruff_linter/src/rules/flake8_async/rules/blocking_open_call.rs b/crates/ruff_linter/src/rules/flake8_async/rules/blocking_open_call.rs index daf84df349ed1f..0b1427c78194f3 100644 --- a/crates/ruff_linter/src/rules/flake8_async/rules/blocking_open_call.rs +++ b/crates/ruff_linter/src/rules/flake8_async/rules/blocking_open_call.rs @@ -34,6 +34,7 @@ use crate::checkers::ast::Checker; /// contents = await f.read() /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct BlockingOpenCallInAsyncFunction; impl Violation for BlockingOpenCallInAsyncFunction { diff --git a/crates/ruff_linter/src/rules/flake8_async/rules/blocking_path_methods.rs b/crates/ruff_linter/src/rules/flake8_async/rules/blocking_path_methods.rs index 14827c5b43d200..c158e4a3096bce 100644 --- a/crates/ruff_linter/src/rules/flake8_async/rules/blocking_path_methods.rs +++ b/crates/ruff_linter/src/rules/flake8_async/rules/blocking_path_methods.rs @@ -47,6 +47,7 @@ use ruff_text_size::Ranged; /// new_path = os.path.join("/tmp/src/", path) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.13.2")] pub(crate) struct BlockingPathMethodInAsyncFunction { path_library: String, } diff --git a/crates/ruff_linter/src/rules/flake8_async/rules/blocking_process_invocation.rs b/crates/ruff_linter/src/rules/flake8_async/rules/blocking_process_invocation.rs index 2995ab0e3ce556..8ea20eb2b03d3d 100644 --- a/crates/ruff_linter/src/rules/flake8_async/rules/blocking_process_invocation.rs +++ b/crates/ruff_linter/src/rules/flake8_async/rules/blocking_process_invocation.rs @@ -37,6 +37,7 @@ use crate::checkers::ast::Checker; /// asyncio.create_subprocess_shell(cmd) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct CreateSubprocessInAsyncFunction; impl Violation for CreateSubprocessInAsyncFunction { @@ -76,6 +77,7 @@ impl Violation for CreateSubprocessInAsyncFunction { /// asyncio.create_subprocess_shell(cmd) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct RunProcessInAsyncFunction; impl Violation for RunProcessInAsyncFunction { @@ -120,6 +122,7 @@ impl Violation for RunProcessInAsyncFunction { /// await asyncio.loop.run_in_executor(None, wait_for_process) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct WaitForProcessInAsyncFunction; impl Violation for WaitForProcessInAsyncFunction { diff --git a/crates/ruff_linter/src/rules/flake8_async/rules/blocking_sleep.rs b/crates/ruff_linter/src/rules/flake8_async/rules/blocking_sleep.rs index a3ef530bc0761d..a06ed76f6c0003 100644 --- a/crates/ruff_linter/src/rules/flake8_async/rules/blocking_sleep.rs +++ b/crates/ruff_linter/src/rules/flake8_async/rules/blocking_sleep.rs @@ -35,6 +35,7 @@ use crate::checkers::ast::Checker; /// await asyncio.sleep(1) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct BlockingSleepInAsyncFunction; impl Violation for BlockingSleepInAsyncFunction { diff --git a/crates/ruff_linter/src/rules/flake8_async/rules/cancel_scope_no_checkpoint.rs b/crates/ruff_linter/src/rules/flake8_async/rules/cancel_scope_no_checkpoint.rs index 80d91019480e11..6eedc055144470 100644 --- a/crates/ruff_linter/src/rules/flake8_async/rules/cancel_scope_no_checkpoint.rs +++ b/crates/ruff_linter/src/rules/flake8_async/rules/cancel_scope_no_checkpoint.rs @@ -45,6 +45,7 @@ use crate::rules::flake8_async::helpers::MethodName; /// - [`anyio` timeouts](https://anyio.readthedocs.io/en/stable/cancellation.html) /// - [`trio` timeouts](https://trio.readthedocs.io/en/stable/reference-core.html#cancellation-and-timeouts) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.269")] pub(crate) struct CancelScopeNoCheckpoint { method_name: MethodName, } diff --git a/crates/ruff_linter/src/rules/flake8_async/rules/long_sleep_not_forever.rs b/crates/ruff_linter/src/rules/flake8_async/rules/long_sleep_not_forever.rs index 8680dce16baf97..e64e9644a38d32 100644 --- a/crates/ruff_linter/src/rules/flake8_async/rules/long_sleep_not_forever.rs +++ b/crates/ruff_linter/src/rules/flake8_async/rules/long_sleep_not_forever.rs @@ -39,6 +39,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// /// This fix is marked as unsafe as it changes program behavior. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.13.0")] pub(crate) struct LongSleepNotForever { module: AsyncModule, } diff --git a/crates/ruff_linter/src/rules/flake8_async/rules/sync_call.rs b/crates/ruff_linter/src/rules/flake8_async/rules/sync_call.rs index dc4e40e68e0a14..48a8f573a2e9ee 100644 --- a/crates/ruff_linter/src/rules/flake8_async/rules/sync_call.rs +++ b/crates/ruff_linter/src/rules/flake8_async/rules/sync_call.rs @@ -38,6 +38,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// This rule's fix is marked as unsafe, as adding an `await` to a function /// call changes its semantics and runtime behavior. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct TrioSyncCall { method_name: MethodName, } diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/assert_used.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/assert_used.rs index 1366cb7ac7981b..606630bccb5fe3 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/assert_used.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/assert_used.rs @@ -33,6 +33,7 @@ use crate::checkers::ast::Checker; /// raise ValueError("Expected positive value.") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.116")] pub(crate) struct Assert; impl Violation for Assert { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/bad_file_permissions.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/bad_file_permissions.rs index dab899b43aa01d..511c7b43414681 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/bad_file_permissions.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/bad_file_permissions.rs @@ -35,6 +35,7 @@ use crate::checkers::ast::Checker; /// - [Python documentation: `stat`](https://docs.python.org/3/library/stat.html) /// - [Common Weakness Enumeration: CWE-732](https://cwe.mitre.org/data/definitions/732.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.211")] pub(crate) struct BadFilePermissions { reason: Reason, } diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/django_extra.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/django_extra.rs index 0ad0de23d54bba..3c33e38e9f4f7f 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/django_extra.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/django_extra.rs @@ -34,6 +34,7 @@ use crate::checkers::ast::Checker; /// - [Django documentation: SQL injection protection](https://docs.djangoproject.com/en/dev/topics/security/#sql-injection-protection) /// - [Common Weakness Enumeration: CWE-89](https://cwe.mitre.org/data/definitions/89.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct DjangoExtra; impl Violation for DjangoExtra { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/django_raw_sql.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/django_raw_sql.rs index 13c3556d23e144..16611b8e38b482 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/django_raw_sql.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/django_raw_sql.rs @@ -25,6 +25,7 @@ use crate::checkers::ast::Checker; /// - [Django documentation: SQL injection protection](https://docs.djangoproject.com/en/dev/topics/security/#sql-injection-protection) /// - [Common Weakness Enumeration: CWE-89](https://cwe.mitre.org/data/definitions/89.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct DjangoRawSql; impl Violation for DjangoRawSql { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/exec_used.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/exec_used.rs index f66347d6f40051..442e322b93593c 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/exec_used.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/exec_used.rs @@ -22,6 +22,7 @@ use crate::checkers::ast::Checker; /// - [Python documentation: `exec`](https://docs.python.org/3/library/functions.html#exec) /// - [Common Weakness Enumeration: CWE-78](https://cwe.mitre.org/data/definitions/78.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.116")] pub(crate) struct ExecBuiltin; impl Violation for ExecBuiltin { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/flask_debug_true.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/flask_debug_true.rs index 9f147c6eec50ae..df51a3359904cb 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/flask_debug_true.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/flask_debug_true.rs @@ -39,6 +39,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Flask documentation: Debug Mode](https://flask.palletsprojects.com/en/latest/quickstart/#debug-mode) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct FlaskDebugTrue; impl Violation for FlaskDebugTrue { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_bind_all_interfaces.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_bind_all_interfaces.rs index 843dd5c3b61436..91994a042eee7b 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_bind_all_interfaces.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_bind_all_interfaces.rs @@ -27,6 +27,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Common Weakness Enumeration: CWE-200](https://cwe.mitre.org/data/definitions/200.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.116")] pub(crate) struct HardcodedBindAllInterfaces; impl Violation for HardcodedBindAllInterfaces { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_password_default.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_password_default.rs index 872ef4b7a9ae4b..db23388252a71e 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_password_default.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_password_default.rs @@ -39,6 +39,7 @@ use crate::rules::flake8_bandit::helpers::{matches_password_name, string_literal /// ## References /// - [Common Weakness Enumeration: CWE-259](https://cwe.mitre.org/data/definitions/259.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.116")] pub(crate) struct HardcodedPasswordDefault { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_password_func_arg.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_password_func_arg.rs index f3cf884655cb1a..995c80e656ea8c 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_password_func_arg.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_password_func_arg.rs @@ -35,6 +35,7 @@ use crate::rules::flake8_bandit::helpers::{matches_password_name, string_literal /// ## References /// - [Common Weakness Enumeration: CWE-259](https://cwe.mitre.org/data/definitions/259.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.116")] pub(crate) struct HardcodedPasswordFuncArg { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_password_string.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_password_string.rs index 37113768017172..e3c0b27ed6c87c 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_password_string.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_password_string.rs @@ -34,6 +34,7 @@ use crate::rules::flake8_bandit::helpers::{matches_password_name, string_literal /// ## References /// - [Common Weakness Enumeration: CWE-259](https://cwe.mitre.org/data/definitions/259.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.116")] pub(crate) struct HardcodedPasswordString { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_sql_expression.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_sql_expression.rs index 76baa9c47988a4..34134d96c71c9c 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_sql_expression.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_sql_expression.rs @@ -45,6 +45,7 @@ static SQL_REGEX: LazyLock = LazyLock::new(|| { /// - [B608: Test for SQL injection](https://bandit.readthedocs.io/en/latest/plugins/b608_hardcoded_sql_expressions.html) /// - [psycopg3: Server-side binding](https://www.psycopg.org/psycopg3/docs/basic/from_pg2.html#server-side-binding) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.245")] pub(crate) struct HardcodedSQLExpression; impl Violation for HardcodedSQLExpression { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_tmp_directory.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_tmp_directory.rs index 77893289e3f831..055f16a5f63ea7 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_tmp_directory.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/hardcoded_tmp_directory.rs @@ -40,6 +40,7 @@ use crate::checkers::ast::Checker; /// - [Common Weakness Enumeration: CWE-379](https://cwe.mitre.org/data/definitions/379.html) /// - [Python documentation: `tempfile`](https://docs.python.org/3/library/tempfile.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.211")] pub(crate) struct HardcodedTempFile { string: String, } diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/hashlib_insecure_hash_functions.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/hashlib_insecure_hash_functions.rs index a64f66a399dd1a..9268e39e2febfb 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/hashlib_insecure_hash_functions.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/hashlib_insecure_hash_functions.rs @@ -74,6 +74,7 @@ use crate::rules::flake8_bandit::helpers::string_literal; /// - [Common Weakness Enumeration: CWE-328](https://cwe.mitre.org/data/definitions/328.html) /// - [Common Weakness Enumeration: CWE-916](https://cwe.mitre.org/data/definitions/916.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.212")] pub(crate) struct HashlibInsecureHashFunction { library: String, string: String, diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/jinja2_autoescape_false.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/jinja2_autoescape_false.rs index 475a24dfaea2cf..17aca8105f1f7c 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/jinja2_autoescape_false.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/jinja2_autoescape_false.rs @@ -35,6 +35,7 @@ use crate::checkers::ast::Checker; /// - [Jinja documentation: API](https://jinja.palletsprojects.com/en/latest/api/#autoescaping) /// - [Common Weakness Enumeration: CWE-94](https://cwe.mitre.org/data/definitions/94.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.220")] pub(crate) struct Jinja2AutoescapeFalse { value: bool, } diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/logging_config_insecure_listen.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/logging_config_insecure_listen.rs index 16d9b307b59cb4..54ad45d6452da6 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/logging_config_insecure_listen.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/logging_config_insecure_listen.rs @@ -25,6 +25,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `logging.config.listen()`](https://docs.python.org/3/library/logging.config.html#logging.config.listen) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct LoggingConfigInsecureListen; impl Violation for LoggingConfigInsecureListen { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/mako_templates.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/mako_templates.rs index b62a0b39e7411d..32f695263cad95 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/mako_templates.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/mako_templates.rs @@ -33,6 +33,7 @@ use crate::checkers::ast::Checker; /// - [OpenStack security: Cross site scripting XSS](https://security.openstack.org/guidelines/dg_cross-site-scripting-xss.html) /// - [Common Weakness Enumeration: CWE-80](https://cwe.mitre.org/data/definitions/80.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct MakoTemplates; impl Violation for MakoTemplates { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/paramiko_calls.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/paramiko_calls.rs index 8eb8ec0bfc1ae0..ea85c1ea20fefa 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/paramiko_calls.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/paramiko_calls.rs @@ -26,6 +26,7 @@ use crate::checkers::ast::Checker; /// - [Common Weakness Enumeration: CWE-78](https://cwe.mitre.org/data/definitions/78.html) /// - [Paramiko documentation: `SSHClient.exec_command()`](https://docs.paramiko.org/en/stable/api/client.html#paramiko.client.SSHClient.exec_command) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.270")] pub(crate) struct ParamikoCall; impl Violation for ParamikoCall { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/request_with_no_cert_validation.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/request_with_no_cert_validation.rs index c22bf55168c37e..dadd8bde4010a5 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/request_with_no_cert_validation.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/request_with_no_cert_validation.rs @@ -31,6 +31,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Common Weakness Enumeration: CWE-295](https://cwe.mitre.org/data/definitions/295.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.213")] pub(crate) struct RequestWithNoCertValidation { string: String, } diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/request_without_timeout.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/request_without_timeout.rs index b6d3352177c518..f9ae386b02f5f4 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/request_without_timeout.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/request_without_timeout.rs @@ -33,6 +33,7 @@ use crate::checkers::ast::Checker; /// - [Requests documentation: Timeouts](https://requests.readthedocs.io/en/latest/user/advanced/#timeouts) /// - [httpx documentation: Timeouts](https://www.python-httpx.org/advanced/timeouts/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.213")] pub(crate) struct RequestWithoutTimeout { implicit: bool, module: String, diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/shell_injection.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/shell_injection.rs index 1e3a1c6fd1ed2d..038d1492bc3e13 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/shell_injection.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/shell_injection.rs @@ -37,6 +37,7 @@ use crate::{ /// - [Python documentation: `subprocess` — Subprocess management](https://docs.python.org/3/library/subprocess.html) /// - [Common Weakness Enumeration: CWE-78](https://cwe.mitre.org/data/definitions/78.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.262")] pub(crate) struct SubprocessPopenWithShellEqualsTrue { safety: Safety, is_exact: bool, @@ -79,6 +80,7 @@ impl Violation for SubprocessPopenWithShellEqualsTrue { /// /// [#4045]: https://github.com/astral-sh/ruff/issues/4045 #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.262")] pub(crate) struct SubprocessWithoutShellEqualsTrue; impl Violation for SubprocessWithoutShellEqualsTrue { @@ -117,6 +119,7 @@ impl Violation for SubprocessWithoutShellEqualsTrue { /// ## References /// - [Python documentation: Security Considerations](https://docs.python.org/3/library/subprocess.html#security-considerations) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.262")] pub(crate) struct CallWithShellEqualsTrue { is_exact: bool, } @@ -169,6 +172,7 @@ impl Violation for CallWithShellEqualsTrue { /// ## References /// - [Python documentation: `subprocess`](https://docs.python.org/3/library/subprocess.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.262")] pub(crate) struct StartProcessWithAShell { safety: Safety, } @@ -210,6 +214,7 @@ impl Violation for StartProcessWithAShell { /// /// [S605]: https://docs.astral.sh/ruff/rules/start-process-with-a-shell #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.262")] pub(crate) struct StartProcessWithNoShell; impl Violation for StartProcessWithNoShell { @@ -245,6 +250,7 @@ impl Violation for StartProcessWithNoShell { /// - [Python documentation: `subprocess.Popen()`](https://docs.python.org/3/library/subprocess.html#subprocess.Popen) /// - [Common Weakness Enumeration: CWE-426](https://cwe.mitre.org/data/definitions/426.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.262")] pub(crate) struct StartProcessWithPartialPath; impl Violation for StartProcessWithPartialPath { @@ -278,6 +284,7 @@ impl Violation for StartProcessWithPartialPath { /// ## References /// - [Common Weakness Enumeration: CWE-78](https://cwe.mitre.org/data/definitions/78.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.271")] pub(crate) struct UnixCommandWildcardInjection; impl Violation for UnixCommandWildcardInjection { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/snmp_insecure_version.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/snmp_insecure_version.rs index c7e6affb4837db..b490efdfc585d8 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/snmp_insecure_version.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/snmp_insecure_version.rs @@ -31,6 +31,7 @@ use crate::checkers::ast::Checker; /// - [Cybersecurity and Infrastructure Security Agency (CISA): Alert TA17-156A](https://www.cisa.gov/news-events/alerts/2017/06/05/reducing-risk-snmp-abuse) /// - [Common Weakness Enumeration: CWE-319](https://cwe.mitre.org/data/definitions/319.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.218")] pub(crate) struct SnmpInsecureVersion; impl Violation for SnmpInsecureVersion { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/snmp_weak_cryptography.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/snmp_weak_cryptography.rs index f7453cae1e2adf..9f067e2c4e5a05 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/snmp_weak_cryptography.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/snmp_weak_cryptography.rs @@ -29,6 +29,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Common Weakness Enumeration: CWE-319](https://cwe.mitre.org/data/definitions/319.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.218")] pub(crate) struct SnmpWeakCryptography; impl Violation for SnmpWeakCryptography { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/ssh_no_host_key_verification.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/ssh_no_host_key_verification.rs index b09cd8e4aceb94..626da50782cd4c 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/ssh_no_host_key_verification.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/ssh_no_host_key_verification.rs @@ -34,6 +34,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Paramiko documentation: set_missing_host_key_policy](https://docs.paramiko.org/en/latest/api/client.html#paramiko.client.SSHClient.set_missing_host_key_policy) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct SSHNoHostKeyVerification; impl Violation for SSHNoHostKeyVerification { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/ssl_insecure_version.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/ssl_insecure_version.rs index d022d1711ad193..a423fe52330edf 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/ssl_insecure_version.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/ssl_insecure_version.rs @@ -35,6 +35,7 @@ use crate::checkers::ast::Checker; /// ssl.wrap_socket(ssl_version=ssl.PROTOCOL_TLSv1_2) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct SslInsecureVersion { protocol: String, } diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/ssl_with_bad_defaults.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/ssl_with_bad_defaults.rs index 1acb8d4ef4e023..4d8f8f30453f20 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/ssl_with_bad_defaults.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/ssl_with_bad_defaults.rs @@ -35,6 +35,7 @@ use crate::checkers::ast::Checker; /// def func(version=ssl.PROTOCOL_TLSv1_2): ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct SslWithBadDefaults { protocol: String, } diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/ssl_with_no_version.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/ssl_with_no_version.rs index 20cea65ce7a5c4..a5cfccaf6cdb99 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/ssl_with_no_version.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/ssl_with_no_version.rs @@ -26,6 +26,7 @@ use crate::checkers::ast::Checker; /// ssl.wrap_socket(ssl_version=ssl.PROTOCOL_TLSv1_2) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct SslWithNoVersion; impl Violation for SslWithNoVersion { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/suspicious_function_call.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/suspicious_function_call.rs index fed37def9ad930..0cc1ebe4edfc5c 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/suspicious_function_call.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/suspicious_function_call.rs @@ -51,6 +51,7 @@ use crate::preview::is_suspicious_function_reference_enabled; /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousPickleUsage; impl Violation for SuspiciousPickleUsage { @@ -100,6 +101,7 @@ impl Violation for SuspiciousPickleUsage { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousMarshalUsage; impl Violation for SuspiciousMarshalUsage { @@ -150,6 +152,7 @@ impl Violation for SuspiciousMarshalUsage { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousInsecureHashUsage; impl Violation for SuspiciousInsecureHashUsage { @@ -192,6 +195,7 @@ impl Violation for SuspiciousInsecureHashUsage { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousInsecureCipherUsage; impl Violation for SuspiciousInsecureCipherUsage { @@ -236,6 +240,7 @@ impl Violation for SuspiciousInsecureCipherUsage { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousInsecureCipherModeUsage; impl Violation for SuspiciousInsecureCipherModeUsage { @@ -285,6 +290,7 @@ impl Violation for SuspiciousInsecureCipherModeUsage { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousMktempUsage; impl Violation for SuspiciousMktempUsage { @@ -325,6 +331,7 @@ impl Violation for SuspiciousMktempUsage { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousEvalUsage; impl Violation for SuspiciousEvalUsage { @@ -378,6 +385,7 @@ impl Violation for SuspiciousEvalUsage { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousMarkSafeUsage; impl Violation for SuspiciousMarkSafeUsage { @@ -430,6 +438,7 @@ impl Violation for SuspiciousMarkSafeUsage { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousURLOpenUsage; impl Violation for SuspiciousURLOpenUsage { @@ -472,6 +481,7 @@ impl Violation for SuspiciousURLOpenUsage { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousNonCryptographicRandomUsage; impl Violation for SuspiciousNonCryptographicRandomUsage { @@ -516,6 +526,7 @@ impl Violation for SuspiciousNonCryptographicRandomUsage { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousXMLCElementTreeUsage; impl Violation for SuspiciousXMLCElementTreeUsage { @@ -560,6 +571,7 @@ impl Violation for SuspiciousXMLCElementTreeUsage { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousXMLElementTreeUsage; impl Violation for SuspiciousXMLElementTreeUsage { @@ -604,6 +616,7 @@ impl Violation for SuspiciousXMLElementTreeUsage { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousXMLExpatReaderUsage; impl Violation for SuspiciousXMLExpatReaderUsage { @@ -648,6 +661,7 @@ impl Violation for SuspiciousXMLExpatReaderUsage { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousXMLExpatBuilderUsage; impl Violation for SuspiciousXMLExpatBuilderUsage { @@ -692,6 +706,7 @@ impl Violation for SuspiciousXMLExpatBuilderUsage { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousXMLSaxUsage; impl Violation for SuspiciousXMLSaxUsage { @@ -736,6 +751,7 @@ impl Violation for SuspiciousXMLSaxUsage { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousXMLMiniDOMUsage; impl Violation for SuspiciousXMLMiniDOMUsage { @@ -780,6 +796,7 @@ impl Violation for SuspiciousXMLMiniDOMUsage { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousXMLPullDOMUsage; impl Violation for SuspiciousXMLPullDOMUsage { @@ -821,6 +838,7 @@ impl Violation for SuspiciousXMLPullDOMUsage { /// [preview]: https://docs.astral.sh/ruff/preview/ /// [deprecated]: https://pypi.org/project/defusedxml/0.8.0rc2/#defusedxml-lxml #[derive(ViolationMetadata)] +#[violation_metadata(removed_since = "0.12.0")] pub(crate) struct SuspiciousXMLETreeUsage; impl Violation for SuspiciousXMLETreeUsage { @@ -867,6 +885,7 @@ impl Violation for SuspiciousXMLETreeUsage { /// [PEP 476]: https://peps.python.org/pep-0476/ /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousUnverifiedContextUsage; impl Violation for SuspiciousUnverifiedContextUsage { @@ -892,6 +911,7 @@ impl Violation for SuspiciousUnverifiedContextUsage { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousTelnetUsage; impl Violation for SuspiciousTelnetUsage { @@ -917,6 +937,7 @@ impl Violation for SuspiciousTelnetUsage { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct SuspiciousFTPLibUsage; impl Violation for SuspiciousFTPLibUsage { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/suspicious_imports.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/suspicious_imports.rs index f83087c43e08d9..acc978d0549ad0 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/suspicious_imports.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/suspicious_imports.rs @@ -25,6 +25,7 @@ use crate::checkers::ast::Checker; /// - [Python documentation: `telnetlib` - Telnet client](https://docs.python.org/3.12/library/telnetlib.html#module-telnetlib) /// - [PEP 594: `telnetlib`](https://peps.python.org/pep-0594/#telnetlib) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.12")] pub(crate) struct SuspiciousTelnetlibImport; impl Violation for SuspiciousTelnetlibImport { @@ -49,6 +50,7 @@ impl Violation for SuspiciousTelnetlibImport { /// ## References /// - [Python documentation: `ftplib` - FTP protocol client](https://docs.python.org/3/library/ftplib.html) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.12")] pub(crate) struct SuspiciousFtplibImport; impl Violation for SuspiciousFtplibImport { @@ -74,6 +76,7 @@ impl Violation for SuspiciousFtplibImport { /// ## References /// - [Python documentation: `pickle` — Python object serialization](https://docs.python.org/3/library/pickle.html) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.12")] pub(crate) struct SuspiciousPickleImport; impl Violation for SuspiciousPickleImport { @@ -95,6 +98,7 @@ impl Violation for SuspiciousPickleImport { /// import subprocess /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.12")] pub(crate) struct SuspiciousSubprocessImport; impl Violation for SuspiciousSubprocessImport { @@ -118,6 +122,7 @@ impl Violation for SuspiciousSubprocessImport { /// import xml.etree.cElementTree /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.12")] pub(crate) struct SuspiciousXmlEtreeImport; impl Violation for SuspiciousXmlEtreeImport { @@ -141,6 +146,7 @@ impl Violation for SuspiciousXmlEtreeImport { /// import xml.sax /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.12")] pub(crate) struct SuspiciousXmlSaxImport; impl Violation for SuspiciousXmlSaxImport { @@ -164,6 +170,7 @@ impl Violation for SuspiciousXmlSaxImport { /// import xml.dom.expatbuilder /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.12")] pub(crate) struct SuspiciousXmlExpatImport; impl Violation for SuspiciousXmlExpatImport { @@ -187,6 +194,7 @@ impl Violation for SuspiciousXmlExpatImport { /// import xml.dom.minidom /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.12")] pub(crate) struct SuspiciousXmlMinidomImport; impl Violation for SuspiciousXmlMinidomImport { @@ -210,6 +218,7 @@ impl Violation for SuspiciousXmlMinidomImport { /// import xml.dom.pulldom /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.12")] pub(crate) struct SuspiciousXmlPulldomImport; impl Violation for SuspiciousXmlPulldomImport { @@ -240,6 +249,7 @@ impl Violation for SuspiciousXmlPulldomImport { /// /// [deprecated]: https://github.com/tiran/defusedxml/blob/c7445887f5e1bcea470a16f61369d29870cfcfe1/README.md#defusedxmllxml #[derive(ViolationMetadata)] +#[violation_metadata(removed_since = "v0.3.0")] pub(crate) struct SuspiciousLxmlImport; impl Violation for SuspiciousLxmlImport { @@ -263,6 +273,7 @@ impl Violation for SuspiciousLxmlImport { /// import xmlrpc /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.12")] pub(crate) struct SuspiciousXmlrpcImport; impl Violation for SuspiciousXmlrpcImport { @@ -289,6 +300,7 @@ impl Violation for SuspiciousXmlrpcImport { /// ## References /// - [httpoxy website](https://httpoxy.org/) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.12")] pub(crate) struct SuspiciousHttpoxyImport; impl Violation for SuspiciousHttpoxyImport { @@ -314,6 +326,7 @@ impl Violation for SuspiciousHttpoxyImport { /// ## References /// - [Buffer Overflow Issue](https://github.com/pycrypto/pycrypto/issues/176) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.12")] pub(crate) struct SuspiciousPycryptoImport; impl Violation for SuspiciousPycryptoImport { @@ -339,6 +352,7 @@ impl Violation for SuspiciousPycryptoImport { /// ## References /// - [Buffer Overflow Issue](https://github.com/pycrypto/pycrypto/issues/176) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.12")] pub(crate) struct SuspiciousPyghmiImport; impl Violation for SuspiciousPyghmiImport { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/tarfile_unsafe_members.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/tarfile_unsafe_members.rs index 8e816ee21d770d..92d58e8448928a 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/tarfile_unsafe_members.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/tarfile_unsafe_members.rs @@ -38,6 +38,7 @@ use crate::checkers::ast::Checker; /// /// [PEP 706]: https://peps.python.org/pep-0706/#backporting-forward-compatibility #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct TarfileUnsafeMembers; impl Violation for TarfileUnsafeMembers { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/try_except_continue.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/try_except_continue.rs index 5bd463285315dd..85e7e4cdb607e1 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/try_except_continue.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/try_except_continue.rs @@ -45,6 +45,7 @@ use crate::rules::flake8_bandit::helpers::is_untyped_exception; /// - [Common Weakness Enumeration: CWE-703](https://cwe.mitre.org/data/definitions/703.html) /// - [Python documentation: `logging`](https://docs.python.org/3/library/logging.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.245")] pub(crate) struct TryExceptContinue; impl Violation for TryExceptContinue { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/try_except_pass.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/try_except_pass.rs index 56dcaff1e09e72..383f51f957f417 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/try_except_pass.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/try_except_pass.rs @@ -41,6 +41,7 @@ use crate::rules::flake8_bandit::helpers::is_untyped_exception; /// - [Common Weakness Enumeration: CWE-703](https://cwe.mitre.org/data/definitions/703.html) /// - [Python documentation: `logging`](https://docs.python.org/3/library/logging.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.237")] pub(crate) struct TryExceptPass; impl Violation for TryExceptPass { diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/unsafe_markup_use.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/unsafe_markup_use.rs index 25cd68d58b5044..7dd043ea1167a2 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/unsafe_markup_use.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/unsafe_markup_use.rs @@ -75,6 +75,7 @@ use crate::{checkers::ast::Checker, settings::LinterSettings}; /// [markupsafe-markup]: https://markupsafe.palletsprojects.com/en/stable/escaping/#markupsafe.Markup /// [flake8-markupsafe]: https://github.com/vmagamedov/flake8-markupsafe #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct UnsafeMarkupUse { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/unsafe_yaml_load.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/unsafe_yaml_load.rs index dae9564053fdef..593f5e01dab423 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/unsafe_yaml_load.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/unsafe_yaml_load.rs @@ -35,6 +35,7 @@ use crate::checkers::ast::Checker; /// - [PyYAML documentation: Loading YAML](https://pyyaml.org/wiki/PyYAMLDocumentation) /// - [Common Weakness Enumeration: CWE-20](https://cwe.mitre.org/data/definitions/20.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.212")] pub(crate) struct UnsafeYAMLLoad { pub loader: Option, } diff --git a/crates/ruff_linter/src/rules/flake8_bandit/rules/weak_cryptographic_key.rs b/crates/ruff_linter/src/rules/flake8_bandit/rules/weak_cryptographic_key.rs index 63b709fc32b44a..956d90f2ae2081 100644 --- a/crates/ruff_linter/src/rules/flake8_bandit/rules/weak_cryptographic_key.rs +++ b/crates/ruff_linter/src/rules/flake8_bandit/rules/weak_cryptographic_key.rs @@ -33,6 +33,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [CSRC: Transitioning the Use of Cryptographic Algorithms and Key Lengths](https://csrc.nist.gov/pubs/sp/800/131/a/r2/final) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct WeakCryptographicKey { cryptographic_key: CryptographicKey, } diff --git a/crates/ruff_linter/src/rules/flake8_blind_except/rules/blind_except.rs b/crates/ruff_linter/src/rules/flake8_blind_except/rules/blind_except.rs index ac512dee04e5cb..704b628abfa9cc 100644 --- a/crates/ruff_linter/src/rules/flake8_blind_except/rules/blind_except.rs +++ b/crates/ruff_linter/src/rules/flake8_blind_except/rules/blind_except.rs @@ -63,6 +63,7 @@ use crate::checkers::ast::Checker; /// - [Python documentation: Exception hierarchy](https://docs.python.org/3/library/exceptions.html#exception-hierarchy) /// - [PEP 8: Programming Recommendations on bare `except`](https://peps.python.org/pep-0008/#programming-recommendations) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.127")] pub(crate) struct BlindExcept { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_boolean_trap/rules/boolean_default_value_positional_argument.rs b/crates/ruff_linter/src/rules/flake8_boolean_trap/rules/boolean_default_value_positional_argument.rs index 84f47e1e961fe6..361f1df069b786 100644 --- a/crates/ruff_linter/src/rules/flake8_boolean_trap/rules/boolean_default_value_positional_argument.rs +++ b/crates/ruff_linter/src/rules/flake8_boolean_trap/rules/boolean_default_value_positional_argument.rs @@ -90,6 +90,7 @@ use crate::rules::flake8_boolean_trap::helpers::is_allowed_func_def; /// - [Python documentation: Calls](https://docs.python.org/3/reference/expressions.html#calls) /// - [_How to Avoid “The Boolean Trap”_ by Adam Johnson](https://adamj.eu/tech/2021/07/10/python-type-hints-how-to-avoid-the-boolean-trap/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.127")] pub(crate) struct BooleanDefaultValuePositionalArgument; impl Violation for BooleanDefaultValuePositionalArgument { diff --git a/crates/ruff_linter/src/rules/flake8_boolean_trap/rules/boolean_positional_value_in_call.rs b/crates/ruff_linter/src/rules/flake8_boolean_trap/rules/boolean_positional_value_in_call.rs index b3a97c1d9ab223..4a62e65923e035 100644 --- a/crates/ruff_linter/src/rules/flake8_boolean_trap/rules/boolean_positional_value_in_call.rs +++ b/crates/ruff_linter/src/rules/flake8_boolean_trap/rules/boolean_positional_value_in_call.rs @@ -42,6 +42,7 @@ use crate::rules::flake8_boolean_trap::helpers::allow_boolean_trap; /// - [Python documentation: Calls](https://docs.python.org/3/reference/expressions.html#calls) /// - [_How to Avoid “The Boolean Trap”_ by Adam Johnson](https://adamj.eu/tech/2021/07/10/python-type-hints-how-to-avoid-the-boolean-trap/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.127")] pub(crate) struct BooleanPositionalValueInCall; impl Violation for BooleanPositionalValueInCall { diff --git a/crates/ruff_linter/src/rules/flake8_boolean_trap/rules/boolean_type_hint_positional_argument.rs b/crates/ruff_linter/src/rules/flake8_boolean_trap/rules/boolean_type_hint_positional_argument.rs index 24dff35099b1ff..4bc72d0f267518 100644 --- a/crates/ruff_linter/src/rules/flake8_boolean_trap/rules/boolean_type_hint_positional_argument.rs +++ b/crates/ruff_linter/src/rules/flake8_boolean_trap/rules/boolean_type_hint_positional_argument.rs @@ -94,6 +94,7 @@ use crate::rules::flake8_boolean_trap::helpers::is_allowed_func_def; /// - [Python documentation: Calls](https://docs.python.org/3/reference/expressions.html#calls) /// - [_How to Avoid “The Boolean Trap”_ by Adam Johnson](https://adamj.eu/tech/2021/07/10/python-type-hints-how-to-avoid-the-boolean-trap/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.127")] pub(crate) struct BooleanTypeHintPositionalArgument; impl Violation for BooleanTypeHintPositionalArgument { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/abstract_base_class.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/abstract_base_class.rs index 2d14a917e723dc..2b57ee35e18421 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/abstract_base_class.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/abstract_base_class.rs @@ -54,6 +54,7 @@ use crate::registry::Rule; /// - [Python documentation: `abc`](https://docs.python.org/3/library/abc.html) /// - [Python documentation: `typing.ClassVar`](https://docs.python.org/3/library/typing.html#typing.ClassVar) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.118")] pub(crate) struct AbstractBaseClassWithoutAbstractMethod { name: String, } @@ -99,6 +100,7 @@ impl Violation for AbstractBaseClassWithoutAbstractMethod { /// ## References /// - [Python documentation: `abc`](https://docs.python.org/3/library/abc.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.118")] pub(crate) struct EmptyMethodWithoutAbstractDecorator { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/assert_false.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/assert_false.rs index d1ba8edcdb1644..d114cc24323e5f 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/assert_false.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/assert_false.rs @@ -35,6 +35,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: `assert`](https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.67")] pub(crate) struct AssertFalse; impl AlwaysFixableViolation for AssertFalse { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/assert_raises_exception.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/assert_raises_exception.rs index 9702cad266be81..5eab2482ecf4ee 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/assert_raises_exception.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/assert_raises_exception.rs @@ -29,6 +29,7 @@ use crate::checkers::ast::Checker; /// self.assertRaises(SomeSpecificException, foo) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.83")] pub(crate) struct AssertRaisesException { exception: ExceptionKind, } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/assignment_to_os_environ.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/assignment_to_os_environ.rs index b96a5d91fad532..f0ca244999620e 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/assignment_to_os_environ.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/assignment_to_os_environ.rs @@ -40,6 +40,7 @@ use crate::checkers::ast::Checker; /// - [Python documentation: `os.environ`](https://docs.python.org/3/library/os.html#os.environ) /// - [Python documentation: `subprocess.Popen`](https://docs.python.org/3/library/subprocess.html#subprocess.Popen) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.102")] pub(crate) struct AssignmentToOsEnviron; impl Violation for AssignmentToOsEnviron { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/batched_without_explicit_strict.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/batched_without_explicit_strict.rs index 78e29661b30fdb..4091b13c80cc51 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/batched_without_explicit_strict.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/batched_without_explicit_strict.rs @@ -49,6 +49,7 @@ use crate::{FixAvailability, Violation}; /// ## References /// - [Python documentation: `batched`](https://docs.python.org/3/library/itertools.html#batched) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct BatchedWithoutExplicitStrict; impl Violation for BatchedWithoutExplicitStrict { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/cached_instance_method.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/cached_instance_method.rs index 9849cdf81667ce..c059d9b5b92e04 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/cached_instance_method.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/cached_instance_method.rs @@ -63,6 +63,7 @@ use crate::checkers::ast::Checker; /// - [Python documentation: `functools.cache`](https://docs.python.org/3/library/functools.html#functools.cache) /// - [don't lru_cache methods!](https://www.youtube.com/watch?v=sVjtp6tGo0g) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.114")] pub(crate) struct CachedInstanceMethod; impl Violation for CachedInstanceMethod { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/class_as_data_structure.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/class_as_data_structure.rs index 1ed8395147f702..5a0e2025b43228 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/class_as_data_structure.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/class_as_data_structure.rs @@ -34,6 +34,7 @@ use ruff_python_ast::PythonVersion; /// y: float /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.9.0")] pub(crate) struct ClassAsDataStructure; impl Violation for ClassAsDataStructure { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/duplicate_exceptions.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/duplicate_exceptions.rs index 7747f07df78b17..04a0c3c552a3c7 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/duplicate_exceptions.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/duplicate_exceptions.rs @@ -40,6 +40,7 @@ use crate::{Edit, Fix}; /// ## References /// - [Python documentation: `except` clause](https://docs.python.org/3/reference/compound_stmts.html#except-clause) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.67")] pub(crate) struct DuplicateTryBlockException { name: String, is_star: bool, @@ -87,6 +88,7 @@ impl Violation for DuplicateTryBlockException { /// - [Python documentation: `except` clause](https://docs.python.org/3/reference/compound_stmts.html#except-clause) /// - [Python documentation: Exception hierarchy](https://docs.python.org/3/library/exceptions.html#exception-hierarchy) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.67")] pub(crate) struct DuplicateHandlerException { pub names: Vec, } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/duplicate_value.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/duplicate_value.rs index 643b2c0c5e0158..2d6c79e804e838 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/duplicate_value.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/duplicate_value.rs @@ -29,6 +29,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// {1, 2, 3} /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.271")] pub(crate) struct DuplicateValue { value: String, existing: String, diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/except_with_empty_tuple.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/except_with_empty_tuple.rs index d3f5aba2bbdf16..0609669a689d02 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/except_with_empty_tuple.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/except_with_empty_tuple.rs @@ -34,6 +34,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `except` clause](https://docs.python.org/3/reference/compound_stmts.html#except-clause) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.250")] pub(crate) struct ExceptWithEmptyTuple { is_star: bool, } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/except_with_non_exception_classes.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/except_with_non_exception_classes.rs index 66df64700d35d5..3da20df439a7f3 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/except_with_non_exception_classes.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/except_with_non_exception_classes.rs @@ -35,6 +35,7 @@ use crate::checkers::ast::Checker; /// - [Python documentation: `except` clause](https://docs.python.org/3/reference/compound_stmts.html#except-clause) /// - [Python documentation: Built-in Exceptions](https://docs.python.org/3/library/exceptions.html#built-in-exceptions) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.255")] pub(crate) struct ExceptWithNonExceptionClasses { is_star: bool, } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/f_string_docstring.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/f_string_docstring.rs index 8b4d9527f9226b..bfccc9f0d693e4 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/f_string_docstring.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/f_string_docstring.rs @@ -31,6 +31,7 @@ use crate::checkers::ast::Checker; /// - [PEP 257 – Docstring Conventions](https://peps.python.org/pep-0257/) /// - [Python documentation: Formatted string literals](https://docs.python.org/3/reference/lexical_analysis.html#f-strings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.116")] pub(crate) struct FStringDocstring; impl Violation for FStringDocstring { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/function_call_in_argument_default.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/function_call_in_argument_default.rs index 54faca1174ffcf..47b57d56fd6e57 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/function_call_in_argument_default.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/function_call_in_argument_default.rs @@ -62,6 +62,7 @@ use crate::checkers::ast::Checker; /// ## Options /// - `lint.flake8-bugbear.extend-immutable-calls` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.102")] pub(crate) struct FunctionCallInDefaultArgument { name: Option, } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/function_uses_loop_variable.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/function_uses_loop_variable.rs index a4cbba7cc7ffb7..f19a43e633889b 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/function_uses_loop_variable.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/function_uses_loop_variable.rs @@ -42,6 +42,7 @@ use crate::checkers::ast::Checker; /// - [The Hitchhiker's Guide to Python: Late Binding Closures](https://docs.python-guide.org/writing/gotchas/#late-binding-closures) /// - [Python documentation: `functools.partial`](https://docs.python.org/3/library/functools.html#functools.partial) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.139")] pub(crate) struct FunctionUsesLoopVariable { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/getattr_with_constant.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/getattr_with_constant.rs index ef108b77f5a18b..7905de14cacb45 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/getattr_with_constant.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/getattr_with_constant.rs @@ -32,6 +32,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: `getattr`](https://docs.python.org/3/library/functions.html#getattr) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.110")] pub(crate) struct GetAttrWithConstant; impl AlwaysFixableViolation for GetAttrWithConstant { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/jump_statement_in_finally.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/jump_statement_in_finally.rs index 87fc151c904310..944efa0432de6b 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/jump_statement_in_finally.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/jump_statement_in_finally.rs @@ -41,6 +41,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: The `try` statement](https://docs.python.org/3/reference/compound_stmts.html#the-try-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.116")] pub(crate) struct JumpStatementInFinally { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/loop_iterator_mutation.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/loop_iterator_mutation.rs index 6a617a147de628..14456024bbd353 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/loop_iterator_mutation.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/loop_iterator_mutation.rs @@ -36,6 +36,7 @@ use crate::fix::snippet::SourceCodeSnippet; /// ## References /// - [Python documentation: Mutable Sequence Types](https://docs.python.org/3/library/stdtypes.html#typesseq-mutable) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.3.7")] pub(crate) struct LoopIteratorMutation { name: Option, } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/loop_variable_overrides_iterator.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/loop_variable_overrides_iterator.rs index f0a12e755a4f55..1ac5e45f1c63ce 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/loop_variable_overrides_iterator.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/loop_variable_overrides_iterator.rs @@ -37,6 +37,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: The `for` statement](https://docs.python.org/3/reference/compound_stmts.html#the-for-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.121")] pub(crate) struct LoopVariableOverridesIterator { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/map_without_explicit_strict.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/map_without_explicit_strict.rs index 0eba117469e9a2..cd268f610b4568 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/map_without_explicit_strict.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/map_without_explicit_strict.rs @@ -43,6 +43,7 @@ use crate::{AlwaysFixableViolation, Applicability, Fix}; /// - [Python documentation: `map`](https://docs.python.org/3/library/functions.html#map) /// - [What’s New in Python 3.14](https://docs.python.org/dev/whatsnew/3.14.html) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.13.2")] pub(crate) struct MapWithoutExplicitStrict; impl AlwaysFixableViolation for MapWithoutExplicitStrict { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_argument_default.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_argument_default.rs index a20680a03f341f..94098831b8551e 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_argument_default.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_argument_default.rs @@ -79,6 +79,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: Default Argument Values](https://docs.python.org/3/tutorial/controlflow.html#default-argument-values) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.92")] pub(crate) struct MutableArgumentDefault; impl Violation for MutableArgumentDefault { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_contextvar_default.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_contextvar_default.rs index a6d3879d42ec50..a81e1b2c3ff04c 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_contextvar_default.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/mutable_contextvar_default.rs @@ -54,6 +54,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `contextvars` — Context Variables](https://docs.python.org/3/library/contextvars.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct MutableContextvarDefault; impl Violation for MutableContextvarDefault { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/no_explicit_stacklevel.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/no_explicit_stacklevel.rs index ed2b3e98cdd56c..f737e781efc3a9 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/no_explicit_stacklevel.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/no_explicit_stacklevel.rs @@ -41,6 +41,7 @@ use crate::{checkers::ast::Checker, fix::edits::add_argument}; /// ## References /// - [Python documentation: `warnings.warn`](https://docs.python.org/3/library/warnings.html#warnings.warn) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.257")] pub(crate) struct NoExplicitStacklevel; impl AlwaysFixableViolation for NoExplicitStacklevel { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/raise_literal.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/raise_literal.rs index bfe131f98e6378..1fd6b3123a4031 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/raise_literal.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/raise_literal.rs @@ -27,6 +27,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `raise` statement](https://docs.python.org/3/reference/simple_stmts.html#the-raise-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.102")] pub(crate) struct RaiseLiteral; impl Violation for RaiseLiteral { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/raise_without_from_inside_except.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/raise_without_from_inside_except.rs index a9b6c674f72788..41bc2ebdf8fddc 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/raise_without_from_inside_except.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/raise_without_from_inside_except.rs @@ -47,6 +47,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `raise` statement](https://docs.python.org/3/reference/simple_stmts.html#the-raise-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.138")] pub(crate) struct RaiseWithoutFromInsideExcept { is_star: bool, } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/re_sub_positional_args.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/re_sub_positional_args.rs index 4f38947c7716c1..0b7845fa39c7a8 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/re_sub_positional_args.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/re_sub_positional_args.rs @@ -40,6 +40,7 @@ use crate::checkers::ast::Checker; /// - [Python documentation: `re.subn`](https://docs.python.org/3/library/re.html#re.subn) /// - [Python documentation: `re.split`](https://docs.python.org/3/library/re.html#re.split) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.278")] pub(crate) struct ReSubPositionalArgs { method: Method, } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/redundant_tuple_in_exception_handler.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/redundant_tuple_in_exception_handler.rs index 3d5e3834303a50..2ace373d4eb5bc 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/redundant_tuple_in_exception_handler.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/redundant_tuple_in_exception_handler.rs @@ -36,6 +36,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: `except` clause](https://docs.python.org/3/reference/compound_stmts.html#except-clause) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.89")] pub(crate) struct RedundantTupleInExceptionHandler { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/return_in_generator.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/return_in_generator.rs index 8b8f529df4e636..f7584dd4bb570f 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/return_in_generator.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/return_in_generator.rs @@ -79,6 +79,7 @@ use crate::checkers::ast::Checker; /// yield from dir_path.glob(f"*.{file_type}") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.4.8")] pub(crate) struct ReturnInGenerator; impl Violation for ReturnInGenerator { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/reuse_of_groupby_generator.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/reuse_of_groupby_generator.rs index 7643b2846ea31c..6e88ccca40da78 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/reuse_of_groupby_generator.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/reuse_of_groupby_generator.rs @@ -34,6 +34,7 @@ use crate::checkers::ast::Checker; /// do_something_with_the_group(values) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.260")] pub(crate) struct ReuseOfGroupbyGenerator; impl Violation for ReuseOfGroupbyGenerator { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/setattr_with_constant.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/setattr_with_constant.rs index 7e378a14ba6ae0..d3ba5b953e8484 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/setattr_with_constant.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/setattr_with_constant.rs @@ -31,6 +31,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: `setattr`](https://docs.python.org/3/library/functions.html#setattr) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.111")] pub(crate) struct SetAttrWithConstant; impl AlwaysFixableViolation for SetAttrWithConstant { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/star_arg_unpacking_after_keyword_arg.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/star_arg_unpacking_after_keyword_arg.rs index 570ac00660c2db..cf79b66502e472 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/star_arg_unpacking_after_keyword_arg.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/star_arg_unpacking_after_keyword_arg.rs @@ -46,6 +46,7 @@ use crate::checkers::ast::Checker; /// - [Python documentation: Calls](https://docs.python.org/3/reference/expressions.html#calls) /// - [Disallow iterable argument unpacking after a keyword argument?](https://github.com/python/cpython/issues/82741) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.109")] pub(crate) struct StarArgUnpackingAfterKeywordArg; impl Violation for StarArgUnpackingAfterKeywordArg { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/static_key_dict_comprehension.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/static_key_dict_comprehension.rs index ace25f1f55fb79..784782052595b1 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/static_key_dict_comprehension.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/static_key_dict_comprehension.rs @@ -31,6 +31,7 @@ use crate::fix::snippet::SourceCodeSnippet; /// {value: value.upper() for value in data} /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct StaticKeyDictComprehension { key: SourceCodeSnippet, } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/strip_with_multi_characters.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/strip_with_multi_characters.rs index 4c6ef9ef5e2dd6..e50661e8b9c251 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/strip_with_multi_characters.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/strip_with_multi_characters.rs @@ -45,6 +45,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `str.strip`](https://docs.python.org/3/library/stdtypes.html#str.strip) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.106")] pub(crate) struct StripWithMultiCharacters; impl Violation for StripWithMultiCharacters { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/unary_prefix_increment_decrement.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/unary_prefix_increment_decrement.rs index f9c868226b299c..3bfcb06125a454 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/unary_prefix_increment_decrement.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/unary_prefix_increment_decrement.rs @@ -31,6 +31,7 @@ use crate::checkers::ast::Checker; /// - [Python documentation: Unary arithmetic and bitwise operations](https://docs.python.org/3/reference/expressions.html#unary-arithmetic-and-bitwise-operations) /// - [Python documentation: Augmented assignment statements](https://docs.python.org/3/reference/simple_stmts.html#augmented-assignment-statements) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.83")] pub(crate) struct UnaryPrefixIncrementDecrement { operator: UnaryPrefixOperatorType, } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/unintentional_type_annotation.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/unintentional_type_annotation.rs index 5588b4c343613b..d58d345a12a659 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/unintentional_type_annotation.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/unintentional_type_annotation.rs @@ -23,6 +23,7 @@ use crate::checkers::ast::Checker; /// a["b"] = 1 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.250")] pub(crate) struct UnintentionalTypeAnnotation; impl Violation for UnintentionalTypeAnnotation { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/unreliable_callable_check.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/unreliable_callable_check.rs index 4aa582533e92ec..b3bcbf5ba9be93 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/unreliable_callable_check.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/unreliable_callable_check.rs @@ -67,6 +67,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [Python documentation: `__getattr__`](https://docs.python.org/3/reference/datamodel.html#object.__getattr__) /// - [Python documentation: `__call__`](https://docs.python.org/3/reference/datamodel.html#object.__call__) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.106")] pub(crate) struct UnreliableCallableCheck; impl Violation for UnreliableCallableCheck { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/unused_loop_control_variable.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/unused_loop_control_variable.rs index 4b0a48ac16898b..e530b5d79402ba 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/unused_loop_control_variable.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/unused_loop_control_variable.rs @@ -35,6 +35,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [PEP 8: Naming Conventions](https://peps.python.org/pep-0008/#naming-conventions) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.84")] pub(crate) struct UnusedLoopControlVariable { /// The name of the loop control variable. name: String, diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/useless_comparison.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/useless_comparison.rs index 25d373357ce28b..00f4beb28366e9 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/useless_comparison.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/useless_comparison.rs @@ -34,6 +34,7 @@ use crate::rules::flake8_bugbear::helpers::at_last_top_level_expression_in_cell; /// ## References /// - [Python documentation: `assert` statement](https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.102")] pub(crate) struct UselessComparison { at: ComparisonLocationAt, } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/useless_contextlib_suppress.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/useless_contextlib_suppress.rs index 4ec3e85d1fd9e3..8e07bbd96c7bfa 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/useless_contextlib_suppress.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/useless_contextlib_suppress.rs @@ -37,6 +37,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `contextlib.suppress`](https://docs.python.org/3/library/contextlib.html#contextlib.suppress) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.118")] pub(crate) struct UselessContextlibSuppress; impl Violation for UselessContextlibSuppress { diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/useless_expression.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/useless_expression.rs index 2c9f74dc75ed4b..1bcd6f638b819f 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/useless_expression.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/useless_expression.rs @@ -51,6 +51,7 @@ use crate::rules::flake8_bugbear::helpers::at_last_top_level_expression_in_cell; /// _ = obj.attribute /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.100")] pub(crate) struct UselessExpression { kind: Kind, } diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/zip_without_explicit_strict.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/zip_without_explicit_strict.rs index 102d6b0a57400d..136715b981e76b 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/zip_without_explicit_strict.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/zip_without_explicit_strict.rs @@ -39,6 +39,7 @@ use crate::{AlwaysFixableViolation, Applicability, Fix}; /// ## References /// - [Python documentation: `zip`](https://docs.python.org/3/library/functions.html#zip) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.167")] pub(crate) struct ZipWithoutExplicitStrict; impl AlwaysFixableViolation for ZipWithoutExplicitStrict { diff --git a/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_argument_shadowing.rs b/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_argument_shadowing.rs index c600059c118491..766e4b45613081 100644 --- a/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_argument_shadowing.rs +++ b/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_argument_shadowing.rs @@ -49,6 +49,7 @@ use crate::rules::flake8_builtins::helpers::shadows_builtin; /// - [_Is it bad practice to use a built-in function name as an attribute or method identifier?_](https://stackoverflow.com/questions/9109333/is-it-bad-practice-to-use-a-built-in-function-name-as-an-attribute-or-method-ide) /// - [_Why is it a bad idea to name a variable `id` in Python?_](https://stackoverflow.com/questions/77552/id-is-a-bad-variable-name-in-python) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.48")] pub(crate) struct BuiltinArgumentShadowing { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_attribute_shadowing.rs b/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_attribute_shadowing.rs index 948e0c892d62a7..20f599484fba5d 100644 --- a/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_attribute_shadowing.rs +++ b/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_attribute_shadowing.rs @@ -57,6 +57,7 @@ use crate::rules::flake8_builtins::helpers::shadows_builtin; /// ## Options /// - `lint.flake8-builtins.ignorelist` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.48")] pub(crate) struct BuiltinAttributeShadowing { kind: Kind, name: String, diff --git a/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_import_shadowing.rs b/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_import_shadowing.rs index 6dae6ea8bd9464..29bcf1d034cb93 100644 --- a/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_import_shadowing.rs +++ b/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_import_shadowing.rs @@ -41,6 +41,7 @@ use crate::rules::flake8_builtins::helpers::shadows_builtin; /// - `lint.flake8-builtins.ignorelist` /// - `target-version` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct BuiltinImportShadowing { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_lambda_argument_shadowing.rs b/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_lambda_argument_shadowing.rs index ef9ef4a5d0a5ad..b9314e842fd16c 100644 --- a/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_lambda_argument_shadowing.rs +++ b/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_lambda_argument_shadowing.rs @@ -21,6 +21,7 @@ use crate::rules::flake8_builtins::helpers::shadows_builtin; /// ## Options /// - `lint.flake8-builtins.ignorelist` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.9.0")] pub(crate) struct BuiltinLambdaArgumentShadowing { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_variable_shadowing.rs b/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_variable_shadowing.rs index 31708157dd427e..5b8f937a2af32b 100644 --- a/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_variable_shadowing.rs +++ b/crates/ruff_linter/src/rules/flake8_builtins/rules/builtin_variable_shadowing.rs @@ -44,6 +44,7 @@ use crate::rules::flake8_builtins::helpers::shadows_builtin; /// ## References /// - [_Why is it a bad idea to name a variable `id` in Python?_](https://stackoverflow.com/questions/77552/id-is-a-bad-variable-name-in-python) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.48")] pub(crate) struct BuiltinVariableShadowing { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_builtins/rules/stdlib_module_shadowing.rs b/crates/ruff_linter/src/rules/flake8_builtins/rules/stdlib_module_shadowing.rs index 66f9e6f657c986..55ea5e72d8e177 100644 --- a/crates/ruff_linter/src/rules/flake8_builtins/rules/stdlib_module_shadowing.rs +++ b/crates/ruff_linter/src/rules/flake8_builtins/rules/stdlib_module_shadowing.rs @@ -53,6 +53,7 @@ use crate::settings::LinterSettings; /// - `lint.flake8-builtins.allowed-modules` /// - `lint.flake8-builtins.strict-checking` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.9.0")] pub(crate) struct StdlibModuleShadowing { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_commas/rules/trailing_commas.rs b/crates/ruff_linter/src/rules/flake8_commas/rules/trailing_commas.rs index 71c422de6883a3..220c15fbedc15e 100644 --- a/crates/ruff_linter/src/rules/flake8_commas/rules/trailing_commas.rs +++ b/crates/ruff_linter/src/rules/flake8_commas/rules/trailing_commas.rs @@ -153,6 +153,7 @@ impl Context { /// /// [formatter]:https://docs.astral.sh/ruff/formatter/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.223")] pub(crate) struct MissingTrailingComma; impl AlwaysFixableViolation for MissingTrailingComma { @@ -198,6 +199,7 @@ impl AlwaysFixableViolation for MissingTrailingComma { /// foo = (json.dumps({"bar": 1}),) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.223")] pub(crate) struct TrailingCommaOnBareTuple; impl Violation for TrailingCommaOnBareTuple { @@ -230,6 +232,7 @@ impl Violation for TrailingCommaOnBareTuple { /// /// [formatter]:https://docs.astral.sh/ruff/formatter/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.223")] pub(crate) struct ProhibitedTrailingComma; impl AlwaysFixableViolation for ProhibitedTrailingComma { diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_call_around_sorted.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_call_around_sorted.rs index ad3f1c5b110859..a36ef72ec0af00 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_call_around_sorted.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_call_around_sorted.rs @@ -42,6 +42,7 @@ use crate::rules::flake8_comprehensions::fixes; /// The fix is marked as safe for `list()` cases, as removing `list()` around /// `sorted()` does not change the behavior. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.73")] pub(crate) struct UnnecessaryCallAroundSorted { func: UnnecessaryFunction, } diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_collection_call.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_collection_call.rs index ac9f6664103e83..ca01f07e548b53 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_collection_call.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_collection_call.rs @@ -40,6 +40,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## Options /// - `lint.flake8-comprehensions.allow-dict-calls-with-keyword-arguments` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.61")] pub(crate) struct UnnecessaryCollectionCall { kind: Collection, } diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_comprehension.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_comprehension.rs index 558f2ace4fd6d6..f384b32e6eb4a3 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_comprehension.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_comprehension.rs @@ -57,6 +57,7 @@ use crate::rules::flake8_comprehensions::fixes; /// /// Additionally, this fix may drop comments when rewriting the comprehension. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.73")] pub(crate) struct UnnecessaryComprehension { kind: ComprehensionKind, } diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_comprehension_in_call.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_comprehension_in_call.rs index 6565131796552e..5be7f7f9742a07 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_comprehension_in_call.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_comprehension_in_call.rs @@ -67,6 +67,7 @@ use crate::{Edit, Fix, Violation}; /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.262")] pub(crate) struct UnnecessaryComprehensionInCall { comprehension_kind: ComprehensionKind, } diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_dict_comprehension_for_iterable.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_dict_comprehension_for_iterable.rs index 2618c4765ab229..09c0c3dcbd6b28 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_dict_comprehension_for_iterable.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_dict_comprehension_for_iterable.rs @@ -49,6 +49,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `dict.fromkeys`](https://docs.python.org/3/library/stdtypes.html#dict.fromkeys) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct UnnecessaryDictComprehensionForIterable { is_value_none_literal: bool, } diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_double_cast_or_process.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_double_cast_or_process.rs index c0811cdb065576..8a94a0f423a570 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_double_cast_or_process.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_double_cast_or_process.rs @@ -48,6 +48,7 @@ use crate::rules::flake8_comprehensions::fixes; /// This rule's fix is marked as unsafe, as it may occasionally drop comments /// when rewriting the call. In most cases, though, comments will be preserved. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.70")] pub(crate) struct UnnecessaryDoubleCastOrProcess { inner: String, outer: String, diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_dict.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_dict.rs index 7cf15ff4019809..547f5bd8e0afd9 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_dict.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_dict.rs @@ -32,6 +32,7 @@ use crate::rules::flake8_comprehensions::helpers; /// This rule's fix is marked as unsafe, as it may occasionally drop comments /// when rewriting the call. In most cases, though, comments will be preserved. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.61")] pub(crate) struct UnnecessaryGeneratorDict; impl AlwaysFixableViolation for UnnecessaryGeneratorDict { diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_list.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_list.rs index eba4c76c603d73..d2b088fadf3f85 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_list.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_list.rs @@ -42,6 +42,7 @@ use crate::rules::flake8_comprehensions::helpers; /// This rule's fix is marked as unsafe, as it may occasionally drop comments /// when rewriting the call. In most cases, though, comments will be preserved. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.61")] pub(crate) struct UnnecessaryGeneratorList { short_circuit: bool, } diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_set.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_set.rs index 0cbad1d806c9a9..b2ed05c925245d 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_set.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_generator_set.rs @@ -43,6 +43,7 @@ use crate::rules::flake8_comprehensions::helpers; /// This rule's fix is marked as unsafe, as it may occasionally drop comments /// when rewriting the call. In most cases, though, comments will be preserved. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.61")] pub(crate) struct UnnecessaryGeneratorSet { short_circuit: bool, } diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_call.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_call.rs index 422081814a5b2c..00ed6915512bf0 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_call.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_call.rs @@ -29,6 +29,7 @@ use crate::rules::flake8_comprehensions::helpers; /// This rule's fix is marked as unsafe, as it may occasionally drop comments /// when rewriting the call. In most cases, though, comments will be preserved. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.73")] pub(crate) struct UnnecessaryListCall; impl AlwaysFixableViolation for UnnecessaryListCall { diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_comprehension_dict.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_comprehension_dict.rs index 6ea47477480b37..e0b523c17bae12 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_comprehension_dict.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_comprehension_dict.rs @@ -29,6 +29,7 @@ use crate::rules::flake8_comprehensions::helpers; /// This rule's fix is marked as unsafe, as it may occasionally drop comments /// when rewriting the call. In most cases, though, comments will be preserved. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.58")] pub(crate) struct UnnecessaryListComprehensionDict; impl AlwaysFixableViolation for UnnecessaryListComprehensionDict { diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_comprehension_set.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_comprehension_set.rs index 966b51c388569f..fd171a58b27ffb 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_comprehension_set.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_list_comprehension_set.rs @@ -31,6 +31,7 @@ use crate::rules::flake8_comprehensions::helpers; /// This rule's fix is marked as unsafe, as it may occasionally drop comments /// when rewriting the call. In most cases, though, comments will be preserved. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.58")] pub(crate) struct UnnecessaryListComprehensionSet; impl AlwaysFixableViolation for UnnecessaryListComprehensionSet { diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_dict.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_dict.rs index d23a74582bb13b..cea5f9c2f9582a 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_dict.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_dict.rs @@ -33,6 +33,7 @@ use crate::rules::flake8_comprehensions::helpers; /// This rule's fix is marked as unsafe, as it may occasionally drop comments /// when rewriting the call. In most cases, though, comments will be preserved. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.61")] pub(crate) struct UnnecessaryLiteralDict { obj_type: LiteralKind, } diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_set.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_set.rs index e89f3e2fda0b94..f06964f33d7fa1 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_set.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_set.rs @@ -34,6 +34,7 @@ use crate::rules::flake8_comprehensions::helpers; /// This rule's fix is marked as unsafe, as it may occasionally drop comments /// when rewriting the call. In most cases, though, comments will be preserved. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.61")] pub(crate) struct UnnecessaryLiteralSet { kind: UnnecessaryLiteral, } diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_dict_call.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_dict_call.rs index 1f1c04ccc78323..e6f374f88dcae0 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_dict_call.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_dict_call.rs @@ -35,6 +35,7 @@ use crate::rules::flake8_comprehensions::helpers; /// This rule's fix is marked as unsafe, as it may occasionally drop comments /// when rewriting the call. In most cases, though, comments will be preserved. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.262")] pub(crate) struct UnnecessaryLiteralWithinDictCall { kind: DictKind, } diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_list_call.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_list_call.rs index 5d4a9d7a4ced3f..2861e191744988 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_list_call.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_list_call.rs @@ -35,6 +35,7 @@ use crate::rules::flake8_comprehensions::helpers; /// This rule's fix is marked as unsafe, as it may occasionally drop comments /// when rewriting the call. In most cases, though, comments will be preserved. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.66")] pub(crate) struct UnnecessaryLiteralWithinListCall { kind: LiteralKind, } diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_tuple_call.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_tuple_call.rs index 30a250e7cea99d..c932878d1bbe9a 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_tuple_call.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_literal_within_tuple_call.rs @@ -48,6 +48,7 @@ use crate::rules::flake8_comprehensions::helpers; /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.66")] pub(crate) struct UnnecessaryLiteralWithinTupleCall { literal_kind: TupleLiteralKind, } diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_map.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_map.rs index 362c03b68c79b9..64b373c6ba36f3 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_map.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_map.rs @@ -44,6 +44,7 @@ use crate::{FixAvailability, Violation}; /// This rule's fix is marked as unsafe, as it may occasionally drop comments /// when rewriting the call. In most cases, though, comments will be preserved. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.74")] pub(crate) struct UnnecessaryMap { object_type: ObjectType, } diff --git a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_subscript_reversal.rs b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_subscript_reversal.rs index 5357daf99fd325..72e11829ece6a3 100644 --- a/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_subscript_reversal.rs +++ b/crates/ruff_linter/src/rules/flake8_comprehensions/rules/unnecessary_subscript_reversal.rs @@ -27,6 +27,7 @@ use crate::checkers::ast::Checker; /// iterable /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.64")] pub(crate) struct UnnecessarySubscriptReversal { func: String, } diff --git a/crates/ruff_linter/src/rules/flake8_copyright/rules/missing_copyright_notice.rs b/crates/ruff_linter/src/rules/flake8_copyright/rules/missing_copyright_notice.rs index f2c578036c4f8a..b3f70a7f883d4f 100644 --- a/crates/ruff_linter/src/rules/flake8_copyright/rules/missing_copyright_notice.rs +++ b/crates/ruff_linter/src/rules/flake8_copyright/rules/missing_copyright_notice.rs @@ -20,6 +20,7 @@ use crate::settings::LinterSettings; /// - `lint.flake8-copyright.min-file-size` /// - `lint.flake8-copyright.notice-rgx` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.273")] pub(crate) struct MissingCopyrightNotice; impl Violation for MissingCopyrightNotice { diff --git a/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_date_fromtimestamp.rs b/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_date_fromtimestamp.rs index 8ea11704b2d9c5..8cdc1a7a46d1e7 100644 --- a/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_date_fromtimestamp.rs +++ b/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_date_fromtimestamp.rs @@ -45,6 +45,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: Aware and Naive Objects](https://docs.python.org/3/library/datetime.html#aware-and-naive-objects) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct CallDateFromtimestamp; impl Violation for CallDateFromtimestamp { diff --git a/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_date_today.rs b/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_date_today.rs index 1010fb6c17fcff..8b84a6862554bb 100644 --- a/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_date_today.rs +++ b/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_date_today.rs @@ -45,6 +45,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: Aware and Naive Objects](https://docs.python.org/3/library/datetime.html#aware-and-naive-objects) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct CallDateToday; impl Violation for CallDateToday { diff --git a/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_fromtimestamp.rs b/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_fromtimestamp.rs index 7e443efe74e458..36c8d9831d53a3 100644 --- a/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_fromtimestamp.rs +++ b/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_fromtimestamp.rs @@ -48,6 +48,7 @@ use crate::rules::flake8_datetimez::helpers::{self, DatetimeModuleAntipattern}; /// ## References /// - [Python documentation: Aware and Naive Objects](https://docs.python.org/3/library/datetime.html#aware-and-naive-objects) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct CallDatetimeFromtimestamp(DatetimeModuleAntipattern); impl Violation for CallDatetimeFromtimestamp { diff --git a/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_now_without_tzinfo.rs b/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_now_without_tzinfo.rs index ceea7e2d843fe3..5827cad81c3e7d 100644 --- a/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_now_without_tzinfo.rs +++ b/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_now_without_tzinfo.rs @@ -46,6 +46,7 @@ use crate::rules::flake8_datetimez::helpers::{self, DatetimeModuleAntipattern}; /// ## References /// - [Python documentation: Aware and Naive Objects](https://docs.python.org/3/library/datetime.html#aware-and-naive-objects) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct CallDatetimeNowWithoutTzinfo(DatetimeModuleAntipattern); impl Violation for CallDatetimeNowWithoutTzinfo { diff --git a/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_strptime_without_zone.rs b/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_strptime_without_zone.rs index 93e2a37b9037f5..534ca9cb4a9029 100644 --- a/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_strptime_without_zone.rs +++ b/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_strptime_without_zone.rs @@ -51,6 +51,7 @@ use crate::rules::flake8_datetimez::helpers::DatetimeModuleAntipattern; /// - [Python documentation: Aware and Naive Objects](https://docs.python.org/3/library/datetime.html#aware-and-naive-objects) /// - [Python documentation: `strftime()` and `strptime()` Behavior](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct CallDatetimeStrptimeWithoutZone(DatetimeModuleAntipattern); impl Violation for CallDatetimeStrptimeWithoutZone { diff --git a/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_today.rs b/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_today.rs index c902d72200604f..4545302ba0e3d8 100644 --- a/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_today.rs +++ b/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_today.rs @@ -46,6 +46,7 @@ use crate::rules::flake8_datetimez::helpers; /// ## References /// - [Python documentation: Aware and Naive Objects](https://docs.python.org/3/library/datetime.html#aware-and-naive-objects) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct CallDatetimeToday; impl Violation for CallDatetimeToday { diff --git a/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_utcfromtimestamp.rs b/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_utcfromtimestamp.rs index 4f6210e0266bef..3441ecd6b51ad4 100644 --- a/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_utcfromtimestamp.rs +++ b/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_utcfromtimestamp.rs @@ -47,6 +47,7 @@ use crate::rules::flake8_datetimez::helpers; /// ## References /// - [Python documentation: Aware and Naive Objects](https://docs.python.org/3/library/datetime.html#aware-and-naive-objects) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct CallDatetimeUtcfromtimestamp; impl Violation for CallDatetimeUtcfromtimestamp { diff --git a/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_utcnow.rs b/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_utcnow.rs index 552ebbce5fb067..c1dfd21a4214dd 100644 --- a/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_utcnow.rs +++ b/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_utcnow.rs @@ -46,6 +46,7 @@ use crate::rules::flake8_datetimez::helpers; /// ## References /// - [Python documentation: Aware and Naive Objects](https://docs.python.org/3/library/datetime.html#aware-and-naive-objects) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct CallDatetimeUtcnow; impl Violation for CallDatetimeUtcnow { diff --git a/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_without_tzinfo.rs b/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_without_tzinfo.rs index 7fe640462fb436..a621ad202b49ba 100644 --- a/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_without_tzinfo.rs +++ b/crates/ruff_linter/src/rules/flake8_datetimez/rules/call_datetime_without_tzinfo.rs @@ -45,6 +45,7 @@ use crate::rules::flake8_datetimez::helpers::{self, DatetimeModuleAntipattern}; /// ## References /// - [Python documentation: Aware and Naive Objects](https://docs.python.org/3/library/datetime.html#aware-and-naive-objects) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct CallDatetimeWithoutTzinfo(DatetimeModuleAntipattern); impl Violation for CallDatetimeWithoutTzinfo { diff --git a/crates/ruff_linter/src/rules/flake8_datetimez/rules/datetime_min_max.rs b/crates/ruff_linter/src/rules/flake8_datetimez/rules/datetime_min_max.rs index dafa96df78d0b2..a1428c9a77f295 100644 --- a/crates/ruff_linter/src/rules/flake8_datetimez/rules/datetime_min_max.rs +++ b/crates/ruff_linter/src/rules/flake8_datetimez/rules/datetime_min_max.rs @@ -42,6 +42,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: Aware and Naive Objects](https://docs.python.org/3/library/datetime.html#aware-and-naive-objects) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct DatetimeMinMax { min_max: MinMax, } diff --git a/crates/ruff_linter/src/rules/flake8_debugger/rules/debugger.rs b/crates/ruff_linter/src/rules/flake8_debugger/rules/debugger.rs index a068ff4387bf51..f7ce0eb580af25 100644 --- a/crates/ruff_linter/src/rules/flake8_debugger/rules/debugger.rs +++ b/crates/ruff_linter/src/rules/flake8_debugger/rules/debugger.rs @@ -31,6 +31,7 @@ use crate::rules::flake8_debugger::types::DebuggerUsingType; /// - [Python documentation: `pdb` — The Python Debugger](https://docs.python.org/3/library/pdb.html) /// - [Python documentation: `logging` — Logging facility for Python](https://docs.python.org/3/library/logging.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.141")] pub(crate) struct Debugger { using_type: DebuggerUsingType, } diff --git a/crates/ruff_linter/src/rules/flake8_django/rules/all_with_model_form.rs b/crates/ruff_linter/src/rules/flake8_django/rules/all_with_model_form.rs index 13a1209f844988..9a752afd92d635 100644 --- a/crates/ruff_linter/src/rules/flake8_django/rules/all_with_model_form.rs +++ b/crates/ruff_linter/src/rules/flake8_django/rules/all_with_model_form.rs @@ -38,6 +38,7 @@ use crate::rules::flake8_django::helpers::is_model_form; /// fields = ["title", "content"] /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.253")] pub(crate) struct DjangoAllWithModelForm; impl Violation for DjangoAllWithModelForm { diff --git a/crates/ruff_linter/src/rules/flake8_django/rules/exclude_with_model_form.rs b/crates/ruff_linter/src/rules/flake8_django/rules/exclude_with_model_form.rs index 4f5fe15f7a5b9a..2b1142f7bb15cc 100644 --- a/crates/ruff_linter/src/rules/flake8_django/rules/exclude_with_model_form.rs +++ b/crates/ruff_linter/src/rules/flake8_django/rules/exclude_with_model_form.rs @@ -36,6 +36,7 @@ use crate::rules::flake8_django::helpers::is_model_form; /// fields = ["title", "content"] /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.253")] pub(crate) struct DjangoExcludeWithModelForm; impl Violation for DjangoExcludeWithModelForm { diff --git a/crates/ruff_linter/src/rules/flake8_django/rules/locals_in_render_function.rs b/crates/ruff_linter/src/rules/flake8_django/rules/locals_in_render_function.rs index 4f5ad2ca4218b5..6f239ffe65999d 100644 --- a/crates/ruff_linter/src/rules/flake8_django/rules/locals_in_render_function.rs +++ b/crates/ruff_linter/src/rules/flake8_django/rules/locals_in_render_function.rs @@ -34,6 +34,7 @@ use crate::checkers::ast::Checker; /// return render(request, "app/index.html", context) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.253")] pub(crate) struct DjangoLocalsInRenderFunction; impl Violation for DjangoLocalsInRenderFunction { diff --git a/crates/ruff_linter/src/rules/flake8_django/rules/model_without_dunder_str.rs b/crates/ruff_linter/src/rules/flake8_django/rules/model_without_dunder_str.rs index 0141c77f220488..e1cf9fda3fc42d 100644 --- a/crates/ruff_linter/src/rules/flake8_django/rules/model_without_dunder_str.rs +++ b/crates/ruff_linter/src/rules/flake8_django/rules/model_without_dunder_str.rs @@ -41,6 +41,7 @@ use crate::rules::flake8_django::helpers; /// return f"{self.field}" /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.246")] pub(crate) struct DjangoModelWithoutDunderStr; impl Violation for DjangoModelWithoutDunderStr { diff --git a/crates/ruff_linter/src/rules/flake8_django/rules/non_leading_receiver_decorator.rs b/crates/ruff_linter/src/rules/flake8_django/rules/non_leading_receiver_decorator.rs index 3a854e9756c858..289b4a45e2addf 100644 --- a/crates/ruff_linter/src/rules/flake8_django/rules/non_leading_receiver_decorator.rs +++ b/crates/ruff_linter/src/rules/flake8_django/rules/non_leading_receiver_decorator.rs @@ -41,6 +41,7 @@ use crate::checkers::ast::Checker; /// pass /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.246")] pub(crate) struct DjangoNonLeadingReceiverDecorator; impl Violation for DjangoNonLeadingReceiverDecorator { diff --git a/crates/ruff_linter/src/rules/flake8_django/rules/nullable_model_string_field.rs b/crates/ruff_linter/src/rules/flake8_django/rules/nullable_model_string_field.rs index 3157e6f4fb71a3..47e463d5dfcc2b 100644 --- a/crates/ruff_linter/src/rules/flake8_django/rules/nullable_model_string_field.rs +++ b/crates/ruff_linter/src/rules/flake8_django/rules/nullable_model_string_field.rs @@ -41,6 +41,7 @@ use crate::rules::flake8_django::helpers; /// field = models.CharField(max_length=255, default="") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.246")] pub(crate) struct DjangoNullableModelStringField { field_name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_django/rules/unordered_body_content_in_model.rs b/crates/ruff_linter/src/rules/flake8_django/rules/unordered_body_content_in_model.rs index b6492136ac8c04..b3a0127343f50e 100644 --- a/crates/ruff_linter/src/rules/flake8_django/rules/unordered_body_content_in_model.rs +++ b/crates/ruff_linter/src/rules/flake8_django/rules/unordered_body_content_in_model.rs @@ -63,6 +63,7 @@ use crate::rules::flake8_django::helpers; /// /// [Django Style Guide]: https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style/#model-style #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct DjangoUnorderedBodyContentInModel { element_type: ContentType, prev_element_type: ContentType, diff --git a/crates/ruff_linter/src/rules/flake8_errmsg/rules/string_in_exception.rs b/crates/ruff_linter/src/rules/flake8_errmsg/rules/string_in_exception.rs index d5ea4f13fc84b1..474ff585eaeeef 100644 --- a/crates/ruff_linter/src/rules/flake8_errmsg/rules/string_in_exception.rs +++ b/crates/ruff_linter/src/rules/flake8_errmsg/rules/string_in_exception.rs @@ -48,6 +48,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// RuntimeError: 'Some value' is incorrect /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.183")] pub(crate) struct RawStringInException; impl Violation for RawStringInException { @@ -103,6 +104,7 @@ impl Violation for RawStringInException { /// RuntimeError: 'Some value' is incorrect /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.183")] pub(crate) struct FStringInException; impl Violation for FStringInException { @@ -159,6 +161,7 @@ impl Violation for FStringInException { /// RuntimeError: 'Some value' is incorrect /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.183")] pub(crate) struct DotFormatInException; impl Violation for DotFormatInException { diff --git a/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_leading_whitespace.rs b/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_leading_whitespace.rs index 5fe7a072d2e4c7..82857469339377 100644 --- a/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_leading_whitespace.rs +++ b/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_leading_whitespace.rs @@ -31,6 +31,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: Executable Python Scripts](https://docs.python.org/3/tutorial/appendix.html#executable-python-scripts) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.229")] pub(crate) struct ShebangLeadingWhitespace; impl AlwaysFixableViolation for ShebangLeadingWhitespace { diff --git a/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_missing_executable_file.rs b/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_missing_executable_file.rs index 1d13b3815f53ef..301ea999d08a06 100644 --- a/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_missing_executable_file.rs +++ b/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_missing_executable_file.rs @@ -34,6 +34,7 @@ use crate::rules::flake8_executable::helpers::is_executable; /// - [Python documentation: Executable Python Scripts](https://docs.python.org/3/tutorial/appendix.html#executable-python-scripts) /// - [Git documentation: `git update-index --chmod`](https://git-scm.com/docs/git-update-index#Documentation/git-update-index.txt---chmod-x) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.233")] pub(crate) struct ShebangMissingExecutableFile; impl Violation for ShebangMissingExecutableFile { diff --git a/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_missing_python.rs b/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_missing_python.rs index 13d6b13158747b..968e5340cae9d5 100644 --- a/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_missing_python.rs +++ b/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_missing_python.rs @@ -32,6 +32,7 @@ use crate::comments::shebang::ShebangDirective; /// ## References /// - [Python documentation: Executable Python Scripts](https://docs.python.org/3/tutorial/appendix.html#executable-python-scripts) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.229")] pub(crate) struct ShebangMissingPython; impl Violation for ShebangMissingPython { diff --git a/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_not_executable.rs b/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_not_executable.rs index afff2a41f3f2ad..c9ea74d86bd949 100644 --- a/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_not_executable.rs +++ b/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_not_executable.rs @@ -38,6 +38,7 @@ use crate::rules::flake8_executable::helpers::is_executable; /// - [Python documentation: Executable Python Scripts](https://docs.python.org/3/tutorial/appendix.html#executable-python-scripts) /// - [Git documentation: `git update-index --chmod`](https://git-scm.com/docs/git-update-index#Documentation/git-update-index.txt---chmod-x) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.233")] pub(crate) struct ShebangNotExecutable; impl Violation for ShebangNotExecutable { diff --git a/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_not_first_line.rs b/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_not_first_line.rs index 4f5168e24ddd14..4d1732cd7c0383 100644 --- a/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_not_first_line.rs +++ b/crates/ruff_linter/src/rules/flake8_executable/rules/shebang_not_first_line.rs @@ -33,6 +33,7 @@ use crate::checkers::ast::LintContext; /// ## References /// - [Python documentation: Executable Python Scripts](https://docs.python.org/3/tutorial/appendix.html#executable-python-scripts) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.229")] pub(crate) struct ShebangNotFirstLine; impl Violation for ShebangNotFirstLine { diff --git a/crates/ruff_linter/src/rules/flake8_fixme/rules/todos.rs b/crates/ruff_linter/src/rules/flake8_fixme/rules/todos.rs index e17deced805ed9..5ca86e42b91896 100644 --- a/crates/ruff_linter/src/rules/flake8_fixme/rules/todos.rs +++ b/crates/ruff_linter/src/rules/flake8_fixme/rules/todos.rs @@ -23,6 +23,7 @@ use crate::directives::{TodoComment, TodoDirectiveKind}; /// return f"Hello, {name}!" # TODO: Add support for custom greetings. /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.272")] pub(crate) struct LineContainsTodo; impl Violation for LineContainsTodo { #[derive_message_formats] @@ -49,6 +50,7 @@ impl Violation for LineContainsTodo { /// return distance / time # FIXME: Raises ZeroDivisionError for time = 0. /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.272")] pub(crate) struct LineContainsFixme; impl Violation for LineContainsFixme { #[derive_message_formats] @@ -72,6 +74,7 @@ impl Violation for LineContainsFixme { /// return distance / time # XXX: Raises ZeroDivisionError for time = 0. /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.272")] pub(crate) struct LineContainsXxx; impl Violation for LineContainsXxx { #[derive_message_formats] @@ -107,6 +110,7 @@ impl Violation for LineContainsXxx { /// return False /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.272")] pub(crate) struct LineContainsHack; impl Violation for LineContainsHack { #[derive_message_formats] diff --git a/crates/ruff_linter/src/rules/flake8_future_annotations/rules/future_required_type_annotation.rs b/crates/ruff_linter/src/rules/flake8_future_annotations/rules/future_required_type_annotation.rs index 99571bb802ebb1..593a42b368535d 100644 --- a/crates/ruff_linter/src/rules/flake8_future_annotations/rules/future_required_type_annotation.rs +++ b/crates/ruff_linter/src/rules/flake8_future_annotations/rules/future_required_type_annotation.rs @@ -49,6 +49,7 @@ use crate::{AlwaysFixableViolation, Fix}; /// ## Options /// - `target-version` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.271")] pub(crate) struct FutureRequiredTypeAnnotation { reason: Reason, } diff --git a/crates/ruff_linter/src/rules/flake8_future_annotations/rules/future_rewritable_type_annotation.rs b/crates/ruff_linter/src/rules/flake8_future_annotations/rules/future_rewritable_type_annotation.rs index 66ca69cafa2484..26ae39ffce5dad 100644 --- a/crates/ruff_linter/src/rules/flake8_future_annotations/rules/future_rewritable_type_annotation.rs +++ b/crates/ruff_linter/src/rules/flake8_future_annotations/rules/future_rewritable_type_annotation.rs @@ -68,6 +68,7 @@ use crate::{AlwaysFixableViolation, Fix}; /// ## Options /// - `target-version` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.269")] pub(crate) struct FutureRewritableTypeAnnotation { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_gettext/rules/f_string_in_gettext_func_call.rs b/crates/ruff_linter/src/rules/flake8_gettext/rules/f_string_in_gettext_func_call.rs index 13f35447681525..2cc9ca51a1e9ef 100644 --- a/crates/ruff_linter/src/rules/flake8_gettext/rules/f_string_in_gettext_func_call.rs +++ b/crates/ruff_linter/src/rules/flake8_gettext/rules/f_string_in_gettext_func_call.rs @@ -41,6 +41,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `gettext` — Multilingual internationalization services](https://docs.python.org/3/library/gettext.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.260")] pub(crate) struct FStringInGetTextFuncCall; impl Violation for FStringInGetTextFuncCall { diff --git a/crates/ruff_linter/src/rules/flake8_gettext/rules/format_in_gettext_func_call.rs b/crates/ruff_linter/src/rules/flake8_gettext/rules/format_in_gettext_func_call.rs index 9d53d48abf3cb3..ad584804d0d573 100644 --- a/crates/ruff_linter/src/rules/flake8_gettext/rules/format_in_gettext_func_call.rs +++ b/crates/ruff_linter/src/rules/flake8_gettext/rules/format_in_gettext_func_call.rs @@ -41,6 +41,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `gettext` — Multilingual internationalization services](https://docs.python.org/3/library/gettext.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.260")] pub(crate) struct FormatInGetTextFuncCall; impl Violation for FormatInGetTextFuncCall { diff --git a/crates/ruff_linter/src/rules/flake8_gettext/rules/printf_in_gettext_func_call.rs b/crates/ruff_linter/src/rules/flake8_gettext/rules/printf_in_gettext_func_call.rs index 22c8a4b7373ccc..22172a80058cda 100644 --- a/crates/ruff_linter/src/rules/flake8_gettext/rules/printf_in_gettext_func_call.rs +++ b/crates/ruff_linter/src/rules/flake8_gettext/rules/printf_in_gettext_func_call.rs @@ -40,6 +40,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `gettext` — Multilingual internationalization services](https://docs.python.org/3/library/gettext.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.260")] pub(crate) struct PrintfInGetTextFuncCall; impl Violation for PrintfInGetTextFuncCall { diff --git a/crates/ruff_linter/src/rules/flake8_implicit_str_concat/rules/explicit.rs b/crates/ruff_linter/src/rules/flake8_implicit_str_concat/rules/explicit.rs index 7a6e33aebce402..60a65d46e5b197 100644 --- a/crates/ruff_linter/src/rules/flake8_implicit_str_concat/rules/explicit.rs +++ b/crates/ruff_linter/src/rules/flake8_implicit_str_concat/rules/explicit.rs @@ -33,6 +33,7 @@ use crate::{Edit, Fix}; /// ) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.201")] pub(crate) struct ExplicitStringConcatenation; impl AlwaysFixableViolation for ExplicitStringConcatenation { diff --git a/crates/ruff_linter/src/rules/flake8_implicit_str_concat/rules/implicit.rs b/crates/ruff_linter/src/rules/flake8_implicit_str_concat/rules/implicit.rs index 7961f22b6ecf3f..c9cc87366718c3 100644 --- a/crates/ruff_linter/src/rules/flake8_implicit_str_concat/rules/implicit.rs +++ b/crates/ruff_linter/src/rules/flake8_implicit_str_concat/rules/implicit.rs @@ -35,6 +35,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// z = "The quick brown fox." /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.201")] pub(crate) struct SingleLineImplicitStringConcatenation; impl Violation for SingleLineImplicitStringConcatenation { @@ -92,6 +93,7 @@ impl Violation for SingleLineImplicitStringConcatenation { /// [PEP 8]: https://peps.python.org/pep-0008/#maximum-line-length /// [formatter]:https://docs.astral.sh/ruff/formatter/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.201")] pub(crate) struct MultiLineImplicitStringConcatenation; impl Violation for MultiLineImplicitStringConcatenation { diff --git a/crates/ruff_linter/src/rules/flake8_import_conventions/rules/banned_import_alias.rs b/crates/ruff_linter/src/rules/flake8_import_conventions/rules/banned_import_alias.rs index 6fc205699af0c2..080e5f39770c8e 100644 --- a/crates/ruff_linter/src/rules/flake8_import_conventions/rules/banned_import_alias.rs +++ b/crates/ruff_linter/src/rules/flake8_import_conventions/rules/banned_import_alias.rs @@ -34,6 +34,7 @@ use crate::rules::flake8_import_conventions::settings::BannedAliases; /// ## Options /// - `lint.flake8-import-conventions.banned-aliases` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.262")] pub(crate) struct BannedImportAlias { name: String, asname: String, diff --git a/crates/ruff_linter/src/rules/flake8_import_conventions/rules/banned_import_from.rs b/crates/ruff_linter/src/rules/flake8_import_conventions/rules/banned_import_from.rs index c5a64ea82a2cd4..e27123fe7176bd 100644 --- a/crates/ruff_linter/src/rules/flake8_import_conventions/rules/banned_import_from.rs +++ b/crates/ruff_linter/src/rules/flake8_import_conventions/rules/banned_import_from.rs @@ -33,6 +33,7 @@ use crate::{Violation, checkers::ast::Checker}; /// ## Options /// - `lint.flake8-import-conventions.banned-from` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.263")] pub(crate) struct BannedImportFrom { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_import_conventions/rules/unconventional_import_alias.rs b/crates/ruff_linter/src/rules/flake8_import_conventions/rules/unconventional_import_alias.rs index 90970ae343807f..e0684056dc51e8 100644 --- a/crates/ruff_linter/src/rules/flake8_import_conventions/rules/unconventional_import_alias.rs +++ b/crates/ruff_linter/src/rules/flake8_import_conventions/rules/unconventional_import_alias.rs @@ -35,6 +35,7 @@ use crate::renamer::Renamer; /// - `lint.flake8-import-conventions.aliases` /// - `lint.flake8-import-conventions.extend-aliases` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.166")] pub(crate) struct UnconventionalImportAlias { name: String, asname: String, diff --git a/crates/ruff_linter/src/rules/flake8_logging/rules/direct_logger_instantiation.rs b/crates/ruff_linter/src/rules/flake8_logging/rules/direct_logger_instantiation.rs index 501953d980d11e..29519be884213e 100644 --- a/crates/ruff_linter/src/rules/flake8_logging/rules/direct_logger_instantiation.rs +++ b/crates/ruff_linter/src/rules/flake8_logging/rules/direct_logger_instantiation.rs @@ -42,6 +42,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// /// [Logger Objects]: https://docs.python.org/3/library/logging.html#logger-objects #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct DirectLoggerInstantiation; impl Violation for DirectLoggerInstantiation { diff --git a/crates/ruff_linter/src/rules/flake8_logging/rules/exc_info_outside_except_handler.rs b/crates/ruff_linter/src/rules/flake8_logging/rules/exc_info_outside_except_handler.rs index d1768b42541a2b..1172e4089322c8 100644 --- a/crates/ruff_linter/src/rules/flake8_logging/rules/exc_info_outside_except_handler.rs +++ b/crates/ruff_linter/src/rules/flake8_logging/rules/exc_info_outside_except_handler.rs @@ -44,6 +44,7 @@ use crate::{Fix, FixAvailability, Violation}; /// ## Fix safety /// The fix is always marked as unsafe, as it changes runtime behavior. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct ExcInfoOutsideExceptHandler; impl Violation for ExcInfoOutsideExceptHandler { diff --git a/crates/ruff_linter/src/rules/flake8_logging/rules/exception_without_exc_info.rs b/crates/ruff_linter/src/rules/flake8_logging/rules/exception_without_exc_info.rs index 4724239d569137..8d5c9542773dc5 100644 --- a/crates/ruff_linter/src/rules/flake8_logging/rules/exception_without_exc_info.rs +++ b/crates/ruff_linter/src/rules/flake8_logging/rules/exception_without_exc_info.rs @@ -31,6 +31,7 @@ use crate::checkers::ast::Checker; /// logging.error("...") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct ExceptionWithoutExcInfo; impl Violation for ExceptionWithoutExcInfo { diff --git a/crates/ruff_linter/src/rules/flake8_logging/rules/invalid_get_logger_argument.rs b/crates/ruff_linter/src/rules/flake8_logging/rules/invalid_get_logger_argument.rs index 368bdfa5d069a3..948d55f16d4e4d 100644 --- a/crates/ruff_linter/src/rules/flake8_logging/rules/invalid_get_logger_argument.rs +++ b/crates/ruff_linter/src/rules/flake8_logging/rules/invalid_get_logger_argument.rs @@ -45,6 +45,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// /// [logging documentation]: https://docs.python.org/3/library/logging.html#logger-objects #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct InvalidGetLoggerArgument; impl Violation for InvalidGetLoggerArgument { diff --git a/crates/ruff_linter/src/rules/flake8_logging/rules/log_exception_outside_except_handler.rs b/crates/ruff_linter/src/rules/flake8_logging/rules/log_exception_outside_except_handler.rs index 00c099014ed90c..4f2b852a2b528a 100644 --- a/crates/ruff_linter/src/rules/flake8_logging/rules/log_exception_outside_except_handler.rs +++ b/crates/ruff_linter/src/rules/flake8_logging/rules/log_exception_outside_except_handler.rs @@ -44,6 +44,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// /// [The documentation]: https://docs.python.org/3/library/logging.html#logging.exception #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.9.5")] pub(crate) struct LogExceptionOutsideExceptHandler; impl Violation for LogExceptionOutsideExceptHandler { diff --git a/crates/ruff_linter/src/rules/flake8_logging/rules/root_logger_call.rs b/crates/ruff_linter/src/rules/flake8_logging/rules/root_logger_call.rs index 6c174b39e3e460..f7b6a5570654a0 100644 --- a/crates/ruff_linter/src/rules/flake8_logging/rules/root_logger_call.rs +++ b/crates/ruff_linter/src/rules/flake8_logging/rules/root_logger_call.rs @@ -28,6 +28,7 @@ use crate::checkers::ast::Checker; /// logger.info("Foobar") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct RootLoggerCall { attr: String, } diff --git a/crates/ruff_linter/src/rules/flake8_logging/rules/undocumented_warn.rs b/crates/ruff_linter/src/rules/flake8_logging/rules/undocumented_warn.rs index 2287a217b3357c..213e9f7c6086b4 100644 --- a/crates/ruff_linter/src/rules/flake8_logging/rules/undocumented_warn.rs +++ b/crates/ruff_linter/src/rules/flake8_logging/rules/undocumented_warn.rs @@ -33,6 +33,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// logging.basicConfig(level=logging.WARNING) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct UndocumentedWarn; impl Violation for UndocumentedWarn { diff --git a/crates/ruff_linter/src/rules/flake8_logging_format/violations.rs b/crates/ruff_linter/src/rules/flake8_logging_format/violations.rs index 21e22bf2f71c07..9a2c378e5774bd 100644 --- a/crates/ruff_linter/src/rules/flake8_logging_format/violations.rs +++ b/crates/ruff_linter/src/rules/flake8_logging_format/violations.rs @@ -75,6 +75,7 @@ use crate::{AlwaysFixableViolation, Violation}; /// - [Python documentation: `logging`](https://docs.python.org/3/library/logging.html) /// - [Python documentation: Optimization](https://docs.python.org/3/howto/logging.html#optimization) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.236")] pub(crate) struct LoggingStringFormat; impl Violation for LoggingStringFormat { @@ -159,6 +160,7 @@ impl Violation for LoggingStringFormat { /// - [Python documentation: `logging`](https://docs.python.org/3/library/logging.html) /// - [Python documentation: Optimization](https://docs.python.org/3/howto/logging.html#optimization) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.236")] pub(crate) struct LoggingPercentFormat; impl Violation for LoggingPercentFormat { @@ -242,6 +244,7 @@ impl Violation for LoggingPercentFormat { /// - [Python documentation: `logging`](https://docs.python.org/3/library/logging.html) /// - [Python documentation: Optimization](https://docs.python.org/3/howto/logging.html#optimization) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.236")] pub(crate) struct LoggingStringConcat; impl Violation for LoggingStringConcat { @@ -324,6 +327,7 @@ impl Violation for LoggingStringConcat { /// - [Python documentation: `logging`](https://docs.python.org/3/library/logging.html) /// - [Python documentation: Optimization](https://docs.python.org/3/howto/logging.html#optimization) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.236")] pub(crate) struct LoggingFString; impl Violation for LoggingFString { @@ -381,6 +385,7 @@ impl Violation for LoggingFString { /// - [Python documentation: `logging.warning`](https://docs.python.org/3/library/logging.html#logging.warning) /// - [Python documentation: `logging.Logger.warning`](https://docs.python.org/3/library/logging.html#logging.Logger.warning) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.236")] pub(crate) struct LoggingWarn; impl AlwaysFixableViolation for LoggingWarn { @@ -448,6 +453,7 @@ impl AlwaysFixableViolation for LoggingWarn { /// ## References /// - [Python documentation: LogRecord attributes](https://docs.python.org/3/library/logging.html#logrecord-attributes) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.236")] pub(crate) struct LoggingExtraAttrClash(pub String); impl Violation for LoggingExtraAttrClash { @@ -510,6 +516,7 @@ impl Violation for LoggingExtraAttrClash { /// - [Python documentation: `logging.error`](https://docs.python.org/3/library/logging.html#logging.error) /// - [Python documentation: `error`](https://docs.python.org/3/library/logging.html#logging.Logger.error) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.236")] pub(crate) struct LoggingExcInfo; impl Violation for LoggingExcInfo { @@ -572,6 +579,7 @@ impl Violation for LoggingExcInfo { /// - [Python documentation: `logging.error`](https://docs.python.org/3/library/logging.html#logging.error) /// - [Python documentation: `error`](https://docs.python.org/3/library/logging.html#logging.Logger.error) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.236")] pub(crate) struct LoggingRedundantExcInfo; impl Violation for LoggingRedundantExcInfo { diff --git a/crates/ruff_linter/src/rules/flake8_no_pep420/rules/implicit_namespace_package.rs b/crates/ruff_linter/src/rules/flake8_no_pep420/rules/implicit_namespace_package.rs index 82cdbda753d3d3..92a7a211ccc91b 100644 --- a/crates/ruff_linter/src/rules/flake8_no_pep420/rules/implicit_namespace_package.rs +++ b/crates/ruff_linter/src/rules/flake8_no_pep420/rules/implicit_namespace_package.rs @@ -32,6 +32,7 @@ use crate::package::PackageRoot; /// ## Options /// - `namespace-packages` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.225")] pub(crate) struct ImplicitNamespacePackage { filename: String, parent: Option, diff --git a/crates/ruff_linter/src/rules/flake8_pie/rules/duplicate_class_field_definition.rs b/crates/ruff_linter/src/rules/flake8_pie/rules/duplicate_class_field_definition.rs index 7049a2814df342..ed6777c0d44b2b 100644 --- a/crates/ruff_linter/src/rules/flake8_pie/rules/duplicate_class_field_definition.rs +++ b/crates/ruff_linter/src/rules/flake8_pie/rules/duplicate_class_field_definition.rs @@ -35,6 +35,7 @@ use crate::{AlwaysFixableViolation, Fix}; /// This fix is always marked as unsafe since we cannot know /// for certain which assignment was intended. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct DuplicateClassFieldDefinition { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_pie/rules/multiple_starts_ends_with.rs b/crates/ruff_linter/src/rules/flake8_pie/rules/multiple_starts_ends_with.rs index 2df842b862fd10..e39693d7548585 100644 --- a/crates/ruff_linter/src/rules/flake8_pie/rules/multiple_starts_ends_with.rs +++ b/crates/ruff_linter/src/rules/flake8_pie/rules/multiple_starts_ends_with.rs @@ -49,6 +49,7 @@ use crate::{Edit, Fix}; /// - [Python documentation: `str.startswith`](https://docs.python.org/3/library/stdtypes.html#str.startswith) /// - [Python documentation: `str.endswith`](https://docs.python.org/3/library/stdtypes.html#str.endswith) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.243")] pub(crate) struct MultipleStartsEndsWith { attr: String, } diff --git a/crates/ruff_linter/src/rules/flake8_pie/rules/non_unique_enums.rs b/crates/ruff_linter/src/rules/flake8_pie/rules/non_unique_enums.rs index 21464f148fe903..c36234283bf3a5 100644 --- a/crates/ruff_linter/src/rules/flake8_pie/rules/non_unique_enums.rs +++ b/crates/ruff_linter/src/rules/flake8_pie/rules/non_unique_enums.rs @@ -41,6 +41,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `enum.Enum`](https://docs.python.org/3/library/enum.html#enum.Enum) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.224")] pub(crate) struct NonUniqueEnums { value: String, } diff --git a/crates/ruff_linter/src/rules/flake8_pie/rules/reimplemented_container_builtin.rs b/crates/ruff_linter/src/rules/flake8_pie/rules/reimplemented_container_builtin.rs index ad817929c9e5f8..4de59dd38383f7 100644 --- a/crates/ruff_linter/src/rules/flake8_pie/rules/reimplemented_container_builtin.rs +++ b/crates/ruff_linter/src/rules/flake8_pie/rules/reimplemented_container_builtin.rs @@ -38,6 +38,7 @@ use crate::{FixAvailability, Violation}; /// ## References /// - [Python documentation: `list`](https://docs.python.org/3/library/functions.html#func-list) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct ReimplementedContainerBuiltin { container: Container, } diff --git a/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_dict_kwargs.rs b/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_dict_kwargs.rs index 09bf37474cd95a..cc436d258afc35 100644 --- a/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_dict_kwargs.rs +++ b/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_dict_kwargs.rs @@ -70,6 +70,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// - [Python documentation: Dictionary displays](https://docs.python.org/3/reference/expressions.html#dictionary-displays) /// - [Python documentation: Calls](https://docs.python.org/3/reference/expressions.html#calls) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct UnnecessaryDictKwargs; impl Violation for UnnecessaryDictKwargs { diff --git a/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_placeholder.rs b/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_placeholder.rs index 1a64d0f971c987..3d446f68b092d2 100644 --- a/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_placeholder.rs +++ b/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_placeholder.rs @@ -59,6 +59,7 @@ use crate::{Edit, Fix}; /// ## References /// - [Python documentation: The `pass` statement](https://docs.python.org/3/reference/simple_stmts.html#the-pass-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct UnnecessaryPlaceholder { kind: Placeholder, } diff --git a/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_range_start.rs b/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_range_start.rs index 5c9d4c4be613eb..6e6b10b2060f42 100644 --- a/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_range_start.rs +++ b/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_range_start.rs @@ -27,6 +27,7 @@ use crate::{AlwaysFixableViolation, Fix}; /// ## References /// - [Python documentation: `range`](https://docs.python.org/3/library/stdtypes.html#range) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.286")] pub(crate) struct UnnecessaryRangeStart; impl AlwaysFixableViolation for UnnecessaryRangeStart { diff --git a/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_spread.rs b/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_spread.rs index b5aefbfa5e3c92..4b99f4e887a419 100644 --- a/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_spread.rs +++ b/crates/ruff_linter/src/rules/flake8_pie/rules/unnecessary_spread.rs @@ -28,6 +28,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: Dictionary displays](https://docs.python.org/3/reference/expressions.html#dictionary-displays) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct UnnecessarySpread; impl Violation for UnnecessarySpread { diff --git a/crates/ruff_linter/src/rules/flake8_print/rules/print_call.rs b/crates/ruff_linter/src/rules/flake8_print/rules/print_call.rs index c5a851aaf83052..82db18a2fc8fc7 100644 --- a/crates/ruff_linter/src/rules/flake8_print/rules/print_call.rs +++ b/crates/ruff_linter/src/rules/flake8_print/rules/print_call.rs @@ -48,6 +48,7 @@ use crate::{Fix, FixAvailability, Violation}; /// This rule's fix is marked as unsafe, as it will remove `print` statements /// that are used beyond debugging purposes. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.57")] pub(crate) struct Print; impl Violation for Print { @@ -97,6 +98,7 @@ impl Violation for Print { /// This rule's fix is marked as unsafe, as it will remove `pprint` statements /// that are used beyond debugging purposes. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.57")] pub(crate) struct PPrint; impl Violation for PPrint { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/any_eq_ne_annotation.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/any_eq_ne_annotation.rs index bebf9aee83aa49..aeff638af2eeac 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/any_eq_ne_annotation.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/any_eq_ne_annotation.rs @@ -44,6 +44,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// - [Python documentation: The `Any` type](https://docs.python.org/3/library/typing.html#the-any-type) /// - [Mypy documentation: Any vs. object](https://mypy.readthedocs.io/en/latest/dynamic_typing.html#any-vs-object) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.271")] pub(crate) struct AnyEqNeAnnotation { method_name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/bad_generator_return_type.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/bad_generator_return_type.rs index 0524b69af6098d..b836c4de7fe463 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/bad_generator_return_type.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/bad_generator_return_type.rs @@ -59,6 +59,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// unsafe for any `__iter__` or `__aiter__` method in a `.py` file that has /// more than two statements (including docstrings) in its body. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct GeneratorReturnFromIterMethod { return_type: Iterator, method: Method, diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/bad_version_info_comparison.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/bad_version_info_comparison.rs index 6ac4235e641de7..630e2671420ef6 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/bad_version_info_comparison.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/bad_version_info_comparison.rs @@ -51,6 +51,7 @@ use crate::registry::Rule; /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.254")] pub(crate) struct BadVersionInfoComparison; impl Violation for BadVersionInfoComparison { @@ -100,6 +101,7 @@ impl Violation for BadVersionInfoComparison { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct BadVersionInfoOrder; impl Violation for BadVersionInfoOrder { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/bytestring_usage.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/bytestring_usage.rs index 59d9173860295b..c87c669ab7fef7 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/bytestring_usage.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/bytestring_usage.rs @@ -28,6 +28,7 @@ use crate::{FixAvailability, Violation}; /// ## References /// - [Python documentation: The `ByteString` type](https://docs.python.org/3/library/typing.html#typing.ByteString) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.6.0")] pub(crate) struct ByteStringUsage { origin: ByteStringOrigin, } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/collections_named_tuple.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/collections_named_tuple.rs index 5c2a4de600cbad..e6735a6921fc35 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/collections_named_tuple.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/collections_named_tuple.rs @@ -36,6 +36,7 @@ use crate::checkers::ast::Checker; /// age: int /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.271")] pub(crate) struct CollectionsNamedTuple; impl Violation for CollectionsNamedTuple { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/complex_assignment_in_stub.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/complex_assignment_in_stub.rs index 0f38dfe8e68a95..f5dd22a140156c 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/complex_assignment_in_stub.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/complex_assignment_in_stub.rs @@ -42,6 +42,7 @@ use crate::checkers::ast::Checker; /// X: TypeAlias = int /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.279")] pub(crate) struct ComplexAssignmentInStub; impl Violation for ComplexAssignmentInStub { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/complex_if_statement_in_stub.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/complex_if_statement_in_stub.rs index 010753a0bc2759..d097df3b346963 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/complex_if_statement_in_stub.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/complex_if_statement_in_stub.rs @@ -32,6 +32,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Typing documentation: Version and platform checking](https://typing.python.org/en/latest/spec/directives.html#version-and-platform-checks) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.276")] pub(crate) struct ComplexIfStatementInStub; impl Violation for ComplexIfStatementInStub { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/custom_type_var_for_self.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/custom_type_var_for_self.rs index aaa182b4e07f15..b22a050ad09011 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/custom_type_var_for_self.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/custom_type_var_for_self.rs @@ -89,6 +89,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// [typing_TypeVar]: https://docs.python.org/3/library/typing.html#typing.TypeVar /// [typing_extensions]: https://typing-extensions.readthedocs.io/en/latest/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.283")] pub(crate) struct CustomTypeVarForSelf { typevar_name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/docstring_in_stubs.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/docstring_in_stubs.rs index 6db0029643b53d..abaf7035b50269 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/docstring_in_stubs.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/docstring_in_stubs.rs @@ -27,6 +27,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// def func(param: int) -> str: ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.253")] pub(crate) struct DocstringInStub; impl AlwaysFixableViolation for DocstringInStub { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/duplicate_literal_member.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/duplicate_literal_member.rs index 1f4c6210e4b8bb..9ccdfd92dba16c 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/duplicate_literal_member.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/duplicate_literal_member.rs @@ -40,6 +40,7 @@ use crate::{AlwaysFixableViolation, Applicability, Edit, Fix}; /// ## References /// - [Python documentation: `typing.Literal`](https://docs.python.org/3/library/typing.html#typing.Literal) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.6.0")] pub(crate) struct DuplicateLiteralMember { duplicate_name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/duplicate_union_member.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/duplicate_union_member.rs index 47d26ca8502afd..cc909a7267a97b 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/duplicate_union_member.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/duplicate_union_member.rs @@ -37,6 +37,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.262")] pub(crate) struct DuplicateUnionMember { duplicate_name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/ellipsis_in_non_empty_class_body.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/ellipsis_in_non_empty_class_body.rs index 4c1497fe93e60f..d261c9aef7a2eb 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/ellipsis_in_non_empty_class_body.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/ellipsis_in_non_empty_class_body.rs @@ -28,6 +28,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// value: int /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.270")] pub(crate) struct EllipsisInNonEmptyClassBody; impl Violation for EllipsisInNonEmptyClassBody { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/exit_annotations.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/exit_annotations.rs index 3127f3d411f8bc..670ad6b891f552 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/exit_annotations.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/exit_annotations.rs @@ -47,6 +47,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ) -> None: ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.279")] pub(crate) struct BadExitAnnotation { func_kind: FuncKind, error_kind: ErrorKind, diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/future_annotations_in_stub.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/future_annotations_in_stub.rs index b85059e756b524..cd3703c7184c35 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/future_annotations_in_stub.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/future_annotations_in_stub.rs @@ -18,6 +18,7 @@ use crate::{checkers::ast::Checker, fix}; /// ## References /// - [Typing Style Guide](https://typing.python.org/en/latest/guides/writing_stubs.html#language-features) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.273")] pub(crate) struct FutureAnnotationsInStub; impl Violation for FutureAnnotationsInStub { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/generic_not_last_base_class.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/generic_not_last_base_class.rs index 19565abd5655c4..4cd50356935482 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/generic_not_last_base_class.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/generic_not_last_base_class.rs @@ -84,6 +84,7 @@ use crate::{Fix, FixAvailability, Violation}; /// [1]: https://github.com/python/cpython/issues/106102 /// [MRO]: https://docs.python.org/3/glossary.html#term-method-resolution-order #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.13.0")] pub(crate) struct GenericNotLastBaseClass; impl Violation for GenericNotLastBaseClass { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/iter_method_return_iterable.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/iter_method_return_iterable.rs index b72a0ce0cc31f7..b6f6359014e092 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/iter_method_return_iterable.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/iter_method_return_iterable.rs @@ -69,6 +69,7 @@ use crate::checkers::ast::Checker; /// def __iter__(self) -> collections.abc.Iterator[str]: ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.271")] pub(crate) struct IterMethodReturnIterable { is_async: bool, } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/no_return_argument_annotation.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/no_return_argument_annotation.rs index c129ae33f79530..1fa1d645ba18e6 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/no_return_argument_annotation.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/no_return_argument_annotation.rs @@ -41,6 +41,7 @@ use ruff_python_ast::PythonVersion; /// /// [bottom type]: https://en.wikipedia.org/wiki/Bottom_type #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.272")] pub(crate) struct NoReturnArgumentAnnotationInStub { module: TypingModule, } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/non_empty_stub_body.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/non_empty_stub_body.rs index 3e3efd8c661fe1..36d2fc11b5c095 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/non_empty_stub_body.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/non_empty_stub_body.rs @@ -28,6 +28,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Typing documentation - Writing and Maintaining Stub Files](https://typing.python.org/en/latest/guides/writing_stubs.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.253")] pub(crate) struct NonEmptyStubBody; impl AlwaysFixableViolation for NonEmptyStubBody { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/non_self_return_type.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/non_self_return_type.rs index 9e823d11d5d390..59d01ff834fde8 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/non_self_return_type.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/non_self_return_type.rs @@ -88,6 +88,7 @@ use ruff_text_size::Ranged; /// ## References /// - [Python documentation: `typing.Self`](https://docs.python.org/3/library/typing.html#typing.Self) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.271")] pub(crate) struct NonSelfReturnType { class_name: String, method_name: String, diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/numeric_literal_too_long.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/numeric_literal_too_long.rs index 739778f4cf7141..83b48e677aab5e 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/numeric_literal_too_long.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/numeric_literal_too_long.rs @@ -30,6 +30,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// def foo(arg: int = ...) -> None: ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.271")] pub(crate) struct NumericLiteralTooLong; impl AlwaysFixableViolation for NumericLiteralTooLong { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/pass_in_class_body.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/pass_in_class_body.rs index 2177f92e78deeb..336d2664f76682 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/pass_in_class_body.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/pass_in_class_body.rs @@ -27,6 +27,7 @@ use crate::{AlwaysFixableViolation, Fix}; /// x: int /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.260")] pub(crate) struct PassInClassBody; impl AlwaysFixableViolation for PassInClassBody { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/pass_statement_stub_body.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/pass_statement_stub_body.rs index f4a7f64538408a..6aa512ca1522bf 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/pass_statement_stub_body.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/pass_statement_stub_body.rs @@ -25,6 +25,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Typing documentation - Writing and Maintaining Stub Files](https://typing.python.org/en/latest/guides/writing_stubs.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.253")] pub(crate) struct PassStatementStubBody; impl AlwaysFixableViolation for PassStatementStubBody { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/pre_pep570_positional_argument.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/pre_pep570_positional_argument.rs index e481a82dc20a86..507a1b9808fc8e 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/pre_pep570_positional_argument.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/pre_pep570_positional_argument.rs @@ -40,6 +40,7 @@ use ruff_python_ast::PythonVersion; /// [PEP 484]: https://peps.python.org/pep-0484/#positional-only-arguments /// [PEP 570]: https://peps.python.org/pep-0570 #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct Pep484StylePositionalOnlyParameter; impl Violation for Pep484StylePositionalOnlyParameter { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/prefix_type_params.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/prefix_type_params.rs index 152c54671bce07..22f14f043ebf76 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/prefix_type_params.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/prefix_type_params.rs @@ -46,6 +46,7 @@ impl fmt::Display for VarKind { /// _T = TypeVar("_T") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.245")] pub(crate) struct UnprefixedTypeParam { kind: VarKind, } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/quoted_annotation_in_stub.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/quoted_annotation_in_stub.rs index 63b610408b09a1..86bdf32a98fb6a 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/quoted_annotation_in_stub.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/quoted_annotation_in_stub.rs @@ -29,6 +29,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Typing documentation - Writing and Maintaining Stub Files](https://typing.python.org/en/latest/guides/writing_stubs.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.265")] pub(crate) struct QuotedAnnotationInStub; impl AlwaysFixableViolation for QuotedAnnotationInStub { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/redundant_final_literal.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/redundant_final_literal.rs index d710b4823f827e..8b44eab1ce6de5 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/redundant_final_literal.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/redundant_final_literal.rs @@ -34,6 +34,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// y: Final = 42 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct RedundantFinalLiteral { literal: SourceCodeSnippet, } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/redundant_literal_union.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/redundant_literal_union.rs index 512849b70d06a5..d4d018c748bce0 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/redundant_literal_union.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/redundant_literal_union.rs @@ -37,6 +37,7 @@ use crate::fix::snippet::SourceCodeSnippet; /// x: Literal[b"B"] | str /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.283")] pub(crate) struct RedundantLiteralUnion { literal: SourceCodeSnippet, builtin_type: ExprType, diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/redundant_none_literal.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/redundant_none_literal.rs index 78441d1f8b08ad..14145229fc1272 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/redundant_none_literal.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/redundant_none_literal.rs @@ -49,6 +49,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Typing documentation: Legal parameters for `Literal` at type check time](https://typing.python.org/en/latest/spec/literal.html#legal-parameters-for-literal-at-type-check-time) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.13.0")] pub(crate) struct RedundantNoneLiteral { union_kind: UnionKind, } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/redundant_numeric_union.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/redundant_numeric_union.rs index 1197e70ea6b94f..1e4583f3125cea 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/redundant_numeric_union.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/redundant_numeric_union.rs @@ -53,6 +53,7 @@ use super::generate_union_fix; /// /// [typing specification]: https://typing.python.org/en/latest/spec/special-types.html#special-cases-for-float-and-complex #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.279")] pub(crate) struct RedundantNumericUnion { redundancy: Redundancy, } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/simple_defaults.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/simple_defaults.rs index 32059594db8bec..32b83754be04b0 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/simple_defaults.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/simple_defaults.rs @@ -41,6 +41,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix, Violation}; /// ## References /// - [`flake8-pyi`](https://github.com/PyCQA/flake8-pyi/blob/main/ERRORCODES.md) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.253")] pub(crate) struct TypedArgumentDefaultInStub; impl AlwaysFixableViolation for TypedArgumentDefaultInStub { @@ -87,6 +88,7 @@ impl AlwaysFixableViolation for TypedArgumentDefaultInStub { /// ## References /// - [`flake8-pyi`](https://github.com/PyCQA/flake8-pyi/blob/main/ERRORCODES.md) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.253")] pub(crate) struct ArgumentDefaultInStub; impl AlwaysFixableViolation for ArgumentDefaultInStub { @@ -131,6 +133,7 @@ impl AlwaysFixableViolation for ArgumentDefaultInStub { /// ## References /// - [`flake8-pyi`](https://github.com/PyCQA/flake8-pyi/blob/main/ERRORCODES.md) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.260")] pub(crate) struct AssignmentDefaultInStub; impl AlwaysFixableViolation for AssignmentDefaultInStub { @@ -151,6 +154,7 @@ impl AlwaysFixableViolation for AssignmentDefaultInStub { /// Stub files exist to provide type hints, and are never executed. As such, /// all assignments in stub files should be annotated with a type. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.269")] pub(crate) struct UnannotatedAssignmentInStub { name: String, } @@ -182,6 +186,7 @@ impl Violation for UnannotatedAssignmentInStub { /// __all__: list[str] = ["foo", "bar"] /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.271")] pub(crate) struct UnassignedSpecialVariableInStub { name: String, } @@ -230,6 +235,7 @@ impl Violation for UnassignedSpecialVariableInStub { /// /// - `lint.typing-extensions` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.279")] pub(crate) struct TypeAliasWithoutAnnotation { module: TypingModule, name: String, diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/str_or_repr_defined_in_stub.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/str_or_repr_defined_in_stub.rs index 6cb7ceaa2e2aa1..0bc8f55eeca8dd 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/str_or_repr_defined_in_stub.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/str_or_repr_defined_in_stub.rs @@ -24,6 +24,7 @@ use crate::{AlwaysFixableViolation, Fix}; /// def __repr__(self) -> str: ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.271")] pub(crate) struct StrOrReprDefinedInStub { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/string_or_bytes_too_long.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/string_or_bytes_too_long.rs index a739f91d361932..0b0580663bc6e3 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/string_or_bytes_too_long.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/string_or_bytes_too_long.rs @@ -33,6 +33,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// def foo(arg: str = ...) -> None: ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.271")] pub(crate) struct StringOrBytesTooLong; impl AlwaysFixableViolation for StringOrBytesTooLong { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/stub_body_multiple_statements.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/stub_body_multiple_statements.rs index 06b428d7d3a27a..e0e26b055d91d6 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/stub_body_multiple_statements.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/stub_body_multiple_statements.rs @@ -29,6 +29,7 @@ use crate::checkers::ast::Checker; /// def function(): ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.271")] pub(crate) struct StubBodyMultipleStatements; impl Violation for StubBodyMultipleStatements { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/type_alias_naming.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/type_alias_naming.rs index 7a2aba860ba765..a7d5d4b387b78a 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/type_alias_naming.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/type_alias_naming.rs @@ -26,6 +26,7 @@ use crate::checkers::ast::Checker; /// TypeAliasName: TypeAlias = int /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.265")] pub(crate) struct SnakeCaseTypeAlias { name: String, } @@ -65,6 +66,7 @@ impl Violation for SnakeCaseTypeAlias { /// ## References /// - [PEP 484: Type Aliases](https://peps.python.org/pep-0484/#type-aliases) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.265")] pub(crate) struct TSuffixedTypeAlias { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/type_comment_in_stub.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/type_comment_in_stub.rs index 2fe79461ed1af9..de345707b9227e 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/type_comment_in_stub.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/type_comment_in_stub.rs @@ -28,6 +28,7 @@ use crate::checkers::ast::LintContext; /// x: int = 1 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.254")] pub(crate) struct TypeCommentInStub; impl Violation for TypeCommentInStub { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/unaliased_collections_abc_set_import.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/unaliased_collections_abc_set_import.rs index ba3c63ac2f2ef7..47b111f97ed019 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/unaliased_collections_abc_set_import.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/unaliased_collections_abc_set_import.rs @@ -40,6 +40,7 @@ use crate::{Applicability, Fix, FixAvailability, Violation}; /// `import foo as foo` alias, or are imported via a `*` import. As such, the /// fix is marked as safe in more cases for `.pyi` files. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.271")] pub(crate) struct UnaliasedCollectionsAbcSetImport; impl Violation for UnaliasedCollectionsAbcSetImport { diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/unnecessary_literal_union.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/unnecessary_literal_union.rs index 3945afde339287..cf5cd71932625a 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/unnecessary_literal_union.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/unnecessary_literal_union.rs @@ -47,6 +47,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `typing.Literal`](https://docs.python.org/3/library/typing.html#typing.Literal) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.278")] pub(crate) struct UnnecessaryLiteralUnion { members: Vec, } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/unnecessary_type_union.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/unnecessary_type_union.rs index 5906e7f4110b28..2e07aeb84d0257 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/unnecessary_type_union.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/unnecessary_type_union.rs @@ -32,6 +32,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// Note that while the fix may flatten nested unions into a single top-level union, /// the semantics of the annotation will remain unchanged. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.283")] pub(crate) struct UnnecessaryTypeUnion { members: Vec, union_kind: UnionKind, diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/unrecognized_platform.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/unrecognized_platform.rs index d9183c09668b7c..d7a22d09402be4 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/unrecognized_platform.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/unrecognized_platform.rs @@ -46,6 +46,7 @@ use crate::registry::Rule; /// ## References /// - [Typing documentation: Version and Platform checking](https://typing.python.org/en/latest/spec/directives.html#version-and-platform-checks) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.246")] pub(crate) struct UnrecognizedPlatformCheck; impl Violation for UnrecognizedPlatformCheck { @@ -84,6 +85,7 @@ impl Violation for UnrecognizedPlatformCheck { /// ## References /// - [Typing documentation: Version and Platform checking](https://typing.python.org/en/latest/spec/directives.html#version-and-platform-checks) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.246")] pub(crate) struct UnrecognizedPlatformName { platform: String, } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/unrecognized_version_info.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/unrecognized_version_info.rs index 9188e865a8c05b..3fe1fa58ff37ad 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/unrecognized_version_info.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/unrecognized_version_info.rs @@ -33,6 +33,7 @@ use crate::registry::Rule; /// ## References /// - [Typing documentation: Version and Platform checking](https://typing.python.org/en/latest/spec/directives.html#version-and-platform-checks) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.276")] pub(crate) struct UnrecognizedVersionInfoCheck; impl Violation for UnrecognizedVersionInfoCheck { @@ -72,6 +73,7 @@ impl Violation for UnrecognizedVersionInfoCheck { /// ## References /// - [Typing documentation: Version and Platform checking](https://typing.python.org/en/latest/spec/directives.html#version-and-platform-checks) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.276")] pub(crate) struct PatchVersionComparison; impl Violation for PatchVersionComparison { @@ -108,6 +110,7 @@ impl Violation for PatchVersionComparison { /// ## References /// - [Typing documentation: Version and Platform checking](https://typing.python.org/en/latest/spec/directives.html#version-and-platform-checks) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.276")] pub(crate) struct WrongTupleLengthVersionComparison { expected_length: usize, } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/unsupported_method_call_on_all.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/unsupported_method_call_on_all.rs index e745f67210a712..fb55360533dd03 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/unsupported_method_call_on_all.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/unsupported_method_call_on_all.rs @@ -41,6 +41,7 @@ use crate::checkers::ast::Checker; /// __all__ += ["C"] /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.281")] pub(crate) struct UnsupportedMethodCallOnAll { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/unused_private_type_definition.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/unused_private_type_definition.rs index d5e6645642058c..82f3d935199352 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/unused_private_type_definition.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/unused_private_type_definition.rs @@ -30,6 +30,7 @@ use crate::{Fix, FixAvailability, Violation}; /// The fix is always marked as unsafe, as it would break your code if the type /// variable is imported by another module. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.281")] pub(crate) struct UnusedPrivateTypeVar { type_var_like_name: String, type_var_like_kind: String, @@ -86,6 +87,7 @@ impl Violation for UnusedPrivateTypeVar { /// def func(arg: _PrivateProtocol) -> None: ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.281")] pub(crate) struct UnusedPrivateProtocol { name: String, } @@ -124,6 +126,7 @@ impl Violation for UnusedPrivateProtocol { /// def func(arg: _UsedTypeAlias) -> _UsedTypeAlias: ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.281")] pub(crate) struct UnusedPrivateTypeAlias { name: String, } @@ -164,6 +167,7 @@ impl Violation for UnusedPrivateTypeAlias { /// def func(arg: _UsedPrivateTypedDict) -> _UsedPrivateTypedDict: ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.281")] pub(crate) struct UnusedPrivateTypedDict { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/assertion.rs b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/assertion.rs index 599decd57b18c6..545372dd6cd761 100644 --- a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/assertion.rs +++ b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/assertion.rs @@ -61,6 +61,7 @@ use super::unittest_assert::UnittestAssert; /// assert not something_else /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestCompositeAssertion; impl Violation for PytestCompositeAssertion { @@ -108,6 +109,7 @@ impl Violation for PytestCompositeAssertion { /// ## References /// - [`pytest` documentation: `pytest.raises`](https://docs.pytest.org/en/latest/reference/reference.html#pytest-raises) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestAssertInExcept { name: String, } @@ -149,6 +151,7 @@ impl Violation for PytestAssertInExcept { /// ## References /// - [`pytest` documentation: `pytest.fail`](https://docs.pytest.org/en/latest/reference/reference.html#pytest-fail) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestAssertAlwaysFalse; impl Violation for PytestAssertAlwaysFalse { @@ -188,6 +191,7 @@ impl Violation for PytestAssertAlwaysFalse { /// ## References /// - [`pytest` documentation: Assertion introspection details](https://docs.pytest.org/en/7.1.x/how-to/assert.html#assertion-introspection-details) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestUnittestAssertion { assertion: String, } @@ -343,6 +347,7 @@ pub(crate) fn unittest_assertion( /// ## References /// - [`pytest` documentation: Assertions about expected exceptions](https://docs.pytest.org/en/latest/how-to/assert.html#assertions-about-expected-exceptions) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.285")] pub(crate) struct PytestUnittestRaisesAssertion { assertion: String, } diff --git a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/fail.rs b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/fail.rs index cc95dd837a4c78..e30fcee3bce461 100644 --- a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/fail.rs +++ b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/fail.rs @@ -46,6 +46,7 @@ use crate::rules::flake8_pytest_style::helpers::{is_empty_or_null_string, is_pyt /// ## References /// - [`pytest` documentation: `pytest.fail`](https://docs.pytest.org/en/latest/reference/reference.html#pytest-fail) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestFailWithoutMessage; impl Violation for PytestFailWithoutMessage { diff --git a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/fixture.rs b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/fixture.rs index 6c0558636cb5b7..49be564b48e5c9 100644 --- a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/fixture.rs +++ b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/fixture.rs @@ -80,6 +80,7 @@ use crate::rules::flake8_pytest_style::helpers::{ /// ## References /// - [`pytest` documentation: API Reference: Fixtures](https://docs.pytest.org/en/latest/reference/reference.html#fixtures-api) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestFixtureIncorrectParenthesesStyle { expected: Parentheses, actual: Parentheses, @@ -131,6 +132,7 @@ impl AlwaysFixableViolation for PytestFixtureIncorrectParenthesesStyle { /// ## References /// - [`pytest` documentation: `@pytest.fixture` functions](https://docs.pytest.org/en/latest/reference/reference.html#pytest-fixture) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestFixturePositionalArgs { function: String, } @@ -172,6 +174,7 @@ impl Violation for PytestFixturePositionalArgs { /// ## References /// - [`pytest` documentation: `@pytest.fixture` functions](https://docs.pytest.org/en/latest/reference/reference.html#pytest-fixture) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestExtraneousScopeFunction; impl AlwaysFixableViolation for PytestExtraneousScopeFunction { @@ -235,6 +238,7 @@ impl AlwaysFixableViolation for PytestExtraneousScopeFunction { /// - [`pytest` documentation: `@pytest.fixture` functions](https://docs.pytest.org/en/latest/reference/reference.html#pytest-fixture) #[derive(ViolationMetadata)] #[deprecated(note = "PT004 has been removed")] +#[violation_metadata(removed_since = "0.8.0")] pub(crate) struct PytestMissingFixtureNameUnderscore; #[expect(deprecated)] @@ -300,6 +304,7 @@ impl Violation for PytestMissingFixtureNameUnderscore { /// - [`pytest` documentation: `@pytest.fixture` functions](https://docs.pytest.org/en/latest/reference/reference.html#pytest-fixture) #[derive(ViolationMetadata)] #[deprecated(note = "PT005 has been removed")] +#[violation_metadata(removed_since = "0.8.0")] pub(crate) struct PytestIncorrectFixtureNameUnderscore; #[expect(deprecated)] @@ -359,6 +364,7 @@ impl Violation for PytestIncorrectFixtureNameUnderscore { /// ## References /// - [`pytest` documentation: `pytest.mark.usefixtures`](https://docs.pytest.org/en/latest/reference/reference.html#pytest-mark-usefixtures) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestFixtureParamWithoutValue { name: String, } @@ -407,6 +413,7 @@ impl Violation for PytestFixtureParamWithoutValue { /// ## References /// - [`pytest` documentation: `yield_fixture` functions](https://docs.pytest.org/en/latest/yieldfixture.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestDeprecatedYieldFixture; impl Violation for PytestDeprecatedYieldFixture { @@ -466,6 +473,7 @@ impl Violation for PytestDeprecatedYieldFixture { /// - [`pytest` documentation: Adding finalizers directly](https://docs.pytest.org/en/latest/how-to/fixtures.html#adding-finalizers-directly) /// - [`pytest` documentation: Factories as fixtures](https://docs.pytest.org/en/latest/how-to/fixtures.html#factories-as-fixtures) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestFixtureFinalizerCallback; impl Violation for PytestFixtureFinalizerCallback { @@ -514,6 +522,7 @@ impl Violation for PytestFixtureFinalizerCallback { /// ## References /// - [`pytest` documentation: Teardown/Cleanup](https://docs.pytest.org/en/latest/how-to/fixtures.html#teardown-cleanup-aka-fixture-finalization) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestUselessYieldFixture { name: String, } @@ -571,6 +580,7 @@ impl AlwaysFixableViolation for PytestUselessYieldFixture { /// ## References /// - [`pytest` documentation: `pytest.mark.usefixtures`](https://docs.pytest.org/en/latest/reference/reference.html#pytest-mark-usefixtures) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestErroneousUseFixturesOnFixture; impl AlwaysFixableViolation for PytestErroneousUseFixturesOnFixture { @@ -614,6 +624,7 @@ impl AlwaysFixableViolation for PytestErroneousUseFixturesOnFixture { /// ## References /// - [PyPI: `pytest-asyncio`](https://pypi.org/project/pytest-asyncio/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestUnnecessaryAsyncioMarkOnFixture; impl AlwaysFixableViolation for PytestUnnecessaryAsyncioMarkOnFixture { diff --git a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/imports.rs b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/imports.rs index 2b6c1261852be0..e1cff657493675 100644 --- a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/imports.rs +++ b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/imports.rs @@ -23,6 +23,7 @@ use crate::{Violation, checkers::ast::Checker}; /// import pytest /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestIncorrectPytestImport; impl Violation for PytestIncorrectPytestImport { diff --git a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/marks.rs b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/marks.rs index 4931a24c9de1c7..1981f8e58606d7 100644 --- a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/marks.rs +++ b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/marks.rs @@ -64,6 +64,7 @@ use crate::rules::flake8_pytest_style::helpers::{Parentheses, get_mark_decorator /// ## References /// - [`pytest` documentation: Marks](https://docs.pytest.org/en/latest/reference/reference.html#marks) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestIncorrectMarkParenthesesStyle { mark_name: String, expected_parens: Parentheses, @@ -119,6 +120,7 @@ impl AlwaysFixableViolation for PytestIncorrectMarkParenthesesStyle { /// ## References /// - [`pytest` documentation: `pytest.mark.usefixtures`](https://docs.pytest.org/en/latest/reference/reference.html#pytest-mark-usefixtures) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestUseFixturesWithoutParameters; impl AlwaysFixableViolation for PytestUseFixturesWithoutParameters { diff --git a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/parametrize.rs b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/parametrize.rs index 80877303527d97..20b14399f97b5c 100644 --- a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/parametrize.rs +++ b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/parametrize.rs @@ -66,6 +66,7 @@ use crate::rules::flake8_pytest_style::types; /// ## References /// - [`pytest` documentation: How to parametrize fixtures and test functions](https://docs.pytest.org/en/latest/how-to/parametrize.html#pytest-mark-parametrize) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestParametrizeNamesWrongType { single_argument: bool, expected: types::ParametrizeNameType, @@ -200,6 +201,7 @@ impl Violation for PytestParametrizeNamesWrongType { /// ## References /// - [`pytest` documentation: How to parametrize fixtures and test functions](https://docs.pytest.org/en/latest/how-to/parametrize.html#pytest-mark-parametrize) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestParametrizeValuesWrongType { values: types::ParametrizeValuesType, row: types::ParametrizeValuesRowType, @@ -264,6 +266,7 @@ impl Violation for PytestParametrizeValuesWrongType { /// ## References /// - [`pytest` documentation: How to parametrize fixtures and test functions](https://docs.pytest.org/en/latest/how-to/parametrize.html#pytest-mark-parametrize) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.285")] pub(crate) struct PytestDuplicateParametrizeTestCases { index: usize, } diff --git a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/patch.rs b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/patch.rs index fef3f695eb00c9..8fa6dc83fdf29f 100644 --- a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/patch.rs +++ b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/patch.rs @@ -42,6 +42,7 @@ use crate::checkers::ast::Checker; /// - [Python documentation: `unittest.mock.patch`](https://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch) /// - [PyPI: `pytest-mock`](https://pypi.org/project/pytest-mock/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestPatchWithLambda; impl Violation for PytestPatchWithLambda { diff --git a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/raises.rs b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/raises.rs index feacfbe9377285..04c9a8c3723b21 100644 --- a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/raises.rs +++ b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/raises.rs @@ -51,6 +51,7 @@ use crate::rules::flake8_pytest_style::helpers::is_empty_or_null_string; /// ## References /// - [`pytest` documentation: `pytest.raises`](https://docs.pytest.org/en/latest/reference/reference.html#pytest-raises) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestRaisesWithMultipleStatements; impl Violation for PytestRaisesWithMultipleStatements { @@ -102,6 +103,7 @@ impl Violation for PytestRaisesWithMultipleStatements { /// ## References /// - [`pytest` documentation: `pytest.raises`](https://docs.pytest.org/en/latest/reference/reference.html#pytest-raises) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestRaisesTooBroad { exception: String, } @@ -147,6 +149,7 @@ impl Violation for PytestRaisesTooBroad { /// ## References /// - [`pytest` documentation: `pytest.raises`](https://docs.pytest.org/en/latest/reference/reference.html#pytest-raises) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct PytestRaisesWithoutException; impl Violation for PytestRaisesWithoutException { diff --git a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/test_functions.rs b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/test_functions.rs index 810e783a2cc6fc..f092b67ff7a25a 100644 --- a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/test_functions.rs +++ b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/test_functions.rs @@ -31,6 +31,7 @@ use ruff_text_size::Ranged; /// ## References /// - [Original Pytest issue](https://github.com/pytest-dev/pytest/issues/12693) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct PytestParameterWithDefaultArgument { parameter_name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/warns.rs b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/warns.rs index 55e1a7bb4827af..3ee14361188437 100644 --- a/crates/ruff_linter/src/rules/flake8_pytest_style/rules/warns.rs +++ b/crates/ruff_linter/src/rules/flake8_pytest_style/rules/warns.rs @@ -50,6 +50,7 @@ use crate::rules::flake8_pytest_style::helpers::is_empty_or_null_string; /// ## References /// - [`pytest` documentation: `pytest.warns`](https://docs.pytest.org/en/latest/reference/reference.html#pytest-warns) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct PytestWarnsWithMultipleStatements; impl Violation for PytestWarnsWithMultipleStatements { @@ -101,6 +102,7 @@ impl Violation for PytestWarnsWithMultipleStatements { /// ## References /// - [`pytest` documentation: `pytest.warns`](https://docs.pytest.org/en/latest/reference/reference.html#pytest-warns) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct PytestWarnsTooBroad { warning: String, } @@ -146,6 +148,7 @@ impl Violation for PytestWarnsTooBroad { /// ## References /// - [`pytest` documentation: `pytest.warns`](https://docs.pytest.org/en/latest/reference/reference.html#pytest-warns) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.9.2")] pub(crate) struct PytestWarnsWithoutWarning; impl Violation for PytestWarnsWithoutWarning { diff --git a/crates/ruff_linter/src/rules/flake8_quotes/rules/avoidable_escaped_quote.rs b/crates/ruff_linter/src/rules/flake8_quotes/rules/avoidable_escaped_quote.rs index 3a15f45154fcc3..59dfdf857eacb4 100644 --- a/crates/ruff_linter/src/rules/flake8_quotes/rules/avoidable_escaped_quote.rs +++ b/crates/ruff_linter/src/rules/flake8_quotes/rules/avoidable_escaped_quote.rs @@ -34,6 +34,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// /// [formatter]: https://docs.astral.sh/ruff/formatter #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.88")] pub(crate) struct AvoidableEscapedQuote; impl AlwaysFixableViolation for AvoidableEscapedQuote { diff --git a/crates/ruff_linter/src/rules/flake8_quotes/rules/check_string_quotes.rs b/crates/ruff_linter/src/rules/flake8_quotes/rules/check_string_quotes.rs index aae3f18480ebcd..43fbf7ad6ded78 100644 --- a/crates/ruff_linter/src/rules/flake8_quotes/rules/check_string_quotes.rs +++ b/crates/ruff_linter/src/rules/flake8_quotes/rules/check_string_quotes.rs @@ -37,6 +37,7 @@ use crate::rules::flake8_quotes::settings::Quote; /// /// [formatter]: https://docs.astral.sh/ruff/formatter #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.88")] pub(crate) struct BadQuotesInlineString { preferred_quote: Quote, } @@ -94,6 +95,7 @@ impl Violation for BadQuotesInlineString { /// /// [formatter]: https://docs.astral.sh/ruff/formatter #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.88")] pub(crate) struct BadQuotesMultilineString { preferred_quote: Quote, } @@ -149,6 +151,7 @@ impl AlwaysFixableViolation for BadQuotesMultilineString { /// /// [formatter]: https://docs.astral.sh/ruff/formatter #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.88")] pub(crate) struct BadQuotesDocstring { preferred_quote: Quote, } diff --git a/crates/ruff_linter/src/rules/flake8_quotes/rules/unnecessary_escaped_quote.rs b/crates/ruff_linter/src/rules/flake8_quotes/rules/unnecessary_escaped_quote.rs index 4100097e03d36f..6b76f4b617d186 100644 --- a/crates/ruff_linter/src/rules/flake8_quotes/rules/unnecessary_escaped_quote.rs +++ b/crates/ruff_linter/src/rules/flake8_quotes/rules/unnecessary_escaped_quote.rs @@ -33,6 +33,7 @@ use crate::rules::flake8_quotes::helpers::{contains_escaped_quote, raw_contents, /// /// [formatter]: https://docs.astral.sh/ruff/formatter #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct UnnecessaryEscapedQuote; impl AlwaysFixableViolation for UnnecessaryEscapedQuote { diff --git a/crates/ruff_linter/src/rules/flake8_raise/rules/unnecessary_paren_on_raise_exception.rs b/crates/ruff_linter/src/rules/flake8_raise/rules/unnecessary_paren_on_raise_exception.rs index e3a66cf35b123e..07ca59a9a2568b 100644 --- a/crates/ruff_linter/src/rules/flake8_raise/rules/unnecessary_paren_on_raise_exception.rs +++ b/crates/ruff_linter/src/rules/flake8_raise/rules/unnecessary_paren_on_raise_exception.rs @@ -43,6 +43,7 @@ use crate::{AlwaysFixableViolation, Applicability, Edit, Fix}; /// ## References /// - [Python documentation: The `raise` statement](https://docs.python.org/3/reference/simple_stmts.html#the-raise-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.239")] pub(crate) struct UnnecessaryParenOnRaiseException; impl AlwaysFixableViolation for UnnecessaryParenOnRaiseException { diff --git a/crates/ruff_linter/src/rules/flake8_return/rules/function.rs b/crates/ruff_linter/src/rules/flake8_return/rules/function.rs index 8fd3ae0b44af97..018ddd925b86b7 100644 --- a/crates/ruff_linter/src/rules/flake8_return/rules/function.rs +++ b/crates/ruff_linter/src/rules/flake8_return/rules/function.rs @@ -56,6 +56,7 @@ use crate::rules::flake8_return::visitor::{ReturnVisitor, Stack}; /// This rule's fix is marked as unsafe for cases in which comments would be /// dropped from the `return` statement. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.154")] pub(crate) struct UnnecessaryReturnNone; impl AlwaysFixableViolation for UnnecessaryReturnNone { @@ -97,6 +98,7 @@ impl AlwaysFixableViolation for UnnecessaryReturnNone { /// return 1 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.154")] pub(crate) struct ImplicitReturnValue; impl AlwaysFixableViolation for ImplicitReturnValue { @@ -135,6 +137,7 @@ impl AlwaysFixableViolation for ImplicitReturnValue { /// return None /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.154")] pub(crate) struct ImplicitReturn; impl AlwaysFixableViolation for ImplicitReturn { @@ -170,6 +173,7 @@ impl AlwaysFixableViolation for ImplicitReturn { /// return 1 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.154")] pub(crate) struct UnnecessaryAssign { name: String, } @@ -212,6 +216,7 @@ impl AlwaysFixableViolation for UnnecessaryAssign { /// return baz /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.154")] pub(crate) struct SuperfluousElseReturn { branch: Branch, } @@ -256,6 +261,7 @@ impl Violation for SuperfluousElseReturn { /// raise Exception(baz) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.154")] pub(crate) struct SuperfluousElseRaise { branch: Branch, } @@ -302,6 +308,7 @@ impl Violation for SuperfluousElseRaise { /// x = 0 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.154")] pub(crate) struct SuperfluousElseContinue { branch: Branch, } @@ -348,6 +355,7 @@ impl Violation for SuperfluousElseContinue { /// x = 0 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.154")] pub(crate) struct SuperfluousElseBreak { branch: Branch, } diff --git a/crates/ruff_linter/src/rules/flake8_self/rules/private_member_access.rs b/crates/ruff_linter/src/rules/flake8_self/rules/private_member_access.rs index 2326e24ea3591d..1b2db08b00c69c 100644 --- a/crates/ruff_linter/src/rules/flake8_self/rules/private_member_access.rs +++ b/crates/ruff_linter/src/rules/flake8_self/rules/private_member_access.rs @@ -55,6 +55,7 @@ use crate::rules::pylint::helpers::is_dunder_operator_method; /// ## References /// - [_What is the meaning of single or double underscores before an object name?_](https://stackoverflow.com/questions/1301346/what-is-the-meaning-of-single-and-double-underscore-before-an-object-name) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.240")] pub(crate) struct PrivateMemberAccess { access: String, } diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_bool_op.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_bool_op.rs index 398bd63860b04a..0b53a271f49398 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_bool_op.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_bool_op.rs @@ -45,6 +45,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `isinstance`](https://docs.python.org/3/library/functions.html#isinstance) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.212")] pub(crate) struct DuplicateIsinstanceCall { name: Option, } @@ -93,6 +94,7 @@ impl Violation for DuplicateIsinstanceCall { /// ## References /// - [Python documentation: Membership test operations](https://docs.python.org/3/reference/expressions.html#membership-test-operations) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.213")] pub(crate) struct CompareWithTuple { replacement: String, } @@ -126,6 +128,7 @@ impl AlwaysFixableViolation for CompareWithTuple { /// ## References /// - [Python documentation: Boolean operations](https://docs.python.org/3/reference/expressions.html#boolean-operations) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.211")] pub(crate) struct ExprAndNotExpr { name: String, } @@ -158,6 +161,7 @@ impl AlwaysFixableViolation for ExprAndNotExpr { /// ## References /// - [Python documentation: Boolean operations](https://docs.python.org/3/reference/expressions.html#boolean-operations) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.211")] pub(crate) struct ExprOrNotExpr { name: String, } @@ -210,6 +214,7 @@ pub(crate) enum ContentAround { /// a = x or [1] /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct ExprOrTrue { expr: String, remove: ContentAround, @@ -262,6 +267,7 @@ impl AlwaysFixableViolation for ExprOrTrue { /// a = x and [] /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.208")] pub(crate) struct ExprAndFalse { expr: String, remove: ContentAround, diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_expr.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_expr.rs index d48598fda71a56..58860dc56e6f4a 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_expr.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_expr.rs @@ -41,6 +41,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `os.environ`](https://docs.python.org/3/library/os.html#os.environ) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.218")] pub(crate) struct UncapitalizedEnvironmentVariables { expected: SourceCodeSnippet, actual: SourceCodeSnippet, @@ -91,6 +92,7 @@ impl Violation for UncapitalizedEnvironmentVariables { /// ## References /// - [Python documentation: `dict.get`](https://docs.python.org/3/library/stdtypes.html#dict.get) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.261")] pub(crate) struct DictGetWithNoneDefault { expected: SourceCodeSnippet, actual: SourceCodeSnippet, diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_ifexp.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_ifexp.rs index 1f4c12179f9ba3..15b2f54bf8c2d4 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_ifexp.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_ifexp.rs @@ -37,6 +37,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: Truth Value Testing](https://docs.python.org/3/library/stdtypes.html#truth-value-testing) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.214")] pub(crate) struct IfExprWithTrueFalse { is_compare: bool, } @@ -85,6 +86,7 @@ impl Violation for IfExprWithTrueFalse { /// ## References /// - [Python documentation: Truth Value Testing](https://docs.python.org/3/library/stdtypes.html#truth-value-testing) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.214")] pub(crate) struct IfExprWithFalseTrue; impl AlwaysFixableViolation for IfExprWithFalseTrue { @@ -118,6 +120,7 @@ impl AlwaysFixableViolation for IfExprWithFalseTrue { /// ## References /// - [Python documentation: Truth Value Testing](https://docs.python.org/3/library/stdtypes.html#truth-value-testing) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.214")] pub(crate) struct IfExprWithTwistedArms { expr_body: String, expr_else: String, diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_unary_op.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_unary_op.rs index d00393aa664be9..f7977066cff589 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_unary_op.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_unary_op.rs @@ -33,6 +33,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: Comparisons](https://docs.python.org/3/reference/expressions.html#comparisons) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.213")] pub(crate) struct NegateEqualOp { left: String, right: String, @@ -75,6 +76,7 @@ impl AlwaysFixableViolation for NegateEqualOp { /// ## References /// - [Python documentation: Comparisons](https://docs.python.org/3/reference/expressions.html#comparisons) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.213")] pub(crate) struct NegateNotEqualOp { left: String, right: String, @@ -112,6 +114,7 @@ impl AlwaysFixableViolation for NegateNotEqualOp { /// ## References /// - [Python documentation: Comparisons](https://docs.python.org/3/reference/expressions.html#comparisons) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.213")] pub(crate) struct DoubleNegation { expr: String, } diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_with.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_with.rs index 973adba1a83f19..c115122453f4f2 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_with.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/ast_with.rs @@ -47,6 +47,7 @@ use crate::{FixAvailability, Violation}; /// ## References /// - [Python documentation: The `with` statement](https://docs.python.org/3/reference/compound_stmts.html#the-with-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.211")] pub(crate) struct MultipleWithStatements; impl Violation for MultipleWithStatements { diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/collapsible_if.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/collapsible_if.rs index 9131a0369c4e3c..f0d726cc52cf8b 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/collapsible_if.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/collapsible_if.rs @@ -46,6 +46,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [Python documentation: The `if` statement](https://docs.python.org/3/reference/compound_stmts.html#the-if-statement) /// - [Python documentation: Boolean operations](https://docs.python.org/3/reference/expressions.html#boolean-operations) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.211")] pub(crate) struct CollapsibleIf; impl Violation for CollapsibleIf { diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/enumerate_for_loop.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/enumerate_for_loop.rs index 4f4d0c39687a86..6739fa38687f43 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/enumerate_for_loop.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/enumerate_for_loop.rs @@ -36,6 +36,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `enumerate`](https://docs.python.org/3/library/functions.html#enumerate) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct EnumerateForLoop { index: String, } diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_dict_get.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_dict_get.rs index 1441c87154d000..91f837647ff90e 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_dict_get.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_dict_get.rs @@ -53,6 +53,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: Mapping Types](https://docs.python.org/3/library/stdtypes.html#mapping-types-dict) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.219")] pub(crate) struct IfElseBlockInsteadOfDictGet { contents: String, } diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_dict_lookup.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_dict_lookup.rs index e3e7a41b631365..8b0454355bb3e5 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_dict_lookup.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_dict_lookup.rs @@ -36,6 +36,7 @@ use crate::checkers::ast::Checker; /// return phrases.get(x, "Goodnight") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.250")] pub(crate) struct IfElseBlockInsteadOfDictLookup; impl Violation for IfElseBlockInsteadOfDictLookup { diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_if_exp.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_if_exp.rs index db904d6dd13053..f69098f6973570 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_if_exp.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/if_else_block_instead_of_if_exp.rs @@ -61,6 +61,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// [code coverage]: https://github.com/nedbat/coveragepy/issues/509 /// [pycodestyle.max-line-length]: https://docs.astral.sh/ruff/settings/#lint_pycodestyle_max-line-length #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.213")] pub(crate) struct IfElseBlockInsteadOfIfExp { /// The ternary or binary expression to replace the `if`-`else`-block. contents: String, diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/if_with_same_arms.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/if_with_same_arms.rs index 404c78e260475d..92182b383a82e3 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/if_with_same_arms.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/if_with_same_arms.rs @@ -36,6 +36,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// print("Hello") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.246")] pub(crate) struct IfWithSameArms; impl Violation for IfWithSameArms { diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/key_in_dict.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/key_in_dict.rs index da647235e19de2..5ced08a673d1c2 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/key_in_dict.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/key_in_dict.rs @@ -38,6 +38,7 @@ use crate::{Applicability, Edit}; /// ## References /// - [Python documentation: Mapping Types](https://docs.python.org/3/library/stdtypes.html#mapping-types-dict) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.176")] pub(crate) struct InDictKeys { operator: String, } diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/needless_bool.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/needless_bool.rs index 1d64db5fc82e87..4b2dbb7d9a8bad 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/needless_bool.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/needless_bool.rs @@ -56,6 +56,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: Truth Value Testing](https://docs.python.org/3/library/stdtypes.html#truth-value-testing) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.214")] pub(crate) struct NeedlessBool { condition: Option, negate: bool, diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/open_file_with_context_handler.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/open_file_with_context_handler.rs index 33c789455fbd8b..a21af6475f108a 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/open_file_with_context_handler.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/open_file_with_context_handler.rs @@ -34,6 +34,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `open`](https://docs.python.org/3/library/functions.html#open) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.219")] pub(crate) struct OpenFileWithContextHandler; impl Violation for OpenFileWithContextHandler { diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/reimplemented_builtin.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/reimplemented_builtin.rs index 5ad99330e86292..9c216311ed1723 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/reimplemented_builtin.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/reimplemented_builtin.rs @@ -44,6 +44,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [Python documentation: `any`](https://docs.python.org/3/library/functions.html#any) /// - [Python documentation: `all`](https://docs.python.org/3/library/functions.html#all) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.211")] pub(crate) struct ReimplementedBuiltin { replacement: String, } diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/return_in_try_except_finally.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/return_in_try_except_finally.rs index 636b490673a581..e574f51adc0957 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/return_in_try_except_finally.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/return_in_try_except_finally.rs @@ -41,6 +41,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: Defining Clean-up Actions](https://docs.python.org/3/tutorial/errors.html#defining-clean-up-actions) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.211")] pub(crate) struct ReturnInTryExceptFinally; impl Violation for ReturnInTryExceptFinally { diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/split_static_string.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/split_static_string.rs index 05e5eddf4ff6a2..ffd4ee30c5cb5f 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/split_static_string.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/split_static_string.rs @@ -47,6 +47,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `str.split`](https://docs.python.org/3/library/stdtypes.html#str.split) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct SplitStaticString { method: Method, } diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/suppressible_exception.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/suppressible_exception.rs index d3b93e3dbbe843..2dc4a778f4e1d6 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/suppressible_exception.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/suppressible_exception.rs @@ -43,6 +43,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [Python documentation: `try` statement](https://docs.python.org/3/reference/compound_stmts.html#the-try-statement) /// - [a simpler `try`/`except` (and why maybe shouldn't)](https://www.youtube.com/watch?v=MZAJ8qnC7mk) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.211")] pub(crate) struct SuppressibleException { exception: String, } diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/yoda_conditions.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/yoda_conditions.rs index a21b960af07d4f..687729c20c251d 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/yoda_conditions.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/yoda_conditions.rs @@ -48,6 +48,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [Python documentation: Comparisons](https://docs.python.org/3/reference/expressions.html#comparisons) /// - [Python documentation: Assignment statements](https://docs.python.org/3/reference/simple_stmts.html#assignment-statements) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.207")] pub(crate) struct YodaConditions { suggestion: Option, } diff --git a/crates/ruff_linter/src/rules/flake8_simplify/rules/zip_dict_keys_and_values.rs b/crates/ruff_linter/src/rules/flake8_simplify/rules/zip_dict_keys_and_values.rs index 28d123fab3da42..19169b72c7f897 100644 --- a/crates/ruff_linter/src/rules/flake8_simplify/rules/zip_dict_keys_and_values.rs +++ b/crates/ruff_linter/src/rules/flake8_simplify/rules/zip_dict_keys_and_values.rs @@ -33,6 +33,7 @@ use crate::{checkers::ast::Checker, fix::snippet::SourceCodeSnippet}; /// ## References /// - [Python documentation: `dict.items`](https://docs.python.org/3/library/stdtypes.html#dict.items) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct ZipDictKeysAndValues { expected: SourceCodeSnippet, actual: SourceCodeSnippet, diff --git a/crates/ruff_linter/src/rules/flake8_slots/rules/no_slots_in_namedtuple_subclass.rs b/crates/ruff_linter/src/rules/flake8_slots/rules/no_slots_in_namedtuple_subclass.rs index 37d2084c965319..142233a4bf4f0e 100644 --- a/crates/ruff_linter/src/rules/flake8_slots/rules/no_slots_in_namedtuple_subclass.rs +++ b/crates/ruff_linter/src/rules/flake8_slots/rules/no_slots_in_namedtuple_subclass.rs @@ -47,6 +47,7 @@ use crate::rules::flake8_slots::helpers::has_slots; /// ## References /// - [Python documentation: `__slots__`](https://docs.python.org/3/reference/datamodel.html#slots) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.273")] pub(crate) struct NoSlotsInNamedtupleSubclass(NamedTupleKind); impl Violation for NoSlotsInNamedtupleSubclass { diff --git a/crates/ruff_linter/src/rules/flake8_slots/rules/no_slots_in_str_subclass.rs b/crates/ruff_linter/src/rules/flake8_slots/rules/no_slots_in_str_subclass.rs index 198071aaa4b573..6ab13988e7518e 100644 --- a/crates/ruff_linter/src/rules/flake8_slots/rules/no_slots_in_str_subclass.rs +++ b/crates/ruff_linter/src/rules/flake8_slots/rules/no_slots_in_str_subclass.rs @@ -39,6 +39,7 @@ use crate::rules::flake8_slots::helpers::has_slots; /// ## References /// - [Python documentation: `__slots__`](https://docs.python.org/3/reference/datamodel.html#slots) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.273")] pub(crate) struct NoSlotsInStrSubclass; impl Violation for NoSlotsInStrSubclass { diff --git a/crates/ruff_linter/src/rules/flake8_slots/rules/no_slots_in_tuple_subclass.rs b/crates/ruff_linter/src/rules/flake8_slots/rules/no_slots_in_tuple_subclass.rs index dd9cea0ad34aba..addc7bd421aaeb 100644 --- a/crates/ruff_linter/src/rules/flake8_slots/rules/no_slots_in_tuple_subclass.rs +++ b/crates/ruff_linter/src/rules/flake8_slots/rules/no_slots_in_tuple_subclass.rs @@ -40,6 +40,7 @@ use crate::rules::flake8_slots::helpers::has_slots; /// ## References /// - [Python documentation: `__slots__`](https://docs.python.org/3/reference/datamodel.html#slots) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.273")] pub(crate) struct NoSlotsInTupleSubclass; impl Violation for NoSlotsInTupleSubclass { diff --git a/crates/ruff_linter/src/rules/flake8_tidy_imports/rules/banned_api.rs b/crates/ruff_linter/src/rules/flake8_tidy_imports/rules/banned_api.rs index dc352e3e4ecb91..6ada01522265ab 100644 --- a/crates/ruff_linter/src/rules/flake8_tidy_imports/rules/banned_api.rs +++ b/crates/ruff_linter/src/rules/flake8_tidy_imports/rules/banned_api.rs @@ -25,6 +25,7 @@ use crate::rules::flake8_tidy_imports::matchers::NameMatchPolicy; /// ## Options /// - `lint.flake8-tidy-imports.banned-api` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.201")] pub(crate) struct BannedApi { name: String, message: String, diff --git a/crates/ruff_linter/src/rules/flake8_tidy_imports/rules/banned_module_level_imports.rs b/crates/ruff_linter/src/rules/flake8_tidy_imports/rules/banned_module_level_imports.rs index 6527d8d522dbad..23d250f7a9fb00 100644 --- a/crates/ruff_linter/src/rules/flake8_tidy_imports/rules/banned_module_level_imports.rs +++ b/crates/ruff_linter/src/rules/flake8_tidy_imports/rules/banned_module_level_imports.rs @@ -43,6 +43,7 @@ use crate::rules::flake8_tidy_imports::matchers::{MatchName, MatchNameOrParent, /// ## Options /// - `lint.flake8-tidy-imports.banned-module-level-imports` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.285")] pub(crate) struct BannedModuleLevelImports { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_tidy_imports/rules/relative_imports.rs b/crates/ruff_linter/src/rules/flake8_tidy_imports/rules/relative_imports.rs index e88906787be6e1..bc77a55716f4a3 100644 --- a/crates/ruff_linter/src/rules/flake8_tidy_imports/rules/relative_imports.rs +++ b/crates/ruff_linter/src/rules/flake8_tidy_imports/rules/relative_imports.rs @@ -46,6 +46,7 @@ use crate::rules::flake8_tidy_imports::settings::Strictness; /// /// [PEP 8]: https://peps.python.org/pep-0008/#imports #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.169")] pub(crate) struct RelativeImports { strictness: Strictness, } diff --git a/crates/ruff_linter/src/rules/flake8_todos/rules/todos.rs b/crates/ruff_linter/src/rules/flake8_todos/rules/todos.rs index 24125023a69308..b46e4d44aa23f7 100644 --- a/crates/ruff_linter/src/rules/flake8_todos/rules/todos.rs +++ b/crates/ruff_linter/src/rules/flake8_todos/rules/todos.rs @@ -31,6 +31,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix, Violation}; /// # TODO(ruff): this is now fixed! /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.269")] pub(crate) struct InvalidTodoTag { pub tag: String, } @@ -61,6 +62,7 @@ impl Violation for InvalidTodoTag { /// # TODO(charlie): now an author is assigned /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.269")] pub(crate) struct MissingTodoAuthor; impl Violation for MissingTodoAuthor { @@ -102,6 +104,7 @@ impl Violation for MissingTodoAuthor { /// # SIXCHR-003 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.269")] pub(crate) struct MissingTodoLink; impl Violation for MissingTodoLink { @@ -131,6 +134,7 @@ impl Violation for MissingTodoLink { /// # TODO(charlie): colon fixed /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.269")] pub(crate) struct MissingTodoColon; impl Violation for MissingTodoColon { @@ -158,6 +162,7 @@ impl Violation for MissingTodoColon { /// # TODO(charlie): fix some issue /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.269")] pub(crate) struct MissingTodoDescription; impl Violation for MissingTodoDescription { @@ -185,6 +190,7 @@ impl Violation for MissingTodoDescription { /// # TODO(charlie): this is capitalized /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.269")] pub(crate) struct InvalidTodoCapitalization { tag: String, } @@ -222,6 +228,7 @@ impl AlwaysFixableViolation for InvalidTodoCapitalization { /// # TODO(charlie): fix this /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.269")] pub(crate) struct MissingSpaceAfterTodoColon; impl Violation for MissingSpaceAfterTodoColon { diff --git a/crates/ruff_linter/src/rules/flake8_type_checking/rules/empty_type_checking_block.rs b/crates/ruff_linter/src/rules/flake8_type_checking/rules/empty_type_checking_block.rs index c6b935929d5e82..4299a918041376 100644 --- a/crates/ruff_linter/src/rules/flake8_type_checking/rules/empty_type_checking_block.rs +++ b/crates/ruff_linter/src/rules/flake8_type_checking/rules/empty_type_checking_block.rs @@ -33,6 +33,7 @@ use crate::{AlwaysFixableViolation, Fix}; /// ## References /// - [PEP 563: Runtime annotation resolution and `TYPE_CHECKING`](https://peps.python.org/pep-0563/#runtime-annotation-resolution-and-type-checking) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct EmptyTypeCheckingBlock; impl AlwaysFixableViolation for EmptyTypeCheckingBlock { diff --git a/crates/ruff_linter/src/rules/flake8_type_checking/rules/runtime_cast_value.rs b/crates/ruff_linter/src/rules/flake8_type_checking/rules/runtime_cast_value.rs index 1db267f67703b9..40c210dee17c51 100644 --- a/crates/ruff_linter/src/rules/flake8_type_checking/rules/runtime_cast_value.rs +++ b/crates/ruff_linter/src/rules/flake8_type_checking/rules/runtime_cast_value.rs @@ -43,6 +43,7 @@ use crate::{AlwaysFixableViolation, Fix}; /// This fix is safe as long as the type expression doesn't span multiple /// lines and includes comments on any of the lines apart from the last one. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct RuntimeCastValue; impl AlwaysFixableViolation for RuntimeCastValue { diff --git a/crates/ruff_linter/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs b/crates/ruff_linter/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs index e3cbf17a02b58b..e96b3b7bc6e2b4 100644 --- a/crates/ruff_linter/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs +++ b/crates/ruff_linter/src/rules/flake8_type_checking/rules/runtime_import_in_type_checking_block.rs @@ -54,6 +54,7 @@ use crate::{Fix, FixAvailability, Violation}; /// ## References /// - [PEP 563: Runtime annotation resolution and `TYPE_CHECKING`](https://peps.python.org/pep-0563/#runtime-annotation-resolution-and-type-checking) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct RuntimeImportInTypeCheckingBlock { qualified_name: String, strategy: Strategy, diff --git a/crates/ruff_linter/src/rules/flake8_type_checking/rules/runtime_string_union.rs b/crates/ruff_linter/src/rules/flake8_type_checking/rules/runtime_string_union.rs index 1c103e0db87d3f..40c6a066b6a5e0 100644 --- a/crates/ruff_linter/src/rules/flake8_type_checking/rules/runtime_string_union.rs +++ b/crates/ruff_linter/src/rules/flake8_type_checking/rules/runtime_string_union.rs @@ -53,6 +53,7 @@ use crate::checkers::ast::Checker; /// /// [PEP 604]: https://peps.python.org/pep-0604/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct RuntimeStringUnion; impl Violation for RuntimeStringUnion { diff --git a/crates/ruff_linter/src/rules/flake8_type_checking/rules/type_alias_quotes.rs b/crates/ruff_linter/src/rules/flake8_type_checking/rules/type_alias_quotes.rs index 53c1d004c300c3..776ce1486efedf 100644 --- a/crates/ruff_linter/src/rules/flake8_type_checking/rules/type_alias_quotes.rs +++ b/crates/ruff_linter/src/rules/flake8_type_checking/rules/type_alias_quotes.rs @@ -49,6 +49,7 @@ use ruff_python_ast::parenthesize::parenthesized_range; /// /// [PEP 613]: https://peps.python.org/pep-0613/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct UnquotedTypeAlias; impl Violation for UnquotedTypeAlias { @@ -133,6 +134,7 @@ impl Violation for UnquotedTypeAlias { /// [PYI020]: https://docs.astral.sh/ruff/rules/quoted-annotation-in-stub/ /// [UP037]: https://docs.astral.sh/ruff/rules/quoted-annotation/ #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.8.1")] pub(crate) struct QuotedTypeAlias; impl AlwaysFixableViolation for QuotedTypeAlias { diff --git a/crates/ruff_linter/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs b/crates/ruff_linter/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs index 9327f6803cc9a6..f1918596b17310 100644 --- a/crates/ruff_linter/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs +++ b/crates/ruff_linter/src/rules/flake8_type_checking/rules/typing_only_runtime_import.rs @@ -81,6 +81,7 @@ use crate::{Fix, FixAvailability, Violation}; /// ## References /// - [PEP 563: Runtime annotation resolution and `TYPE_CHECKING`](https://peps.python.org/pep-0563/#runtime-annotation-resolution-and-type-checking) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct TypingOnlyFirstPartyImport { qualified_name: String, } @@ -163,6 +164,7 @@ impl Violation for TypingOnlyFirstPartyImport { /// ## References /// - [PEP 563: Runtime annotation resolution and `TYPE_CHECKING`](https://peps.python.org/pep-0563/#runtime-annotation-resolution-and-type-checking) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct TypingOnlyThirdPartyImport { qualified_name: String, } @@ -245,6 +247,7 @@ impl Violation for TypingOnlyThirdPartyImport { /// ## References /// - [PEP 563: Runtime annotation resolution and `TYPE_CHECKING`](https://peps.python.org/pep-0563/#runtime-annotation-resolution-and-type-checking) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct TypingOnlyStandardLibraryImport { qualified_name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_unused_arguments/rules/unused_arguments.rs b/crates/ruff_linter/src/rules/flake8_unused_arguments/rules/unused_arguments.rs index 2aff59aa32d191..18d0a9637742f0 100644 --- a/crates/ruff_linter/src/rules/flake8_unused_arguments/rules/unused_arguments.rs +++ b/crates/ruff_linter/src/rules/flake8_unused_arguments/rules/unused_arguments.rs @@ -36,6 +36,7 @@ use crate::registry::Rule; /// ## Options /// - `lint.dummy-variable-rgx` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.168")] pub(crate) struct UnusedFunctionArgument { name: String, } @@ -76,6 +77,7 @@ impl Violation for UnusedFunctionArgument { /// ## Options /// - `lint.dummy-variable-rgx` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.168")] pub(crate) struct UnusedMethodArgument { name: String, } @@ -118,6 +120,7 @@ impl Violation for UnusedMethodArgument { /// ## Options /// - `lint.dummy-variable-rgx` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.168")] pub(crate) struct UnusedClassMethodArgument { name: String, } @@ -160,6 +163,7 @@ impl Violation for UnusedClassMethodArgument { /// ## Options /// - `lint.dummy-variable-rgx` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.168")] pub(crate) struct UnusedStaticMethodArgument { name: String, } @@ -199,6 +203,7 @@ impl Violation for UnusedStaticMethodArgument { /// ## Options /// - `lint.dummy-variable-rgx` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.168")] pub(crate) struct UnusedLambdaArgument { name: String, } diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/builtin_open.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/builtin_open.rs index e6802131c2c613..c88519c8441017 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/builtin_open.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/builtin_open.rs @@ -50,6 +50,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct BuiltinOpen; impl Violation for BuiltinOpen { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/glob_rule.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/glob_rule.rs index 3c329bf20d769d..b131679ff4875c 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/glob_rule.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/glob_rule.rs @@ -51,6 +51,7 @@ use crate::Violation; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.281")] pub(crate) struct Glob { pub function: String, } diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/invalid_pathlib_with_suffix.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/invalid_pathlib_with_suffix.rs index 3bd4c5a0919f6f..fc66c338559d19 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/invalid_pathlib_with_suffix.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/invalid_pathlib_with_suffix.rs @@ -57,6 +57,7 @@ use ruff_text_size::Ranged; /// /// No fix is offered if the suffix `"."` is given, since the intent is unclear. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct InvalidPathlibWithSuffix { single_dot: bool, } diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_chmod.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_chmod.rs index 26366c8808b5c4..a6f851ca89c305 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_chmod.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_chmod.rs @@ -51,6 +51,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsChmod; impl Violation for OsChmod { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_getcwd.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_getcwd.rs index 33e45b488b1826..7bb533246daf36 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_getcwd.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_getcwd.rs @@ -47,6 +47,7 @@ use ruff_text_size::Ranged; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsGetcwd; impl Violation for OsGetcwd { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_makedirs.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_makedirs.rs index f2c668c9b02e95..27aec3e66cffa1 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_makedirs.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_makedirs.rs @@ -50,6 +50,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsMakedirs; impl Violation for OsMakedirs { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_mkdir.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_mkdir.rs index c744d3ebd287b5..86eec34df90484 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_mkdir.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_mkdir.rs @@ -51,6 +51,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsMkdir; impl Violation for OsMkdir { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_abspath.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_abspath.rs index 419c05bcccf44f..9b58561e889ee6 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_abspath.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_abspath.rs @@ -53,6 +53,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsPathAbspath; impl Violation for OsPathAbspath { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_basename.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_basename.rs index b517d00a7b5cfc..ca69d07ce347b2 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_basename.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_basename.rs @@ -55,6 +55,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsPathBasename; impl Violation for OsPathBasename { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_dirname.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_dirname.rs index e8628647a54aea..d3175c2035f32a 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_dirname.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_dirname.rs @@ -55,6 +55,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsPathDirname; impl Violation for OsPathDirname { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_exists.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_exists.rs index 53e441883d5225..f3fe32a6418d66 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_exists.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_exists.rs @@ -45,6 +45,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsPathExists; impl Violation for OsPathExists { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_expanduser.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_expanduser.rs index f1110f7d9e0151..d544acde39e16d 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_expanduser.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_expanduser.rs @@ -49,6 +49,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsPathExpanduser; impl Violation for OsPathExpanduser { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_getatime.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_getatime.rs index 7797ea5745edab..0f148f403382d6 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_getatime.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_getatime.rs @@ -47,6 +47,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.279")] pub(crate) struct OsPathGetatime; impl Violation for OsPathGetatime { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_getctime.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_getctime.rs index 873a2298650e99..86bce28aed079b 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_getctime.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_getctime.rs @@ -47,6 +47,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.279")] pub(crate) struct OsPathGetctime; impl Violation for OsPathGetctime { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_getmtime.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_getmtime.rs index 0d3cda75cdfd53..42e77e3fe91cde 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_getmtime.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_getmtime.rs @@ -47,6 +47,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.279")] pub(crate) struct OsPathGetmtime; impl Violation for OsPathGetmtime { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_getsize.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_getsize.rs index fe3baf42418334..a945b2224ccfdc 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_getsize.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_getsize.rs @@ -47,6 +47,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.279")] pub(crate) struct OsPathGetsize; impl Violation for OsPathGetsize { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_isabs.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_isabs.rs index 355c6987a40a48..b1c8cb33c308d5 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_isabs.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_isabs.rs @@ -44,6 +44,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsPathIsabs; impl Violation for OsPathIsabs { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_isdir.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_isdir.rs index 3c8ee3f7a636d8..a2c1b8620fcd49 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_isdir.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_isdir.rs @@ -45,6 +45,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsPathIsdir; impl Violation for OsPathIsdir { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_isfile.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_isfile.rs index a1ed2a56017573..d31e39eef79aa3 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_isfile.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_isfile.rs @@ -45,6 +45,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsPathIsfile; impl Violation for OsPathIsfile { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_islink.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_islink.rs index 5b6c879de96b61..d958a2c19c6d20 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_islink.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_islink.rs @@ -45,6 +45,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsPathIslink; impl Violation for OsPathIslink { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_samefile.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_samefile.rs index e0d563be220b89..cbf6d7a034c62a 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_samefile.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_path_samefile.rs @@ -46,6 +46,7 @@ use ruff_python_ast::ExprCall; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsPathSamefile; impl Violation for OsPathSamefile { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_readlink.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_readlink.rs index 3cf990b035769e..d1df572ed57e55 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_readlink.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_readlink.rs @@ -47,6 +47,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsReadlink; impl Violation for OsReadlink { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_remove.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_remove.rs index 56975ddc3d0113..43852e11e2d126 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_remove.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_remove.rs @@ -47,6 +47,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsRemove; impl Violation for OsRemove { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_rename.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_rename.rs index ada81a0146e7ca..c5f2293ee9261f 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_rename.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_rename.rs @@ -47,6 +47,7 @@ use ruff_python_ast::ExprCall; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsRename; impl Violation for OsRename { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_replace.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_replace.rs index 6670e724ef0e2d..ef60099467acbb 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_replace.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_replace.rs @@ -50,6 +50,7 @@ use ruff_python_ast::ExprCall; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsReplace; impl Violation for OsReplace { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_rmdir.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_rmdir.rs index 0e0320b6eba98e..a044e541b96583 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_rmdir.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_rmdir.rs @@ -47,6 +47,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsRmdir; impl Violation for OsRmdir { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_sep_split.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_sep_split.rs index f6e01d037cb673..8a74dd1106728c 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_sep_split.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_sep_split.rs @@ -53,6 +53,7 @@ use crate::checkers::ast::Checker; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.281")] pub(crate) struct OsSepSplit; impl Violation for OsSepSplit { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_symlink.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_symlink.rs index 2ba322ab8fb857..6e54acabb4d661 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_symlink.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_symlink.rs @@ -48,6 +48,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.13.0")] pub(crate) struct OsSymlink; impl Violation for OsSymlink { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_unlink.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_unlink.rs index d071b3cebcc6d9..9f4902546581d3 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_unlink.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/os_unlink.rs @@ -47,6 +47,7 @@ use crate::{FixAvailability, Violation}; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsUnlink; impl Violation for OsUnlink { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/path_constructor_current_directory.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/path_constructor_current_directory.rs index c909c312acdcc8..bf5a4ed8b74271 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/path_constructor_current_directory.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/rules/path_constructor_current_directory.rs @@ -41,6 +41,7 @@ use crate::{AlwaysFixableViolation, Applicability, Edit, Fix}; /// ## References /// - [Python documentation: `Path`](https://docs.python.org/3/library/pathlib.html#pathlib.Path) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.279")] pub(crate) struct PathConstructorCurrentDirectory; impl AlwaysFixableViolation for PathConstructorCurrentDirectory { diff --git a/crates/ruff_linter/src/rules/flake8_use_pathlib/violations.rs b/crates/ruff_linter/src/rules/flake8_use_pathlib/violations.rs index 6108ff3a278402..b5bcfdb1e3d107 100644 --- a/crates/ruff_linter/src/rules/flake8_use_pathlib/violations.rs +++ b/crates/ruff_linter/src/rules/flake8_use_pathlib/violations.rs @@ -47,6 +47,7 @@ use crate::Violation; /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsStat; impl Violation for OsStat { @@ -93,6 +94,7 @@ impl Violation for OsStat { /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsPathJoin { pub(crate) module: String, pub(crate) joiner: Joiner, @@ -164,6 +166,7 @@ pub(crate) enum Joiner { /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct OsPathSplitext; impl Violation for OsPathSplitext { @@ -200,6 +203,7 @@ impl Violation for OsPathSplitext { /// - [Python documentation: `Pathlib`](https://docs.python.org/3/library/pathlib.html) /// - [Path repository](https://github.com/jaraco/path) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct PyPath; impl Violation for PyPath { @@ -258,6 +262,7 @@ impl Violation for PyPath { /// - [Why you should be using pathlib](https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/) /// - [No really, pathlib is great](https://treyhunner.com/2019/01/no-really-pathlib-is-great/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct OsListdir; impl Violation for OsListdir { diff --git a/crates/ruff_linter/src/rules/flynt/rules/static_join_to_fstring.rs b/crates/ruff_linter/src/rules/flynt/rules/static_join_to_fstring.rs index e4466544576729..bdc734097484c9 100644 --- a/crates/ruff_linter/src/rules/flynt/rules/static_join_to_fstring.rs +++ b/crates/ruff_linter/src/rules/flynt/rules/static_join_to_fstring.rs @@ -39,6 +39,7 @@ use crate::rules::flynt::helpers; /// ## References /// - [Python documentation: f-strings](https://docs.python.org/3/reference/lexical_analysis.html#f-strings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.266")] pub(crate) struct StaticJoinToFString { expression: SourceCodeSnippet, } diff --git a/crates/ruff_linter/src/rules/isort/rules/add_required_imports.rs b/crates/ruff_linter/src/rules/isort/rules/add_required_imports.rs index e674c8fe9ad2e5..b887e1c2a073c3 100644 --- a/crates/ruff_linter/src/rules/isort/rules/add_required_imports.rs +++ b/crates/ruff_linter/src/rules/isort/rules/add_required_imports.rs @@ -39,6 +39,7 @@ use crate::{AlwaysFixableViolation, Fix}; /// ## Options /// - `lint.isort.required-imports` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.218")] pub(crate) struct MissingRequiredImport(pub String); impl AlwaysFixableViolation for MissingRequiredImport { diff --git a/crates/ruff_linter/src/rules/isort/rules/organize_imports.rs b/crates/ruff_linter/src/rules/isort/rules/organize_imports.rs index a8d5d68ffd1d93..febe9fc425442c 100644 --- a/crates/ruff_linter/src/rules/isort/rules/organize_imports.rs +++ b/crates/ruff_linter/src/rules/isort/rules/organize_imports.rs @@ -39,6 +39,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ``` /// #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.110")] pub(crate) struct UnsortedImports; impl Violation for UnsortedImports { diff --git a/crates/ruff_linter/src/rules/mccabe/rules/function_is_too_complex.rs b/crates/ruff_linter/src/rules/mccabe/rules/function_is_too_complex.rs index 3648c48239c294..bc1ca1e27834af 100644 --- a/crates/ruff_linter/src/rules/mccabe/rules/function_is_too_complex.rs +++ b/crates/ruff_linter/src/rules/mccabe/rules/function_is_too_complex.rs @@ -48,6 +48,7 @@ use crate::checkers::ast::Checker; /// ## Options /// - `lint.mccabe.max-complexity` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.127")] pub(crate) struct ComplexStructure { name: String, complexity: usize, diff --git a/crates/ruff_linter/src/rules/numpy/rules/deprecated_function.rs b/crates/ruff_linter/src/rules/numpy/rules/deprecated_function.rs index 1cbae5066dddab..b945ba8df0df40 100644 --- a/crates/ruff_linter/src/rules/numpy/rules/deprecated_function.rs +++ b/crates/ruff_linter/src/rules/numpy/rules/deprecated_function.rs @@ -31,6 +31,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// np.all([True, False]) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.276")] pub(crate) struct NumpyDeprecatedFunction { existing: String, replacement: String, diff --git a/crates/ruff_linter/src/rules/numpy/rules/deprecated_type_alias.rs b/crates/ruff_linter/src/rules/numpy/rules/deprecated_type_alias.rs index 60967e12b4628b..c2744dfbe1d509 100644 --- a/crates/ruff_linter/src/rules/numpy/rules/deprecated_type_alias.rs +++ b/crates/ruff_linter/src/rules/numpy/rules/deprecated_type_alias.rs @@ -31,6 +31,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// int /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.247")] pub(crate) struct NumpyDeprecatedTypeAlias { type_name: String, } diff --git a/crates/ruff_linter/src/rules/numpy/rules/legacy_random.rs b/crates/ruff_linter/src/rules/numpy/rules/legacy_random.rs index cbe58e2122729c..625a29829f2710 100644 --- a/crates/ruff_linter/src/rules/numpy/rules/legacy_random.rs +++ b/crates/ruff_linter/src/rules/numpy/rules/legacy_random.rs @@ -46,6 +46,7 @@ use crate::checkers::ast::Checker; /// [Random Sampling]: https://numpy.org/doc/stable/reference/random/index.html#random-quick-start /// [NEP 19]: https://numpy.org/neps/nep-0019-rng-policy.html #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.248")] pub(crate) struct NumpyLegacyRandom { method_name: String, } diff --git a/crates/ruff_linter/src/rules/numpy/rules/numpy_2_0_deprecation.rs b/crates/ruff_linter/src/rules/numpy/rules/numpy_2_0_deprecation.rs index bcc712b18dcf2b..313e0cc9a868fe 100644 --- a/crates/ruff_linter/src/rules/numpy/rules/numpy_2_0_deprecation.rs +++ b/crates/ruff_linter/src/rules/numpy/rules/numpy_2_0_deprecation.rs @@ -50,6 +50,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// np.round(arr2) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct Numpy2Deprecation { existing: String, migration_guide: Option, diff --git a/crates/ruff_linter/src/rules/pandas_vet/rules/assignment_to_df.rs b/crates/ruff_linter/src/rules/pandas_vet/rules/assignment_to_df.rs index 51c846fd550db3..fb7ae9713b8a13 100644 --- a/crates/ruff_linter/src/rules/pandas_vet/rules/assignment_to_df.rs +++ b/crates/ruff_linter/src/rules/pandas_vet/rules/assignment_to_df.rs @@ -32,6 +32,7 @@ use crate::{Violation, checkers::ast::Checker}; /// animals = pd.read_csv("animals.csv") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(removed_since = "0.13.0")] pub(crate) struct PandasDfVariableName; impl Violation for PandasDfVariableName { diff --git a/crates/ruff_linter/src/rules/pandas_vet/rules/attr.rs b/crates/ruff_linter/src/rules/pandas_vet/rules/attr.rs index ab6b55104bce19..e867edc5c0f3e3 100644 --- a/crates/ruff_linter/src/rules/pandas_vet/rules/attr.rs +++ b/crates/ruff_linter/src/rules/pandas_vet/rules/attr.rs @@ -34,6 +34,7 @@ use crate::rules::pandas_vet::helpers::{Resolution, test_expression}; /// ## References /// - [Pandas documentation: Accessing the values in a Series or Index](https://pandas.pydata.org/pandas-docs/stable/whatsnew/v0.24.0.html#accessing-the-values-in-a-series-or-index) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct PandasUseOfDotValues; impl Violation for PandasUseOfDotValues { diff --git a/crates/ruff_linter/src/rules/pandas_vet/rules/call.rs b/crates/ruff_linter/src/rules/pandas_vet/rules/call.rs index 8b7619cf3e5d29..407f689b69a837 100644 --- a/crates/ruff_linter/src/rules/pandas_vet/rules/call.rs +++ b/crates/ruff_linter/src/rules/pandas_vet/rules/call.rs @@ -40,6 +40,7 @@ use crate::rules::pandas_vet::helpers::{Resolution, test_expression}; /// - [Pandas documentation: `isnull`](https://pandas.pydata.org/docs/reference/api/pandas.isnull.html#pandas.isnull) /// - [Pandas documentation: `isna`](https://pandas.pydata.org/docs/reference/api/pandas.isna.html#pandas.isna) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct PandasUseOfDotIsNull; impl Violation for PandasUseOfDotIsNull { @@ -80,6 +81,7 @@ impl Violation for PandasUseOfDotIsNull { /// - [Pandas documentation: `notnull`](https://pandas.pydata.org/docs/reference/api/pandas.notnull.html#pandas.notnull) /// - [Pandas documentation: `notna`](https://pandas.pydata.org/docs/reference/api/pandas.notna.html#pandas.notna) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct PandasUseOfDotNotNull; impl Violation for PandasUseOfDotNotNull { @@ -116,6 +118,7 @@ impl Violation for PandasUseOfDotNotNull { /// - [Pandas documentation: Reshaping and pivot tables](https://pandas.pydata.org/docs/user_guide/reshaping.html) /// - [Pandas documentation: `pivot_table`](https://pandas.pydata.org/docs/reference/api/pandas.pivot_table.html#pandas.pivot_table) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct PandasUseOfDotPivotOrUnstack; impl Violation for PandasUseOfDotPivotOrUnstack { @@ -153,6 +156,7 @@ impl Violation for PandasUseOfDotPivotOrUnstack { /// - [Pandas documentation: `melt`](https://pandas.pydata.org/docs/reference/api/pandas.melt.html) /// - [Pandas documentation: `stack`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.stack.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct PandasUseOfDotStack; impl Violation for PandasUseOfDotStack { diff --git a/crates/ruff_linter/src/rules/pandas_vet/rules/inplace_argument.rs b/crates/ruff_linter/src/rules/pandas_vet/rules/inplace_argument.rs index 100a688b794b99..0fa448f7c5b417 100644 --- a/crates/ruff_linter/src/rules/pandas_vet/rules/inplace_argument.rs +++ b/crates/ruff_linter/src/rules/pandas_vet/rules/inplace_argument.rs @@ -36,6 +36,7 @@ use ruff_python_semantic::Modules; /// ## References /// - [_Why You Should Probably Never Use pandas `inplace=True`_](https://towardsdatascience.com/why-you-should-probably-never-use-pandas-inplace-true-9f9f211849e4) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct PandasUseOfInplaceArgument; impl Violation for PandasUseOfInplaceArgument { diff --git a/crates/ruff_linter/src/rules/pandas_vet/rules/nunique_constant_series_check.rs b/crates/ruff_linter/src/rules/pandas_vet/rules/nunique_constant_series_check.rs index 2d7ceba14bb336..279e0a9d69f017 100644 --- a/crates/ruff_linter/src/rules/pandas_vet/rules/nunique_constant_series_check.rs +++ b/crates/ruff_linter/src/rules/pandas_vet/rules/nunique_constant_series_check.rs @@ -51,6 +51,7 @@ use crate::rules::pandas_vet::helpers::{Resolution, test_expression}; /// - [Pandas Cookbook: "Constant Series"](https://pandas.pydata.org/docs/user_guide/cookbook.html#constant-series) /// - [Pandas documentation: `nunique`](https://pandas.pydata.org/docs/reference/api/pandas.Series.nunique.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.279")] pub(crate) struct PandasNuniqueConstantSeriesCheck; impl Violation for PandasNuniqueConstantSeriesCheck { diff --git a/crates/ruff_linter/src/rules/pandas_vet/rules/pd_merge.rs b/crates/ruff_linter/src/rules/pandas_vet/rules/pd_merge.rs index d8c90b74ac509c..34ca700a130a16 100644 --- a/crates/ruff_linter/src/rules/pandas_vet/rules/pd_merge.rs +++ b/crates/ruff_linter/src/rules/pandas_vet/rules/pd_merge.rs @@ -44,6 +44,7 @@ use crate::checkers::ast::Checker; /// - [Pandas documentation: `merge`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.merge.html#pandas.DataFrame.merge) /// - [Pandas documentation: `pd.merge`](https://pandas.pydata.org/docs/reference/api/pandas.merge.html#pandas.merge) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct PandasUseOfPdMerge; impl Violation for PandasUseOfPdMerge { diff --git a/crates/ruff_linter/src/rules/pandas_vet/rules/read_table.rs b/crates/ruff_linter/src/rules/pandas_vet/rules/read_table.rs index 776e738bbb2477..79025d2b8b4855 100644 --- a/crates/ruff_linter/src/rules/pandas_vet/rules/read_table.rs +++ b/crates/ruff_linter/src/rules/pandas_vet/rules/read_table.rs @@ -36,6 +36,7 @@ use crate::checkers::ast::Checker; /// - [Pandas documentation: `read_csv`](https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html#pandas.read_csv) /// - [Pandas documentation: `read_table`](https://pandas.pydata.org/docs/reference/api/pandas.read_table.html#pandas.read_table) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct PandasUseOfDotReadTable; impl Violation for PandasUseOfDotReadTable { diff --git a/crates/ruff_linter/src/rules/pandas_vet/rules/subscript.rs b/crates/ruff_linter/src/rules/pandas_vet/rules/subscript.rs index cda65b6554ebd0..7ebb5ba0d0696d 100644 --- a/crates/ruff_linter/src/rules/pandas_vet/rules/subscript.rs +++ b/crates/ruff_linter/src/rules/pandas_vet/rules/subscript.rs @@ -40,6 +40,7 @@ use crate::rules::pandas_vet::helpers::{Resolution, test_expression}; /// - [Pandas documentation: `loc`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html) /// - [Pandas documentation: `iloc`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.iloc.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct PandasUseOfDotIx; impl Violation for PandasUseOfDotIx { @@ -82,6 +83,7 @@ impl Violation for PandasUseOfDotIx { /// - [Pandas documentation: `loc`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html) /// - [Pandas documentation: `at`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.at.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct PandasUseOfDotAt; impl Violation for PandasUseOfDotAt { @@ -133,6 +135,7 @@ impl Violation for PandasUseOfDotAt { /// - [Pandas documentation: `iloc`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.iloc.html) /// - [Pandas documentation: `iat`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.iat.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.188")] pub(crate) struct PandasUseOfDotIat; impl Violation for PandasUseOfDotIat { diff --git a/crates/ruff_linter/src/rules/pep8_naming/rules/camelcase_imported_as_acronym.rs b/crates/ruff_linter/src/rules/pep8_naming/rules/camelcase_imported_as_acronym.rs index 6c547ff5c8016a..6e5c75886a505b 100644 --- a/crates/ruff_linter/src/rules/pep8_naming/rules/camelcase_imported_as_acronym.rs +++ b/crates/ruff_linter/src/rules/pep8_naming/rules/camelcase_imported_as_acronym.rs @@ -42,6 +42,7 @@ use crate::rules::pep8_naming::helpers; /// /// [PEP 8]: https://peps.python.org/pep-0008/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.82")] pub(crate) struct CamelcaseImportedAsAcronym { name: String, asname: String, diff --git a/crates/ruff_linter/src/rules/pep8_naming/rules/camelcase_imported_as_constant.rs b/crates/ruff_linter/src/rules/pep8_naming/rules/camelcase_imported_as_constant.rs index 609cd61fc09385..09f5f2deb0b49d 100644 --- a/crates/ruff_linter/src/rules/pep8_naming/rules/camelcase_imported_as_constant.rs +++ b/crates/ruff_linter/src/rules/pep8_naming/rules/camelcase_imported_as_constant.rs @@ -51,6 +51,7 @@ use crate::rules::pep8_naming::settings::IgnoreNames; /// /// [PEP 8]: https://peps.python.org/pep-0008/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.82")] pub(crate) struct CamelcaseImportedAsConstant { name: String, asname: String, diff --git a/crates/ruff_linter/src/rules/pep8_naming/rules/camelcase_imported_as_lowercase.rs b/crates/ruff_linter/src/rules/pep8_naming/rules/camelcase_imported_as_lowercase.rs index c81884c0458a0a..eb3cf80bdff389 100644 --- a/crates/ruff_linter/src/rules/pep8_naming/rules/camelcase_imported_as_lowercase.rs +++ b/crates/ruff_linter/src/rules/pep8_naming/rules/camelcase_imported_as_lowercase.rs @@ -36,6 +36,7 @@ use crate::rules::pep8_naming::settings::IgnoreNames; /// /// [PEP 8]: https://peps.python.org/pep-0008/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.82")] pub(crate) struct CamelcaseImportedAsLowercase { name: String, asname: String, diff --git a/crates/ruff_linter/src/rules/pep8_naming/rules/constant_imported_as_non_constant.rs b/crates/ruff_linter/src/rules/pep8_naming/rules/constant_imported_as_non_constant.rs index 26e72de9289342..f88853faab6443 100644 --- a/crates/ruff_linter/src/rules/pep8_naming/rules/constant_imported_as_non_constant.rs +++ b/crates/ruff_linter/src/rules/pep8_naming/rules/constant_imported_as_non_constant.rs @@ -49,6 +49,7 @@ use crate::rules::pep8_naming::{helpers, settings::IgnoreNames}; /// /// [PEP 8]: https://peps.python.org/pep-0008/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.82")] pub(crate) struct ConstantImportedAsNonConstant { name: String, asname: String, diff --git a/crates/ruff_linter/src/rules/pep8_naming/rules/dunder_function_name.rs b/crates/ruff_linter/src/rules/pep8_naming/rules/dunder_function_name.rs index c4b8f86299ced5..84ec885347a576 100644 --- a/crates/ruff_linter/src/rules/pep8_naming/rules/dunder_function_name.rs +++ b/crates/ruff_linter/src/rules/pep8_naming/rules/dunder_function_name.rs @@ -38,6 +38,7 @@ use crate::rules::pep8_naming::settings::IgnoreNames; /// /// [PEP 8]: https://peps.python.org/pep-0008/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.82")] pub(crate) struct DunderFunctionName; impl Violation for DunderFunctionName { diff --git a/crates/ruff_linter/src/rules/pep8_naming/rules/error_suffix_on_exception_name.rs b/crates/ruff_linter/src/rules/pep8_naming/rules/error_suffix_on_exception_name.rs index ecaa71ee208b73..bb990df5ce78d6 100644 --- a/crates/ruff_linter/src/rules/pep8_naming/rules/error_suffix_on_exception_name.rs +++ b/crates/ruff_linter/src/rules/pep8_naming/rules/error_suffix_on_exception_name.rs @@ -35,6 +35,7 @@ use crate::rules::pep8_naming::settings::IgnoreNames; /// /// [PEP 8]: https://peps.python.org/pep-0008/#exception-names #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.89")] pub(crate) struct ErrorSuffixOnExceptionName { name: String, } diff --git a/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_argument_name.rs b/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_argument_name.rs index 5bab2edfc7166d..a490f3470282de 100644 --- a/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_argument_name.rs +++ b/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_argument_name.rs @@ -44,6 +44,7 @@ use crate::checkers::ast::Checker; /// [PEP 8]: https://peps.python.org/pep-0008/#function-and-method-arguments /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.77")] pub(crate) struct InvalidArgumentName { name: String, } diff --git a/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_class_name.rs b/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_class_name.rs index c220d4d41abfc7..cf996876c8e543 100644 --- a/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_class_name.rs +++ b/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_class_name.rs @@ -41,6 +41,7 @@ use crate::rules::pep8_naming::settings::IgnoreNames; /// /// [PEP 8]: https://peps.python.org/pep-0008/#class-names #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.77")] pub(crate) struct InvalidClassName { name: String, } diff --git a/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_first_argument_name.rs b/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_first_argument_name.rs index ac43d779cc2419..b1743294672bc6 100644 --- a/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_first_argument_name.rs +++ b/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_first_argument_name.rs @@ -59,6 +59,7 @@ use crate::{Fix, Violation}; /// /// [PEP 8]: https://peps.python.org/pep-0008/#function-and-method-arguments #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.77")] pub(crate) struct InvalidFirstArgumentNameForMethod { argument_name: String, } @@ -129,6 +130,7 @@ impl Violation for InvalidFirstArgumentNameForMethod { /// [PEP 8]: https://peps.python.org/pep-0008/#function-and-method-arguments /// [PLW0211]: https://docs.astral.sh/ruff/rules/bad-staticmethod-argument/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.77")] pub(crate) struct InvalidFirstArgumentNameForClassMethod { argument_name: String, // Whether the method is `__new__` diff --git a/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_function_name.rs b/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_function_name.rs index 5deb83247eaf44..546b41c014d5db 100644 --- a/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_function_name.rs +++ b/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_function_name.rs @@ -42,6 +42,7 @@ use crate::rules::pep8_naming::settings::IgnoreNames; /// /// [PEP 8]: https://peps.python.org/pep-0008/#function-and-variable-names #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.77")] pub(crate) struct InvalidFunctionName { name: String, } diff --git a/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_module_name.rs b/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_module_name.rs index 6e7e6992826595..cbc9b54ae2d9f9 100644 --- a/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_module_name.rs +++ b/crates/ruff_linter/src/rules/pep8_naming/rules/invalid_module_name.rs @@ -38,6 +38,7 @@ use crate::rules::pep8_naming::settings::IgnoreNames; /// /// [PEP 8]: https://peps.python.org/pep-0008/#package-and-module-names #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.248")] pub(crate) struct InvalidModuleName { name: String, } diff --git a/crates/ruff_linter/src/rules/pep8_naming/rules/lowercase_imported_as_non_lowercase.rs b/crates/ruff_linter/src/rules/pep8_naming/rules/lowercase_imported_as_non_lowercase.rs index 6d2df2e8f14dfd..ae246a1f5b208d 100644 --- a/crates/ruff_linter/src/rules/pep8_naming/rules/lowercase_imported_as_non_lowercase.rs +++ b/crates/ruff_linter/src/rules/pep8_naming/rules/lowercase_imported_as_non_lowercase.rs @@ -35,6 +35,7 @@ use crate::rules::pep8_naming::settings::IgnoreNames; /// /// [PEP 8]: https://peps.python.org/pep-0008/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.82")] pub(crate) struct LowercaseImportedAsNonLowercase { name: String, asname: String, diff --git a/crates/ruff_linter/src/rules/pep8_naming/rules/mixed_case_variable_in_class_scope.rs b/crates/ruff_linter/src/rules/pep8_naming/rules/mixed_case_variable_in_class_scope.rs index 1ad5f88381877d..8e3842a0efa1a7 100644 --- a/crates/ruff_linter/src/rules/pep8_naming/rules/mixed_case_variable_in_class_scope.rs +++ b/crates/ruff_linter/src/rules/pep8_naming/rules/mixed_case_variable_in_class_scope.rs @@ -41,6 +41,7 @@ use crate::rules::pep8_naming::helpers; /// /// [PEP 8]: https://peps.python.org/pep-0008/#function-and-method-arguments #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.89")] pub(crate) struct MixedCaseVariableInClassScope { name: String, } diff --git a/crates/ruff_linter/src/rules/pep8_naming/rules/mixed_case_variable_in_global_scope.rs b/crates/ruff_linter/src/rules/pep8_naming/rules/mixed_case_variable_in_global_scope.rs index e7f87f4c4e9d3d..ae4b159bf2a097 100644 --- a/crates/ruff_linter/src/rules/pep8_naming/rules/mixed_case_variable_in_global_scope.rs +++ b/crates/ruff_linter/src/rules/pep8_naming/rules/mixed_case_variable_in_global_scope.rs @@ -52,6 +52,7 @@ use crate::rules::pep8_naming::helpers; /// /// [PEP 8]: https://peps.python.org/pep-0008/#global-variable-names #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.89")] pub(crate) struct MixedCaseVariableInGlobalScope { name: String, } diff --git a/crates/ruff_linter/src/rules/pep8_naming/rules/non_lowercase_variable_in_function.rs b/crates/ruff_linter/src/rules/pep8_naming/rules/non_lowercase_variable_in_function.rs index d0663631227179..afcf42309a2931 100644 --- a/crates/ruff_linter/src/rules/pep8_naming/rules/non_lowercase_variable_in_function.rs +++ b/crates/ruff_linter/src/rules/pep8_naming/rules/non_lowercase_variable_in_function.rs @@ -39,6 +39,7 @@ use crate::rules::pep8_naming::helpers; /// /// [PEP 8]: https://peps.python.org/pep-0008/#function-and-variable-names #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.89")] pub(crate) struct NonLowercaseVariableInFunction { name: String, } diff --git a/crates/ruff_linter/src/rules/perflint/rules/incorrect_dict_iterator.rs b/crates/ruff_linter/src/rules/perflint/rules/incorrect_dict_iterator.rs index b26e7b309b89b2..b24e8fa79388b4 100644 --- a/crates/ruff_linter/src/rules/perflint/rules/incorrect_dict_iterator.rs +++ b/crates/ruff_linter/src/rules/perflint/rules/incorrect_dict_iterator.rs @@ -44,6 +44,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// (e.g., if it is missing a `.keys()` or `.values()` method, or if those /// methods behave differently than they do on standard mapping types). #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.273")] pub(crate) struct IncorrectDictIterator { subset: DictSubset, } diff --git a/crates/ruff_linter/src/rules/perflint/rules/manual_dict_comprehension.rs b/crates/ruff_linter/src/rules/perflint/rules/manual_dict_comprehension.rs index 99f34f620a50f0..560aac29a8d445 100644 --- a/crates/ruff_linter/src/rules/perflint/rules/manual_dict_comprehension.rs +++ b/crates/ruff_linter/src/rules/perflint/rules/manual_dict_comprehension.rs @@ -46,6 +46,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// result.update({x: y for x, y in pairs if y % 2}) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct ManualDictComprehension { fix_type: DictComprehensionType, is_async: bool, diff --git a/crates/ruff_linter/src/rules/perflint/rules/manual_list_comprehension.rs b/crates/ruff_linter/src/rules/perflint/rules/manual_list_comprehension.rs index d09e42db8de466..84b7290e514995 100644 --- a/crates/ruff_linter/src/rules/perflint/rules/manual_list_comprehension.rs +++ b/crates/ruff_linter/src/rules/perflint/rules/manual_list_comprehension.rs @@ -49,6 +49,7 @@ use ruff_text_size::{Ranged, TextRange}; /// filtered.extend(x for x in original if x % 2) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.276")] pub(crate) struct ManualListComprehension { is_async: bool, comprehension_type: Option, diff --git a/crates/ruff_linter/src/rules/perflint/rules/manual_list_copy.rs b/crates/ruff_linter/src/rules/perflint/rules/manual_list_copy.rs index 3322830aca515a..44122f25b30354 100644 --- a/crates/ruff_linter/src/rules/perflint/rules/manual_list_copy.rs +++ b/crates/ruff_linter/src/rules/perflint/rules/manual_list_copy.rs @@ -35,6 +35,7 @@ use crate::checkers::ast::Checker; /// filtered = list(original) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.276")] pub(crate) struct ManualListCopy; impl Violation for ManualListCopy { diff --git a/crates/ruff_linter/src/rules/perflint/rules/try_except_in_loop.rs b/crates/ruff_linter/src/rules/perflint/rules/try_except_in_loop.rs index 87f89bf18ef37c..9fdcc29446fa88 100644 --- a/crates/ruff_linter/src/rules/perflint/rules/try_except_in_loop.rs +++ b/crates/ruff_linter/src/rules/perflint/rules/try_except_in_loop.rs @@ -77,6 +77,7 @@ use crate::checkers::ast::Checker; /// ## Options /// - `target-version` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.276")] pub(crate) struct TryExceptInLoop; impl Violation for TryExceptInLoop { diff --git a/crates/ruff_linter/src/rules/perflint/rules/unnecessary_list_cast.rs b/crates/ruff_linter/src/rules/perflint/rules/unnecessary_list_cast.rs index 8949c0997d9d4a..f616e0f5413757 100644 --- a/crates/ruff_linter/src/rules/perflint/rules/unnecessary_list_cast.rs +++ b/crates/ruff_linter/src/rules/perflint/rules/unnecessary_list_cast.rs @@ -51,6 +51,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// print(i) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.276")] pub(crate) struct UnnecessaryListCast; impl AlwaysFixableViolation for UnnecessaryListCast { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/ambiguous_class_name.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/ambiguous_class_name.rs index 6bf061ede56766..eb2bb786ba5cea 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/ambiguous_class_name.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/ambiguous_class_name.rs @@ -26,6 +26,7 @@ use crate::rules::pycodestyle::helpers::is_ambiguous_name; /// class Integer(object): ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.35")] pub(crate) struct AmbiguousClassName(pub String); impl Violation for AmbiguousClassName { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/ambiguous_function_name.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/ambiguous_function_name.rs index 1cd8770c86ab06..f9d53f25b82c4a 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/ambiguous_function_name.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/ambiguous_function_name.rs @@ -26,6 +26,7 @@ use crate::rules::pycodestyle::helpers::is_ambiguous_name; /// def long_name(x): ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.35")] pub(crate) struct AmbiguousFunctionName(pub String); impl Violation for AmbiguousFunctionName { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/ambiguous_variable_name.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/ambiguous_variable_name.rs index 156b336a47a786..d618e3d116d497 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/ambiguous_variable_name.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/ambiguous_variable_name.rs @@ -33,6 +33,7 @@ use crate::rules::pycodestyle::helpers::is_ambiguous_name; /// i = 42 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.34")] pub(crate) struct AmbiguousVariableName(pub String); impl Violation for AmbiguousVariableName { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/bare_except.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/bare_except.rs index 3040240166149d..82bbea5beb51d2 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/bare_except.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/bare_except.rs @@ -45,6 +45,7 @@ use crate::checkers::ast::Checker; /// - [Python documentation: Exception hierarchy](https://docs.python.org/3/library/exceptions.html#exception-hierarchy) /// - [Google Python Style Guide: "Exceptions"](https://google.github.io/styleguide/pyguide.html#24-exceptions) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.36")] pub(crate) struct BareExcept; impl Violation for BareExcept { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/blank_lines.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/blank_lines.rs index 5e44676ca4bbdd..978806ee95f65f 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/blank_lines.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/blank_lines.rs @@ -62,6 +62,7 @@ const BLANK_LINES_NESTED_LEVEL: u32 = 1; /// - [Flake 8 rule](https://www.flake8rules.com/rules/E301.html) /// - [Typing Style Guide](https://typing.python.org/en/latest/guides/writing_stubs.html#blank-lines) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.2.2")] pub(crate) struct BlankLineBetweenMethods; impl AlwaysFixableViolation for BlankLineBetweenMethods { @@ -115,6 +116,7 @@ impl AlwaysFixableViolation for BlankLineBetweenMethods { /// - [Flake 8 rule](https://www.flake8rules.com/rules/E302.html) /// - [Typing Style Guide](https://typing.python.org/en/latest/guides/writing_stubs.html#blank-lines) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.2.2")] pub(crate) struct BlankLinesTopLevel { actual_blank_lines: u32, expected_blank_lines: u32, @@ -182,6 +184,7 @@ impl AlwaysFixableViolation for BlankLinesTopLevel { /// - [Flake 8 rule](https://www.flake8rules.com/rules/E303.html) /// - [Typing Style Guide](https://typing.python.org/en/latest/guides/writing_stubs.html#blank-lines) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.2.2")] pub(crate) struct TooManyBlankLines { actual_blank_lines: u32, } @@ -228,6 +231,7 @@ impl AlwaysFixableViolation for TooManyBlankLines { /// - [PEP 8: Blank Lines](https://peps.python.org/pep-0008/#blank-lines) /// - [Flake 8 rule](https://www.flake8rules.com/rules/E304.html) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.2.2")] pub(crate) struct BlankLineAfterDecorator { actual_blank_lines: u32, } @@ -279,6 +283,7 @@ impl AlwaysFixableViolation for BlankLineAfterDecorator { /// - [Flake 8 rule](https://www.flake8rules.com/rules/E305.html) /// - [Typing Style Guide](https://typing.python.org/en/latest/guides/writing_stubs.html#blank-lines) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.2.2")] pub(crate) struct BlankLinesAfterFunctionOrClass { actual_blank_lines: u32, } @@ -333,6 +338,7 @@ impl AlwaysFixableViolation for BlankLinesAfterFunctionOrClass { /// - [Flake 8 rule](https://www.flake8rules.com/rules/E306.html) /// - [Typing Style Guide](https://typing.python.org/en/latest/guides/writing_stubs.html#blank-lines) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.2.2")] pub(crate) struct BlankLinesBeforeNestedDefinition; impl AlwaysFixableViolation for BlankLinesBeforeNestedDefinition { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/compound_statements.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/compound_statements.rs index 49a2fb1db58ecb..8fd4889f3b62c6 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/compound_statements.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/compound_statements.rs @@ -29,6 +29,7 @@ use crate::{Edit, Fix}; /// /// [PEP 8]: https://peps.python.org/pep-0008/#other-recommendations #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.245")] pub(crate) struct MultipleStatementsOnOneLineColon; impl Violation for MultipleStatementsOnOneLineColon { @@ -59,6 +60,7 @@ impl Violation for MultipleStatementsOnOneLineColon { /// /// [PEP 8]: https://peps.python.org/pep-0008/#other-recommendations #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.245")] pub(crate) struct MultipleStatementsOnOneLineSemicolon; impl Violation for MultipleStatementsOnOneLineSemicolon { @@ -84,6 +86,7 @@ impl Violation for MultipleStatementsOnOneLineSemicolon { /// do_four() /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.245")] pub(crate) struct UselessSemicolon; impl AlwaysFixableViolation for UselessSemicolon { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/doc_line_too_long.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/doc_line_too_long.rs index c9f0ae0753ab71..9e59ce5a794531 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/doc_line_too_long.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/doc_line_too_long.rs @@ -72,6 +72,7 @@ use crate::settings::LinterSettings; /// /// [PEP 8]: https://peps.python.org/pep-0008/#maximum-line-length #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.219")] pub(crate) struct DocLineTooLong(usize, usize); impl Violation for DocLineTooLong { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/errors.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/errors.rs index 58baf660bc9c96..ad74b42169e2ca 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/errors.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/errors.rs @@ -25,6 +25,7 @@ use crate::Violation; /// - [UNIX Permissions introduction](https://mason.gmu.edu/~montecin/UNIXpermiss.htm) /// - [Command Line Basics: Symbolic Links](https://www.digitalocean.com/community/tutorials/workflow-symbolic-links) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.28")] pub struct IOError { pub message: String, } @@ -65,6 +66,7 @@ impl Violation for IOError { /// - [Python documentation: Syntax Errors](https://docs.python.org/3/tutorial/errors.html#syntax-errors) #[derive(ViolationMetadata)] #[deprecated(note = "E999 has been removed")] +#[violation_metadata(removed_since = "0.8.0")] pub(crate) struct SyntaxError; #[expect(deprecated)] diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/invalid_escape_sequence.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/invalid_escape_sequence.rs index 1e0fe8507a9932..0d6ea9c1a613d7 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/invalid_escape_sequence.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/invalid_escape_sequence.rs @@ -41,6 +41,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: String and Bytes literals](https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.85")] pub(crate) struct InvalidEscapeSequence { ch: char, fix_title: FixTitle, diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/lambda_assignment.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/lambda_assignment.rs index 35839f78f7a2ed..a42473386b6acc 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/lambda_assignment.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/lambda_assignment.rs @@ -36,6 +36,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// /// [PEP 8]: https://peps.python.org/pep-0008/#programming-recommendations #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.28")] pub(crate) struct LambdaAssignment { name: String, } diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/line_too_long.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/line_too_long.rs index 9a03e0f98a2e5e..b81cbdf7b19d81 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/line_too_long.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/line_too_long.rs @@ -70,6 +70,7 @@ use crate::settings::LinterSettings; /// /// [PEP 8]: https://peps.python.org/pep-0008/#maximum-line-length #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.18")] pub(crate) struct LineTooLong(usize, usize); impl Violation for LineTooLong { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/literal_comparisons.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/literal_comparisons.rs index baf229ada85468..6ae6cea8178d03 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/literal_comparisons.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/literal_comparisons.rs @@ -58,6 +58,7 @@ impl EqCmpOp { /// [PEP 8]: https://peps.python.org/pep-0008/#programming-recommendations /// [this issue]: https://github.com/astral-sh/ruff/issues/4560 #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.28")] pub(crate) struct NoneComparison(EqCmpOp); impl AlwaysFixableViolation for NoneComparison { @@ -120,6 +121,7 @@ impl AlwaysFixableViolation for NoneComparison { /// [PEP 8]: https://peps.python.org/pep-0008/#programming-recommendations /// [this issue]: https://github.com/astral-sh/ruff/issues/4560 #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.28")] pub(crate) struct TrueFalseComparison { value: bool, op: EqCmpOp, diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/extraneous_whitespace.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/extraneous_whitespace.rs index 6dd9b493561bf3..ff57fca1feaf88 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/extraneous_whitespace.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/extraneous_whitespace.rs @@ -31,6 +31,7 @@ use super::{LogicalLine, Whitespace}; /// /// [PEP 8]: https://peps.python.org/pep-0008/#pet-peeves #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct WhitespaceAfterOpenBracket { symbol: char, } @@ -70,6 +71,7 @@ impl AlwaysFixableViolation for WhitespaceAfterOpenBracket { /// /// [PEP 8]: https://peps.python.org/pep-0008/#pet-peeves #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct WhitespaceBeforeCloseBracket { symbol: char, } @@ -107,6 +109,7 @@ impl AlwaysFixableViolation for WhitespaceBeforeCloseBracket { /// /// [PEP 8]: https://peps.python.org/pep-0008/#pet-peeves #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct WhitespaceBeforePunctuation { symbol: char, } diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/indentation.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/indentation.rs index 000fc967d0e8ad..5c351f695f17ae 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/indentation.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/indentation.rs @@ -38,6 +38,7 @@ use super::LogicalLine; /// [PEP 8]: https://peps.python.org/pep-0008/#indentation /// [formatter]:https://docs.astral.sh/ruff/formatter/ #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct IndentationWithInvalidMultiple { indent_width: usize, } @@ -83,6 +84,7 @@ impl Violation for IndentationWithInvalidMultiple { /// [PEP 8]: https://peps.python.org/pep-0008/#indentation /// [formatter]:https://docs.astral.sh/ruff/formatter/ #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct IndentationWithInvalidMultipleComment { indent_width: usize, } @@ -116,6 +118,7 @@ impl Violation for IndentationWithInvalidMultipleComment { /// /// [PEP 8]: https://peps.python.org/pep-0008/#indentation #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct NoIndentedBlock; impl Violation for NoIndentedBlock { @@ -148,6 +151,7 @@ impl Violation for NoIndentedBlock { /// /// [PEP 8]: https://peps.python.org/pep-0008/#indentation #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct NoIndentedBlockComment; impl Violation for NoIndentedBlockComment { @@ -177,6 +181,7 @@ impl Violation for NoIndentedBlockComment { /// /// [PEP 8]: https://peps.python.org/pep-0008/#indentation #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct UnexpectedIndentation; impl Violation for UnexpectedIndentation { @@ -206,6 +211,7 @@ impl Violation for UnexpectedIndentation { /// /// [PEP 8]: https://peps.python.org/pep-0008/#indentation #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct UnexpectedIndentationComment; impl Violation for UnexpectedIndentationComment { @@ -242,6 +248,7 @@ impl Violation for UnexpectedIndentationComment { /// [PEP 8]: https://peps.python.org/pep-0008/#indentation /// [formatter]:https://docs.astral.sh/ruff/formatter/ #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct OverIndented { is_comment: bool, } diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/missing_whitespace.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/missing_whitespace.rs index 7b9e82c4f77a11..759bbb29d6e559 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/missing_whitespace.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/missing_whitespace.rs @@ -24,6 +24,7 @@ use super::{DefinitionState, LogicalLine}; /// a = (1, 2) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct MissingWhitespace { token: TokenKind, } diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/missing_whitespace_after_keyword.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/missing_whitespace_after_keyword.rs index f0d4600038044e..c767be0dc8e37c 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/missing_whitespace_after_keyword.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/missing_whitespace_after_keyword.rs @@ -27,6 +27,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: Keywords](https://docs.python.org/3/reference/lexical_analysis.html#keywords) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct MissingWhitespaceAfterKeyword; impl AlwaysFixableViolation for MissingWhitespaceAfterKeyword { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/missing_whitespace_around_operator.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/missing_whitespace_around_operator.rs index 2b7fdadb106d4a..408575fa23a917 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/missing_whitespace_around_operator.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/missing_whitespace_around_operator.rs @@ -30,6 +30,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// [PEP 8]: https://peps.python.org/pep-0008/#pet-peeves // E225 #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct MissingWhitespaceAroundOperator; impl AlwaysFixableViolation for MissingWhitespaceAroundOperator { @@ -69,6 +70,7 @@ impl AlwaysFixableViolation for MissingWhitespaceAroundOperator { /// [PEP 8]: https://peps.python.org/pep-0008/#other-recommendations // E226 #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct MissingWhitespaceAroundArithmeticOperator; impl AlwaysFixableViolation for MissingWhitespaceAroundArithmeticOperator { @@ -108,6 +110,7 @@ impl AlwaysFixableViolation for MissingWhitespaceAroundArithmeticOperator { /// [PEP 8]: https://peps.python.org/pep-0008/#other-recommendations // E227 #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct MissingWhitespaceAroundBitwiseOrShiftOperator; impl AlwaysFixableViolation for MissingWhitespaceAroundBitwiseOrShiftOperator { @@ -147,6 +150,7 @@ impl AlwaysFixableViolation for MissingWhitespaceAroundBitwiseOrShiftOperator { /// [PEP 8]: https://peps.python.org/pep-0008/#other-recommendations // E228 #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct MissingWhitespaceAroundModuloOperator; impl AlwaysFixableViolation for MissingWhitespaceAroundModuloOperator { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/redundant_backslash.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/redundant_backslash.rs index b8f8439bec8a6b..2092b6371638db 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/redundant_backslash.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/redundant_backslash.rs @@ -30,6 +30,7 @@ use super::LogicalLine; /// /// [PEP 8]: https://peps.python.org/pep-0008/#maximum-line-length #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.3.3")] pub(crate) struct RedundantBackslash; impl AlwaysFixableViolation for RedundantBackslash { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/space_around_operator.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/space_around_operator.rs index 7a73fc7795ef6e..c806ba46f47b60 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/space_around_operator.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/space_around_operator.rs @@ -26,6 +26,7 @@ use super::{LogicalLine, Whitespace}; /// /// [PEP 8]: https://peps.python.org/pep-0008/#whitespace-in-expressions-and-statements #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct TabBeforeOperator; impl AlwaysFixableViolation for TabBeforeOperator { @@ -58,6 +59,7 @@ impl AlwaysFixableViolation for TabBeforeOperator { /// /// [PEP 8]: https://peps.python.org/pep-0008/#whitespace-in-expressions-and-statements #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct MultipleSpacesBeforeOperator; impl AlwaysFixableViolation for MultipleSpacesBeforeOperator { @@ -90,6 +92,7 @@ impl AlwaysFixableViolation for MultipleSpacesBeforeOperator { /// /// [PEP 8]: https://peps.python.org/pep-0008/#whitespace-in-expressions-and-statements #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct TabAfterOperator; impl AlwaysFixableViolation for TabAfterOperator { @@ -122,6 +125,7 @@ impl AlwaysFixableViolation for TabAfterOperator { /// /// [PEP 8]: https://peps.python.org/pep-0008/#whitespace-in-expressions-and-statements #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct MultipleSpacesAfterOperator; impl AlwaysFixableViolation for MultipleSpacesAfterOperator { @@ -152,6 +156,7 @@ impl AlwaysFixableViolation for MultipleSpacesAfterOperator { /// ``` /// #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.281")] pub(crate) struct TabAfterComma; impl AlwaysFixableViolation for TabAfterComma { @@ -182,6 +187,7 @@ impl AlwaysFixableViolation for TabAfterComma { /// a = 4, 5 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.281")] pub(crate) struct MultipleSpacesAfterComma; impl AlwaysFixableViolation for MultipleSpacesAfterComma { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_around_keywords.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_around_keywords.rs index af7a415275fe0d..69ef1174d46aaa 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_around_keywords.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_around_keywords.rs @@ -22,6 +22,7 @@ use super::{LogicalLine, Whitespace}; /// True and False /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct MultipleSpacesAfterKeyword; impl AlwaysFixableViolation for MultipleSpacesAfterKeyword { @@ -51,6 +52,7 @@ impl AlwaysFixableViolation for MultipleSpacesAfterKeyword { /// x and y /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct MultipleSpacesBeforeKeyword; impl AlwaysFixableViolation for MultipleSpacesBeforeKeyword { @@ -80,6 +82,7 @@ impl AlwaysFixableViolation for MultipleSpacesBeforeKeyword { /// True and False /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct TabAfterKeyword; impl AlwaysFixableViolation for TabAfterKeyword { @@ -109,6 +112,7 @@ impl AlwaysFixableViolation for TabAfterKeyword { /// True and False /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct TabBeforeKeyword; impl AlwaysFixableViolation for TabBeforeKeyword { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_around_named_parameter_equals.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_around_named_parameter_equals.rs index 3e11ca5a8c5310..bed7da83e1f26a 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_around_named_parameter_equals.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_around_named_parameter_equals.rs @@ -32,6 +32,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// /// [PEP 8]: https://peps.python.org/pep-0008/#whitespace-in-expressions-and-statements #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct UnexpectedSpacesAroundKeywordParameterEquals; impl AlwaysFixableViolation for UnexpectedSpacesAroundKeywordParameterEquals { @@ -71,6 +72,7 @@ impl AlwaysFixableViolation for UnexpectedSpacesAroundKeywordParameterEquals { /// /// [PEP 8]: https://peps.python.org/pep-0008/#whitespace-in-expressions-and-statements #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct MissingWhitespaceAroundParameterEquals; impl AlwaysFixableViolation for MissingWhitespaceAroundParameterEquals { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_before_comment.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_before_comment.rs index 49f85613b20005..dc9e91dac25997 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_before_comment.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_before_comment.rs @@ -31,6 +31,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// /// [PEP 8]: https://peps.python.org/pep-0008/#comments #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct TooFewSpacesBeforeInlineComment; impl AlwaysFixableViolation for TooFewSpacesBeforeInlineComment { @@ -67,6 +68,7 @@ impl AlwaysFixableViolation for TooFewSpacesBeforeInlineComment { /// /// [PEP 8]: https://peps.python.org/pep-0008/#comments #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct NoSpaceAfterInlineComment; impl AlwaysFixableViolation for NoSpaceAfterInlineComment { @@ -104,6 +106,7 @@ impl AlwaysFixableViolation for NoSpaceAfterInlineComment { /// /// [PEP 8]: https://peps.python.org/pep-0008/#comments #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct NoSpaceAfterBlockComment; impl AlwaysFixableViolation for NoSpaceAfterBlockComment { @@ -150,6 +153,7 @@ impl AlwaysFixableViolation for NoSpaceAfterBlockComment { /// /// [PEP 8]: https://peps.python.org/pep-0008/#comments #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct MultipleLeadingHashesForBlockComment; impl AlwaysFixableViolation for MultipleLeadingHashesForBlockComment { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_before_parameters.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_before_parameters.rs index 4f180f26321926..e176455718ba58 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_before_parameters.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/logical_lines/whitespace_before_parameters.rs @@ -26,6 +26,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// /// [PEP 8]: https://peps.python.org/pep-0008/#pet-peeves #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.269")] pub(crate) struct WhitespaceBeforeParameters { bracket: TokenKind, } diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/missing_newline_at_end_of_file.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/missing_newline_at_end_of_file.rs index f8301cbc94a6ba..de7fbd042d69af 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/missing_newline_at_end_of_file.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/missing_newline_at_end_of_file.rs @@ -24,6 +24,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// spam(1)\n /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.61")] pub(crate) struct MissingNewlineAtEndOfFile; impl AlwaysFixableViolation for MissingNewlineAtEndOfFile { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/mixed_spaces_and_tabs.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/mixed_spaces_and_tabs.rs index 649fc972fcd93a..b62d4e008b549b 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/mixed_spaces_and_tabs.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/mixed_spaces_and_tabs.rs @@ -27,6 +27,7 @@ use crate::{Violation, checkers::ast::LintContext}; /// if a == 0:\n a = 1\n b = 1 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.229")] pub(crate) struct MixedSpacesAndTabs; impl Violation for MixedSpacesAndTabs { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/module_import_not_at_top_of_file.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/module_import_not_at_top_of_file.rs index 066de7316fbadd..3da13717a3b276 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/module_import_not_at_top_of_file.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/module_import_not_at_top_of_file.rs @@ -40,6 +40,7 @@ use crate::checkers::ast::Checker; /// /// [PEP 8]: https://peps.python.org/pep-0008/#imports #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.28")] pub(crate) struct ModuleImportNotAtTopOfFile { source_type: PySourceType, } diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/multiple_imports_on_one_line.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/multiple_imports_on_one_line.rs index dd7dc69b5b933e..aa5301fb49ac40 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/multiple_imports_on_one_line.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/multiple_imports_on_one_line.rs @@ -31,6 +31,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// /// [PEP 8]: https://peps.python.org/pep-0008/#imports #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.191")] pub(crate) struct MultipleImportsOnOneLine; impl Violation for MultipleImportsOnOneLine { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/not_tests.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/not_tests.rs index a431cb036862fe..a4234093bc8031 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/not_tests.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/not_tests.rs @@ -28,6 +28,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// pass /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.28")] pub(crate) struct NotInTest; impl AlwaysFixableViolation for NotInTest { @@ -64,6 +65,7 @@ impl AlwaysFixableViolation for NotInTest { /// /// [PEP8]: https://peps.python.org/pep-0008/#programming-recommendations #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.28")] pub(crate) struct NotIsTest; impl AlwaysFixableViolation for NotIsTest { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/tab_indentation.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/tab_indentation.rs index 40d272336dcccb..581f2a1eaa457c 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/tab_indentation.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/tab_indentation.rs @@ -24,6 +24,7 @@ use crate::checkers::ast::LintContext; /// [PEP 8]: https://peps.python.org/pep-0008/#tabs-or-spaces /// [formatter]: https://docs.astral.sh/ruff/formatter #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.254")] pub(crate) struct TabIndentation; impl Violation for TabIndentation { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/too_many_newlines_at_end_of_file.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/too_many_newlines_at_end_of_file.rs index 79ccdc69788ff9..3a84aad979dd43 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/too_many_newlines_at_end_of_file.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/too_many_newlines_at_end_of_file.rs @@ -29,6 +29,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix, checkers::ast::LintContext}; /// spam(1)\n /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.3.3")] pub(crate) struct TooManyNewlinesAtEndOfFile { num_trailing_newlines: u32, in_notebook: bool, diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/trailing_whitespace.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/trailing_whitespace.rs index 78dabff4dfa375..c72825da72fff7 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/trailing_whitespace.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/trailing_whitespace.rs @@ -32,6 +32,7 @@ use crate::{AlwaysFixableViolation, Applicability, Edit, Fix}; /// /// [PEP 8]: https://peps.python.org/pep-0008/#other-recommendations #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.253")] pub(crate) struct TrailingWhitespace; impl AlwaysFixableViolation for TrailingWhitespace { @@ -69,6 +70,7 @@ impl AlwaysFixableViolation for TrailingWhitespace { /// /// [PEP 8]: https://peps.python.org/pep-0008/#other-recommendations #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.253")] pub(crate) struct BlankLineWithWhitespace; impl AlwaysFixableViolation for BlankLineWithWhitespace { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/type_comparison.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/type_comparison.rs index b7a0c0ca86c00c..152e5e808e2780 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/type_comparison.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/type_comparison.rs @@ -49,6 +49,7 @@ use crate::checkers::ast::Checker; /// pass /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.39")] pub(crate) struct TypeComparison; impl Violation for TypeComparison { diff --git a/crates/ruff_linter/src/rules/pycodestyle/rules/whitespace_after_decorator.rs b/crates/ruff_linter/src/rules/pycodestyle/rules/whitespace_after_decorator.rs index 63517ae80306ae..1ce7f2c0a8ecb2 100644 --- a/crates/ruff_linter/src/rules/pycodestyle/rules/whitespace_after_decorator.rs +++ b/crates/ruff_linter/src/rules/pycodestyle/rules/whitespace_after_decorator.rs @@ -30,6 +30,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// /// [PEP 8]: https://peps.python.org/pep-0008/#maximum-line-length #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.5.1")] pub(crate) struct WhitespaceAfterDecorator; impl AlwaysFixableViolation for WhitespaceAfterDecorator { diff --git a/crates/ruff_linter/src/rules/pydoclint/rules/check_docstring.rs b/crates/ruff_linter/src/rules/pydoclint/rules/check_docstring.rs index dd4f8ee8a7dddc..adcdcc5dec358d 100644 --- a/crates/ruff_linter/src/rules/pydoclint/rules/check_docstring.rs +++ b/crates/ruff_linter/src/rules/pydoclint/rules/check_docstring.rs @@ -58,6 +58,7 @@ use crate::rules::pydocstyle::settings::Convention; /// return distance / time /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.14.1")] pub(crate) struct DocstringExtraneousParameter { id: String, } @@ -112,6 +113,7 @@ impl Violation for DocstringExtraneousParameter { /// return distance / time /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.5.6")] pub(crate) struct DocstringMissingReturns; impl Violation for DocstringMissingReturns { @@ -163,6 +165,7 @@ impl Violation for DocstringMissingReturns { /// print("Hello!") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.5.6")] pub(crate) struct DocstringExtraneousReturns; impl Violation for DocstringExtraneousReturns { @@ -215,6 +218,7 @@ impl Violation for DocstringExtraneousReturns { /// yield i /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.5.7")] pub(crate) struct DocstringMissingYields; impl Violation for DocstringMissingYields { @@ -266,6 +270,7 @@ impl Violation for DocstringMissingYields { /// print("Hello!") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.5.7")] pub(crate) struct DocstringExtraneousYields; impl Violation for DocstringExtraneousYields { @@ -337,6 +342,7 @@ impl Violation for DocstringExtraneousYields { /// raise FasterThanLightError from exc /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.5.5")] pub(crate) struct DocstringMissingException { id: String, } @@ -404,6 +410,7 @@ impl Violation for DocstringMissingException { /// could possibly raise, even those which are not explicitly raised using /// `raise` statements in the function body. #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.5.5")] pub(crate) struct DocstringExtraneousException { ids: Vec, } diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/backslashes.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/backslashes.rs index a062d173bd18b4..e7fdf4f37bfbfd 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/backslashes.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/backslashes.rs @@ -42,6 +42,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [PEP 257 – Docstring Conventions](https://peps.python.org/pep-0257/) /// - [Python documentation: String and Bytes literals](https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.172")] pub(crate) struct EscapeSequenceInDocstring; impl Violation for EscapeSequenceInDocstring { diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/blank_after_summary.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/blank_after_summary.rs index 50e6a75d3d219f..52e0282b6eb9bf 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/blank_after_summary.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/blank_after_summary.rs @@ -41,6 +41,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// /// [PEP 257]: https://peps.python.org/pep-0257/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.68")] pub(crate) struct MissingBlankLineAfterSummary { num_lines: usize, } diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/blank_before_after_class.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/blank_before_after_class.rs index 1196a42a75fcd8..16cdb26a13b06c 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/blank_before_after_class.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/blank_before_after_class.rs @@ -43,6 +43,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// /// [D211]: https://docs.astral.sh/ruff/rules/blank-line-before-class #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.70")] pub(crate) struct IncorrectBlankLineBeforeClass; impl AlwaysFixableViolation for IncorrectBlankLineBeforeClass { @@ -95,6 +96,7 @@ impl AlwaysFixableViolation for IncorrectBlankLineBeforeClass { /// /// [PEP 257]: https://peps.python.org/pep-0257/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.70")] pub(crate) struct IncorrectBlankLineAfterClass; impl AlwaysFixableViolation for IncorrectBlankLineAfterClass { @@ -142,6 +144,7 @@ impl AlwaysFixableViolation for IncorrectBlankLineAfterClass { /// /// [D203]: https://docs.astral.sh/ruff/rules/incorrect-blank-line-before-class #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.70")] pub(crate) struct BlankLineBeforeClass; impl AlwaysFixableViolation for BlankLineBeforeClass { diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/blank_before_after_function.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/blank_before_after_function.rs index bf124a12d16baf..83efa3adc68f01 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/blank_before_after_function.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/blank_before_after_function.rs @@ -38,6 +38,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Python Style Guide - Docstrings](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.70")] pub(crate) struct BlankLineBeforeFunction { num_lines: usize, } @@ -84,6 +85,7 @@ impl Violation for BlankLineBeforeFunction { /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Python Style Guide - Docstrings](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.70")] pub(crate) struct BlankLineAfterFunction { num_lines: usize, } diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/capitalized.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/capitalized.rs index ccc082ba38b4ad..32cfa89406f320 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/capitalized.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/capitalized.rs @@ -30,6 +30,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Python Style Guide - Docstrings](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.69")] pub(crate) struct FirstWordUncapitalized { first_word: String, capitalized_word: String, diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/ends_with_period.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/ends_with_period.rs index 11f7915c338ef1..6b1c7f4cf1e58b 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/ends_with_period.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/ends_with_period.rs @@ -45,6 +45,7 @@ use crate::rules::pydocstyle::helpers::logical_line; /// /// [PEP 257]: https://peps.python.org/pep-0257/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.68")] pub(crate) struct MissingTrailingPeriod; impl Violation for MissingTrailingPeriod { diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/ends_with_punctuation.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/ends_with_punctuation.rs index 6b4d25fa56f006..2e1174a72e0613 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/ends_with_punctuation.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/ends_with_punctuation.rs @@ -44,6 +44,7 @@ use crate::rules::pydocstyle::helpers::logical_line; /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Python Style Guide - Docstrings](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.69")] pub(crate) struct MissingTerminalPunctuation; impl Violation for MissingTerminalPunctuation { diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/if_needed.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/if_needed.rs index 0ad276b81616f2..7fb88ffc347a2f 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/if_needed.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/if_needed.rs @@ -67,6 +67,7 @@ use crate::docstrings::Docstring; /// - [PEP 257 – Docstring Conventions](https://peps.python.org/pep-0257/) /// - [Python documentation: `typing.overload`](https://docs.python.org/3/library/typing.html#typing.overload) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.71")] pub(crate) struct OverloadWithDocstring; impl Violation for OverloadWithDocstring { diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/indent.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/indent.rs index 2a8f9b721f526d..ebb1c72cc923bc 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/indent.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/indent.rs @@ -52,6 +52,7 @@ use crate::{Edit, Fix}; /// [PEP 8]: https://peps.python.org/pep-0008/#tabs-or-spaces /// [formatter]: https://docs.astral.sh/ruff/formatter #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.75")] pub(crate) struct DocstringTabIndentation; impl Violation for DocstringTabIndentation { @@ -100,6 +101,7 @@ impl Violation for DocstringTabIndentation { /// [PEP 257]: https://peps.python.org/pep-0257/ /// [formatter]: https://docs.astral.sh/ruff/formatter/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.75")] pub(crate) struct UnderIndentation; impl AlwaysFixableViolation for UnderIndentation { @@ -152,6 +154,7 @@ impl AlwaysFixableViolation for UnderIndentation { /// [PEP 257]: https://peps.python.org/pep-0257/ /// [formatter]:https://docs.astral.sh/ruff/formatter/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.75")] pub(crate) struct OverIndentation; impl AlwaysFixableViolation for OverIndentation { diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/multi_line_summary_start.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/multi_line_summary_start.rs index 4d2e6e596f142a..b02c06af01cc9b 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/multi_line_summary_start.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/multi_line_summary_start.rs @@ -61,6 +61,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// [D213]: https://docs.astral.sh/ruff/rules/multi-line-summary-second-line /// [PEP 257]: https://peps.python.org/pep-0257 #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.69")] pub(crate) struct MultiLineSummaryFirstLine; impl AlwaysFixableViolation for MultiLineSummaryFirstLine { @@ -124,6 +125,7 @@ impl AlwaysFixableViolation for MultiLineSummaryFirstLine { /// [D212]: https://docs.astral.sh/ruff/rules/multi-line-summary-first-line /// [PEP 257]: https://peps.python.org/pep-0257 #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.69")] pub(crate) struct MultiLineSummarySecondLine; impl AlwaysFixableViolation for MultiLineSummarySecondLine { diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/newline_after_last_paragraph.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/newline_after_last_paragraph.rs index afdaf68348ea70..43c32de6c17c6a 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/newline_after_last_paragraph.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/newline_after_last_paragraph.rs @@ -44,6 +44,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// /// [PEP 257]: https://peps.python.org/pep-0257/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.68")] pub(crate) struct NewLineAfterLastParagraph; impl AlwaysFixableViolation for NewLineAfterLastParagraph { diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/no_signature.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/no_signature.rs index 5a06ae6022d9fc..4ffc8be1ddd7a5 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/no_signature.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/no_signature.rs @@ -41,6 +41,7 @@ use crate::docstrings::Docstring; /// /// [PEP 257]: https://peps.python.org/pep-0257/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.70")] pub(crate) struct SignatureInDocstring; impl Violation for SignatureInDocstring { diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/no_surrounding_whitespace.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/no_surrounding_whitespace.rs index fd9ee2798e751e..4233f596ed8073 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/no_surrounding_whitespace.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/no_surrounding_whitespace.rs @@ -32,6 +32,7 @@ use crate::rules::pydocstyle::helpers::ends_with_backslash; /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Python Style Guide - Docstrings](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.68")] pub(crate) struct SurroundingWhitespace; impl Violation for SurroundingWhitespace { diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/non_imperative_mood.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/non_imperative_mood.rs index 6369e355de29ca..9597b17b925d3e 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/non_imperative_mood.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/non_imperative_mood.rs @@ -51,6 +51,7 @@ static MOOD: LazyLock = LazyLock::new(Mood::new); /// /// [PEP 257]: https://peps.python.org/pep-0257/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.228")] pub(crate) struct NonImperativeMood { first_line: String, } diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/not_empty.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/not_empty.rs index 4c69d9bd4f90c0..a16e0a191d234c 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/not_empty.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/not_empty.rs @@ -29,6 +29,7 @@ use crate::docstrings::Docstring; /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Python Style Guide - Docstrings](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.68")] pub(crate) struct EmptyDocstring; impl Violation for EmptyDocstring { diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/not_missing.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/not_missing.rs index 87d4f876aada33..b82098169fd1be 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/not_missing.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/not_missing.rs @@ -61,6 +61,7 @@ use crate::checkers::ast::Checker; /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Python Style Guide - Docstrings](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.70")] pub(crate) struct UndocumentedPublicModule; impl Violation for UndocumentedPublicModule { @@ -144,6 +145,7 @@ impl Violation for UndocumentedPublicModule { /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Python Style Guide - Docstrings](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.70")] pub(crate) struct UndocumentedPublicClass; impl Violation for UndocumentedPublicClass { @@ -226,6 +228,7 @@ impl Violation for UndocumentedPublicClass { /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Python Style Guide - Docstrings](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.70")] pub(crate) struct UndocumentedPublicMethod; impl Violation for UndocumentedPublicMethod { @@ -316,6 +319,7 @@ impl Violation for UndocumentedPublicMethod { /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Style Python Docstrings](https://google.github.io/styleguide/pyguide.html#s3.8-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.70")] pub(crate) struct UndocumentedPublicFunction; impl Violation for UndocumentedPublicFunction { @@ -359,6 +363,7 @@ impl Violation for UndocumentedPublicFunction { /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Style Python Docstrings](https://google.github.io/styleguide/pyguide.html#s3.8-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.70")] pub(crate) struct UndocumentedPublicPackage; impl Violation for UndocumentedPublicPackage { @@ -416,6 +421,7 @@ impl Violation for UndocumentedPublicPackage { /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Style Python Docstrings](https://google.github.io/styleguide/pyguide.html#s3.8-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.70")] pub(crate) struct UndocumentedMagicMethod; impl Violation for UndocumentedMagicMethod { @@ -471,6 +477,7 @@ impl Violation for UndocumentedMagicMethod { /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Style Python Docstrings](https://google.github.io/styleguide/pyguide.html#s3.8-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.70")] pub(crate) struct UndocumentedPublicNestedClass; impl Violation for UndocumentedPublicNestedClass { @@ -519,6 +526,7 @@ impl Violation for UndocumentedPublicNestedClass { /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Style Python Docstrings](https://google.github.io/styleguide/pyguide.html#s3.8-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.70")] pub(crate) struct UndocumentedPublicInit; impl Violation for UndocumentedPublicInit { diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/one_liner.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/one_liner.rs index 158092f1107923..3fe7e92bae7050 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/one_liner.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/one_liner.rs @@ -37,6 +37,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// /// [PEP 257]: https://peps.python.org/pep-0257/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.68")] pub(crate) struct UnnecessaryMultilineDocstring; impl Violation for UnnecessaryMultilineDocstring { diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/sections.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/sections.rs index 0f4e51717a8f9f..7b9fc80ba8adbb 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/sections.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/sections.rs @@ -89,6 +89,7 @@ use crate::{Edit, Fix}; /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Python Style Guide - Docstrings](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.73")] pub(crate) struct OverindentedSection { name: String, } @@ -192,6 +193,7 @@ impl AlwaysFixableViolation for OverindentedSection { /// - [PEP 287 – reStructuredText Docstring Format](https://peps.python.org/pep-0287/) /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.73")] pub(crate) struct OverindentedSectionUnderline { name: String, } @@ -275,6 +277,7 @@ impl AlwaysFixableViolation for OverindentedSectionUnderline { /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Python Style Guide - Docstrings](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.71")] pub(crate) struct NonCapitalizedSectionName { name: String, } @@ -373,6 +376,7 @@ impl AlwaysFixableViolation for NonCapitalizedSectionName { /// - [PEP 287 – reStructuredText Docstring Format](https://peps.python.org/pep-0287/) /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.71")] pub(crate) struct MissingNewLineAfterSectionName { name: String, } @@ -476,6 +480,7 @@ impl AlwaysFixableViolation for MissingNewLineAfterSectionName { /// - [PEP 287 – reStructuredText Docstring Format](https://peps.python.org/pep-0287/) /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.71")] pub(crate) struct MissingDashedUnderlineAfterSection { name: String, } @@ -582,6 +587,7 @@ impl AlwaysFixableViolation for MissingDashedUnderlineAfterSection { /// - [PEP 287 – reStructuredText Docstring Format](https://peps.python.org/pep-0287/) /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.71")] pub(crate) struct MissingSectionUnderlineAfterName { name: String, } @@ -686,6 +692,7 @@ impl AlwaysFixableViolation for MissingSectionUnderlineAfterName { /// - [PEP 287 – reStructuredText Docstring Format](https://peps.python.org/pep-0287/) /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.71")] pub(crate) struct MismatchedSectionUnderlineLength { name: String, } @@ -783,6 +790,7 @@ impl AlwaysFixableViolation for MismatchedSectionUnderlineLength { /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Style Guide](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.71")] pub(crate) struct NoBlankLineAfterSection { name: String, } @@ -876,6 +884,7 @@ impl AlwaysFixableViolation for NoBlankLineAfterSection { /// - [PEP 287 – reStructuredText Docstring Format](https://peps.python.org/pep-0287/) /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.71")] pub(crate) struct NoBlankLineBeforeSection { name: String, } @@ -971,6 +980,7 @@ impl AlwaysFixableViolation for NoBlankLineBeforeSection { /// - [PEP 287 – reStructuredText Docstring Format](https://peps.python.org/pep-0287/) /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.71")] pub(crate) struct MissingBlankLineAfterLastSection { name: String, } @@ -1060,6 +1070,7 @@ impl AlwaysFixableViolation for MissingBlankLineAfterLastSection { /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Style Guide](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.71")] pub(crate) struct EmptyDocstringSection { name: String, } @@ -1137,6 +1148,7 @@ impl Violation for EmptyDocstringSection { /// - [PEP 287 – reStructuredText Docstring Format](https://peps.python.org/pep-0287/) /// - [Google Style Guide](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.74")] pub(crate) struct MissingSectionNameColon { name: String, } @@ -1222,6 +1234,7 @@ impl AlwaysFixableViolation for MissingSectionNameColon { /// - [PEP 287 – reStructuredText Docstring Format](https://peps.python.org/pep-0287/) /// - [Google Python Style Guide - Docstrings](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.73")] pub(crate) struct UndocumentedParam { /// The name of the function being documented. definition: String, @@ -1304,6 +1317,7 @@ impl Violation for UndocumentedParam { /// - [NumPy Style Guide](https://numpydoc.readthedocs.io/en/latest/format.html) /// - [Google Python Style Guide - Docstrings](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.71")] pub(crate) struct BlankLinesBetweenHeaderAndContent { name: String, } diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/starts_with_this.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/starts_with_this.rs index 1bbcc9ab4ca1a3..d3e94659187e89 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/starts_with_this.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/starts_with_this.rs @@ -40,6 +40,7 @@ use crate::rules::pydocstyle::helpers::normalize_word; /// /// [PEP 257]: https://peps.python.org/pep-0257/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.71")] pub(crate) struct DocstringStartsWithThis; impl Violation for DocstringStartsWithThis { diff --git a/crates/ruff_linter/src/rules/pydocstyle/rules/triple_quotes.rs b/crates/ruff_linter/src/rules/pydocstyle/rules/triple_quotes.rs index 374ac693697584..17dc5eac9213fb 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/rules/triple_quotes.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/rules/triple_quotes.rs @@ -38,6 +38,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// /// [formatter]: https://docs.astral.sh/ruff/formatter/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.69")] pub(crate) struct TripleSingleQuotes { expected_quote: Quote, } diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/assert_tuple.rs b/crates/ruff_linter/src/rules/pyflakes/rules/assert_tuple.rs index 798f9bb990b43e..1884a2e6cfa39a 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/assert_tuple.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/assert_tuple.rs @@ -28,6 +28,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: The `assert` statement](https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.28")] pub(crate) struct AssertTuple; impl Violation for AssertTuple { diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/break_outside_loop.rs b/crates/ruff_linter/src/rules/pyflakes/rules/break_outside_loop.rs index 0309c0047ea3f6..834d63f7307855 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/break_outside_loop.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/break_outside_loop.rs @@ -18,6 +18,7 @@ use crate::Violation; /// ## References /// - [Python documentation: `break`](https://docs.python.org/3/reference/simple_stmts.html#the-break-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.36")] pub(crate) struct BreakOutsideLoop; impl Violation for BreakOutsideLoop { diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/continue_outside_loop.rs b/crates/ruff_linter/src/rules/pyflakes/rules/continue_outside_loop.rs index 334c64c2a779ba..4e775f3ccdecf8 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/continue_outside_loop.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/continue_outside_loop.rs @@ -18,6 +18,7 @@ use crate::Violation; /// ## References /// - [Python documentation: `continue`](https://docs.python.org/3/reference/simple_stmts.html#the-continue-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.36")] pub(crate) struct ContinueOutsideLoop; impl Violation for ContinueOutsideLoop { diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/default_except_not_last.rs b/crates/ruff_linter/src/rules/pyflakes/rules/default_except_not_last.rs index 42a45f3bf42008..0cfa0a1950e730 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/default_except_not_last.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/default_except_not_last.rs @@ -45,6 +45,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `except` clause](https://docs.python.org/3/reference/compound_stmts.html#except-clause) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.28")] pub(crate) struct DefaultExceptNotLast; impl Violation for DefaultExceptNotLast { diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/f_string_missing_placeholders.rs b/crates/ruff_linter/src/rules/pyflakes/rules/f_string_missing_placeholders.rs index 3e15f4cfe334a1..3538e596e1598f 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/f_string_missing_placeholders.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/f_string_missing_placeholders.rs @@ -54,6 +54,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [PEP 498 – Literal String Interpolation](https://peps.python.org/pep-0498/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.18")] pub(crate) struct FStringMissingPlaceholders; impl AlwaysFixableViolation for FStringMissingPlaceholders { diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/forward_annotation_syntax_error.rs b/crates/ruff_linter/src/rules/pyflakes/rules/forward_annotation_syntax_error.rs index 41c3796563e2d3..d552c3f3d94037 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/forward_annotation_syntax_error.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/forward_annotation_syntax_error.rs @@ -24,6 +24,7 @@ use crate::Violation; /// ## References /// - [PEP 563 – Postponed Evaluation of Annotations](https://peps.python.org/pep-0563/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.39")] pub(crate) struct ForwardAnnotationSyntaxError { pub parse_error: String, } diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/future_feature_not_defined.rs b/crates/ruff_linter/src/rules/pyflakes/rules/future_feature_not_defined.rs index 9d5886f04a3b13..59e2bf79a1eefe 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/future_feature_not_defined.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/future_feature_not_defined.rs @@ -13,6 +13,7 @@ use crate::Violation; /// ## References /// - [Python documentation: `__future__`](https://docs.python.org/3/library/__future__.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.34")] pub(crate) struct FutureFeatureNotDefined { pub name: String, } diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/if_tuple.rs b/crates/ruff_linter/src/rules/pyflakes/rules/if_tuple.rs index 75fb7ce65a19f8..47f6ea9fd78b04 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/if_tuple.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/if_tuple.rs @@ -29,6 +29,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: The `if` statement](https://docs.python.org/3/reference/compound_stmts.html#the-if-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.18")] pub(crate) struct IfTuple; impl Violation for IfTuple { diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/imports.rs b/crates/ruff_linter/src/rules/pyflakes/rules/imports.rs index 3b3c33d0fe669c..7a97aa09ab60a8 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/imports.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/imports.rs @@ -34,6 +34,7 @@ use crate::checkers::ast::Checker; /// print(filename) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.44")] pub(crate) struct ImportShadowedByLoopVar { pub(crate) name: String, pub(crate) row: SourceRow, @@ -117,6 +118,7 @@ pub(crate) fn import_shadowed_by_loop_var(checker: &Checker, scope_id: ScopeId, /// /// [PEP 8]: https://peps.python.org/pep-0008/#imports #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.18")] pub(crate) struct UndefinedLocalWithImportStar { pub(crate) name: String, } @@ -155,6 +157,7 @@ impl Violation for UndefinedLocalWithImportStar { /// ## References /// - [Python documentation: Future statements](https://docs.python.org/3/reference/simple_stmts.html#future) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.34")] pub(crate) struct LateFutureImport; impl Violation for LateFutureImport { @@ -199,6 +202,7 @@ impl Violation for LateFutureImport { /// return pi * radius**2 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.44")] pub(crate) struct UndefinedLocalWithImportStarUsage { pub(crate) name: String, } @@ -240,6 +244,7 @@ impl Violation for UndefinedLocalWithImportStarUsage { /// /// [PEP 8]: https://peps.python.org/pep-0008/#imports #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.37")] pub(crate) struct UndefinedLocalWithNestedImportStarUsage { pub(crate) name: String, } diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/invalid_literal_comparisons.rs b/crates/ruff_linter/src/rules/pyflakes/rules/invalid_literal_comparisons.rs index 6a6fa725175463..d09d6cd006b2b3 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/invalid_literal_comparisons.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/invalid_literal_comparisons.rs @@ -51,6 +51,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// - [Python documentation: Value comparisons](https://docs.python.org/3/reference/expressions.html#value-comparisons) /// - [_Why does Python log a SyntaxWarning for ‘is’ with literals?_ by Adam Johnson](https://adamj.eu/tech/2020/01/21/why-does-python-3-8-syntaxwarning-for-is-literal/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.39")] pub(crate) struct IsLiteral { cmp_op: IsCmpOp, } diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/invalid_print_syntax.rs b/crates/ruff_linter/src/rules/pyflakes/rules/invalid_print_syntax.rs index 146917dd455cc5..72ccffb2667e8b 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/invalid_print_syntax.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/invalid_print_syntax.rs @@ -47,6 +47,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `print`](https://docs.python.org/3/library/functions.html#print) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.39")] pub(crate) struct InvalidPrintSyntax; impl Violation for InvalidPrintSyntax { diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/raise_not_implemented.rs b/crates/ruff_linter/src/rules/pyflakes/rules/raise_not_implemented.rs index e19fd97b5d7e3f..0bfd4f99339276 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/raise_not_implemented.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/raise_not_implemented.rs @@ -35,6 +35,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [Python documentation: `NotImplemented`](https://docs.python.org/3/library/constants.html#NotImplemented) /// - [Python documentation: `NotImplementedError`](https://docs.python.org/3/library/exceptions.html#NotImplementedError) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.18")] pub(crate) struct RaiseNotImplemented; impl Violation for RaiseNotImplemented { diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/redefined_while_unused.rs b/crates/ruff_linter/src/rules/pyflakes/rules/redefined_while_unused.rs index 3c13941f6ad366..01439bc76400fc 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/redefined_while_unused.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/redefined_while_unused.rs @@ -31,6 +31,7 @@ use rustc_hash::FxHashMap; /// import bar /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.171")] pub(crate) struct RedefinedWhileUnused { pub name: String, pub row: SourceRow, diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/repeated_keys.rs b/crates/ruff_linter/src/rules/pyflakes/rules/repeated_keys.rs index 0771b2ec721bb4..1acdc901381766 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/repeated_keys.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/repeated_keys.rs @@ -49,6 +49,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: Dictionaries](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.30")] pub(crate) struct MultiValueRepeatedKeyLiteral { name: SourceCodeSnippet, existing: SourceCodeSnippet, @@ -121,6 +122,7 @@ impl Violation for MultiValueRepeatedKeyLiteral { /// ## References /// - [Python documentation: Dictionaries](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.30")] pub(crate) struct MultiValueRepeatedKeyVariable { name: SourceCodeSnippet, } diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/return_outside_function.rs b/crates/ruff_linter/src/rules/pyflakes/rules/return_outside_function.rs index bd004db4543e0b..dc67da1e58f794 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/return_outside_function.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/return_outside_function.rs @@ -18,6 +18,7 @@ use crate::Violation; /// ## References /// - [Python documentation: `return`](https://docs.python.org/3/reference/simple_stmts.html#the-return-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.18")] pub(crate) struct ReturnOutsideFunction; impl Violation for ReturnOutsideFunction { diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/starred_expressions.rs b/crates/ruff_linter/src/rules/pyflakes/rules/starred_expressions.rs index 9fe9ec063f5c9f..70f25fb689029e 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/starred_expressions.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/starred_expressions.rs @@ -18,6 +18,7 @@ use crate::{Violation, checkers::ast::Checker}; /// ## References /// - [PEP 3132 – Extended Iterable Unpacking](https://peps.python.org/pep-3132/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.32")] pub(crate) struct ExpressionsInStarAssignment; impl Violation for ExpressionsInStarAssignment { @@ -44,6 +45,7 @@ impl Violation for ExpressionsInStarAssignment { /// ## References /// - [PEP 3132 – Extended Iterable Unpacking](https://peps.python.org/pep-3132/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.32")] pub(crate) struct MultipleStarredExpressions; impl Violation for MultipleStarredExpressions { diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/strings.rs b/crates/ruff_linter/src/rules/pyflakes/rules/strings.rs index 785e7266b3b1f9..9df61638c40f52 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/strings.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/strings.rs @@ -39,6 +39,7 @@ use crate::rules::pyflakes::format::FormatSummary; /// ## References /// - [Python documentation: `printf`-style String Formatting](https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.142")] pub(crate) struct PercentFormatInvalidFormat { pub(crate) message: String, } @@ -78,6 +79,7 @@ impl Violation for PercentFormatInvalidFormat { /// ## References /// - [Python documentation: `printf`-style String Formatting](https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.142")] pub(crate) struct PercentFormatExpectedMapping; impl Violation for PercentFormatExpectedMapping { @@ -114,6 +116,7 @@ impl Violation for PercentFormatExpectedMapping { /// ## References /// - [Python documentation: `printf`-style String Formatting](https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.142")] pub(crate) struct PercentFormatExpectedSequence; impl Violation for PercentFormatExpectedSequence { @@ -153,6 +156,7 @@ impl Violation for PercentFormatExpectedSequence { /// ## References /// - [Python documentation: `printf`-style String Formatting](https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.142")] pub(crate) struct PercentFormatExtraNamedArguments { missing: Vec, } @@ -193,6 +197,7 @@ impl AlwaysFixableViolation for PercentFormatExtraNamedArguments { /// ## References /// - [Python documentation: `printf`-style String Formatting](https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.142")] pub(crate) struct PercentFormatMissingArgument { missing: Vec, } @@ -233,6 +238,7 @@ impl Violation for PercentFormatMissingArgument { /// ## References /// - [Python documentation: `printf`-style String Formatting](https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.142")] pub(crate) struct PercentFormatMixedPositionalAndNamed; impl Violation for PercentFormatMixedPositionalAndNamed { @@ -263,6 +269,7 @@ impl Violation for PercentFormatMixedPositionalAndNamed { /// ## References /// - [Python documentation: `printf`-style String Formatting](https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.142")] pub(crate) struct PercentFormatPositionalCountMismatch { wanted: usize, got: usize, @@ -301,6 +308,7 @@ impl Violation for PercentFormatPositionalCountMismatch { /// ## References /// - [Python documentation: `printf`-style String Formatting](https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.142")] pub(crate) struct PercentFormatStarRequiresSequence; impl Violation for PercentFormatStarRequiresSequence { @@ -331,6 +339,7 @@ impl Violation for PercentFormatStarRequiresSequence { /// ## References /// - [Python documentation: `printf`-style String Formatting](https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.142")] pub(crate) struct PercentFormatUnsupportedFormatCharacter { pub(crate) char: char, } @@ -362,6 +371,7 @@ impl Violation for PercentFormatUnsupportedFormatCharacter { /// ## References /// - [Python documentation: `str.format`](https://docs.python.org/3/library/stdtypes.html#str.format) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.138")] pub(crate) struct StringDotFormatInvalidFormat { pub(crate) message: String, } @@ -404,6 +414,7 @@ impl Violation for StringDotFormatInvalidFormat { /// ## References /// - [Python documentation: `str.format`](https://docs.python.org/3/library/stdtypes.html#str.format) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.139")] pub(crate) struct StringDotFormatExtraNamedArguments { missing: Vec, } @@ -455,6 +466,7 @@ impl Violation for StringDotFormatExtraNamedArguments { /// ## References /// - [Python documentation: `str.format`](https://docs.python.org/3/library/stdtypes.html#str.format) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.139")] pub(crate) struct StringDotFormatExtraPositionalArguments { missing: Vec, } @@ -498,6 +510,7 @@ impl Violation for StringDotFormatExtraPositionalArguments { /// ## References /// - [Python documentation: `str.format`](https://docs.python.org/3/library/stdtypes.html#str.format) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.139")] pub(crate) struct StringDotFormatMissingArguments { missing: Vec, } @@ -536,6 +549,7 @@ impl Violation for StringDotFormatMissingArguments { /// ## References /// - [Python documentation: `str.format`](https://docs.python.org/3/library/stdtypes.html#str.format) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.139")] pub(crate) struct StringDotFormatMixingAutomatic; impl Violation for StringDotFormatMixingAutomatic { diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/undefined_export.rs b/crates/ruff_linter/src/rules/pyflakes/rules/undefined_export.rs index 18c9ddc1d8d30d..1a1648f92c3ef2 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/undefined_export.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/undefined_export.rs @@ -40,6 +40,7 @@ use crate::Violation; /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.25")] pub(crate) struct UndefinedExport { pub name: String, } diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/undefined_local.rs b/crates/ruff_linter/src/rules/pyflakes/rules/undefined_local.rs index 0af1d5f4fb6dc6..a46205a72ad9f7 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/undefined_local.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/undefined_local.rs @@ -33,6 +33,7 @@ use crate::checkers::ast::Checker; /// x += 1 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.24")] pub(crate) struct UndefinedLocal { name: String, } diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/undefined_name.rs b/crates/ruff_linter/src/rules/pyflakes/rules/undefined_name.rs index f1666bf9b3f5bb..314488cb21781f 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/undefined_name.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/undefined_name.rs @@ -27,6 +27,7 @@ use crate::Violation; /// ## References /// - [Python documentation: Naming and binding](https://docs.python.org/3/reference/executionmodel.html#naming-and-binding) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.20")] pub(crate) struct UndefinedName { pub(crate) name: String, pub(crate) minor_version_builtin_added: Option, diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/unused_annotation.rs b/crates/ruff_linter/src/rules/pyflakes/rules/unused_annotation.rs index 041a5a02110c6e..98692373bf011d 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/unused_annotation.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/unused_annotation.rs @@ -21,6 +21,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [PEP 484 – Type Hints](https://peps.python.org/pep-0484/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.172")] pub(crate) struct UnusedAnnotation { name: String, } diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/unused_import.rs b/crates/ruff_linter/src/rules/pyflakes/rules/unused_import.rs index 22bcd0cf0ee08d..37530f1a609341 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/unused_import.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/unused_import.rs @@ -143,6 +143,7 @@ use crate::{Applicability, Fix, FixAvailability, Violation}; /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.18")] pub(crate) struct UnusedImport { /// Qualified name of the import name: String, diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/unused_variable.rs b/crates/ruff_linter/src/rules/pyflakes/rules/unused_variable.rs index b52e01142b7b76..aa5610620eb58d 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/unused_variable.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/unused_variable.rs @@ -53,6 +53,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// /// [RUF059]: https://docs.astral.sh/ruff/rules/unused-unpacked-variable/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.22")] pub(crate) struct UnusedVariable { pub name: String, } diff --git a/crates/ruff_linter/src/rules/pyflakes/rules/yield_outside_function.rs b/crates/ruff_linter/src/rules/pyflakes/rules/yield_outside_function.rs index 7838c267db37f0..38be7d11672a3b 100644 --- a/crates/ruff_linter/src/rules/pyflakes/rules/yield_outside_function.rs +++ b/crates/ruff_linter/src/rules/pyflakes/rules/yield_outside_function.rs @@ -54,6 +54,7 @@ impl From for DeferralKeyword { /// /// [autoawait]: https://ipython.readthedocs.io/en/stable/interactive/autoawait.html #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.22")] pub(crate) struct YieldOutsideFunction { keyword: DeferralKeyword, } diff --git a/crates/ruff_linter/src/rules/pygrep_hooks/rules/blanket_noqa.rs b/crates/ruff_linter/src/rules/pygrep_hooks/rules/blanket_noqa.rs index e60fd420721c90..1c5bdf4339d32c 100644 --- a/crates/ruff_linter/src/rules/pygrep_hooks/rules/blanket_noqa.rs +++ b/crates/ruff_linter/src/rules/pygrep_hooks/rules/blanket_noqa.rs @@ -39,6 +39,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Ruff documentation](https://docs.astral.sh/ruff/configuration/#error-suppression) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.200")] pub(crate) struct BlanketNOQA { missing_colon: bool, file_exemption: bool, diff --git a/crates/ruff_linter/src/rules/pygrep_hooks/rules/blanket_type_ignore.rs b/crates/ruff_linter/src/rules/pygrep_hooks/rules/blanket_type_ignore.rs index efd12c7b3b9d9e..1386ca0f617819 100644 --- a/crates/ruff_linter/src/rules/pygrep_hooks/rules/blanket_type_ignore.rs +++ b/crates/ruff_linter/src/rules/pygrep_hooks/rules/blanket_type_ignore.rs @@ -42,6 +42,7 @@ use crate::checkers::ast::LintContext; /// enable_error_code = ["ignore-without-code"] /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.187")] pub(crate) struct BlanketTypeIgnore; impl Violation for BlanketTypeIgnore { diff --git a/crates/ruff_linter/src/rules/pygrep_hooks/rules/deprecated_log_warn.rs b/crates/ruff_linter/src/rules/pygrep_hooks/rules/deprecated_log_warn.rs index 648702121c43c4..87319784a86011 100644 --- a/crates/ruff_linter/src/rules/pygrep_hooks/rules/deprecated_log_warn.rs +++ b/crates/ruff_linter/src/rules/pygrep_hooks/rules/deprecated_log_warn.rs @@ -34,6 +34,7 @@ use crate::{FixAvailability, Violation}; /// /// [G010]: https://docs.astral.sh/ruff/rules/logging-warn/ #[derive(ViolationMetadata)] +#[violation_metadata(removed_since = "v0.2.0")] pub(crate) struct DeprecatedLogWarn; /// PGH002 diff --git a/crates/ruff_linter/src/rules/pygrep_hooks/rules/invalid_mock_access.rs b/crates/ruff_linter/src/rules/pygrep_hooks/rules/invalid_mock_access.rs index ec33040df177c5..afcc230966e094 100644 --- a/crates/ruff_linter/src/rules/pygrep_hooks/rules/invalid_mock_access.rs +++ b/crates/ruff_linter/src/rules/pygrep_hooks/rules/invalid_mock_access.rs @@ -33,6 +33,7 @@ enum Reason { /// my_mock.assert_called() /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.266")] pub(crate) struct InvalidMockAccess { reason: Reason, } diff --git a/crates/ruff_linter/src/rules/pygrep_hooks/rules/no_eval.rs b/crates/ruff_linter/src/rules/pygrep_hooks/rules/no_eval.rs index 8615e4ae5102f2..1818aaf79a34fa 100644 --- a/crates/ruff_linter/src/rules/pygrep_hooks/rules/no_eval.rs +++ b/crates/ruff_linter/src/rules/pygrep_hooks/rules/no_eval.rs @@ -31,6 +31,7 @@ use crate::Violation; /// /// [S307]: https://docs.astral.sh/ruff/rules/suspicious-eval-usage/ #[derive(ViolationMetadata)] +#[violation_metadata(removed_since = "v0.2.0")] pub(crate) struct Eval; /// PGH001 diff --git a/crates/ruff_linter/src/rules/pylint/rules/and_or_ternary.rs b/crates/ruff_linter/src/rules/pylint/rules/and_or_ternary.rs index bc8bed77c77673..e93e3a1c34d951 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/and_or_ternary.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/and_or_ternary.rs @@ -29,6 +29,7 @@ use crate::Violation; /// maximum = x if x >= y else y /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(removed_since = "v0.2.0")] pub(crate) struct AndOrTernary; /// PLR1706 diff --git a/crates/ruff_linter/src/rules/pylint/rules/assert_on_string_literal.rs b/crates/ruff_linter/src/rules/pylint/rules/assert_on_string_literal.rs index 64db3f1e400bc1..60dbad3e8cf1d4 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/assert_on_string_literal.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/assert_on_string_literal.rs @@ -26,6 +26,7 @@ enum Kind { /// assert "always true" /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct AssertOnStringLiteral { kind: Kind, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/await_outside_async.rs b/crates/ruff_linter/src/rules/pylint/rules/await_outside_async.rs index e41275a1cab924..78ad99fd076500 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/await_outside_async.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/await_outside_async.rs @@ -36,6 +36,7 @@ use crate::Violation; /// /// [autoawait]: https://ipython.readthedocs.io/en/stable/interactive/autoawait.html #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.150")] pub(crate) struct AwaitOutsideAsync; impl Violation for AwaitOutsideAsync { diff --git a/crates/ruff_linter/src/rules/pylint/rules/bad_dunder_method_name.rs b/crates/ruff_linter/src/rules/pylint/rules/bad_dunder_method_name.rs index b4ee0a43328ef5..200ec4dbe2fd70 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/bad_dunder_method_name.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/bad_dunder_method_name.rs @@ -43,6 +43,7 @@ use crate::rules::pylint::helpers::is_known_dunder_method; /// ## Options /// - `lint.pylint.allow-dunder-method-names` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.285")] pub(crate) struct BadDunderMethodName { name: String, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/bad_open_mode.rs b/crates/ruff_linter/src/rules/pylint/rules/bad_open_mode.rs index b89cbf142565da..c949b7baef4617 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/bad_open_mode.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/bad_open_mode.rs @@ -37,6 +37,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `open`](https://docs.python.org/3/library/functions.html#open) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct BadOpenMode { mode: String, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/bad_staticmethod_argument.rs b/crates/ruff_linter/src/rules/pylint/rules/bad_staticmethod_argument.rs index 4108cd8c74c2a6..bc488411fd4a5e 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/bad_staticmethod_argument.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/bad_staticmethod_argument.rs @@ -37,6 +37,7 @@ use crate::checkers::ast::Checker; /// /// [PEP 8]: https://peps.python.org/pep-0008/#function-and-method-arguments #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.6.0")] pub(crate) struct BadStaticmethodArgument { argument_name: String, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/bad_str_strip_call.rs b/crates/ruff_linter/src/rules/pylint/rules/bad_str_strip_call.rs index b251bab3236a6a..41620db47b2487 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/bad_str_strip_call.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/bad_str_strip_call.rs @@ -48,6 +48,7 @@ use ruff_python_ast::PythonVersion; /// ## References /// - [Python documentation: `str.strip`](https://docs.python.org/3/library/stdtypes.html?highlight=strip#str.strip) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.242")] pub(crate) struct BadStrStripCall { strip: StripKind, removal: Option, diff --git a/crates/ruff_linter/src/rules/pylint/rules/bad_string_format_character.rs b/crates/ruff_linter/src/rules/pylint/rules/bad_string_format_character.rs index a94e8290e93024..28a24babde1960 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/bad_string_format_character.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/bad_string_format_character.rs @@ -27,6 +27,7 @@ use crate::checkers::ast::Checker; /// print("{:z}".format("1")) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.283")] pub(crate) struct BadStringFormatCharacter { format_char: char, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/bad_string_format_type.rs b/crates/ruff_linter/src/rules/pylint/rules/bad_string_format_type.rs index a747b9b12ae724..3822b76b7a53b5 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/bad_string_format_type.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/bad_string_format_type.rs @@ -28,6 +28,7 @@ use crate::checkers::ast::Checker; /// print("%d" % 1) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.245")] pub(crate) struct BadStringFormatType; impl Violation for BadStringFormatType { diff --git a/crates/ruff_linter/src/rules/pylint/rules/bidirectional_unicode.rs b/crates/ruff_linter/src/rules/pylint/rules/bidirectional_unicode.rs index 11ac152258d6fd..3e6f2eff6f364a 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/bidirectional_unicode.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/bidirectional_unicode.rs @@ -50,6 +50,7 @@ const BIDI_UNICODE: [char; 11] = [ /// ## References /// - [PEP 672: Bidirectional Marks, Embeddings, Overrides and Isolates](https://peps.python.org/pep-0672/#bidirectional-marks-embeddings-overrides-and-isolates) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.244")] pub(crate) struct BidirectionalUnicode; impl Violation for BidirectionalUnicode { diff --git a/crates/ruff_linter/src/rules/pylint/rules/binary_op_exception.rs b/crates/ruff_linter/src/rules/pylint/rules/binary_op_exception.rs index eefae02792e891..533d44cc5a6c19 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/binary_op_exception.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/binary_op_exception.rs @@ -47,6 +47,7 @@ impl From<&ast::BoolOp> for BoolOp { /// pass /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.258")] pub(crate) struct BinaryOpException { op: BoolOp, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/boolean_chained_comparison.rs b/crates/ruff_linter/src/rules/pylint/rules/boolean_chained_comparison.rs index 1795e7ed57f025..27d6d49ad5fcd1 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/boolean_chained_comparison.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/boolean_chained_comparison.rs @@ -35,6 +35,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// pass /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.9.0")] pub(crate) struct BooleanChainedComparison; impl AlwaysFixableViolation for BooleanChainedComparison { diff --git a/crates/ruff_linter/src/rules/pylint/rules/collapsible_else_if.rs b/crates/ruff_linter/src/rules/pylint/rules/collapsible_else_if.rs index 72b15426a7774d..1e68c246fb0ea6 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/collapsible_else_if.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/collapsible_else_if.rs @@ -46,6 +46,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `if` Statements](https://docs.python.org/3/tutorial/controlflow.html#if-statements) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.253")] pub(crate) struct CollapsibleElseIf; impl Violation for CollapsibleElseIf { diff --git a/crates/ruff_linter/src/rules/pylint/rules/compare_to_empty_string.rs b/crates/ruff_linter/src/rules/pylint/rules/compare_to_empty_string.rs index 94217d05ced7d0..421dcac4bea2f3 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/compare_to_empty_string.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/compare_to_empty_string.rs @@ -41,6 +41,7 @@ use crate::checkers::ast::Checker; /// /// [#4282]: https://github.com/astral-sh/ruff/issues/4282 #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.255")] pub(crate) struct CompareToEmptyString { existing: String, replacement: String, diff --git a/crates/ruff_linter/src/rules/pylint/rules/comparison_of_constant.rs b/crates/ruff_linter/src/rules/pylint/rules/comparison_of_constant.rs index 8eab156203d44e..57abf6f9e3de41 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/comparison_of_constant.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/comparison_of_constant.rs @@ -28,6 +28,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: Comparisons](https://docs.python.org/3/reference/expressions.html#comparisons) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.221")] pub(crate) struct ComparisonOfConstant { left_constant: String, op: CmpOp, diff --git a/crates/ruff_linter/src/rules/pylint/rules/comparison_with_itself.rs b/crates/ruff_linter/src/rules/pylint/rules/comparison_with_itself.rs index 60697e17cd99e6..9c38b10839af05 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/comparison_with_itself.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/comparison_with_itself.rs @@ -31,6 +31,7 @@ use crate::fix::snippet::SourceCodeSnippet; /// ## References /// - [Python documentation: Comparisons](https://docs.python.org/3/reference/expressions.html#comparisons) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.273")] pub(crate) struct ComparisonWithItself { actual: SourceCodeSnippet, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/continue_in_finally.rs b/crates/ruff_linter/src/rules/pylint/rules/continue_in_finally.rs index a89baf379edd2e..476dae54ed2f33 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/continue_in_finally.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/continue_in_finally.rs @@ -37,6 +37,7 @@ use crate::checkers::ast::Checker; /// ## Options /// - `target-version` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.257")] pub(crate) struct ContinueInFinally; impl Violation for ContinueInFinally { diff --git a/crates/ruff_linter/src/rules/pylint/rules/dict_index_missing_items.rs b/crates/ruff_linter/src/rules/pylint/rules/dict_index_missing_items.rs index c30ac6883e6e77..a7f718c1b954ca 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/dict_index_missing_items.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/dict_index_missing_items.rs @@ -46,6 +46,7 @@ use crate::checkers::ast::Checker; /// print(f"{instrument}: {section}") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct DictIndexMissingItems; impl Violation for DictIndexMissingItems { diff --git a/crates/ruff_linter/src/rules/pylint/rules/dict_iter_missing_items.rs b/crates/ruff_linter/src/rules/pylint/rules/dict_iter_missing_items.rs index 60c7b91d048c0b..e973f1ce9c55af 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/dict_iter_missing_items.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/dict_iter_missing_items.rs @@ -51,6 +51,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## Fix safety /// Due to the known problem with tuple keys, this fix is unsafe. #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.3.0")] pub(crate) struct DictIterMissingItems; impl AlwaysFixableViolation for DictIterMissingItems { diff --git a/crates/ruff_linter/src/rules/pylint/rules/duplicate_bases.rs b/crates/ruff_linter/src/rules/pylint/rules/duplicate_bases.rs index e4a5192df2930e..2724d9a5e07eaf 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/duplicate_bases.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/duplicate_bases.rs @@ -55,6 +55,7 @@ use crate::{Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: Class definitions](https://docs.python.org/3/reference/compound_stmts.html#class-definitions) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.269")] pub(crate) struct DuplicateBases { base: String, class: String, diff --git a/crates/ruff_linter/src/rules/pylint/rules/empty_comment.rs b/crates/ruff_linter/src/rules/pylint/rules/empty_comment.rs index fb67f855052baa..004d50e5f48308 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/empty_comment.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/empty_comment.rs @@ -30,6 +30,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Pylint documentation](https://pylint.pycqa.org/en/latest/user_guide/messages/refactor/empty-comment.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct EmptyComment; impl Violation for EmptyComment { diff --git a/crates/ruff_linter/src/rules/pylint/rules/eq_without_hash.rs b/crates/ruff_linter/src/rules/pylint/rules/eq_without_hash.rs index 69401e854d7bff..4c63c8b2a39569 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/eq_without_hash.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/eq_without_hash.rs @@ -64,6 +64,7 @@ use crate::checkers::ast::Checker; /// - [Python documentation: `object.__hash__`](https://docs.python.org/3/reference/datamodel.html#object.__hash__) /// - [Python glossary: hashable](https://docs.python.org/3/glossary.html#term-hashable) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct EqWithoutHash; impl Violation for EqWithoutHash { diff --git a/crates/ruff_linter/src/rules/pylint/rules/global_at_module_level.rs b/crates/ruff_linter/src/rules/pylint/rules/global_at_module_level.rs index c92593740fc5b1..681bdc5a2134a5 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/global_at_module_level.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/global_at_module_level.rs @@ -15,6 +15,7 @@ use crate::checkers::ast::Checker; /// At the module level, all names are global by default, so the `global` /// keyword is redundant. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct GlobalAtModuleLevel; impl Violation for GlobalAtModuleLevel { diff --git a/crates/ruff_linter/src/rules/pylint/rules/global_statement.rs b/crates/ruff_linter/src/rules/pylint/rules/global_statement.rs index dfa63cd427270d..345357ecdd1a74 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/global_statement.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/global_statement.rs @@ -40,6 +40,7 @@ use crate::checkers::ast::Checker; /// print(var) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.253")] pub(crate) struct GlobalStatement { name: String, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/global_variable_not_assigned.rs b/crates/ruff_linter/src/rules/pylint/rules/global_variable_not_assigned.rs index a5421541f3df93..26c6312e961947 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/global_variable_not_assigned.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/global_variable_not_assigned.rs @@ -40,6 +40,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: The `global` statement](https://docs.python.org/3/reference/simple_stmts.html#the-global-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.174")] pub(crate) struct GlobalVariableNotAssigned { name: String, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/if_stmt_min_max.rs b/crates/ruff_linter/src/rules/pylint/rules/if_stmt_min_max.rs index 4fc2bf484e75ee..247f1495df6ab1 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/if_stmt_min_max.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/if_stmt_min_max.rs @@ -46,6 +46,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// - [Python documentation: `max`](https://docs.python.org/3/library/functions.html#max) /// - [Python documentation: `min`](https://docs.python.org/3/library/functions.html#min) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.6.0")] pub(crate) struct IfStmtMinMax { min_max: MinMax, replacement: SourceCodeSnippet, diff --git a/crates/ruff_linter/src/rules/pylint/rules/import_outside_top_level.rs b/crates/ruff_linter/src/rules/pylint/rules/import_outside_top_level.rs index 57b7fd2b27c238..d2a953c8168a4d 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/import_outside_top_level.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/import_outside_top_level.rs @@ -53,6 +53,7 @@ use crate::{ /// [TID253]: https://docs.astral.sh/ruff/rules/banned-module-level-imports/ /// [PEP 8]: https://peps.python.org/pep-0008/#imports #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct ImportOutsideTopLevel; impl Violation for ImportOutsideTopLevel { diff --git a/crates/ruff_linter/src/rules/pylint/rules/import_private_name.rs b/crates/ruff_linter/src/rules/pylint/rules/import_private_name.rs index dab7b517931581..e60ad913fc33b8 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/import_private_name.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/import_private_name.rs @@ -50,6 +50,7 @@ use crate::package::PackageRoot; /// [PEP 8]: https://peps.python.org/pep-0008/ /// [PEP 420]: https://peps.python.org/pep-0420/ #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.14")] pub(crate) struct ImportPrivateName { name: String, module: Option, diff --git a/crates/ruff_linter/src/rules/pylint/rules/import_self.rs b/crates/ruff_linter/src/rules/pylint/rules/import_self.rs index 03ba035f3e3f95..d75511724636e1 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/import_self.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/import_self.rs @@ -23,6 +23,7 @@ use crate::{Violation, checkers::ast::Checker}; /// def foo(): ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.265")] pub(crate) struct ImportSelf { name: String, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/invalid_all_format.rs b/crates/ruff_linter/src/rules/pylint/rules/invalid_all_format.rs index e338280462d0bc..cd0cf491eb3f57 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/invalid_all_format.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/invalid_all_format.rs @@ -27,6 +27,7 @@ use crate::{Violation, checkers::ast::Checker}; /// ## References /// - [Python documentation: The `import` statement](https://docs.python.org/3/reference/simple_stmts.html#the-import-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.237")] pub(crate) struct InvalidAllFormat; impl Violation for InvalidAllFormat { diff --git a/crates/ruff_linter/src/rules/pylint/rules/invalid_all_object.rs b/crates/ruff_linter/src/rules/pylint/rules/invalid_all_object.rs index 99d83fe98b6e1b..047d652f804a49 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/invalid_all_object.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/invalid_all_object.rs @@ -27,6 +27,7 @@ use crate::{Violation, checkers::ast::Checker}; /// ## References /// - [Python documentation: The `import` statement](https://docs.python.org/3/reference/simple_stmts.html#the-import-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.237")] pub(crate) struct InvalidAllObject; impl Violation for InvalidAllObject { diff --git a/crates/ruff_linter/src/rules/pylint/rules/invalid_bool_return.rs b/crates/ruff_linter/src/rules/pylint/rules/invalid_bool_return.rs index cb099e399aa729..ab7970ddce9eaa 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/invalid_bool_return.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/invalid_bool_return.rs @@ -35,6 +35,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: The `__bool__` method](https://docs.python.org/3/reference/datamodel.html#object.__bool__) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.3.3")] pub(crate) struct InvalidBoolReturnType; impl Violation for InvalidBoolReturnType { diff --git a/crates/ruff_linter/src/rules/pylint/rules/invalid_bytes_return.rs b/crates/ruff_linter/src/rules/pylint/rules/invalid_bytes_return.rs index 9b5004e6bbafe3..ca2126ef2ac2e2 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/invalid_bytes_return.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/invalid_bytes_return.rs @@ -35,6 +35,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: The `__bytes__` method](https://docs.python.org/3/reference/datamodel.html#object.__bytes__) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.6.0")] pub(crate) struct InvalidBytesReturnType; impl Violation for InvalidBytesReturnType { diff --git a/crates/ruff_linter/src/rules/pylint/rules/invalid_envvar_default.rs b/crates/ruff_linter/src/rules/pylint/rules/invalid_envvar_default.rs index 37d899b653d76d..2d84a1b9dad0e1 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/invalid_envvar_default.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/invalid_envvar_default.rs @@ -33,6 +33,7 @@ use crate::checkers::ast::Checker; /// int(os.getenv("FOO", "1")) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.255")] pub(crate) struct InvalidEnvvarDefault; impl Violation for InvalidEnvvarDefault { diff --git a/crates/ruff_linter/src/rules/pylint/rules/invalid_envvar_value.rs b/crates/ruff_linter/src/rules/pylint/rules/invalid_envvar_value.rs index 9a986e41d7cbc2..3733211a3807c4 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/invalid_envvar_value.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/invalid_envvar_value.rs @@ -30,6 +30,7 @@ use crate::checkers::ast::Checker; /// os.getenv("1") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.255")] pub(crate) struct InvalidEnvvarValue; impl Violation for InvalidEnvvarValue { diff --git a/crates/ruff_linter/src/rules/pylint/rules/invalid_hash_return.rs b/crates/ruff_linter/src/rules/pylint/rules/invalid_hash_return.rs index a1ecd71cf1aead..4ed2f1a470a1e6 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/invalid_hash_return.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/invalid_hash_return.rs @@ -39,6 +39,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: The `__hash__` method](https://docs.python.org/3/reference/datamodel.html#object.__hash__) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.6.0")] pub(crate) struct InvalidHashReturnType; impl Violation for InvalidHashReturnType { diff --git a/crates/ruff_linter/src/rules/pylint/rules/invalid_index_return.rs b/crates/ruff_linter/src/rules/pylint/rules/invalid_index_return.rs index dca29deb761331..c863e1011d0894 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/invalid_index_return.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/invalid_index_return.rs @@ -41,6 +41,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: The `__index__` method](https://docs.python.org/3/reference/datamodel.html#object.__index__) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.6.0")] pub(crate) struct InvalidIndexReturnType; impl Violation for InvalidIndexReturnType { diff --git a/crates/ruff_linter/src/rules/pylint/rules/invalid_length_return.rs b/crates/ruff_linter/src/rules/pylint/rules/invalid_length_return.rs index 4e155a4aabbccb..cf659ffa2b4b95 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/invalid_length_return.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/invalid_length_return.rs @@ -40,6 +40,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: The `__len__` method](https://docs.python.org/3/reference/datamodel.html#object.__len__) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.6.0")] pub(crate) struct InvalidLengthReturnType; impl Violation for InvalidLengthReturnType { diff --git a/crates/ruff_linter/src/rules/pylint/rules/invalid_str_return.rs b/crates/ruff_linter/src/rules/pylint/rules/invalid_str_return.rs index 2484b2f74fcfa0..ecc67de40289fe 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/invalid_str_return.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/invalid_str_return.rs @@ -35,6 +35,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: The `__str__` method](https://docs.python.org/3/reference/datamodel.html#object.__str__) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.271")] pub(crate) struct InvalidStrReturnType; impl Violation for InvalidStrReturnType { diff --git a/crates/ruff_linter/src/rules/pylint/rules/invalid_string_characters.rs b/crates/ruff_linter/src/rules/pylint/rules/invalid_string_characters.rs index 6b621fe0cdc7a0..05688f67c7e079 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/invalid_string_characters.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/invalid_string_characters.rs @@ -26,6 +26,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// x = "\b" /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.257")] pub(crate) struct InvalidCharacterBackspace; impl Violation for InvalidCharacterBackspace { @@ -61,6 +62,7 @@ impl Violation for InvalidCharacterBackspace { /// x = "\x1a" /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.257")] pub(crate) struct InvalidCharacterSub; impl Violation for InvalidCharacterSub { @@ -96,6 +98,7 @@ impl Violation for InvalidCharacterSub { /// x = "\x1b" /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.257")] pub(crate) struct InvalidCharacterEsc; impl Violation for InvalidCharacterEsc { @@ -131,6 +134,7 @@ impl Violation for InvalidCharacterEsc { /// x = "\0" /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.257")] pub(crate) struct InvalidCharacterNul; impl Violation for InvalidCharacterNul { @@ -165,6 +169,7 @@ impl Violation for InvalidCharacterNul { /// x = "Dear Sir\u200b/\u200bMadam" # zero width space /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.257")] pub(crate) struct InvalidCharacterZeroWidthSpace; impl Violation for InvalidCharacterZeroWidthSpace { diff --git a/crates/ruff_linter/src/rules/pylint/rules/iteration_over_set.rs b/crates/ruff_linter/src/rules/pylint/rules/iteration_over_set.rs index 92d18485ae4258..0e99fc0f7c6be5 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/iteration_over_set.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/iteration_over_set.rs @@ -31,6 +31,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: `set`](https://docs.python.org/3/library/stdtypes.html#set) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.271")] pub(crate) struct IterationOverSet; impl AlwaysFixableViolation for IterationOverSet { diff --git a/crates/ruff_linter/src/rules/pylint/rules/len_test.rs b/crates/ruff_linter/src/rules/pylint/rules/len_test.rs index 1a664eadda12c6..e64bcd12e5f1a6 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/len_test.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/len_test.rs @@ -59,6 +59,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// [PEP 8: Programming Recommendations](https://peps.python.org/pep-0008/#programming-recommendations) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct LenTest { expression: SourceCodeSnippet, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/literal_membership.rs b/crates/ruff_linter/src/rules/pylint/rules/literal_membership.rs index f8a2d91752b88d..b11870aa63fa64 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/literal_membership.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/literal_membership.rs @@ -34,6 +34,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [What’s New In Python 3.2](https://docs.python.org/3/whatsnew/3.2.html#optimizations) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.1")] pub(crate) struct LiteralMembership; impl AlwaysFixableViolation for LiteralMembership { diff --git a/crates/ruff_linter/src/rules/pylint/rules/load_before_global_declaration.rs b/crates/ruff_linter/src/rules/pylint/rules/load_before_global_declaration.rs index 5d93d51e50a5dd..575239ec120ea4 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/load_before_global_declaration.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/load_before_global_declaration.rs @@ -37,6 +37,7 @@ use crate::Violation; /// ## References /// - [Python documentation: The `global` statement](https://docs.python.org/3/reference/simple_stmts.html#the-global-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.174")] pub(crate) struct LoadBeforeGlobalDeclaration { pub(crate) name: String, pub(crate) row: SourceRow, diff --git a/crates/ruff_linter/src/rules/pylint/rules/logging.rs b/crates/ruff_linter/src/rules/pylint/rules/logging.rs index d8a13cfdf3c01e..b126b85f77973d 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/logging.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/logging.rs @@ -37,6 +37,7 @@ use crate::rules::pyflakes::cformat::CFormatSummary; /// raise /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.252")] pub(crate) struct LoggingTooFewArgs; impl Violation for LoggingTooFewArgs { @@ -74,6 +75,7 @@ impl Violation for LoggingTooFewArgs { /// raise /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.252")] pub(crate) struct LoggingTooManyArgs; impl Violation for LoggingTooManyArgs { diff --git a/crates/ruff_linter/src/rules/pylint/rules/magic_value_comparison.rs b/crates/ruff_linter/src/rules/pylint/rules/magic_value_comparison.rs index a469e7b40c064d..c3d6c2fe5e5bc3 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/magic_value_comparison.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/magic_value_comparison.rs @@ -46,6 +46,7 @@ use crate::rules::pylint::settings::ConstantType; /// /// [PEP 8]: https://peps.python.org/pep-0008/#constants #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.221")] pub(crate) struct MagicValueComparison { value: String, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/manual_import_from.rs b/crates/ruff_linter/src/rules/pylint/rules/manual_import_from.rs index 8de9c13f9e6d04..c0aab3657b2a30 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/manual_import_from.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/manual_import_from.rs @@ -27,6 +27,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: Submodules](https://docs.python.org/3/reference/import.html#submodules) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.155")] pub(crate) struct ManualFromImport { module: String, name: String, diff --git a/crates/ruff_linter/src/rules/pylint/rules/misplaced_bare_raise.rs b/crates/ruff_linter/src/rules/pylint/rules/misplaced_bare_raise.rs index 3856d2e649b3f7..98777b218caa0e 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/misplaced_bare_raise.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/misplaced_bare_raise.rs @@ -41,6 +41,7 @@ use crate::rules::pylint::helpers::in_dunder_method; /// raise ValueError("`obj` cannot be `None`") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct MisplacedBareRaise; impl Violation for MisplacedBareRaise { diff --git a/crates/ruff_linter/src/rules/pylint/rules/missing_maxsplit_arg.rs b/crates/ruff_linter/src/rules/pylint/rules/missing_maxsplit_arg.rs index e047e9b0194e21..7843f8f92507cd 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/missing_maxsplit_arg.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/missing_maxsplit_arg.rs @@ -41,6 +41,7 @@ use crate::{AlwaysFixableViolation, Applicability, Edit, Fix}; /// This rule's fix is marked as unsafe for `split()`/`rsplit()` calls that contain `*args` or `**kwargs` arguments, as /// adding a `maxsplit` argument to such a call may lead to duplicated arguments. #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.11.12")] pub(crate) struct MissingMaxsplitArg { actual_split_type: String, suggested_split_type: String, diff --git a/crates/ruff_linter/src/rules/pylint/rules/modified_iterating_set.rs b/crates/ruff_linter/src/rules/pylint/rules/modified_iterating_set.rs index 6d99e420697f02..b01ad881d83858 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/modified_iterating_set.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/modified_iterating_set.rs @@ -46,6 +46,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: `set`](https://docs.python.org/3/library/stdtypes.html#set) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.3.5")] pub(crate) struct ModifiedIteratingSet { name: Name, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/named_expr_without_context.rs b/crates/ruff_linter/src/rules/pylint/rules/named_expr_without_context.rs index 5b306bd547a398..3e45e26a496b5e 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/named_expr_without_context.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/named_expr_without_context.rs @@ -25,6 +25,7 @@ use crate::checkers::ast::Checker; /// a = 42 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.270")] pub(crate) struct NamedExprWithoutContext; impl Violation for NamedExprWithoutContext { diff --git a/crates/ruff_linter/src/rules/pylint/rules/nan_comparison.rs b/crates/ruff_linter/src/rules/pylint/rules/nan_comparison.rs index 3ff711e0fd24b1..d387f65c0622e4 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/nan_comparison.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/nan_comparison.rs @@ -33,6 +33,7 @@ use crate::linter::float::as_nan_float_string_literal; /// pass /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct NanComparison { nan: Nan, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/nested_min_max.rs b/crates/ruff_linter/src/rules/pylint/rules/nested_min_max.rs index 8b50510a879be5..34322705ee6960 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/nested_min_max.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/nested_min_max.rs @@ -75,6 +75,7 @@ pub(crate) enum MinMax { /// - [Python documentation: `min`](https://docs.python.org/3/library/functions.html#min) /// - [Python documentation: `max`](https://docs.python.org/3/library/functions.html#max) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.266")] pub(crate) struct NestedMinMax { func: MinMax, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/no_method_decorator.rs b/crates/ruff_linter/src/rules/pylint/rules/no_method_decorator.rs index 99016e24c26df9..334cd47bc8c5a2 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/no_method_decorator.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/no_method_decorator.rs @@ -33,6 +33,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// def bar(cls): ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.7")] pub(crate) struct NoClassmethodDecorator; impl AlwaysFixableViolation for NoClassmethodDecorator { @@ -69,6 +70,7 @@ impl AlwaysFixableViolation for NoClassmethodDecorator { /// def bar(arg1, arg2): ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.7")] pub(crate) struct NoStaticmethodDecorator; impl AlwaysFixableViolation for NoStaticmethodDecorator { diff --git a/crates/ruff_linter/src/rules/pylint/rules/no_self_use.rs b/crates/ruff_linter/src/rules/pylint/rules/no_self_use.rs index c46a2680054d41..fd6e24528cec8e 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/no_self_use.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/no_self_use.rs @@ -39,6 +39,7 @@ use crate::rules::flake8_unused_arguments::rules::is_not_implemented_stub_with_v /// print("Greetings friend!") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.286")] pub(crate) struct NoSelfUse { method_name: String, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/non_ascii_module_import.rs b/crates/ruff_linter/src/rules/pylint/rules/non_ascii_module_import.rs index 75046c8ffec3c0..be493bb7debbfe 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/non_ascii_module_import.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/non_ascii_module_import.rs @@ -30,6 +30,7 @@ use crate::checkers::ast::Checker; /// /// [PEP 672]: https://peps.python.org/pep-0672/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct NonAsciiImportName { name: String, kind: Kind, diff --git a/crates/ruff_linter/src/rules/pylint/rules/non_ascii_name.rs b/crates/ruff_linter/src/rules/pylint/rules/non_ascii_name.rs index 6d66ac23450943..9be3a4e377c2a3 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/non_ascii_name.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/non_ascii_name.rs @@ -26,6 +26,7 @@ use crate::checkers::ast::Checker; /// /// [PEP 672]: https://peps.python.org/pep-0672/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct NonAsciiName { name: String, kind: Kind, diff --git a/crates/ruff_linter/src/rules/pylint/rules/non_augmented_assignment.rs b/crates/ruff_linter/src/rules/pylint/rules/non_augmented_assignment.rs index 1562783af2d076..7423c2dc767daa 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/non_augmented_assignment.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/non_augmented_assignment.rs @@ -69,6 +69,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// assert (foo, bar) == ([1, 2], [1, 2]) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.3.7")] pub(crate) struct NonAugmentedAssignment { operator: AugmentedOperator, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/non_slot_assignment.rs b/crates/ruff_linter/src/rules/pylint/rules/non_slot_assignment.rs index 3c331c47ad1e69..42964f1efa681d 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/non_slot_assignment.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/non_slot_assignment.rs @@ -47,6 +47,7 @@ use crate::checkers::ast::Checker; /// pass /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.1.15")] pub(crate) struct NonSlotAssignment { name: String, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/nonlocal_and_global.rs b/crates/ruff_linter/src/rules/pylint/rules/nonlocal_and_global.rs index bb8b10a2eaaa81..fd8d54441a5fa7 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/nonlocal_and_global.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/nonlocal_and_global.rs @@ -41,6 +41,7 @@ use crate::checkers::ast::Checker; /// - [Python documentation: The `global` statement](https://docs.python.org/3/reference/simple_stmts.html#the-global-statement) /// - [Python documentation: The `nonlocal` statement](https://docs.python.org/3/reference/simple_stmts.html#nonlocal) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct NonlocalAndGlobal { pub(crate) name: String, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/nonlocal_without_binding.rs b/crates/ruff_linter/src/rules/pylint/rules/nonlocal_without_binding.rs index ff2bd1a2ab0de5..90f5e0dde514c1 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/nonlocal_without_binding.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/nonlocal_without_binding.rs @@ -34,6 +34,7 @@ use crate::checkers::ast::Checker; /// - [Python documentation: The `nonlocal` statement](https://docs.python.org/3/reference/simple_stmts.html#nonlocal) /// - [PEP 3104 – Access to Names in Outer Scopes](https://peps.python.org/pep-3104/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.174")] pub(crate) struct NonlocalWithoutBinding { pub(crate) name: String, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/potential_index_error.rs b/crates/ruff_linter/src/rules/pylint/rules/potential_index_error.rs index 4a3f29e0904acc..2a67e6a83b8fb2 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/potential_index_error.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/potential_index_error.rs @@ -19,6 +19,7 @@ use crate::checkers::ast::Checker; /// print([0, 1, 2][3]) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct PotentialIndexError; impl Violation for PotentialIndexError { diff --git a/crates/ruff_linter/src/rules/pylint/rules/property_with_parameters.rs b/crates/ruff_linter/src/rules/pylint/rules/property_with_parameters.rs index a0c2c9db75738a..9c77508943f1ed 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/property_with_parameters.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/property_with_parameters.rs @@ -35,6 +35,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `property`](https://docs.python.org/3/library/functions.html#property) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.153")] pub(crate) struct PropertyWithParameters; impl Violation for PropertyWithParameters { diff --git a/crates/ruff_linter/src/rules/pylint/rules/redeclared_assigned_name.rs b/crates/ruff_linter/src/rules/pylint/rules/redeclared_assigned_name.rs index b85a58b1da23a0..aeac5463d3ecae 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/redeclared_assigned_name.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/redeclared_assigned_name.rs @@ -28,6 +28,7 @@ use crate::checkers::ast::Checker; /// print(a) # 3 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct RedeclaredAssignedName { name: String, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/redefined_argument_from_local.rs b/crates/ruff_linter/src/rules/pylint/rules/redefined_argument_from_local.rs index 856447d810545e..67799df8168b1f 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/redefined_argument_from_local.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/redefined_argument_from_local.rs @@ -33,6 +33,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Pylint documentation](https://pylint.readthedocs.io/en/latest/user_guide/messages/refactor/redefined-argument-from-local.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct RedefinedArgumentFromLocal { pub(crate) name: String, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/redefined_loop_name.rs b/crates/ruff_linter/src/rules/pylint/rules/redefined_loop_name.rs index bbdf17e8e73650..3abd6753168645 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/redefined_loop_name.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/redefined_loop_name.rs @@ -49,6 +49,7 @@ use crate::checkers::ast::Checker; /// print(f.readline()) # prints a line from path2 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.252")] pub(crate) struct RedefinedLoopName { name: String, outer_kind: OuterBindingKind, diff --git a/crates/ruff_linter/src/rules/pylint/rules/redefined_slots_in_subclass.rs b/crates/ruff_linter/src/rules/pylint/rules/redefined_slots_in_subclass.rs index 43b4b5eaa3770c..21ccdc83dae863 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/redefined_slots_in_subclass.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/redefined_slots_in_subclass.rs @@ -38,6 +38,7 @@ use crate::checkers::ast::Checker; /// __slots__ = "d" /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.9.3")] pub(crate) struct RedefinedSlotsInSubclass { base: String, slot_name: String, diff --git a/crates/ruff_linter/src/rules/pylint/rules/repeated_equality_comparison.rs b/crates/ruff_linter/src/rules/pylint/rules/repeated_equality_comparison.rs index c9c0c00e1c962e..441ea068c6465f 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/repeated_equality_comparison.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/repeated_equality_comparison.rs @@ -53,6 +53,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// - [Python documentation: Membership test operations](https://docs.python.org/3/reference/expressions.html#membership-test-operations) /// - [Python documentation: `set`](https://docs.python.org/3/library/stdtypes.html#set) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.279")] pub(crate) struct RepeatedEqualityComparison { expression: SourceCodeSnippet, all_hashable: bool, diff --git a/crates/ruff_linter/src/rules/pylint/rules/repeated_isinstance_calls.rs b/crates/ruff_linter/src/rules/pylint/rules/repeated_isinstance_calls.rs index 9c71a3246956df..093c3fa8d3d436 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/repeated_isinstance_calls.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/repeated_isinstance_calls.rs @@ -49,6 +49,7 @@ use crate::fix::snippet::SourceCodeSnippet; /// /// [SIM101]: https://docs.astral.sh/ruff/rules/duplicate-isinstance-call/ #[derive(ViolationMetadata)] +#[violation_metadata(removed_since = "0.5.0")] pub(crate) struct RepeatedIsinstanceCalls { expression: SourceCodeSnippet, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/repeated_keyword_argument.rs b/crates/ruff_linter/src/rules/pylint/rules/repeated_keyword_argument.rs index b2033a5e8f76a5..ab2db3f95d4b4f 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/repeated_keyword_argument.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/repeated_keyword_argument.rs @@ -23,6 +23,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: Argument](https://docs.python.org/3/glossary.html#term-argument) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct RepeatedKeywordArgument { duplicate_keyword: String, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/return_in_init.rs b/crates/ruff_linter/src/rules/pylint/rules/return_in_init.rs index a80913635c4d3c..b27ee93b597b6b 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/return_in_init.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/return_in_init.rs @@ -35,6 +35,7 @@ use crate::rules::pylint::helpers::in_dunder_method; /// ## References /// - [CodeQL: `py-explicit-return-in-init`](https://codeql.github.com/codeql-query-help/python/py-explicit-return-in-init/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.248")] pub(crate) struct ReturnInInit; impl Violation for ReturnInInit { diff --git a/crates/ruff_linter/src/rules/pylint/rules/self_assigning_variable.rs b/crates/ruff_linter/src/rules/pylint/rules/self_assigning_variable.rs index 2d9d194c6e1e0d..4c10078f8aaed2 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/self_assigning_variable.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/self_assigning_variable.rs @@ -24,6 +24,7 @@ use crate::checkers::ast::Checker; /// country = "Poland" /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.281")] pub(crate) struct SelfAssigningVariable { name: String, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/self_or_cls_assignment.rs b/crates/ruff_linter/src/rules/pylint/rules/self_or_cls_assignment.rs index d6611acd21ff0e..e5c90407e1f586 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/self_or_cls_assignment.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/self_or_cls_assignment.rs @@ -46,6 +46,7 @@ use crate::checkers::ast::Checker; /// return supercls /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.6.0")] pub(crate) struct SelfOrClsAssignment { method_type: MethodType, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/shallow_copy_environ.rs b/crates/ruff_linter/src/rules/pylint/rules/shallow_copy_environ.rs index 2cfe984f862377..94846decb2668e 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/shallow_copy_environ.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/shallow_copy_environ.rs @@ -43,6 +43,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// /// [BPO 15373]: https://bugs.python.org/issue15373 #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct ShallowCopyEnviron; impl AlwaysFixableViolation for ShallowCopyEnviron { diff --git a/crates/ruff_linter/src/rules/pylint/rules/single_string_slots.rs b/crates/ruff_linter/src/rules/pylint/rules/single_string_slots.rs index 3cf41a00db4f67..0c6f94a483aa93 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/single_string_slots.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/single_string_slots.rs @@ -48,6 +48,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `__slots__`](https://docs.python.org/3/reference/datamodel.html#slots) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.276")] pub(crate) struct SingleStringSlots; impl Violation for SingleStringSlots { diff --git a/crates/ruff_linter/src/rules/pylint/rules/singledispatch_method.rs b/crates/ruff_linter/src/rules/pylint/rules/singledispatch_method.rs index 91d280fb733585..9096a22dc8cd81 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/singledispatch_method.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/singledispatch_method.rs @@ -43,6 +43,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// This rule's fix is marked as unsafe, as migrating from `@singledispatch` to /// `@singledispatchmethod` may change the behavior of the code. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.6.0")] pub(crate) struct SingledispatchMethod; impl Violation for SingledispatchMethod { diff --git a/crates/ruff_linter/src/rules/pylint/rules/singledispatchmethod_function.rs b/crates/ruff_linter/src/rules/pylint/rules/singledispatchmethod_function.rs index eb2e82c25853c4..e658b19a0d61ba 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/singledispatchmethod_function.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/singledispatchmethod_function.rs @@ -41,6 +41,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// This rule's fix is marked as unsafe, as migrating from `@singledispatchmethod` to /// `@singledispatch` may change the behavior of the code. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.6.0")] pub(crate) struct SingledispatchmethodFunction; impl Violation for SingledispatchmethodFunction { diff --git a/crates/ruff_linter/src/rules/pylint/rules/subprocess_popen_preexec_fn.rs b/crates/ruff_linter/src/rules/pylint/rules/subprocess_popen_preexec_fn.rs index b07d0bef0df98e..b27f5925060345 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/subprocess_popen_preexec_fn.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/subprocess_popen_preexec_fn.rs @@ -40,6 +40,7 @@ use crate::checkers::ast::Checker; /// /// [targeted for deprecation]: https://github.com/python/cpython/issues/82616 #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.281")] pub(crate) struct SubprocessPopenPreexecFn; impl Violation for SubprocessPopenPreexecFn { diff --git a/crates/ruff_linter/src/rules/pylint/rules/subprocess_run_without_check.rs b/crates/ruff_linter/src/rules/pylint/rules/subprocess_run_without_check.rs index 9d4848ff67eb01..0ed569eef8c735 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/subprocess_run_without_check.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/subprocess_run_without_check.rs @@ -46,6 +46,7 @@ use crate::{AlwaysFixableViolation, Applicability, Fix}; /// ## References /// - [Python documentation: `subprocess.run`](https://docs.python.org/3/library/subprocess.html#subprocess.run) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.285")] pub(crate) struct SubprocessRunWithoutCheck; impl AlwaysFixableViolation for SubprocessRunWithoutCheck { diff --git a/crates/ruff_linter/src/rules/pylint/rules/super_without_brackets.rs b/crates/ruff_linter/src/rules/pylint/rules/super_without_brackets.rs index 510fc836c53ce6..5791ee77ffc411 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/super_without_brackets.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/super_without_brackets.rs @@ -47,6 +47,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// return f"{original_speak} But as a dog, it barks!" /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct SuperWithoutBrackets; impl AlwaysFixableViolation for SuperWithoutBrackets { diff --git a/crates/ruff_linter/src/rules/pylint/rules/sys_exit_alias.rs b/crates/ruff_linter/src/rules/pylint/rules/sys_exit_alias.rs index c0a1a0445a6def..1fb4bd4792bf7b 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/sys_exit_alias.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/sys_exit_alias.rs @@ -50,6 +50,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: Constants added by the `site` module](https://docs.python.org/3/library/constants.html#constants-added-by-the-site-module) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.156")] pub(crate) struct SysExitAlias { name: String, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/too_many_arguments.rs b/crates/ruff_linter/src/rules/pylint/rules/too_many_arguments.rs index 7fb946ea8334b8..9242ad8342ee7f 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/too_many_arguments.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/too_many_arguments.rs @@ -44,6 +44,7 @@ use crate::checkers::ast::Checker; /// ## Options /// - `lint.pylint.max-args` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.238")] pub(crate) struct TooManyArguments { c_args: usize, max_args: usize, diff --git a/crates/ruff_linter/src/rules/pylint/rules/too_many_boolean_expressions.rs b/crates/ruff_linter/src/rules/pylint/rules/too_many_boolean_expressions.rs index 76bf947411b258..61f0dfa4423e7b 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/too_many_boolean_expressions.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/too_many_boolean_expressions.rs @@ -26,6 +26,7 @@ use crate::checkers::ast::Checker; /// ## Options /// - `lint.pylint.max-bool-expr` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.1")] pub(crate) struct TooManyBooleanExpressions { expressions: usize, max_expressions: usize, diff --git a/crates/ruff_linter/src/rules/pylint/rules/too_many_branches.rs b/crates/ruff_linter/src/rules/pylint/rules/too_many_branches.rs index d5c82b95eb8aa3..fd9d90cd38d8ed 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/too_many_branches.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/too_many_branches.rs @@ -145,6 +145,7 @@ use crate::checkers::ast::Checker; /// ## Options /// - `lint.pylint.max-branches` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.242")] pub(crate) struct TooManyBranches { branches: usize, max_branches: usize, diff --git a/crates/ruff_linter/src/rules/pylint/rules/too_many_locals.rs b/crates/ruff_linter/src/rules/pylint/rules/too_many_locals.rs index 56ac5cf986b4cd..0914278ae9c670 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/too_many_locals.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/too_many_locals.rs @@ -20,6 +20,7 @@ use crate::checkers::ast::Checker; /// ## Options /// - `lint.pylint.max-locals` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.9")] pub(crate) struct TooManyLocals { current_amount: usize, max_amount: usize, diff --git a/crates/ruff_linter/src/rules/pylint/rules/too_many_nested_blocks.rs b/crates/ruff_linter/src/rules/pylint/rules/too_many_nested_blocks.rs index 0e4ee0dea3ed0a..b07828832dd2cc 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/too_many_nested_blocks.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/too_many_nested_blocks.rs @@ -19,6 +19,7 @@ use crate::checkers::ast::Checker; /// ## Options /// - `lint.pylint.max-nested-blocks` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.15")] pub(crate) struct TooManyNestedBlocks { nested_blocks: usize, max_nested_blocks: usize, diff --git a/crates/ruff_linter/src/rules/pylint/rules/too_many_positional_arguments.rs b/crates/ruff_linter/src/rules/pylint/rules/too_many_positional_arguments.rs index 2e0e02908c53a2..f9f979658c2b95 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/too_many_positional_arguments.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/too_many_positional_arguments.rs @@ -42,6 +42,7 @@ use crate::checkers::ast::Checker; /// ## Options /// - `lint.pylint.max-positional-args` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.7")] pub(crate) struct TooManyPositionalArguments { c_pos: usize, max_pos: usize, diff --git a/crates/ruff_linter/src/rules/pylint/rules/too_many_public_methods.rs b/crates/ruff_linter/src/rules/pylint/rules/too_many_public_methods.rs index 53decdc547ccbf..bc1802926b127a 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/too_many_public_methods.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/too_many_public_methods.rs @@ -83,6 +83,7 @@ use crate::checkers::ast::Checker; /// ## Options /// - `lint.pylint.max-public-methods` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.290")] pub(crate) struct TooManyPublicMethods { methods: usize, max_methods: usize, diff --git a/crates/ruff_linter/src/rules/pylint/rules/too_many_return_statements.rs b/crates/ruff_linter/src/rules/pylint/rules/too_many_return_statements.rs index f4fb169653137b..f414f6931bb269 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/too_many_return_statements.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/too_many_return_statements.rs @@ -52,6 +52,7 @@ use crate::{Violation, checkers::ast::Checker}; /// ## Options /// - `lint.pylint.max-returns` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.242")] pub(crate) struct TooManyReturnStatements { returns: usize, max_returns: usize, diff --git a/crates/ruff_linter/src/rules/pylint/rules/too_many_statements.rs b/crates/ruff_linter/src/rules/pylint/rules/too_many_statements.rs index 7033a71d83fc8a..7be3f6ac0c4add 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/too_many_statements.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/too_many_statements.rs @@ -48,6 +48,7 @@ use crate::checkers::ast::Checker; /// ## Options /// - `lint.pylint.max-statements` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.240")] pub(crate) struct TooManyStatements { statements: usize, max_statements: usize, diff --git a/crates/ruff_linter/src/rules/pylint/rules/type_bivariance.rs b/crates/ruff_linter/src/rules/pylint/rules/type_bivariance.rs index b4cd0a11f4c690..05e109907b39e0 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/type_bivariance.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/type_bivariance.rs @@ -54,6 +54,7 @@ use crate::rules::pylint::helpers::type_param_name; /// - [PEP 483 – The Theory of Type Hints: Covariance and Contravariance](https://peps.python.org/pep-0483/#covariance-and-contravariance) /// - [PEP 484 – Type Hints: Covariance and contravariance](https://peps.python.org/pep-0484/#covariance-and-contravariance) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.278")] pub(crate) struct TypeBivariance { kind: VarKind, param_name: Option, diff --git a/crates/ruff_linter/src/rules/pylint/rules/type_name_incorrect_variance.rs b/crates/ruff_linter/src/rules/pylint/rules/type_name_incorrect_variance.rs index f73b12fdadeb72..4d1591abaa06d2 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/type_name_incorrect_variance.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/type_name_incorrect_variance.rs @@ -43,6 +43,7 @@ use crate::rules::pylint::helpers::type_param_name; /// /// [PEP 484]: https://peps.python.org/pep-0484/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.278")] pub(crate) struct TypeNameIncorrectVariance { kind: VarKind, param_name: String, diff --git a/crates/ruff_linter/src/rules/pylint/rules/type_param_name_mismatch.rs b/crates/ruff_linter/src/rules/pylint/rules/type_param_name_mismatch.rs index 2d1b33bd89fa06..1a936c95d131d1 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/type_param_name_mismatch.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/type_param_name_mismatch.rs @@ -39,6 +39,7 @@ use crate::rules::pylint::helpers::type_param_name; /// /// [PEP 484]:https://peps.python.org/pep-0484/#generics #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.277")] pub(crate) struct TypeParamNameMismatch { kind: VarKind, var_name: String, diff --git a/crates/ruff_linter/src/rules/pylint/rules/unexpected_special_method_signature.rs b/crates/ruff_linter/src/rules/pylint/rules/unexpected_special_method_signature.rs index b6bc8c255c45a1..ea6ddb31c44a54 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/unexpected_special_method_signature.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/unexpected_special_method_signature.rs @@ -110,6 +110,7 @@ impl ExpectedParams { /// ## References /// - [Python documentation: Data model](https://docs.python.org/3/reference/datamodel.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.263")] pub(crate) struct UnexpectedSpecialMethodSignature { method_name: String, expected_params: ExpectedParams, diff --git a/crates/ruff_linter/src/rules/pylint/rules/unnecessary_dict_index_lookup.rs b/crates/ruff_linter/src/rules/pylint/rules/unnecessary_dict_index_lookup.rs index 9e1be524b24d25..f1082919587d6a 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/unnecessary_dict_index_lookup.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/unnecessary_dict_index_lookup.rs @@ -31,6 +31,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// print(fruit_count) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct UnnecessaryDictIndexLookup; impl AlwaysFixableViolation for UnnecessaryDictIndexLookup { diff --git a/crates/ruff_linter/src/rules/pylint/rules/unnecessary_direct_lambda_call.rs b/crates/ruff_linter/src/rules/pylint/rules/unnecessary_direct_lambda_call.rs index 17d0ab76632477..dd40fa11c5986c 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/unnecessary_direct_lambda_call.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/unnecessary_direct_lambda_call.rs @@ -26,6 +26,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: Lambdas](https://docs.python.org/3/reference/expressions.html#lambda) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.153")] pub(crate) struct UnnecessaryDirectLambdaCall; impl Violation for UnnecessaryDirectLambdaCall { diff --git a/crates/ruff_linter/src/rules/pylint/rules/unnecessary_dunder_call.rs b/crates/ruff_linter/src/rules/pylint/rules/unnecessary_dunder_call.rs index 62f69fad7bc69a..f47c6d4e222d78 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/unnecessary_dunder_call.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/unnecessary_dunder_call.rs @@ -64,6 +64,7 @@ use ruff_python_ast::PythonVersion; /// return x > 2 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.12")] pub(crate) struct UnnecessaryDunderCall { method: String, replacement: Option, diff --git a/crates/ruff_linter/src/rules/pylint/rules/unnecessary_lambda.rs b/crates/ruff_linter/src/rules/pylint/rules/unnecessary_lambda.rs index 783063ccda57b0..2d4fae9dc48b61 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/unnecessary_lambda.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/unnecessary_lambda.rs @@ -44,6 +44,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// name, as in: `foo(x=1, y=2)`. Since `func` does not define the arguments /// `x` and `y`, unlike the lambda, the call would raise a `TypeError`. #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.2")] pub(crate) struct UnnecessaryLambda; impl Violation for UnnecessaryLambda { diff --git a/crates/ruff_linter/src/rules/pylint/rules/unnecessary_list_index_lookup.rs b/crates/ruff_linter/src/rules/pylint/rules/unnecessary_list_index_lookup.rs index 991d25bac698a1..49481b1634884f 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/unnecessary_list_index_lookup.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/unnecessary_list_index_lookup.rs @@ -32,6 +32,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// print(letter) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct UnnecessaryListIndexLookup; impl AlwaysFixableViolation for UnnecessaryListIndexLookup { diff --git a/crates/ruff_linter/src/rules/pylint/rules/unreachable.rs b/crates/ruff_linter/src/rules/pylint/rules/unreachable.rs index b590573b4c8ad8..efd0a0db3af461 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/unreachable.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/unreachable.rs @@ -30,6 +30,7 @@ use crate::checkers::ast::Checker; /// return "reachable" /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.0.0")] pub(crate) struct UnreachableCode { name: String, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/unspecified_encoding.rs b/crates/ruff_linter/src/rules/pylint/rules/unspecified_encoding.rs index a730ffd5674dee..7d9cd12506807b 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/unspecified_encoding.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/unspecified_encoding.rs @@ -55,6 +55,7 @@ use crate::{AlwaysFixableViolation, Fix}; /// /// [PEP 597]: https://peps.python.org/pep-0597/ #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.1")] pub(crate) struct UnspecifiedEncoding { function_name: String, mode: ModeArgument, diff --git a/crates/ruff_linter/src/rules/pylint/rules/useless_else_on_loop.rs b/crates/ruff_linter/src/rules/pylint/rules/useless_else_on_loop.rs index 5dc74c156a891d..e1a1a205053195 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/useless_else_on_loop.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/useless_else_on_loop.rs @@ -47,6 +47,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `break` and `continue` Statements, and `else` Clauses on Loops](https://docs.python.org/3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.156")] pub(crate) struct UselessElseOnLoop; impl Violation for UselessElseOnLoop { diff --git a/crates/ruff_linter/src/rules/pylint/rules/useless_exception_statement.rs b/crates/ruff_linter/src/rules/pylint/rules/useless_exception_statement.rs index 4d7be33a71255b..46082976837314 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/useless_exception_statement.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/useless_exception_statement.rs @@ -34,6 +34,7 @@ use ruff_python_ast::PythonVersion; /// This rule's fix is marked as unsafe, as converting a useless exception /// statement to a `raise` statement will change the program's behavior. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct UselessExceptionStatement; impl Violation for UselessExceptionStatement { diff --git a/crates/ruff_linter/src/rules/pylint/rules/useless_import_alias.rs b/crates/ruff_linter/src/rules/pylint/rules/useless_import_alias.rs index d858fc3f765457..63f53fe8fb00d4 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/useless_import_alias.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/useless_import_alias.rs @@ -34,6 +34,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// import numpy /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.156")] pub(crate) struct UselessImportAlias { required_import_conflict: bool, } diff --git a/crates/ruff_linter/src/rules/pylint/rules/useless_return.rs b/crates/ruff_linter/src/rules/pylint/rules/useless_return.rs index c33acea2d4720c..003b32a0e73621 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/useless_return.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/useless_return.rs @@ -29,6 +29,7 @@ use crate::{AlwaysFixableViolation, Fix}; /// print(5) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.257")] pub(crate) struct UselessReturn; impl AlwaysFixableViolation for UselessReturn { diff --git a/crates/ruff_linter/src/rules/pylint/rules/useless_with_lock.rs b/crates/ruff_linter/src/rules/pylint/rules/useless_with_lock.rs index 77931841f0016e..a45f02cb13566a 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/useless_with_lock.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/useless_with_lock.rs @@ -48,6 +48,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `Lock Objects`](https://docs.python.org/3/library/threading.html#lock-objects) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct UselessWithLock; impl Violation for UselessWithLock { diff --git a/crates/ruff_linter/src/rules/pylint/rules/yield_from_in_async_function.rs b/crates/ruff_linter/src/rules/pylint/rules/yield_from_in_async_function.rs index fd9e2ee618728a..246870d5c02c95 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/yield_from_in_async_function.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/yield_from_in_async_function.rs @@ -24,6 +24,7 @@ use crate::Violation; /// yield number /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.271")] pub(crate) struct YieldFromInAsyncFunction; impl Violation for YieldFromInAsyncFunction { diff --git a/crates/ruff_linter/src/rules/pylint/rules/yield_in_init.rs b/crates/ruff_linter/src/rules/pylint/rules/yield_in_init.rs index 67236eed6bad9d..622129ef58cdd1 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/yield_in_init.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/yield_in_init.rs @@ -29,6 +29,7 @@ use crate::rules::pylint::helpers::in_dunder_method; /// ## References /// - [CodeQL: `py-init-method-is-generator`](https://codeql.github.com/codeql-query-help/python/py-init-method-is-generator/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.245")] pub(crate) struct YieldInInit; impl Violation for YieldInInit { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/convert_named_tuple_functional_to_class.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/convert_named_tuple_functional_to_class.rs index 0974d66bb7c198..46004e40240912 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/convert_named_tuple_functional_to_class.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/convert_named_tuple_functional_to_class.rs @@ -50,6 +50,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `typing.NamedTuple`](https://docs.python.org/3/library/typing.html#typing.NamedTuple) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.155")] pub(crate) struct ConvertNamedTupleFunctionalToClass { name: String, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/convert_typed_dict_functional_to_class.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/convert_typed_dict_functional_to_class.rs index 28b4b08a8e0f6c..af99187e6d32fd 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/convert_typed_dict_functional_to_class.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/convert_typed_dict_functional_to_class.rs @@ -61,6 +61,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// [Python keywords]: https://docs.python.org/3/reference/lexical_analysis.html#keywords /// [Dunder names]: https://docs.python.org/3/reference/lexical_analysis.html#reserved-classes-of-identifiers #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.155")] pub(crate) struct ConvertTypedDictFunctionalToClass { name: String, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/datetime_utc_alias.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/datetime_utc_alias.rs index b67f312699739c..c37281831f64ae 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/datetime_utc_alias.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/datetime_utc_alias.rs @@ -34,6 +34,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `datetime.UTC`](https://docs.python.org/3/library/datetime.html#datetime.UTC) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.192")] pub(crate) struct DatetimeTimezoneUTC; impl Violation for DatetimeTimezoneUTC { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_c_element_tree.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_c_element_tree.rs index e154084268389b..1ce34e2f153ae7 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_c_element_tree.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_c_element_tree.rs @@ -25,6 +25,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: `xml.etree.ElementTree`](https://docs.python.org/3/library/xml.etree.elementtree.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.199")] pub(crate) struct DeprecatedCElementTree; impl AlwaysFixableViolation for DeprecatedCElementTree { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_import.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_import.rs index 46d317d29298de..9b15ac0b5ba643 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_import.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_import.rs @@ -64,6 +64,7 @@ enum Deprecation { /// from collections.abc import Sequence /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.239")] pub(crate) struct DeprecatedImport { deprecation: Deprecation, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_mock_import.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_mock_import.rs index 654dcad96d3572..5c13bbd07fe5a5 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_mock_import.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_mock_import.rs @@ -49,6 +49,7 @@ pub(crate) enum MockReference { /// - [Python documentation: `unittest.mock`](https://docs.python.org/3/library/unittest.mock.html) /// - [PyPI: `mock`](https://pypi.org/project/mock/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.206")] pub(crate) struct DeprecatedMockImport { reference_type: MockReference, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_unittest_alias.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_unittest_alias.rs index 2a336e9b8c5b88..5804d543d4addd 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_unittest_alias.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/deprecated_unittest_alias.rs @@ -39,6 +39,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python 3.11 documentation: Deprecated aliases](https://docs.python.org/3.11/library/unittest.html#deprecated-aliases) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.155")] pub(crate) struct DeprecatedUnittestAlias { alias: String, target: String, diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/extraneous_parentheses.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/extraneous_parentheses.rs index c6ba676d8232c1..9fe0324c1c415f 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/extraneous_parentheses.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/extraneous_parentheses.rs @@ -25,6 +25,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// print("Hello, world") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.228")] pub(crate) struct ExtraneousParentheses; impl AlwaysFixableViolation for ExtraneousParentheses { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/f_strings.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/f_strings.rs index 46379c8ef0a6db..c21745c6520250 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/f_strings.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/f_strings.rs @@ -40,6 +40,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: f-strings](https://docs.python.org/3/reference/lexical_analysis.html#f-strings) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.224")] pub(crate) struct FString; impl Violation for FString { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/format_literals.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/format_literals.rs index 971a56ec1d10b4..c60a9efa14ea0f 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/format_literals.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/format_literals.rs @@ -47,6 +47,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [Python documentation: Format String Syntax](https://docs.python.org/3/library/string.html#format-string-syntax) /// - [Python documentation: `str.format`](https://docs.python.org/3/library/stdtypes.html#str.format) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.218")] pub(crate) struct FormatLiterals; impl Violation for FormatLiterals { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/lru_cache_with_maxsize_none.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/lru_cache_with_maxsize_none.rs index 9b1fd268019b43..1d66e806dba59c 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/lru_cache_with_maxsize_none.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/lru_cache_with_maxsize_none.rs @@ -41,6 +41,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: `@functools.cache`](https://docs.python.org/3/library/functools.html#functools.cache) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.225")] pub(crate) struct LRUCacheWithMaxsizeNone; impl AlwaysFixableViolation for LRUCacheWithMaxsizeNone { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/lru_cache_without_parameters.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/lru_cache_without_parameters.rs index 89416772198d66..27aaa84e31a1a6 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/lru_cache_without_parameters.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/lru_cache_without_parameters.rs @@ -39,6 +39,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// - [Python documentation: `@functools.lru_cache`](https://docs.python.org/3/library/functools.html#functools.lru_cache) /// - [Let lru_cache be used as a decorator with no arguments](https://github.com/python/cpython/issues/80953) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.155")] pub(crate) struct LRUCacheWithoutParameters; impl AlwaysFixableViolation for LRUCacheWithoutParameters { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/native_literals.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/native_literals.rs index 0f1a301f1958bc..c1b6d0d5404fb2 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/native_literals.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/native_literals.rs @@ -128,6 +128,7 @@ impl fmt::Display for LiteralType { /// - [Python documentation: `float`](https://docs.python.org/3/library/functions.html#float) /// - [Python documentation: `bool`](https://docs.python.org/3/library/functions.html#bool) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.193")] pub(crate) struct NativeLiterals { literal_type: LiteralType, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/non_pep646_unpack.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/non_pep646_unpack.rs index 79ab523ad3da1d..36487d79268221 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/non_pep646_unpack.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/non_pep646_unpack.rs @@ -36,6 +36,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// /// [PEP 646]: https://peps.python.org/pep-0646/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct NonPEP646Unpack; impl Violation for NonPEP646Unpack { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/open_alias.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/open_alias.rs index 4d74273a28e84f..563658fa66e3a0 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/open_alias.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/open_alias.rs @@ -30,6 +30,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `io.open`](https://docs.python.org/3/library/io.html#io.open) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.196")] pub(crate) struct OpenAlias; impl Violation for OpenAlias { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/os_error_alias.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/os_error_alias.rs index aeb01069f9c49b..a4486b93c22dcb 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/os_error_alias.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/os_error_alias.rs @@ -35,6 +35,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: `OSError`](https://docs.python.org/3/library/exceptions.html#OSError) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.206")] pub(crate) struct OSErrorAlias { name: Option, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/outdated_version_block.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/outdated_version_block.rs index 52e4cd9771ba03..dfa945fab1c7a9 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/outdated_version_block.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/outdated_version_block.rs @@ -52,6 +52,7 @@ use ruff_python_semantic::SemanticModel; /// ## References /// - [Python documentation: `sys.version_info`](https://docs.python.org/3/library/sys.html#sys.version_info) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.240")] pub(crate) struct OutdatedVersionBlock { reason: Reason, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/pep695/non_pep695_generic_class.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/pep695/non_pep695_generic_class.rs index 0d9f8ad2d66cd0..b0d273b7c412b5 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/pep695/non_pep695_generic_class.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/pep695/non_pep695_generic_class.rs @@ -86,6 +86,7 @@ use super::{ /// [UP049]: https://docs.astral.sh/ruff/rules/private-type-parameter/ /// [fail]: https://github.com/python/mypy/issues/18507 #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct NonPEP695GenericClass { name: String, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/pep695/non_pep695_generic_function.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/pep695/non_pep695_generic_function.rs index 93bd368f45f5b9..e59b3905ce61f3 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/pep695/non_pep695_generic_function.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/pep695/non_pep695_generic_function.rs @@ -78,6 +78,7 @@ use super::{DisplayTypeVars, TypeVarReferenceVisitor, check_type_vars, in_nested /// [UP049]: https://docs.astral.sh/ruff/rules/private-type-parameter/ /// [fail]: https://github.com/python/mypy/issues/18507 #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct NonPEP695GenericFunction { name: String, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/pep695/non_pep695_type_alias.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/pep695/non_pep695_type_alias.rs index 54390c998c0543..43e3ec8536bbbd 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/pep695/non_pep695_type_alias.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/pep695/non_pep695_type_alias.rs @@ -84,6 +84,7 @@ use super::{ /// [UP047]: https://docs.astral.sh/ruff/rules/non-pep695-generic-function/ /// [UP049]: https://docs.astral.sh/ruff/rules/private-type-parameter/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.283")] pub(crate) struct NonPEP695TypeAlias { name: String, type_alias_kind: TypeAliasKind, diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/pep695/private_type_parameter.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/pep695/private_type_parameter.rs index d581cc64dcad32..c5a20c83dcc0d6 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/pep695/private_type_parameter.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/pep695/private_type_parameter.rs @@ -66,6 +66,7 @@ use crate::{ /// [UP046]: https://docs.astral.sh/ruff/rules/non-pep695-generic-class /// [PYI018]: https://docs.astral.sh/ruff/rules/unused-private-type-var #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct PrivateTypeParameter { kind: ParamKind, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/printf_string_formatting.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/printf_string_formatting.rs index 1faffd5a716163..d6de04d3558215 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/printf_string_formatting.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/printf_string_formatting.rs @@ -75,6 +75,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [Python documentation: `printf`-style String Formatting](https://docs.python.org/3/library/stdtypes.html#old-string-formatting) /// - [Python documentation: `str.format`](https://docs.python.org/3/library/stdtypes.html#str.format) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.229")] pub(crate) struct PrintfStringFormatting; impl Violation for PrintfStringFormatting { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/quoted_annotation.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/quoted_annotation.rs index e641553f84ccaa..25a85e0a18df4b 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/quoted_annotation.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/quoted_annotation.rs @@ -87,6 +87,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// [TC008]: https://docs.astral.sh/ruff/rules/quoted-type-alias/ /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.242")] pub(crate) struct QuotedAnnotation; impl AlwaysFixableViolation for QuotedAnnotation { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/redundant_open_modes.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/redundant_open_modes.rs index 13deff49417bc4..cf87abc03990b0 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/redundant_open_modes.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/redundant_open_modes.rs @@ -30,6 +30,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: `open`](https://docs.python.org/3/library/functions.html#open) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.155")] pub(crate) struct RedundantOpenModes { replacement: String, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/replace_stdout_stderr.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/replace_stdout_stderr.rs index 17de6c99fa3b31..7c5dd2f027c6e7 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/replace_stdout_stderr.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/replace_stdout_stderr.rs @@ -44,6 +44,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [Python 3.7 release notes](https://docs.python.org/3/whatsnew/3.7.html#subprocess) /// - [Python documentation: `subprocess.run`](https://docs.python.org/3/library/subprocess.html#subprocess.run) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.199")] pub(crate) struct ReplaceStdoutStderr; impl Violation for ReplaceStdoutStderr { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/replace_str_enum.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/replace_str_enum.rs index 7bdcdad798977c..1adab1d52d8602 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/replace_str_enum.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/replace_str_enum.rs @@ -77,6 +77,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// /// [breaking change]: https://blog.pecar.me/python-enum #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.3.6")] pub(crate) struct ReplaceStrEnum { name: String, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/replace_universal_newlines.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/replace_universal_newlines.rs index 9769dde2440915..97000fa75fc14e 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/replace_universal_newlines.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/replace_universal_newlines.rs @@ -35,6 +35,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// - [Python 3.7 release notes](https://docs.python.org/3/whatsnew/3.7.html#subprocess) /// - [Python documentation: `subprocess.run`](https://docs.python.org/3/library/subprocess.html#subprocess.run) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.196")] pub(crate) struct ReplaceUniversalNewlines; impl AlwaysFixableViolation for ReplaceUniversalNewlines { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/super_call_with_parameters.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/super_call_with_parameters.rs index 9f7f31a2f8a6c9..cc7cbef8e03f5e 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/super_call_with_parameters.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/super_call_with_parameters.rs @@ -57,6 +57,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [Python documentation: `super`](https://docs.python.org/3/library/functions.html#super) /// - [super/MRO, Python's most misunderstood feature.](https://www.youtube.com/watch?v=X1PQ7zzltz4) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.155")] pub(crate) struct SuperCallWithParameters; impl Violation for SuperCallWithParameters { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/timeout_error_alias.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/timeout_error_alias.rs index eadfdf8eb8c609..85ca344d9d8635 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/timeout_error_alias.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/timeout_error_alias.rs @@ -40,6 +40,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: `TimeoutError`](https://docs.python.org/3/library/exceptions.html#TimeoutError) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct TimeoutErrorAlias { name: Option, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/type_of_primitive.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/type_of_primitive.rs index 251cd37dbc62c9..08acc9850d0891 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/type_of_primitive.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/type_of_primitive.rs @@ -30,6 +30,7 @@ use crate::rules::pyupgrade::types::Primitive; /// - [Python documentation: `type()`](https://docs.python.org/3/library/functions.html#type) /// - [Python documentation: Built-in types](https://docs.python.org/3/library/stdtypes.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.155")] pub(crate) struct TypeOfPrimitive { primitive: Primitive, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/typing_text_str_alias.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/typing_text_str_alias.rs index 2310880eedd9af..4e69c888b60501 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/typing_text_str_alias.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/typing_text_str_alias.rs @@ -34,6 +34,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `typing.Text`](https://docs.python.org/3/library/typing.html#typing.Text) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.195")] pub(crate) struct TypingTextStrAlias { module: TypingModule, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/unicode_kind_prefix.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/unicode_kind_prefix.rs index 7d62237e1f0d00..8e162fea30b1eb 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/unicode_kind_prefix.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/unicode_kind_prefix.rs @@ -25,6 +25,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: Unicode HOWTO](https://docs.python.org/3/howto/unicode.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.201")] pub(crate) struct UnicodeKindPrefix; impl AlwaysFixableViolation for UnicodeKindPrefix { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_builtin_import.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_builtin_import.rs index c2675200e039f3..41e73a309628ae 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_builtin_import.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_builtin_import.rs @@ -46,6 +46,7 @@ use crate::{AlwaysFixableViolation, Fix}; /// ## References /// - [Python documentation: The Python Standard Library](https://docs.python.org/3/library/index.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.211")] pub(crate) struct UnnecessaryBuiltinImport { pub names: Vec, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_class_parentheses.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_class_parentheses.rs index 10649d493ea4e9..d2459b84112d72 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_class_parentheses.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_class_parentheses.rs @@ -25,6 +25,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.273")] pub(crate) struct UnnecessaryClassParentheses; impl AlwaysFixableViolation for UnnecessaryClassParentheses { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_coding_comment.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_coding_comment.rs index e9d7b90777df6f..e2e8f10f609ef8 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_coding_comment.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_coding_comment.rs @@ -32,6 +32,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// /// [PEP 3120]: https://peps.python.org/pep-3120/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.155")] pub(crate) struct UTF8EncodingDeclaration; impl AlwaysFixableViolation for UTF8EncodingDeclaration { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_default_type_args.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_default_type_args.rs index e5d739d5a642ee..c61cee5cb861b4 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_default_type_args.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_default_type_args.rs @@ -63,6 +63,7 @@ use crate::{AlwaysFixableViolation, Applicability, Edit, Fix}; /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct UnnecessaryDefaultTypeArgs; impl AlwaysFixableViolation for UnnecessaryDefaultTypeArgs { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_encode_utf8.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_encode_utf8.rs index 7eea6a4613898a..12ca46ed4b3516 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_encode_utf8.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_encode_utf8.rs @@ -30,6 +30,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: `str.encode`](https://docs.python.org/3/library/stdtypes.html#str.encode) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.155")] pub(crate) struct UnnecessaryEncodeUTF8 { reason: Reason, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_future_import.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_future_import.rs index 62eea80f2b5362..8b5bd03bef14a1 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_future_import.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_future_import.rs @@ -44,6 +44,7 @@ use crate::{AlwaysFixableViolation, Applicability, Fix}; /// ## References /// - [Python documentation: `__future__` — Future statement definitions](https://docs.python.org/3/library/__future__.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.155")] pub(crate) struct UnnecessaryFutureImport { pub names: Vec, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/unpacked_list_comprehension.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/unpacked_list_comprehension.rs index 1958a23120b91d..7cb86fe0304fa2 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/unpacked_list_comprehension.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/unpacked_list_comprehension.rs @@ -28,6 +28,7 @@ use crate::Violation; /// - [Python documentation: Generator expressions](https://docs.python.org/3/reference/expressions.html#generator-expressions) /// - [Python documentation: List comprehensions](https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions) #[derive(ViolationMetadata)] +#[violation_metadata(removed_since = "0.8.0")] pub(crate) struct UnpackedListComprehension; impl Violation for UnpackedListComprehension { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep585_annotation.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep585_annotation.rs index 044c21f258193e..420768f1eda669 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep585_annotation.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep585_annotation.rs @@ -55,6 +55,7 @@ use ruff_python_ast::PythonVersion; /// /// [PEP 585]: https://peps.python.org/pep-0585/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.155")] pub(crate) struct NonPEP585Annotation { from: String, to: String, diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep604_annotation.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep604_annotation.rs index 784bc5c65e5e5b..aabbb65d152951 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep604_annotation.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep604_annotation.rs @@ -54,6 +54,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// /// [PEP 604]: https://peps.python.org/pep-0604/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.155")] pub(crate) struct NonPEP604AnnotationUnion; impl Violation for NonPEP604AnnotationUnion { @@ -110,6 +111,7 @@ impl Violation for NonPEP604AnnotationUnion { /// /// [PEP 604]: https://peps.python.org/pep-0604/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct NonPEP604AnnotationOptional; impl Violation for NonPEP604AnnotationOptional { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep604_isinstance.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep604_isinstance.rs index 17f50ab99a4453..df8c492c9658db 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep604_isinstance.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/use_pep604_isinstance.rs @@ -72,6 +72,7 @@ impl CallKind { /// [PEP 604]: https://peps.python.org/pep-0604/ /// [PEP 695]: https://peps.python.org/pep-0695/ #[derive(ViolationMetadata)] +#[violation_metadata(removed_since = "0.13.0")] pub(crate) struct NonPEP604Isinstance { kind: CallKind, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/useless_class_metaclass_type.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/useless_class_metaclass_type.rs index 09e993b2fbdd04..75bbe20eca8d7e 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/useless_class_metaclass_type.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/useless_class_metaclass_type.rs @@ -29,6 +29,7 @@ use ruff_text_size::Ranged; /// ## References /// - [PEP 3115 – Metaclasses in Python 3000](https://peps.python.org/pep-3115/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.13.0")] pub(crate) struct UselessClassMetaclassType { name: String, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/useless_metaclass_type.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/useless_metaclass_type.rs index b221b2e7cd8e03..2d2d7ac8680cd3 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/useless_metaclass_type.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/useless_metaclass_type.rs @@ -29,6 +29,7 @@ use crate::{AlwaysFixableViolation, Fix}; /// ## References /// - [PEP 3115 – Metaclasses in Python 3000](https://peps.python.org/pep-3115/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.155")] pub(crate) struct UselessMetaclassType; impl AlwaysFixableViolation for UselessMetaclassType { diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/useless_object_inheritance.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/useless_object_inheritance.rs index cb1fe0152e0c84..4a5789c78fa180 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/useless_object_inheritance.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/useless_object_inheritance.rs @@ -32,6 +32,7 @@ use crate::{AlwaysFixableViolation, Fix}; /// ## References /// - [PEP 3115 – Metaclasses in Python 3000](https://peps.python.org/pep-3115/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.155")] pub(crate) struct UselessObjectInheritance { name: String, } diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/yield_in_for_loop.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/yield_in_for_loop.rs index 8fa6118e4cdcb0..7fec2b7d790056 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/yield_in_for_loop.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/yield_in_for_loop.rs @@ -51,6 +51,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [Python documentation: The `yield` statement](https://docs.python.org/3/reference/simple_stmts.html#the-yield-statement) /// - [PEP 380 – Syntax for Delegating to a Subgenerator](https://peps.python.org/pep-0380/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.210")] pub(crate) struct YieldInForLoop; impl Violation for YieldInForLoop { diff --git a/crates/ruff_linter/src/rules/refurb/rules/bit_count.rs b/crates/ruff_linter/src/rules/refurb/rules/bit_count.rs index 1dd8d9c89e8c2e..b86c6e9d9ef60d 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/bit_count.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/bit_count.rs @@ -39,6 +39,7 @@ use crate::{AlwaysFixableViolation, Applicability, Edit, Fix}; /// ## References /// - [Python documentation:`int.bit_count`](https://docs.python.org/3/library/stdtypes.html#int.bit_count) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct BitCount { existing: SourceCodeSnippet, replacement: SourceCodeSnippet, diff --git a/crates/ruff_linter/src/rules/refurb/rules/check_and_remove_from_set.rs b/crates/ruff_linter/src/rules/refurb/rules/check_and_remove_from_set.rs index 7aa11f94ba255b..b28b06d4a944a1 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/check_and_remove_from_set.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/check_and_remove_from_set.rs @@ -40,6 +40,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: `set.discard()`](https://docs.python.org/3/library/stdtypes.html?highlight=list#frozenset.discard) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct CheckAndRemoveFromSet { element: SourceCodeSnippet, set: String, diff --git a/crates/ruff_linter/src/rules/refurb/rules/delete_full_slice.rs b/crates/ruff_linter/src/rules/refurb/rules/delete_full_slice.rs index 2fce83de338af2..08ffd454631157 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/delete_full_slice.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/delete_full_slice.rs @@ -44,6 +44,7 @@ use crate::rules::refurb::helpers::generate_method_call; /// - [Python documentation: Mutable Sequence Types](https://docs.python.org/3/library/stdtypes.html?highlight=list#mutable-sequence-types) /// - [Python documentation: `dict.clear()`](https://docs.python.org/3/library/stdtypes.html?highlight=list#dict.clear) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.287")] pub(crate) struct DeleteFullSlice; impl Violation for DeleteFullSlice { diff --git a/crates/ruff_linter/src/rules/refurb/rules/for_loop_set_mutations.rs b/crates/ruff_linter/src/rules/refurb/rules/for_loop_set_mutations.rs index 609c0dd260926d..202f5095578e72 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/for_loop_set_mutations.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/for_loop_set_mutations.rs @@ -44,6 +44,7 @@ use crate::rules::refurb::helpers::parenthesize_loop_iter_if_necessary; /// ## References /// - [Python documentation: `set`](https://docs.python.org/3/library/stdtypes.html#set) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.3.5")] pub(crate) struct ForLoopSetMutations { method_name: &'static str, batch_method_name: &'static str, diff --git a/crates/ruff_linter/src/rules/refurb/rules/for_loop_writes.rs b/crates/ruff_linter/src/rules/refurb/rules/for_loop_writes.rs index 8f20877817e7b3..23d24788ca1069 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/for_loop_writes.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/for_loop_writes.rs @@ -47,6 +47,7 @@ use crate::rules::refurb::helpers::parenthesize_loop_iter_if_necessary; /// ## References /// - [Python documentation: `io.IOBase.writelines`](https://docs.python.org/3/library/io.html#io.IOBase.writelines) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct ForLoopWrites { name: String, } diff --git a/crates/ruff_linter/src/rules/refurb/rules/fromisoformat_replace_z.rs b/crates/ruff_linter/src/rules/refurb/rules/fromisoformat_replace_z.rs index def4bf832e068a..3622148fbfecd8 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/fromisoformat_replace_z.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/fromisoformat_replace_z.rs @@ -67,6 +67,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// [iso-8601]: https://www.iso.org/obp/ui/#iso:std:iso:8601 /// [fromisoformat]: https://docs.python.org/3/library/datetime.html#datetime.date.fromisoformat #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct FromisoformatReplaceZ; impl AlwaysFixableViolation for FromisoformatReplaceZ { diff --git a/crates/ruff_linter/src/rules/refurb/rules/fstring_number_format.rs b/crates/ruff_linter/src/rules/refurb/rules/fstring_number_format.rs index c06fe722b0a8a3..68c95def5db086 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/fstring_number_format.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/fstring_number_format.rs @@ -31,6 +31,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// are display-only, as they may change the runtime behaviour of the program /// or introduce syntax errors. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.13.0")] pub(crate) struct FStringNumberFormat { replacement: Option, base: Base, diff --git a/crates/ruff_linter/src/rules/refurb/rules/hardcoded_string_charset.rs b/crates/ruff_linter/src/rules/refurb/rules/hardcoded_string_charset.rs index 0bc22b3a332b6b..151bdc31138736 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/hardcoded_string_charset.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/hardcoded_string_charset.rs @@ -29,6 +29,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: String constants](https://docs.python.org/3/library/string.html#string-constants) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.7.0")] pub(crate) struct HardcodedStringCharset { name: &'static str, } diff --git a/crates/ruff_linter/src/rules/refurb/rules/hashlib_digest_hex.rs b/crates/ruff_linter/src/rules/refurb/rules/hashlib_digest_hex.rs index 837e5ed79f5484..deac83a9d002eb 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/hashlib_digest_hex.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/hashlib_digest_hex.rs @@ -31,6 +31,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `hashlib`](https://docs.python.org/3/library/hashlib.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct HashlibDigestHex; impl Violation for HashlibDigestHex { diff --git a/crates/ruff_linter/src/rules/refurb/rules/if_exp_instead_of_or_operator.rs b/crates/ruff_linter/src/rules/refurb/rules/if_exp_instead_of_or_operator.rs index 51047f15bba73f..fa660587ef645b 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/if_exp_instead_of_or_operator.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/if_exp_instead_of_or_operator.rs @@ -39,6 +39,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// (assuming `foo()` returns a truthy value), but only once in /// `foo() or bar()`. #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.3.6")] pub(crate) struct IfExpInsteadOfOrOperator; impl Violation for IfExpInsteadOfOrOperator { diff --git a/crates/ruff_linter/src/rules/refurb/rules/if_expr_min_max.rs b/crates/ruff_linter/src/rules/refurb/rules/if_expr_min_max.rs index a514b8704e0c4a..a3bfcdd0ddacad 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/if_expr_min_max.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/if_expr_min_max.rs @@ -31,6 +31,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [Python documentation: `min`](https://docs.python.org/3.11/library/functions.html#min) /// - [Python documentation: `max`](https://docs.python.org/3.11/library/functions.html#max) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct IfExprMinMax { min_max: MinMax, expression: SourceCodeSnippet, diff --git a/crates/ruff_linter/src/rules/refurb/rules/implicit_cwd.rs b/crates/ruff_linter/src/rules/refurb/rules/implicit_cwd.rs index 8be3695d80669c..dffe4feee63f2d 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/implicit_cwd.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/implicit_cwd.rs @@ -29,6 +29,7 @@ use crate::{checkers::ast::Checker, importer::ImportRequest}; /// ## References /// - [Python documentation: `Path.cwd`](https://docs.python.org/3/library/pathlib.html#pathlib.Path.cwd) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct ImplicitCwd; impl Violation for ImplicitCwd { diff --git a/crates/ruff_linter/src/rules/refurb/rules/int_on_sliced_str.rs b/crates/ruff_linter/src/rules/refurb/rules/int_on_sliced_str.rs index 588569f39723cc..f84fdac8edb1c6 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/int_on_sliced_str.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/int_on_sliced_str.rs @@ -48,6 +48,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: `int`](https://docs.python.org/3/library/functions.html#int) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct IntOnSlicedStr { base: u8, } diff --git a/crates/ruff_linter/src/rules/refurb/rules/isinstance_type_none.rs b/crates/ruff_linter/src/rules/refurb/rules/isinstance_type_none.rs index 4ff1f1c4af877c..27715d00f87778 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/isinstance_type_none.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/isinstance_type_none.rs @@ -32,6 +32,7 @@ use crate::{FixAvailability, Violation}; /// - [Python documentation: `type`](https://docs.python.org/3/library/functions.html#type) /// - [Python documentation: Identity comparisons](https://docs.python.org/3/reference/expressions.html#is-not) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct IsinstanceTypeNone; impl Violation for IsinstanceTypeNone { diff --git a/crates/ruff_linter/src/rules/refurb/rules/list_reverse_copy.rs b/crates/ruff_linter/src/rules/refurb/rules/list_reverse_copy.rs index bf8e6c6207f974..b9f894177ebaca 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/list_reverse_copy.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/list_reverse_copy.rs @@ -47,6 +47,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: More on Lists](https://docs.python.org/3/tutorial/datastructures.html#more-on-lists) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct ListReverseCopy { name: String, } diff --git a/crates/ruff_linter/src/rules/refurb/rules/math_constant.rs b/crates/ruff_linter/src/rules/refurb/rules/math_constant.rs index c2db8c2c7ece67..8672237644dd3b 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/math_constant.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/math_constant.rs @@ -28,6 +28,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `math` constants](https://docs.python.org/3/library/math.html#constants) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.6")] pub(crate) struct MathConstant { literal: String, constant: &'static str, diff --git a/crates/ruff_linter/src/rules/refurb/rules/metaclass_abcmeta.rs b/crates/ruff_linter/src/rules/refurb/rules/metaclass_abcmeta.rs index cdc1646e855eb3..7e5a432968334e 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/metaclass_abcmeta.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/metaclass_abcmeta.rs @@ -47,6 +47,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// - [Python documentation: `abc.ABC`](https://docs.python.org/3/library/abc.html#abc.ABC) /// - [Python documentation: `abc.ABCMeta`](https://docs.python.org/3/library/abc.html#abc.ABCMeta) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.2.0")] pub(crate) struct MetaClassABCMeta; impl AlwaysFixableViolation for MetaClassABCMeta { diff --git a/crates/ruff_linter/src/rules/refurb/rules/print_empty_string.rs b/crates/ruff_linter/src/rules/refurb/rules/print_empty_string.rs index 29a26f44ca8bc9..2b8ecfab451dc7 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/print_empty_string.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/print_empty_string.rs @@ -38,6 +38,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `print`](https://docs.python.org/3/library/functions.html#print) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct PrintEmptyString { reason: Reason, } diff --git a/crates/ruff_linter/src/rules/refurb/rules/read_whole_file.rs b/crates/ruff_linter/src/rules/refurb/rules/read_whole_file.rs index 365f9bf112302c..b64f91829a6405 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/read_whole_file.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/read_whole_file.rs @@ -41,6 +41,7 @@ use crate::{FixAvailability, Violation}; /// - [Python documentation: `Path.read_bytes`](https://docs.python.org/3/library/pathlib.html#pathlib.Path.read_bytes) /// - [Python documentation: `Path.read_text`](https://docs.python.org/3/library/pathlib.html#pathlib.Path.read_text) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.2")] pub(crate) struct ReadWholeFile { filename: SourceCodeSnippet, suggestion: SourceCodeSnippet, diff --git a/crates/ruff_linter/src/rules/refurb/rules/readlines_in_for.rs b/crates/ruff_linter/src/rules/refurb/rules/readlines_in_for.rs index 6bdbf94184d5db..a6ea1eb570a7f3 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/readlines_in_for.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/readlines_in_for.rs @@ -48,6 +48,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: `io.IOBase.readlines`](https://docs.python.org/3/library/io.html#io.IOBase.readlines) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct ReadlinesInFor; impl AlwaysFixableViolation for ReadlinesInFor { diff --git a/crates/ruff_linter/src/rules/refurb/rules/redundant_log_base.rs b/crates/ruff_linter/src/rules/refurb/rules/redundant_log_base.rs index dc8081cc639bc6..a54bd261d1db18 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/redundant_log_base.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/redundant_log_base.rs @@ -51,6 +51,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [Python documentation: `math.log10`](https://docs.python.org/3/library/math.html#math.log10) /// - [Python documentation: `math.e`](https://docs.python.org/3/library/math.html#math.e) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct RedundantLogBase { base: Base, arg: String, diff --git a/crates/ruff_linter/src/rules/refurb/rules/regex_flag_alias.rs b/crates/ruff_linter/src/rules/refurb/rules/regex_flag_alias.rs index 3ea5561cd8b622..5d8b332475613c 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/regex_flag_alias.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/regex_flag_alias.rs @@ -32,6 +32,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct RegexFlagAlias { flag: RegexFlag, } diff --git a/crates/ruff_linter/src/rules/refurb/rules/reimplemented_operator.rs b/crates/ruff_linter/src/rules/refurb/rules/reimplemented_operator.rs index 9f2a2275386a27..963a09449838ca 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/reimplemented_operator.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/reimplemented_operator.rs @@ -69,6 +69,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// /// [descriptors]: https://docs.python.org/3/howto/descriptor.html #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.9")] pub(crate) struct ReimplementedOperator { operator: Operator, target: FunctionLikeKind, diff --git a/crates/ruff_linter/src/rules/refurb/rules/reimplemented_starmap.rs b/crates/ruff_linter/src/rules/refurb/rules/reimplemented_starmap.rs index 592d7fb7590b9e..d9501a645beff1 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/reimplemented_starmap.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/reimplemented_starmap.rs @@ -46,6 +46,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// [PEP 709]: https://peps.python.org/pep-0709/ /// [#7771]: https://github.com/astral-sh/ruff/issues/7771 #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.291")] pub(crate) struct ReimplementedStarmap; impl Violation for ReimplementedStarmap { diff --git a/crates/ruff_linter/src/rules/refurb/rules/repeated_append.rs b/crates/ruff_linter/src/rules/refurb/rules/repeated_append.rs index aaf7e8883161bb..8d797d9c546dc0 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/repeated_append.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/repeated_append.rs @@ -45,6 +45,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: More on Lists](https://docs.python.org/3/tutorial/datastructures.html#more-on-lists) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.287")] pub(crate) struct RepeatedAppend { name: String, replacement: SourceCodeSnippet, diff --git a/crates/ruff_linter/src/rules/refurb/rules/repeated_global.rs b/crates/ruff_linter/src/rules/refurb/rules/repeated_global.rs index 685f7124cc3399..b7aaeb106a3803 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/repeated_global.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/repeated_global.rs @@ -37,6 +37,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// - [Python documentation: the `global` statement](https://docs.python.org/3/reference/simple_stmts.html#the-global-statement) /// - [Python documentation: the `nonlocal` statement](https://docs.python.org/3/reference/simple_stmts.html#the-nonlocal-statement) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.4.9")] pub(crate) struct RepeatedGlobal { global_kind: GlobalKind, } diff --git a/crates/ruff_linter/src/rules/refurb/rules/single_item_membership_test.rs b/crates/ruff_linter/src/rules/refurb/rules/single_item_membership_test.rs index de6bdae0b3cb5e..1df2fdde781da2 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/single_item_membership_test.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/single_item_membership_test.rs @@ -42,6 +42,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [Python documentation: Comparisons](https://docs.python.org/3/reference/expressions.html#comparisons) /// - [Python documentation: Membership test operations](https://docs.python.org/3/reference/expressions.html#membership-test-operations) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.1.0")] pub(crate) struct SingleItemMembershipTest { membership_test: MembershipTest, } diff --git a/crates/ruff_linter/src/rules/refurb/rules/slice_copy.rs b/crates/ruff_linter/src/rules/refurb/rules/slice_copy.rs index 91b79038898336..33cdeb1bd6d776 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/slice_copy.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/slice_copy.rs @@ -37,6 +37,7 @@ use crate::rules::refurb::helpers::generate_method_call; /// ## References /// - [Python documentation: Mutable Sequence Types](https://docs.python.org/3/library/stdtypes.html#mutable-sequence-types) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.290")] pub(crate) struct SliceCopy; impl Violation for SliceCopy { diff --git a/crates/ruff_linter/src/rules/refurb/rules/slice_to_remove_prefix_or_suffix.rs b/crates/ruff_linter/src/rules/refurb/rules/slice_to_remove_prefix_or_suffix.rs index 0cfd94f3bc7eab..10c0f8d8a39a01 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/slice_to_remove_prefix_or_suffix.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/slice_to_remove_prefix_or_suffix.rs @@ -38,6 +38,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// text = text.removeprefix("pre") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.9.0")] pub(crate) struct SliceToRemovePrefixOrSuffix { affix_kind: AffixKind, stmt_or_expression: StmtOrExpr, diff --git a/crates/ruff_linter/src/rules/refurb/rules/sorted_min_max.rs b/crates/ruff_linter/src/rules/refurb/rules/sorted_min_max.rs index 41965dc04f1f54..a6187ccaee9ce8 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/sorted_min_max.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/sorted_min_max.rs @@ -47,6 +47,7 @@ use crate::checkers::ast::Checker; /// - [Python documentation: `min`](https://docs.python.org/3/library/functions.html#min) /// - [Python documentation: `max`](https://docs.python.org/3/library/functions.html#max) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.4.2")] pub(crate) struct SortedMinMax { min_max: MinMax, } diff --git a/crates/ruff_linter/src/rules/refurb/rules/subclass_builtin.rs b/crates/ruff_linter/src/rules/refurb/rules/subclass_builtin.rs index 7d92379b36d079..20cb03109ade79 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/subclass_builtin.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/subclass_builtin.rs @@ -57,6 +57,7 @@ use crate::{checkers::ast::Checker, importer::ImportRequest}; /// /// - [Python documentation: `collections`](https://docs.python.org/3/library/collections.html) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.7.3")] pub(crate) struct SubclassBuiltin { subclass: String, replacement: String, diff --git a/crates/ruff_linter/src/rules/refurb/rules/type_none_comparison.rs b/crates/ruff_linter/src/rules/refurb/rules/type_none_comparison.rs index b498a5ee491b9f..7057458aefec3c 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/type_none_comparison.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/type_none_comparison.rs @@ -32,6 +32,7 @@ use crate::rules::refurb::helpers::replace_with_identity_check; /// - [Python documentation: `type`](https://docs.python.org/3/library/functions.html#type) /// - [Python documentation: Identity comparisons](https://docs.python.org/3/reference/expressions.html#is-not) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct TypeNoneComparison { replacement: IdentityCheck, } diff --git a/crates/ruff_linter/src/rules/refurb/rules/unnecessary_enumerate.rs b/crates/ruff_linter/src/rules/refurb/rules/unnecessary_enumerate.rs index 4d3ab8268903d4..420fe0f8c6e6b2 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/unnecessary_enumerate.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/unnecessary_enumerate.rs @@ -58,6 +58,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [Python documentation: `range`](https://docs.python.org/3/library/stdtypes.html#range) /// - [Python documentation: `len`](https://docs.python.org/3/library/functions.html#len) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.0.291")] pub(crate) struct UnnecessaryEnumerate { subset: EnumerateSubset, } diff --git a/crates/ruff_linter/src/rules/refurb/rules/unnecessary_from_float.rs b/crates/ruff_linter/src/rules/refurb/rules/unnecessary_from_float.rs index 0b6321d8cf0564..e34357bd559e77 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/unnecessary_from_float.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/unnecessary_from_float.rs @@ -60,6 +60,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// - [Python documentation: `decimal`](https://docs.python.org/3/library/decimal.html) /// - [Python documentation: `fractions`](https://docs.python.org/3/library/fractions.html) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.3.5")] pub(crate) struct UnnecessaryFromFloat { method_name: MethodName, constructor: Constructor, diff --git a/crates/ruff_linter/src/rules/refurb/rules/verbose_decimal_constructor.rs b/crates/ruff_linter/src/rules/refurb/rules/verbose_decimal_constructor.rs index b4c7e8a4930fa1..04d169e3f66e06 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/verbose_decimal_constructor.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/verbose_decimal_constructor.rs @@ -47,6 +47,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `decimal`](https://docs.python.org/3/library/decimal.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct VerboseDecimalConstructor { replacement: String, } diff --git a/crates/ruff_linter/src/rules/refurb/rules/write_whole_file.rs b/crates/ruff_linter/src/rules/refurb/rules/write_whole_file.rs index 310f4babf5ecd7..bbee6dcb5a12f1 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/write_whole_file.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/write_whole_file.rs @@ -44,6 +44,7 @@ use crate::{FixAvailability, Violation}; /// - [Python documentation: `Path.write_bytes`](https://docs.python.org/3/library/pathlib.html#pathlib.Path.write_bytes) /// - [Python documentation: `Path.write_text`](https://docs.python.org/3/library/pathlib.html#pathlib.Path.write_text) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.3.6")] pub(crate) struct WriteWholeFile { filename: SourceCodeSnippet, suggestion: SourceCodeSnippet, diff --git a/crates/ruff_linter/src/rules/ruff/rules/access_annotations_from_class_dict.rs b/crates/ruff_linter/src/rules/ruff/rules/access_annotations_from_class_dict.rs index f314d38c1a9071..33435c648ea051 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/access_annotations_from_class_dict.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/access_annotations_from_class_dict.rs @@ -74,6 +74,7 @@ use ruff_text_size::Ranged; /// ## References /// - [Python Annotations Best Practices](https://docs.python.org/3.14/howto/annotations.html) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.12.1")] pub(crate) struct AccessAnnotationsFromClassDict { python_version: PythonVersion, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/ambiguous_unicode_character.rs b/crates/ruff_linter/src/rules/ruff/rules/ambiguous_unicode_character.rs index 9ee9352c648897..ba1c696d276477 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/ambiguous_unicode_character.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/ambiguous_unicode_character.rs @@ -46,6 +46,7 @@ use crate::rules::ruff::rules::confusables::confusable; /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.102")] pub(crate) struct AmbiguousUnicodeCharacterString { confusable: char, representant: char, @@ -99,6 +100,7 @@ impl Violation for AmbiguousUnicodeCharacterString { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.102")] pub(crate) struct AmbiguousUnicodeCharacterDocstring { confusable: char, representant: char, @@ -152,6 +154,7 @@ impl Violation for AmbiguousUnicodeCharacterDocstring { /// /// [preview]: https://docs.astral.sh/ruff/preview/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.108")] pub(crate) struct AmbiguousUnicodeCharacterComment { confusable: char, representant: char, diff --git a/crates/ruff_linter/src/rules/ruff/rules/assert_with_print_message.rs b/crates/ruff_linter/src/rules/ruff/rules/assert_with_print_message.rs index 2d34e63a0c37ef..186b09cb4ae859 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/assert_with_print_message.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/assert_with_print_message.rs @@ -38,6 +38,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Python documentation: `assert`](https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct AssertWithPrintMessage; impl AlwaysFixableViolation for AssertWithPrintMessage { diff --git a/crates/ruff_linter/src/rules/ruff/rules/assignment_in_assert.rs b/crates/ruff_linter/src/rules/ruff/rules/assignment_in_assert.rs index 1de48b6454a9b1..5787eaf6bff7f1 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/assignment_in_assert.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/assignment_in_assert.rs @@ -48,6 +48,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `-O`](https://docs.python.org/3/using/cmdline.html#cmdoption-O) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct AssignmentInAssert; impl Violation for AssignmentInAssert { diff --git a/crates/ruff_linter/src/rules/ruff/rules/asyncio_dangling_task.rs b/crates/ruff_linter/src/rules/ruff/rules/asyncio_dangling_task.rs index 17657e6f9cd392..e93433377f43c6 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/asyncio_dangling_task.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/asyncio_dangling_task.rs @@ -53,6 +53,7 @@ use crate::checkers::ast::Checker; /// - [_The Heisenbug lurking in your async code_](https://textual.textualize.io/blog/2023/02/11/the-heisenbug-lurking-in-your-async-code/) /// - [The Python Standard Library](https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.247")] pub(crate) struct AsyncioDanglingTask { expr: String, method: Method, diff --git a/crates/ruff_linter/src/rules/ruff/rules/class_with_mixed_type_vars.rs b/crates/ruff_linter/src/rules/ruff/rules/class_with_mixed_type_vars.rs index 1f4a553714f3af..4178217718efc9 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/class_with_mixed_type_vars.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/class_with_mixed_type_vars.rs @@ -62,6 +62,7 @@ use ruff_python_ast::PythonVersion; /// [PEP 695]: https://peps.python.org/pep-0695/ /// [type parameter lists]: https://docs.python.org/3/reference/compound_stmts.html#type-params #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct ClassWithMixedTypeVars; impl Violation for ClassWithMixedTypeVars { diff --git a/crates/ruff_linter/src/rules/ruff/rules/collection_literal_concatenation.rs b/crates/ruff_linter/src/rules/ruff/rules/collection_literal_concatenation.rs index 8c38154151430c..cc79c647610f6c 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/collection_literal_concatenation.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/collection_literal_concatenation.rs @@ -43,6 +43,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [PEP 448 – Additional Unpacking Generalizations](https://peps.python.org/pep-0448/) /// - [Python documentation: Sequence Types — `list`, `tuple`, `range`](https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-range) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.227")] pub(crate) struct CollectionLiteralConcatenation { expression: SourceCodeSnippet, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/dataclass_enum.rs b/crates/ruff_linter/src/rules/ruff/rules/dataclass_enum.rs index 9744cff0ae8d5e..04bcb0666253b4 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/dataclass_enum.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/dataclass_enum.rs @@ -45,6 +45,7 @@ use crate::rules::ruff::helpers::{DataclassKind, dataclass_kind}; /// ## References /// - [Python documentation: Enum HOWTO § Dataclass support](https://docs.python.org/3/howto/enum.html#dataclass-support) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct DataclassEnum; impl Violation for DataclassEnum { diff --git a/crates/ruff_linter/src/rules/ruff/rules/decimal_from_float_literal.rs b/crates/ruff_linter/src/rules/ruff/rules/decimal_from_float_literal.rs index a3bbaa608efb37..7de91824ce3d71 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/decimal_from_float_literal.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/decimal_from_float_literal.rs @@ -33,6 +33,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// of the `Decimal` instance that is constructed. This can lead to unexpected /// behavior if your program relies on the previous value (whether deliberately or not). #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.9.0")] pub(crate) struct DecimalFromFloatLiteral; impl AlwaysFixableViolation for DecimalFromFloatLiteral { diff --git a/crates/ruff_linter/src/rules/ruff/rules/default_factory_kwarg.rs b/crates/ruff_linter/src/rules/ruff/rules/default_factory_kwarg.rs index 61f4b3119fc08b..ea792ce97cbcc3 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/default_factory_kwarg.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/default_factory_kwarg.rs @@ -51,6 +51,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// defaultdict(list) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct DefaultFactoryKwarg { default_factory: SourceCodeSnippet, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/explicit_f_string_type_conversion.rs b/crates/ruff_linter/src/rules/ruff/rules/explicit_f_string_type_conversion.rs index 48a43900df9063..8dcd347fe3c0a4 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/explicit_f_string_type_conversion.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/explicit_f_string_type_conversion.rs @@ -40,6 +40,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// f"{a!r}" /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.267")] pub(crate) struct ExplicitFStringTypeConversion; impl Violation for ExplicitFStringTypeConversion { diff --git a/crates/ruff_linter/src/rules/ruff/rules/falsy_dict_get_fallback.rs b/crates/ruff_linter/src/rules/ruff/rules/falsy_dict_get_fallback.rs index 8e5596569440b2..a19a9c451a4bb5 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/falsy_dict_get_fallback.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/falsy_dict_get_fallback.rs @@ -40,6 +40,7 @@ use crate::{Applicability, Fix, FixAvailability, Violation}; /// /// [documentation]: https://docs.python.org/3.13/library/stdtypes.html#dict.get #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.8.5")] pub(crate) struct FalsyDictGetFallback; impl Violation for FalsyDictGetFallback { diff --git a/crates/ruff_linter/src/rules/ruff/rules/function_call_in_dataclass_default.rs b/crates/ruff_linter/src/rules/ruff/rules/function_call_in_dataclass_default.rs index 26c4c5d657f304..000dd2587a00a8 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/function_call_in_dataclass_default.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/function_call_in_dataclass_default.rs @@ -61,6 +61,7 @@ use crate::rules::ruff::helpers::{ /// ## Options /// - `lint.flake8-bugbear.extend-immutable-calls` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.262")] pub(crate) struct FunctionCallInDataclassDefaultArgument { name: Option, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/if_key_in_dict_del.rs b/crates/ruff_linter/src/rules/ruff/rules/if_key_in_dict_del.rs index b167a78894eb46..3b590f07ff52ae 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/if_key_in_dict_del.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/if_key_in_dict_del.rs @@ -30,6 +30,7 @@ type Dict = ExprName; /// ## Fix safety /// This rule's fix is marked as safe, unless the if statement contains comments. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct IfKeyInDictDel; impl AlwaysFixableViolation for IfKeyInDictDel { diff --git a/crates/ruff_linter/src/rules/ruff/rules/implicit_classvar_in_dataclass.rs b/crates/ruff_linter/src/rules/ruff/rules/implicit_classvar_in_dataclass.rs index 47e3fc4d8e4b77..46a29cd05eb1ee 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/implicit_classvar_in_dataclass.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/implicit_classvar_in_dataclass.rs @@ -52,6 +52,7 @@ use crate::rules::ruff::helpers::{DataclassKind, dataclass_kind}; /// ## Options /// - [`lint.dummy-variable-rgx`] #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.9.7")] pub(crate) struct ImplicitClassVarInDataclass; impl Violation for ImplicitClassVarInDataclass { diff --git a/crates/ruff_linter/src/rules/ruff/rules/implicit_optional.rs b/crates/ruff_linter/src/rules/ruff/rules/implicit_optional.rs index 18fc913f246208..4217c837f579d9 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/implicit_optional.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/implicit_optional.rs @@ -84,6 +84,7 @@ use crate::rules::ruff::typing::type_hint_explicitly_allows_none; /// /// [PEP 484]: https://peps.python.org/pep-0484/#union-types #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.273")] pub(crate) struct ImplicitOptional { conversion_type: ConversionType, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/in_empty_collection.rs b/crates/ruff_linter/src/rules/ruff/rules/in_empty_collection.rs index ec3257d9ec5a1e..ba1ae5368d4a46 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/in_empty_collection.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/in_empty_collection.rs @@ -25,6 +25,7 @@ use crate::checkers::ast::Checker; /// print("got it!") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.11.9")] pub(crate) struct InEmptyCollection; impl Violation for InEmptyCollection { diff --git a/crates/ruff_linter/src/rules/ruff/rules/incorrectly_parenthesized_tuple_in_subscript.rs b/crates/ruff_linter/src/rules/ruff/rules/incorrectly_parenthesized_tuple_in_subscript.rs index e0c537f0b0cc1d..0c676e465cdf48 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/incorrectly_parenthesized_tuple_in_subscript.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/incorrectly_parenthesized_tuple_in_subscript.rs @@ -38,6 +38,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## Options /// - `lint.ruff.parenthesize-tuple-in-subscript` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.5.7")] pub(crate) struct IncorrectlyParenthesizedTupleInSubscript { prefer_parentheses: bool, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/indented_form_feed.rs b/crates/ruff_linter/src/rules/ruff/rules/indented_form_feed.rs index b943c6553604d7..d0e579367d92de 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/indented_form_feed.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/indented_form_feed.rs @@ -31,6 +31,7 @@ use crate::{Violation, checkers::ast::LintContext}; /// /// [lexical-analysis-indentation]: https://docs.python.org/3/reference/lexical_analysis.html#indentation #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.9.6")] pub(crate) struct IndentedFormFeed; impl Violation for IndentedFormFeed { diff --git a/crates/ruff_linter/src/rules/ruff/rules/invalid_assert_message_literal_argument.rs b/crates/ruff_linter/src/rules/ruff/rules/invalid_assert_message_literal_argument.rs index 3d2bbbaa830703..1f6c25677e245d 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/invalid_assert_message_literal_argument.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/invalid_assert_message_literal_argument.rs @@ -26,6 +26,7 @@ use crate::checkers::ast::Checker; /// assert len(fruits) == 2 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct InvalidAssertMessageLiteralArgument; impl Violation for InvalidAssertMessageLiteralArgument { diff --git a/crates/ruff_linter/src/rules/ruff/rules/invalid_formatter_suppression_comment.rs b/crates/ruff_linter/src/rules/ruff/rules/invalid_formatter_suppression_comment.rs index 81d821522599e4..f414c478992901 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/invalid_formatter_suppression_comment.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/invalid_formatter_suppression_comment.rs @@ -55,6 +55,7 @@ use super::suppression_comment_visitor::{ /// This fix is always marked as unsafe because it deletes the invalid suppression comment, /// rather than trying to move it to a valid position, which the user more likely intended. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct InvalidFormatterSuppressionComment { reason: IgnoredReason, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/invalid_index_type.rs b/crates/ruff_linter/src/rules/ruff/rules/invalid_index_type.rs index 5c038455a02e15..dff668d0288cbf 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/invalid_index_type.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/invalid_index_type.rs @@ -26,6 +26,7 @@ use crate::checkers::ast::Checker; /// var = [1, 2, 3][0] /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.278")] pub(crate) struct InvalidIndexType { value_type: String, index_type: String, diff --git a/crates/ruff_linter/src/rules/ruff/rules/invalid_pyproject_toml.rs b/crates/ruff_linter/src/rules/ruff/rules/invalid_pyproject_toml.rs index bc91f9cf54444d..4da7ce2996bf91 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/invalid_pyproject_toml.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/invalid_pyproject_toml.rs @@ -31,6 +31,7 @@ use crate::{FixAvailability, Violation}; /// - [Specification of `[build-system]` in pyproject.toml](https://peps.python.org/pep-0518/) /// - [Draft but implemented license declaration extensions](https://peps.python.org/pep-0639) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.271")] pub(crate) struct InvalidPyprojectToml { pub message: String, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/invalid_rule_code.rs b/crates/ruff_linter/src/rules/ruff/rules/invalid_rule_code.rs index 2f1344dce093c1..3c9cde312e851a 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/invalid_rule_code.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/invalid_rule_code.rs @@ -33,6 +33,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## Options /// - `lint.external` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.11.4")] pub(crate) struct InvalidRuleCode { pub(crate) rule_code: String, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/legacy_form_pytest_raises.rs b/crates/ruff_linter/src/rules/ruff/rules/legacy_form_pytest_raises.rs index 4e7081a6b4bbe7..b48a2520f23760 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/legacy_form_pytest_raises.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/legacy_form_pytest_raises.rs @@ -44,6 +44,7 @@ use crate::{FixAvailability, Violation, checkers::ast::Checker}; /// - [`pytest` documentation: `pytest.warns`](https://docs.pytest.org/en/latest/reference/reference.html#pytest-warns) /// - [`pytest` documentation: `pytest.deprecated_call`](https://docs.pytest.org/en/latest/reference/reference.html#pytest-deprecated-call) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.12.0")] pub(crate) struct LegacyFormPytestRaises { context_type: PytestContextType, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/logging_eager_conversion.rs b/crates/ruff_linter/src/rules/ruff/rules/logging_eager_conversion.rs index 1567cea1d674a3..a1bfc622cc9d01 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/logging_eager_conversion.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/logging_eager_conversion.rs @@ -60,6 +60,7 @@ use crate::rules::flake8_logging_format::rules::{LoggingCallType, find_logging_c /// - [Python documentation: `logging`](https://docs.python.org/3/library/logging.html) /// - [Python documentation: Optimization](https://docs.python.org/3/howto/logging.html#optimization) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.13.2")] pub(crate) struct LoggingEagerConversion { pub(crate) format_conversion: FormatConversion, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/map_int_version_parsing.rs b/crates/ruff_linter/src/rules/ruff/rules/map_int_version_parsing.rs index 4b7fa7e69fcd53..efc1b60f135221 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/map_int_version_parsing.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/map_int_version_parsing.rs @@ -35,6 +35,7 @@ use crate::checkers::ast::Checker; /// /// [version-specifier]: https://packaging.python.org/en/latest/specifications/version-specifiers/#version-specifiers #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct MapIntVersionParsing; impl Violation for MapIntVersionParsing { diff --git a/crates/ruff_linter/src/rules/ruff/rules/missing_fstring_syntax.rs b/crates/ruff_linter/src/rules/ruff/rules/missing_fstring_syntax.rs index 9194d758da90fc..229abff0d79c88 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/missing_fstring_syntax.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/missing_fstring_syntax.rs @@ -62,6 +62,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// [gettext]: https://docs.python.org/3/library/gettext.html /// [FastAPI path]: https://fastapi.tiangolo.com/tutorial/path-params/ #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.2.1")] pub(crate) struct MissingFStringSyntax; impl AlwaysFixableViolation for MissingFStringSyntax { diff --git a/crates/ruff_linter/src/rules/ruff/rules/mutable_class_default.rs b/crates/ruff_linter/src/rules/ruff/rules/mutable_class_default.rs index 4114c553f13b89..6dd1e1df599889 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/mutable_class_default.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/mutable_class_default.rs @@ -84,6 +84,7 @@ use crate::rules::ruff::helpers::{ /// /// [ClassVar]: https://docs.python.org/3/library/typing.html#typing.ClassVar #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.273")] pub(crate) struct MutableClassDefault; impl Violation for MutableClassDefault { diff --git a/crates/ruff_linter/src/rules/ruff/rules/mutable_dataclass_default.rs b/crates/ruff_linter/src/rules/ruff/rules/mutable_dataclass_default.rs index 736ab510ce9b34..f5ad048a9d5bb6 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/mutable_dataclass_default.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/mutable_dataclass_default.rs @@ -55,6 +55,7 @@ use crate::rules::ruff::helpers::{dataclass_kind, is_class_var_annotation}; /// mutable_default: ClassVar[list[int]] = [] /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.262")] pub(crate) struct MutableDataclassDefault; impl Violation for MutableDataclassDefault { diff --git a/crates/ruff_linter/src/rules/ruff/rules/mutable_fromkeys_value.rs b/crates/ruff_linter/src/rules/ruff/rules/mutable_fromkeys_value.rs index eea779a30eec33..9026431df70b02 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/mutable_fromkeys_value.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/mutable_fromkeys_value.rs @@ -49,6 +49,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `dict.fromkeys`](https://docs.python.org/3/library/stdtypes.html#dict.fromkeys) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.5.0")] pub(crate) struct MutableFromkeysValue; impl Violation for MutableFromkeysValue { diff --git a/crates/ruff_linter/src/rules/ruff/rules/needless_else.rs b/crates/ruff_linter/src/rules/ruff/rules/needless_else.rs index ca510970d6b21f..a60b6bde2e4ae9 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/needless_else.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/needless_else.rs @@ -31,6 +31,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// bar() /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.9.3")] pub(crate) struct NeedlessElse; impl AlwaysFixableViolation for NeedlessElse { diff --git a/crates/ruff_linter/src/rules/ruff/rules/never_union.rs b/crates/ruff_linter/src/rules/ruff/rules/never_union.rs index c06c0545023a77..a13fc694599d6c 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/never_union.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/never_union.rs @@ -35,6 +35,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// - [Python documentation: `typing.Never`](https://docs.python.org/3/library/typing.html#typing.Never) /// - [Python documentation: `typing.NoReturn`](https://docs.python.org/3/library/typing.html#typing.NoReturn) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct NeverUnion { never_like: NeverLike, union_like: UnionLike, diff --git a/crates/ruff_linter/src/rules/ruff/rules/non_octal_permissions.rs b/crates/ruff_linter/src/rules/ruff/rules/non_octal_permissions.rs index ed4c2aad653dd4..461972614be09b 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/non_octal_permissions.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/non_octal_permissions.rs @@ -72,6 +72,7 @@ use crate::{FixAvailability, Violation}; /// /// A fix is only available if the integer literal matches a set of common modes. #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.12.1")] pub(crate) struct NonOctalPermissions; impl Violation for NonOctalPermissions { diff --git a/crates/ruff_linter/src/rules/ruff/rules/none_not_at_end_of_union.rs b/crates/ruff_linter/src/rules/ruff/rules/none_not_at_end_of_union.rs index d69c9cd5677b7c..b45bd3877a1c39 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/none_not_at_end_of_union.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/none_not_at_end_of_union.rs @@ -30,6 +30,7 @@ use crate::checkers::ast::Checker; /// - [Python documentation: `typing.Optional`](https://docs.python.org/3/library/typing.html#typing.Optional) /// - [Python documentation: `None`](https://docs.python.org/3/library/constants.html#None) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.7.4")] pub(crate) struct NoneNotAtEndOfUnion; impl Violation for NoneNotAtEndOfUnion { diff --git a/crates/ruff_linter/src/rules/ruff/rules/parenthesize_chained_operators.rs b/crates/ruff_linter/src/rules/ruff/rules/parenthesize_chained_operators.rs index e7ad588a8bcf4f..7433f63f2b5530 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/parenthesize_chained_operators.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/parenthesize_chained_operators.rs @@ -34,6 +34,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// y = (d and e) or f /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct ParenthesizeChainedOperators; impl AlwaysFixableViolation for ParenthesizeChainedOperators { diff --git a/crates/ruff_linter/src/rules/ruff/rules/post_init_default.rs b/crates/ruff_linter/src/rules/ruff/rules/post_init_default.rs index b2a2da56a97565..36941a98c9c240 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/post_init_default.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/post_init_default.rs @@ -74,6 +74,7 @@ use crate::rules::ruff::helpers::{DataclassKind, dataclass_kind}; /// /// [documentation]: https://docs.python.org/3/library/dataclasses.html#init-only-variables #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.9.0")] pub(crate) struct PostInitDefault; impl Violation for PostInitDefault { diff --git a/crates/ruff_linter/src/rules/ruff/rules/pytest_raises_ambiguous_pattern.rs b/crates/ruff_linter/src/rules/ruff/rules/pytest_raises_ambiguous_pattern.rs index 3f0a8493294e63..612a832bb8286b 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/pytest_raises_ambiguous_pattern.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/pytest_raises_ambiguous_pattern.rs @@ -64,6 +64,7 @@ use crate::rules::flake8_pytest_style::rules::is_pytest_raises; /// - [Python documentation: `re.escape`](https://docs.python.org/3/library/re.html#re.escape) /// - [`pytest` documentation: `pytest.raises`](https://docs.pytest.org/en/latest/reference/reference.html#pytest-raises) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.13.0")] pub(crate) struct PytestRaisesAmbiguousPattern; impl Violation for PytestRaisesAmbiguousPattern { diff --git a/crates/ruff_linter/src/rules/ruff/rules/quadratic_list_summation.rs b/crates/ruff_linter/src/rules/ruff/rules/quadratic_list_summation.rs index 4321e004c3b24c..d4e062ad7183db 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/quadratic_list_summation.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/quadratic_list_summation.rs @@ -60,6 +60,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// /// [microbenchmarks]: https://github.com/astral-sh/ruff/issues/5073#issuecomment-1591836349 #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.285")] pub(crate) struct QuadraticListSummation; impl AlwaysFixableViolation for QuadraticListSummation { diff --git a/crates/ruff_linter/src/rules/ruff/rules/redirected_noqa.rs b/crates/ruff_linter/src/rules/ruff/rules/redirected_noqa.rs index e11a9a7ad19351..010679cf231ed6 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/redirected_noqa.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/redirected_noqa.rs @@ -25,6 +25,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// x = eval(command) # noqa: S307 /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.6.0")] pub(crate) struct RedirectedNOQA { original: String, target: String, diff --git a/crates/ruff_linter/src/rules/ruff/rules/redundant_bool_literal.rs b/crates/ruff_linter/src/rules/ruff/rules/redundant_bool_literal.rs index 3c0fafc623a8e1..4111f9522c952f 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/redundant_bool_literal.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/redundant_bool_literal.rs @@ -55,6 +55,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// [#14764]: https://github.com/python/mypy/issues/14764 /// [#5421]: https://github.com/microsoft/pyright/issues/5421 #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.8.0")] pub(crate) struct RedundantBoolLiteral { seen_others: bool, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/sort_dunder_all.rs b/crates/ruff_linter/src/rules/ruff/rules/sort_dunder_all.rs index 70fd5acd6cc748..f2dbf87474c060 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/sort_dunder_all.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/sort_dunder_all.rs @@ -89,6 +89,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// iteration order of the items in `__all__`, in which case this /// rule's fix could theoretically cause breakage. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct UnsortedDunderAll; impl Violation for UnsortedDunderAll { diff --git a/crates/ruff_linter/src/rules/ruff/rules/sort_dunder_slots.rs b/crates/ruff_linter/src/rules/ruff/rules/sort_dunder_slots.rs index e626ac8535533c..4038a9508a5794 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/sort_dunder_slots.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/sort_dunder_slots.rs @@ -83,6 +83,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// `__slots__` definition occurs, in which case this rule's fix could /// theoretically cause breakage. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.8.0")] pub(crate) struct UnsortedDunderSlots { class_name: ast::name::Name, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/starmap_zip.rs b/crates/ruff_linter/src/rules/ruff/rules/starmap_zip.rs index a92f7afb7b75be..f814bf980b1f08 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/starmap_zip.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/starmap_zip.rs @@ -41,6 +41,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// This rule will emit a diagnostic but not suggest a fix if `map` has been shadowed from its /// builtin binding. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct StarmapZip; impl Violation for StarmapZip { diff --git a/crates/ruff_linter/src/rules/ruff/rules/static_key_dict_comprehension.rs b/crates/ruff_linter/src/rules/ruff/rules/static_key_dict_comprehension.rs index 63fd8e361446d3..3cb7aa56339e99 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/static_key_dict_comprehension.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/static_key_dict_comprehension.rs @@ -28,6 +28,7 @@ use crate::Violation; /// /// [B035]: https://docs.astral.sh/ruff/rules/static-key-dict-comprehension/ #[derive(ViolationMetadata)] +#[violation_metadata(removed_since = "v0.2.0")] pub(crate) struct RuffStaticKeyDictComprehension; impl Violation for RuffStaticKeyDictComprehension { diff --git a/crates/ruff_linter/src/rules/ruff/rules/test_rules.rs b/crates/ruff_linter/src/rules/ruff/rules/test_rules.rs index c6fd18bd40f80e..d261e05ef8fe83 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/test_rules.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/test_rules.rs @@ -69,6 +69,7 @@ pub(crate) trait TestRule { /// bar /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.0.0")] pub(crate) struct StableTestRule; impl Violation for StableTestRule { @@ -102,6 +103,7 @@ impl TestRule for StableTestRule { /// bar /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.0.0")] pub(crate) struct StableTestRuleSafeFix; impl Violation for StableTestRuleSafeFix { @@ -140,6 +142,7 @@ impl TestRule for StableTestRuleSafeFix { /// bar /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.0.0")] pub(crate) struct StableTestRuleUnsafeFix; impl Violation for StableTestRuleUnsafeFix { @@ -181,6 +184,7 @@ impl TestRule for StableTestRuleUnsafeFix { /// bar /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.0.0")] pub(crate) struct StableTestRuleDisplayOnlyFix; impl Violation for StableTestRuleDisplayOnlyFix { @@ -225,6 +229,7 @@ impl TestRule for StableTestRuleDisplayOnlyFix { /// bar /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.0.0")] pub(crate) struct PreviewTestRule; impl Violation for PreviewTestRule { @@ -258,6 +263,7 @@ impl TestRule for PreviewTestRule { /// bar /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(deprecated_since = "0.0.0")] pub(crate) struct DeprecatedTestRule; impl Violation for DeprecatedTestRule { @@ -291,6 +297,7 @@ impl TestRule for DeprecatedTestRule { /// bar /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(deprecated_since = "0.0.0")] pub(crate) struct AnotherDeprecatedTestRule; impl Violation for AnotherDeprecatedTestRule { @@ -327,6 +334,7 @@ impl TestRule for AnotherDeprecatedTestRule { /// bar /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(removed_since = "0.0.0")] pub(crate) struct RemovedTestRule; impl Violation for RemovedTestRule { @@ -360,6 +368,7 @@ impl TestRule for RemovedTestRule { /// bar /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(removed_since = "0.0.0")] pub(crate) struct AnotherRemovedTestRule; impl Violation for AnotherRemovedTestRule { @@ -393,6 +402,7 @@ impl TestRule for AnotherRemovedTestRule { /// bar /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(removed_since = "0.0.0")] pub(crate) struct RedirectedFromTestRule; impl Violation for RedirectedFromTestRule { @@ -426,6 +436,7 @@ impl TestRule for RedirectedFromTestRule { /// bar /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.0.0")] pub(crate) struct RedirectedToTestRule; impl Violation for RedirectedToTestRule { @@ -459,6 +470,7 @@ impl TestRule for RedirectedToTestRule { /// bar /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(removed_since = "0.0.0")] pub(crate) struct RedirectedFromPrefixTestRule; impl Violation for RedirectedFromPrefixTestRule { @@ -495,6 +507,7 @@ impl TestRule for RedirectedFromPrefixTestRule { /// bar /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.0.0")] pub(crate) struct PanicyTestRule; impl Violation for PanicyTestRule { diff --git a/crates/ruff_linter/src/rules/ruff/rules/unnecessary_cast_to_int.rs b/crates/ruff_linter/src/rules/ruff/rules/unnecessary_cast_to_int.rs index 39c45b19e80f58..b3c34c29e0329d 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/unnecessary_cast_to_int.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/unnecessary_cast_to_int.rs @@ -45,6 +45,7 @@ use crate::{AlwaysFixableViolation, Applicability, Edit, Fix}; /// overriding the `__round__`, `__ceil__`, `__floor__`, or `__trunc__` dunder methods /// such that they don't return an integer. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct UnnecessaryCastToInt; impl AlwaysFixableViolation for UnnecessaryCastToInt { diff --git a/crates/ruff_linter/src/rules/ruff/rules/unnecessary_iterable_allocation_for_first_element.rs b/crates/ruff_linter/src/rules/ruff/rules/unnecessary_iterable_allocation_for_first_element.rs index 803adda4df7f22..06e72cbd986fa9 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/unnecessary_iterable_allocation_for_first_element.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/unnecessary_iterable_allocation_for_first_element.rs @@ -54,6 +54,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ## References /// - [Iterators and Iterables in Python: Run Efficient Iterations](https://realpython.com/python-iterators-iterables/#when-to-use-an-iterator-in-python) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.278")] pub(crate) struct UnnecessaryIterableAllocationForFirstElement { iterable: SourceCodeSnippet, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/unnecessary_key_check.rs b/crates/ruff_linter/src/rules/ruff/rules/unnecessary_key_check.rs index 72887978b3b6da..7c13fb3d1c4dea 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/unnecessary_key_check.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/unnecessary_key_check.rs @@ -29,6 +29,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// ... /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.2.0")] pub(crate) struct UnnecessaryKeyCheck; impl AlwaysFixableViolation for UnnecessaryKeyCheck { diff --git a/crates/ruff_linter/src/rules/ruff/rules/unnecessary_literal_within_deque_call.rs b/crates/ruff_linter/src/rules/ruff/rules/unnecessary_literal_within_deque_call.rs index 0eb3640ad81efd..fd317657150d6e 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/unnecessary_literal_within_deque_call.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/unnecessary_literal_within_deque_call.rs @@ -46,6 +46,7 @@ use crate::{Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `collections.deque`](https://docs.python.org/3/library/collections.html#collections.deque) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.9.0")] pub(crate) struct UnnecessaryEmptyIterableWithinDequeCall { has_maxlen: bool, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/unnecessary_nested_literal.rs b/crates/ruff_linter/src/rules/ruff/rules/unnecessary_nested_literal.rs index 91d384560b2e99..d8d3dd71510ac5 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/unnecessary_nested_literal.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/unnecessary_nested_literal.rs @@ -59,6 +59,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// /// [PEP 586](https://peps.python.org/pep-0586/) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.10.0")] pub(crate) struct UnnecessaryNestedLiteral; impl Violation for UnnecessaryNestedLiteral { diff --git a/crates/ruff_linter/src/rules/ruff/rules/unnecessary_regular_expression.rs b/crates/ruff_linter/src/rules/ruff/rules/unnecessary_regular_expression.rs index 48f2efb2ccaa15..5ccc516ee3de9a 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/unnecessary_regular_expression.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/unnecessary_regular_expression.rs @@ -55,6 +55,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python Regular Expression HOWTO: Common Problems - Use String Methods](https://docs.python.org/3/howto/regex.html#use-string-methods) #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.8.1")] pub(crate) struct UnnecessaryRegularExpression { replacement: Option, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/unnecessary_round.rs b/crates/ruff_linter/src/rules/ruff/rules/unnecessary_round.rs index baf5ea38a5a4d6..c7fe4687e86c80 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/unnecessary_round.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/unnecessary_round.rs @@ -34,6 +34,7 @@ use crate::{AlwaysFixableViolation, Applicability, Edit, Fix}; /// The fix is marked unsafe if it is not possible to guarantee that the first argument of /// `round()` is of type `int`, or if the fix deletes comments. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.12.0")] pub(crate) struct UnnecessaryRound; impl AlwaysFixableViolation for UnnecessaryRound { diff --git a/crates/ruff_linter/src/rules/ruff/rules/unraw_re_pattern.rs b/crates/ruff_linter/src/rules/ruff/rules/unraw_re_pattern.rs index 8a10129d74fa0a..74c23da2a9f86b 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/unraw_re_pattern.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/unraw_re_pattern.rs @@ -59,6 +59,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// re.compile(r"foo\bar") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.8.0")] pub(crate) struct UnrawRePattern { module: RegexModule, func: String, diff --git a/crates/ruff_linter/src/rules/ruff/rules/unsafe_markup_use.rs b/crates/ruff_linter/src/rules/ruff/rules/unsafe_markup_use.rs index 2cc04e602b5130..3adf4bc5d1e518 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/unsafe_markup_use.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/unsafe_markup_use.rs @@ -73,6 +73,7 @@ use crate::Violation; /// [markupsafe-markup]: https://markupsafe.palletsprojects.com/en/stable/escaping/#markupsafe.Markup /// [flake8-markupsafe]: https://github.com/vmagamedov/flake8-markupsafe #[derive(ViolationMetadata)] +#[violation_metadata(removed_since = "0.10.0")] pub(crate) struct RuffUnsafeMarkupUse { name: String, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/unused_async.rs b/crates/ruff_linter/src/rules/ruff/rules/unused_async.rs index b7c55dc0b0e439..ca442de8ce8583 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/unused_async.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/unused_async.rs @@ -31,6 +31,7 @@ use crate::rules::fastapi::rules::is_fastapi_route; /// bar() /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "v0.4.0")] pub(crate) struct UnusedAsync { name: String, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/unused_noqa.rs b/crates/ruff_linter/src/rules/ruff/rules/unused_noqa.rs index 52e367500b0305..e4645a5541a788 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/unused_noqa.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/unused_noqa.rs @@ -43,6 +43,7 @@ pub(crate) struct UnusedCodes { /// ## References /// - [Ruff error suppression](https://docs.astral.sh/ruff/linter/#error-suppression) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.155")] pub(crate) struct UnusedNOQA { pub codes: Option, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/unused_unpacked_variable.rs b/crates/ruff_linter/src/rules/ruff/rules/unused_unpacked_variable.rs index f17d3de60da154..a14bd35cd5f44d 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/unused_unpacked_variable.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/unused_unpacked_variable.rs @@ -46,6 +46,7 @@ use crate::{Edit, Fix, FixAvailability, Violation}; /// /// [F841]: https://docs.astral.sh/ruff/rules/unused-variable/ #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.13.0")] pub(crate) struct UnusedUnpackedVariable { pub name: String, } diff --git a/crates/ruff_linter/src/rules/ruff/rules/used_dummy_variable.rs b/crates/ruff_linter/src/rules/ruff/rules/used_dummy_variable.rs index a87fc40273faee..a63e2f679f657c 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/used_dummy_variable.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/used_dummy_variable.rs @@ -68,6 +68,7 @@ use crate::{ /// /// [PEP 8]: https://peps.python.org/pep-0008/ #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "0.8.2")] pub(crate) struct UsedDummyVariable { name: String, shadowed_kind: Option, diff --git a/crates/ruff_linter/src/rules/ruff/rules/useless_if_else.rs b/crates/ruff_linter/src/rules/ruff/rules/useless_if_else.rs index 6d7502dd56e509..bbaa49f0fa358a 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/useless_if_else.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/useless_if_else.rs @@ -22,6 +22,7 @@ use crate::checkers::ast::Checker; /// foo = x /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.9.0")] pub(crate) struct UselessIfElse; impl Violation for UselessIfElse { diff --git a/crates/ruff_linter/src/rules/ruff/rules/zip_instead_of_pairwise.rs b/crates/ruff_linter/src/rules/ruff/rules/zip_instead_of_pairwise.rs index 2c5396f8b5e322..70cb8287900392 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/zip_instead_of_pairwise.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/zip_instead_of_pairwise.rs @@ -40,6 +40,7 @@ use crate::{checkers::ast::Checker, importer::ImportRequest}; /// ## References /// - [Python documentation: `itertools.pairwise`](https://docs.python.org/3/library/itertools.html#itertools.pairwise) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.257")] pub(crate) struct ZipInsteadOfPairwise; impl Violation for ZipInsteadOfPairwise { diff --git a/crates/ruff_linter/src/rules/tryceratops/rules/error_instead_of_exception.rs b/crates/ruff_linter/src/rules/tryceratops/rules/error_instead_of_exception.rs index ebc2d40a75e878..289c318fd68e88 100644 --- a/crates/ruff_linter/src/rules/tryceratops/rules/error_instead_of_exception.rs +++ b/crates/ruff_linter/src/rules/tryceratops/rules/error_instead_of_exception.rs @@ -52,6 +52,7 @@ use crate::{Applicability, Edit, Fix, FixAvailability, Violation}; /// ## References /// - [Python documentation: `logging.exception`](https://docs.python.org/3/library/logging.html#logging.exception) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.236")] pub(crate) struct ErrorInsteadOfException; impl Violation for ErrorInsteadOfException { diff --git a/crates/ruff_linter/src/rules/tryceratops/rules/raise_vanilla_args.rs b/crates/ruff_linter/src/rules/tryceratops/rules/raise_vanilla_args.rs index c359367ded1015..bea012e05ce047 100644 --- a/crates/ruff_linter/src/rules/tryceratops/rules/raise_vanilla_args.rs +++ b/crates/ruff_linter/src/rules/tryceratops/rules/raise_vanilla_args.rs @@ -44,6 +44,7 @@ use crate::checkers::ast::Checker; /// raise CantBeNegative(x) /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.236")] pub(crate) struct RaiseVanillaArgs; impl Violation for RaiseVanillaArgs { diff --git a/crates/ruff_linter/src/rules/tryceratops/rules/raise_vanilla_class.rs b/crates/ruff_linter/src/rules/tryceratops/rules/raise_vanilla_class.rs index 6549f3caad079c..3de68c5f30a197 100644 --- a/crates/ruff_linter/src/rules/tryceratops/rules/raise_vanilla_class.rs +++ b/crates/ruff_linter/src/rules/tryceratops/rules/raise_vanilla_class.rs @@ -53,6 +53,7 @@ use crate::checkers::ast::Checker; /// logger.error("Oops") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.236")] pub(crate) struct RaiseVanillaClass; impl Violation for RaiseVanillaClass { diff --git a/crates/ruff_linter/src/rules/tryceratops/rules/raise_within_try.rs b/crates/ruff_linter/src/rules/tryceratops/rules/raise_within_try.rs index ce1489637781ff..cacab604c7a3d6 100644 --- a/crates/ruff_linter/src/rules/tryceratops/rules/raise_within_try.rs +++ b/crates/ruff_linter/src/rules/tryceratops/rules/raise_within_try.rs @@ -50,6 +50,7 @@ use crate::checkers::ast::Checker; /// raise /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.233")] pub(crate) struct RaiseWithinTry; impl Violation for RaiseWithinTry { diff --git a/crates/ruff_linter/src/rules/tryceratops/rules/reraise_no_cause.rs b/crates/ruff_linter/src/rules/tryceratops/rules/reraise_no_cause.rs index a50d64136e3f35..320869e13c62fa 100644 --- a/crates/ruff_linter/src/rules/tryceratops/rules/reraise_no_cause.rs +++ b/crates/ruff_linter/src/rules/tryceratops/rules/reraise_no_cause.rs @@ -37,6 +37,7 @@ use crate::Violation; /// /// [B904]: https://docs.astral.sh/ruff/rules/raise-without-from-inside-except/ #[derive(ViolationMetadata)] +#[violation_metadata(removed_since = "v0.2.0")] pub(crate) struct ReraiseNoCause; /// TRY200 diff --git a/crates/ruff_linter/src/rules/tryceratops/rules/try_consider_else.rs b/crates/ruff_linter/src/rules/tryceratops/rules/try_consider_else.rs index cbd24bf61ef803..317777e9fb0738 100644 --- a/crates/ruff_linter/src/rules/tryceratops/rules/try_consider_else.rs +++ b/crates/ruff_linter/src/rules/tryceratops/rules/try_consider_else.rs @@ -51,6 +51,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: Errors and Exceptions](https://docs.python.org/3/tutorial/errors.html) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.229")] pub(crate) struct TryConsiderElse; impl Violation for TryConsiderElse { diff --git a/crates/ruff_linter/src/rules/tryceratops/rules/type_check_without_type_error.rs b/crates/ruff_linter/src/rules/tryceratops/rules/type_check_without_type_error.rs index 59eedace937a55..ee8b06cd904902 100644 --- a/crates/ruff_linter/src/rules/tryceratops/rules/type_check_without_type_error.rs +++ b/crates/ruff_linter/src/rules/tryceratops/rules/type_check_without_type_error.rs @@ -36,6 +36,7 @@ use crate::checkers::ast::Checker; /// ## References /// - [Python documentation: `TypeError`](https://docs.python.org/3/library/exceptions.html#TypeError) #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.230")] pub(crate) struct TypeCheckWithoutTypeError; impl Violation for TypeCheckWithoutTypeError { diff --git a/crates/ruff_linter/src/rules/tryceratops/rules/useless_try_except.rs b/crates/ruff_linter/src/rules/tryceratops/rules/useless_try_except.rs index f52a3e95c21cce..d9023378ecf3e6 100644 --- a/crates/ruff_linter/src/rules/tryceratops/rules/useless_try_except.rs +++ b/crates/ruff_linter/src/rules/tryceratops/rules/useless_try_except.rs @@ -29,6 +29,7 @@ use crate::checkers::ast::Checker; /// bar() /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "0.7.0")] pub(crate) struct UselessTryExcept; impl Violation for UselessTryExcept { diff --git a/crates/ruff_linter/src/rules/tryceratops/rules/verbose_log_message.rs b/crates/ruff_linter/src/rules/tryceratops/rules/verbose_log_message.rs index 9b8c6619c825fe..1c107065f40477 100644 --- a/crates/ruff_linter/src/rules/tryceratops/rules/verbose_log_message.rs +++ b/crates/ruff_linter/src/rules/tryceratops/rules/verbose_log_message.rs @@ -34,6 +34,7 @@ use crate::rules::tryceratops::helpers::LoggerCandidateVisitor; /// logger.exception("Found an error") /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.250")] pub(crate) struct VerboseLogMessage; impl Violation for VerboseLogMessage { diff --git a/crates/ruff_linter/src/rules/tryceratops/rules/verbose_raise.rs b/crates/ruff_linter/src/rules/tryceratops/rules/verbose_raise.rs index c330632c9776d7..033f9a93f94c55 100644 --- a/crates/ruff_linter/src/rules/tryceratops/rules/verbose_raise.rs +++ b/crates/ruff_linter/src/rules/tryceratops/rules/verbose_raise.rs @@ -36,6 +36,7 @@ use crate::{AlwaysFixableViolation, Edit, Fix}; /// This rule's fix is marked as unsafe, as it doesn't properly handle bound /// exceptions that are shadowed between the `except` and `raise` statements. #[derive(ViolationMetadata)] +#[violation_metadata(stable_since = "v0.0.231")] pub(crate) struct VerboseRaise; impl AlwaysFixableViolation for VerboseRaise { diff --git a/crates/ruff_linter/src/violation.rs b/crates/ruff_linter/src/violation.rs index bcf671d4894d5e..dc77c99bdd0df5 100644 --- a/crates/ruff_linter/src/violation.rs +++ b/crates/ruff_linter/src/violation.rs @@ -6,7 +6,10 @@ use ruff_db::diagnostic::Diagnostic; use ruff_source_file::SourceFile; use ruff_text_size::TextRange; -use crate::{codes::Rule, message::create_lint_diagnostic}; +use crate::{ + codes::{Rule, RuleGroup}, + message::create_lint_diagnostic, +}; #[derive(Debug, Copy, Clone, Serialize)] pub enum FixAvailability { @@ -32,6 +35,15 @@ pub trait ViolationMetadata { /// Returns an explanation of what this violation catches, /// why it's bad, and what users should do instead. fn explain() -> Option<&'static str>; + + /// Returns the rule group for this violation. + fn group() -> RuleGroup; + + /// Returns the file where the violation is declared. + fn file() -> &'static str; + + /// Returns the 1-based line where the violation is declared. + fn line() -> u32; } pub trait Violation: ViolationMetadata + Sized { diff --git a/crates/ruff_macros/src/lib.rs b/crates/ruff_macros/src/lib.rs index edc0c363df60a3..f1c8edb0475475 100644 --- a/crates/ruff_macros/src/lib.rs +++ b/crates/ruff_macros/src/lib.rs @@ -82,7 +82,7 @@ pub fn cache_key(input: TokenStream) -> TokenStream { TokenStream::from(stream) } -#[proc_macro_derive(ViolationMetadata)] +#[proc_macro_derive(ViolationMetadata, attributes(violation_metadata))] pub fn derive_violation_metadata(item: TokenStream) -> TokenStream { let input: DeriveInput = parse_macro_input!(item); diff --git a/crates/ruff_macros/src/map_codes.rs b/crates/ruff_macros/src/map_codes.rs index cd20179cbe1fb4..08878fc3156eab 100644 --- a/crates/ruff_macros/src/map_codes.rs +++ b/crates/ruff_macros/src/map_codes.rs @@ -20,8 +20,6 @@ struct Rule { linter: Ident, /// The code associated with the rule, e.g., `"E112"`. code: LitStr, - /// The rule group identifier, e.g., `RuleGroup::Preview`. - group: Path, /// The path to the struct implementing the rule, e.g. /// `rules::pycodestyle::rules::logical_lines::NoIndentedBlock` path: Path, @@ -104,7 +102,7 @@ pub(crate) fn map_codes(func: &ItemFn) -> syn::Result { linter, rules .iter() - .map(|(code, Rule { group, attrs, .. })| (code.as_str(), group, attrs)), + .map(|(code, Rule { attrs, .. })| (code.as_str(), attrs)), )); output.extend(quote! { @@ -254,7 +252,6 @@ fn generate_rule_to_code(linter_to_rules: &BTreeMap NoqaCode(crate::registry::Linter::#linter.common_prefix(), #code), }); - - rule_group_match_arms.extend(quote! { - #(#attrs)* Rule::#rule_name => #group, - }); } let rule_to_code = quote! { @@ -307,28 +299,20 @@ See also https://github.com/astral-sh/ruff/issues/2186. } } - pub fn group(&self) -> RuleGroup { - use crate::registry::RuleNamespace; - - match self { - #rule_group_match_arms - } - } - pub fn is_preview(&self) -> bool { - matches!(self.group(), RuleGroup::Preview) + matches!(self.group(), RuleGroup::Preview { .. }) } pub(crate) fn is_stable(&self) -> bool { - matches!(self.group(), RuleGroup::Stable) + matches!(self.group(), RuleGroup::Stable { .. }) } pub fn is_deprecated(&self) -> bool { - matches!(self.group(), RuleGroup::Deprecated) + matches!(self.group(), RuleGroup::Deprecated { .. }) } pub fn is_removed(&self) -> bool { - matches!(self.group(), RuleGroup::Removed) + matches!(self.group(), RuleGroup::Removed { .. }) } } @@ -403,6 +387,9 @@ fn register_rules<'a>(input: impl Iterator) -> TokenStream { let mut rule_message_formats_match_arms = quote!(); let mut rule_fixable_match_arms = quote!(); let mut rule_explanation_match_arms = quote!(); + let mut rule_group_match_arms = quote!(); + let mut rule_file_match_arms = quote!(); + let mut rule_line_match_arms = quote!(); for Rule { name, attrs, path, .. @@ -420,6 +407,15 @@ fn register_rules<'a>(input: impl Iterator) -> TokenStream { quote! {#(#attrs)* Self::#name => <#path as crate::Violation>::FIX_AVAILABILITY,}, ); rule_explanation_match_arms.extend(quote! {#(#attrs)* Self::#name => #path::explain(),}); + rule_group_match_arms.extend( + quote! {#(#attrs)* Self::#name => <#path as crate::ViolationMetadata>::group(),}, + ); + rule_file_match_arms.extend( + quote! {#(#attrs)* Self::#name => <#path as crate::ViolationMetadata>::file(),}, + ); + rule_line_match_arms.extend( + quote! {#(#attrs)* Self::#name => <#path as crate::ViolationMetadata>::line(),}, + ); } quote! { @@ -455,12 +451,24 @@ fn register_rules<'a>(input: impl Iterator) -> TokenStream { pub const fn fixable(&self) -> crate::FixAvailability { match self { #rule_fixable_match_arms } } + + pub fn group(&self) -> crate::codes::RuleGroup { + match self { #rule_group_match_arms } + } + + pub fn file(&self) -> &'static str { + match self { #rule_file_match_arms } + } + + pub fn line(&self) -> u32 { + match self { #rule_line_match_arms } + } } } } impl Parse for Rule { - /// Parses a match arm such as `(Pycodestyle, "E112") => (RuleGroup::Preview, rules::pycodestyle::rules::logical_lines::NoIndentedBlock),` + /// Parses a match arm such as `(Pycodestyle, "E112") => rules::pycodestyle::rules::logical_lines::NoIndentedBlock,` fn parse(input: syn::parse::ParseStream) -> syn::Result { let attrs = Attribute::parse_outer(input)?; let pat_tuple; @@ -469,18 +477,13 @@ impl Parse for Rule { let _: Token!(,) = pat_tuple.parse()?; let code: LitStr = pat_tuple.parse()?; let _: Token!(=>) = input.parse()?; - let pat_tuple; - parenthesized!(pat_tuple in input); - let group: Path = pat_tuple.parse()?; - let _: Token!(,) = pat_tuple.parse()?; - let rule_path: Path = pat_tuple.parse()?; + let rule_path: Path = input.parse()?; let _: Token!(,) = input.parse()?; let rule_name = rule_path.segments.last().unwrap().ident.clone(); Ok(Rule { name: rule_name, linter, code, - group, path: rule_path, attrs, }) diff --git a/crates/ruff_macros/src/rule_code_prefix.rs b/crates/ruff_macros/src/rule_code_prefix.rs index 489718cd681e22..3b3c74fc10c1a5 100644 --- a/crates/ruff_macros/src/rule_code_prefix.rs +++ b/crates/ruff_macros/src/rule_code_prefix.rs @@ -2,11 +2,11 @@ use std::collections::{BTreeMap, BTreeSet}; use proc_macro2::Span; use quote::quote; -use syn::{Attribute, Ident, Path}; +use syn::{Attribute, Ident}; pub(crate) fn expand<'a>( prefix_ident: &Ident, - variants: impl Iterator)>, + variants: impl Iterator)>, ) -> proc_macro2::TokenStream { // Build up a map from prefix to matching RuleCodes. let mut prefix_to_codes: BTreeMap> = BTreeMap::default(); diff --git a/crates/ruff_macros/src/violation_metadata.rs b/crates/ruff_macros/src/violation_metadata.rs index 3bdceb40790e65..2fdabfabcc7542 100644 --- a/crates/ruff_macros/src/violation_metadata.rs +++ b/crates/ruff_macros/src/violation_metadata.rs @@ -5,6 +5,13 @@ use syn::{Attribute, DeriveInput, Error, Lit, LitStr, Meta}; pub(crate) fn violation_metadata(input: DeriveInput) -> syn::Result { let docs = get_docs(&input.attrs)?; + let Some(group) = get_rule_status(&input.attrs)? else { + return Err(Error::new_spanned( + input, + "Missing required rule group metadata", + )); + }; + let name = input.ident; let (impl_generics, ty_generics, where_clause) = &input.generics.split_for_impl(); @@ -20,6 +27,18 @@ pub(crate) fn violation_metadata(input: DeriveInput) -> syn::Result fn explain() -> Option<&'static str> { Some(#docs) } + + fn group() -> crate::codes::RuleGroup { + crate::codes::#group + } + + fn file() -> &'static str { + file!() + } + + fn line() -> u32 { + line!() + } } }) } @@ -43,6 +62,49 @@ fn get_docs(attrs: &[Attribute]) -> syn::Result { Ok(explanation) } +/// Extract the rule status attribute. +/// +/// These attributes look like: +/// +/// ```ignore +/// #[violation_metadata(stable_since = "1.2.3")] +/// struct MyRule; +/// ``` +/// +/// The result is returned as a `TokenStream` so that the version string literal can be combined +/// with the proper `RuleGroup` variant, e.g. `RuleGroup::Stable` for `stable_since` above. +fn get_rule_status(attrs: &[Attribute]) -> syn::Result> { + let mut group = None; + for attr in attrs { + if attr.path().is_ident("violation_metadata") { + attr.parse_nested_meta(|meta| { + if meta.path.is_ident("stable_since") { + let lit: LitStr = meta.value()?.parse()?; + group = Some(quote!(RuleGroup::Stable { since: #lit })); + return Ok(()); + } else if meta.path.is_ident("preview_since") { + let lit: LitStr = meta.value()?.parse()?; + group = Some(quote!(RuleGroup::Preview { since: #lit })); + return Ok(()); + } else if meta.path.is_ident("deprecated_since") { + let lit: LitStr = meta.value()?.parse()?; + group = Some(quote!(RuleGroup::Deprecated { since: #lit })); + return Ok(()); + } else if meta.path.is_ident("removed_since") { + let lit: LitStr = meta.value()?.parse()?; + group = Some(quote!(RuleGroup::Removed { since: #lit })); + return Ok(()); + } + Err(Error::new_spanned( + attr, + "unimplemented violation metadata option", + )) + })?; + } + } + Ok(group) +} + fn parse_attr<'a, const LEN: usize>( path: [&'static str; LEN], attr: &'a Attribute, diff --git a/scripts/add_rule.py b/scripts/add_rule.py index 400c5ac6ec0566..48ecd347361e64 100755 --- a/scripts/add_rule.py +++ b/scripts/add_rule.py @@ -109,6 +109,7 @@ def main(*, name: str, prefix: str, code: str, linter: str) -> None: /// ```python /// ``` #[derive(ViolationMetadata)] +#[violation_metadata(preview_since = "TODO: current version + 1")] pub(crate) struct {name}; impl Violation for {name} {{ @@ -140,7 +141,7 @@ def main(*, name: str, prefix: str, code: str, linter: str) -> None: linter_name = linter.split(" ")[0].replace("-", "_") rule = f"""rules::{linter_name}::rules::{name}""" lines.append( - " " * 8 + f"""({variant}, "{code}") => (RuleGroup::Preview, {rule}),\n""", + " " * 8 + f"""({variant}, "{code}") => {rule},\n""", ) lines.sort() text += "".join(lines)