Skip to content

Commit

Permalink
Add documentation for flake8-quotes rules (#2650)
Browse files Browse the repository at this point in the history
  • Loading branch information
charliermarsh committed Feb 8, 2023
1 parent 367f115 commit a9aa96b
Show file tree
Hide file tree
Showing 10 changed files with 192 additions and 8 deletions.
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1162,10 +1162,10 @@ For more, see [flake8-quotes](https://pypi.org/project/flake8-quotes/) on PyPI.

| Code | Name | Message | Fix |
| ---- | ---- | ------- | --- |
| Q000 | bad-quotes-inline-string | Double quotes found but single quotes preferred | 🛠 |
| Q001 | bad-quotes-multiline-string | Double quote multiline found but single quotes preferred | 🛠 |
| Q002 | bad-quotes-docstring | Double quote docstring found but single quotes preferred | 🛠 |
| Q003 | avoid-quote-escape | Change outer quotes to avoid escaping inner quotes | 🛠 |
| [Q000](https://github.com/charliermarsh/ruff/blob/main/docs/rules/bad-quotes-inline-string.md) | [bad-quotes-inline-string](https://github.com/charliermarsh/ruff/blob/main/docs/rules/bad-quotes-inline-string.md) | Double quotes found but single quotes preferred | 🛠 |
| [Q001](https://github.com/charliermarsh/ruff/blob/main/docs/rules/bad-quotes-multiline-string.md) | [bad-quotes-multiline-string](https://github.com/charliermarsh/ruff/blob/main/docs/rules/bad-quotes-multiline-string.md) | Double quote multiline found but single quotes preferred | 🛠 |
| [Q002](https://github.com/charliermarsh/ruff/blob/main/docs/rules/bad-quotes-docstring.md) | [bad-quotes-docstring](https://github.com/charliermarsh/ruff/blob/main/docs/rules/bad-quotes-docstring.md) | Double quote docstring found but single quotes preferred | 🛠 |
| [Q003](https://github.com/charliermarsh/ruff/blob/main/docs/rules/avoid-quote-escape.md) | [avoid-quote-escape](https://github.com/charliermarsh/ruff/blob/main/docs/rules/avoid-quote-escape.md) | Change outer quotes to avoid escaping inner quotes | 🛠 |

### flake8-return (RET)

Expand Down
78 changes: 78 additions & 0 deletions crates/ruff/src/rules/flake8_quotes/rules.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,24 @@ use crate::source_code::Locator;
use crate::violation::AlwaysAutofixableViolation;

define_violation!(
/// ### What it does
/// Checks for inline strings that use single quotes or double quotes,
/// depending on the value of the [`inline-quotes`](https://github.com/charliermarsh/ruff#inline-quotes)
/// setting.
///
/// ### Why is this bad?
/// Consistency is good. Use either single or double quotes for inline
/// strings, but be consistent.
///
/// ### Example
/// ```python
/// foo = 'bar'
/// ```
///
/// Assuming `inline-quotes` is set to `double`, use instead:
/// ```python
/// foo = "bar"
/// ```
pub struct BadQuotesInlineString {
pub quote: Quote,
}
Expand All @@ -36,6 +54,28 @@ impl AlwaysAutofixableViolation for BadQuotesInlineString {
}

define_violation!(
/// ### What it does
/// Checks for multiline strings that use single quotes or double quotes,
/// depending on the value of the [`multiline-quotes`](https://github.com/charliermarsh/ruff#multiline-quotes)
/// setting.
///
/// ### Why is this bad?
/// Consistency is good. Use either single or double quotes for multiline
/// strings, but be consistent.
///
/// ### Example
/// ```python
/// foo = '''
/// bar
/// '''
/// ```
///
/// Assuming `multiline-quotes` is set to `double`, use instead:
/// ```python
/// foo = """
/// bar
/// """
/// ```
pub struct BadQuotesMultilineString {
pub quote: Quote,
}
Expand All @@ -60,6 +100,27 @@ impl AlwaysAutofixableViolation for BadQuotesMultilineString {
}

define_violation!(
/// ### What it does
/// Checks for docstrings that use single quotes or double quotes, depending on the value of the [`docstring-quotes`](https://github.com/charliermarsh/ruff#docstring-quotes)
/// setting.
///
/// ### Why is this bad?
/// Consistency is good. Use either single or double quotes for docstring
/// strings, but be consistent.
///
/// ### Example
/// ```python
/// '''
/// bar
/// '''
/// ```
///
/// Assuming `docstring-quotes` is set to `double`, use instead:
/// ```python
/// """
/// bar
/// """
/// ```
pub struct BadQuotesDocstring {
pub quote: Quote,
}
Expand All @@ -84,6 +145,23 @@ impl AlwaysAutofixableViolation for BadQuotesDocstring {
}

define_violation!(
/// ### What it does
/// Checks for strings that include escaped quotes, and suggests changing
/// the quote style to avoid the need to escape them.
///
/// ### Why is this bad?
/// It's preferable to avoid escaped quotes in strings. By changing the
/// outer quote style, you can avoid escaping inner quotes.
///
/// ### Example
/// ```python
/// foo = 'bar\'s'
/// ```
///
/// Use instead:
/// ```python
/// foo = "bar's"
/// ```
pub struct AvoidQuoteEscape;
);
impl AlwaysAutofixableViolation for AvoidQuoteEscape {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
use std::fmt;

use crate::ast::helpers::unparse_constant;
use itertools::Itertools;
use ruff_macros::{define_violation, derive_message_formats};
use rustpython_parser::ast::{Cmpop, Expr, ExprKind, Located};
use serde::{Deserialize, Serialize};

use crate::ast::helpers::unparse_constant;
use crate::ast::types::Range;
use crate::checkers::ast::Checker;
use crate::registry::Diagnostic;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
use crate::ast::helpers::unparse_constant;
use itertools::Itertools;
use ruff_macros::{define_violation, derive_message_formats};
use rustpython_parser::ast::{Constant, Expr, ExprKind};

use crate::ast::helpers::unparse_constant;
use crate::ast::types::Range;
use crate::checkers::ast::Checker;
use crate::registry::Diagnostic;
Expand Down
6 changes: 4 additions & 2 deletions crates/ruff_dev/src/generate_docs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@
use std::fs;

use anyhow::Result;
use ruff::registry::{Linter, Rule, RuleNamespace};
use ruff::AutofixAvailability;
use strum::IntoEnumIterator;

use ruff::registry::{Linter, Rule, RuleNamespace};

#[derive(clap::Args)]
pub struct Args {
/// Write the generated docs to stdout (rather than to the filesystem).
Expand All @@ -22,17 +21,20 @@ pub fn main(args: &Args) -> Result<()> {
let mut output = String::new();
output.push_str(&format!("# {} ({})", rule.as_ref(), rule.code()));
output.push('\n');
output.push('\n');

let (linter, _) = Linter::parse_code(rule.code()).unwrap();
output.push_str(&format!("Derived from the **{}** linter.", linter.name()));
output.push('\n');
output.push('\n');

if let Some(autofix) = rule.autofixable() {
output.push_str(match autofix.available {
AutofixAvailability::Sometimes => "Autofix is sometimes available.",
AutofixAvailability::Always => "Autofix is always available.",
});
output.push('\n');
output.push('\n');
}

output.push_str(explanation.trim());
Expand Down
2 changes: 2 additions & 0 deletions docs/rules/assert-raises-exception.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# assert-raises-exception (B017)

Derived from the **flake8-bugbear** linter.

### What it does
Checks for `self.assertRaises(Exception)`.

Expand Down
23 changes: 23 additions & 0 deletions docs/rules/avoid-quote-escape.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# avoid-quote-escape (Q003)

Derived from the **flake8-quotes** linter.

Autofix is always available.

### What it does
Checks for strings that include escaped quotes, and suggests changing
the quote style to avoid the need to escape them.

### Why is this bad?
It's preferable to avoid escaped quotes in strings. By changing the
outer quote style, you can avoid escaping inner quotes.

### Example
```python
foo = 'bar\'s'
```

Use instead:
```python
foo = "bar's"
```
27 changes: 27 additions & 0 deletions docs/rules/bad-quotes-docstring.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# bad-quotes-docstring (Q002)

Derived from the **flake8-quotes** linter.

Autofix is always available.

### What it does
Checks for docstrings that use single quotes or double quotes, depending on the value of the [`docstring-quotes`](https://github.com/charliermarsh/ruff#docstring-quotes)
setting.

### Why is this bad?
Consistency is good. Use either single or double quotes for docstring
strings, but be consistent.

### Example
```python
'''
bar
'''
```

Assuming `docstring-quotes` is set to `double`, use instead:
```python
"""
bar
"""
```
24 changes: 24 additions & 0 deletions docs/rules/bad-quotes-inline-string.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# bad-quotes-inline-string (Q000)

Derived from the **flake8-quotes** linter.

Autofix is always available.

### What it does
Checks for inline strings that use single quotes or double quotes,
depending on the value of the [`inline-quotes`](https://github.com/charliermarsh/ruff#inline-quotes)
setting.

### Why is this bad?
Consistency is good. Use either single or double quotes for inline
strings, but be consistent.

### Example
```python
foo = 'bar'
```

Assuming `inline-quotes` is set to `double`, use instead:
```python
foo = "bar"
```
28 changes: 28 additions & 0 deletions docs/rules/bad-quotes-multiline-string.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# bad-quotes-multiline-string (Q001)

Derived from the **flake8-quotes** linter.

Autofix is always available.

### What it does
Checks for multiline strings that use single quotes or double quotes,
depending on the value of the [`multiline-quotes`](https://github.com/charliermarsh/ruff#multiline-quotes)
setting.

### Why is this bad?
Consistency is good. Use either single or double quotes for multiline
strings, but be consistent.

### Example
```python
foo = '''
bar
'''
```

Assuming `multiline-quotes` is set to `double`, use instead:
```python
foo = """
bar
"""
```

0 comments on commit a9aa96b

Please sign in to comment.