Skip to content

[flake8-pytest-style] Implement duplicate parameterized fixture detection (PT014)#6598

Merged
charliermarsh merged 9 commits intoastral-sh:mainfrom
harupy:PT014
Aug 16, 2023
Merged

[flake8-pytest-style] Implement duplicate parameterized fixture detection (PT014)#6598
charliermarsh merged 9 commits intoastral-sh:mainfrom
harupy:PT014

Conversation

@harupy
Copy link
Contributor

@harupy harupy commented Aug 15, 2023

Summary

#6597

Test Plan

Unit tests

@github-actions
Copy link
Contributor

github-actions bot commented Aug 15, 2023

PR Check Results

Ecosystem

ℹ️ ecosystem check detected changes. (+23, -0, 0 error(s))

airflow (+12, -0)

+ tests/always/test_secrets_local_filesystem.py:103:13: PT014 Duplicate of test case at index 2 in `@pytest_mark.parametrize`
+ tests/models/test_dagrun.py:2537:9: PT014 Duplicate of test case at index 5 in `@pytest_mark.parametrize`
+ tests/operators/test_bash.py:181:13: PT014 Duplicate of test case at index 2 in `@pytest_mark.parametrize`
+ tests/providers/cncf/kubernetes/operators/test_pod.py:1214:13: PT014 Duplicate of test case at index 2 in `@pytest_mark.parametrize`
+ tests/providers/databricks/operators/test_databricks_sql.py:233:9: PT014 Duplicate of test case at index 5 in `@pytest_mark.parametrize`
+ tests/providers/docker/operators/test_docker.py:533:13: PT014 Duplicate of test case at index 2 in `@pytest_mark.parametrize`
+ tests/providers/google/cloud/hooks/test_cloud_storage_transfer_service.py:488:13: PT014 Duplicate of test case at index 0 in `@pytest_mark.parametrize`
+ tests/providers/google/cloud/hooks/test_cloud_storage_transfer_service.py:489:13: PT014 Duplicate of test case at index 1 in `@pytest_mark.parametrize`
+ tests/providers/google/cloud/hooks/test_cloud_storage_transfer_service.py:493:13: PT014 Duplicate of test case at index 2 in `@pytest_mark.parametrize`
+ tests/providers/presto/hooks/test_presto.py:197:13: PT014 Duplicate of test case at index 2 in `@pytest_mark.parametrize`
+ tests/providers/trino/hooks/test_trino.py:216:13: PT014 Duplicate of test case at index 2 in `@pytest_mark.parametrize`
+ tests/www/views/test_views.py:534:9: PT014 Duplicate of test case at index 4 in `@pytest_mark.parametrize`

securedrop (+1, -0)

+ molecule/testinfra/common/test_fpf_apt_repo.py:64:9: PT014 Duplicate of test case at index 1 in `@pytest_mark.parametrize`

scikit-build (+1, -0)

+ tests/test_setup.py:545:9: PT014 Duplicate of test case at index 3 in `@pytest_mark.parametrize`

sphinx (+9, -0)

+ 
+    |
+    |     ^^^^^^^^^^^^^^^^ PT014
+ 35 |     ("a * b", "a * b"),                         # Mult
+ 36 |     ("sys", "sys"),                             # Name, NameConstant
+ 37 |     ("1234", "1234"),                           # Num
+ 38 |     ("not a", "not a"),                         # Not
+ 39 |     ("a or b", "a or b"),                       # Or
+ tests/test_pycode_ast.py:37:5: PT014 Duplicate of test case at index 10 in `@pytest_mark.parametrize`

Rules changed: 1
Rule Changes Additions Removals
PT014 15 15 0

Benchmark

Linux

