diff --git a/crates/ruff_linter/src/rules/pydocstyle/mod.rs b/crates/ruff_linter/src/rules/pydocstyle/mod.rs index 59931647d9e9b..fad6a274a41af 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/mod.rs +++ b/crates/ruff_linter/src/rules/pydocstyle/mod.rs @@ -12,6 +12,7 @@ mod tests { use test_case::test_case; use crate::registry::Rule; + use crate::settings::types::PreviewMode; use crate::test::test_path; use crate::{assert_messages, settings}; @@ -107,6 +108,33 @@ mod tests { Ok(()) } + #[test_case(Rule::TripleSingleQuotes, Path::new("D.py"))] + #[test_case(Rule::TripleSingleQuotes, Path::new("D300.py"))] + fn preview_rules(rule_code: Rule, path: &Path) -> Result<()> { + // Tests for rules with preview features + let snapshot = format!( + "preview__{}_{}", + rule_code.noqa_code(), + path.to_string_lossy() + ); + let diagnostics = test_path( + Path::new("pydocstyle").join(path).as_path(), + &settings::LinterSettings { + pydocstyle: Settings { + convention: None, + ignore_decorators: BTreeSet::from_iter(["functools.wraps".to_string()]), + property_decorators: BTreeSet::from_iter([ + "gi.repository.GObject.Property".to_string() + ]), + }, + preview: PreviewMode::Enabled, + ..settings::LinterSettings::for_rule(rule_code) + }, + )?; + assert_messages!(snapshot, diagnostics); + Ok(()) + } + #[test] fn bom() -> Result<()> { let diagnostics = test_path( diff --git a/crates/ruff_linter/src/rules/pydocstyle/snapshots/ruff_linter__rules__pydocstyle__tests__D300_D.py.snap b/crates/ruff_linter/src/rules/pydocstyle/snapshots/ruff_linter__rules__pydocstyle__tests__D300_D.py.snap index 419c4e237ae64..6340613a91b53 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/snapshots/ruff_linter__rules__pydocstyle__tests__D300_D.py.snap +++ b/crates/ruff_linter/src/rules/pydocstyle/snapshots/ruff_linter__rules__pydocstyle__tests__D300_D.py.snap @@ -1,7 +1,7 @@ --- source: crates/ruff_linter/src/rules/pydocstyle/mod.rs --- -D.py:307:5: D300 [*] Use triple double quotes `"""` +D.py:307:5: D300 Use triple double quotes `"""` | 305 | @expect('D300: Use """triple double quotes""" (found \'\'\'-quotes)') 306 | def triple_single_quotes_raw(): @@ -10,17 +10,7 @@ D.py:307:5: D300 [*] Use triple double quotes `"""` | = help: Convert to triple double quotes -ℹ Fix -304 304 | -305 305 | @expect('D300: Use """triple double quotes""" (found \'\'\'-quotes)') -306 306 | def triple_single_quotes_raw(): -307 |- r'''Summary.''' - 307 |+ r"""Summary.""" -308 308 | -309 309 | -310 310 | @expect('D300: Use """triple double quotes""" (found \'\'\'-quotes)') - -D.py:312:5: D300 [*] Use triple double quotes `"""` +D.py:312:5: D300 Use triple double quotes `"""` | 310 | @expect('D300: Use """triple double quotes""" (found \'\'\'-quotes)') 311 | def triple_single_quotes_raw_uppercase(): @@ -29,17 +19,7 @@ D.py:312:5: D300 [*] Use triple double quotes `"""` | = help: Convert to triple double quotes -ℹ Fix -309 309 | -310 310 | @expect('D300: Use """triple double quotes""" (found \'\'\'-quotes)') -311 311 | def triple_single_quotes_raw_uppercase(): -312 |- R'''Summary.''' - 312 |+ R"""Summary.""" -313 313 | -314 314 | -315 315 | @expect('D300: Use """triple double quotes""" (found \'-quotes)') - -D.py:317:5: D300 [*] Use triple double quotes `"""` +D.py:317:5: D300 Use triple double quotes `"""` | 315 | @expect('D300: Use """triple double quotes""" (found \'-quotes)') 316 | def single_quotes_raw(): @@ -48,17 +28,7 @@ D.py:317:5: D300 [*] Use triple double quotes `"""` | = help: Convert to triple double quotes -ℹ Fix -314 314 | -315 315 | @expect('D300: Use """triple double quotes""" (found \'-quotes)') -316 316 | def single_quotes_raw(): -317 |- r'Summary.' - 317 |+ r"""Summary.""" -318 318 | -319 319 | -320 320 | @expect('D300: Use """triple double quotes""" (found \'-quotes)') - -D.py:322:5: D300 [*] Use triple double quotes `"""` +D.py:322:5: D300 Use triple double quotes `"""` | 320 | @expect('D300: Use """triple double quotes""" (found \'-quotes)') 321 | def single_quotes_raw_uppercase(): @@ -67,17 +37,7 @@ D.py:322:5: D300 [*] Use triple double quotes `"""` | = help: Convert to triple double quotes -ℹ Fix -319 319 | -320 320 | @expect('D300: Use """triple double quotes""" (found \'-quotes)') -321 321 | def single_quotes_raw_uppercase(): -322 |- R'Summary.' - 322 |+ R"""Summary.""" -323 323 | -324 324 | -325 325 | @expect('D300: Use """triple double quotes""" (found \'-quotes)') - -D.py:328:5: D300 [*] Use triple double quotes `"""` +D.py:328:5: D300 Use triple double quotes `"""` | 326 | @expect('D301: Use r""" if any backslashes in a docstring') 327 | def single_quotes_raw_uppercase_backslash(): @@ -86,17 +46,7 @@ D.py:328:5: D300 [*] Use triple double quotes `"""` | = help: Convert to triple double quotes -ℹ Fix -325 325 | @expect('D300: Use """triple double quotes""" (found \'-quotes)') -326 326 | @expect('D301: Use r""" if any backslashes in a docstring') -327 327 | def single_quotes_raw_uppercase_backslash(): -328 |- R'Sum\mary.' - 328 |+ R"""Sum\mary.""" -329 329 | -330 330 | -331 331 | @expect('D301: Use r""" if any backslashes in a docstring') - -D.py:645:5: D300 [*] Use triple double quotes `"""` +D.py:645:5: D300 Use triple double quotes `"""` | 644 | def single_line_docstring_with_an_escaped_backslash(): 645 | "\ @@ -108,19 +58,7 @@ D.py:645:5: D300 [*] Use triple double quotes `"""` | = help: Convert to triple double quotes -ℹ Fix -642 642 | -643 643 | -644 644 | def single_line_docstring_with_an_escaped_backslash(): -645 |- "\ -646 |- " - 645 |+ """\ - 646 |+ """ -647 647 | -648 648 | class StatementOnSameLineAsDocstring: -649 649 | "After this docstring there's another statement on the same line separated by a semicolon." ; priorities=1 - -D.py:649:5: D300 [*] Use triple double quotes `"""` +D.py:649:5: D300 Use triple double quotes `"""` | 648 | class StatementOnSameLineAsDocstring: 649 | "After this docstring there's another statement on the same line separated by a semicolon." ; priorities=1 @@ -130,17 +68,7 @@ D.py:649:5: D300 [*] Use triple double quotes `"""` | = help: Convert to triple double quotes -ℹ Fix -646 646 | " -647 647 | -648 648 | class StatementOnSameLineAsDocstring: -649 |- "After this docstring there's another statement on the same line separated by a semicolon." ; priorities=1 - 649 |+ """After this docstring there's another statement on the same line separated by a semicolon.""" ; priorities=1 -650 650 | def sort_services(self): -651 651 | pass -652 652 | - -D.py:654:5: D300 [*] Use triple double quotes `"""` +D.py:654:5: D300 Use triple double quotes `"""` | 653 | class StatementOnSameLineAsDocstring: 654 | "After this docstring there's another statement on the same line separated by a semicolon."; priorities=1 @@ -148,17 +76,7 @@ D.py:654:5: D300 [*] Use triple double quotes `"""` | = help: Convert to triple double quotes -ℹ Fix -651 651 | pass -652 652 | -653 653 | class StatementOnSameLineAsDocstring: -654 |- "After this docstring there's another statement on the same line separated by a semicolon."; priorities=1 - 654 |+ """After this docstring there's another statement on the same line separated by a semicolon."""; priorities=1 -655 655 | -656 656 | -657 657 | class CommentAfterDocstring: - -D.py:658:5: D300 [*] Use triple double quotes `"""` +D.py:658:5: D300 Use triple double quotes `"""` | 657 | class CommentAfterDocstring: 658 | "After this docstring there's a comment." # priorities=1 @@ -168,17 +86,7 @@ D.py:658:5: D300 [*] Use triple double quotes `"""` | = help: Convert to triple double quotes -ℹ Fix -655 655 | -656 656 | -657 657 | class CommentAfterDocstring: -658 |- "After this docstring there's a comment." # priorities=1 - 658 |+ """After this docstring there's a comment.""" # priorities=1 -659 659 | def sort_services(self): -660 660 | pass -661 661 | - -D.py:664:5: D300 [*] Use triple double quotes `"""` +D.py:664:5: D300 Use triple double quotes `"""` | 663 | def newline_after_closing_quote(self): 664 | "We enforce a newline after the closing quote for a multi-line docstring \ @@ -188,13 +96,4 @@ D.py:664:5: D300 [*] Use triple double quotes `"""` | = help: Convert to triple double quotes -ℹ Fix -661 661 | -662 662 | -663 663 | def newline_after_closing_quote(self): -664 |- "We enforce a newline after the closing quote for a multi-line docstring \ -665 |- but continuations shouldn't be considered multi-line" - 664 |+ """We enforce a newline after the closing quote for a multi-line docstring \ - 665 |+ but continuations shouldn't be considered multi-line""" - diff --git a/crates/ruff_linter/src/rules/pydocstyle/snapshots/ruff_linter__rules__pydocstyle__tests__D300_D300.py.snap b/crates/ruff_linter/src/rules/pydocstyle/snapshots/ruff_linter__rules__pydocstyle__tests__D300_D300.py.snap index 3b1b637e90a4c..6f2b1e71b4683 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/snapshots/ruff_linter__rules__pydocstyle__tests__D300_D300.py.snap +++ b/crates/ruff_linter/src/rules/pydocstyle/snapshots/ruff_linter__rules__pydocstyle__tests__D300_D300.py.snap @@ -9,7 +9,7 @@ D300.py:6:5: D300 Use triple double quotes `"""` | = help: Convert to triple double quotes -D300.py:10:5: D300 [*] Use triple double quotes `"""` +D300.py:10:5: D300 Use triple double quotes `"""` | 9 | def contains_quote(): 10 | 'Sum"\\mary.' @@ -17,11 +17,4 @@ D300.py:10:5: D300 [*] Use triple double quotes `"""` | = help: Convert to triple double quotes -ℹ Fix -7 7 | -8 8 | -9 9 | def contains_quote(): -10 |- 'Sum"\\mary.' - 10 |+ """Sum"\\mary.""" - diff --git a/crates/ruff_linter/src/rules/pydocstyle/snapshots/ruff_linter__rules__pydocstyle__tests__bom.snap b/crates/ruff_linter/src/rules/pydocstyle/snapshots/ruff_linter__rules__pydocstyle__tests__bom.snap index 53d779dfaf713..10f9417ddf3e1 100644 --- a/crates/ruff_linter/src/rules/pydocstyle/snapshots/ruff_linter__rules__pydocstyle__tests__bom.snap +++ b/crates/ruff_linter/src/rules/pydocstyle/snapshots/ruff_linter__rules__pydocstyle__tests__bom.snap @@ -1,15 +1,11 @@ --- source: crates/ruff_linter/src/rules/pydocstyle/mod.rs --- -bom.py:1:1: D300 [*] Use triple double quotes `"""` +bom.py:1:1: D300 Use triple double quotes `"""` | 1 | ''' SAM macro definitions ''' | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ D300 | = help: Convert to triple double quotes -ℹ Fix -1 |-''' SAM macro definitions ''' - 1 |+""" SAM macro definitions """ - diff --git a/crates/ruff_linter/src/rules/pydocstyle/snapshots/ruff_linter__rules__pydocstyle__tests__preview__D300_D.py.snap b/crates/ruff_linter/src/rules/pydocstyle/snapshots/ruff_linter__rules__pydocstyle__tests__preview__D300_D.py.snap new file mode 100644 index 0000000000000..419c4e237ae64 --- /dev/null +++ b/crates/ruff_linter/src/rules/pydocstyle/snapshots/ruff_linter__rules__pydocstyle__tests__preview__D300_D.py.snap @@ -0,0 +1,200 @@ +--- +source: crates/ruff_linter/src/rules/pydocstyle/mod.rs +--- +D.py:307:5: D300 [*] Use triple double quotes `"""` + | +305 | @expect('D300: Use """triple double quotes""" (found \'\'\'-quotes)') +306 | def triple_single_quotes_raw(): +307 | r'''Summary.''' + | ^^^^^^^^^^^^^^^ D300 + | + = help: Convert to triple double quotes + +ℹ Fix +304 304 | +305 305 | @expect('D300: Use """triple double quotes""" (found \'\'\'-quotes)') +306 306 | def triple_single_quotes_raw(): +307 |- r'''Summary.''' + 307 |+ r"""Summary.""" +308 308 | +309 309 | +310 310 | @expect('D300: Use """triple double quotes""" (found \'\'\'-quotes)') + +D.py:312:5: D300 [*] Use triple double quotes `"""` + | +310 | @expect('D300: Use """triple double quotes""" (found \'\'\'-quotes)') +311 | def triple_single_quotes_raw_uppercase(): +312 | R'''Summary.''' + | ^^^^^^^^^^^^^^^ D300 + | + = help: Convert to triple double quotes + +ℹ Fix +309 309 | +310 310 | @expect('D300: Use """triple double quotes""" (found \'\'\'-quotes)') +311 311 | def triple_single_quotes_raw_uppercase(): +312 |- R'''Summary.''' + 312 |+ R"""Summary.""" +313 313 | +314 314 | +315 315 | @expect('D300: Use """triple double quotes""" (found \'-quotes)') + +D.py:317:5: D300 [*] Use triple double quotes `"""` + | +315 | @expect('D300: Use """triple double quotes""" (found \'-quotes)') +316 | def single_quotes_raw(): +317 | r'Summary.' + | ^^^^^^^^^^^ D300 + | + = help: Convert to triple double quotes + +ℹ Fix +314 314 | +315 315 | @expect('D300: Use """triple double quotes""" (found \'-quotes)') +316 316 | def single_quotes_raw(): +317 |- r'Summary.' + 317 |+ r"""Summary.""" +318 318 | +319 319 | +320 320 | @expect('D300: Use """triple double quotes""" (found \'-quotes)') + +D.py:322:5: D300 [*] Use triple double quotes `"""` + | +320 | @expect('D300: Use """triple double quotes""" (found \'-quotes)') +321 | def single_quotes_raw_uppercase(): +322 | R'Summary.' + | ^^^^^^^^^^^ D300 + | + = help: Convert to triple double quotes + +ℹ Fix +319 319 | +320 320 | @expect('D300: Use """triple double quotes""" (found \'-quotes)') +321 321 | def single_quotes_raw_uppercase(): +322 |- R'Summary.' + 322 |+ R"""Summary.""" +323 323 | +324 324 | +325 325 | @expect('D300: Use """triple double quotes""" (found \'-quotes)') + +D.py:328:5: D300 [*] Use triple double quotes `"""` + | +326 | @expect('D301: Use r""" if any backslashes in a docstring') +327 | def single_quotes_raw_uppercase_backslash(): +328 | R'Sum\mary.' + | ^^^^^^^^^^^^ D300 + | + = help: Convert to triple double quotes + +ℹ Fix +325 325 | @expect('D300: Use """triple double quotes""" (found \'-quotes)') +326 326 | @expect('D301: Use r""" if any backslashes in a docstring') +327 327 | def single_quotes_raw_uppercase_backslash(): +328 |- R'Sum\mary.' + 328 |+ R"""Sum\mary.""" +329 329 | +330 330 | +331 331 | @expect('D301: Use r""" if any backslashes in a docstring') + +D.py:645:5: D300 [*] Use triple double quotes `"""` + | +644 | def single_line_docstring_with_an_escaped_backslash(): +645 | "\ + | _____^ +646 | | " + | |_____^ D300 +647 | +648 | class StatementOnSameLineAsDocstring: + | + = help: Convert to triple double quotes + +ℹ Fix +642 642 | +643 643 | +644 644 | def single_line_docstring_with_an_escaped_backslash(): +645 |- "\ +646 |- " + 645 |+ """\ + 646 |+ """ +647 647 | +648 648 | class StatementOnSameLineAsDocstring: +649 649 | "After this docstring there's another statement on the same line separated by a semicolon." ; priorities=1 + +D.py:649:5: D300 [*] Use triple double quotes `"""` + | +648 | class StatementOnSameLineAsDocstring: +649 | "After this docstring there's another statement on the same line separated by a semicolon." ; priorities=1 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ D300 +650 | def sort_services(self): +651 | pass + | + = help: Convert to triple double quotes + +ℹ Fix +646 646 | " +647 647 | +648 648 | class StatementOnSameLineAsDocstring: +649 |- "After this docstring there's another statement on the same line separated by a semicolon." ; priorities=1 + 649 |+ """After this docstring there's another statement on the same line separated by a semicolon.""" ; priorities=1 +650 650 | def sort_services(self): +651 651 | pass +652 652 | + +D.py:654:5: D300 [*] Use triple double quotes `"""` + | +653 | class StatementOnSameLineAsDocstring: +654 | "After this docstring there's another statement on the same line separated by a semicolon."; priorities=1 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ D300 + | + = help: Convert to triple double quotes + +ℹ Fix +651 651 | pass +652 652 | +653 653 | class StatementOnSameLineAsDocstring: +654 |- "After this docstring there's another statement on the same line separated by a semicolon."; priorities=1 + 654 |+ """After this docstring there's another statement on the same line separated by a semicolon."""; priorities=1 +655 655 | +656 656 | +657 657 | class CommentAfterDocstring: + +D.py:658:5: D300 [*] Use triple double quotes `"""` + | +657 | class CommentAfterDocstring: +658 | "After this docstring there's a comment." # priorities=1 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ D300 +659 | def sort_services(self): +660 | pass + | + = help: Convert to triple double quotes + +ℹ Fix +655 655 | +656 656 | +657 657 | class CommentAfterDocstring: +658 |- "After this docstring there's a comment." # priorities=1 + 658 |+ """After this docstring there's a comment.""" # priorities=1 +659 659 | def sort_services(self): +660 660 | pass +661 661 | + +D.py:664:5: D300 [*] Use triple double quotes `"""` + | +663 | def newline_after_closing_quote(self): +664 | "We enforce a newline after the closing quote for a multi-line docstring \ + | _____^ +665 | | but continuations shouldn't be considered multi-line" + | |_________________________________________________________^ D300 + | + = help: Convert to triple double quotes + +ℹ Fix +661 661 | +662 662 | +663 663 | def newline_after_closing_quote(self): +664 |- "We enforce a newline after the closing quote for a multi-line docstring \ +665 |- but continuations shouldn't be considered multi-line" + 664 |+ """We enforce a newline after the closing quote for a multi-line docstring \ + 665 |+ but continuations shouldn't be considered multi-line""" + + diff --git a/crates/ruff_linter/src/rules/pydocstyle/snapshots/ruff_linter__rules__pydocstyle__tests__preview__D300_D300.py.snap b/crates/ruff_linter/src/rules/pydocstyle/snapshots/ruff_linter__rules__pydocstyle__tests__preview__D300_D300.py.snap new file mode 100644 index 0000000000000..3b1b637e90a4c --- /dev/null +++ b/crates/ruff_linter/src/rules/pydocstyle/snapshots/ruff_linter__rules__pydocstyle__tests__preview__D300_D300.py.snap @@ -0,0 +1,27 @@ +--- +source: crates/ruff_linter/src/rules/pydocstyle/mod.rs +--- +D300.py:6:5: D300 Use triple double quotes `"""` + | +5 | def ends_in_quote(): +6 | 'Sum\\mary."' + | ^^^^^^^^^^^^^ D300 + | + = help: Convert to triple double quotes + +D300.py:10:5: D300 [*] Use triple double quotes `"""` + | + 9 | def contains_quote(): +10 | 'Sum"\\mary.' + | ^^^^^^^^^^^^^ D300 + | + = help: Convert to triple double quotes + +ℹ Fix +7 7 | +8 8 | +9 9 | def contains_quote(): +10 |- 'Sum"\\mary.' + 10 |+ """Sum"\\mary.""" + +