Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement flake8-future-annotations FA100 #3979

Merged
merged 22 commits into from
May 14, 2023
Merged

Conversation

TylerYep
Copy link
Contributor

@TylerYep TylerYep commented Apr 15, 2023

This PR tackles the first part of #3072, which is to raise a lint error when a rewrite-able type is used without from __future__ import annotations present.

Test cases taken from: https://github.com/TylerYep/flake8-future-annotations

Some of the test cases I added (prefixed by no_future) do not raise lint warnings now (as expected), but will raise lint warnings once FA102 is implemented. I am adding them to ensure they do not raise extraneous errors to begin with.

This lint rule also found some available fixes in scripts/check_ecosystem.py, which tells me there's some value to having this around :)

The next two PRs will add the autofix functionality for FA100 and FA101 and/or FA102. Thanks for the review!

@github-actions
Copy link
Contributor

github-actions bot commented Apr 15, 2023

PR Check Results

Ecosystem

✅ ecosystem check detected no changes.

Benchmark

Linux

group                                      main                                   pr
-----                                      ----                                   --
linter/all-rules/large/dataset.py          1.01     16.2±0.29ms     2.5 MB/sec    1.00     16.1±0.24ms     2.5 MB/sec
linter/all-rules/numpy/ctypeslib.py        1.00      4.0±0.07ms     4.2 MB/sec    1.00      4.0±0.06ms     4.2 MB/sec
linter/all-rules/numpy/globals.py          1.00    488.4±9.48µs     6.0 MB/sec    1.00    487.9±9.25µs     6.0 MB/sec
linter/all-rules/pydantic/types.py         1.01      6.8±0.09ms     3.8 MB/sec    1.00      6.7±0.13ms     3.8 MB/sec
linter/default-rules/large/dataset.py      1.00      7.8±0.12ms     5.2 MB/sec    1.01      7.9±0.08ms     5.1 MB/sec
linter/default-rules/numpy/ctypeslib.py    1.01  1723.3±13.22µs     9.7 MB/sec    1.00  1708.6±19.59µs     9.7 MB/sec
linter/default-rules/numpy/globals.py      1.00    187.7±3.36µs    15.7 MB/sec    1.00    187.9±3.59µs    15.7 MB/sec
linter/default-rules/pydantic/types.py     1.00      3.6±0.05ms     7.1 MB/sec    1.00      3.6±0.05ms     7.1 MB/sec
parser/large/dataset.py                    1.00      6.3±0.11ms     6.5 MB/sec    1.01      6.3±0.09ms     6.4 MB/sec
parser/numpy/ctypeslib.py                  1.00  1225.3±17.85µs    13.6 MB/sec    1.00  1225.1±24.36µs    13.6 MB/sec
parser/numpy/globals.py                    1.00    124.7±2.50µs    23.7 MB/sec    1.00    124.2±2.27µs    23.8 MB/sec
parser/pydantic/types.py                   1.00      2.7±0.05ms     9.5 MB/sec    1.01      2.7±0.05ms     9.4 MB/sec

Windows

group                                      main                                   pr
-----                                      ----                                   --
linter/all-rules/large/dataset.py          1.02     21.0±0.63ms  1985.7 KB/sec    1.00     20.6±0.66ms  2025.1 KB/sec
linter/all-rules/numpy/ctypeslib.py        1.00      5.3±0.20ms     3.1 MB/sec    1.03      5.5±0.25ms     3.0 MB/sec
linter/all-rules/numpy/globals.py          1.00   630.1±26.83µs     4.7 MB/sec    1.02  644.2±108.66µs     4.6 MB/sec
linter/all-rules/pydantic/types.py         1.00      8.8±0.30ms     2.9 MB/sec    1.03      9.0±0.35ms     2.8 MB/sec
linter/default-rules/large/dataset.py      1.01     10.5±0.38ms     3.9 MB/sec    1.00     10.3±0.36ms     3.9 MB/sec
linter/default-rules/numpy/ctypeslib.py    1.00      2.2±0.07ms     7.7 MB/sec    1.01      2.2±0.10ms     7.6 MB/sec
linter/default-rules/numpy/globals.py      1.00   256.8±13.91µs    11.5 MB/sec    1.08   278.2±19.02µs    10.6 MB/sec
linter/default-rules/pydantic/types.py     1.00      4.6±0.13ms     5.6 MB/sec    1.07      4.9±0.26ms     5.2 MB/sec
parser/large/dataset.py                    1.00      8.5±0.16ms     4.8 MB/sec    1.04      8.8±0.24ms     4.6 MB/sec
parser/numpy/ctypeslib.py                  1.00  1659.1±49.63µs    10.0 MB/sec    1.02  1698.0±70.38µs     9.8 MB/sec
parser/numpy/globals.py                    1.00    169.7±9.08µs    17.4 MB/sec    1.02    172.8±8.51µs    17.1 MB/sec
parser/pydantic/types.py                   1.00      3.7±0.17ms     6.8 MB/sec    1.01      3.8±0.12ms     6.7 MB/sec

@TylerYep TylerYep changed the title Implement flake8-future-annotations Implement flake8-future-annotations FA100 Apr 15, 2023
@TylerYep TylerYep marked this pull request as ready for review April 15, 2023 20:18
@charliermarsh charliermarsh self-requested a review April 15, 2023 20:55
@TylerYep TylerYep changed the title Implement flake8-future-annotations FA100 Implement flake8-future-annotations FA100 Apr 30, 2023
@charliermarsh
Copy link
Member

(Really sorry for the delay here, I will try to get to this soon, I just got distracted between launch and PyCon and some travel.)

@TylerYep
Copy link
Contributor Author

TylerYep commented May 4, 2023

I'm not sure why tests are failing - running cargo test locally passes cleanly for me.

Any idea @charliermarsh ?

@charliermarsh
Copy link
Member

@TylerYep - Just needed to merge, we recently hit a limit on a fixed-size vector that stores all the rules and it had to be increased.

@TylerYep
Copy link
Contributor Author

TylerYep commented May 7, 2023

I went back to my original plugin and remembered why DefaultDict and Deque were originally included in FA100:

The main goal of this plugin is to signal to users when a type annotation could be rewritten in a more concise way when from __future__ import annotations is added.

  1. This code could be simplified (and is currently autofixed by Pyupgrade):
from typing import List, Optional, Union

a: List[int] = []
b: Optional[Union[int, str]] = None
from __future__ import annotations

a: list[int] = []
b: int | str | None = None
  1. This code could be simplified (but is not currently autofixed by Pyupgrade):
from collections import defaultdict, deque
from typing import DefaultDict, Deque

a: DefaultDict[int] = defaultdict(int)
b: Deque[int] = deque()
from __future__ import annotations

from collections import defaultdict, deque

a: defaultdict[int] = defaultdict(int)
b: deque[int] = deque()

asottile/pyupgrade#799 provides context on why collection types are not rewritten using Pyupgrade (import aliasing is hard). It might be possible to extend the autofix functionality to rewrite all of them correctly, but that is out of scope for now.

Afaik, DefaultDict and Deque are the only two code changes included in PEP585, improved using from __future__ import annotations to use the common lowercase name, but not autofixed by Pyupgrade.

  1. This code cannot be simplified, but can use a different import. These cases are not intended to be raised by this flake8 rule because the type annotation doesn't need to be changed by adding from __future__ import annotations:
from typing import AsyncIterator, Mapping

a: Mapping[int, str] = {}
b: AsyncIterator = ...
from collections.abc import AsyncIterator, Mapping

a: Mapping[int, str] = {}
b: AsyncIterator = ...

My view is that both 1 and 2 should be raised by this plugin, but not 3, because the code itself is not improved by adding from __future__ import annotations.

I reverted 4373751 to reflect the above explanation.

}

/// FA100
pub fn missing_future_annotations_from_typing_usage(checker: &mut Checker, expr: &Expr) {
Copy link
Member

Choose a reason for hiding this comment

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

Sorry, last question: what's the benefit in flagging both the usages and the imports? Would flagging the import alone be insufficient?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

If the user uses import typing, we can only flag typing.List at the usage. If they use from typing import List, then flagging the import alone is sufficient.

@charliermarsh
Copy link
Member

Will merge this after cutting the release.

.settings
.rules
.enabled(Rule::MissingFutureAnnotationsWithImports)
&& analyze::typing::is_pep585_builtin(expr, &self.ctx)
Copy link
Member

Choose a reason for hiding this comment

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

These should only be activated for minimum-version < Python 3.9, right? Since PEP 585 was part of Python 3.9 (so future annotations aren't required to use the standard-library variants in 3.9 and later).

Copy link
Contributor Author

Choose a reason for hiding this comment

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

In practice, this works on Python 3.7+.

Copy link
Member

Choose a reason for hiding this comment

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

But if your minimum-supported Python version is Python 3.9, you don't need __future__ annotations to use the standard-library generics. So these errors would already be detected and fixed by the existing pyupgrade rules, right?

Copy link
Contributor Author

@TylerYep TylerYep May 12, 2023

Choose a reason for hiding this comment

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

Ah, you're asking about the upper version.

Unions like str | None didn't start working until Python 3.10, which are also covered by this plugin.

After 3.10, the future annotations import is not as useful anymore.

@calumy
Copy link
Contributor

calumy commented May 13, 2023

Will merge this after cutting the release.

I thought it might be worth flagging that the changes to the ecosystem check seem to be causing it to error. I don't have time to investigate now but thought it would be worth saying something before this is merged.

@TylerYep
Copy link
Contributor Author

TylerYep commented May 13, 2023

What is the error? I see check_ecosystem imports Self, which must mean it's running on Python 3.11+, so none of my changes should impact it.

@calumy
Copy link
Contributor

calumy commented May 13, 2023

What is the error? I see check_ecosystem imports Self, which must mean it's running on Python 3.11+, so none of my changes should impact it.

Error in the ecosystem check above:

'async_generator' object does not support the asynchronous context manager protocol

@TylerYep
Copy link
Contributor Author

TylerYep commented May 13, 2023

Was that caused by removing the asynccontextmanager import? It was an unused import that pre-commit told me to remove.

If that import is required due to side effects, then we probably need to add a # noqa to that line.

Update: fixed the issue.

@charliermarsh
Copy link
Member

I made a few changes here that I think are improvements based on some of the capabilities we have in Ruff, but if you disagree, just let me know and we can of course discuss further -- want to merge to keep momentum.

  1. I removed the diagnostics that trigger on-import, and instead, I'm more closely following our pyupgrade rules. We flag all usages, regardless of whether the user does import typing or from typing import List -- when the user writes typing.List or List, we resolve it to typing.List. So it's always sufficient to just flag usages, given that we have enough binding tracking and semantic analysis to resolve those usages, regardless of how they're imported.
  2. These rules now only flag if your minimum version is below Python 3.9 (or Python 3.10, for Optional and Union), since adding __future__ on those versions has no effect with regards to simplifying the imports. (You can already use the standard library generics on those versions.)
  3. We weren't flagging Optional or Union, so I added that too.

@charliermarsh charliermarsh enabled auto-merge (squash) May 14, 2023 02:57
@charliermarsh charliermarsh merged commit 01b372a into astral-sh:main May 14, 2023
&& (self.settings.target_version >= PythonVersion::Py37
&& !self.ctx.future_annotations()
&& self.ctx.in_annotation()))
&& analyze::typing::is_pep585_builtin(expr, &self.ctx)
Copy link
Member

Choose a reason for hiding this comment

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

This condition is a lot to read, I'd like to clean this up... But the idea is: mirror the logic below for Rule::NonPEP585Annotation, but flip the !self.ctx.future_annotations(). So we're asking: would we trigger here if __future__ annotations were enabled?

renovate bot added a commit to ixm-one/pytest-cmake-presets that referenced this pull request May 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://togithub.com/charliermarsh/ruff)
([changelog](https://togithub.com/charliermarsh/ruff/releases)) |
`^0.0.267` -> `^0.0.269` |
[![age](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/compatibility-slim/0.0.267)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/confidence-slim/0.0.267)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>charliermarsh/ruff</summary>

###
[`v0.0.269`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.269)

[Compare
Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.267...v0.0.269)

<!-- Release notes generated using configuration in .github/release.yml
at main -->

#### What's Changed

(This is a rerelease of `v0.0.268`, which didn't make it to PyPI due to
user error. As such, the release notes are copied below.)

##### `pycodestyle`

This release includes optimized implementations of a large portion of
`pycodestyle`, for those that use Ruff without an autoformatter.

In this initial release, the rules are being introduced under a
"nursery" flag, which requires that users explicitly select them (e.g.,
`select = ["E111"]`); in other words, these rules are not yet enabled
via `select = ["E"]`.

If you're interested in testing the `pycodestyle` rules, you can enable
them via:

```toml
select = [
    "E111", "E112", "E113", "E114", "E115", "E116", "E117",
    "E201", "E202", "E203", "E211", "E221", "E222", "E223",
    "E224", "E225", "E226", "E227", "E228", "E231", "E251",
    "E252", "E261", "E262", "E265", "E266", "E271", "E272",
    "E273", "E274", "E275",
]
```

These rules will be included as part of the `E` category in a future
release.

##### Breaking Changes

- \[`pyupgrade`] Remove `keep-runtime-typing` setting by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4427

##### Rules

- \[`pylint`] Add `duplicate-bases` rule by
[@&#8203;alonme](https://togithub.com/alonme) in
[astral-sh/ruff#4411
- \[`pylint`] Fix `PLW3301` auto-fix with generators by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#4412
- \[`flake8-async`] Implement flake8-async plugin by
[@&#8203;qdegraaf](https://togithub.com/qdegraaf) in
[astral-sh/ruff#4432
- \[`pyupgrade`] Enable automatic rewrites of `typing.Deque` and
`typing.DefaultDict` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4420
- \[`flake8-pyi`] Implement `unannotated-assignment-in-stub` (`PY052`)
by [@&#8203;sladyn98](https://togithub.com/sladyn98) in
[astral-sh/ruff#4293
- \[`tryceratops`] Implement TRY302 - `raise` after `except` by
[@&#8203;john-h-k](https://togithub.com/john-h-k) in
[astral-sh/ruff#4461
- \[`flake8-bandit`] Improve SQL injection detection logic (`S608`) by
[@&#8203;scop](https://togithub.com/scop) in
[astral-sh/ruff#4499
- \[`flake8-todos`] Implement `flake8_todos` by
[@&#8203;evanrittenhouse](https://togithub.com/evanrittenhouse) in
[astral-sh/ruff#3921
- \[`flake8-future-annotations`] Implement `flake8-future-annotations`
FA100 by [@&#8203;TylerYep](https://togithub.com/TylerYep) in
[astral-sh/ruff#3979
- Enable `pycodestyle` rules by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3689
- Enable `pycodestyle` rules under new "nursery" category by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4407

##### Settings

- Merge subsettings when extending configurations by
[@&#8203;bendoerry](https://togithub.com/bendoerry) in
[astral-sh/ruff#4431

##### Bug Fixes

- Extend multi-line noqa directives to start-of-line by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4490
- Fix scoping of comprehensions within classes by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4494
- Enable autofix for split-assertions at top level by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4405
- Ignore ANN401 for overridden methods by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#4409
- Fix `RUF010` autofix within f-strings by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#4423
- Update C419 to be a suggested fix by
[@&#8203;madkinsz](https://togithub.com/madkinsz) in
[astral-sh/ruff#4424
- Fix expected-indentation errors with end-of-line comments by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4438
- Emit non-logical newlines for "empty" lines by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4444
- Avoid emitting empty logical lines by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4452
- Avoid flagging missing whitespace for decorators by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4454
- Remove special-casing for whitespace-around-@&#8203; by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4458
- Avoid triggering `pd#at` and friends on non-subscripts by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4474
- Include precise tokens for extraneous-whitespace diagnostics by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4471
- Allow shebang comments at start-of-file by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4473
- Bring pycodestyle rules into full compatibility (on SciPy) by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4472
- Invert quote-style when generating code within f-strings by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4487
- Fix COM812 false positive in string subscript by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#4493
- Overhaul sdist handling by
[@&#8203;konstin](https://togithub.com/konstin) in
[astral-sh/ruff#4439

#### New Contributors

- [@&#8203;TylerYep](https://togithub.com/TylerYep) made their first
contribution in
[astral-sh/ruff#3979
- [@&#8203;yanksyoon](https://togithub.com/yanksyoon) made their first
contribution in
[astral-sh/ruff#4428
- [@&#8203;bendoerry](https://togithub.com/bendoerry) made their first
contribution in
[astral-sh/ruff#4431
- [@&#8203;qdegraaf](https://togithub.com/qdegraaf) made their first
contribution in
[astral-sh/ruff#4432
- [@&#8203;jameslamb](https://togithub.com/jameslamb) made their first
contribution in
[astral-sh/ruff#4446
- [@&#8203;john-h-k](https://togithub.com/john-h-k) made their first
contribution in
[astral-sh/ruff#4461

**Full Changelog**:
astral-sh/ruff@v0.0.267...v0.0.269

</details>

---

### Configuration

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

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, 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://app.renovatebot.com/dashboard#github/ixm-one/pytest-cmake-presets).

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

Signed-off-by: Renovate Bot <bot@renovateapp.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
renovate bot added a commit to allenporter/pyrainbird that referenced this pull request May 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://togithub.com/charliermarsh/ruff)
([changelog](https://togithub.com/charliermarsh/ruff/releases)) |
`==0.0.267` -> `==0.0.269` |
[![age](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/compatibility-slim/0.0.267)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/confidence-slim/0.0.267)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>charliermarsh/ruff</summary>

###
[`v0.0.269`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.269)

[Compare
Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.267...v0.0.269)

<!-- Release notes generated using configuration in .github/release.yml
at main -->

#### What's Changed

(This is a rerelease of `v0.0.268`, which didn't make it to PyPI due to
user error. As such, the release notes are copied below.)

##### `pycodestyle`

This release includes optimized implementations of a large portion of
`pycodestyle`, for those that use Ruff without an autoformatter.

In this initial release, the rules are being introduced under a
"nursery" flag, which requires that users explicitly select them (e.g.,
`select = ["E111"]`); in other words, these rules are not yet enabled
via `select = ["E"]`.

If you're interested in testing the `pycodestyle` rules, you can enable
them via:

```toml
select = [
    "E111", "E112", "E113", "E114", "E115", "E116", "E117",
    "E201", "E202", "E203", "E211", "E221", "E222", "E223",
    "E224", "E225", "E226", "E227", "E228", "E231", "E251",
    "E252", "E261", "E262", "E265", "E266", "E271", "E272",
    "E273", "E274", "E275",
]
```

These rules will be included as part of the `E` category in a future
release.

##### Breaking Changes

- \[`pyupgrade`] Remove `keep-runtime-typing` setting by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4427

##### Rules

- \[`pylint`] Add `duplicate-bases` rule by
[@&#8203;alonme](https://togithub.com/alonme) in
[astral-sh/ruff#4411
- \[`pylint`] Fix `PLW3301` auto-fix with generators by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#4412
- \[`flake8-async`] Implement flake8-async plugin by
[@&#8203;qdegraaf](https://togithub.com/qdegraaf) in
[astral-sh/ruff#4432
- \[`pyupgrade`] Enable automatic rewrites of `typing.Deque` and
`typing.DefaultDict` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4420
- \[`flake8-pyi`] Implement `unannotated-assignment-in-stub` (`PY052`)
by [@&#8203;sladyn98](https://togithub.com/sladyn98) in
[astral-sh/ruff#4293
- \[`tryceratops`] Implement TRY302 - `raise` after `except` by
[@&#8203;john-h-k](https://togithub.com/john-h-k) in
[astral-sh/ruff#4461
- \[`flake8-bandit`] Improve SQL injection detection logic (`S608`) by
[@&#8203;scop](https://togithub.com/scop) in
[astral-sh/ruff#4499
- \[`flake8-todos`] Implement `flake8_todos` by
[@&#8203;evanrittenhouse](https://togithub.com/evanrittenhouse) in
[astral-sh/ruff#3921
- \[`flake8-future-annotations`] Implement `flake8-future-annotations`
FA100 by [@&#8203;TylerYep](https://togithub.com/TylerYep) in
[astral-sh/ruff#3979
- Enable `pycodestyle` rules by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3689
- Enable `pycodestyle` rules under new "nursery" category by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4407

##### Settings

- Merge subsettings when extending configurations by
[@&#8203;bendoerry](https://togithub.com/bendoerry) in
[astral-sh/ruff#4431

##### Bug Fixes

- Extend multi-line noqa directives to start-of-line by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4490
- Fix scoping of comprehensions within classes by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4494
- Enable autofix for split-assertions at top level by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4405
- Ignore ANN401 for overridden methods by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#4409
- Fix `RUF010` autofix within f-strings by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#4423
- Update C419 to be a suggested fix by
[@&#8203;madkinsz](https://togithub.com/madkinsz) in
[astral-sh/ruff#4424
- Fix expected-indentation errors with end-of-line comments by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4438
- Emit non-logical newlines for "empty" lines by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4444
- Avoid emitting empty logical lines by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4452
- Avoid flagging missing whitespace for decorators by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4454
- Remove special-casing for whitespace-around-@&#8203; by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4458
- Avoid triggering `pd#at` and friends on non-subscripts by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4474
- Include precise tokens for extraneous-whitespace diagnostics by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4471
- Allow shebang comments at start-of-file by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4473
- Bring pycodestyle rules into full compatibility (on SciPy) by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4472
- Invert quote-style when generating code within f-strings by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4487
- Fix COM812 false positive in string subscript by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#4493
- Overhaul sdist handling by
[@&#8203;konstin](https://togithub.com/konstin) in
[astral-sh/ruff#4439

#### New Contributors

- [@&#8203;TylerYep](https://togithub.com/TylerYep) made their first
contribution in
[astral-sh/ruff#3979
- [@&#8203;yanksyoon](https://togithub.com/yanksyoon) made their first
contribution in
[astral-sh/ruff#4428
- [@&#8203;bendoerry](https://togithub.com/bendoerry) made their first
contribution in
[astral-sh/ruff#4431
- [@&#8203;qdegraaf](https://togithub.com/qdegraaf) made their first
contribution in
[astral-sh/ruff#4432
- [@&#8203;jameslamb](https://togithub.com/jameslamb) made their first
contribution in
[astral-sh/ruff#4446
- [@&#8203;john-h-k](https://togithub.com/john-h-k) made their first
contribution in
[astral-sh/ruff#4461

**Full Changelog**:
astral-sh/ruff@v0.0.267...v0.0.269

</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://app.renovatebot.com/dashboard#github/allenporter/pyrainbird).

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

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
renovate bot added a commit to allenporter/flux-local that referenced this pull request May 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://togithub.com/charliermarsh/ruff)
([changelog](https://togithub.com/charliermarsh/ruff/releases)) |
`==0.0.267` -> `==0.0.269` |
[![age](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/compatibility-slim/0.0.267)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/ruff/0.0.269/confidence-slim/0.0.267)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>charliermarsh/ruff</summary>

###
[`v0.0.269`](https://togithub.com/charliermarsh/ruff/releases/tag/v0.0.269)

[Compare
Source](https://togithub.com/charliermarsh/ruff/compare/v0.0.267...v0.0.269)

<!-- Release notes generated using configuration in .github/release.yml
at main -->

#### What's Changed

(This is a rerelease of `v0.0.268`, which didn't make it to PyPI due to
user error. As such, the release notes are copied below.)

##### `pycodestyle`

This release includes optimized implementations of a large portion of
`pycodestyle`, for those that use Ruff without an autoformatter.

In this initial release, the rules are being introduced under a
"nursery" flag, which requires that users explicitly select them (e.g.,
`select = ["E111"]`); in other words, these rules are not yet enabled
via `select = ["E"]`.

If you're interested in testing the `pycodestyle` rules, you can enable
them via:

```toml
select = [
    "E111", "E112", "E113", "E114", "E115", "E116", "E117",
    "E201", "E202", "E203", "E211", "E221", "E222", "E223",
    "E224", "E225", "E226", "E227", "E228", "E231", "E251",
    "E252", "E261", "E262", "E265", "E266", "E271", "E272",
    "E273", "E274", "E275",
]
```

These rules will be included as part of the `E` category in a future
release.

##### Breaking Changes

- \[`pyupgrade`] Remove `keep-runtime-typing` setting by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4427

##### Rules

- \[`pylint`] Add `duplicate-bases` rule by
[@&#8203;alonme](https://togithub.com/alonme) in
[astral-sh/ruff#4411
- \[`pylint`] Fix `PLW3301` auto-fix with generators by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#4412
- \[`flake8-async`] Implement flake8-async plugin by
[@&#8203;qdegraaf](https://togithub.com/qdegraaf) in
[astral-sh/ruff#4432
- \[`pyupgrade`] Enable automatic rewrites of `typing.Deque` and
`typing.DefaultDict` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4420
- \[`flake8-pyi`] Implement `unannotated-assignment-in-stub` (`PY052`)
by [@&#8203;sladyn98](https://togithub.com/sladyn98) in
[astral-sh/ruff#4293
- \[`tryceratops`] Implement TRY302 - `raise` after `except` by
[@&#8203;john-h-k](https://togithub.com/john-h-k) in
[astral-sh/ruff#4461
- \[`flake8-bandit`] Improve SQL injection detection logic (`S608`) by
[@&#8203;scop](https://togithub.com/scop) in
[astral-sh/ruff#4499
- \[`flake8-todos`] Implement `flake8_todos` by
[@&#8203;evanrittenhouse](https://togithub.com/evanrittenhouse) in
[astral-sh/ruff#3921
- \[`flake8-future-annotations`] Implement `flake8-future-annotations`
FA100 by [@&#8203;TylerYep](https://togithub.com/TylerYep) in
[astral-sh/ruff#3979
- Enable `pycodestyle` rules by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3689
- Enable `pycodestyle` rules under new "nursery" category by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4407

##### Settings

- Merge subsettings when extending configurations by
[@&#8203;bendoerry](https://togithub.com/bendoerry) in
[astral-sh/ruff#4431

##### Bug Fixes

- Extend multi-line noqa directives to start-of-line by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4490
- Fix scoping of comprehensions within classes by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4494
- Enable autofix for split-assertions at top level by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4405
- Ignore ANN401 for overridden methods by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#4409
- Fix `RUF010` autofix within f-strings by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#4423
- Update C419 to be a suggested fix by
[@&#8203;madkinsz](https://togithub.com/madkinsz) in
[astral-sh/ruff#4424
- Fix expected-indentation errors with end-of-line comments by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4438
- Emit non-logical newlines for "empty" lines by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4444
- Avoid emitting empty logical lines by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4452
- Avoid flagging missing whitespace for decorators by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4454
- Remove special-casing for whitespace-around-@&#8203; by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4458
- Avoid triggering `pd#at` and friends on non-subscripts by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4474
- Include precise tokens for extraneous-whitespace diagnostics by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4471
- Allow shebang comments at start-of-file by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4473
- Bring pycodestyle rules into full compatibility (on SciPy) by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4472
- Invert quote-style when generating code within f-strings by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#4487
- Fix COM812 false positive in string subscript by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#4493
- Overhaul sdist handling by
[@&#8203;konstin](https://togithub.com/konstin) in
[astral-sh/ruff#4439

#### New Contributors

- [@&#8203;TylerYep](https://togithub.com/TylerYep) made their first
contribution in
[astral-sh/ruff#3979
- [@&#8203;yanksyoon](https://togithub.com/yanksyoon) made their first
contribution in
[astral-sh/ruff#4428
- [@&#8203;bendoerry](https://togithub.com/bendoerry) made their first
contribution in
[astral-sh/ruff#4431
- [@&#8203;qdegraaf](https://togithub.com/qdegraaf) made their first
contribution in
[astral-sh/ruff#4432
- [@&#8203;jameslamb](https://togithub.com/jameslamb) made their first
contribution in
[astral-sh/ruff#4446
- [@&#8203;john-h-k](https://togithub.com/john-h-k) made their first
contribution in
[astral-sh/ruff#4461

**Full Changelog**:
astral-sh/ruff@v0.0.267...v0.0.269

</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://app.renovatebot.com/dashboard#github/allenporter/flux-local).

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

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
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants