Skip to content

Add support for auto-fix in Jupyter notebooks#4665

Merged
dhruvmanila merged 37 commits intoastral-sh:mainfrom
dhruvmanila:feat/jupyter-notebook-autofix
Jun 12, 2023
Merged

Add support for auto-fix in Jupyter notebooks#4665
dhruvmanila merged 37 commits intoastral-sh:mainfrom
dhruvmanila:feat/jupyter-notebook-autofix

Conversation

@dhruvmanila
Copy link
Member

@dhruvmanila dhruvmanila commented May 26, 2023

Summary

Add initial support for applying auto-fixes in Jupyter Notebook.

Solution

Cell offsets are the boundaries for each cell in the concatenated source code. They are represented using TextSize. It includes the start and end offset as well, thus creating a range for each cell. These offsets are updated using the SourceMap markers.

SourceMap

SourceMap contains markers constructed from each edits which tracks the original source code position to the transformed positions. The following drawing might make it clear:

image

The center column where the dotted lines are present are the markers included in the SourceMap. The Notebook looks at these markers and updates the cell offsets after each linter loop. If you notice closely, the destination takes into account all of the markers before it.

The index is constructed only when required as it's only used to render the diagnostics. So, a OnceCell is used for this purpose. The cell offsets, cell content and the index will be updated after each iteration of linting in the mentioned order. The order is important here as the content is updated as per the new offsets and index is updated as per the new content.

Limitations

1 (resolved d721923)

Auto-fixes which spans across multiple cell will panic. This is because it's difficult to determine which part of the edit content belongs to which cell. This mainly includes the import sorter in the following scenario where there are 2 continuous cells with import statements:

import random
import os
# ---
import math

(The commented line break is just to visualize cell separation and is not part of the code.)

Here, the concatenated content would be:

import random
import os
import math

And the formatted output would be:

import math
import random
import os

Now, it's not possible to determine which part of the content belongs to which cell and even if we try to update it as per the line count the context will change as an import might move out from the actual cell.

Possible solutions:

  • We could ignore the Edit which spans across multiple cells but this creates a problem in the lint loop. Take the above code as an example where there are 2 cells containing import statements which needs to be sorted. Now, this edit will span both cells, we'll ignore this edit, in the next iteration the same edit will be created and ignored and this will go on till we reach MAX_ITERATION.
  • Scope rules to be either global or local to the cell -- should we apply this rule to the concatenated source code or individually to each cell?
  • As this problem mainly occurs in the import sorter due to the fact that the Edit is scoped to an entire import block, we could refactor the sorter to create individual edits such as move this import statement from line 4 to line 2, remove this import statement, remove this symbol from this import statement, add a symbol to this import statement, etc. We would have to think about how to represent an edit like separating each symbol on it's own line (black style).

2

Styling rules such as the ones in pycodestyle will not be applicable everywhere in Jupyter notebook, especially at the cell boundaries. Let's take an example where a rule suggests to have 2 blank lines before a function and the cells contains the following code:

import something
# ---
def first():
	pass

def second():
	pass

(Again, the comment is only to visualize cell boundaries.)

In the concatenated source code, the 2 blank lines will be added but it shouldn't actually be added when we look in terms of Jupyter notebook. It's as if the function first is at the start of a file.

nbqa solves this by recording newlines before and after running autopep8, then running the tool and restoring the newlines at the end (refer nbQA-dev/nbQA#807).

Test Plan

Three commands were run in order with common flags (--select=ALL --no-cache --isolated) to isolate which stage the problem is occurring:

  1. Only diagnostics
  2. Fix with diff (--fix --diff)
  3. Fix (--fix)

https://github.com/facebookresearch/segment-anything

-------------------------------------------------------------------------------
 Jupyter Notebooks       3            0            0            0            0
 |- Markdown             3           98            0           94            4
 |- Python               3          513          468            4           41
 (Total)                            611          468           98           45
-------------------------------------------------------------------------------
$ cargo run --all-features --bin ruff -- check --no-cache --isolated --select=ALL /path/to/segment-anything/**/*.ipynb --fix
...
Found 180 errors (89 fixed, 91 remaining).

https://github.com/openai/openai-cookbook

-------------------------------------------------------------------------------
 Jupyter Notebooks      65            0            0            0            0
 |- Markdown            64         3475           12         2507          956
 |- Python              65         9700         7362         1101         1237
 (Total)                          13175         7374         3608         2193
===============================================================================
$ cargo run --all-features --bin ruff -- check --no-cache --isolated --select=ALL /path/to/openai-cookbook/**/*.ipynb --fix
error: Failed to parse /path/to/openai-cookbook/examples/vector_databases/Using_vector_databases_for_embeddings_search.ipynb:cell 4:29:18: unexpected token '-'
...
Found 4227 errors (2165 fixed, 2062 remaining).

https://github.com/tensorflow/docs

-------------------------------------------------------------------------------
 Jupyter Notebooks     150            0            0            0            0
 |- Markdown             1           55            0           46            9
 |- Python               1          402          289           60           53
 (Total)                            457          289          106           62
-------------------------------------------------------------------------------

These repository includes some notebooks where it panics because an edit spans across multiple cells. This is due to the import statements are in 2 or more continuous cells. (resolved d721923)

$ cargo run --all-features --bin ruff -- check --no-cache --isolated --select=ALL /path/to/tensorflow-docs/**/*.ipynb --fix
error: Failed to parse /path/to/tensorflow-docs/site/en/guide/extension_type.ipynb:cell 80:1:1: unexpected token Indent
error: Failed to parse /path/to/tensorflow-docs/site/en/r1/tutorials/eager/custom_layers.ipynb:cell 20:1:1: unexpected token Indent
error: Failed to parse /path/to/tensorflow-docs/site/en/guide/data.ipynb:cell 175:5:14: unindent does not match any outer indentation level
error: Failed to parse /path/to/tensorflow-docs/site/en/r1/tutorials/representation/unicode.ipynb:cell 30:1:1: unexpected token Indent
...
Found 12726 errors (5140 fixed, 7586 remaining).

https://github.com/tensorflow/models

-------------------------------------------------------------------------------
 Jupyter Notebooks      46            0            0            0            0
 |- Markdown             1           11            0            6            5
 |- Python               1          328          249           19           60
 (Total)                            339          249           25           65
-------------------------------------------------------------------------------
$ cargo run --all-features --bin ruff -- check --no-cache --isolated --select=ALL /path/to/tensorflow-models/**/*.ipynb --fix
...
Found 4856 errors (2690 fixed, 2166 remaining).

To-Do:

  • Revert back the auto-fixes if the linter loop panics (as is done for Python files)
  • Verify that the updated notebook is parseable by nbformat (only for testing purposes)
  • Add roundtrip support (this will most likely be done with the second todo) (different PR)
  • Ignore cells containing magic commands (%, !, ?) on any cells (this will ignore cells which contains code as well as magic commands). Just for backup, ignore any cells containing syntax error
  • Add --diff preview for Jupyter notebook
  • Newline at the end of each cell is removed but then Ruff will complain about missing newline at the end of file. The --fix flag will try to add the newline, but we'll remove it before updating the cell and this loop will go on.

resolves: #1218
fixes: #4556

@dhruvmanila dhruvmanila marked this pull request as draft May 26, 2023 08:33
@github-actions
Copy link
Contributor

github-actions bot commented May 26, 2023

PR Check Results

Ecosystem

✅ ecosystem check detected no changes.

Benchmark

Linux

group                                      main                                   pr
-----                                      ----                                   --
formatter/large/dataset.py                 1.04      8.5±0.18ms     4.8 MB/sec    1.00      8.2±0.16ms     5.0 MB/sec
formatter/numpy/ctypeslib.py               1.02  1758.8±53.46µs     9.5 MB/sec    1.00  1722.1±44.25µs     9.7 MB/sec
formatter/numpy/globals.py                 1.02    169.5±5.41µs    17.4 MB/sec    1.00    166.4±9.00µs    17.7 MB/sec
formatter/pydantic/types.py                1.02      3.5±0.08ms     7.3 MB/sec    1.00      3.4±0.13ms     7.5 MB/sec
linter/all-rules/large/dataset.py          1.00     18.7±0.30ms     2.2 MB/sec    1.01     18.9±0.28ms     2.1 MB/sec
linter/all-rules/numpy/ctypeslib.py        1.00      4.4±0.10ms     3.8 MB/sec    1.01      4.4±0.12ms     3.8 MB/sec
linter/all-rules/numpy/globals.py          1.00   550.5±10.93µs     5.4 MB/sec    1.02   563.6±20.20µs     5.2 MB/sec
linter/all-rules/pydantic/types.py         1.00      7.8±0.18ms     3.3 MB/sec    1.02      7.9±0.23ms     3.2 MB/sec
linter/default-rules/large/dataset.py      1.00      8.5±0.12ms     4.8 MB/sec    1.04      8.9±0.14ms     4.6 MB/sec
linter/default-rules/numpy/ctypeslib.py    1.00  1867.9±53.82µs     8.9 MB/sec    1.02  1908.7±37.67µs     8.7 MB/sec
linter/default-rules/numpy/globals.py      1.00   218.4±12.47µs    13.5 MB/sec    1.01    219.8±6.26µs    13.4 MB/sec
linter/default-rules/pydantic/types.py     1.00      4.0±0.09ms     6.4 MB/sec    1.02      4.1±0.14ms     6.3 MB/sec

Windows

group                                      main                                   pr
-----                                      ----                                   --
formatter/large/dataset.py                 1.01      8.0±0.05ms     5.1 MB/sec    1.00      7.9±0.06ms     5.1 MB/sec
formatter/numpy/ctypeslib.py               1.02  1627.4±14.17µs    10.2 MB/sec    1.00  1593.1±13.14µs    10.5 MB/sec
formatter/numpy/globals.py                 1.00    157.0±1.79µs    18.8 MB/sec    1.00    156.7±3.35µs    18.8 MB/sec
formatter/pydantic/types.py                1.00      3.3±0.03ms     7.8 MB/sec    1.00      3.3±0.04ms     7.8 MB/sec
linter/all-rules/large/dataset.py          1.00     16.9±0.15ms     2.4 MB/sec    1.00     16.9±0.13ms     2.4 MB/sec
linter/all-rules/numpy/ctypeslib.py        1.01      4.4±0.04ms     3.8 MB/sec    1.00      4.3±0.08ms     3.8 MB/sec
linter/all-rules/numpy/globals.py          1.01    440.7±7.74µs     6.7 MB/sec    1.00    436.0±6.83µs     6.8 MB/sec
linter/all-rules/pydantic/types.py         1.00      7.3±0.06ms     3.5 MB/sec    1.00      7.4±0.09ms     3.5 MB/sec
linter/default-rules/large/dataset.py      1.01      8.5±0.10ms     4.8 MB/sec    1.00      8.4±0.07ms     4.8 MB/sec
linter/default-rules/numpy/ctypeslib.py    1.01  1768.0±13.79µs     9.4 MB/sec    1.00  1747.5±12.47µs     9.5 MB/sec
linter/default-rules/numpy/globals.py      1.00    189.9±2.89µs    15.5 MB/sec    1.00    189.7±5.45µs    15.6 MB/sec
linter/default-rules/pydantic/types.py     1.00      3.8±0.02ms     6.7 MB/sec    1.00      3.8±0.02ms     6.7 MB/sec

Copy link
Member

@konstin konstin left a comment

Choose a reason for hiding this comment

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

looks good so far, i'll give it a more nit-picky review once it's not a draft anymore

}
}

impl JupyterIndexBuilder {
Copy link
Member

Choose a reason for hiding this comment

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

Could we do without the separate builder here?

Copy link
Member Author

Choose a reason for hiding this comment

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

The reason to have a builder is to have both the index and cell offsets built in a single loop with each individual cell.

Cell offsets are built from the source code only for the first time. They cannot be refreshed using the transformed source code but require to process each individual edit to update the offsets.

When a single auto-fix iteration ends, the index is refreshed from the transformed source code, source code is updated in each cell and cell offsets are updated from the edits (order is important).

@dhruvmanila dhruvmanila force-pushed the feat/jupyter-notebook-autofix branch from 1f234d9 to 28f09de Compare June 1, 2023 05:29
.unwrap_or_else(|| panic!("cell content out of bounds: {:?}", &self.raw.cells[pos]))
.trim_end_matches(|c| c == '\r' || c == '\n')
.to_string();
self.raw.cells[pos].source = SourceValue::String(cell_content);
Copy link
Member Author

@dhruvmanila dhruvmanila Jun 1, 2023

Choose a reason for hiding this comment

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

The reason to choose String over StringArray is that the latter should contain the newline as part of each element which means that str.lines would not work and we would either need a custom iterator with strings including the newline character or add newlines to each element individually.

@dhruvmanila dhruvmanila force-pushed the feat/jupyter-notebook-autofix branch from bf72009 to 7483383 Compare June 1, 2023 08:47
@dhruvmanila dhruvmanila marked this pull request as ready for review June 1, 2023 10:44
@dhruvmanila dhruvmanila requested a review from konstin June 1, 2023 10:44
@charliermarsh charliermarsh self-requested a review June 1, 2023 15:17
pub(super) inner: Arc<JupyterIndexInner>,
}

impl JupyterIndex {
Copy link
Member

Choose a reason for hiding this comment

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

Maybe: Create newtype wrappers for Cell and Row (or use OneIndexed?) Newtype wrappers can encode the information that cell returns a Cell and prevents users from mixing cell with rows.

Copy link
Member Author

Choose a reason for hiding this comment

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

Newtype wrappers makes sense but let me see if OneIndexed works better.

Copy link
Member Author

Choose a reason for hiding this comment

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

Actually, I'm not sure if Newtype wrappers would be correct as the cell and row numbers are generated internally and it's only returned via the public interface. It's used directly when emitting the diagnostic message and it won't have any context about these newtypes.

Copy link
Member

Choose a reason for hiding this comment

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

Not sure if I understand fully, but I trust your judgment. My main intention of introducing them would be to make it harder to mix up the two.

Comment on lines +21 to +23
/// The set of [`Edit`] that were applied.
pub(crate) edits: BTreeSet<&'a Edit>,
Copy link
Member

Choose a reason for hiding this comment

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

Would it instead be possible to return a SourceMap that maps source positions to target positions in the FixResult. I would prefer that because it has a more narrow API and allows better re-use if we have other mapped types (e.g. python code in markdown files)

Copy link
Member

Choose a reason for hiding this comment

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

I would support this -- could you describe in a bit more detail how it would work?

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 it would roughly do the same as update_cell_offsets does today:

The source map is defined as a Vec<SourceMapMarker> where each marker stores the source to destination position:

https://github.com/charliermarsh/ruff/blob/d1c7a07d2ae56f4ff56b81c7f2a398e2262c42b9/crates/ruff_formatter/src/lib.rs#L285-L290

  • Insertion:
    • One marker at the start: insertion_offset -> output.text_len()
    • One marker at the end: insertion_offset -> output.text_len()
  • Deletion:
    • One marker at the start: deletion_start -> output.text_len()
    • One marker at the end: deletion_end -> output.text_len()
  • Replacement:
    • One marker at the start: replacement_start -> output.text_len()
    • One marker at the end: replacement_end -> output.text_len()

The entries are guaranteed to be sorted (at least per "apply fixes" iteration). We can now search the start and end of each cell (or use an iterator and make use of the sorted property to avoid cell count binary searches):

  • cell start: Find the last source map entry that is smaller or equal to the cell start. The output position of the start is: marker.dest + cell.start - marker.source I think we need to use the first entry if multiple source marker start RIGHT at the start of the cell.
  • cell end: Find the last source map entry that ends before or at cel.end. You can map the end as: marker.dest + marker.source - cell.end

There are probably some corner cases that I didn't consider.

One downside of this is that returning the BTreeMap is free because we build it anyway whereas building the source map has the cost of writing the source mark entries for each edit.

Copy link
Member

@konstin konstin left a comment

Choose a reason for hiding this comment

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

needs tests, otherwise it's looking good

.collect(),
};
// Ignore a cell if it contains a magic command. There could be valid
// Python code as well, but we'll ignore that for now.
Copy link
Member

Choose a reason for hiding this comment

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

it's fine for this PR, but i believe we do need to keep the python code or we'll see some undefined symbol false positives because they were defined in cell that starts with a % line

Copy link
Member Author

Choose a reason for hiding this comment

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

Yes, we'll have to roll out our own magic transformer :)

@charliermarsh
Copy link
Member

My main suggestion for resolving (1), at least for import sorting (which, I think, is the only edit that spans multiple statements in this way), is to find a way to make the BlockBuilder aware of cell boundaries. The BlockBuilder already kind of supports this behavior, because it has to support isort's split directives:

import sys
import os
# isort: split
import abc
import collections

In this case, the first two imports will be treated as an import block, and the second two imports will be treated as an independent import block. Conceptually, this is identical (?) to the splits we want to enforce between cells. I'd suggest finding a way to feed those splits into the BlockBuilder!

@dhruvmanila
Copy link
Member Author

i'd make this a source code comment

(There's no reply section for this comment, so putting it out here)

I'm not sure what do you mean by "source code comment". Do you want me to comment the reason for the trailing_newline?

would also make this a code comment

Same as above.

needs tests, otherwise it's looking good

Yes, I wanted to wait for the initial feedback incase there were some changes although I've already started writing some basic test cases.

@zanieb
Copy link
Member

zanieb commented Jun 3, 2023

(There's no reply section for this comment, so putting it out here)

fyi GitHub does weird things with threaded conversations — the threads are up higher at #4665 (comment) / #4665 (comment)

@dhruvmanila dhruvmanila force-pushed the feat/jupyter-notebook-autofix branch from afe9a2e to b10e940 Compare June 4, 2023 10:43
@dhruvmanila dhruvmanila changed the title Initial support for auto-fix in Jupyter notebooks Add support for auto-fix in Jupyter notebooks Jun 9, 2023
@dhruvmanila
Copy link
Member Author

Updates since last review

  • SourceMap have been added and the cell offsets are updated using that
  • Empty code cells are handled while creating the index
  • Basic unit tests have been added to tests the above improvements
  • Import sorting panic has been fixed by considering each cell as an individual block using the cell offsets

Copy link
Member

@charliermarsh charliermarsh left a comment

Choose a reason for hiding this comment

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

This is really excellent work.

break;
}
}
}
Copy link
Member

Choose a reason for hiding this comment

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

Nice.

pub enum SourceKind {
Python(String),
Jupyter(Notebook),
}
Copy link
Member

Choose a reason for hiding this comment

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

Nice.

///
/// The index is built only once when required. This is only used to
/// report diagnostics, so by that time all of the autofixes must have
/// been applied if `--fix` was passed.
Copy link
Member

Choose a reason for hiding this comment

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

I'm loving all the documentation you're adding as you go. This is a very, very good habit. Props.

Copy link
Member

@konstin konstin left a comment

Choose a reason for hiding this comment

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

Is there any integration test that shows a jupyter notebook before and after being fixed?

}
// Ignore a cell if it contains a magic command. There could be valid
// Python code as well, but we'll ignore that for now.
// TODO(dhruvmanila): https://github.com/psf/black/blob/main/src/black/handle_ipynb_magics.py
Copy link
Member

Choose a reason for hiding this comment

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

my concern before setting this to on by default would be that this causes a bunch of undefined symbols when the symbols do exist. but i'd say let's merge this and check with notebooks from github whether this is even actually a problem.

find . -name "*.ipynb" | wc -l in the ecosystem checkouts says 7639, so we have more than enough notebooks to check

Copy link
Member Author

Choose a reason for hiding this comment

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

Yes, I do think this will be a problem, I've looked at how black handles it. I'll open an issue detailing out what needs to happen and we can then implement it.

@dhruvmanila dhruvmanila force-pushed the feat/jupyter-notebook-autofix branch from b08c7c2 to be2f295 Compare June 12, 2023 13:55
@dhruvmanila
Copy link
Member Author

Is there any integration test that shows a jupyter notebook before and after being fixed?

Currently, I've tested it out on the repositories mentioned in the PR description. I'm trying to think how to have E2E testing here as just the snapshots might not be enough. I'll run it on the ecosystem notebooks.

@dhruvmanila dhruvmanila enabled auto-merge (squash) June 12, 2023 14:11
@dhruvmanila dhruvmanila merged commit d8f5d2d into astral-sh:main Jun 12, 2023
@dhruvmanila dhruvmanila deleted the feat/jupyter-notebook-autofix branch June 12, 2023 14:15
@konstin
Copy link
Member

konstin commented Jun 12, 2023

i was thinking about a notebook where we have before fixing and after fixing both in git and check that the fixed version looks like the one we have stored

@dhruvmanila
Copy link
Member Author

Right, so do you mean to compare the 2 JSON objects? They both will be available in source control. I think we should rather compare the source code content as the JSON will not be identical:

The reason to choose String over StringArray is that the latter should contain the newline as part of each element which means that str.lines would not work and we would either need a custom iterator with strings including the newline character or add newlines to each element individually.

#4665 (comment)

So, 2 notebooks where one is the original content and the other what we expect Ruff to transform into.

  1. Read the notebook
  2. Pass the source code to Ruff
  3. Update the internal state
  4. Read the expected notebook
  5. Compare

dhruvmanila added a commit that referenced this pull request Jun 12, 2023
## Summary

Add roundtrip support for Jupyter notebook.

1. Read the notebook
2. Extract out the source code content
3. Use it to update the notebook itself (should be exactly the same [^1])
4. Serialize into JSON and print it to stdout

## Test Plan

`cargo run --all-features --bin ruff_dev --package ruff_dev --
round-trip <path/to/notebook.ipynb>`

<details><summary>Example output:</summary>
<p>

```
{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "f3c286e9-fa52-4440-816f-4449232f199a",
   "metadata": {},
   "source": [
    "# Ruff Test"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a2b7bc6c-778a-4b07-86ae-dde5a2d9511e",
   "metadata": {},
   "source": [
    "Markdown block before the first import"
   ]
  },
  {
   "cell_type": "code",
   "id": "5e3ef98e-224c-450a-80e6-be442ad50907",
   "metadata": {
    "tags": []
   },
   "source": "",
   "execution_count": 1,
   "outputs": []
  },
  {
   "cell_type": "code",
   "id": "6bced3f8-e0a4-450c-ae7c-f60ad5671ee9",
   "metadata": {},
   "source": "import contextlib\n\nwith contextlib.suppress(ValueError):\n    print()\n",
   "outputs": []
  },
  {
   "cell_type": "code",
   "id": "d7102cfd-5bb5-4f5b-a3b8-07a7b8cca34c",
   "metadata": {},
   "source": "import random\n\nrandom.randint(10, 20)",
   "outputs": []
  },
  {
   "cell_type": "code",
   "id": "88471d1c-7429-4967-898f-b0088fcb4c53",
   "metadata": {},
   "source": "foo = 1\nif foo < 2:\n    msg = f\"Invalid foo: {foo}\"\n    raise ValueError(msg)",
   "outputs": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python (ruff-playground)",
   "name": "ruff-playground",
   "language": "python"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "pygments_lexer": "ipython3",
   "nbconvert_exporter": "python",
   "version": "3.11.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
```

</p>
</details> 

[^1]: The type in JSON might be different (#4665 (comment))

Part of #1218
konstin pushed a commit that referenced this pull request Jun 13, 2023
## Summary

Add support for applying auto-fixes in Jupyter Notebook.

### Solution

Cell offsets are the boundaries for each cell in the concatenated source
code. They are represented using `TextSize`. It includes the start and
end offset as well, thus creating a range for each cell. These offsets
are updated using the `SourceMap` markers.

### SourceMap

`SourceMap` contains markers constructed from each edits which tracks
the original source code position to the transformed positions. The
following drawing might make it clear:

![SourceMap visualization](https://github.com/astral-sh/ruff/assets/67177269/3c94e591-70a7-4b57-bd32-0baa91cc7858)

The center column where the dotted lines are present are the markers
included in the `SourceMap`. The `Notebook` looks at these markers and
updates the cell offsets after each linter loop. If you notice closely,
the destination takes into account all of the markers before it.

The index is constructed only when required as it's only used to render
the diagnostics. So, a `OnceCell` is used for this purpose. The cell
offsets, cell content and the index will be updated after each iteration
of linting in the mentioned order. The order is important here as the
content is updated as per the new offsets and index is updated as per
the new content.

## Limitations

### 1

Styling rules such as the ones in `pycodestyle` will not be applicable
everywhere in Jupyter notebook, especially at the cell boundaries. Let's
take an example where a rule suggests to have 2 blank lines before a
function and the cells contains the following code:

```python
import something
# ---
def first():
	pass

def second():
	pass
```

(Again, the comment is only to visualize cell boundaries.)

In the concatenated source code, the 2 blank lines will be added but it
shouldn't actually be added when we look in terms of Jupyter notebook.
It's as if the function `first` is at the start of a file.

`nbqa` solves this by recording newlines before and after running
`autopep8`, then running the tool and restoring the newlines at the end
(refer nbQA-dev/nbQA#807).

## Test Plan

Three commands were run in order with common flags (`--select=ALL
--no-cache --isolated`) to isolate which stage the problem is occurring:
1. Only diagnostics
2. Fix with diff (`--fix --diff`)
3. Fix (`--fix`)

### https://github.com/facebookresearch/segment-anything

```
-------------------------------------------------------------------------------
 Jupyter Notebooks       3            0            0            0            0
 |- Markdown             3           98            0           94            4
 |- Python               3          513          468            4           41
 (Total)                            611          468           98           45
-------------------------------------------------------------------------------
```

```console
$ cargo run --all-features --bin ruff -- check --no-cache --isolated --select=ALL /path/to/segment-anything/**/*.ipynb --fix
...
Found 180 errors (89 fixed, 91 remaining).
```

### https://github.com/openai/openai-cookbook

```
-------------------------------------------------------------------------------
 Jupyter Notebooks      65            0            0            0            0
 |- Markdown            64         3475           12         2507          956
 |- Python              65         9700         7362         1101         1237
 (Total)                          13175         7374         3608         2193
===============================================================================
```

```console
$ cargo run --all-features --bin ruff -- check --no-cache --isolated --select=ALL /path/to/openai-cookbook/**/*.ipynb --fix
error: Failed to parse /path/to/openai-cookbook/examples/vector_databases/Using_vector_databases_for_embeddings_search.ipynb:cell 4:29:18: unexpected token '-'
...
Found 4227 errors (2165 fixed, 2062 remaining).
```

### https://github.com/tensorflow/docs

```
-------------------------------------------------------------------------------
 Jupyter Notebooks     150            0            0            0            0
 |- Markdown             1           55            0           46            9
 |- Python               1          402          289           60           53
 (Total)                            457          289          106           62
-------------------------------------------------------------------------------
```

```console
$ cargo run --all-features --bin ruff -- check --no-cache --isolated --select=ALL /path/to/tensorflow-docs/**/*.ipynb --fix
error: Failed to parse /path/to/tensorflow-docs/site/en/guide/extension_type.ipynb:cell 80:1:1: unexpected token Indent
error: Failed to parse /path/to/tensorflow-docs/site/en/r1/tutorials/eager/custom_layers.ipynb:cell 20:1:1: unexpected token Indent
error: Failed to parse /path/to/tensorflow-docs/site/en/guide/data.ipynb:cell 175:5:14: unindent does not match any outer indentation level
error: Failed to parse /path/to/tensorflow-docs/site/en/r1/tutorials/representation/unicode.ipynb:cell 30:1:1: unexpected token Indent
...
Found 12726 errors (5140 fixed, 7586 remaining).
```

### https://github.com/tensorflow/models

```
-------------------------------------------------------------------------------
 Jupyter Notebooks      46            0            0            0            0
 |- Markdown             1           11            0            6            5
 |- Python               1          328          249           19           60
 (Total)                            339          249           25           65
-------------------------------------------------------------------------------
```

```console
$ cargo run --all-features --bin ruff -- check --no-cache --isolated --select=ALL /path/to/tensorflow-models/**/*.ipynb --fix
...
Found 4856 errors (2690 fixed, 2166 remaining).
```

resolves: #1218
fixes: #4556
konstin pushed a commit that referenced this pull request Jun 13, 2023
## Summary

Add roundtrip support for Jupyter notebook.

1. Read the notebook
2. Extract out the source code content
3. Use it to update the notebook itself (should be exactly the same [^1])
4. Serialize into JSON and print it to stdout

## Test Plan

`cargo run --all-features --bin ruff_dev --package ruff_dev --
round-trip <path/to/notebook.ipynb>`

<details><summary>Example output:</summary>
<p>

```
{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "f3c286e9-fa52-4440-816f-4449232f199a",
   "metadata": {},
   "source": [
    "# Ruff Test"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a2b7bc6c-778a-4b07-86ae-dde5a2d9511e",
   "metadata": {},
   "source": [
    "Markdown block before the first import"
   ]
  },
  {
   "cell_type": "code",
   "id": "5e3ef98e-224c-450a-80e6-be442ad50907",
   "metadata": {
    "tags": []
   },
   "source": "",
   "execution_count": 1,
   "outputs": []
  },
  {
   "cell_type": "code",
   "id": "6bced3f8-e0a4-450c-ae7c-f60ad5671ee9",
   "metadata": {},
   "source": "import contextlib\n\nwith contextlib.suppress(ValueError):\n    print()\n",
   "outputs": []
  },
  {
   "cell_type": "code",
   "id": "d7102cfd-5bb5-4f5b-a3b8-07a7b8cca34c",
   "metadata": {},
   "source": "import random\n\nrandom.randint(10, 20)",
   "outputs": []
  },
  {
   "cell_type": "code",
   "id": "88471d1c-7429-4967-898f-b0088fcb4c53",
   "metadata": {},
   "source": "foo = 1\nif foo < 2:\n    msg = f\"Invalid foo: {foo}\"\n    raise ValueError(msg)",
   "outputs": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python (ruff-playground)",
   "name": "ruff-playground",
   "language": "python"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "pygments_lexer": "ipython3",
   "nbconvert_exporter": "python",
   "version": "3.11.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
```

</p>
</details> 

[^1]: The type in JSON might be different (#4665 (comment))

Part of #1218
renovate bot referenced this pull request in ixm-one/pytest-cmake-presets Jun 21, 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://togithub.com/astral-sh/ruff),
[changelog](https://togithub.com/astral-sh/ruff/releases)) | `^0.0.272`
-> `^0.0.273` |
[![age](https://badges.renovateapi.com/packages/pypi/ruff/0.0.273/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/ruff/0.0.273/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/ruff/0.0.273/compatibility-slim/0.0.272)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/ruff/0.0.273/confidence-slim/0.0.272)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

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

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

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.0.272...v0.0.273)

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

##### What's Changed

Highlights include:

- Autofix capabilities for rules like `flake8-import-conventions`, which
require symbol renames across a file.
- Significant decrease in Ruff's cache size (e.g., a ~50% decrease for
FastAPI).
-   Dozens and dozens of bug fixes + performance improvements.

##### Rules

- \[`copyright`] Implement copyright notice detection by
[@&#8203;Ryang20718](https://togithub.com/Ryang20718) in
[https://github.com/astral-sh/ruff/pull/4701](https://togithub.com/astral-sh/ruff/pull/4701)
- \[`flake8-datetimez`] Enable UTC-import for `datetime-utc-alias` fix
by [@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5100](https://togithub.com/astral-sh/ruff/pull/5100)
- \[`flake8-implicit-str-concat`] Add autofix for `ISC001` by
[@&#8203;tkukushkin](https://togithub.com/tkukushkin) in
[https://github.com/astral-sh/ruff/pull/4853](https://togithub.com/astral-sh/ruff/pull/4853)
- \[`flake8-import-conventions`] Enable autofix for unconventional
imports rule by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5152](https://togithub.com/astral-sh/ruff/pull/5152)
- \[`flake8-pyi`] Add autofix for `Set`-to-`AbstractSet` rewrite using
reference tracking by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5074](https://togithub.com/astral-sh/ruff/pull/5074)
- \[`flake8-pyi`] Implement PYI044 by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5021](https://togithub.com/astral-sh/ruff/pull/5021)
- \[`flake8-return`] Extend revised `RET504` implementation to `with`
statements by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4998](https://togithub.com/astral-sh/ruff/pull/4998)
- \[`flake8-return`] Implement autofix for revised `RET504` rule by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4999](https://togithub.com/astral-sh/ruff/pull/4999)
- \[`flake8-return`] Refactor `RET504` to only enforce
assignment-then-return pattern by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4997](https://togithub.com/astral-sh/ruff/pull/4997)
- \[`flake8-slots`] Add plugin, add `SLOT000`, `SLOT001` and `SLOT002`
by [@&#8203;qdegraaf](https://togithub.com/qdegraaf) in
[https://github.com/astral-sh/ruff/pull/4909](https://togithub.com/astral-sh/ruff/pull/4909)
- \[`perflint`] Add `perflint` plugin, add first rule `PERF102` by
[@&#8203;qdegraaf](https://togithub.com/qdegraaf) in
[https://github.com/astral-sh/ruff/pull/4821](https://togithub.com/astral-sh/ruff/pull/4821)
- \[`pylint`] Add Pylint rule `comparison-with-itself` (`R0124`) by
[@&#8203;tjkuson](https://togithub.com/tjkuson) in
[https://github.com/astral-sh/ruff/pull/4957](https://togithub.com/astral-sh/ruff/pull/4957)
- \[`pyupgrade`] Add a rule to remove unnecessary parentheses in class
definitions by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5032](https://togithub.com/astral-sh/ruff/pull/5032)
- \[`ruff`] Add a rule for static keys in dict comprehensions by
[@&#8203;rodjunger](https://togithub.com/rodjunger) in
[https://github.com/astral-sh/ruff/pull/4929](https://togithub.com/astral-sh/ruff/pull/4929)
- \[`ruff`] Add rule to disallow implicit optional with autofix by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/4831](https://togithub.com/astral-sh/ruff/pull/4831)
- \[`ruff`] Expand RUF008 to all classes, but to a new code (RUF012) by
[@&#8203;adampauls](https://togithub.com/adampauls) in
[https://github.com/astral-sh/ruff/pull/4390](https://togithub.com/astral-sh/ruff/pull/4390)
- \[`ruff`] Remove unannotated attributes from RUF008 by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5049](https://togithub.com/astral-sh/ruff/pull/5049)
- \[`ruff`] Upgrade explicit-type-conversion rule (`RUF010`) to remove
unnecessary `str` calls by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4971](https://togithub.com/astral-sh/ruff/pull/4971)

##### Settings

- Option (`-o`/`--output-file`) to write output to a file by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/4950](https://togithub.com/astral-sh/ruff/pull/4950)
- Add JSON Lines (NDJSON) message serialization by
[@&#8203;akx](https://togithub.com/akx) in
[https://github.com/astral-sh/ruff/pull/5048](https://togithub.com/astral-sh/ruff/pull/5048)
- Add rule documentation URL to JSON output by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5187](https://togithub.com/astral-sh/ruff/pull/5187)

##### Caching

- Only use a single cache file per Python package by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5117](https://togithub.com/astral-sh/ruff/pull/5117)
- Open cache files in parallel by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5120](https://togithub.com/astral-sh/ruff/pull/5120)

##### Jupyter

- Add support for auto-fix in Jupyter notebooks by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/4665](https://togithub.com/astral-sh/ruff/pull/4665)
- Add roundtrip support for Jupyter notebook by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/5028](https://togithub.com/astral-sh/ruff/pull/5028)

##### Bug Fixes

- Handle decorators in class-parenthesis-modifying rules by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5034](https://togithub.com/astral-sh/ruff/pull/5034)
- Allow re-assignments to `__all__` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4967](https://togithub.com/astral-sh/ruff/pull/4967)
- Handled dict and set inside f-string
([#&#8203;4249](https://togithub.com/astral-sh/ruff/issues/4249)) by
[@&#8203;DavideCanton](https://togithub.com/DavideCanton) in
[https://github.com/astral-sh/ruff/pull/4563](https://togithub.com/astral-sh/ruff/pull/4563)
- Support concatenated string key removals by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4976](https://togithub.com/astral-sh/ruff/pull/4976)
- Respect 'is not' operators split across newlines by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4977](https://togithub.com/astral-sh/ruff/pull/4977)
- Parenthesize expressions prior to lexing in F632 by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5001](https://togithub.com/astral-sh/ruff/pull/5001)
- Ignore pyproject.toml for adding noqa directives by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/5013](https://togithub.com/astral-sh/ruff/pull/5013)
- Support 'reason' argument to `pytest.fail` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5040](https://togithub.com/astral-sh/ruff/pull/5040)
- Allow `async with` in `redefined-loop-name` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5125](https://togithub.com/astral-sh/ruff/pull/5125)
- Skip `DJ008` enforcement in stub files by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5139](https://togithub.com/astral-sh/ruff/pull/5139)
- Detect continuations at start-of-file by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5173](https://togithub.com/astral-sh/ruff/pull/5173)
- Fix allowed-ellipsis detection by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5174](https://togithub.com/astral-sh/ruff/pull/5174)
- Remove continuations before trailing semicolons by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5199](https://togithub.com/astral-sh/ruff/pull/5199)
- Support parenthesized expressions when splitting compound assertions
by [@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5219](https://togithub.com/astral-sh/ruff/pull/5219)
- Use phf for confusables to reduce llvm lines by
[@&#8203;konstin](https://togithub.com/konstin) in
[https://github.com/astral-sh/ruff/pull/4926](https://togithub.com/astral-sh/ruff/pull/4926)
- Allow private accesses within special dunder methods by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4968](https://togithub.com/astral-sh/ruff/pull/4968)
- Support concatenated literals in format-literals by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4974](https://togithub.com/astral-sh/ruff/pull/4974)
- Fix line numbers in source frames by
[@&#8203;MichaReiser](https://togithub.com/MichaReiser) in
[https://github.com/astral-sh/ruff/pull/4984](https://togithub.com/astral-sh/ruff/pull/4984)
- Suggest combining async with statements by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5022](https://togithub.com/astral-sh/ruff/pull/5022)
- Improve `TypedDict` conversion logic for shadowed builtins and dunder
methods by [@&#8203;charliermarsh](https://togithub.com/charliermarsh)
in
[https://github.com/astral-sh/ruff/pull/5038](https://togithub.com/astral-sh/ruff/pull/5038)
- Support glob patterns in pep8\_naming ignore-names by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5024](https://togithub.com/astral-sh/ruff/pull/5024)
- Respect all `__all__` definitions for docstring visibility by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5052](https://togithub.com/astral-sh/ruff/pull/5052)
- Don't treat annotations as resolved in forward references by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5060](https://togithub.com/astral-sh/ruff/pull/5060)
- Consider ignore-names in all pep8 naming rules by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5079](https://togithub.com/astral-sh/ruff/pull/5079)
- Ignore `reimplemented-builtin` if using `await` by
[@&#8203;tjkuson](https://togithub.com/tjkuson) in
[https://github.com/astral-sh/ruff/pull/5101](https://togithub.com/astral-sh/ruff/pull/5101)
- Allow space in filename for powershell + windows + python module by
[@&#8203;konstin](https://togithub.com/konstin) in
[https://github.com/astral-sh/ruff/pull/5115](https://togithub.com/astral-sh/ruff/pull/5115)
- Don't treat straight imports of **future** as `__future__` imports by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5128](https://togithub.com/astral-sh/ruff/pull/5128)
- Remove continuations when deleting statements by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5198](https://togithub.com/astral-sh/ruff/pull/5198)
- Fix corner case involving terminal backslash after fixing `W293` by
[@&#8203;evanrittenhouse](https://togithub.com/evanrittenhouse) in
[https://github.com/astral-sh/ruff/pull/5172](https://togithub.com/astral-sh/ruff/pull/5172)
- Fix subprocess.run on Windows Python 3.7 by
[@&#8203;konstin](https://togithub.com/konstin) in
[https://github.com/astral-sh/ruff/pull/5220](https://togithub.com/astral-sh/ruff/pull/5220)

##### New Contributors

- [@&#8203;rodjunger](https://togithub.com/rodjunger) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/4929](https://togithub.com/astral-sh/ruff/pull/4929)
- [@&#8203;DavideCanton](https://togithub.com/DavideCanton) made their
first contribution in
[https://github.com/astral-sh/ruff/pull/4563](https://togithub.com/astral-sh/ruff/pull/4563)
- [@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) made their
first contribution in
[https://github.com/astral-sh/ruff/pull/5021](https://togithub.com/astral-sh/ruff/pull/5021)
- [@&#8203;adampauls](https://togithub.com/adampauls) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/4390](https://togithub.com/astral-sh/ruff/pull/4390)
- [@&#8203;tkukushkin](https://togithub.com/tkukushkin) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/4853](https://togithub.com/astral-sh/ruff/pull/4853)
- [@&#8203;Taybou](https://togithub.com/Taybou) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/5088](https://togithub.com/astral-sh/ruff/pull/5088)
- [@&#8203;davidszotten](https://togithub.com/davidszotten) made their
first contribution in
[https://github.com/astral-sh/ruff/pull/5158](https://togithub.com/astral-sh/ruff/pull/5158)
- [@&#8203;dosisod](https://togithub.com/dosisod) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/5203](https://togithub.com/astral-sh/ruff/pull/5203)

**Full Changelog**:
astral-sh/ruff@v0.0.272...v0.0.273

</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://developer.mend.io/github/ixm-one/pytest-cmake-presets).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS4xMzEuMCIsInVwZGF0ZWRJblZlciI6IjM1LjEzMS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
jankatins referenced this pull request in jankatins/pr-workflow-example Jun 21, 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://togithub.com/astral-sh/ruff),
[changelog](https://togithub.com/astral-sh/ruff/releases)) | `0.0.272`
-> `0.0.274` |
[![age](https://badges.renovateapi.com/packages/pypi/ruff/0.0.274/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/ruff/0.0.274/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/ruff/0.0.274/compatibility-slim/0.0.272)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/ruff/0.0.274/confidence-slim/0.0.272)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

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

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

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.0.273...v0.0.274)

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

#### What's Changed

Follow-up release to `v0.0.273` to fix a panic in cache accesses.

##### Bug Fixes

- Use package roots rather than package members for cache initialization
by [@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5233](https://togithub.com/astral-sh/ruff/pull/5233)
- Avoid `.unwrap()` on cache access by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5229](https://togithub.com/astral-sh/ruff/pull/5229)
- Revert change to `RUF010` to remove unnecessary `str` calls by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5232](https://togithub.com/astral-sh/ruff/pull/5232)
- Avoid erroneous RUF013 violations for quoted annotations by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5234](https://togithub.com/astral-sh/ruff/pull/5234)

**Full Changelog**:
astral-sh/ruff@v0.0.273...v0.0.274

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

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.0.272...v0.0.273)

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

#### What's Changed

Highlights include:

- Autofix capabilities for rules like `flake8-import-conventions`, which
require symbol renames across a file.
- Significant decrease in Ruff's cache size (e.g., a ~50% decrease for
FastAPI).
-   Dozens and dozens of bug fixes + performance improvements.

##### Rules

- \[`copyright`] Implement copyright notice detection by
[@&#8203;Ryang20718](https://togithub.com/Ryang20718) in
[https://github.com/astral-sh/ruff/pull/4701](https://togithub.com/astral-sh/ruff/pull/4701)
- \[`flake8-datetimez`] Enable UTC-import for `datetime-utc-alias` fix
by [@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5100](https://togithub.com/astral-sh/ruff/pull/5100)
- \[`flake8-implicit-str-concat`] Add autofix for `ISC001` by
[@&#8203;tkukushkin](https://togithub.com/tkukushkin) in
[https://github.com/astral-sh/ruff/pull/4853](https://togithub.com/astral-sh/ruff/pull/4853)
- \[`flake8-import-conventions`] Enable autofix for unconventional
imports rule by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5152](https://togithub.com/astral-sh/ruff/pull/5152)
- \[`flake8-pyi`] Add autofix for `Set`-to-`AbstractSet` rewrite using
reference tracking by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5074](https://togithub.com/astral-sh/ruff/pull/5074)
- \[`flake8-pyi`] Implement PYI044 by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5021](https://togithub.com/astral-sh/ruff/pull/5021)
- \[`flake8-return`] Extend revised `RET504` implementation to `with`
statements by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4998](https://togithub.com/astral-sh/ruff/pull/4998)
- \[`flake8-return`] Implement autofix for revised `RET504` rule by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4999](https://togithub.com/astral-sh/ruff/pull/4999)
- \[`flake8-return`] Refactor `RET504` to only enforce
assignment-then-return pattern by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4997](https://togithub.com/astral-sh/ruff/pull/4997)
- \[`flake8-slots`] Add plugin, add `SLOT000`, `SLOT001` and `SLOT002`
by [@&#8203;qdegraaf](https://togithub.com/qdegraaf) in
[https://github.com/astral-sh/ruff/pull/4909](https://togithub.com/astral-sh/ruff/pull/4909)
- \[`perflint`] Add `perflint` plugin, add first rule `PERF102` by
[@&#8203;qdegraaf](https://togithub.com/qdegraaf) in
[https://github.com/astral-sh/ruff/pull/4821](https://togithub.com/astral-sh/ruff/pull/4821)
- \[`pylint`] Add Pylint rule `comparison-with-itself` (`R0124`) by
[@&#8203;tjkuson](https://togithub.com/tjkuson) in
[https://github.com/astral-sh/ruff/pull/4957](https://togithub.com/astral-sh/ruff/pull/4957)
- \[`pyupgrade`] Add a rule to remove unnecessary parentheses in class
definitions by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5032](https://togithub.com/astral-sh/ruff/pull/5032)
- \[`ruff`] Add a rule for static keys in dict comprehensions by
[@&#8203;rodjunger](https://togithub.com/rodjunger) in
[https://github.com/astral-sh/ruff/pull/4929](https://togithub.com/astral-sh/ruff/pull/4929)
- \[`ruff`] Add rule to disallow implicit optional with autofix by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/4831](https://togithub.com/astral-sh/ruff/pull/4831)
- \[`ruff`] Expand RUF008 to all classes, but to a new code (RUF012) by
[@&#8203;adampauls](https://togithub.com/adampauls) in
[https://github.com/astral-sh/ruff/pull/4390](https://togithub.com/astral-sh/ruff/pull/4390)
- \[`ruff`] Remove unannotated attributes from RUF008 by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5049](https://togithub.com/astral-sh/ruff/pull/5049)
- \[`ruff`] Upgrade explicit-type-conversion rule (`RUF010`) to remove
unnecessary `str` calls by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4971](https://togithub.com/astral-sh/ruff/pull/4971)

##### Settings

- Option (`-o`/`--output-file`) to write output to a file by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/4950](https://togithub.com/astral-sh/ruff/pull/4950)
- Add JSON Lines (NDJSON) message serialization by
[@&#8203;akx](https://togithub.com/akx) in
[https://github.com/astral-sh/ruff/pull/5048](https://togithub.com/astral-sh/ruff/pull/5048)
- Add rule documentation URL to JSON output by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5187](https://togithub.com/astral-sh/ruff/pull/5187)

##### Caching

- Only use a single cache file per Python package by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5117](https://togithub.com/astral-sh/ruff/pull/5117)
- Open cache files in parallel by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5120](https://togithub.com/astral-sh/ruff/pull/5120)

##### Jupyter

- Add support for auto-fix in Jupyter notebooks by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/4665](https://togithub.com/astral-sh/ruff/pull/4665)
- Add roundtrip support for Jupyter notebook by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/5028](https://togithub.com/astral-sh/ruff/pull/5028)

##### Bug Fixes

- Handle decorators in class-parenthesis-modifying rules by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5034](https://togithub.com/astral-sh/ruff/pull/5034)
- Allow re-assignments to `__all__` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4967](https://togithub.com/astral-sh/ruff/pull/4967)
- Handled dict and set inside f-string
([#&#8203;4249](https://togithub.com/astral-sh/ruff/issues/4249)) by
[@&#8203;DavideCanton](https://togithub.com/DavideCanton) in
[https://github.com/astral-sh/ruff/pull/4563](https://togithub.com/astral-sh/ruff/pull/4563)
- Support concatenated string key removals by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4976](https://togithub.com/astral-sh/ruff/pull/4976)
- Respect 'is not' operators split across newlines by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4977](https://togithub.com/astral-sh/ruff/pull/4977)
- Parenthesize expressions prior to lexing in F632 by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5001](https://togithub.com/astral-sh/ruff/pull/5001)
- Ignore pyproject.toml for adding noqa directives by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/5013](https://togithub.com/astral-sh/ruff/pull/5013)
- Support 'reason' argument to `pytest.fail` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5040](https://togithub.com/astral-sh/ruff/pull/5040)
- Allow `async with` in `redefined-loop-name` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5125](https://togithub.com/astral-sh/ruff/pull/5125)
- Skip `DJ008` enforcement in stub files by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5139](https://togithub.com/astral-sh/ruff/pull/5139)
- Detect continuations at start-of-file by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5173](https://togithub.com/astral-sh/ruff/pull/5173)
- Fix allowed-ellipsis detection by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5174](https://togithub.com/astral-sh/ruff/pull/5174)
- Remove continuations before trailing semicolons by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5199](https://togithub.com/astral-sh/ruff/pull/5199)
- Support parenthesized expressions when splitting compound assertions
by [@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5219](https://togithub.com/astral-sh/ruff/pull/5219)
- Use phf for confusables to reduce llvm lines by
[@&#8203;konstin](https://togithub.com/konstin) in
[https://github.com/astral-sh/ruff/pull/4926](https://togithub.com/astral-sh/ruff/pull/4926)
- Allow private accesses within special dunder methods by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4968](https://togithub.com/astral-sh/ruff/pull/4968)
- Support concatenated literals in format-literals by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4974](https://togithub.com/astral-sh/ruff/pull/4974)
- Fix line numbers in source frames by
[@&#8203;MichaReiser](https://togithub.com/MichaReiser) in
[https://github.com/astral-sh/ruff/pull/4984](https://togithub.com/astral-sh/ruff/pull/4984)
- Suggest combining async with statements by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5022](https://togithub.com/astral-sh/ruff/pull/5022)
- Improve `TypedDict` conversion logic for shadowed builtins and dunder
methods by [@&#8203;charliermarsh](https://togithub.com/charliermarsh)
in
[https://github.com/astral-sh/ruff/pull/5038](https://togithub.com/astral-sh/ruff/pull/5038)
- Support glob patterns in pep8\_naming ignore-names by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5024](https://togithub.com/astral-sh/ruff/pull/5024)
- Respect all `__all__` definitions for docstring visibility by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5052](https://togithub.com/astral-sh/ruff/pull/5052)
- Don't treat annotations as resolved in forward references by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5060](https://togithub.com/astral-sh/ruff/pull/5060)
- Consider ignore-names in all pep8 naming rules by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5079](https://togithub.com/astral-sh/ruff/pull/5079)
- Ignore `reimplemented-builtin` if using `await` by
[@&#8203;tjkuson](https://togithub.com/tjkuson) in
[https://github.com/astral-sh/ruff/pull/5101](https://togithub.com/astral-sh/ruff/pull/5101)
- Allow space in filename for powershell + windows + python module by
[@&#8203;konstin](https://togithub.com/konstin) in
[https://github.com/astral-sh/ruff/pull/5115](https://togithub.com/astral-sh/ruff/pull/5115)
- Don't treat straight imports of **future** as `__future__` imports by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5128](https://togithub.com/astral-sh/ruff/pull/5128)
- Remove continuations when deleting statements by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5198](https://togithub.com/astral-sh/ruff/pull/5198)
- Fix corner case involving terminal backslash after fixing `W293` by
[@&#8203;evanrittenhouse](https://togithub.com/evanrittenhouse) in
[https://github.com/astral-sh/ruff/pull/5172](https://togithub.com/astral-sh/ruff/pull/5172)
- Fix subprocess.run on Windows Python 3.7 by
[@&#8203;konstin](https://togithub.com/konstin) in
[https://github.com/astral-sh/ruff/pull/5220](https://togithub.com/astral-sh/ruff/pull/5220)

#### New Contributors

- [@&#8203;rodjunger](https://togithub.com/rodjunger) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/4929](https://togithub.com/astral-sh/ruff/pull/4929)
- [@&#8203;DavideCanton](https://togithub.com/DavideCanton) made their
first contribution in
[https://github.com/astral-sh/ruff/pull/4563](https://togithub.com/astral-sh/ruff/pull/4563)
- [@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) made their
first contribution in
[https://github.com/astral-sh/ruff/pull/5021](https://togithub.com/astral-sh/ruff/pull/5021)
- [@&#8203;adampauls](https://togithub.com/adampauls) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/4390](https://togithub.com/astral-sh/ruff/pull/4390)
- [@&#8203;tkukushkin](https://togithub.com/tkukushkin) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/4853](https://togithub.com/astral-sh/ruff/pull/4853)
- [@&#8203;Taybou](https://togithub.com/Taybou) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/5088](https://togithub.com/astral-sh/ruff/pull/5088)
- [@&#8203;davidszotten](https://togithub.com/davidszotten) made their
first contribution in
[https://github.com/astral-sh/ruff/pull/5158](https://togithub.com/astral-sh/ruff/pull/5158)
- [@&#8203;dosisod](https://togithub.com/dosisod) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/5203](https://togithub.com/astral-sh/ruff/pull/5203)

**Full Changelog**:
astral-sh/ruff@v0.0.272...v0.0.273

</details>

---

### Configuration

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

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **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/jankatins/pr-workflow-example).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS4xMzEuMCIsInVwZGF0ZWRJblZlciI6IjM1LjEzMS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->
renovate bot referenced this pull request in allenporter/pyrainbird Jun 22, 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://togithub.com/astral-sh/ruff),
[changelog](https://togithub.com/astral-sh/ruff/releases)) | `==0.0.272`
-> `==0.0.274` |
[![age](https://badges.renovateapi.com/packages/pypi/ruff/0.0.274/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/ruff/0.0.274/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/ruff/0.0.274/compatibility-slim/0.0.272)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/ruff/0.0.274/confidence-slim/0.0.272)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

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

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

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.0.273...v0.0.274)

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

#### What's Changed

Follow-up release to `v0.0.273` to fix a panic in cache accesses.

##### Bug Fixes

- Use package roots rather than package members for cache initialization
by [@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5233](https://togithub.com/astral-sh/ruff/pull/5233)
- Avoid `.unwrap()` on cache access by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5229](https://togithub.com/astral-sh/ruff/pull/5229)
- Revert change to `RUF010` to remove unnecessary `str` calls by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5232](https://togithub.com/astral-sh/ruff/pull/5232)
- Avoid erroneous RUF013 violations for quoted annotations by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5234](https://togithub.com/astral-sh/ruff/pull/5234)

**Full Changelog**:
astral-sh/ruff@v0.0.273...v0.0.274

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

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.0.272...v0.0.273)

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

#### What's Changed

Highlights include:

- Autofix capabilities for rules like `flake8-import-conventions`, which
require symbol renames across a file.
- Significant decrease in Ruff's cache size (e.g., a ~50% decrease for
FastAPI).
-   Dozens and dozens of bug fixes + performance improvements.

##### Rules

- \[`copyright`] Implement copyright notice detection by
[@&#8203;Ryang20718](https://togithub.com/Ryang20718) in
[https://github.com/astral-sh/ruff/pull/4701](https://togithub.com/astral-sh/ruff/pull/4701)
- \[`flake8-datetimez`] Enable UTC-import for `datetime-utc-alias` fix
by [@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5100](https://togithub.com/astral-sh/ruff/pull/5100)
- \[`flake8-implicit-str-concat`] Add autofix for `ISC001` by
[@&#8203;tkukushkin](https://togithub.com/tkukushkin) in
[https://github.com/astral-sh/ruff/pull/4853](https://togithub.com/astral-sh/ruff/pull/4853)
- \[`flake8-import-conventions`] Enable autofix for unconventional
imports rule by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5152](https://togithub.com/astral-sh/ruff/pull/5152)
- \[`flake8-pyi`] Add autofix for `Set`-to-`AbstractSet` rewrite using
reference tracking by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5074](https://togithub.com/astral-sh/ruff/pull/5074)
- \[`flake8-pyi`] Implement PYI044 by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5021](https://togithub.com/astral-sh/ruff/pull/5021)
- \[`flake8-return`] Extend revised `RET504` implementation to `with`
statements by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4998](https://togithub.com/astral-sh/ruff/pull/4998)
- \[`flake8-return`] Implement autofix for revised `RET504` rule by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4999](https://togithub.com/astral-sh/ruff/pull/4999)
- \[`flake8-return`] Refactor `RET504` to only enforce
assignment-then-return pattern by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4997](https://togithub.com/astral-sh/ruff/pull/4997)
- \[`flake8-slots`] Add plugin, add `SLOT000`, `SLOT001` and `SLOT002`
by [@&#8203;qdegraaf](https://togithub.com/qdegraaf) in
[https://github.com/astral-sh/ruff/pull/4909](https://togithub.com/astral-sh/ruff/pull/4909)
- \[`perflint`] Add `perflint` plugin, add first rule `PERF102` by
[@&#8203;qdegraaf](https://togithub.com/qdegraaf) in
[https://github.com/astral-sh/ruff/pull/4821](https://togithub.com/astral-sh/ruff/pull/4821)
- \[`pylint`] Add Pylint rule `comparison-with-itself` (`R0124`) by
[@&#8203;tjkuson](https://togithub.com/tjkuson) in
[https://github.com/astral-sh/ruff/pull/4957](https://togithub.com/astral-sh/ruff/pull/4957)
- \[`pyupgrade`] Add a rule to remove unnecessary parentheses in class
definitions by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5032](https://togithub.com/astral-sh/ruff/pull/5032)
- \[`ruff`] Add a rule for static keys in dict comprehensions by
[@&#8203;rodjunger](https://togithub.com/rodjunger) in
[https://github.com/astral-sh/ruff/pull/4929](https://togithub.com/astral-sh/ruff/pull/4929)
- \[`ruff`] Add rule to disallow implicit optional with autofix by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/4831](https://togithub.com/astral-sh/ruff/pull/4831)
- \[`ruff`] Expand RUF008 to all classes, but to a new code (RUF012) by
[@&#8203;adampauls](https://togithub.com/adampauls) in
[https://github.com/astral-sh/ruff/pull/4390](https://togithub.com/astral-sh/ruff/pull/4390)
- \[`ruff`] Remove unannotated attributes from RUF008 by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5049](https://togithub.com/astral-sh/ruff/pull/5049)
- \[`ruff`] Upgrade explicit-type-conversion rule (`RUF010`) to remove
unnecessary `str` calls by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4971](https://togithub.com/astral-sh/ruff/pull/4971)

##### Settings

- Option (`-o`/`--output-file`) to write output to a file by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/4950](https://togithub.com/astral-sh/ruff/pull/4950)
- Add JSON Lines (NDJSON) message serialization by
[@&#8203;akx](https://togithub.com/akx) in
[https://github.com/astral-sh/ruff/pull/5048](https://togithub.com/astral-sh/ruff/pull/5048)
- Add rule documentation URL to JSON output by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5187](https://togithub.com/astral-sh/ruff/pull/5187)

##### Caching

- Only use a single cache file per Python package by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5117](https://togithub.com/astral-sh/ruff/pull/5117)
- Open cache files in parallel by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5120](https://togithub.com/astral-sh/ruff/pull/5120)

##### Jupyter

- Add support for auto-fix in Jupyter notebooks by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/4665](https://togithub.com/astral-sh/ruff/pull/4665)
- Add roundtrip support for Jupyter notebook by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/5028](https://togithub.com/astral-sh/ruff/pull/5028)

##### Bug Fixes

- Handle decorators in class-parenthesis-modifying rules by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5034](https://togithub.com/astral-sh/ruff/pull/5034)
- Allow re-assignments to `__all__` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4967](https://togithub.com/astral-sh/ruff/pull/4967)
- Handled dict and set inside f-string
([#&#8203;4249](https://togithub.com/astral-sh/ruff/issues/4249)) by
[@&#8203;DavideCanton](https://togithub.com/DavideCanton) in
[https://github.com/astral-sh/ruff/pull/4563](https://togithub.com/astral-sh/ruff/pull/4563)
- Support concatenated string key removals by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4976](https://togithub.com/astral-sh/ruff/pull/4976)
- Respect 'is not' operators split across newlines by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4977](https://togithub.com/astral-sh/ruff/pull/4977)
- Parenthesize expressions prior to lexing in F632 by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5001](https://togithub.com/astral-sh/ruff/pull/5001)
- Ignore pyproject.toml for adding noqa directives by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/5013](https://togithub.com/astral-sh/ruff/pull/5013)
- Support 'reason' argument to `pytest.fail` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5040](https://togithub.com/astral-sh/ruff/pull/5040)
- Allow `async with` in `redefined-loop-name` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5125](https://togithub.com/astral-sh/ruff/pull/5125)
- Skip `DJ008` enforcement in stub files by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5139](https://togithub.com/astral-sh/ruff/pull/5139)
- Detect continuations at start-of-file by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5173](https://togithub.com/astral-sh/ruff/pull/5173)
- Fix allowed-ellipsis detection by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5174](https://togithub.com/astral-sh/ruff/pull/5174)
- Remove continuations before trailing semicolons by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5199](https://togithub.com/astral-sh/ruff/pull/5199)
- Support parenthesized expressions when splitting compound assertions
by [@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5219](https://togithub.com/astral-sh/ruff/pull/5219)
- Use phf for confusables to reduce llvm lines by
[@&#8203;konstin](https://togithub.com/konstin) in
[https://github.com/astral-sh/ruff/pull/4926](https://togithub.com/astral-sh/ruff/pull/4926)
- Allow private accesses within special dunder methods by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4968](https://togithub.com/astral-sh/ruff/pull/4968)
- Support concatenated literals in format-literals by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4974](https://togithub.com/astral-sh/ruff/pull/4974)
- Fix line numbers in source frames by
[@&#8203;MichaReiser](https://togithub.com/MichaReiser) in
[https://github.com/astral-sh/ruff/pull/4984](https://togithub.com/astral-sh/ruff/pull/4984)
- Suggest combining async with statements by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5022](https://togithub.com/astral-sh/ruff/pull/5022)
- Improve `TypedDict` conversion logic for shadowed builtins and dunder
methods by [@&#8203;charliermarsh](https://togithub.com/charliermarsh)
in
[https://github.com/astral-sh/ruff/pull/5038](https://togithub.com/astral-sh/ruff/pull/5038)
- Support glob patterns in pep8\_naming ignore-names by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5024](https://togithub.com/astral-sh/ruff/pull/5024)
- Respect all `__all__` definitions for docstring visibility by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5052](https://togithub.com/astral-sh/ruff/pull/5052)
- Don't treat annotations as resolved in forward references by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5060](https://togithub.com/astral-sh/ruff/pull/5060)
- Consider ignore-names in all pep8 naming rules by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5079](https://togithub.com/astral-sh/ruff/pull/5079)
- Ignore `reimplemented-builtin` if using `await` by
[@&#8203;tjkuson](https://togithub.com/tjkuson) in
[https://github.com/astral-sh/ruff/pull/5101](https://togithub.com/astral-sh/ruff/pull/5101)
- Allow space in filename for powershell + windows + python module by
[@&#8203;konstin](https://togithub.com/konstin) in
[https://github.com/astral-sh/ruff/pull/5115](https://togithub.com/astral-sh/ruff/pull/5115)
- Don't treat straight imports of **future** as `__future__` imports by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5128](https://togithub.com/astral-sh/ruff/pull/5128)
- Remove continuations when deleting statements by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5198](https://togithub.com/astral-sh/ruff/pull/5198)
- Fix corner case involving terminal backslash after fixing `W293` by
[@&#8203;evanrittenhouse](https://togithub.com/evanrittenhouse) in
[https://github.com/astral-sh/ruff/pull/5172](https://togithub.com/astral-sh/ruff/pull/5172)
- Fix subprocess.run on Windows Python 3.7 by
[@&#8203;konstin](https://togithub.com/konstin) in
[https://github.com/astral-sh/ruff/pull/5220](https://togithub.com/astral-sh/ruff/pull/5220)

#### New Contributors

- [@&#8203;rodjunger](https://togithub.com/rodjunger) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/4929](https://togithub.com/astral-sh/ruff/pull/4929)
- [@&#8203;DavideCanton](https://togithub.com/DavideCanton) made their
first contribution in
[https://github.com/astral-sh/ruff/pull/4563](https://togithub.com/astral-sh/ruff/pull/4563)
- [@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) made their
first contribution in
[https://github.com/astral-sh/ruff/pull/5021](https://togithub.com/astral-sh/ruff/pull/5021)
- [@&#8203;adampauls](https://togithub.com/adampauls) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/4390](https://togithub.com/astral-sh/ruff/pull/4390)
- [@&#8203;tkukushkin](https://togithub.com/tkukushkin) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/4853](https://togithub.com/astral-sh/ruff/pull/4853)
- [@&#8203;Taybou](https://togithub.com/Taybou) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/5088](https://togithub.com/astral-sh/ruff/pull/5088)
- [@&#8203;davidszotten](https://togithub.com/davidszotten) made their
first contribution in
[https://github.com/astral-sh/ruff/pull/5158](https://togithub.com/astral-sh/ruff/pull/5158)
- [@&#8203;dosisod](https://togithub.com/dosisod) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/5203](https://togithub.com/astral-sh/ruff/pull/5203)

**Full Changelog**:
astral-sh/ruff@v0.0.272...v0.0.273

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

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
renovate bot referenced this pull request in allenporter/flux-local Jun 23, 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://togithub.com/astral-sh/ruff),
[changelog](https://togithub.com/astral-sh/ruff/releases)) | `==0.0.272`
-> `==0.0.275` |
[![age](https://badges.renovateapi.com/packages/pypi/ruff/0.0.275/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/ruff/0.0.275/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/ruff/0.0.275/compatibility-slim/0.0.272)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/ruff/0.0.275/confidence-slim/0.0.272)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

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

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

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.0.274...v0.0.275)

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

#### What's Changed

Highlights include a 7-10x decrease in Ruff's cache size.

##### Rules

- Add support for top-level quoted annotations in RUF013 by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5235](https://togithub.com/astral-sh/ruff/pull/5235)
- Add support for nested quoted annotations in RUF013 by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/5254](https://togithub.com/astral-sh/ruff/pull/5254)
- Move `compare-to-empty-string` (`PLC1901`) to nursery by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5264](https://togithub.com/astral-sh/ruff/pull/5264)
- Ignore Pydantic classes when evaluating `mutable-class-default`
(`RUF012`) by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5273](https://togithub.com/astral-sh/ruff/pull/5273)
- Allow `typing.Final` for `mutable-class-default annotations`
(`RUF012`) by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5274](https://togithub.com/astral-sh/ruff/pull/5274)
- Modify `deprecated-import` (`UP035`) to prefer `typing_extensions` in
some versions by [@&#8203;tjkuson](https://togithub.com/tjkuson) in
[https://github.com/astral-sh/ruff/pull/5291](https://togithub.com/astral-sh/ruff/pull/5291)

##### Bug Fixes

- Restore existing bindings when unbinding caught exceptions by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5256](https://togithub.com/astral-sh/ruff/pull/5256)
- Avoid including nursery rules in linter-level selectors by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5268](https://togithub.com/astral-sh/ruff/pull/5268)

#### New Contributors

- [@&#8203;jgberry](https://togithub.com/jgberry) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/5221](https://togithub.com/astral-sh/ruff/pull/5221)

**Full Changelog**:
astral-sh/ruff@v0.0.274...v0.0.275

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

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.0.273...v0.0.274)

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

#### What's Changed

Follow-up release to `v0.0.273` to fix a panic in cache accesses.

##### Bug Fixes

- Use package roots rather than package members for cache initialization
by [@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5233](https://togithub.com/astral-sh/ruff/pull/5233)
- Avoid `.unwrap()` on cache access by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5229](https://togithub.com/astral-sh/ruff/pull/5229)
- Revert change to `RUF010` to remove unnecessary `str` calls by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5232](https://togithub.com/astral-sh/ruff/pull/5232)
- Avoid erroneous RUF013 violations for quoted annotations by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5234](https://togithub.com/astral-sh/ruff/pull/5234)

**Full Changelog**:
astral-sh/ruff@v0.0.273...v0.0.274

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

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.0.272...v0.0.273)

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

#### What's Changed

Highlights include:

- Autofix capabilities for rules like `flake8-import-conventions`, which
require symbol renames across a file.
- Significant decrease in Ruff's cache size (e.g., a ~50% decrease for
FastAPI).
-   Dozens and dozens of bug fixes + performance improvements.

##### Rules

- \[`copyright`] Implement copyright notice detection by
[@&#8203;Ryang20718](https://togithub.com/Ryang20718) in
[https://github.com/astral-sh/ruff/pull/4701](https://togithub.com/astral-sh/ruff/pull/4701)
- \[`flake8-datetimez`] Enable UTC-import for `datetime-utc-alias` fix
by [@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5100](https://togithub.com/astral-sh/ruff/pull/5100)
- \[`flake8-implicit-str-concat`] Add autofix for `ISC001` by
[@&#8203;tkukushkin](https://togithub.com/tkukushkin) in
[https://github.com/astral-sh/ruff/pull/4853](https://togithub.com/astral-sh/ruff/pull/4853)
- \[`flake8-import-conventions`] Enable autofix for unconventional
imports rule by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5152](https://togithub.com/astral-sh/ruff/pull/5152)
- \[`flake8-pyi`] Add autofix for `Set`-to-`AbstractSet` rewrite using
reference tracking by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5074](https://togithub.com/astral-sh/ruff/pull/5074)
- \[`flake8-pyi`] Implement PYI044 by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5021](https://togithub.com/astral-sh/ruff/pull/5021)
- \[`flake8-return`] Extend revised `RET504` implementation to `with`
statements by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4998](https://togithub.com/astral-sh/ruff/pull/4998)
- \[`flake8-return`] Implement autofix for revised `RET504` rule by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4999](https://togithub.com/astral-sh/ruff/pull/4999)
- \[`flake8-return`] Refactor `RET504` to only enforce
assignment-then-return pattern by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4997](https://togithub.com/astral-sh/ruff/pull/4997)
- \[`flake8-slots`] Add plugin, add `SLOT000`, `SLOT001` and `SLOT002`
by [@&#8203;qdegraaf](https://togithub.com/qdegraaf) in
[https://github.com/astral-sh/ruff/pull/4909](https://togithub.com/astral-sh/ruff/pull/4909)
- \[`perflint`] Add `perflint` plugin, add first rule `PERF102` by
[@&#8203;qdegraaf](https://togithub.com/qdegraaf) in
[https://github.com/astral-sh/ruff/pull/4821](https://togithub.com/astral-sh/ruff/pull/4821)
- \[`pylint`] Add Pylint rule `comparison-with-itself` (`R0124`) by
[@&#8203;tjkuson](https://togithub.com/tjkuson) in
[https://github.com/astral-sh/ruff/pull/4957](https://togithub.com/astral-sh/ruff/pull/4957)
- \[`pyupgrade`] Add a rule to remove unnecessary parentheses in class
definitions by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5032](https://togithub.com/astral-sh/ruff/pull/5032)
- \[`ruff`] Add a rule for static keys in dict comprehensions by
[@&#8203;rodjunger](https://togithub.com/rodjunger) in
[https://github.com/astral-sh/ruff/pull/4929](https://togithub.com/astral-sh/ruff/pull/4929)
- \[`ruff`] Add rule to disallow implicit optional with autofix by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/4831](https://togithub.com/astral-sh/ruff/pull/4831)
- \[`ruff`] Expand RUF008 to all classes, but to a new code (RUF012) by
[@&#8203;adampauls](https://togithub.com/adampauls) in
[https://github.com/astral-sh/ruff/pull/4390](https://togithub.com/astral-sh/ruff/pull/4390)
- \[`ruff`] Remove unannotated attributes from RUF008 by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5049](https://togithub.com/astral-sh/ruff/pull/5049)
- \[`ruff`] Upgrade explicit-type-conversion rule (`RUF010`) to remove
unnecessary `str` calls by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4971](https://togithub.com/astral-sh/ruff/pull/4971)

##### Settings

- Option (`-o`/`--output-file`) to write output to a file by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/4950](https://togithub.com/astral-sh/ruff/pull/4950)
- Add JSON Lines (NDJSON) message serialization by
[@&#8203;akx](https://togithub.com/akx) in
[https://github.com/astral-sh/ruff/pull/5048](https://togithub.com/astral-sh/ruff/pull/5048)
- Add rule documentation URL to JSON output by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5187](https://togithub.com/astral-sh/ruff/pull/5187)

##### Caching

- Only use a single cache file per Python package by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5117](https://togithub.com/astral-sh/ruff/pull/5117)
- Open cache files in parallel by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5120](https://togithub.com/astral-sh/ruff/pull/5120)

##### Jupyter

- Add support for auto-fix in Jupyter notebooks by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/4665](https://togithub.com/astral-sh/ruff/pull/4665)
- Add roundtrip support for Jupyter notebook by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/5028](https://togithub.com/astral-sh/ruff/pull/5028)

##### Bug Fixes

- Handle decorators in class-parenthesis-modifying rules by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5034](https://togithub.com/astral-sh/ruff/pull/5034)
- Allow re-assignments to `__all__` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4967](https://togithub.com/astral-sh/ruff/pull/4967)
- Handled dict and set inside f-string
([#&#8203;4249](https://togithub.com/astral-sh/ruff/issues/4249)) by
[@&#8203;DavideCanton](https://togithub.com/DavideCanton) in
[https://github.com/astral-sh/ruff/pull/4563](https://togithub.com/astral-sh/ruff/pull/4563)
- Support concatenated string key removals by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4976](https://togithub.com/astral-sh/ruff/pull/4976)
- Respect 'is not' operators split across newlines by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4977](https://togithub.com/astral-sh/ruff/pull/4977)
- Parenthesize expressions prior to lexing in F632 by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5001](https://togithub.com/astral-sh/ruff/pull/5001)
- Ignore pyproject.toml for adding noqa directives by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/5013](https://togithub.com/astral-sh/ruff/pull/5013)
- Support 'reason' argument to `pytest.fail` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5040](https://togithub.com/astral-sh/ruff/pull/5040)
- Allow `async with` in `redefined-loop-name` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5125](https://togithub.com/astral-sh/ruff/pull/5125)
- Skip `DJ008` enforcement in stub files by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5139](https://togithub.com/astral-sh/ruff/pull/5139)
- Detect continuations at start-of-file by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5173](https://togithub.com/astral-sh/ruff/pull/5173)
- Fix allowed-ellipsis detection by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5174](https://togithub.com/astral-sh/ruff/pull/5174)
- Remove continuations before trailing semicolons by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5199](https://togithub.com/astral-sh/ruff/pull/5199)
- Support parenthesized expressions when splitting compound assertions
by [@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5219](https://togithub.com/astral-sh/ruff/pull/5219)
- Use phf for confusables to reduce llvm lines by
[@&#8203;konstin](https://togithub.com/konstin) in
[https://github.com/astral-sh/ruff/pull/4926](https://togithub.com/astral-sh/ruff/pull/4926)
- Allow private accesses within special dunder methods by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4968](https://togithub.com/astral-sh/ruff/pull/4968)
- Support concatenated literals in format-literals by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4974](https://togithub.com/astral-sh/ruff/pull/4974)
- Fix line numbers in source frames by
[@&#8203;MichaReiser](https://togithub.com/MichaReiser) in
[https://github.com/astral-sh/ruff/pull/4984](https://togithub.com/astral-sh/ruff/pull/4984)
- Suggest combining async with statements by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5022](https://togithub.com/astral-sh/ruff/pull/5022)
- Improve `TypedDict` conversion logic for shadowed builtins and dunder
methods by [@&#8203;charliermarsh](https://togithub.com/charliermarsh)
in
[https://github.com/astral-sh/ruff/pull/5038](https://togithub.com/astral-sh/ruff/pull/5038)
- Support glob patterns in pep8\_naming ignore-names by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5024](https://togithub.com/astral-sh/ruff/pull/5024)
- Respect all `__all__` definitions for docstring visibility by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5052](https://togithub.com/astral-sh/ruff/pull/5052)
- Don't treat annotations as resolved in forward references by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5060](https://togithub.com/astral-sh/ruff/pull/5060)
- Consider ignore-names in all pep8 naming rules by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5079](https://togithub.com/astral-sh/ruff/pull/5079)
- Ignore `reimplemented-builtin` if using `await` by
[@&#8203;tjkuson](https://togithub.com/tjkuson) in
[https://github.com/astral-sh/ruff/pull/5101](https://togithub.com/astral-sh/ruff/pull/5101)
- Allow space in filename for powershell + windows + python module by
[@&#8203;konstin](https://togithub.com/konstin) in
[https://github.com/astral-sh/ruff/pull/5115](https://togithub.com/astral-sh/ruff/pull/5115)
- Don't treat straight imports of **future** as `__future__` imports by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5128](https://togithub.com/astral-sh/ruff/pull/5128)
- Remove continuations when deleting statements by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5198](https://togithub.com/astral-sh/ruff/pull/5198)
- Fix corner case involving terminal backslash after fixing `W293` by
[@&#8203;evanrittenhouse](https://togithub.com/evanrittenhouse) in
[https://github.com/astral-sh/ruff/pull/5172](https://togithub.com/astral-sh/ruff/pull/5172)
- Fix subprocess.run on Windows Python 3.7 by
[@&#8203;konstin](https://togithub.com/konstin) in
[https://github.com/astral-sh/ruff/pull/5220](https://togithub.com/astral-sh/ruff/pull/5220)

#### New Contributors

- [@&#8203;rodjunger](https://togithub.com/rodjunger) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/4929](https://togithub.com/astral-sh/ruff/pull/4929)
- [@&#8203;DavideCanton](https://togithub.com/DavideCanton) made their
first contribution in
[https://github.com/astral-sh/ruff/pull/4563](https://togithub.com/astral-sh/ruff/pull/4563)
- [@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) made their
first contribution in
[https://github.com/astral-sh/ruff/pull/5021](https://togithub.com/astral-sh/ruff/pull/5021)
- [@&#8203;adampauls](https://togithub.com/adampauls) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/4390](https://togithub.com/astral-sh/ruff/pull/4390)
- [@&#8203;tkukushkin](https://togithub.com/tkukushkin) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/4853](https://togithub.com/astral-sh/ruff/pull/4853)
- [@&#8203;Taybou](https://togithub.com/Taybou) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/5088](https://togithub.com/astral-sh/ruff/pull/5088)
- [@&#8203;davidszotten](https://togithub.com/davidszotten) made their
first contribution in
[https://github.com/astral-sh/ruff/pull/5158](https://togithub.com/astral-sh/ruff/pull/5158)
- [@&#8203;dosisod](https://togithub.com/dosisod) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/5203](https://togithub.com/astral-sh/ruff/pull/5203)

**Full Changelog**:
astral-sh/ruff@v0.0.272...v0.0.273

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

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
AlexWaygood referenced this pull request in AlexWaygood/typeshed-stats Jul 1, 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 |
|---|---|---|---|---|---|
| [docs/MarkDown](https://togithub.com/Python-Markdown/markdown)
([changelog](https://togithub.com/Python-Markdown/markdown/blob/master/docs/change_log/index.md))
| `==3.3.7` -> `==3.4.3` |
[![age](https://badges.renovateapi.com/packages/pypi/docs%2fMarkDown/3.4.3/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/docs%2fMarkDown/3.4.3/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/docs%2fMarkDown/3.4.3/compatibility-slim/3.3.7)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/docs%2fMarkDown/3.4.3/confidence-slim/3.3.7)](https://docs.renovatebot.com/merge-confidence/)
|
| [docs/mkdocs-material](https://togithub.com/squidfunk/mkdocs-material)
| `==9.1.14` -> `==9.1.17` |
[![age](https://badges.renovateapi.com/packages/pypi/docs%2fmkdocs-material/9.1.17/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/docs%2fmkdocs-material/9.1.17/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/docs%2fmkdocs-material/9.1.17/compatibility-slim/9.1.14)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/docs%2fmkdocs-material/9.1.17/confidence-slim/9.1.14)](https://docs.renovatebot.com/merge-confidence/)
|
| [docs/mkdocstrings](https://togithub.com/mkdocstrings/mkdocstrings)
([changelog](https://mkdocstrings.github.io/changelog)) | `==0.21.2` ->
`==0.22.0` |
[![age](https://badges.renovateapi.com/packages/pypi/docs%2fmkdocstrings/0.22.0/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/docs%2fmkdocstrings/0.22.0/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/docs%2fmkdocstrings/0.22.0/compatibility-slim/0.21.2)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/docs%2fmkdocstrings/0.22.0/confidence-slim/0.21.2)](https://docs.renovatebot.com/merge-confidence/)
|
| [misc-lint/blacken-docs](https://togithub.com/asottile/blacken-docs)
([changelog](https://togithub.com/adamchainz/blacken-docs/blob/main/CHANGELOG.rst))
| `==1.13.0` -> `==1.14.0` |
[![age](https://badges.renovateapi.com/packages/pypi/misc-lint%2fblacken-docs/1.14.0/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/misc-lint%2fblacken-docs/1.14.0/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/misc-lint%2fblacken-docs/1.14.0/compatibility-slim/1.13.0)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/misc-lint%2fblacken-docs/1.14.0/confidence-slim/1.13.0)](https://docs.renovatebot.com/merge-confidence/)
|
| [misc-lint/pycln](https://hadialqattan.github.io/pycln)
([source](https://togithub.com/hadialqattan/pycln)) | `==2.1.3` ->
`==2.1.5` |
[![age](https://badges.renovateapi.com/packages/pypi/misc-lint%2fpycln/2.1.5/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/misc-lint%2fpycln/2.1.5/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/misc-lint%2fpycln/2.1.5/compatibility-slim/2.1.3)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/misc-lint%2fpycln/2.1.5/confidence-slim/2.1.3)](https://docs.renovatebot.com/merge-confidence/)
|
| [misc-lint/ruff](https://beta.ruff.rs/docs)
([source](https://togithub.com/astral-sh/ruff),
[changelog](https://togithub.com/astral-sh/ruff/releases)) | `==0.0.272`
-> `==0.0.275` |
[![age](https://badges.renovateapi.com/packages/pypi/misc-lint%2fruff/0.0.275/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/misc-lint%2fruff/0.0.275/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/misc-lint%2fruff/0.0.275/compatibility-slim/0.0.272)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/misc-lint%2fruff/0.0.275/confidence-slim/0.0.272)](https://docs.renovatebot.com/merge-confidence/)
|
| [pytest/pytest](https://docs.pytest.org/en/latest/)
([source](https://togithub.com/pytest-dev/pytest),
[changelog](https://docs.pytest.org/en/stable/changelog.html)) |
`==7.3.1` -> `==7.4.0` |
[![age](https://badges.renovateapi.com/packages/pypi/pytest%2fpytest/7.4.0/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/pytest%2fpytest/7.4.0/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/pytest%2fpytest/7.4.0/compatibility-slim/7.3.1)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/pytest%2fpytest/7.4.0/confidence-slim/7.3.1)](https://docs.renovatebot.com/merge-confidence/)
|
| [pytest/pytest-mock](https://togithub.com/pytest-dev/pytest-mock)
([changelog](https://pytest-mock.readthedocs.io/en/latest/changelog.html))
| `==3.10.0` -> `==3.11.1` |
[![age](https://badges.renovateapi.com/packages/pypi/pytest%2fpytest-mock/3.11.1/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/pytest%2fpytest-mock/3.11.1/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/pytest%2fpytest-mock/3.11.1/compatibility-slim/3.10.0)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/pytest%2fpytest-mock/3.11.1/confidence-slim/3.10.0)](https://docs.renovatebot.com/merge-confidence/)
|
| [typecheck/mypy](https://www.mypy-lang.org/)
([source](https://togithub.com/python/mypy),
[changelog](https://mypy-lang.blogspot.com/)) | `==1.3.0` -> `==1.4.0` |
[![age](https://badges.renovateapi.com/packages/pypi/typecheck%2fmypy/1.4.0/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/pypi/typecheck%2fmypy/1.4.0/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/pypi/typecheck%2fmypy/1.4.0/compatibility-slim/1.3.0)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/pypi/typecheck%2fmypy/1.4.0/confidence-slim/1.3.0)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>Python-Markdown/markdown (docs/MarkDown)</summary>

###
[`v3.4.3`](https://togithub.com/Python-Markdown/markdown/compare/3.4.2...3.4.3)

[Compare
Source](https://togithub.com/Python-Markdown/markdown/compare/3.4.2...3.4.3)

###
[`v3.4.2`](https://togithub.com/Python-Markdown/markdown/compare/3.4.1...3.4.2)

[Compare
Source](https://togithub.com/Python-Markdown/markdown/compare/3.4.1...3.4.2)

###
[`v3.4.1`](https://togithub.com/Python-Markdown/markdown/compare/3.4...3.4.1)

[Compare
Source](https://togithub.com/Python-Markdown/markdown/compare/3.4...3.4.1)

###
[`v3.4`](https://togithub.com/Python-Markdown/markdown/compare/3.3.7...3.4)

[Compare
Source](https://togithub.com/Python-Markdown/markdown/compare/3.3.7...3.4)

</details>

<details>
<summary>squidfunk/mkdocs-material (docs/mkdocs-material)</summary>

###
[`v9.1.17`](https://togithub.com/squidfunk/mkdocs-material/releases/tag/9.1.17):
mkdocs-material-9.1.17

[Compare
Source](https://togithub.com/squidfunk/mkdocs-material/compare/9.1.16...9.1.17)

- Fixed
[#&#8203;5633](https://togithub.com/squidfunk/mkdocs-material/issues/5633):
Code annotations with nested lists incorrectly mounted
- Fixed
[#&#8203;5628](https://togithub.com/squidfunk/mkdocs-material/issues/5628):
Regression in new social plugin configuration scheme

###
[`v9.1.16`](https://togithub.com/squidfunk/mkdocs-material/releases/tag/9.1.16):
mkdocs-material-9.1.16

[Compare
Source](https://togithub.com/squidfunk/mkdocs-material/compare/9.1.15...9.1.16)

-   Updated Indonesian translations
-   Ensure scroll bar follows color scheme of operating system

###
[`v9.1.15`](https://togithub.com/squidfunk/mkdocs-material/releases/tag/9.1.15):
mkdocs-material-9.1.15

[Compare
Source](https://togithub.com/squidfunk/mkdocs-material/compare/9.1.14...9.1.15)

- Fixed
[#&#8203;5566](https://togithub.com/squidfunk/mkdocs-material/issues/5566):
Indicate color scheme to operating system
- Fixed
[#&#8203;5565](https://togithub.com/squidfunk/mkdocs-material/issues/5565):
Update `Dockerfile` to latest version of base image
- Fixed
[#&#8203;5554](https://togithub.com/squidfunk/mkdocs-material/issues/5554):
Add additional version tags (`9`, `9.1`) to Docker image
- Fixed
[#&#8203;5536](https://togithub.com/squidfunk/mkdocs-material/issues/5536):
Strip tags of ARIA labels in table of contents

</details>

<details>
<summary>mkdocstrings/mkdocstrings (docs/mkdocstrings)</summary>

###
[`v0.22.0`](https://togithub.com/mkdocstrings/mkdocstrings/blob/HEAD/CHANGELOG.md#&#8203;0220-httpsgithubcommkdocstringsmkdocstringsreleasestag0220---2023-05-25)

[Compare
Source](https://togithub.com/mkdocstrings/mkdocstrings/compare/0.21.2...0.22.0)

<small>[Compare with
0.21.2](https://togithub.com/mkdocstrings/mkdocstrings/compare/0.21.2...0.22.0)</small>

##### Features

- Allow extensions to add templates
([cf0af05](https://togithub.com/mkdocstrings/mkdocstrings/commit/cf0af059eb89240eba0437de417c124389e2f20e)
by Timothée Mazzucotelli). [PR
#&#8203;569](https://togithub.com/mkdocstrings/mkdocstrings/pull/569)

##### Code Refactoring

- Report inventory loading errors
([2c05d78](https://togithub.com/mkdocstrings/mkdocstrings/commit/2c05d7854b87251e26c1a2e1810b85702ff110f3)
by Timothée Mazzucotelli). Co-authored-by: Oleh Prypin <oleh@pryp.in>

</details>

<details>
<summary>asottile/blacken-docs (misc-lint/blacken-docs)</summary>

###
[`v1.14.0`](https://togithub.com/asottile/blacken-docs/blob/HEAD/CHANGELOG.rst#&#8203;1140-2023-06-13)

[Compare
Source](https://togithub.com/asottile/blacken-docs/compare/1.13.0...1.14.0)

-   Support Python 3.12.

</details>

<details>
<summary>hadialqattan/pycln (misc-lint/pycln)</summary>

###
[`v2.1.5`](https://togithub.com/hadialqattan/pycln/releases/tag/v2.1.5)

[Compare
Source](https://togithub.com/hadialqattan/pycln/compare/v2.1.4...v2.1.5)

##### Changed

- [Widen `pathspec` version artificial lock by
@&#8203;hadialqattan](https://togithub.com/hadialqattan/pycln/pull/203)

###
[`v2.1.4`](https://togithub.com/hadialqattan/pycln/releases/tag/v2.1.4)

[Compare
Source](https://togithub.com/hadialqattan/pycln/compare/v2.1.3...v2.1.4)

##### Fixed

- [Detect third-party libs installed in editable mode by
@&#8203;hadialqattan](https://togithub.com/hadialqattan/pycln/pull/200)
- [Preserve the original line break format by @&#8203;maxbachmann &
@&#8203;hadialqattan](https://togithub.com/hadialqattan/pycln/pull/197)

##### Changed

- [Bump JRubics/poetry-publish from 1.16 to 1.17 by
@&#8203;dependabot\[bot\]](https://togithub.com/hadialqattan/pycln/pull/201)
- [Remove `pathspec` version artificial lock by
@&#8203;hadialqattan](https://togithub.com/hadialqattan/pycln/pull/199)
- [Bump codecov/codecov-action from 3.1.1 to 3.1.4 by
@&#8203;dependabot\[bot\]](https://togithub.com/hadialqattan/pycln/pull/198)
- [Bump typer from 0.7.0 to 0.9.0 by
@&#8203;dependabot\[bot\]](https://togithub.com/hadialqattan/pycln/pull/195)

</details>

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

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

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.0.274...v0.0.275)

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

#### What's Changed

Highlights include a 7-10x decrease in Ruff's cache size.

##### Rules

- Add support for top-level quoted annotations in RUF013 by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5235](https://togithub.com/astral-sh/ruff/pull/5235)
- Add support for nested quoted annotations in RUF013 by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/5254](https://togithub.com/astral-sh/ruff/pull/5254)
- Move `compare-to-empty-string` (`PLC1901`) to nursery by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5264](https://togithub.com/astral-sh/ruff/pull/5264)
- Ignore Pydantic classes when evaluating `mutable-class-default`
(`RUF012`) by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5273](https://togithub.com/astral-sh/ruff/pull/5273)
- Allow `typing.Final` for `mutable-class-default annotations`
(`RUF012`) by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5274](https://togithub.com/astral-sh/ruff/pull/5274)
- Modify `deprecated-import` (`UP035`) to prefer `typing_extensions` in
some versions by [@&#8203;tjkuson](https://togithub.com/tjkuson) in
[https://github.com/astral-sh/ruff/pull/5291](https://togithub.com/astral-sh/ruff/pull/5291)

##### Bug Fixes

- Restore existing bindings when unbinding caught exceptions by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5256](https://togithub.com/astral-sh/ruff/pull/5256)
- Avoid including nursery rules in linter-level selectors by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5268](https://togithub.com/astral-sh/ruff/pull/5268)

#### New Contributors

- [@&#8203;jgberry](https://togithub.com/jgberry) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/5221](https://togithub.com/astral-sh/ruff/pull/5221)

**Full Changelog**:
astral-sh/ruff@v0.0.274...v0.0.275

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

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.0.273...v0.0.274)

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

#### What's Changed

Follow-up release to `v0.0.273` to fix a panic in cache accesses.

##### Bug Fixes

- Use package roots rather than package members for cache initialization
by [@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5233](https://togithub.com/astral-sh/ruff/pull/5233)
- Avoid `.unwrap()` on cache access by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5229](https://togithub.com/astral-sh/ruff/pull/5229)
- Revert change to `RUF010` to remove unnecessary `str` calls by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5232](https://togithub.com/astral-sh/ruff/pull/5232)
- Avoid erroneous RUF013 violations for quoted annotations by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5234](https://togithub.com/astral-sh/ruff/pull/5234)

**Full Changelog**:
astral-sh/ruff@v0.0.273...v0.0.274

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

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.0.272...v0.0.273)

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

#### What's Changed

Highlights include:

- Autofix capabilities for rules like `flake8-import-conventions`, which
require symbol renames across a file.
- Significant decrease in Ruff's cache size (e.g., a ~50% decrease for
FastAPI).
-   Dozens and dozens of bug fixes + performance improvements.

##### Rules

- \[`copyright`] Implement copyright notice detection by
[@&#8203;Ryang20718](https://togithub.com/Ryang20718) in
[https://github.com/astral-sh/ruff/pull/4701](https://togithub.com/astral-sh/ruff/pull/4701)
- \[`flake8-datetimez`] Enable UTC-import for `datetime-utc-alias` fix
by [@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5100](https://togithub.com/astral-sh/ruff/pull/5100)
- \[`flake8-implicit-str-concat`] Add autofix for `ISC001` by
[@&#8203;tkukushkin](https://togithub.com/tkukushkin) in
[https://github.com/astral-sh/ruff/pull/4853](https://togithub.com/astral-sh/ruff/pull/4853)
- \[`flake8-import-conventions`] Enable autofix for unconventional
imports rule by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5152](https://togithub.com/astral-sh/ruff/pull/5152)
- \[`flake8-pyi`] Add autofix for `Set`-to-`AbstractSet` rewrite using
reference tracking by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5074](https://togithub.com/astral-sh/ruff/pull/5074)
- \[`flake8-pyi`] Implement PYI044 by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5021](https://togithub.com/astral-sh/ruff/pull/5021)
- \[`flake8-return`] Extend revised `RET504` implementation to `with`
statements by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4998](https://togithub.com/astral-sh/ruff/pull/4998)
- \[`flake8-return`] Implement autofix for revised `RET504` rule by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4999](https://togithub.com/astral-sh/ruff/pull/4999)
- \[`flake8-return`] Refactor `RET504` to only enforce
assignment-then-return pattern by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4997](https://togithub.com/astral-sh/ruff/pull/4997)
- \[`flake8-slots`] Add plugin, add `SLOT000`, `SLOT001` and `SLOT002`
by [@&#8203;qdegraaf](https://togithub.com/qdegraaf) in
[https://github.com/astral-sh/ruff/pull/4909](https://togithub.com/astral-sh/ruff/pull/4909)
- \[`perflint`] Add `perflint` plugin, add first rule `PERF102` by
[@&#8203;qdegraaf](https://togithub.com/qdegraaf) in
[https://github.com/astral-sh/ruff/pull/4821](https://togithub.com/astral-sh/ruff/pull/4821)
- \[`pylint`] Add Pylint rule `comparison-with-itself` (`R0124`) by
[@&#8203;tjkuson](https://togithub.com/tjkuson) in
[https://github.com/astral-sh/ruff/pull/4957](https://togithub.com/astral-sh/ruff/pull/4957)
- \[`pyupgrade`] Add a rule to remove unnecessary parentheses in class
definitions by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5032](https://togithub.com/astral-sh/ruff/pull/5032)
- \[`ruff`] Add a rule for static keys in dict comprehensions by
[@&#8203;rodjunger](https://togithub.com/rodjunger) in
[https://github.com/astral-sh/ruff/pull/4929](https://togithub.com/astral-sh/ruff/pull/4929)
- \[`ruff`] Add rule to disallow implicit optional with autofix by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/4831](https://togithub.com/astral-sh/ruff/pull/4831)
- \[`ruff`] Expand RUF008 to all classes, but to a new code (RUF012) by
[@&#8203;adampauls](https://togithub.com/adampauls) in
[https://github.com/astral-sh/ruff/pull/4390](https://togithub.com/astral-sh/ruff/pull/4390)
- \[`ruff`] Remove unannotated attributes from RUF008 by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5049](https://togithub.com/astral-sh/ruff/pull/5049)
- \[`ruff`] Upgrade explicit-type-conversion rule (`RUF010`) to remove
unnecessary `str` calls by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4971](https://togithub.com/astral-sh/ruff/pull/4971)

##### Settings

- Option (`-o`/`--output-file`) to write output to a file by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/4950](https://togithub.com/astral-sh/ruff/pull/4950)
- Add JSON Lines (NDJSON) message serialization by
[@&#8203;akx](https://togithub.com/akx) in
[https://github.com/astral-sh/ruff/pull/5048](https://togithub.com/astral-sh/ruff/pull/5048)
- Add rule documentation URL to JSON output by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5187](https://togithub.com/astral-sh/ruff/pull/5187)

##### Caching

- Only use a single cache file per Python package by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5117](https://togithub.com/astral-sh/ruff/pull/5117)
- Open cache files in parallel by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5120](https://togithub.com/astral-sh/ruff/pull/5120)

##### Jupyter

- Add support for auto-fix in Jupyter notebooks by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/4665](https://togithub.com/astral-sh/ruff/pull/4665)
- Add roundtrip support for Jupyter notebook by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/5028](https://togithub.com/astral-sh/ruff/pull/5028)

##### Bug Fixes

- Handle decorators in class-parenthesis-modifying rules by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5034](https://togithub.com/astral-sh/ruff/pull/5034)
- Allow re-assignments to `__all__` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4967](https://togithub.com/astral-sh/ruff/pull/4967)
- Handled dict and set inside f-string
([#&#8203;4249](https://togithub.com/astral-sh/ruff/issues/4249)) by
[@&#8203;DavideCanton](https://togithub.com/DavideCanton) in
[https://github.com/astral-sh/ruff/pull/4563](https://togithub.com/astral-sh/ruff/pull/4563)
- Support concatenated string key removals by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4976](https://togithub.com/astral-sh/ruff/pull/4976)
- Respect 'is not' operators split across newlines by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4977](https://togithub.com/astral-sh/ruff/pull/4977)
- Parenthesize expressions prior to lexing in F632 by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5001](https://togithub.com/astral-sh/ruff/pull/5001)
- Ignore pyproject.toml for adding noqa directives by
[@&#8203;dhruvmanila](https://togithub.com/dhruvmanila) in
[https://github.com/astral-sh/ruff/pull/5013](https://togithub.com/astral-sh/ruff/pull/5013)
- Support 'reason' argument to `pytest.fail` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5040](https://togithub.com/astral-sh/ruff/pull/5040)
- Allow `async with` in `redefined-loop-name` by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5125](https://togithub.com/astral-sh/ruff/pull/5125)
- Skip `DJ008` enforcement in stub files by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5139](https://togithub.com/astral-sh/ruff/pull/5139)
- Detect continuations at start-of-file by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5173](https://togithub.com/astral-sh/ruff/pull/5173)
- Fix allowed-ellipsis detection by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5174](https://togithub.com/astral-sh/ruff/pull/5174)
- Remove continuations before trailing semicolons by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5199](https://togithub.com/astral-sh/ruff/pull/5199)
- Support parenthesized expressions when splitting compound assertions
by [@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5219](https://togithub.com/astral-sh/ruff/pull/5219)
- Use phf for confusables to reduce llvm lines by
[@&#8203;konstin](https://togithub.com/konstin) in
[https://github.com/astral-sh/ruff/pull/4926](https://togithub.com/astral-sh/ruff/pull/4926)
- Allow private accesses within special dunder methods by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4968](https://togithub.com/astral-sh/ruff/pull/4968)
- Support concatenated literals in format-literals by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/4974](https://togithub.com/astral-sh/ruff/pull/4974)
- Fix line numbers in source frames by
[@&#8203;MichaReiser](https://togithub.com/MichaReiser) in
[https://github.com/astral-sh/ruff/pull/4984](https://togithub.com/astral-sh/ruff/pull/4984)
- Suggest combining async with statements by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5022](https://togithub.com/astral-sh/ruff/pull/5022)
- Improve `TypedDict` conversion logic for shadowed builtins and dunder
methods by [@&#8203;charliermarsh](https://togithub.com/charliermarsh)
in
[https://github.com/astral-sh/ruff/pull/5038](https://togithub.com/astral-sh/ruff/pull/5038)
- Support glob patterns in pep8\_naming ignore-names by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5024](https://togithub.com/astral-sh/ruff/pull/5024)
- Respect all `__all__` definitions for docstring visibility by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5052](https://togithub.com/astral-sh/ruff/pull/5052)
- Don't treat annotations as resolved in forward references by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5060](https://togithub.com/astral-sh/ruff/pull/5060)
- Consider ignore-names in all pep8 naming rules by
[@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) in
[https://github.com/astral-sh/ruff/pull/5079](https://togithub.com/astral-sh/ruff/pull/5079)
- Ignore `reimplemented-builtin` if using `await` by
[@&#8203;tjkuson](https://togithub.com/tjkuson) in
[https://github.com/astral-sh/ruff/pull/5101](https://togithub.com/astral-sh/ruff/pull/5101)
- Allow space in filename for powershell + windows + python module by
[@&#8203;konstin](https://togithub.com/konstin) in
[https://github.com/astral-sh/ruff/pull/5115](https://togithub.com/astral-sh/ruff/pull/5115)
- Don't treat straight imports of **future** as `__future__` imports by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5128](https://togithub.com/astral-sh/ruff/pull/5128)
- Remove continuations when deleting statements by
[@&#8203;charliermarsh](https://togithub.com/charliermarsh) in
[https://github.com/astral-sh/ruff/pull/5198](https://togithub.com/astral-sh/ruff/pull/5198)
- Fix corner case involving terminal backslash after fixing `W293` by
[@&#8203;evanrittenhouse](https://togithub.com/evanrittenhouse) in
[https://github.com/astral-sh/ruff/pull/5172](https://togithub.com/astral-sh/ruff/pull/5172)
- Fix subprocess.run on Windows Python 3.7 by
[@&#8203;konstin](https://togithub.com/konstin) in
[https://github.com/astral-sh/ruff/pull/5220](https://togithub.com/astral-sh/ruff/pull/5220)

#### New Contributors

- [@&#8203;rodjunger](https://togithub.com/rodjunger) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/4929](https://togithub.com/astral-sh/ruff/pull/4929)
- [@&#8203;DavideCanton](https://togithub.com/DavideCanton) made their
first contribution in
[https://github.com/astral-sh/ruff/pull/4563](https://togithub.com/astral-sh/ruff/pull/4563)
- [@&#8203;Thomasdezeeuw](https://togithub.com/Thomasdezeeuw) made their
first contribution in
[https://github.com/astral-sh/ruff/pull/5021](https://togithub.com/astral-sh/ruff/pull/5021)
- [@&#8203;adampauls](https://togithub.com/adampauls) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/4390](https://togithub.com/astral-sh/ruff/pull/4390)
- [@&#8203;tkukushkin](https://togithub.com/tkukushkin) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/4853](https://togithub.com/astral-sh/ruff/pull/4853)
- [@&#8203;Taybou](https://togithub.com/Taybou) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/5088](https://togithub.com/astral-sh/ruff/pull/5088)
- [@&#8203;davidszotten](https://togithub.com/davidszotten) made their
first contribution in
[https://github.com/astral-sh/ruff/pull/5158](https://togithub.com/astral-sh/ruff/pull/5158)
- [@&#8203;dosisod](https://togithub.com/dosisod) made their first
contribution in
[https://github.com/astral-sh/ruff/pull/5203](https://togithub.com/astral-sh/ruff/pull/5203)

**Full Changelog**:
astral-sh/ruff@v0.0.272...v0.0.273

</details>

<details>
<summary>pytest-dev/pytest (pytest/pytest)</summary>

###
[`v7.4.0`](https://togithub.com/pytest-dev/pytest/releases/tag/7.4.0)

[Compare
Source](https://togithub.com/pytest-dev/pytest/compare/7.3.2...7.4.0)

# pytest 7.4.0 (2023-06-23)

## Features

- [#&#8203;10901](https://togithub.com/pytest-dev/pytest/issues/10901):
Added `ExceptionInfo.from_exception()
<pytest.ExceptionInfo.from_exception>`{.interpreted-text role="func"}, a
simpler way to create an `~pytest.ExceptionInfo`{.interpreted-text
role="class"} from an exception.
This can replace `ExceptionInfo.from_exc_info()
<pytest.ExceptionInfo.from_exc_info()>`{.interpreted-text role="func"}
for most uses.

## Improvements

- [#&#8203;10872](https://togithub.com/pytest-dev/pytest/issues/10872):
Update test log report annotation to named tuple and fixed inconsistency
in docs for `pytest_report_teststatus`{.interpreted-text role="hook"}
hook.

- [#&#8203;10907](https://togithub.com/pytest-dev/pytest/issues/10907):
When an exception traceback to be displayed is completely filtered out
(by mechanisms such as `__tracebackhide__`, internal frames, and
similar), now only the exception string and the following message are
shown:

"All traceback entries are hidden. Pass \[--full-trace]{.title-ref} to
see hidden and internal frames.".

Previously, the last frame of the traceback was shown, even though it
was hidden.

- [#&#8203;10940](https://togithub.com/pytest-dev/pytest/issues/10940):
Improved verbose output (`-vv`) of `skip` and `xfail` reasons by
performing text wrapping while leaving a clear margin for progress
output.

    Added `TerminalReporter.wrap_write()` as a helper for that.

- [#&#8203;10991](https://togithub.com/pytest-dev/pytest/issues/10991):
Added handling of `%f` directive to print microseconds in log format
options, such as `log-date-format`.

- [#&#8203;11005](https://togithub.com/pytest-dev/pytest/issues/11005):
Added the underlying exception to the cache provider's path creation and
write warning messages.

- [#&#8203;11013](https://togithub.com/pytest-dev/pytest/issues/11013):
Added warning when `testpaths`{.interpreted-text role="confval"} is set,
but paths are not found by glob. In this case, pytest will fall back to
searching from the current directory.

- [#&#8203;11043](https://togithub.com/pytest-dev/pytest/issues/11043):
When \[--confcutdir]{.title-ref} is not specified, and there is no
config file present, the conftest cutoff directory
(\[--confcutdir]{.title-ref}) is now set to the `rootdir
<rootdir>`{.interpreted-text role="ref"}.
Previously in such cases, \[conftest.py]{.title-ref} files would be
probed all the way to the root directory of the filesystem.
If you are badly affected by this change, consider adding an empty
config file to your desired cutoff directory, or explicitly set
\[--confcutdir]{.title-ref}.

- [#&#8203;11081](https://togithub.com/pytest-dev/pytest/issues/11081):
The `norecursedirs`{.interpreted-text role="confval"} check is now
performed in a `pytest_ignore_collect`{.interpreted-text role="hook"}
implementation, so plugins can affect it.

If after updating to this version you see that your
\[norecursedirs]{.title-ref} setting is not being respected,
it means that a conftest or a plugin you use has a bad
\[pytest_ignore_collect]{.title-ref} implementation.
Most likely, your hook returns \[False]{.title-ref} for paths it does
not want to ignore,
which ends the processing and doesn't allow other plugins, including
pytest itself, to ignore the path.
The fix is to return \[None]{.title-ref} instead of \[False]{.title-ref}
for paths your hook doesn't want to ignore.

- [#&#8203;8711](https://togithub.com/pytest-dev/pytest/issues/8711):
`caplog.set_level()
<pytest.LogCaptureFixture.set_level>`{.interpreted-text role="func"} and
`caplog.at_level()
<pytest.LogCaptureFixture.at_level>`{.interpreted-text role="func"}
will temporarily enable the requested `level` if `level` was disabled
globally via
    `logging.disable(LEVEL)`.

## Bug Fixes

- [#&#8203;10831](https://togithub.com/pytest-dev/pytest/issues/10831):
Terminal Reporting: Fixed bug when running in `--tb=line` mode where
`pytest.fail(pytrace=False)` tests report `None`.
- [#&#8203;11068](https://togithub.com/pytest-dev/pytest/issues/11068):
Fixed the `--last-failed` whole-file skipping functionality ("skipped N
files") for `non-python test files <non-python tests>`{.interpreted-text
role="ref"}.
- [#&#8203;11104](https://togithub.com/pytest-dev/pytest/issues/11104):
Fixed a regression in pytest 7.3.2 which caused to
`testpaths`{.interpreted-text role="confval"} to be considered for
loading initial conftests,
even when it was not utilized (e.g. when explicit paths were given on
the command line).
    Now the `testpaths` are only considered when they are in use.
- [#&#8203;1904](https://togithub.com/pytest-dev/pytest/issues/1904):
Fixed traceback entries hidden with `__tracebackhide__ = True` still
being shown for chained exceptions (parts after "... the above exception
..." message).
- [#&#8203;7781](https://togithub.com/pytest-dev/pytest/issues/7781):
Fix writing non-encodable text to log file when using `--debug`.

## Improved Documentation

- [#&#8203;9146](https://togithub.com/pytest-dev/pytest/issues/9146):
Improved documentation for `caplog.set_level()
<pytest.LogCaptureFixture.set_level>`{.interpreted-text role="func"}.

## Trivial/Internal Changes

- [#&#8203;11031](https://togithub.com/pytest-dev/pytest/issues/11031):
Enhanced the CLI flag for `-c` to now include `--config-file` to make it
clear that this flag applies to the usage of a custom config file.

###
[`v7.3.2`](https://togithub.com/pytest-dev/pytest/releases/tag/7.3.2)

[Compare
Source](https://togithub.com/pytest-dev/pytest/compare/7.3.1...7.3.2)

# pytest 7.3.2 (2023-06-10)

## Bug Fixes

- [#&#8203;10169](https://togithub.com/pytest-dev/pytest/issues/10169):
Fix bug where very long option names could cause pytest to break with
`OSError: [Errno 36] File name too long` on some systems.
- [#&#8203;10894](https://togithub.com/pytest-dev/pytest/issues/10894):
Support for Python 3.12 (beta at the time of writing).
- [#&#8203;10987](https://togithub.com/pytest-dev/pytest/issues/10987):
`testpaths`{.interpreted-text role="confval"} is now honored to load
root `conftests`.
- [#&#8203;10999](https://togithub.com/pytest-dev/pytest/issues/10999):
The \[monkeypatch]{.title-ref}
\[setitem]{.title-ref}/\[delitem]{.title-ref} type annotations now allow
\[TypedDict]{.title-ref} arguments.
- [#&#8203;11028](https://togithub.com/pytest-dev/pytest/issues/11028):
Fixed bug in assertion rewriting where a variable assigned with the
walrus operator could not be used later in a function call.
- [#&#8203;11054](https://togithub.com/pytest-dev/pytest/issues/11054):
Fixed `--last-failed`'s "(skipped N files)" functionality for files
inside of packages (directories with \[\__init\_\_.py]{.title-ref}
files).

</details>

<details>
<summary>pytest-dev/pytest-mock (pytest/pytest-mock)</summary>

###
[`v3.11.1`](https://togithub.com/pytest-dev/pytest-mock/blob/HEAD/CHANGELOG.rst#&#8203;3111-2023-06-15)

[Compare
Source](https://togithub.com/pytest-dev/pytest-mock/compare/v3.11.0...v3.11.1)

(This release source code is identical to `3.11.0` except a small
internal fix to deployment/CI)

-   Fixed introspection for failed `assert_has_calls` (`#365`\_).

- Updated type annotations for `mocker.patch` and `mocker.spy`
(`#364`\_).

..
\_#&#820[https://github.com/pytest-dev/pytest-mock/pull/365](https://togithub.com/pytest-dev/pytest-mock/pull/365)ull/365
..
\[https://github.com/pytest-dev/pytest-mock/pull/364](https://togithub.com/pytest-dev/pytest-mock/pull/364)-mock/pull/364

###
[`v3.11.0`](https://togithub.com/pytest-dev/pytest-mock/blob/HEAD/CHANGELOG.rst#&#8203;3110-2023-06-15)

[Compare
Source](https://togithub.com/pytest-dev/pytest-mock/compare/v3.10.0...v3.11.0)

-   Fixed introspection for failed `assert_has_calls` (`#365`\_).

- Updated type annotations for `mocker.patch` and `mocker.spy`
(`#364`\_).

..
\_#&#820[https://github.com/pytest-dev/pytest-mock/pull/365](https://togithub.com/pytest-dev/pytest-mock/pull/365)ull/365
..
\[https://github.com/pytest-dev/pytest-mock/pull/364](https://togithub.com/pytest-dev/pytest-mock/pull/364)-mock/pull/364

</details>

<details>
<summary>python/mypy (typecheck/mypy)</summary>

### [`v1.4.0`](https://togithub.com/python/mypy/compare/v1.3.0...v1.4.0)

[Compare
Source](https://togithub.com/python/mypy/compare/v1.3.0...v1.4.0)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "every 3 months on the first day of
the month" (UTC), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

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

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config help](https://togithub.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- 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/AlexWaygood/typeshed-stats).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS4xNDQuMiIsInVwZGF0ZWRJblZlciI6IjM1LjE0NC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.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.

Panic when Jupyter notebook contains only a single empty code cell Support formatting jupyter notebooks

5 participants