group                                      main                                   pr
-----                                      ----                                   --
formatter/large/dataset.py                 1.00      3.8±0.03ms    10.8 MB/sec    1.04      3.9±0.02ms    10.4 MB/sec
formatter/numpy/ctypeslib.py               1.00   731.9±11.11µs    22.8 MB/sec    1.03   754.4±11.32µs    22.1 MB/sec
formatter/numpy/globals.py                 1.00     75.1±0.29µs    39.3 MB/sec    1.06     79.9±8.66µs    37.0 MB/sec
formatter/pydantic/types.py                1.00  1477.4±11.35µs    17.3 MB/sec    1.04  1530.4±12.56µs    16.7 MB/sec
linter/all-rules/large/dataset.py          1.01     10.7±0.09ms     3.8 MB/sec    1.00     10.7±0.05ms     3.8 MB/sec
linter/all-rules/numpy/ctypeslib.py        1.00      2.9±0.01ms     5.7 MB/sec    1.00      2.9±0.01ms     5.7 MB/sec
linter/all-rules/numpy/globals.py          1.00    327.7±0.78µs     9.0 MB/sec    1.00    326.4±1.65µs     9.0 MB/sec
linter/all-rules/pydantic/types.py         1.00      5.5±0.04ms     4.6 MB/sec    1.00      5.5±0.03ms     4.6 MB/sec
linter/default-rules/large/dataset.py      1.01      5.7±0.05ms     7.2 MB/sec    1.00      5.6±0.04ms     7.3 MB/sec
linter/default-rules/numpy/ctypeslib.py    1.01   1192.1±3.23µs    14.0 MB/sec    1.00   1184.2±2.31µs    14.1 MB/sec
linter/default-rules/numpy/globals.py      1.00    124.2±0.67µs    23.7 MB/sec    1.00    124.3±0.53µs    23.7 MB/sec
linter/default-rules/pydantic/types.py     1.00      2.5±0.01ms    10.1 MB/sec    1.00      2.5±0.01ms    10.2 MB/sec

Windows

group                                      main                                   pr
-----                                      ----                                   --
formatter/large/dataset.py                 1.00      4.3±0.07ms     9.4 MB/sec    1.00      4.3±0.06ms     9.4 MB/sec
formatter/numpy/ctypeslib.py               1.01   845.4±11.96µs    19.7 MB/sec    1.00   837.0±12.85µs    19.9 MB/sec
formatter/numpy/globals.py                 1.01     85.9±1.64µs    34.4 MB/sec    1.00     85.2±3.03µs    34.6 MB/sec
formatter/pydantic/types.py                1.00  1688.0±23.15µs    15.1 MB/sec    1.02  1714.8±28.04µs    14.9 MB/sec
linter/all-rules/large/dataset.py          1.01     12.7±0.13ms     3.2 MB/sec    1.00     12.6±0.11ms     3.2 MB/sec
linter/all-rules/numpy/ctypeslib.py        1.01      3.5±0.04ms     4.8 MB/sec    1.00      3.5±0.04ms     4.8 MB/sec
linter/all-rules/numpy/globals.py          1.01   438.1±11.54µs     6.7 MB/sec    1.00    434.8±4.60µs     6.8 MB/sec
linter/all-rules/pydantic/types.py         1.00      6.6±0.08ms     3.9 MB/sec    1.00      6.6±0.13ms     3.9 MB/sec
linter/default-rules/large/dataset.py      1.00      6.9±0.06ms     5.9 MB/sec    1.00      6.9±0.06ms     5.9 MB/sec
linter/default-rules/numpy/ctypeslib.py    1.01  1482.2±17.84µs    11.2 MB/sec    1.00  1473.3±18.77µs    11.3 MB/sec
linter/default-rules/numpy/globals.py      1.00    175.2±4.52µs    16.8 MB/sec    1.01    176.4±5.08µs    16.7 MB/sec
linter/default-rules/pydantic/types.py     1.00      3.1±0.03ms     8.2 MB/sec    1.00      3.1±0.04ms     8.2 MB/sec

Copy link
Contributor Author

@harupy harupy Aug 15, 2023

Choose a reason for hiding this comment

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

flake8_pytest_style result:

> flake8 crates/ruff/resources/test/fixtures/flake8_pytest_style/PT014.py
crates/ruff/resources/test/fixtures/flake8_pytest_style/PT014.py:4:2: PT014 found duplicate test cases (1, 2) in @pytest.mark.parametrize
crates/ruff/resources/test/fixtures/flake8_pytest_style/PT014.py:14:2: PT014 found duplicate test cases (1, 2) in @pytest.mark.parametrize
crates/ruff/resources/test/fixtures/flake8_pytest_style/PT014.py:14:2: PT014 found duplicate test cases (3, 4) in @pytest.mark.parametrize
crates/ruff/resources/test/fixtures/flake8_pytest_style/PT014.py:19:2: PT014 found duplicate test cases (1, 2) in @pytest.mark.parametrize

@harupy harupy marked this pull request as ready for review August 15, 2023 14:43
harupy added 2 commits August 15, 2023 23:53
Signed-off-by: harupy <hkawamura0130@gmail.com>
@harupy harupy changed the title Implement PT014 Implement PT014 Aug 15, 2023
Copy link
Member

@zanieb zanieb left a comment

Choose a reason for hiding this comment

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

Great work :) some minor comments

#[derive_message_formats]
fn message(&self) -> String {
let PytestDuplicateParametrizeTestCases { indices } = self;
format!("Found duplicate test cases {indices:?} in `@pytest.mark.parametrize`")
Copy link
Member

Choose a reason for hiding this comment

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

should we say "at indices ..."? I wasn't sure what the message meant at first.

Copy link
Contributor Author

@harupy harupy Aug 15, 2023

Choose a reason for hiding this comment

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

Can we raise PT014 against items that should be removed?

# Example

[1, 1, 2]
    ^ PT014 ...

This allows us to remove indices.

Copy link
Member

@charliermarsh charliermarsh Aug 15, 2023

Choose a reason for hiding this comment

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

I think it makes sense to use the range of the duplicated item, so that we underline the duplicated item specifically

Copy link
Contributor Author

Choose a reason for hiding this comment

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

# Example

[100, 100, 100, 200]
      ^^^  ^^^

If we have multiple duplicated items, we underline them?

Copy link
Member

Choose a reason for hiding this comment

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

I don't think we support highlighting multiple ranges. In that case, they'd each need to be a new violation which seems okay.

Copy link
Member

Choose a reason for hiding this comment

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

I think in the duplicate value rule, we just highlight the second value (i.e., the one that is a duplicate). That seems reasonable to me. (We could also mention the index of which it's a duplicate in the message.)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

# Example

[100, 100, 100, 200]
      ^^^ PT014: duplicate of item at {0}

so it should look like this?

Copy link
Member

Choose a reason for hiding this comment

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

Yeah, and the same for the next 100 -- one violation for each duplicate (but no violation for the first 100), would be my suggestion.

}

fn find_duplicates(elts: &[Expr]) -> Vec<(usize, usize)> {
let mut duplicates: Vec<(usize, usize)> = Vec::new();
Copy link
Member

Choose a reason for hiding this comment

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

Should we use a SmallVec since it's unlikely for there to be many duplicates?

Copy link
Member

Choose a reason for hiding this comment

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

I tend to prefer Vec unless we can demonstrate that SmallVec has better performance. In this case, we probably don't expect any duplicates in general, in which case this will never allocate anyway, so seems okay in my opinion.

}

/// PT014
fn check_duplicates(checker: &mut Checker, values: &Expr) {
Copy link
Member

Choose a reason for hiding this comment

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

Is it feasible to factor this so the type of values is more meaningful/narrow?

if ComparableExpr::from(elt1) == ComparableExpr::from(elt2) {
duplicates.push((idx1 + 1, idx2 + 1));
}
}
Copy link
Member

Choose a reason for hiding this comment

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

I think I'd suggest using an FxHashSet or FxHashMap here... As-is, this is quadratic, since we're checking every value against every other value. It's sometimes better to use a vector if you know the number of items is really small, but this also means we're re-computing the hash many times over.

@harupy harupy requested review from charliermarsh and zanieb August 16, 2023 02:02
@charliermarsh charliermarsh added the rule Implementing or modifying a lint rule label Aug 16, 2023
@charliermarsh charliermarsh changed the title Implement PT014 [flake8-pytest-style] Implement duplicate parameterized fixture detection (PT014) Aug 16, 2023
@charliermarsh charliermarsh enabled auto-merge (squash) August 16, 2023 03:27
@charliermarsh charliermarsh merged commit d9a81f4 into astral-sh:main Aug 16, 2023
@harupy harupy deleted the PT014 branch August 16, 2023 03:40
renovate bot referenced this pull request in allenporter/pyrainbird Aug 19, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [ruff](https://beta.ruff.rs/docs)
([source](https://github.com/astral-sh/ruff),
[changelog](https://github.com/astral-sh/ruff/releases)) | `==0.0.284`
-> `==0.0.285` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.0.285?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/ruff/0.0.285?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/ruff/0.0.284/0.0.285?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.0.284/0.0.285?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>astral-sh/ruff (ruff)</summary>

###
[`v0.0.285`](https://github.com/astral-sh/ruff/releases/tag/v0.0.285)

[Compare
Source](https://github.com/astral-sh/ruff/compare/v0.0.284...v0.0.285)

#### What's Changed

##### New rules

- \[`flake8-pytest-style`] Implement `pytest-unittest-raises-assertion`
(`PT027`) by [@&#8203;harupy](https://github.com/harupy) in
[https://github.com/astral-sh/ruff/pull/6554](https://github.com/astral-sh/ruff/pull/6554)
- \[`flake8-pytest-style`] Implement
`pytest-duplicate-parametrize-test-cases` (`PT014`) by
[@&#8203;harupy](https://github.com/harupy) in
[https://github.com/astral-sh/ruff/pull/6598](https://github.com/astral-sh/ruff/pull/6598)
- \[`flake8-tidy-imports`] Implement `banned-module-level-imports`
(`TID253`) by [@&#8203;durumu](https://github.com/durumu) in
[https://github.com/astral-sh/ruff/pull/6378](https://github.com/astral-sh/ruff/pull/6378)
- \[`pylint`] Implement `bad-dunder-name` (`W3201`) (in the Ruff
nursery) by [@&#8203;LaBatata101](https://github.com/LaBatata101) in
[https://github.com/astral-sh/ruff/pull/6486](https://github.com/astral-sh/ruff/pull/6486)
- \[`pylint`] Implement `subprocess-run-check` (`W1510`) by
[@&#8203;tjkuson](https://github.com/tjkuson) in
[https://github.com/astral-sh/ruff/pull/6487](https://github.com/astral-sh/ruff/pull/6487)
- \[`ruff`] Implement `quadratic-list-summation` (`RUF017`) by
[@&#8203;evanrittenhouse](https://github.com/evanrittenhouse) in
[https://github.com/astral-sh/ruff/pull/6489](https://github.com/astral-sh/ruff/pull/6489)

##### Rule changes

- \[`flake8-bugbear`] Add autofix for `B006` by
[@&#8203;qdegraaf](https://github.com/qdegraaf) in
[https://github.com/astral-sh/ruff/pull/6131](https://github.com/astral-sh/ruff/pull/6131)
- \[`flake8-pyi`] Avoid applying `PYI055` to runtime-evaluated
annotations by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6457](https://github.com/astral-sh/ruff/pull/6457)
- \[`flake8-self`] Allow `os._exit` accesses in `SLF001` by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6490](https://github.com/astral-sh/ruff/pull/6490)
- \[`perflint`] Ignore `PERF203` if `try` contains loop control flow
statements by
[@&#8203;evanrittenhouse](https://github.com/evanrittenhouse) in
[https://github.com/astral-sh/ruff/pull/6536](https://github.com/astral-sh/ruff/pull/6536)
- \[`pylint`] Check for invalid format type specifiers in nested
replacements for `PLE1300` by
[@&#8203;zanieb](https://github.com/zanieb) in
[https://github.com/astral-sh/ruff/pull/6616](https://github.com/astral-sh/ruff/pull/6616)
- \[`tryceratops`] Omit `NotImplementedError` from `TRY003` by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6568](https://github.com/astral-sh/ruff/pull/6568)

##### Settings

- Respect `.ipynb` and `.pyi` sources when linting from stdin by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6628](https://github.com/astral-sh/ruff/pull/6628)
- Support glob patterns for `raises_require_match_for` and
`raises_require_match_for` by
[@&#8203;harupy](https://github.com/harupy) in
[https://github.com/astral-sh/ruff/pull/6635](https://github.com/astral-sh/ruff/pull/6635)

##### Bug Fixes

- Make `lambda-assignment` fix always-manual in class bodies by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6626](https://github.com/astral-sh/ruff/pull/6626)
- Fix counting of message arguments when msg is provided as a keyword by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6456](https://github.com/astral-sh/ruff/pull/6456)
- Add container types to `E721` by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6469](https://github.com/astral-sh/ruff/pull/6469)
- Respect scoping rules when identifying builtins by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6468](https://github.com/astral-sh/ruff/pull/6468)
- Respect tab width in line-length heuristic by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6491](https://github.com/astral-sh/ruff/pull/6491)
- Respect dummy-variable-rgx for unused bound exceptions by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6492](https://github.com/astral-sh/ruff/pull/6492)
- Fix detection of top-level imports with newlines in `E402` by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6526](https://github.com/astral-sh/ruff/pull/6526)
- Allow if-expression with dual string arms in `invalid-envvar-value` by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6538](https://github.com/astral-sh/ruff/pull/6538)
- Add deprecated unittest assertions to PT009 by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6572](https://github.com/astral-sh/ruff/pull/6572)
- Avoid unused argument rules when functions call `locals()` by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6578](https://github.com/astral-sh/ruff/pull/6578)
- Allow top-level `await` in Jupyter notebooks by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6607](https://github.com/astral-sh/ruff/pull/6607)
- Don't detect `pandas#values` for stores, deletes, or class accesses by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6631](https://github.com/astral-sh/ruff/pull/6631)
- Avoid removing parentheses in `E712` fix by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6575](https://github.com/astral-sh/ruff/pull/6575)
- Skip whitespace between comments at start of file e.g. for `I002` by
[@&#8203;durumu](https://github.com/durumu) in
[https://github.com/astral-sh/ruff/pull/6523](https://github.com/astral-sh/ruff/pull/6523)
- Add support for nested replacements inside format specifications e.g.
for `PLE1300` by [@&#8203;zanieb](https://github.com/zanieb) in
[https://github.com/astral-sh/ruff/pull/6616](https://github.com/astral-sh/ruff/pull/6616)

##### Playground

- Shared playground links now use short URLs by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6383](https://github.com/astral-sh/ruff/pull/6383)
- Fix possible JSON parse error on playground load by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6519](https://github.com/astral-sh/ruff/pull/6519)
- Fix unreachable panic in playground by
[@&#8203;MichaReiser](https://github.com/MichaReiser) in
[https://github.com/astral-sh/ruff/pull/6623](https://github.com/astral-sh/ruff/pull/6623)

##### Performance

- Improve tokenizer performance for ASCII only identifiers by
[@&#8203;MichaReiser](https://github.com/MichaReiser) in
[https://github.com/astral-sh/ruff/pull/6609](https://github.com/astral-sh/ruff/pull/6609)

#### New Contributors

- [@&#8203;magic-akari](https://github.com/magic-akari) made their
first contribution in
[https://github.com/astral-sh/ruff/pull/6472](https://github.com/astral-sh/ruff/pull/6472)
- [@&#8203;durumu](https://github.com/durumu) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/6378](https://github.com/astral-sh/ruff/pull/6378)
- [@&#8203;jamesbraza](https://github.com/jamesbraza) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/6520](https://github.com/astral-sh/ruff/pull/6520)
- [@&#8203;takumaw](https://github.com/takumaw) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/6533](https://github.com/astral-sh/ruff/pull/6533)
- [@&#8203;noklam](https://github.com/noklam) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/6573](https://github.com/astral-sh/ruff/pull/6573)
- [@&#8203;Teraskull](https://github.com/Teraskull) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/6605](https://github.com/astral-sh/ruff/pull/6605)

**Full Changelog**:
astral-sh/ruff@v0.0.284...v0.0.285

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/allenporter/pyrainbird).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNi40My4yIiwidXBkYXRlZEluVmVyIjoiMzYuNDMuMiIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
renovate bot referenced this pull request in allenporter/flux-local Aug 20, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [ruff](https://beta.ruff.rs/docs)
([source](https://github.com/astral-sh/ruff),
[changelog](https://github.com/astral-sh/ruff/releases)) | `==0.0.284`
-> `==0.0.285` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.0.285?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/ruff/0.0.285?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/ruff/0.0.284/0.0.285?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.0.284/0.0.285?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>astral-sh/ruff (ruff)</summary>

###
[`v0.0.285`](https://github.com/astral-sh/ruff/releases/tag/v0.0.285)

[Compare
Source](https://github.com/astral-sh/ruff/compare/v0.0.284...v0.0.285)

#### What's Changed

##### New rules

- \[`flake8-pytest-style`] Implement `pytest-unittest-raises-assertion`
(`PT027`) by [@&#8203;harupy](https://github.com/harupy) in
[https://github.com/astral-sh/ruff/pull/6554](https://github.com/astral-sh/ruff/pull/6554)
- \[`flake8-pytest-style`] Implement
`pytest-duplicate-parametrize-test-cases` (`PT014`) by
[@&#8203;harupy](https://github.com/harupy) in
[https://github.com/astral-sh/ruff/pull/6598](https://github.com/astral-sh/ruff/pull/6598)
- \[`flake8-tidy-imports`] Implement `banned-module-level-imports`
(`TID253`) by [@&#8203;durumu](https://github.com/durumu) in
[https://github.com/astral-sh/ruff/pull/6378](https://github.com/astral-sh/ruff/pull/6378)
- \[`pylint`] Implement `bad-dunder-name` (`W3201`) (in the Ruff
nursery) by [@&#8203;LaBatata101](https://github.com/LaBatata101) in
[https://github.com/astral-sh/ruff/pull/6486](https://github.com/astral-sh/ruff/pull/6486)
- \[`pylint`] Implement `subprocess-run-check` (`W1510`) by
[@&#8203;tjkuson](https://github.com/tjkuson) in
[https://github.com/astral-sh/ruff/pull/6487](https://github.com/astral-sh/ruff/pull/6487)
- \[`ruff`] Implement `quadratic-list-summation` (`RUF017`) by
[@&#8203;evanrittenhouse](https://github.com/evanrittenhouse) in
[https://github.com/astral-sh/ruff/pull/6489](https://github.com/astral-sh/ruff/pull/6489)

##### Rule changes

- \[`flake8-bugbear`] Add autofix for `B006` by
[@&#8203;qdegraaf](https://github.com/qdegraaf) in
[https://github.com/astral-sh/ruff/pull/6131](https://github.com/astral-sh/ruff/pull/6131)
- \[`flake8-pyi`] Avoid applying `PYI055` to runtime-evaluated
annotations by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6457](https://github.com/astral-sh/ruff/pull/6457)
- \[`flake8-self`] Allow `os._exit` accesses in `SLF001` by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6490](https://github.com/astral-sh/ruff/pull/6490)
- \[`perflint`] Ignore `PERF203` if `try` contains loop control flow
statements by
[@&#8203;evanrittenhouse](https://github.com/evanrittenhouse) in
[https://github.com/astral-sh/ruff/pull/6536](https://github.com/astral-sh/ruff/pull/6536)
- \[`pylint`] Check for invalid format type specifiers in nested
replacements for `PLE1300` by
[@&#8203;zanieb](https://github.com/zanieb) in
[https://github.com/astral-sh/ruff/pull/6616](https://github.com/astral-sh/ruff/pull/6616)
- \[`tryceratops`] Omit `NotImplementedError` from `TRY003` by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6568](https://github.com/astral-sh/ruff/pull/6568)

##### Settings

- Respect `.ipynb` and `.pyi` sources when linting from stdin by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6628](https://github.com/astral-sh/ruff/pull/6628)
- Support glob patterns for `raises_require_match_for` and
`raises_require_match_for` by
[@&#8203;harupy](https://github.com/harupy) in
[https://github.com/astral-sh/ruff/pull/6635](https://github.com/astral-sh/ruff/pull/6635)

##### Bug Fixes

- Make `lambda-assignment` fix always-manual in class bodies by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6626](https://github.com/astral-sh/ruff/pull/6626)
- Fix counting of message arguments when msg is provided as a keyword by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6456](https://github.com/astral-sh/ruff/pull/6456)
- Add container types to `E721` by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6469](https://github.com/astral-sh/ruff/pull/6469)
- Respect scoping rules when identifying builtins by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6468](https://github.com/astral-sh/ruff/pull/6468)
- Respect tab width in line-length heuristic by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6491](https://github.com/astral-sh/ruff/pull/6491)
- Respect dummy-variable-rgx for unused bound exceptions by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6492](https://github.com/astral-sh/ruff/pull/6492)
- Fix detection of top-level imports with newlines in `E402` by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6526](https://github.com/astral-sh/ruff/pull/6526)
- Allow if-expression with dual string arms in `invalid-envvar-value` by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6538](https://github.com/astral-sh/ruff/pull/6538)
- Add deprecated unittest assertions to PT009 by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6572](https://github.com/astral-sh/ruff/pull/6572)
- Avoid unused argument rules when functions call `locals()` by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6578](https://github.com/astral-sh/ruff/pull/6578)
- Allow top-level `await` in Jupyter notebooks by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6607](https://github.com/astral-sh/ruff/pull/6607)
- Don't detect `pandas#values` for stores, deletes, or class accesses by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6631](https://github.com/astral-sh/ruff/pull/6631)
- Avoid removing parentheses in `E712` fix by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6575](https://github.com/astral-sh/ruff/pull/6575)
- Skip whitespace between comments at start of file e.g. for `I002` by
[@&#8203;durumu](https://github.com/durumu) in
[https://github.com/astral-sh/ruff/pull/6523](https://github.com/astral-sh/ruff/pull/6523)
- Add support for nested replacements inside format specifications e.g.
for `PLE1300` by [@&#8203;zanieb](https://github.com/zanieb) in
[https://github.com/astral-sh/ruff/pull/6616](https://github.com/astral-sh/ruff/pull/6616)

##### Playground

- Shared playground links now use short URLs by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6383](https://github.com/astral-sh/ruff/pull/6383)
- Fix possible JSON parse error on playground load by
[@&#8203;charliermarsh](https://github.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/6519](https://github.com/astral-sh/ruff/pull/6519)
- Fix unreachable panic in playground by
[@&#8203;MichaReiser](https://github.com/MichaReiser) in
[https://github.com/astral-sh/ruff/pull/6623](https://github.com/astral-sh/ruff/pull/6623)

##### Performance

- Improve tokenizer performance for ASCII only identifiers by
[@&#8203;MichaReiser](https://github.com/MichaReiser) in
[https://github.com/astral-sh/ruff/pull/6609](https://github.com/astral-sh/ruff/pull/6609)

#### New Contributors

- [@&#8203;magic-akari](https://github.com/magic-akari) made their
first contribution in
[https://github.com/astral-sh/ruff/pull/6472](https://github.com/astral-sh/ruff/pull/6472)
- [@&#8203;durumu](https://github.com/durumu) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/6378](https://github.com/astral-sh/ruff/pull/6378)
- [@&#8203;jamesbraza](https://github.com/jamesbraza) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/6520](https://github.com/astral-sh/ruff/pull/6520)
- [@&#8203;takumaw](https://github.com/takumaw) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/6533](https://github.com/astral-sh/ruff/pull/6533)
- [@&#8203;noklam](https://github.com/noklam) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/6573](https://github.com/astral-sh/ruff/pull/6573)
- [@&#8203;Teraskull](https://github.com/Teraskull) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/6605](https://github.com/astral-sh/ruff/pull/6605)

**Full Changelog**:
astral-sh/ruff@v0.0.284...v0.0.285

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/allenporter/flux-local).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNi40My4yIiwidXBkYXRlZEluVmVyIjoiMzYuNDMuMiIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

rule Implementing or modifying a lint rule

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants