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

Support mutually exclusive branches for B031 #3844

Merged
merged 3 commits into from Apr 4, 2023

Conversation

dhruvmanila
Copy link
Member

fixes: #3801

@github-actions
Copy link
Contributor

github-actions bot commented Apr 1, 2023

PR Check Results

Ecosystem

✅ ecosystem check detected no changes.

Benchmark

Linux

group                                      main                                   pr
-----                                      ----                                   --
linter/all-rules/large/dataset.py          1.04     15.2±0.18ms     2.7 MB/sec    1.00     14.6±0.05ms     2.8 MB/sec
linter/all-rules/numpy/ctypeslib.py        1.01      3.8±0.01ms     4.4 MB/sec    1.00      3.8±0.01ms     4.4 MB/sec
linter/all-rules/numpy/globals.py          1.00    409.8±1.84µs     7.2 MB/sec    1.01    415.6±1.81µs     7.1 MB/sec
linter/all-rules/pydantic/types.py         1.02      6.5±0.03ms     3.9 MB/sec    1.00      6.4±0.06ms     4.0 MB/sec
linter/default-rules/large/dataset.py      1.01      7.9±0.02ms     5.2 MB/sec    1.00      7.8±0.03ms     5.2 MB/sec
linter/default-rules/numpy/ctypeslib.py    1.00   1736.6±7.11µs     9.6 MB/sec    1.01   1750.4±2.65µs     9.5 MB/sec
linter/default-rules/numpy/globals.py      1.00    181.2±0.89µs    16.3 MB/sec    1.01    183.2±0.50µs    16.1 MB/sec
linter/default-rules/pydantic/types.py     1.00      3.6±0.00ms     7.0 MB/sec    1.00      3.6±0.01ms     7.0 MB/sec

Windows

group                                      main                                   pr
-----                                      ----                                   --
linter/all-rules/large/dataset.py          1.02     16.1±0.14ms     2.5 MB/sec    1.00     15.7±0.17ms     2.6 MB/sec
linter/all-rules/numpy/ctypeslib.py        1.01      4.1±0.05ms     4.0 MB/sec    1.00      4.1±0.05ms     4.1 MB/sec
linter/all-rules/numpy/globals.py          1.00    495.5±7.28µs     6.0 MB/sec    1.01    499.2±7.28µs     5.9 MB/sec
linter/all-rules/pydantic/types.py         1.01      6.8±0.09ms     3.7 MB/sec    1.00      6.7±0.12ms     3.8 MB/sec
linter/default-rules/large/dataset.py      1.01      8.2±0.06ms     4.9 MB/sec    1.00      8.2±0.07ms     5.0 MB/sec
linter/default-rules/numpy/ctypeslib.py    1.01  1802.4±20.99µs     9.2 MB/sec    1.00  1791.8±17.55µs     9.3 MB/sec
linter/default-rules/numpy/globals.py      1.02    196.4±7.92µs    15.0 MB/sec    1.00    192.9±5.07µs    15.3 MB/sec
linter/default-rules/pydantic/types.py     1.00      3.8±0.07ms     6.8 MB/sec    1.00      3.7±0.04ms     6.8 MB/sec

@JonathanPlasse
Copy link
Contributor

The recursive case is not handled correctly.

for _section, section_items in itertools.groupby(items, key=lambda p: p[1]):
    # Mutually exclusive branches shouldn't trigger the warning
    if _section == "greens":
        collect_shop_items(shopper, section_items)
        if _section == "greens":
            collect_shop_items(shopper, section_items)  # B031 false negative
        elif _section == "frozen items":
            collect_shop_items(shopper, section_items)  # B031 false negative
        else:
            collect_shop_items(shopper, section_items)  # B031 false negative
    elif _section == "frozen items":
        collect_shop_items(shopper, section_items)  # B031 false positive
    else:
        collect_shop_items(shopper, section_items)  # B031 false positive
    # Now, it should detect
    collect_shop_items(shopper, section_items)  # B031

@dhruvmanila dhruvmanila marked this pull request as draft April 2, 2023 04:36
@dhruvmanila
Copy link
Member Author

I'll give an explanation of the logic behind this in a couple of hours.

@dhruvmanila dhruvmanila marked this pull request as ready for review April 3, 2023 13:37
@dhruvmanila
Copy link
Member Author

Using the stack model:

A new stack element is pushed for every mutually exclusive statement (if/match statement, not elif/else/case) statements. This stack element is Vec<u8> where each number represents the count of group in individual branch. They're in the same order as that of branches or case blocks in case of match statements.

Once we're out of a mutually exclusive statement, the final count will be the max value from every branch/case. This will be added to either the parent statement or the global count if there isn't any.

image

@charliermarsh charliermarsh enabled auto-merge (squash) April 4, 2023 02:26
@charliermarsh
Copy link
Member

Thank you! I continue to be so impressed by your contributions, really appreciate your help improving Ruff.

@charliermarsh charliermarsh merged commit 76e111c into astral-sh:main Apr 4, 2023
12 checks passed
dhruvmanila added a commit to dhruvmanila/ruff that referenced this pull request Apr 4, 2023
@dhruvmanila
Copy link
Member Author

Thank you! I continue to be so impressed by your contributions, really appreciate your help improving Ruff.

Hey, thanks! I really enjoy contributing to the project :)

@dhruvmanila dhruvmanila deleted the fix/b031-false-positive branch April 4, 2023 03:14
bruxisma pushed a commit to ixm-one/pytest-cmake-presets that referenced this pull request Apr 5, 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) | `^0.0.260` ->
`^0.0.261` |
[![age](https://badges.renovateapi.com/packages/pypi/ruff/0.0.261/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/ruff/0.0.261/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/ruff/0.0.261/compatibility-slim/0.0.260)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/ruff/0.0.261/confidence-slim/0.0.260)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

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

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

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

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

#### What's Changed

##### Rules

- \[`flake8-simplify`] Ignore `collapsible-if` violations for `if
False:` and `if True:` by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#3732
- \[`flake8-pie`] Extend `unncessary-generator-any-all` to set
comprehensions by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3824
- \[`flake8-simplify`] Implement `dict-get-with-none-default` (`SIM910`)
by [@&#8203;kyoto7250](https://togithub.com/kyoto7250) in
[astral-sh/ruff#3874
- \[`flake8-annotations`] Additional simple magic return types by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[astral-sh/ruff#3805
- \[`flake8-pyi`]: fix PYI015 false positive on assignment of TypeVar &
friends by [@&#8203;bluetech](https://togithub.com/bluetech) in
[astral-sh/ruff#3861

##### Bug Fixes

- Improve robustness of argument removal for `encode` calls by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3802
- Fix SIM222 and SIM223 false positive by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#3832
- When checking module visibility, don't check entire ancestry by
[@&#8203;Hnasar](https://togithub.com/Hnasar) in
[astral-sh/ruff#3835
- Improve top-of-file insertions for required imports by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3779
- Use multi-fix semantics for `inplace` removal by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3804
- Flag non-`Name` expressions in `duplicate-isinstance-call` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3817
- Avoid `unnecessary-comprehension-any-all` for async generators by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3823
- Fix `is_module_name()` and improve perf of `is_identifier()` by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#3795
- Allow starred arguments in B030 by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3871
- Support mutually exclusive branches for `B031` by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[astral-sh/ruff#3844
- Consider logger candidate from `logging` module only by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[astral-sh/ruff#3878

##### Core

- Add import insertion support to autofix capabilities by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3787
- Generate `ImportMap` from module path to imported dependencies by
[@&#8203;chanman3388](https://togithub.com/chanman3388) in
[astral-sh/ruff#3243

##### Docs

- Add documentation for `ruff-action` (GitHub Action!) by
[@&#8203;brucearctor](https://togithub.com/brucearctor) in
[astral-sh/ruff#3857

#### New Contributors

- [@&#8203;AetherUnbound](https://togithub.com/AetherUnbound) made their
first contribution in
[astral-sh/ruff#3806
- [@&#8203;Hnasar](https://togithub.com/Hnasar) made their first
contribution in
[astral-sh/ruff#3835
- [@&#8203;nvuillam](https://togithub.com/nvuillam) made their first
contribution in
[astral-sh/ruff#3848
- [@&#8203;brucearctor](https://togithub.com/brucearctor) made their
first contribution in
[astral-sh/ruff#3857

**Full Changelog**:
astral-sh/ruff@v0.0.260...v0.0.261

</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:eyJjcmVhdGVkSW5WZXIiOiIzNS4zMi4yIiwidXBkYXRlZEluVmVyIjoiMzUuMzIuMiJ9-->

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 Apr 7, 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) | `==0.0.260` ->
`==0.0.261` |
[![age](https://badges.renovateapi.com/packages/pypi/ruff/0.0.261/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/ruff/0.0.261/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/ruff/0.0.261/compatibility-slim/0.0.260)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/ruff/0.0.261/confidence-slim/0.0.260)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

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

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

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

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

#### What's Changed

##### Rules

- \[`flake8-simplify`] Ignore `collapsible-if` violations for `if
False:` and `if True:` by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#3732
- \[`flake8-pie`] Extend `unncessary-generator-any-all` to set
comprehensions by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3824
- \[`flake8-simplify`] Implement `dict-get-with-none-default` (`SIM910`)
by [@&#8203;kyoto7250](https://togithub.com/kyoto7250) in
[astral-sh/ruff#3874
- \[`flake8-annotations`] Additional simple magic return types by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[astral-sh/ruff#3805
- \[`flake8-pyi`]: fix PYI015 false positive on assignment of TypeVar &
friends by [@&#8203;bluetech](https://togithub.com/bluetech) in
[astral-sh/ruff#3861

##### Bug Fixes

- Improve robustness of argument removal for `encode` calls by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3802
- Fix SIM222 and SIM223 false positive by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#3832
- When checking module visibility, don't check entire ancestry by
[@&#8203;Hnasar](https://togithub.com/Hnasar) in
[astral-sh/ruff#3835
- Improve top-of-file insertions for required imports by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3779
- Use multi-fix semantics for `inplace` removal by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3804
- Flag non-`Name` expressions in `duplicate-isinstance-call` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3817
- Avoid `unnecessary-comprehension-any-all` for async generators by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3823
- Fix `is_module_name()` and improve perf of `is_identifier()` by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#3795
- Allow starred arguments in B030 by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3871
- Support mutually exclusive branches for `B031` by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[astral-sh/ruff#3844
- Consider logger candidate from `logging` module only by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[astral-sh/ruff#3878

##### Core

- Add import insertion support to autofix capabilities by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3787
- Generate `ImportMap` from module path to imported dependencies by
[@&#8203;chanman3388](https://togithub.com/chanman3388) in
[astral-sh/ruff#3243

##### Docs

- Add documentation for `ruff-action` (GitHub Action!) by
[@&#8203;brucearctor](https://togithub.com/brucearctor) in
[astral-sh/ruff#3857

#### New Contributors

- [@&#8203;AetherUnbound](https://togithub.com/AetherUnbound) made their
first contribution in
[astral-sh/ruff#3806
- [@&#8203;Hnasar](https://togithub.com/Hnasar) made their first
contribution in
[astral-sh/ruff#3835
- [@&#8203;nvuillam](https://togithub.com/nvuillam) made their first
contribution in
[astral-sh/ruff#3848
- [@&#8203;brucearctor](https://togithub.com/brucearctor) made their
first contribution in
[astral-sh/ruff#3857

**Full Changelog**:
astral-sh/ruff@v0.0.260...v0.0.261

</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:eyJjcmVhdGVkSW5WZXIiOiIzNS4zNC4xIiwidXBkYXRlZEluVmVyIjoiMzUuMzQuMSJ9-->

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 Apr 7, 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) | `==0.0.260` ->
`==0.0.261` |
[![age](https://badges.renovateapi.com/packages/pypi/ruff/0.0.261/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/ruff/0.0.261/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/ruff/0.0.261/compatibility-slim/0.0.260)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/ruff/0.0.261/confidence-slim/0.0.260)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

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

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

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

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

#### What's Changed

##### Rules

- \[`flake8-simplify`] Ignore `collapsible-if` violations for `if
False:` and `if True:` by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#3732
- \[`flake8-pie`] Extend `unncessary-generator-any-all` to set
comprehensions by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3824
- \[`flake8-simplify`] Implement `dict-get-with-none-default` (`SIM910`)
by [@&#8203;kyoto7250](https://togithub.com/kyoto7250) in
[astral-sh/ruff#3874
- \[`flake8-annotations`] Additional simple magic return types by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[astral-sh/ruff#3805
- \[`flake8-pyi`]: fix PYI015 false positive on assignment of TypeVar &
friends by [@&#8203;bluetech](https://togithub.com/bluetech) in
[astral-sh/ruff#3861

##### Bug Fixes

- Improve robustness of argument removal for `encode` calls by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3802
- Fix SIM222 and SIM223 false positive by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#3832
- When checking module visibility, don't check entire ancestry by
[@&#8203;Hnasar](https://togithub.com/Hnasar) in
[astral-sh/ruff#3835
- Improve top-of-file insertions for required imports by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3779
- Use multi-fix semantics for `inplace` removal by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3804
- Flag non-`Name` expressions in `duplicate-isinstance-call` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3817
- Avoid `unnecessary-comprehension-any-all` for async generators by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3823
- Fix `is_module_name()` and improve perf of `is_identifier()` by
[@&#8203;JonathanPlasse](https://togithub.com/JonathanPlasse) in
[astral-sh/ruff#3795
- Allow starred arguments in B030 by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3871
- Support mutually exclusive branches for `B031` by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[astral-sh/ruff#3844
- Consider logger candidate from `logging` module only by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[astral-sh/ruff#3878

##### Core

- Add import insertion support to autofix capabilities by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[astral-sh/ruff#3787
- Generate `ImportMap` from module path to imported dependencies by
[@&#8203;chanman3388](https://togithub.com/chanman3388) in
[astral-sh/ruff#3243

##### Docs

- Add documentation for `ruff-action` (GitHub Action!) by
[@&#8203;brucearctor](https://togithub.com/brucearctor) in
[astral-sh/ruff#3857

#### New Contributors

- [@&#8203;AetherUnbound](https://togithub.com/AetherUnbound) made their
first contribution in
[astral-sh/ruff#3806
- [@&#8203;Hnasar](https://togithub.com/Hnasar) made their first
contribution in
[astral-sh/ruff#3835
- [@&#8203;nvuillam](https://togithub.com/nvuillam) made their first
contribution in
[astral-sh/ruff#3848
- [@&#8203;brucearctor](https://togithub.com/brucearctor) made their
first contribution in
[astral-sh/ruff#3857

**Full Changelog**:
astral-sh/ruff@v0.0.260...v0.0.261

</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:eyJjcmVhdGVkSW5WZXIiOiIzNS4zNC4xIiwidXBkYXRlZEluVmVyIjoiMzUuMzQuMSJ9-->

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.

False positive for B031 in mutually exclusive branches
3 participants