Micha Reiser
d6daa61563
Handle trailing end-of-line comments in-between-bodies ( #4812 )
...
<!--
Thank you for contributing to Ruff! To help us out with reviewing, please consider the following:
- Does this pull request include a summary of the change? (See below.)
- Does this pull request include a descriptive title?
- Does this pull request include references to any relevant issues?
-->
## Summary
And more custom logic around comments in bodies... uff.
Let's say we have the following code
```python
if x == y:
pass # trailing comment of pass
else: # trailing comment of `else`
print("I have no comments")
```
Right now, the formatter attaches the `# trailing comment of `else` as a trailing comment of `pass` because it doesn't "see" that there's an `else` keyword in between (because the else body is just a Vec and not a node).
This PR adds custom logic that attaches the trailing comments after the `else` as dangling comments to the `if` statement. The if statement must then split the dangling comments by `comments.text_position()`:
* All comments up to the first end-of-line comment are leading comments of the `else` keyword.
* All end-of-line comments coming after are `trailing` comments for the `else` keyword.
## Test Plan
I added new unit tests.
2023-06-03 15:29:22 +02:00
Micha Reiser
cb6788ab5f
Handle trailing body end-of-line comments ( #4811 )
...
### Summary
This PR adds custom logic to handle end-of-line comments of the last statement in a body.
For example:
```python
while True:
if something.changed:
do.stuff() # trailing comment
b
```
The `# trailing comment` is a trailing comment of the `do.stuff()` expression statement. We incorrectly attached the comment as a trailing comment of the enclosing `while` statement because the comment is between the end of the while statement (the `while` statement ends right after `do.stuff()`) and before the `b` statement.
This PR fixes the placement to correctly attach these comments to the last statement in a body (recursively).
## Test Plan
I reviewed the snapshots and they now look correct. This may appear odd because a lot comments have now disappeared. This is the expected result because we use `verbatim` formatting for the block statements (like `while`) and that means that it only formats the inner content of the block, but not any trailing comments. The comments were visible before, because they were associated with the block statement (e.g. `while`).
2023-06-03 15:17:33 +02:00
Justin Prieto
e82160a83a
[`flake8-pyi`] Implement PYI035 ( #4820 )
2023-06-03 03:13:04 +00:00
Charlie Marsh
26b1dd0ca2
Remove `name` field from import binding kinds ( #4817 )
2023-06-02 23:02:47 -04:00
Charlie Marsh
fcfd6ad129
Rename outlier Pathlib rule ( #4816 )
2023-06-02 18:42:17 +00:00
Charlie Marsh
6a0cebdf7b
Remove regex from partial-path rule ( #4815 )
2023-06-02 18:28:55 +00:00
Ville Skyttä
0a5dfcb26a
Implement S609, linux_commands_wildcard_injection ( #4504 )
2023-06-02 18:19:02 +00:00
Micha Reiser
ebdc4afc33
Suite formatting and `JoinNodesBuilder` ( #4805 )
2023-06-02 14:14:38 +00:00
Jonathan Plasse
03ee6033f9
Fix flake8-fixme architecture ( #4807 )
2023-06-02 09:15:44 -04:00
Micha Reiser
a401989b7a
Format StmtExpr ( #4788 )
2023-06-02 12:52:38 +00:00
Micha Reiser
4cd4b37e74
Format the comment content ( #4786 )
2023-06-02 11:22:34 +00:00
konstin
602b4b3519
Merge registry into codes ( #4651 )
...
* Document codes.rs
* Refactor codes.rs before merging
Helper script:
```python
# %%
from pathlib import Path
codes = Path("crates/ruff/src/codes.rs").read_text().splitlines()
rules = Path("a.txt").read_text().strip().splitlines()
rule_map = {i.split("::")[-1]: i for i in rules}
# %%
codes_new = []
for line in codes:
if ", Rule::" in line:
left, right = line.split(", Rule::")
right = right[:-2]
line = left + ", " + rule_map[right] + "),"
codes_new.append(line)
# %%
Path("crates/ruff/src/codes.rs").write_text("\n".join(codes_new))
```
Co-authored-by: Jonathan Plasse <13716151+JonathanPlasse@users.noreply.github.com>
2023-06-02 10:33:01 +00:00
konstin
c4fdbf8903
Switch PyFormatter lifetimes ( #4804 )
...
Stylistic change to have the input lifetime first and the output lifetime second. I'll rebase my other PR on top of this.
Test plan: `cargo clippy`
2023-06-02 12:26:39 +02:00
Micha Reiser
5d939222db
Leading, Dangling, and Trailing comments formatting ( #4785 )
2023-06-02 09:26:36 +02:00
Evan Rittenhouse
b2498c576f
Implement `flake8_fixme` and refactor `TodoDirective` ( #4681 )
2023-06-02 08:18:47 +02:00
Micha Reiser
c89d2f835e
Add to `AnyNode` and `AnyNodeRef` conversion methods to `AstNode` ( #4783 )
2023-06-02 08:10:41 +02:00
Charlie Marsh
211d8e170d
Ignore error calls with `exc_info` in TRY400 ( #4797 )
2023-06-02 04:59:45 +00:00
Charlie Marsh
b92be59ffe
Remove some matches on `Stmt` ( #4796 )
2023-06-02 04:36:36 +00:00
Charlie Marsh
b030c70dda
Move unused imports rule into its own module ( #4795 )
2023-06-02 04:27:23 +00:00
Charlie Marsh
10ba79489a
Exclude function definition from too-many-statements rule ( #4794 )
2023-06-02 04:04:25 +00:00
Charlie Marsh
ea3cbcc362
Avoid enforcing native-literals rule within nested f-strings ( #4488 )
2023-06-02 04:00:31 +00:00
Charlie Marsh
b8f45c93b4
Use a separate fix-isolation group for every parent node ( #4774 )
2023-06-02 03:07:55 +00:00
Charlie Marsh
621718784a
Replace deletion-tracking with enforced isolation levels ( #4766 )
2023-06-02 02:45:56 +00:00
qdegraaf
fcbf5c3fae
Add PYI034 for `flake8-pyi` plugin ( #4764 )
2023-06-02 02:15:57 +00:00
Justin Prieto
c68686b1de
[`flake8-pyi`] Implement PYI054 ( #4775 )
2023-06-02 01:21:27 +00:00
Justin Prieto
583411a29f
[`flake8-pyi`] Implement PYI053 ( #4770 )
2023-06-01 23:00:15 +00:00
qdegraaf
6d94aa89e3
[`flake8-pyi`] Implement `PYI025` ( #4791 )
2023-06-01 22:45:31 +00:00
Sladyn
8d5d34c6d1
Migrate flake8_pyi_rules from `unspecified` to `suggested` and `automatic` ( #4750 )
2023-06-01 22:35:47 +00:00
Jonathan Plasse
edadd7814f
Add `pyflakes.extend-generics` setting ( #4677 )
2023-06-01 22:19:37 +00:00
Charlie Marsh
3180f9978a
Avoid extra newline between diagnostics in grouped mode ( #4776 )
2023-06-01 21:33:29 +00:00
Tom Kuson
bdff4a66ac
Add Pylint rule `C0208` (`use-sequence-for-iteration`) as `PLC0208` (`iteration-over-set`) ( #4706 )
2023-06-01 21:26:23 +00:00
Charlie Marsh
ab26f2dc9d
Use saturating_sub in more token-walking methods ( #4773 )
2023-06-01 17:16:32 -04:00
Dhruv Manilawala
0099f9720f
Add autofix for `PLR1701` (repeated-isinstance-calls) ( #4792 )
2023-06-01 20:43:04 +00:00
Tom Kuson
d9fdcebfc1
Complete the Pyflakes documention ( #4787 )
2023-06-01 20:25:32 +00:00
Charlie Marsh
b7038cee13
Include ImportError in non-fixable try-catch imports ( #4793 )
2023-06-01 19:53:49 +00:00
Charlie Marsh
be740106e0
Remove some lexer usages from `Insertion` ( #4763 )
2023-06-01 19:45:43 +00:00
konstin
63d892f1e4
Implement basic module formatting ( #4784 )
...
* Add Format for Stmt
* Implement basic module formatting
This implements formatting each statement in a module with a hard line break in between, so that we can start formatting statements.
Basic testing is done by the snapshots
2023-06-01 15:25:50 +02:00
Micha Reiser
28aad95414
Remove collapsing `space` behaviour from `Printer` ( #4782 )
2023-06-01 13:38:42 +02:00
Micha Reiser
5f4bce6d2b
Implement `IntoFormat` for `&T` ( #4781 )
2023-06-01 12:20:49 +02:00
Micha Reiser
4ea4fd1984
Introduce `lines_before` helper ( #4780 )
2023-06-01 11:56:43 +02:00
konstin
d4027d8b65
Use new formatter infrastructure in CLI and test ( #4767 )
...
* Use dummy verbatim formatter for all nodes
* Use new formatter infrastructure in CLI and test
* Expose the new formatter in the CLI
* Merge import blocks
2023-06-01 11:55:04 +02:00
konstin
9bf168c0a4
Use dummy verbatim formatter for all nodes ( #4755 )
2023-06-01 08:25:26 +00:00
Micha Reiser
59148344be
Place comments of left and right binary expression operands ( #4751 )
2023-06-01 07:01:32 +00:00
konstin
0945803427
Generate FormatRule definitions ( #4724 )
...
* Generate FormatRule definitions
* Generate verbatim output
* pub(crate) everything
* clippy fix
* Update crates/ruff_python_formatter/src/lib.rs
Co-authored-by: Micha Reiser <micha@reiser.io>
* Update crates/ruff_python_formatter/src/lib.rs
Co-authored-by: Micha Reiser <micha@reiser.io>
* stub out with Ok(()) again
* Update crates/ruff_python_formatter/src/lib.rs
Co-authored-by: Micha Reiser <micha@reiser.io>
* PyFormatContext::{contents, locator} with `#[allow(unused)]`
* Can't leak private type
* remove commented code
* Fix ruff errors
* pub struct Format{node} due to rust rules
---------
Co-authored-by: Julian LaNeve <lanevejulian@gmail.com>
Co-authored-by: Micha Reiser <micha@reiser.io>
2023-06-01 08:38:53 +02:00
Micha Reiser
b7294b48e7
Handle positional-only-arguments separator comments ( #4748 )
2023-06-01 06:22:49 +00:00
Micha Reiser
be31d71849
Correctly associate own-line comments in bodies ( #4671 )
2023-06-01 08:12:53 +02:00
Charlie Marsh
46c3b3af94
Use `ALL` in `fixable` documentation ( #4772 )
2023-05-31 22:30:12 -04:00
Charlie Marsh
3d34d9298d
Remove erroneous method calls in flake8-unused-arguments docs ( #4771 )
2023-06-01 02:23:59 +00:00
Charlie Marsh
1156c65be1
Add autofix to move runtime-imports out of type-checking blocks ( #4743 )
2023-05-31 18:09:04 +00:00
Charlie Marsh
1a53996f53
Add autofix for flake8-type-checking ( #4742 )
2023-05-31 17:53:36 +00:00
Charlie Marsh
4bd395a850
Apply edits in sorted order ( #4762 )
2023-05-31 17:26:31 +00:00
Charlie Marsh
bb4f3dedf4
Enable start-of-block insertions ( #4741 )
2023-05-31 17:08:43 +00:00
Jonathan Plasse
01470d9045
Add E201, E202, E203 auto-fix ( #4723 )
2023-05-31 16:53:47 +00:00
Charlie Marsh
0b471197dc
Extract lower-level edit utility from autofix module ( #4737 )
2023-05-31 16:50:54 +00:00
Charlie Marsh
399eb84d5e
Add a `ruff_textwrap` crate ( #4731 )
2023-05-31 16:35:23 +00:00
qdegraaf
2b2812c4f2
Add PYI024 for `flake8-pyi` plugin ( #4756 )
2023-05-31 16:07:04 +00:00
Charlie Marsh
9d0ffd33ca
Move universal newline handling into its own crate ( #4729 )
2023-05-31 12:00:47 -04:00
Micha Reiser
e209b5fc5f
Add reformat check ( #4753 )
2023-05-31 17:36:15 +02:00
Alex Fikl
c1286d61df
Ignore __setattr__ in FBT003 ( #4752 )
2023-05-31 10:36:19 -04:00
Micha Reiser
6c1ff6a85f
Upgrade RustPython ( #4747 )
2023-05-31 08:26:35 +00:00
Micha Reiser
06bcb85f81
formatter: Remove CST and old formatting ( #4730 )
2023-05-31 08:27:23 +02:00
Charlie Marsh
d7a4999915
Flag empty strings in flake8-errmsg rules ( #4745 )
2023-05-31 04:37:43 +00:00
Charlie Marsh
d4e54cff05
Make organize imports an automatic edit ( #4744 )
2023-05-31 04:29:04 +00:00
Charlie Marsh
e1b6f6e57e
Refactor `flake8-type-checking` rules to take `Checker` ( #4739 )
2023-05-30 22:51:44 +00:00
Charlie Marsh
50053f60f3
Rename top-of-file to start-of-file ( #4735 )
2023-05-30 21:53:36 +00:00
Charlie Marsh
a4f73ea8c7
Remove unused `getrandom` dependency ( #4734 )
2023-05-30 14:34:20 -04:00
Charlie Marsh
f47a517e79
Enable callers to specify import-style preferences in `Importer` ( #4717 )
2023-05-30 16:46:19 +00:00
Charlie Marsh
ea31229be0
Track `TYPE_CHECKING` blocks in `Importer` ( #4593 )
2023-05-30 16:18:10 +00:00
Charlie Marsh
0854543328
Use a custom error type for symbol-import results ( #4688 )
2023-05-30 09:19:31 -04:00
Micha Reiser
0cd453bdf0
Generic "comment to node" association logic ( #4642 )
2023-05-30 09:28:01 +00:00
Micha Reiser
84a5584888
Add `Comments` data structure ( #4641 )
2023-05-30 08:54:55 +00:00
Micha Reiser
6146b75dd0
Add `MultiMap` implementation for storing comments ( #4639 )
2023-05-30 09:51:25 +02:00
Micha Reiser
236074fdde
testing_macros: Add missing `full` feature to `syn` dependency ( #4722 )
2023-05-30 07:42:06 +00:00
Charlie Marsh
e323bb015b
Move `fixable` checks into patch blocks ( #4721 )
2023-05-30 02:09:30 +00:00
Charlie Marsh
80fa3f2bfa
Add a convenience method to check if a name is bound ( #4718 )
2023-05-30 01:52:41 +00:00
Charlie Marsh
1846d90bbd
Rename the `flake8-future-annotations` rules ( #4716 )
2023-05-29 23:00:08 +00:00
Aarni Koskela
0106bce02f
[`flake8-future-annotations`] Implement `FA102` ( #4702 )
2023-05-29 22:41:45 +00:00
Charlie Marsh
2695d0561a
Add ability to generate snapshot tests on code snippets ( #4714 )
2023-05-29 18:36:12 -04:00
Charlie Marsh
5f715417e0
Remove redundant test descriptions from `#test_case` macros ( #4713 )
2023-05-29 18:23:56 -04:00
Charlie Marsh
6e096f216a
Fix docs formatting for `iter-method-returns-iterable` ( #4712 )
2023-05-29 21:34:42 +00:00
Justin Prieto
d0ad4be20e
[`flake8-pyi`] Implement `PYI045` ( #4700 )
2023-05-29 21:27:13 +00:00
Julian LaNeve
6425fe8c12
Update option anchors to include group name ( #4711 )
2023-05-29 17:26:10 -04:00
Julian LaNeve
68db74b3c5
Add AIR001: task variable name should be same as task_id arg ( #4687 )
2023-05-29 03:25:06 +00:00
Charlie Marsh
9646bc7d7f
Add docs to clarify project root heuristics ( #4697 )
2023-05-29 02:50:35 +00:00
Julian LaNeve
5756829344
markdownlint: enforce 100 char max length ( #4698 )
2023-05-28 22:45:56 -04:00
qdegraaf
0911ce4cbc
[`flake8-pyi`] Add `PYI032` rule with autofix ( #4695 )
2023-05-28 22:41:15 +00:00
Tom Kuson
51f04ee6ef
Add more Pyflakes docs ( #4689 )
2023-05-28 22:29:03 +00:00
Charlie Marsh
dbeadd99a8
Remove impossible states from version-comparison representation ( #4696 )
2023-05-28 22:08:40 +00:00
Dhruv Manilawala
79b35fc3cc
Handle dotted alias imports to check for implicit imports ( #4685 )
2023-05-27 23:58:03 -04:00
Jonathan Plasse
9f16ae354e
Fix UP036 auto-fix error ( #4679 )
2023-05-28 03:37:22 +00:00
Charlie Marsh
9741f788c7
Remove globals table from `Scope` ( #4686 )
2023-05-27 22:35:20 -04:00
Jonathan Plasse
901060fa96
Fix PLW3301 false positive single argument nested min/max ( #4683 )
2023-05-27 15:34:55 -04:00
Charlie Marsh
f069eb9e3d
Fix `async for` formatting ( #4675 )
2023-05-27 02:53:33 +00:00
Tom Kuson
fe72bde23c
Add Pylint string formatting rule docs ( #4638 )
2023-05-27 02:47:14 +00:00
Chris Chan
1268ddca92
Implement Pylint's `yield-inside-async-function` rule (`PLE1700`) ( #4668 )
2023-05-27 01:14:41 +00:00
Charlie Marsh
af433ac14d
Avoid using typing-imported symbols for runtime edits ( #4649 )
2023-05-26 20:36:37 -04:00
qdegraaf
ccca11839a
Allow more immutable funcs for RUF009 ( #4660 )
2023-05-26 15:18:52 -04:00
Micha Reiser
33a7ed058f
Create `PreorderVisitor` trait ( #4658 )
2023-05-26 06:14:08 +00:00
qdegraaf
52deeb36ee
Implement PYI048 for `flake8-pyi` plugin ( #4645 )
2023-05-25 20:04:14 +00:00
Charlie Marsh
0f610f2cf7
Remove dedicated ScopeKind structs in favor of AST nodes ( #4648 )
2023-05-25 19:31:02 +00:00