Commit Graph

8588 Commits

Author SHA1 Message Date
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
Evan Rittenhouse 741e180e2d
Change TODO directive detection to work with multiple pound signs on the same line (#4558) 2023-05-25 16:51:45 +02:00
konstin b6a382eeaf
Lint pyproject.toml (#4496)
This adds a new rule `InvalidPyprojectToml` that lints pyproject.toml by checking if https://github.com/PyO3/pyproject-toml-rs can parse it. This means the linting is currently very basic, e.g. we don't check whether the name is actually a valid python project name or appropriately normalized. It does catch errors e.g. with invalid dependency requirements or problems withs the license specifications. It is open to be extended in the future (validate name, SPDX expressions, classifiers, ...), either in ruff or in pyproject-toml-rs.

Test plan:

```
scripts/ecosystem_all_check.sh check --select RUF200
```
This lead to a bunch of 
```
RUF200 Failed to parse pyproject.toml: missing field `name`
```
(e.g. https://github.com/amitsk/fastapi-todos/blob/main/pyproject.toml) which is indeed invalid (https://packaging.python.org/en/latest/specifications/declaring-project-metadata/#specification).

Filtering those out, the following other problems were found by `cd target/ecosystem_all_results/ && rg RUF200`:
```
UCL-ARC:rred-reports.stdout.txt
1:pyproject.toml:27:16: RUF200 Failed to parse pyproject.toml: Version specifier `>='3.9'` doesn't match PEP 440 rules
EndlessTrax:python-start-project.stdout.txt
1:pyproject.toml:14:16: RUF200 Failed to parse pyproject.toml: Expected package name starting with an alphanumeric character, found '#'
redjax:gardening-api.stdout.txt
1:pyproject.toml:7:11: RUF200 Failed to parse pyproject.toml: Version `` doesn't match PEP 440 rules
ajslater:codex.stdout.txt
2:  3:17 RUF200 Failed to parse pyproject.toml: invalid type: sequence, expected a string
LDmitriy7:404_AvatarsBot.stdout.txt
1:pyproject.toml:3:11: RUF200 Failed to parse pyproject.toml: Version `` doesn't match PEP 440 rules
ajslater:comicbox.stdout.txt
1:pyproject.toml:3:17: RUF200 Failed to parse pyproject.toml: invalid type: sequence, expected a string
manueldevillena:forecast-earnings.stdout.txt
1:pyproject.toml:24:12: RUF200 Failed to parse pyproject.toml: Expected one of `@`, `(`, `<`, `=`, `>`, `~`, `!`, `;`, found `^`
redjax:ohio_utility_scraper.stdout.txt
1:pyproject.toml:11:11: RUF200 Failed to parse pyproject.toml: Version `` doesn't match PEP 440 rules
agronholm:typeguard.stdout.txt
1:pyproject.toml:40:8: RUF200 Failed to parse pyproject.toml: Expected a valid marker name, found 'python_implementation'
cyuss:decathlon-turnover.stdout.txt
1:pyproject.toml:7:12: RUF200 Failed to parse pyproject.toml: invalid type: string "Youcef", expected a table with 'name' and 'email' keys
ajslater:boilerplate.stdout.txt
1:pyproject.toml:3:17: RUF200 Failed to parse pyproject.toml: invalid type: sequence, expected a string
kaparoo:lightning-project-template.stdout.txt
1:pyproject.toml:56:16: RUF200 Failed to parse pyproject.toml: You can't mix a >= operator with a local version (`+cu117`)
dijital20:pytexas2023-decorators.stdout.txt
1:pyproject.toml:5:11: RUF200 Failed to parse pyproject.toml: Version `` doesn't match PEP 440 rules
pfouque:django-anymail-history.stdout.txt
1:pyproject.toml:137:12: RUF200 Failed to parse pyproject.toml: Version specifier `> = 1.2.0` doesn't match PEP 440 rules
pfouque:django-fakemessages.stdout.txt
1:pyproject.toml:130:12: RUF200 Failed to parse pyproject.toml: Version specifier `> = 1.2.0` doesn't match PEP 440 rules
pypa:build.stdout.txt
1:tests/packages/test-invalid-requirements/pyproject.toml:2:12: RUF200 Failed to parse pyproject.toml: Expected one of `@`, `(`, `<`, `=`, `>`, `~`, `!`, `;`, found `i`
4:tests/packages/test-no-requires/pyproject.toml:1:1: RUF200 Failed to parse pyproject.toml: missing field `requires`
UnoYakshi:FRAAND.stdout.txt
2:  3:11 RUF200 Failed to parse pyproject.toml: Version `` doesn't match PEP 440 rules
DHolmanCoding:python-template.stdout.txt
1:pyproject.toml:22:1: RUF200 Failed to parse pyproject.toml: missing field `requires`
```
Overall, this emitted errors in 43 out of 3408 projects (`rg -c RUF200 target/ecosystem_all_results/ | wc -l`)


Co-authored-by: Micha Reiser <micha@reiser.io>
2023-05-25 12:05:28 +00:00
qdegraaf 050350527c
Add autofix for PYI010 (#4634) 2023-05-24 22:17:44 +00:00
Charlie Marsh c9b39e31fc
Use class name as range for `B024` (#4647) 2023-05-24 22:16:13 +00:00
bersbersbers 28a5e607b4
Docs: mention `task-tags` option in two rules (#4644) 2023-05-24 16:31:41 -04:00
Micha Reiser 09c50c311c
Testing Macros: Add `extra-traits` feature (#4643) 2023-05-24 17:14:58 +00:00
Charlie Marsh f4572fe40b
Bump version to 0.0.270 (#4637) 2023-05-24 16:34:29 +00:00
Sladyn 8c9215489e
Migrate flake8_bugbear rules to `unspecified` to `suggested` (#4616) 2023-05-24 16:16:33 +00:00
qdegraaf dcd2bfaab7
Migrate flake8_pie autofix rules from `unspecified` to `suggested` and `automatic` (#4621) 2023-05-24 16:08:22 +00:00
Charlie Marsh f0e173d9fd
Use `BindingId` copies in lieu of `&BindingId` in semantic model methods (#4633) 2023-05-24 15:55:45 +00:00
Micha Reiser edc6c4058f
Move `shared_traits` to `ruff_formatter` (#4632) 2023-05-24 17:38:11 +02:00
Jonathan Plasse 4233f6ec91
Update to the new rule architecture (#4589) 2023-05-24 11:30:40 -04:00
Charlie Marsh fcdc7bdd33
Remove separate `ReferenceContext` enum (#4631) 2023-05-24 15:12:38 +00:00
Micha Reiser 86ced3516b
Introduce `SourceCodeSlice` to reduce the size of `FormatElement` (#4622)
Introduce `SourceCodeSlice` to reduce the size of `FormatElement`
2023-05-24 15:04:52 +00:00
Micha Reiser 6943beee66
Remove source position from `FormatElement::DynamicText` (#4619) 2023-05-24 16:36:14 +02:00
Micha Reiser 85f094f592
Improve `Message` sorting performance (#4624) 2023-05-24 16:34:48 +02:00
konstin 17d938f078
Add Checker::any_enabled shortcut (#4630)
Add Checker::any_enabled shortcut

 ## Summary

 Akin to #4625, This is a refactoring that shortens a bunch of code by replacing `checker.settings.rules.any_enabled` with `checker.any_enabled`.

 ## Test Plan

 `cargo clippy`
2023-05-24 14:32:55 +00:00
Charlie Marsh 5cedf0f724
Remove `ReferenceContext::Synthetic` (#4612) 2023-05-24 14:30:35 +00:00
Charlie Marsh 040fb9cef4
Use a separate `PrinterFlag` for including fix diffs (#4615) 2023-05-24 10:22:37 -04:00
Charlie Marsh 8961d8eb6f
Track all read references in semantic model (#4610) 2023-05-24 14:14:27 +00:00
Charlie Marsh 31bddef98f
Visit `TypeVar` and `NewType` name arguments (#4627) 2023-05-24 10:10:15 -04:00
konstin a59d252246
Add Checker::enabled shortcut (#4625)
This is a refactoring that shortens a bunch of code by replacing `checker.settings.rules.enabled` with `checker.enabled`
2023-05-24 14:56:41 +02:00
Jonathan Plasse c6a760e298
Introduce `tab-size` to correcly calculate the line length with tabulations (#4167) 2023-05-24 08:37:24 +02:00
konstin 3644695bf2
Include hidden ecosystem_ci option to show fixes without feature (#4528) 2023-05-23 22:22:23 -04:00
Sladyn 4e84e8a8e2
Migrate some rules from `Fix::unspecified` (#4587) 2023-05-23 22:10:58 -04:00
Hoël Bagard a256fdb9f4
Extend `RUF005` to recursive and literal-literal concatenations (#4557) 2023-05-24 01:26:34 +00:00
Tom Kuson 7479dfd815
Add Pyflakes docs (#4588) 2023-05-24 00:45:32 +00:00
Charlie Marsh ba4c0a21fa
Rename `ContextFlags` to `SemanticModelFlags` (#4611) 2023-05-23 17:47:07 -04:00
konstin 73e179ffab
Update maturin to 1.0 (#4605)
* Refactor and fix task trigger for dependent jobs in other repos

I have confirmed (https://github.com/konstin/ruff-pre-commit/actions/runs/5056928280/jobs/9075029868) that this does dispatch the workflow when running with act, `owner: 'konstin'`, `needs` commented out and personal access token. I can't properly test the actual release workflow, and i'm unsure how to best handle the next release after this was merged (should we do a beta release or will this break everything that assumes we only do stable releases?)

The command for act is
```
act -j update-dependents -s RUFF_PRE_COMMIT_PAT=<...>
```

* delete old file

* Update maturin to 1.0

A 1.0 release for maturin 🎉
2023-05-23 20:55:52 +02:00
Micha Reiser 2681c0e633
Add missing nodes to `AnyNodeRef` and `AnyNode` (#4608) 2023-05-23 18:30:27 +02:00
Charlie Marsh f3bdd2e7be
Make B007 fix relevance stricter (#4607) 2023-05-23 15:43:59 +00:00
Micha Reiser 652c644c2a
Introduce `ruff_index` crate (#4597) 2023-05-23 17:40:35 +02:00
Micha Reiser 154439728a
Add `AnyNode` and `AnyNodeRef` unions (#4578) 2023-05-23 08:53:22 +02:00
Jonathan Plasse 1ddc577204
Rework CST matchers (#4536)
Co-authored-by: Micha Reiser <micha@reiser.io>
2023-05-23 06:26:51 +00:00
Charlie Marsh 74effb40b9
Rename `index` to `binding_id` in a few iterators (#4594) 2023-05-23 03:56:00 +00:00
Charlie Marsh 6c3724ab98
Move `get_or_import_symbol` onto `Importer` (#4591) 2023-05-23 01:33:00 +00:00
Christopher Covington 3b8121379d
Name ambiguous characters (#4448) 2023-05-22 17:16:57 +00:00
qdegraaf 5ba47c3302
Add autofix for PYI009 (#4583) 2023-05-22 16:41:18 +00:00
Charlie Marsh b613460fe5
Fix `# isort: split` comment detection in nested blocks (#4584) 2023-05-22 12:31:59 -04:00
Micha Reiser daadd24bde
Include decorators in `Function` and `Class` definition ranges (#4467) 2023-05-22 17:50:42 +02:00
Charlie Marsh 9308e939f4
Avoid infinite loop for required imports with isort: off (#4581) 2023-05-22 15:49:03 +00:00
Charlie Marsh 04c9348de0
Make ambiguous-unicode detection sensitive to 'word' context (#4552) 2023-05-22 14:42:25 +00:00
Tom Kuson 2d3766d928
Add flake8-boolean-trap docs (#4572) 2023-05-22 14:11:14 +00:00
Micha Reiser cbe344f4d5
Rename `Checker::model` to `semantic_model` (#4573) 2023-05-22 15:14:30 +02:00
Evan Rittenhouse c6e5fed658
Replace token iteration with Indexer/Locator lookups for relevant rules (#4513) 2023-05-22 09:56:19 +02:00
Charlie Marsh f73b398776
Reduce visibility of more functions, structs, and fields (#4570) 2023-05-22 03:36:48 +00:00
Charlie Marsh 55c4020ba9
Remove regex for noqa code splitting (#4569) 2023-05-21 23:20:49 -04:00
Charlie Marsh d70f899f71
Use `SemanticModel` in lieu of `Checker` in more methods (#4568) 2023-05-22 02:58:47 +00:00
Charlie Marsh 19c4b7bee6
Rename ruff_python_semantic's `Context` struct to `SemanticModel` (#4565) 2023-05-22 02:35:03 +00:00
Jonathan Plasse 3238743a7b
Fix Flake8Todo typo (#4566) 2023-05-21 16:32:13 -04:00
Charlie Marsh f22c269ccf
Point LSP, VS Code, and pre-commut URLs to Astral org (#4562) 2023-05-21 15:27:35 -04:00
Arne de Laat 8ca3977602
Fix false-positive for TRY302 if exception cause is given (#4559) 2023-05-21 11:49:53 -04:00
Jonathan Plasse fc63c6f2e2
Fix PLE01310 typo (#4550) 2023-05-20 19:34:03 +00:00
Jonathan Plasse f7f5bc9085
Fix SIM401 snapshot (#4547) 2023-05-20 14:18:19 -04:00
Charlie Marsh 6b85430a14
Ignore `#region` code folding marks in eradicate rules (#4546) 2023-05-20 16:45:49 +00:00
Jonathan Plasse a68c865010
Fix SIM110 and SIM111 ranges (#4545) 2023-05-20 12:40:35 -04:00
Charlie Marsh fe7f2e2e4d
Move submodule alias resolution into `Context` (#4543) 2023-05-20 16:34:10 +00:00
Charlie Marsh bf5b463c0d
Include empty success test in JUnit output (#4537) 2023-05-20 03:38:51 +00:00
Charlie Marsh 6aa9900c03
Improve handling of `__qualname__`, `__module__`, and `__class__` (#4512) 2023-05-20 03:03:45 +00:00
Charlie Marsh 9e21414294
Improve reference resolution for deferred-annotations-within-classes (#4509) 2023-05-20 02:54:18 +00:00
Charlie Marsh bb4e674415
Move reference-resolution into Context (#4510) 2023-05-20 02:47:15 +00:00
Charlie Marsh b42ff08612
Parenthesize more sub-expressions in f-string conversion (#4535) 2023-05-19 19:41:30 +00:00
Jonathan Plasse 03fb62c174
Fix RUF010 auto-fix with parenthesis (#4524) 2023-05-19 19:05:51 +00:00
Jonathan Plasse 2dfc645ea9
Fix UP032 auto-fix with integers (#4525) 2023-05-19 18:53:50 +00:00
Hoël Bagard fe8e2bb237
[`pylint`] Add `named_expr_without_context` (`W0131`) (#4531) 2023-05-19 18:00:01 +00:00
Tom Kuson a9ed8d5391
Add Pylint docs (#4530) 2023-05-19 17:40:18 +00:00
Aaron Cunningham 41a681531d
Support new `extend-per-file-ignores` setting (#4265) 2023-05-19 12:24:04 -04:00
Justin Prieto 837e70677b
[`flake8-pyi`] Implement `PYI013` (#4517) 2023-05-19 15:39:55 +00:00
Hoël Bagard 7ebe372122
[`pylint`] Add `duplicate-value` (`W0130`) (#4515) 2023-05-19 15:03:47 +00:00
konstin 32f1edc555
Create dummy format CLI (#4453)
* Create dummy format CLI

* Hide format from clap, too

Missed that this is a separate option from `#[doc(hidden)]`

* Remove cargo feature and replace with warning

* No-alloc files parameter matching

* beta warning: warn -> warn_user_once

* Rephrase warning
2023-05-19 11:45:52 +02:00
Micha Reiser 2f35099f81
Remove `regex` dependency from `ruff_python_ast` (#4518) 2023-05-19 06:44:18 +00:00
Ville Skyttä fdb241cad2
[`flake8-bandit`] Implement `paramiko-call` (`S601`) (#4500) 2023-05-19 03:40:50 +00:00
Charlie Marsh ab303f4e09
Gate `schemars` skip under feature flag (#4514) 2023-05-19 03:01:31 +00:00
Charlie Marsh 15cb21a6f4
Implement `--extend-fixable` option (#4297) 2023-05-18 22:20:19 -04:00
Ville Skyttä 2e2ba2cb16
Avoid some false positives in dunder variable assigments (#4508) 2023-05-19 02:11:20 +00:00
Charlie Marsh d4c0a41b00
Bump version to 0.0.269 (#4506) 2023-05-18 19:45:20 +00:00
Charlie Marsh 8702b5a40a
Bump version to 0.0.268 (#4501) 2023-05-18 15:35:46 -04:00
konstin a3aa841fc9
Overhaul sdist handling (#4439)
* Reduce sdist size

`maturin sdist && du -sh target/wheels/ruff-0.0.267.tar.gz`:
Before: 1,1M
After: 668K

* Test sdist before release

* Update maturin to fix the sdist
2023-05-18 19:02:22 +02:00
Ville Skyttä fdd894145b
S608 improvements (#4499) 2023-05-18 11:27:22 -04:00
Charlie Marsh 85f67b2ee3
Make the AST Checker `pub(crate)` (#4498) 2023-05-18 15:17:26 +00:00
Charlie Marsh e9c6f16c56
Move unparse utility methods onto Generator (#4497) 2023-05-18 15:00:46 +00:00
Charlie Marsh d3b18345c5
Move triple-quoted string detection into `Indexer` method (#4495) 2023-05-18 14:42:05 +00:00
Jonathan Plasse 0e4d174551
Fix COM812 false positive in string subscript (#4493) 2023-05-18 14:35:41 +00:00
Charlie Marsh 73efbeb581
Invert quote-style when generating code within f-strings (#4487) 2023-05-18 14:33:33 +00:00
Charlie Marsh 2fb312bb2b
Fix scoping of comprehensions within classes (#4494) 2023-05-18 14:30:02 +00:00
Charlie Marsh e8e66f3824
Remove unnecessary path prefixes (#4492) 2023-05-18 10:19:09 -04:00
Charlie Marsh a8d080c825
Extend multi-line noqa directives to start-of-line (#4490) 2023-05-18 13:05:27 +00:00
Charlie Marsh ddd541b198
Move `Insertion` into its own module (#4478) 2023-05-17 21:11:41 +00:00
Tom Kuson 3090aec97d
Add PLW docs (#4469) 2023-05-17 18:30:45 +00:00
Charlie Marsh 14c6419bc1
Bring pycodestyle rules into full compatibility (on SciPy) (#4472) 2023-05-17 16:51:55 +00:00
Charlie Marsh 3bc29d6c0c
Allow shebang comments at start-of-file (#4473) 2023-05-17 16:32:12 +00:00
Charlie Marsh 67c5086aba
Include precise tokens for extraneous-whitespace diagnostics (#4471) 2023-05-17 16:25:17 +00:00
Charlie Marsh cd82b83f89
Avoid triggering `pd#at` and friends on non-subscripts (#4474) 2023-05-17 16:20:58 +00:00
Charlie Marsh 39fb2cc732
Remove special-casing for whitespace-around-@ (#4458) 2023-05-17 15:32:08 +00:00
John Kelly 9c732c7946
Implement TRY302 - `raise` after `except` (#4461) 2023-05-17 01:36:10 +00:00
Charlie Marsh 2332ea5753
Remove type-complexity ignores from `map_codes.rs` (#4463) 2023-05-17 01:02:24 +00:00
Charlie Marsh 6b1062ccc3
Enable `pycodestyle` rules under new "nursery" category (#4407) 2023-05-16 21:21:58 +00:00
Charlie Marsh 39fa38cb35
Enable `pycodestyle` rules (#3689) 2023-05-16 20:39:43 +00:00
Micha Reiser ddf7de7e86
Prototype Black's string joining/splitting (#4449) 2023-05-16 18:42:40 +01:00
Charlie Marsh e5101e8eac
Split logical lines tests into one test per assertion (#4457) 2023-05-16 17:40:39 +00:00
Charlie Marsh d9c3f8e249
Avoid flagging missing whitespace for decorators (#4454) 2023-05-16 13:15:01 -04:00
Charlie Marsh 7e0d018b35
Avoid emitting empty logical lines (#4452) 2023-05-16 16:33:33 +00:00
Jeong, YunWon 4b05ca1198
Specialize ConversionFlag (#4450) 2023-05-16 18:00:13 +02:00
Charlie Marsh f0465bf106
Emit non-logical newlines for "empty" lines (#4444) 2023-05-16 14:58:56 +00:00
Charlie Marsh 8134ec25f0
Fix expected-indentation errors with end-of-line comments (#4438) 2023-05-16 10:45:54 -04:00
Jeong, YunWon badade3ccc
Impl `Default` for `SourceLocation` (#4328)
Co-authored-by: Micha Reiser <micha@reiser.io>
2023-05-16 07:03:43 +00:00
Micha Reiser fa26860296
Refactor range from `Attributed` to `Node`s (#4422) 2023-05-16 06:36:32 +00:00
Sladyn c711db11ce
[`flake8-pyi`] Implement `unannotated-assignment-in-stub` (`PY052`) (#4293) 2023-05-16 02:06:55 +00:00
Charlie Marsh 1fe6954150
Fix bidirectional-unicode formatting (#4445) 2023-05-15 22:36:25 +00:00
Charlie Marsh 2414469ac3
Enable automatic rewrites of `typing.Deque` and `typing.DefaultDict` (#4420) 2023-05-15 22:33:24 +00:00
Tom Kuson 838ba1ca3d
Add `PLE` rule docs (#4437) 2023-05-15 19:48:18 +00:00
qdegraaf 8ba9eb83af
Implement `flake8-async` plugin (#4432) 2023-05-15 09:15:28 -04:00
Zanie Adkins 2c6efc2f5f
Update C419 to be a suggested fix (#4424) 2023-05-15 10:30:40 +02:00
Ben Doerry d6930ca991
Merge subsettings when extending configurations (#4431) 2023-05-15 02:34:58 +00:00
Charlie Marsh dcff515ad8
Make `extend_function_names` an `Option` type (#4434) 2023-05-15 02:15:02 +00:00
Jonathan Plasse b9e387013f
Fix `RUF010` autofix within f-strings (#4423) 2023-05-15 02:08:30 +00:00
Charlie Marsh a69451ff46
[`pyupgrade`] Remove `keep-runtime-typing` setting (#4427) 2023-05-14 03:12:52 +00:00
Tyler Yep 01b372a75c
Implement `flake8-future-annotations` FA100 (#3979) 2023-05-14 03:00:06 +00:00
Charlie Marsh cd2e7fa72a
Use `TextSize` for flake8-todos `Directive` methods (#4426) 2023-05-13 22:05:51 -04:00
Charlie Marsh fdf0b999cd
Replace TODO tag regex with a lexer (#4413) 2023-05-13 15:23:46 +00:00
Jonathan Plasse 45b5fa573f
Ignore ANN401 for overridden methods (#4409) 2023-05-13 15:20:04 +00:00
Jonathan Plasse a0258f2205
[`pylint`] Fix `PLW3301` auto-fix with generators (#4412) 2023-05-13 11:17:13 -04:00
alm 0a68636de3
[`pylint`] Add `duplicate-bases` rule (#4411) 2023-05-13 14:28:03 +00:00
Evan Rittenhouse 2f53781a77
Implement `flake8_todos` (#3921) 2023-05-13 14:19:06 +00:00
Micha Reiser f5afa8198c
Use new `rustpython_format` crate over `rustpython-common` (#4388) 2023-05-13 12:35:02 +00:00
Charlie Marsh eeabfd6d18
Enable autofix for split-assertions at top level (#4405) 2023-05-12 17:35:49 -04:00
Charlie Marsh 490301f9fe
Replace `macro_rules!` visitors with dedicated methods (#4402) 2023-05-12 17:05:59 -04:00
Charlie Marsh dcedd5cd9d
Bump version to 0.0.267 (#4400) 2023-05-12 19:04:56 +00:00
Lotem 52f6663089
Implement `RUF010` to detect explicit type conversions within f-strings (#4387) 2023-05-12 18:12:58 +00:00
Charlie Marsh 67076b2dcb
Bump version to 0.0.266 (#4391) 2023-05-12 13:11:03 -04:00
Charlie Marsh 7e3ba7f32a
Use `bitflags` for tracking `Context` flags (#4381) 2023-05-12 16:07:26 +00:00
konstin 09dbd2029c
Update maturin to maturin 0.15 (#3999)
* Update maturin to maturin>=0.14.17

This allows removing the deprecated `[package.metadata.maturin]`

* Update to maturin 0.15
2023-05-12 15:43:06 +02:00
Jonathan Plasse 1380bd94da
Expose more fields in rule explanation (#4367) 2023-05-11 19:22:23 -04:00
Jonathan Plasse c10a4535b9
Disallow `unreachable_pub` (#4314) 2023-05-11 18:00:00 -04:00
Charlie Marsh 97802e7466
Ignore some methods on list in `flake8-boolean-trap` (#4385) 2023-05-11 21:54:59 +00:00
Jonathan Plasse 4fd4a65718
Isolate show statistic integration test (#4383) 2023-05-11 21:42:34 +00:00
Charlie Marsh d78c614764
Remove special-casing for `flake8-builtins` rules (#4380) 2023-05-11 16:39:28 -04:00
Charlie Marsh 3f3dd7af99
Move some recursion out of the pre-visit statement phase (#4379) 2023-05-11 15:46:25 -04:00
Charlie Marsh 871b92a385
Avoid re-using imports beyond current edit site (#4378) 2023-05-11 14:47:18 -04:00
Charlie Marsh 9158f13ee6
Respect `__all__` imports when determining definition visibility (#4357) 2023-05-11 17:43:51 +00:00
Charlie Marsh 72e0ffc1ac
Delay computation of `Definition` visibility (#4339) 2023-05-11 17:14:29 +00:00
Charlie Marsh ffcf0618c7
Avoid underflow in expected-special-method-signature (#4377) 2023-05-11 12:47:47 -04:00
Micha Reiser 1ccef5150d
Remove lifetime from FormatContext (#4376) 2023-05-11 15:43:42 +00:00
konstin 3c2f41b615
Also show rule codes in autofix errors in production codes (#4327)
I needed those changes for #4326
2023-05-11 17:36:03 +02:00
Jeong, YunWon bbadbb5de5
Refactor code to use the new RustPython `is` method (#4369) 2023-05-11 16:16:36 +02:00
Jeong, YunWon be6e00ef6e
Re-integrate RustPython parser repository (#4359)
Co-authored-by: Micha Reiser <micha@reiser.io>
2023-05-11 07:47:17 +00:00
Charlie Marsh 865205d992
Implement pygrep-hook's Mock-mistake diagnostic (#4366) 2023-05-11 03:26:29 +00:00
Charlie Marsh 572adf7994
Use target name in hardcoded-password diagnostics (#4365) 2023-05-11 02:54:27 +00:00
Charlie Marsh 3b26bf84f5
Avoid debug panic with empty indent replacement (#4364) 2023-05-11 02:42:18 +00:00
Charlie Marsh f4f88308ae
Remove `Copy` and destructure `Snapshot` (#4358) 2023-05-10 19:46:18 +00:00
Charlie Marsh ea3d3a655d
Add a `Snapshot` abstraction for deferring and restoring visitor context (#4353) 2023-05-10 16:50:47 +00:00
Charlie Marsh fd34797d0f
Add a specialized `StatementVisitor` (#4349) 2023-05-10 12:42:20 -04:00
Charlie Marsh 257c571c43
Remove pub from some `Checker` fields (#4352) 2023-05-10 12:33:47 -04:00
Charlie Marsh ccdee55e6e
Tweak capitalization of B021 message (#4350) 2023-05-10 15:59:00 +00:00
Charlie Marsh 6d6d7abf70
Use short-import for `HashMap` (#4351) 2023-05-10 15:46:55 +00:00
konstin 0096938789
Optionally show fixes when using `--features ecosystem_ci` with cargo and `--show-fixes` at runtime (#4191)
* Generate fixes when using --show-fixes

Example command: `cargo run --bin ruff -- --no-cache --select F401
--show-source --show-fixes
crates/ruff/resources/test/fixtures/pyflakes/F401_9.py`

Before, `--show-fixes` was ignored:

```
crates/ruff/resources/test/fixtures/pyflakes/F401_9.py:4:22: F401 [*] `foo.baz` imported but unused
  |
4 | __all__ = ("bar",)
5 | from foo import bar, baz
  |                      ^^^ F401
  |
  = help: Remove unused import: `foo.baz`

Found 1 error.
[*] 1 potentially fixable with the --fix option.
```

After:

```
crates/ruff/resources/test/fixtures/pyflakes/F401_9.py:4:22: F401 [*] `foo.baz` imported but unused
  |
4 | __all__ = ("bar",)
5 | from foo import bar, baz
  |                      ^^^ F401
  |
  = help: Remove unused import: `foo.baz`

ℹ Suggested fix
1 1 | """Test: late-binding of `__all__`."""
2 2 |
3 3 | __all__ = ("bar",)
4   |-from foo import bar, baz
  4 |+from foo import bar

Found 1 error.
[*] 1 potentially fixable with the --fix option.
```

* Add `--format ecosystem-ci`

* cargo dev generate-all

* Put behind cargo feature

* Regenerate docs

* Don't test ecosystem_ci feature on CI

* Use top level flag instead

* Fix

* Simplify code based on #4191

* Remove old TODO comment
2023-05-10 17:45:57 +02:00
Micha Reiser 853d8354cb
JSON Emitter: Use one indexed column numbers for edits (#4007)
I noticed in the byte-offsets refactor that the `JsonEmitter` uses one indexed column numbers for the diagnostic start and end locations but not for `edits`.

This PR changes the `JsonEmitter` to emit one-indexed column numbers for edits, as we already do for `Message::location` and `Message::end_location`.

## Open questions

~We'll need to change the LSP to subtract 1 from the columns in `_parse_fix`~

6e44fadf8a/ruff_lsp/server.py (L129-L150)

~@charliermarsh is there a way to get the ruff version in that method? If not, then I recommend adding a `version` that we increment whenever we make incompatible changes to the serialized message. We can then use it in the LSP to correctly compute the column offset.~

I'll use the presence of the `Fix::applicability` field to detect if the Ruff version uses one or zero-based column indices.

See https://github.com/charliermarsh/ruff-lsp/pull/103
2023-05-10 17:21:02 +02:00
Charlie Marsh 5f64d2346f
Enforce max-doc-length for multi-line docstrings (#4347) 2023-05-10 11:06:07 -04:00
Micha Reiser ddbe5a1243
Add `Fix::applicability` to JSON output (#4341) 2023-05-10 14:34:53 +00:00
Evan Rittenhouse 04097d194c
Fix false positives in PD002 (#4337) 2023-05-10 16:04:28 +02:00
Micha Reiser a2b8487ae3
Remove functor from autofix title (#4245) 2023-05-10 07:21:15 +00:00
Micha Reiser 8969ad5879
Always generate fixes (#4239) 2023-05-10 07:06:14 +00:00
Micha Reiser bfa1c28c00
Use non-empty ranges for logical-lines diagnostics (#4133) 2023-05-10 06:44:33 +00:00
Zanie Adkins cf7aa26aa4
Add `Applicability` to `Fix` (#4303)
Co-authored-by: Micha Reiser <micha@reiser.io>
2023-05-10 08:42:46 +02:00
Micha Reiser d66ce76691
Truncate `SyntaxError`s before newline character (#4124) 2023-05-10 08:37:57 +02:00
Tom Kuson b8bb9e8b92
Add docs for `flake8-simplify` rules (#4334) 2023-05-10 03:03:24 +00:00
Charlie Marsh 5e46dcbf21
Handle `.encode` calls on parenthesized expressions (#4338) 2023-05-09 22:57:10 -04:00
trag1c 045449ab12
Improved E713 & E714 code examples (#4336) 2023-05-09 22:27:44 -04:00
Tom Kuson d5ff8d7c43
Add `flake8-pie` documentation (#4332) 2023-05-09 22:11:30 +00:00
Charlie Marsh d92fb11e80
Include positional- and keyword-only arguments in too-many-arguments (#4329) 2023-05-09 18:05:53 -04:00
Charlie Marsh 3d947196f8
Make violation struct fields private (#4331) 2023-05-09 18:00:20 -04:00
Charlie Marsh e846f2688b
Avoid SIM105 autofixes that would remove comments (#4330) 2023-05-09 21:30:56 +00:00
Charlie Marsh 7b91a162c6
Remove `current_` prefix from some Context methods (#4325) 2023-05-09 19:40:12 +00:00
Charlie Marsh 8c2cfade90
Move `show_source` onto CLI settings group (#4317) 2023-05-09 17:26:25 +00:00
Charlie Marsh a435c0df4b
Remove deprecated `update-check` setting (#4313) 2023-05-09 13:10:02 -04:00
Aaron Cunningham 48e1852893
Revert the B027 autofix logic (#4310) 2023-05-09 13:08:20 -04:00
Calum Young 03f141f53d
Check that all rules have descriptions (#4315) 2023-05-09 16:53:23 +00:00
Charlie Marsh d3b71f1e04
Run autofix on initial watcher pass (#4311) 2023-05-09 12:35:32 -04:00
Mikko Leppänen 04e8e74499
Feat: detect changes also in configuration files (#4169) 2023-05-09 16:22:52 +00:00
konstin 318653c427
Write diagnostic name when failing to create fix (#4309) 2023-05-09 17:46:40 +02:00
Micha Reiser 99a755f936
Add `schemars` feature (#4305) 2023-05-09 16:15:18 +02:00
Aurelio Jargas e7dfb35778
UP011: Fix typo in rule description (#4306) 2023-05-09 08:49:15 -04:00
Dhruv Manilawala 085fd37209
Preserve whitespace around `ListComp` brackets in `C419` (#4099) 2023-05-09 08:43:05 +02:00
Charlie Marsh 83536cf87b
Ignore `TRY301` exceptions without except handlers (#4301) 2023-05-09 03:38:02 +00:00
Charlie Marsh 9366eb919d
Specify exact command in incorrect parentheses suggestion (#4300) 2023-05-09 02:21:54 +00:00
Charlie Marsh 8be51942dd
Use `ruff_python_semantic` abstract utility in flake8-pytest-style (#4299) 2023-05-08 22:12:28 -04:00
Charlie Marsh d365dab904
Include static and class methods in in abstract decorator list (#4298) 2023-05-08 21:54:02 -04:00
Charlie Marsh f23851130a
Add `flynt` to documentation (#4295) 2023-05-09 00:52:41 +00:00
Aarni Koskela efdf383f5e
Implement Flynt static string join transform as FLY002 (#4196) 2023-05-08 20:46:38 -04:00
Charlie Marsh 61f21a6513
Rewrite `not not a` as `bool(a)` in boolean contexts (#4294) 2023-05-08 23:38:24 +00:00
Charlie Marsh c54e48dce5
Avoid panics for f-string rewrites at start-of-file (#4291) 2023-05-08 19:44:57 +00:00
Charlie Marsh b913e99bde
Explicitly support ASCII-only for capitalization checks (#4290) 2023-05-08 15:41:11 -04:00
Dhruv Manilawala 4ac506526b
Avoid `D403` if first char cannot be uppercased (#4283) 2023-05-08 15:33:24 -04:00
Calum Young cd41de2588
Check docs formatting check (#4270) 2023-05-08 19:03:22 +00:00
Dhruv Manilawala 3344d367f5
Avoid fixing `PD002` in a lambda expression (#4286) 2023-05-08 18:24:27 +00:00
Aarni Koskela d7a369e7dc
Update confusable character mapping (#4274) 2023-05-08 14:20:44 -04:00
Jonathan Plasse 1b1788c8ad
Fix replace_whitespace() tabulation to space (#4226)
Co-authored-by: Micha Reiser <micha@reiser.io>
2023-05-08 12:03:04 +00:00
Micha Reiser 4d5a339d9e
Remove `Fix::from(Edit)` and add deprecated replacement methods to `Diagnostic`s (#4275) 2023-05-08 10:25:50 +00:00
Zanie Adkins 0801f14046
Refactor `Fix` and `Edit` API (#4198) 2023-05-08 11:57:03 +02:00
Trevor McCulloch 3beff29026
[`pylint`] Implement `nested-min-max` (`W3301`) (#4200) 2023-05-07 03:14:14 +00:00
Jerome Leclanche 5ac2c7d293
Add .git-rewrite folder to default ignored folder paths (#4261) 2023-05-06 22:40:38 -04:00
Charlie Marsh e66fdb83d0
Respect insertion location when importing symbols (#4258) 2023-05-07 02:32:40 +00:00
Charlie Marsh a95bafefb0
Fix `RET504` example in docs (#4260) 2023-05-06 16:56:52 -04:00
Charlie Marsh 539af34f58
Add a utility method to detect top-level state (#4259) 2023-05-06 20:24:27 +00:00
Charlie Marsh 983bb31577
Remove `RefEquality` usages from `Context` (#4257) 2023-05-06 15:55:14 -04:00
Charlie Marsh b98b604071
Remove some deferred `&Stmt` references (#4256) 2023-05-06 18:42:35 +00:00
Charlie Marsh cd27b39aff
Re-order some code in scope.rs (#4255) 2023-05-06 16:36:20 +00:00
Charlie Marsh a9fc648faf
Use `NodeId` for `Binding` source (#4234) 2023-05-06 16:20:08 +00:00
Charlie Marsh c1f0661225
Replace `parents` statement stack with a `Nodes` abstraction (#4233) 2023-05-06 16:12:41 +00:00
Dhruv Manilawala 2c91412321
Consider Flask app logger as logger candidate (#4253) 2023-05-06 11:31:10 -04:00
Charlie Marsh 11e1380df4
Bump version to 0.0.265 (#4248) 2023-05-05 13:16:05 -04:00
Micha Reiser e93f378635
Refactor whitespace around operator (#4223) 2023-05-05 09:37:56 +02:00
Micha Reiser 2124feb0e7
Fail lint tests if the fix creates a syntax error (#4202) 2023-05-05 07:59:33 +02:00
Charlie Marsh c0e7269b07
Update doc defaults for `section-order` (#4232) 2023-05-04 21:35:27 +00:00
Chris Chan c2921e957b
[`pylint`] Implement import-self (`W0406`) (#4154) 2023-05-04 16:05:15 -04:00
Charlie Marsh 93cfce674a
Ignore __debuggerskip__ in unused variable checks (#4229) 2023-05-04 15:45:49 -04:00
Charlie Marsh b71cc3789f
Change `--fix-only` exit semantics to mirror `--fix` (#4146) 2023-05-04 19:03:15 +00:00
Zanie Adkins 717128112d
Fix panic in pydocstyle D214 when docstring indentation is empty (#4216) 2023-05-04 14:42:34 -04:00
Arya Kumar e9e194ab32
[`flake8-pyi`] Implement `PYI042` and `PYI043` (#4214) 2023-05-04 14:35:26 -04:00
Calum Young 890e630c41
Allow linking to individual rules (#4158) 2023-05-04 13:43:53 -04:00
Aaron Cunningham d78287540d
Update B027 to support autofixing (#4178) 2023-05-04 16:36:32 +00:00
Charlie Marsh 494e807315
Add space when joining rule codes for debug messages (#4225) 2023-05-04 15:34:34 +00:00
Tom Kuson 6db1a32eb9
Add docs for PLC rules (#4224) 2023-05-04 10:56:00 -04:00
Dhruv Manilawala bb2cbf1f25
End of statement insertion should occur after newline (#4215) 2023-05-04 16:17:41 +02:00
konstin badfdab61a
Show rule codes on autofix failure (#4220) 2023-05-04 15:25:07 +02:00
Dhruv Manilawala 59d40f9f81
Show settings path in `--show-settings` output (#4199) 2023-05-04 08:22:31 +02:00
Arya Kumar 37aae666c7
[flake8-pyi] PYI020 (#4211) 2023-05-03 22:37:32 -04:00
Leiser Fernández Gallo 460023a959
Fix era panic caused by out of bound edition (#4206) 2023-05-03 15:48:43 +02:00
Aarni Koskela d0e3ca29d9
Print out autofix-broken or non-converging code when debugging (#4201) 2023-05-03 13:50:03 +02:00
Micha Reiser b14358fbfe
Render tabs as 4 spaces in diagnostics (#4132) 2023-05-02 13:14:02 +00:00
wookie184 ac600bb3da
Warn on PEP 604 syntax not in an annotation, but don't autofix (#4170) 2023-05-01 23:49:20 -07:00
Charlie Marsh 8cb76f85eb
Bump version to 0.0.264 (#4179) 2023-05-01 23:33:38 -07:00
Charlie Marsh 56c45013c2
Allow boolean parameters for `pytest.param` (#4176) 2023-05-02 01:07:50 +00:00
Calum Young a4ce746892
Reference related settings in rules (#4157) 2023-05-02 00:59:00 +00:00
Calum Young 2d6d51f3a1
Add `flake8-return` docs (#4164) 2023-05-02 00:53:46 +00:00
Jonathan Plasse 814731364a
Fix UP032 auto-fix (#4165) 2023-04-30 16:57:41 -04:00
Jonathan Plasse 8c97e7922b
Fix F811 false positive with match (#4161) 2023-04-30 14:39:45 -04:00
Charlie Marsh 64b7280eb8
Respect parent-scoping rules for `NamedExpr` assignments (#4145) 2023-04-29 22:45:30 +00:00
Evan Rittenhouse 8d64747d34
Remove `pyright` comment prefix from PYI033 checks (#4152) 2023-04-29 18:41:04 -04:00
Charlie Marsh 2115d99c43
Remove `ScopeStack` in favor of child-parent `ScopeId` pointers (#4138) 2023-04-29 18:23:51 -04:00
Calum Young 39ed75f643
Document `flake8-unused-arguments` (#4147) 2023-04-29 19:17:50 +00:00
Calum Young 8f61eae1e7
Add remaining `pep8-naming` docs (#4149) 2023-04-29 15:13:10 -04:00
Calum Young f0f4bf2929
Move typos to pre-commit config (#4148) 2023-04-29 12:13:35 -04:00
Calum Young 03144b2fad
Document `flake8-commas` (#4142) 2023-04-29 03:24:15 +00:00
Calum Young 0172cc51a7
Document `flake8-print` (#4144) 2023-04-29 03:19:00 +00:00
Calum Young 12d64a223b
Document RUF100 (#4141) 2023-04-28 22:14:15 +00:00
Charlie Marsh 432ea6f2e2
Tweak rule documentation for `B008` (#4137) 2023-04-28 01:29:03 +00:00
Evan Rittenhouse b34804ceb5
Make D410/D411 autofixes mutually exclusive (#4110) 2023-04-28 01:24:35 +00:00
Moritz Sauter ee6d8f7467
Add bugbear immutable functions as allowed in dataclasses (#4122) 2023-04-27 21:23:06 -04:00
Dhruv Manilawala 089b64e9c1
Autofix `EM101`, `EM102`, `EM103` if possible (#4123) 2023-04-27 18:53:27 +00:00
Tom Kuson 3e81403fbe
Add pygrep-hooks documentation (#4131) 2023-04-27 18:33:07 +00:00
Charlie Marsh 3c9f5e2fdc
Preserve star-handling special-casing for force-single-line (#4129) 2023-04-27 00:02:17 -04:00
Micha Reiser 17db2e2a62
Fix B023 shadowed variables in nested functions (#4111) 2023-04-26 22:01:31 +01:00
Micha Reiser e04ef42334
Use `memchr` to speedup newline search on x86 (#3985) 2023-04-26 20:15:47 +01:00
Micha Reiser f3e6ddda62
perf(logical-lines): Various small perf improvements (#4022) 2023-04-26 20:10:35 +01:00
Micha Reiser cab65b25da
Replace row/column based `Location` with byte-offsets. (#3931) 2023-04-26 18:11:02 +00:00
Charlie Marsh ee91598835
Tweak `--show-fixes` documentation (#4117) 2023-04-26 15:15:56 +00:00
Dhruv Manilawala b9c06b48e1
Document that `--diff` implies `--fix-only` (#4098) 2023-04-25 21:19:44 -06:00
Charlie Marsh 7266eb0d69
Add support for providing command-line arguments via `argfile` (#4087) 2023-04-25 17:58:21 -06:00
Jonathan Plasse 4df7bc0bcd
Fix `E713` and `E714` false positives for multiple comparisons (#4083) 2023-04-25 11:37:56 -06:00
Charlie Marsh fd7ccb4c9e
Bump version to 0.0.263 (#4086) 2023-04-24 23:32:29 -06:00
Evan Rittenhouse ae6f38344a
Unify positional and keyword arguments when checking for missing arguments in docstring (#4067) 2023-04-25 05:32:15 +00:00
Trevor McCulloch bbf658d4c5
[`pylint`] Implement PLE0302 `unexpected-special-method-signature` (#4075) 2023-04-25 04:51:21 +00:00
Jonathan Plasse 1f3b0fd602
Fix `SIM222` and `SIM223` false positives and auto-fix (#4063) 2023-04-25 04:44:02 +00:00
Dhruv Manilawala 37483f3ac9
Ignore `ClassVar` annotation for `RUF008`, `RUF009` (#4081) 2023-04-24 23:58:30 +00:00
Jonathan Plasse 5e91211e6d
Add `in_boolean_test` to `Context` (#4072) 2023-04-23 23:18:23 -06:00
Jonathan Plasse df77595426
Move `Truthiness` into `ruff_python_ast` (#4071) 2023-04-24 04:54:31 +00:00
Charlie Marsh 407af6e0ae
Avoid infinite-propagation of inline comments when force-splitting imports (#4074) 2023-04-23 22:39:51 -06:00
Dhruv Manilawala d64146683e
Increment priority should be (branch-local, global) (#4070) 2023-04-23 00:04:15 -06:00
Charlie Marsh 0e7914010f
Misc. small clean-up of `flake8-import-conventions` rules (#4069) 2023-04-23 04:57:15 +00:00
Edgar R. M cfc7d8a2b5
[`flake8-import-conventions`] Implement new rule `ICN003` to ban `from ... import ...` for selected modules (#4040) 2023-04-23 04:40:36 +00:00
Tom Kuson f5cd659292
Add docs for `tryceratops` rules (#4042) 2023-04-23 04:35:56 +00:00
Charlie Marsh 260138b427
Use `Context` for pep8-naming helpers (#4068) 2023-04-22 18:44:54 -04:00
Jonathan Plasse 2da149fd7e
Ignore `N815` for `TypedDict` fields (#4066) 2023-04-22 18:17:14 -04:00
Micha Reiser e33887718d
Use Rust 1.69 (#4065) 2023-04-22 23:04:17 +01:00
Micha Reiser ba4f4f4672
Upgrade dependencies (#4064) 2023-04-22 18:04:01 +01:00
Alan Du 82abbc7234
[`flake8-bugbear`] Add pytest.raises(Exception) support to `B017` (#4052) 2023-04-21 03:43:01 +00:00
Dhruv Manilawala ba98149022
Avoid `RUF008` if field annotation is immutable (#4039) 2023-04-20 16:02:12 -04:00
Dhruv Manilawala 7fd44a3e12
Avoid `PYI015` for valid default value without annotation (#4043) 2023-04-20 15:45:47 -04:00
Evan Rittenhouse 6e8d561090
Support --fix in watch mode (#4035) 2023-04-19 23:33:12 -04:00
Charlie Marsh eed6866b7e
Add relative-path tests for `banned-api` (#4033) 2023-04-19 16:04:22 -04:00
Charlie Marsh 25a6bfa9ee
Bump version to 0.0.262 (#4032) 2023-04-19 15:49:28 -04:00
Charlie Marsh b3f8f2a5c1
Remove TODO in `handle_node_store` (#4031) 2023-04-19 15:28:56 -04:00
Charlie Marsh cc8b5a543b
Ignore stub file assignments to value-requiring targets (#4030) 2023-04-19 15:26:00 -04:00
Charlie Marsh 10d5415bcb
Ignore certain flake8-pyi errors within function bodies (#4029) 2023-04-19 15:10:29 -04:00
Charlie Marsh 827cbe7f97
Treat non-future function annotations as required-at-runtime (#4028) 2023-04-19 14:43:55 -04:00
Charlie Marsh 0d84517fbc
Use module path resolver for relative autofix (#4027) 2023-04-19 14:43:45 -04:00
Charlie Marsh 7fa1da20fb
Support relative imports in `banned-api` enforcement (#4025) 2023-04-19 14:30:13 -04:00
Francesco Nuzzo f13a161ead
remove unnecessary f-string formatting (#4026) 2023-04-19 18:14:33 +00:00
Charlie Marsh c4cda301aa
Ignore relative imports in `banned-api` rules (#4024) 2023-04-19 13:30:08 -04:00
Charlie Marsh 13fda30051
Refactor `flake8_tidy_imports` rules to consistently take `Checker` (#4023) 2023-04-19 16:42:15 +00:00
Micha Reiser a3146ab1ca
Fix (doc-)line-too-long start location (#4006) 2023-04-19 08:42:28 +02:00
Micha Reiser c0cf87356e
Set non-empty range for indentation diagnostics (#4005) 2023-04-18 16:26:13 +02:00
Charlie Marsh 6c038830a8
Ignore argument assignments when enforcing `RET504` (#4004) 2023-04-18 03:22:38 +00:00
Charlie Marsh 064a293b80
Fix defaults for section-order (#4003) 2023-04-18 03:00:17 +00:00
Charlie Marsh 79c47e29ee
Avoid short-circuiting when detecting RET rules (#4002) 2023-04-17 22:52:26 -04:00
Charlie Marsh be87a29a9d
Respect typing-modules when evaluating no-return functions (#4001) 2023-04-17 20:25:44 +00:00
Micha Reiser 280dffb5e1
Add parser benchmark (#3990) 2023-04-17 16:43:59 +02:00
Tom Kuson 516cb10000
Add more documentation for `flake8-type-checking` (#3994) 2023-04-17 09:51:54 -04:00
Charlie Marsh 1cdd5e3424
Remove autofix behavior for uncapitalized-environment-variables (`SIM112`) (#3988) 2023-04-16 23:19:05 +00:00
Dhruv Manilawala bd78c6ade2
Preserve type annotations when fixing `E731` (#3983) 2023-04-16 23:15:38 +00:00
Dhruv Manilawala 5ce35faa86
Do not consider nested comment as part of code (#3984) 2023-04-16 19:11:01 -04:00
Charlie Marsh c457752f36
Redirect `PIE802` to `C419` (#3971) 2023-04-13 22:12:32 -04:00
Charlie Marsh 289289bfd3
Implement `unnecessary-literal-within-dict-call` (`C418`) (#3969) 2023-04-14 01:39:35 +00:00
Charlie Marsh d8718dcf54
Remove extraneous debug and TODO (#3967) 2023-04-13 18:45:18 -04:00
Charlie Marsh fb9eeba422
Move user-defined section validation into `Settings` (#3966) 2023-04-13 22:40:05 +00:00
Paul 2d2630ef07
Implement isort custom sections and ordering (#2419) (#3900) 2023-04-13 21:28:22 +00:00
Charlie Marsh 1f22e035e3
Add 'or if cond' to `E712` message (#3962) 2023-04-13 19:02:23 +00:00
Rob Young a6a7584d79
Implement `flake8-bandit` shell injection rules (#3924) 2023-04-13 14:45:27 -04:00
Charlie Marsh ffac4f6ec3
Ignore assert errors (S101) in `TYPE_CHECKING` blocks (#3960) 2023-04-13 18:20:44 +00:00
Dhruv Manilawala 032a84b167
Check for parenthesis in implicit str concat in `PT006` (#3955) 2023-04-13 17:56:18 +00:00
Charlie Marsh 3357aaef4b
Add docs for assert rule (S101) (#3959) 2023-04-13 13:43:00 -04:00
Charlie Marsh e160a52bfd
Raise percent-format upgrade rule (`UP031`) for hanging modulos (#3953) 2023-04-12 23:59:20 -04:00
Charlie Marsh 9067ae47d1
Allow `typing_extensions.TypeVar` assignments in `.pyi` files (#3951) 2023-04-12 17:30:15 -04:00
Charlie Marsh 1e2df07544
Use identifier range for pytest rules (#3948) 2023-04-12 15:28:25 +00:00
USER-5 860841468c
[`flake8-pyi`] Implement duplicate types in unions (`PYI016`) (#3922) 2023-04-12 04:06:09 +00:00
Charlie Marsh ed4ecc3255
Remove unused import (#3944) 2023-04-12 03:55:38 +00:00
Charlie Marsh b999e4b1e2
Allow users to extend the set of included files via `include` (#3914) 2023-04-11 23:39:43 -04:00
Charlie Marsh 8ce227047d
Tidy up some `pygrep-hooks` rules (#3942) 2023-04-12 03:35:15 +00:00
Daniel Stancl 523515f936
[`flake8-import-conventions`] Add a rule for `BannedImportAlias` (#3926) 2023-04-12 03:29:24 +00:00
Charlie Marsh 10da3bc8dd
Support `pyright: ignore` comments (#3941) 2023-04-12 03:10:29 +00:00
Charlie Marsh eb0dd74040
Avoid adding required imports to stub files (#3940) 2023-04-11 22:31:20 -04:00
Micha Reiser 61200d2171
lint snapshots: Use filename only to avoid platform specific separators (#3930) 2023-04-11 11:40:51 +02:00
Micha Reiser e8aebee3f6
Pretty print `Diagnostic`s in snapshot tests (#3906) 2023-04-11 09:03:00 +00:00
Micha Reiser 210083bdd8
Order `Edit`s by `Location`s (#3905) 2023-04-11 08:56:41 +00:00
Micha Reiser c33c9dc585
Introduce SourceFile to avoid cloning the message filename (#3904) 2023-04-11 08:28:55 +00:00
Micha Reiser 056c212975
Render code frame with context (#3901) 2023-04-11 10:22:11 +02:00
Micha Reiser 381203c084
Store source code on message (#3897) 2023-04-11 07:57:36 +00:00
Micha Reiser 76c47a9a43
Cheap cloneable LineIndex (#3896) 2023-04-11 07:33:40 +00:00
Micha Reiser 9209e57c5a
Extract message emitters from Printer (#3895) 2023-04-11 07:24:25 +00:00
Leiser Fernández Gallo 333f1bd9ce
Extend SIM105 to match also 'Ellipsis only' bodies in exception handlers (#3925) 2023-04-10 09:55:02 -04:00
Leiser Fernández Gallo 002caadf9e
[`flake8-simplify`] Add autofix for `contextlib.suppress` (`SIM105`) (#3915) 2023-04-09 22:45:19 +00:00
Dhruv Manilawala 311ba29d0f
Do not skip analysis if `*args` present for `F523` (#3923) 2023-04-09 18:34:52 -04:00
Dhruv Manilawala 237a64d922
Check for arguments in inner/outer call for `C414` (#3916) 2023-04-09 18:33:11 -04:00
Moritz Sauter d4af2dd5cf
[`ruff`] Add checks for mutable defaults in `dataclass`es (#3877) 2023-04-09 02:46:28 +00:00
Charlie Marsh a36ce585ce
Remove `extract_path_names` helper (#3920) 2023-04-08 11:14:42 -04:00
Charlie Marsh 29ec6df24f
Avoid N802 violations for `@override` methods (#3912) 2023-04-08 03:11:50 +00:00
Evan Rittenhouse abaf0a198d
Ensure that tab characters aren't in multi-line strings before throwing a violation (#3837) 2023-04-06 22:25:40 -04:00
konstin cae5503e34
[`pylint`] Fix unicode handling in `PLE2515` (#3898) 2023-04-06 13:54:52 -04:00
Dhruv Manilawala 34e9786a41
Visit comprehension to detect group name usage/overrides (#3887) 2023-04-05 18:03:11 -04:00
Dhruv Manilawala 5467d45dfa
Ignore `PLW2901` when using typing cast (#3891) 2023-04-05 18:02:32 -04:00
Charlie Marsh ac87137c1c
Avoid printing docs on cargo dev generate-all (#3890) 2023-04-05 14:18:33 -04:00
Charlie Marsh e0bccfd2d9
Allow legacy C and T selectors in JSON schema (#3889) 2023-04-05 17:58:36 +00:00
Tom Kuson 7b6e55a2e0
Add documentation for `flake8-type-checking` (#3886) 2023-04-05 17:30:25 +00:00
Charlie Marsh 255b094b33
Bump version to 0.0.261 (#3881) 2023-04-04 22:31:01 -04:00
Dhruv Manilawala b6155232ac
Consider logger candidate from `logging` module only (#3878) 2023-04-04 19:52:57 +00:00
kyoto7250 390d7dcf39
Supports more cases in `SIM112` (#3876) 2023-04-04 15:49:24 -04:00
Charlie Marsh d919adc13c
Introduce a `ruff_python_semantic` crate (#3865) 2023-04-04 16:50:47 +00:00
kyoto7250 46bcb1f725
[`flake8-simplify`] Implement `dict-get-with-none-default` (`SIM910`) (#3874) 2023-04-04 03:52:10 +00:00
Dhruv Manilawala 2b21effa77
fixup! Support mutually exclusive branches for `B031` (#3844) (#3875) 2023-04-03 23:34:11 -04:00
Chris Chan 10504eb9ed
Generate `ImportMap` from module path to imported dependencies (#3243) 2023-04-04 03:31:37 +00:00
Dhruv Manilawala 76e111c874
Support mutually exclusive branches for `B031` (#3844) 2023-04-04 02:33:17 +00:00
Charlie Marsh 60f6a8571a
Allow starred arguments in B030 (#3871) 2023-04-03 23:20:34 +00:00
Charlie Marsh f4173b2a93
Move shadow tracking into `Scope` directly (#3854) 2023-04-03 15:33:44 -04:00
Charlie Marsh 449e08ed08
Rename `autofix::helpers` to `autofix::actions` (#3866) 2023-04-03 13:34:49 -04:00
Charlie Marsh 5625410936
Remove `uses_magic_variable_access` dependence on `Checker` (#3864) 2023-04-03 12:22:06 -04:00
Charlie Marsh 3744e9ab3f
Remove `contains_effect`'s dependency on `Context` (#3855) 2023-04-03 12:08:13 -04:00
Nazia Povey 849091d846
When checking module visibility, don't check entire ancestry (#3835) 2023-04-03 11:38:41 -04:00
Ran Benita d2f2544f6e
flake8-pyi: fix PYI015 false positive on assignment of TypeVar & friends (#3861) 2023-04-03 11:28:46 -04:00
Charlie Marsh 25771cd4b9
Use references for `Export` binding type (#3853) 2023-04-03 15:26:42 +00:00
Charlie Marsh 924bebbb4a
Change "indexes" to "indices" in various contexts (#3856) 2023-04-02 23:08:03 +00:00
Charlie Marsh 08e5b3fa61
Make `collect_call_path` return an `Option` (#3849) 2023-04-01 22:29:32 -04:00
Charlie Marsh d822e08111
Move `CallPath` into its own module (#3847) 2023-04-01 11:25:04 -04:00
Charlie Marsh 2f90157ce2
Move logging resolver into `logging.rs` (#3843) 2023-04-01 03:50:44 +00:00
Charlie Marsh 88308ef9cc
Move `Binding` structs out of `scope.rs` (#3842) 2023-03-31 23:49:48 -04:00
Charlie Marsh 6d80c79bac
Combine `operations.rs` and `helpers.rs` (#3841) 2023-04-01 03:40:34 +00:00
Charlie Marsh 2fbc620ad3
Move `__all__` utilities to `all.rs` (#3840) 2023-04-01 03:31:15 +00:00
Charlie Marsh 27e40e9b31
Remove `helpers.rs` dependency on `Binding` (#3839) 2023-04-01 03:19:45 +00:00
Charlie Marsh b6276e2d95
Move f-string identification into rule module (#3838) 2023-03-31 23:10:11 -04:00
Charlie Marsh 66d72b1c7b
Move keyword checks into `is_identifier` (#3834) 2023-03-31 16:56:33 -04:00
Jonathan Plasse 968c7df770
Fix `is_module_name()` and improve perf of `is_identifier()` (#3795) 2023-03-31 15:15:36 -04:00
Jonathan Plasse fe38597279
Fix `SIM222` and `SIM223` false positive (#3832) 2023-03-31 14:50:35 -04:00
Micha Reiser 48d8680e71
Ambiguous unicode, only test unicode characters (#3814) 2023-03-31 18:03:00 +01:00
Charlie Marsh 82584ad101
Extend `unncessary-generator-any-all` to set comprehensions (#3824) 2023-03-31 16:29:25 +00:00
Charlie Marsh dfc872c9a0
Track star imports on `Scope` directly (#3822) 2023-03-31 15:01:12 +00:00
Charlie Marsh cf7e1ddd08
Remove some `usize` references (#3819) 2023-03-30 17:35:42 -04:00
Charlie Marsh 9de1f82658
Avoid `unnecessary-comprehension-any-all` for async generators (#3823) 2023-03-30 18:43:59 +00:00
Charlie Marsh 54ad9397e5
Flag non-`Name` expressions in `duplicate-isinstance-call` (#3817) 2023-03-30 12:19:53 -04:00
Jonathan Plasse 29c8b75fd4
Ignore `collapsible-if` violations for `if False:` and `if True:` (#3732) 2023-03-30 15:52:43 +00:00
Charlie Marsh 0b586d5451
Use `panic` instead of `unreachable` for invalid arguments (#3816) 2023-03-30 15:40:53 +00:00
Charlie Marsh 01357f62e5
Add import insertion support to autofix capabilities (#3787) 2023-03-30 15:33:46 +00:00
Micha Reiser d7113d3995
refactor: `StateMachine` use `match` statement (#3811) 2023-03-30 15:55:54 +02:00
Charlie Marsh f79506f5a4
Move some generic structs out of `isort` (#3788) 2023-03-30 08:58:01 -04:00
Dhruv Manilawala 44ae3237b8
Additional simple magic return types (#3805) 2023-03-30 08:57:49 -04:00
konstin f4cda31708
Use crates.io version of pep440_rs (#3812)
* Use crates.io version of pep440_rs

* Update Cargo.lock
2023-03-30 12:47:07 +00:00
Charlie Marsh 4328448a2f
Use multi-fix semantics for `inplace` removal (#3804) 2023-03-30 00:16:43 +00:00
Charlie Marsh 88298759ce
Misc. follow-up changes to #3802 (#3803) 2023-03-29 19:18:36 -04:00
Charlie Marsh 3c0e789b19
Improve robustness of argument removal for `encode` calls (#3802) 2023-03-29 23:07:13 +00:00
Charlie Marsh 8601dcc09b
Add import name resolution to `Context` (#3777) 2023-03-29 21:47:50 +00:00
Charlie Marsh 134fdd1609
Remove star-import handling from `sys-exit-alias` (#3776) 2023-03-29 21:33:50 +00:00
Charlie Marsh 2e6eddc7bd
Improve top-of-file insertions for required imports (#3779) 2023-03-29 21:25:39 +00:00
Jonathan Plasse cb588d1d6d
Allow `TID252` to fix all valid module paths (#3796) 2023-03-29 15:13:12 -04:00
Charlie Marsh 9d3b8eb67b
Bump version to v0.0.260 (#3799) 2023-03-29 14:51:50 -04:00
Andy Freeland 7d962bf80c
[`flake8-bugbear`] Allow `pathlib.Path()` in `B008` (#3794) 2023-03-29 15:42:43 +00:00
Micha Reiser 595cd065f3
Reduce explcit clones (#3793) 2023-03-29 15:15:14 +02:00
Anže Starič b6f1fed424
[`isort`]: support submodules in known_(first|third)_party config options (#3768) 2023-03-29 03:53:38 +00:00
Jonathan Plasse 5501fc9572
Exempt return with side effects for TRY300 (#3780) 2023-03-28 19:52:05 -04:00
Leiser Fernández Gallo 224e85c6d7
Implement `flake8-gettext` (#3785) 2023-03-28 23:32:02 +00:00
Charlie Marsh f322bcd2bd
Minor nits on reference names (#3786) 2023-03-28 22:18:19 +00:00
Charlie Marsh 22d5b0071d
Rename `end_of_statement` to `end_of_last_statement` (#3775) 2023-03-28 12:31:06 -04:00
Charlie Marsh 990b378c4d
Set parents even in same-line cases (#3773) 2023-03-28 12:09:30 -04:00
Charlie Marsh e88fbae926
Use import alias locations for `pep8-naming` import rules (#3772) 2023-03-28 11:41:23 -04:00
Charlie Marsh 81de3a16bc
Include `with` statements in complexity calculation (#3771) 2023-03-28 15:20:22 +00:00
Andy Freeland bfecf684ce
[`flake8-bugbear`] Add more immutable functions for `B008` (#3764) 2023-03-28 10:50:05 -04:00
konstin 756e9956a2
Fix `cargo test --doc` (#3766) 2023-03-28 11:36:07 +00:00
Micha Reiser f68c26a506
perf(pycodestyle): Initialize Stylist from tokens (#3757) 2023-03-28 11:53:35 +02:00
Micha Reiser 000394f428
perf(pycodestyle): Introduce TokenKind (#3745) 2023-03-28 11:22:39 +02:00
Micha Reiser 2fdf98ef4e
perf(pycodestyle): Refactor checks to iterate over tokens insteadof text (#3736) 2023-03-28 10:37:13 +02:00
Micha Reiser 1d724b1495
perf(pycodestyle): Remove regex captures (#3735) 2023-03-28 09:50:34 +02:00
Micha Reiser 113a8b8fda
perf(pycodestyle): Reduce allocations when computing logical lines (#3715) 2023-03-28 09:09:27 +02:00
Charlie Marsh c3917eab38
Revert "Implement `flake8-i18n` (#3741)" (#3765) 2023-03-27 21:14:38 +00:00
JBLDSKY 0eb5a22dd1
[`flake8-pyi`] Implement `PYI012` (#3743) 2023-03-27 18:27:24 +00:00
Charlie Marsh 450c6780ff
Avoid `useless-import alias` (`C0414`) in `.pyi` files (#3761) 2023-03-27 18:27:03 +00:00
Leiser Fernández Gallo 5cb120327c
Implement `flake8-i18n` (#3741) 2023-03-27 18:03:39 +00:00
trag1c 8dbffb576d
Removed unnecessary pipe escape (#3760) 2023-03-27 13:49:47 -04:00
Charlie Marsh 31fff4b10e
Disallow some restriction lints (#3754) 2023-03-26 23:20:20 +00:00
Jonathan Plasse 2326335f5c
Improve performance of statistics (#3751) 2023-03-26 18:46:44 -04:00
Charlie Marsh 6ed6da3e82
Move `fix::FixMode` to `flags::FixMode` (#3753) 2023-03-26 21:40:06 +00:00
Jonathan Plasse cd75b57036
Sort statistics by count (#3748) 2023-03-26 16:45:35 -04:00
Charlie Marsh e603382cf0
Allow diagnostics to generate multi-edit fixes (#3709) 2023-03-26 16:45:19 -04:00
Charlie Marsh 32be63fd1e
Avoid overlong-line errors for lines that end with URLs (#3663) 2023-03-26 18:17:35 +00:00
Jonathan Plasse d594179275
Fix `SIM222` and `SIM223` false negatives (#3740) 2023-03-26 18:09:11 +00:00
Agriya Khetarpal c0befb4670
Use `wild::args()` and add `wild` as a dependency (#3739) 2023-03-26 14:32:45 +00:00
Charlie Marsh a66481ed28
Rename setter methods on `Diagnostic` (#3738) 2023-03-26 10:28:30 -04:00
Charlie Marsh 5c7898124f
Traverse over nested string type annotations (#3724) 2023-03-25 21:56:09 -04:00
Jonathan Plasse 50a7916e84
[`pydocstyle`] Implement autofix for `D403` (#3731) 2023-03-25 19:21:45 +00:00
Dhruv Manilawala 2659336ed1
Add support for `.log(level, msg)` calls in `flake8-logging-format` (#3726) 2023-03-25 15:55:53 +00:00
Jonathan Plasse 8ac7584756
[`flake8-pyi`] Implement `PYI015` (#3728) 2023-03-25 15:48:11 +00:00
Jonathan Plasse 4a1740a4c4
[`flake8-pyi`] Add autofix for `PYI014` (#3729) 2023-03-25 15:41:11 +00:00
Charlie Marsh 2083134a96
Rename `Fix` to `Edit` (#3702) 2023-03-24 19:29:14 -04:00
Charlie Marsh c721eedc37
Remove `'b` lifetime from `Checker` (#3723) 2023-03-24 21:42:18 +00:00
Dhruv Manilawala c1d89d8c93
[`flake8-bugbear`]: Implement rule `B031` (#3680) 2023-03-24 17:26:11 -04:00
Dhruv Manilawala 63adf9f5e8
Allow aliased `logging` module as a logger candidate (#3718) 2023-03-24 17:19:09 -04:00
Micha Reiser 7af83460ce
Use unicode-width to determine line-length instead of character count (#3714) 2023-03-24 17:17:05 -04:00
Jonathan Plasse dc4d7619ee
Add `Diagnostic.try_amend()` to simplify error handling (#3701) 2023-03-24 17:10:11 -04:00
Jonathan Plasse 1bac206995
Revert "Replace `logical_lines` feature with `debug_assertions` (#3648)" (#3708) 2023-03-23 23:42:56 -04:00
Jonathan Plasse efc6e8cb39
Exempt `PLR1711` and `RET501` if non-`None` annotation (#3705) 2023-03-24 03:11:58 +00:00
Jonathan Plasse 7da06b9741
Allow simple container literals as default values (#3703) 2023-03-23 22:51:36 -04:00
Charlie Marsh 0f95056f13
Avoid panics for implicitly concatenated forward references (#3700) 2023-03-23 19:13:50 -04:00
Charlie Marsh 028329854b
Avoid parsing f-strings in type annotations (#3699) 2023-03-23 18:51:44 -04:00
Charlie Marsh ba43d6bd0b
Avoid parsing `ForwardRef` contents as type references (#3698) 2023-03-23 18:44:02 -04:00
Charlie Marsh e8d17d23cb
Expand the scope of useless-expression (B018) (#3455) 2023-03-23 18:33:58 -04:00
Jonathan Plasse aea925a898
Fix SIM118 auto-fix (#3695) 2023-03-23 17:14:56 -04:00
Charlie Marsh f58345dee3
Bump version to v0.0.259 (#3691) 2023-03-23 14:52:42 -04:00
Charlie Marsh 71c0da27bb
Avoid nested loops in missing_whitespace (#3688) 2023-03-23 14:18:59 -04:00
Charlie Marsh 8a2d1a3029
Respect all rule-exemption sources when suppressing parser errors (#3665) 2023-03-23 13:36:48 -04:00
Micha Reiser 6161e56ea4
Fix RuleSet.remove (#3685) 2023-03-23 17:01:37 +00:00
Charlie Marsh 189c9d4683
Add dedicated structs for `BindingKind` variants (#3672) 2023-03-22 19:08:48 -04:00
Charlie Marsh 615887a7fe
Bump version to v0.0.258 (#3671) 2023-03-22 15:02:57 -04:00
Charlie Marsh 07808a58f2
Refactor out common exemption-parsing logic (#3670) 2023-03-22 15:02:07 -04:00
Ran Benita fe568c08d2
isort: fix bad interaction between `force-sort-within-sections` and `force-to-top` (#3645) 2023-03-22 14:00:00 -04:00
Charlie Marsh 7741d43ae5
Allow `pairwise` diagnostics for `zip(..., strict=True)` (#3669) 2023-03-22 13:03:43 -04:00
Charlie Marsh 1b3e54231c
Flag, but don't fix, unused imports in `ModuleNotFoundError` blocks (#3658) 2023-03-22 13:03:30 -04:00
Charlie Marsh 3a8e98341b
Enable autofix for annotations within 'simple' string literals (#3657) 2023-03-22 12:45:51 -04:00
kyoto7250 8593739f88
Check indentation level when executing `E231` (#3668) 2023-03-22 12:32:00 -04:00
Charlie Marsh 242dd3dae1
Rename remaining `use-*` rules (#3661) 2023-03-22 11:36:01 -04:00
Charlie Marsh 875f61cb62
Rename `pathlib` rules to match updated naming convention (#3660) 2023-03-22 11:35:45 -04:00
Dhruv Manilawala 9e61956711
[`flake8-django`]: Implement rule DJ012 (#3659) 2023-03-22 03:07:58 +00:00
Jonathan Plasse 5eae3fbbfb
Avoid `RUF007` fixes for more than two arguments (#3654) 2023-03-21 22:17:31 +00:00
Colin Delahunty 41e38ffa98
[`flake8-bandit`]: Implement deny-list rules for suspicious member calls (#3239) 2023-03-21 15:11:52 -04:00
Charlie Marsh 27903cdb11
Replace `logical_lines` feature with `debug_assertions` (#3648) 2023-03-21 12:16:41 -04:00
Charlie Marsh 3b1709ba1e
Avoid attempting infinite open fix with re-bound builtin (#3650) 2023-03-21 15:32:31 +00:00
Dhruv Manilawala 33394e4a69
docs: all `flake8-comprehension` rules (#3631) 2023-03-21 14:28:19 +00:00
Charlie Marsh 7b9bdc494a
Consider same-site fixes to be overlapping (#3638) 2023-03-21 10:09:47 -04:00
Micha Reiser f59a22b6e5
Remove unused dependencies (#3644) 2023-03-21 11:02:41 +01:00
Jonathan Plasse b5edc6dfc9
Add autofix functionality for `F523` (#3613) 2023-03-21 03:55:23 +00:00
Charlie Marsh 626169e2ef
Avoid raising PEP 604 errors with forward-referenced members (#3640) 2023-03-20 23:49:41 -04:00
Charlie Marsh e9f359ac5e
Convert single-argument %-style format calls (#3600) 2023-03-21 03:35:10 +00:00
Jacob Latonis 318c2c80e2
`pylint`: Implement `binary-op-exception` (`PLW0711`) (#3639) 2023-03-21 03:33:40 +00:00
Jonathan Plasse 22a4ab51f9
Handle `UP032` autofix with adjacent keywords (#3636) 2023-03-21 00:17:45 +00:00
Jonathan Plasse f70a49ed8b
Add autofix for magic methods (`ANN204`) (#3633) 2023-03-20 19:19:20 -04:00
Charlie Marsh f039bf36a2
Avoid trimming escaped whitespace in D210 (#3635) 2023-03-20 17:17:42 -04:00
Jonathan Plasse 169dd72328
Fix TRY300 false positive (#3634) 2023-03-20 20:55:28 +00:00
Jonathan Plasse fd39ec4bdd
Merge Availability and AutofixKind (#3629) 2023-03-20 16:45:33 +00:00
Charlie Marsh 7c0f17279c
Flag PEP 585 and PEP 604 violations in quoted annotations (#3593) 2023-03-20 11:15:44 -04:00
konstin 81d0884974
Add basic jupyter notebook support (#3440)
* Add basic jupyter notebook support behind a feature flag

* Address review comments

* Rename in separate commit to make both git and clippy happy

* cfg(feature = "jupyter_notebook") another test

* Address more review comments

* Address more review comments

* and clippy and windows

* More review comment
2023-03-20 12:06:01 +01:00
Jacob Latonis a45753f462
[`pylint`]: Implement `assert-on-string-literal` (`W0129`) (#3610) 2023-03-19 23:45:51 -04:00
Zhengbo Wang b08326162b
Doc/CLN: pass pre-commit (#3604) 2023-03-19 19:20:11 +00:00
Dhruv Manilawala 3a65af4dae
feat: update C416 with dict comprehension (autofixable) (#3605) 2023-03-19 18:37:28 +00:00
Ville Lindholm 474aa0b196
Fix infinite loop due to rules `D207` & `W605` (#3609) 2023-03-19 18:29:13 +00:00
Charlie Marsh 4892167217
Avoid panics for implicitly-concatenated docstrings (#3584)
## Summary

In the rare event that a docstring contains an implicit string concatenation, we currently have the potential to panic, because we assume that if a string starts with triple quotes, it _ends_ with triple quotes. But with implicit concatenation, that's not the case: a single `Expr` could start and end with different quote styles, because it can contain multiple string tokens.

Supporting these "properly" is pretty hard. In some cases it's hard to even know what the "right" behavior is. So for now, I'm just detecting and warning, which is better than a panic.

Closes #3543.

Closes #3585.
2023-03-19 14:16:50 -04:00
Micha Reiser a5494b8541
Bitflag based RuleSet (#3606) 2023-03-19 17:09:06 +01:00
Micha Reiser 9ac9a1c69e
Gracefully handle lint panics (#3509) 2023-03-19 17:08:38 +01:00
Rogdham f06dff8af8
Change broken links in README to beta.ruff.rs (#3607) 2023-03-19 15:17:44 +00:00
Charlie Marsh fe7443ce2f
Use `any_enabled` in AST checker (#3601) 2023-03-19 10:44:33 -04:00
Charlie Marsh 4ffcd8366a
Rename a variety of rules to match updated conventions (#3283) 2023-03-18 17:35:59 -04:00
Charlie Marsh dfb772c6f1
Avoid removing comment hash for noqa's with trailing content (#3589) 2023-03-18 18:48:52 +00:00
Jonathan Plasse c21eb06922
Fix D417 false positive (#3596) 2023-03-18 13:14:03 -04:00
Charlie Marsh fa04861724
Check exclusions prior to resolving `pyproject.toml` files (#3588) 2023-03-18 13:12:49 -04:00
Charlie Marsh 0c4926ff7b
Bump version to v0.0.257 (#3591) 2023-03-17 22:34:10 -04:00
tomecki 61653b9f27
[`pylint`] Implement `useless-return` (`R1711`) (#3116) 2023-03-17 18:30:32 -04:00
Charlie Marsh 8dd3959e74
Update output in `resources/test/project/README.md` (#3587) 2023-03-17 21:51:03 +00:00
Charlie Marsh 50f9db21da
Enable ANSI colors on Windows 10 (#3583) 2023-03-17 17:34:39 -04:00
Tomer Chachamu 1dd3cbd047
[`pylint`] invalid-characters-* (#3552) 2023-03-17 19:30:41 +00:00
Johan bd935cbd49
[`flake8-bugbear`] Add `no-explicit-stacklevel` (`B028`) (#3550) 2023-03-17 19:20:08 +00:00
Charlie Marsh babd0a05ac
Avoid adding dashed line outside of docstring (#3581) 2023-03-17 14:40:32 -04:00
Micha Reiser 87fab4a2e1
Benchmark all rules (#3570) 2023-03-17 19:29:39 +01:00
Charlie Marsh 2e21920adf
Respect `type` overrides in E721 (#3582) 2023-03-17 14:29:05 -04:00
Micha Reiser dedf4cbdeb
refactor: Move scope and binding types to `scope.rs` (#3573) 2023-03-17 17:31:33 +01:00
Micha Reiser 92179e6369
Scope and Binding IDs (#3572) 2023-03-17 17:12:27 +01:00
Evan Rittenhouse 33d2457909
Prefer `itertools.pairwise()` over `zip()` for successive pairs (`RUF007`) (#3501) 2023-03-16 23:50:45 -04:00
Charlie Marsh 373a77e8c2
Avoid C1901 violations within subscripts (#3517) 2023-03-17 02:52:05 +00:00
Jacob Latonis 73df267635
[`pylint`]: Implement `continue-in-finally` (`E0116`) (#3541) 2023-03-17 02:47:49 +00:00
Jonathan Plasse f5e5caaa25
Fix autofix conflict between `D209` and `D400` (#3564) 2023-03-17 02:36:25 +00:00
Charlie Marsh e0df62b841
Rewrite mock import with starred imports (#3566) 2023-03-16 20:54:29 -04:00
Micha Reiser eff84442bc
refactor: Add Copy implementation to Rule (#3556) 2023-03-16 17:50:18 +01:00
Edgar R. M 9ae9cc9d2f
Use `value > max` style in pylint and mccabe messages (#3553) 2023-03-16 01:37:25 -04:00
Charlie Marsh e636c5fcf0
Avoid unused argument violations in .pyi files (#3533) 2023-03-15 03:17:19 +00:00
Charlie Marsh 12dfd57211
Bump version to v0.0.256 (#3531) 2023-03-14 22:52:21 -04:00
Charlie Marsh d188d242a0
Avoid tracking as-imports separately with force-single-line (#3530) 2023-03-15 02:26:01 +00:00
Charlie Marsh 57796c5e59
Add last remaining deprecated typing imports (#3529) 2023-03-15 00:08:09 +00:00
Charlie Marsh 2545869797
Avoid PEP 604 isinstance errors for starred tuples (#3527) 2023-03-14 22:08:43 +00:00
Charlie Marsh 58353a4bf4
Avoid PEP 604 panic with empty tuple (#3526) 2023-03-14 22:02:15 +00:00
Charlie Marsh a36139ae21
Replicate inline comments when splitting single-line imports (#3521) 2023-03-14 14:48:12 -04:00
Jonathan Plasse 7e904111b1
Fix PYI011 and add auto-fix (#3492) 2023-03-14 14:43:09 -04:00
Charlie Marsh 344daebb1b
Refine complexity rules for try-except-else-finally (#3519) 2023-03-14 14:40:33 -04:00
Charlie Marsh 432059de35
Allow `# ruff:` prefix for isort action comments (#3493) 2023-03-14 14:34:28 -04:00
Charlie Marsh c50d6da8b4
Allow string percent formatting in os.getenv (#3518) 2023-03-14 14:27:21 -04:00
Charlie Marsh 1b738f88c4
Allow f-strings and concatenations in os.getenv (#3516) 2023-03-14 17:46:34 +00:00
Charlie Marsh 1eff3dffa5
Ensure that redirect warnings appear exactly once per code (#3500) 2023-03-14 15:22:14 +00:00
Charlie Marsh 106a93eab0
Make Clap an optional feature for ruff crate (#3498) 2023-03-14 11:02:05 -04:00
Micha Reiser d5700d7c69
Add Micro Benchmark (#3466) 2023-03-14 08:35:07 +01:00
Grzegorz Bokota a82fe4a139
Fix lack of `not` in `PLC1901` error message (#3497) 2023-03-13 19:19:41 -04:00
Charlie Marsh 62ff3b62e3
Add `requires-python` inference to docs (#3495) 2023-03-13 18:14:39 -04:00
Charlie Marsh 1e5db58b7b
Include individual path checks in --verbose logging (#3489) 2023-03-13 17:13:47 -04:00
Charlie Marsh a6e998d639
Remove Wasm-specific Rayon workarounds (#3490) 2023-03-13 16:48:43 -04:00
Charlie Marsh a8c1915e2e
Remove erroneous C4-to-C40 redirect (#3488) 2023-03-13 19:52:05 +00:00
Xuehai Pan c515a1b31a
PYI011: allow `math` constants in defaults (#3484) 2023-03-13 14:23:00 -04:00
Charlie Marsh aa97a092bd
Bump version to v0.0.255 (#3485) 2023-03-13 14:06:51 -04:00
Micha Reiser 685c242761
refactor(ruff_python_ast): Split `get_argument` (#3478) 2023-03-13 18:18:25 +01:00
Jonathan Plasse b540407b74
Infer target-version from project metadata (#3470)
* Infer target-version from project metadata

* Fix requires-python with ">=3.8.16"

* Load requires-python at runtime

* Use upstream VersionSpecifiers

* Add debug information when parsing ruff.toml

* Display debug only if target_version is not set

* Bump pep440-rs to add impl Error for Pep440Error
2023-03-13 18:16:01 +01:00
Charlie Marsh 3a5fbd6d74
Upgrade RustPython to fix Serde dependency (#3481) 2023-03-13 12:29:31 -04:00
Charlie Marsh 227679b5cb
Re-enable the T and C linter prefix selectors (#3452) 2023-03-13 08:20:30 -04:00
Charlie Marsh c2750a59ab
Implement an iterator for universal newlines (#3454)
# Summary

We need to support CR line endings (as opposed to LF and CRLF line endings, which are already supported). They're rare, but they do appear in Python code, and we tend to panic on any file that uses them.

Our `Locator` abstraction now supports CR line endings. However, Rust's `str#lines` implementation does _not_.

This PR adds a `UniversalNewlineIterator` implementation that respects all of CR, LF, and CRLF line endings, and plugs it into most of the `.lines()` call sites.

As an alternative design, it could be nice if we could leverage `Locator` for this. We've already computed all of the line endings, so we could probably iterate much more efficiently?

# Test Plan

Largely relying on automated testing, however, also ran over some known failure cases, like #3404.
2023-03-13 00:01:29 -04:00
Charlie Marsh 2a4d6ab3b2
Remove unnecessary `Path::new` from `fs` calls (#3476) 2023-03-12 23:18:23 -04:00
Charlie Marsh 7a80bcec58
Output GitLab paths relative to `CI_PROJECT_DIR` (#3475) 2023-03-13 03:03:37 +00:00
Charlie Marsh 8955e32b5c
Respect ignores for runtime-import-in-type-checking-block (TCH004) (#3474) 2023-03-13 02:23:26 +00:00
Jacob Latonis 675227db5c
pylint: E1507 invalid-envvar-value (#3467) 2023-03-12 21:43:06 +00:00
Charlie Marsh a65c6806a6
Avoid respecting noqa directives when RUF100 is enabled (#3469) 2023-03-12 14:37:35 -04:00
Xuehai Pan 9858df1ac9
[FIX] PYI011: recognize `Bool` / `Float` / `Complex` numbers as simple defaults (#3459) 2023-03-12 17:34:09 +00:00
Charlie Marsh 7fb7268e8a
Use a hash to fingerprint GitLab CI output (#3456) 2023-03-12 00:22:39 -05:00
Jacob Latonis 0f78f27713
pylint: W1508 invalid-envvar-default (#3449) 2023-03-11 16:44:42 -05:00
Charlie Marsh 12a6fc7041
Avoid removing un-aliased exceptions in `OSError`-aliased handlers (#3451) 2023-03-11 15:24:11 -05:00
Micha Reiser d2988043af
perf: Optimize UTF8/ASCII byte offset index (#3439) 2023-03-11 13:12:10 +01:00
Micha Reiser cc8b13d3a7
refactor: Replace `Vec` in options metadata with static array (#3433) 2023-03-11 09:03:56 +00:00
Charlie Marsh 1e081cf9a6
Flag deprecated (but renamed) imports in UP035 (#3448) 2023-03-11 01:06:32 -05:00
Charlie Marsh 841bcf1cdd
Remove unnecessary Serde derives (#3447) 2023-03-11 00:16:51 -05:00
Jonathan Plasse 8b561313aa
Remove empty line after RUF100 auto-fix (#3414) 2023-03-10 22:57:13 +00:00
Florian Best a3aeec6377
docs(pycodestyle): document rules (#3407) 2023-03-10 22:36:38 +00:00
Micha Reiser b983d5eb3f
fix: method `red` not found in release builds (#3434) 2023-03-10 10:17:35 +01:00
kyoto7250 bb3bb24b59
Autofix PIE810 rule violations (#3411) 2023-03-10 05:17:22 +00:00
Charlie Marsh 872829ca72
When "Args" and "Parameters" are present, prefer NumPy style (#3430) 2023-03-10 02:58:05 +00:00
Charlie Marsh 2383228709
Respect `--show-fixes` with `--fix-only` (#3426) 2023-03-09 21:37:39 +00:00
Aryaman Marathe 952307d39d
[`pylint`] C1901: compare-to-empty-string (#3405) 2023-03-09 21:33:34 +00:00
Charlie Marsh 024caca233
Introduce a `ruff_diagnostics` crate (#3409)
## Summary

This PR moves `Diagnostic`, `DiagnosticKind`, and `Fix` into their own crate, which will enable us to further split up Ruff, since sub-linter crates (which need to implement functions that return `Diagnostic`) can now depend on `ruff_diagnostics` rather than Ruff.
2023-03-09 20:48:57 +00:00
DanCardin 08ec11a31e
fix: Emit a more useful error if an `extend` points at a non-existent ruff.toml file. (#3417) 2023-03-09 19:55:09 +00:00
Micha Reiser bd05a8a74d
fix: WASM tests (#3415) 2023-03-09 11:27:59 +01:00
Micha Reiser 229f1c34cb
refactor: Extract `ruff_wasm` (#3401) 2023-03-09 10:07:39 +00:00
Charlie Marsh a7f3532395
Ignore multiply-assigned variables in RET504 (#3393) 2023-03-08 19:11:55 -05:00
Aaron Cunningham 3349ceb969
[`flake8-bugbear`] Add `flake8-bugbear`'s B030 rule (#3400) 2023-03-08 20:41:29 +00:00
Charlie Marsh da1f83fe32
Remove `core` module from `ruff_python_formatter` (#3373) 2023-03-08 19:11:39 +00:00
Charlie Marsh 0a9d259f9c
Remove copied `core` modules from `ruff_python_formatter` (#3371) 2023-03-08 19:03:40 +00:00
Charlie Marsh 130e733023
Implement `From<Located>` for `Range` (#3377) 2023-03-08 18:50:20 +00:00
Charlie Marsh ff2c0dd491
Use shared `leading_quote` implementation in ruff_python_formatter (#3396) 2023-03-08 18:21:59 +00:00
Charlie Marsh dfe1cad928
Rename `DiagnosticKind#commit` to `DiagnosticKind#suggestion` (#3397) 2023-03-08 18:06:19 +00:00
Charlie Marsh ffad0bcdaa
Decouple `Diagnostic` from "all violations" enumeration (#3352) 2023-03-08 17:51:37 +00:00
Jonathan Plasse bc869d4f52
Fix PIE802 broken auto-fix with trailing comma (#3402) 2023-03-08 12:49:01 -05:00
Micha Reiser a3de791f0a
Make `ruff_cli` binary a small wrapper around `lib` (#3398) 2023-03-08 12:11:55 +01:00
Charlie Marsh d9dfec30eb
Catch RET504 usages via decorators (#3395) 2023-03-08 00:38:01 +00:00
Charlie Marsh 3f04def3a5
Remap ChainMap, Counter, and OrderedDict imports to collections (#3392) 2023-03-07 23:53:35 +00:00
Charlie Marsh 98177754de
Handle multi-line fixes for byte-string prefixing (#3391) 2023-03-07 23:33:47 +00:00
Charlie Marsh bad6bdda1f
Create a `rust_python_ast` crate (#3370)
This PR productionizes @MichaReiser's suggestion in https://github.com/charliermarsh/ruff/issues/1820#issuecomment-1440204423, by creating a separate crate for the `ast` module (`rust_python_ast`). This will enable us to further split up the `ruff` crate, as we'll be able to create (e.g.) separate sub-linter crates that have access to these common AST utilities.

This was mostly a straightforward copy (with adjustments to module imports), as the few dependencies that _did_ require modifications were handled in #3366, #3367, and #3368.
2023-03-07 15:18:40 +00:00
Charlie Marsh a5d302fcbf
Pass `Range` struct by value (#3376) 2023-03-07 09:53:31 -05:00
Charlie Marsh bced58ce40
Rename `runtime-evaluated-baseclasses` to `runtime-evaluated-base-classes` (#3379) 2023-03-07 09:51:12 -05:00
Aaron Cunningham 10e252e2fb
Updated forced-separate type from Rust to abstract (#3380) 2023-03-07 09:35:39 -05:00
Sasan Jacob Rasti 4dead7541f
Implement configuration options `runtime-evaluated-decorators` and `runtime-evaluated-baseclasses` for `flake8-type-checking` (#3292) 2023-03-06 23:34:19 -05:00
Charlie Marsh fea1af5a63
Include entire prefix when reporting rule selector errors (#3375) 2023-03-07 00:04:52 +00:00
Charlie Marsh c0ad875339
Remove unnecessary quote-stripping method (#3372) 2023-03-06 18:28:20 -05:00
Charlie Marsh 8437399496
Remove AST checker's dependency on resolver (#3368) 2023-03-06 21:45:09 +00:00
StefanBRas 074f5634a5
Remove duplicate info in azure format (#3369) 2023-03-06 16:40:03 -05:00
Charlie Marsh 694d41897a
Move `visibility` module into `ast` crate (#3367) 2023-03-06 20:14:47 +00:00
Charlie Marsh e1ebd9130d
Don't enforce typing-import rules in .pyi files (#3362) 2023-03-06 15:03:34 -05:00
Charlie Marsh fc8ca6edd2
Remove source_code's dependency on pydocstyle (#3366) 2023-03-06 15:01:01 -05:00
konstin 709dba2e71
Remove old `define_violation!` (in favor of `#[violation]`) (#3310) 2023-03-06 17:00:29 +00:00
Charlie Marsh d1c48016eb
Rename `ruff_python` crate to `ruff_python_stdlib` (#3354)
In hindsight, `ruff_python` is too general. A good giveaway is that it's actually a prefix of some other crates. The intent of this crate is to reimplement pieces of the Python standard library and CPython itself, so `ruff_python_stdlib` feels appropriate.
2023-03-06 13:43:22 +00:00
konstin 348a38d261
Deprecate define violation (#3358)
* Add `#[violation]` proc macro as a replacement for `define_violation!`

* Switch all rules to #[violation]
2023-03-06 10:59:06 +00:00
konstin 22e6778e17
Add `cargo dev generate-all --check` and catch outdated docs in `cargo test` (#3320) 2023-03-06 11:28:38 +01:00
StefanBRas 30c71dc59a
Add Azure Devops as a `-format` option. (#3335) 2023-03-06 02:48:39 +00:00
Charlie Marsh 5d8591fec4
Skip byte-order-mark at start of file (#3343) 2023-03-05 21:37:14 -05:00
Carlos Gonçalves 673aa6e90f
feat(e231): add rule + autofix (#3344) 2023-03-05 20:09:35 +00:00
Charlie Marsh 51fe9f7d4b
Treat unary operations on constants as constant-like (#3348) 2023-03-04 16:30:33 -05:00
Charlie Marsh d7767b2bad
Use u8 to represent ambiguous representants (#3345) 2023-03-04 16:01:05 -05:00
Charlie Marsh 40d3b40c14
Move binding and scope tracking into a separate `ast::Context` struct (#3298) 2023-03-04 14:01:20 -05:00
Jonathan Plasse 8828e12283
Bump dependencies and move more shared dependencies into workspace (#3340) 2023-03-04 12:36:26 -05:00
Charlie Marsh f13633cc9f
Avoid panicking in invalid_escape_sequence (#3338) 2023-03-04 12:14:33 -05:00
Evan Rittenhouse 889c05c87e
Explicitly put `Path(...)` in Pathlib violations (#3333) 2023-03-04 04:33:12 +00:00
Charlie Marsh bbbc44336e
Bump version to 0.0.254 (#3331) 2023-03-03 19:11:07 -05:00
Charlie Marsh d216b2aaa8
Treat callables within type definitions as default-non-types (#3329) 2023-03-03 23:07:30 +00:00
Charlie Marsh 367cc43c42
Un-gate PEP 604 isinstance rewrites from keep_runtime_typing checks (#3328) 2023-03-03 17:29:41 -05:00
Charlie Marsh b5b26d5a3e
Gate PEP604 isinstance rewrites behind Python 3.10+ (#3327) 2023-03-03 22:22:14 +00:00
Charlie Marsh dedf8aa5cc
Use presence of convention-specific sections during docstring inference (#3325) 2023-03-03 17:13:11 -05:00
Charlie Marsh eb42ce9319
Extend `RET503` autofixes to "end of statement", including comments (#3324) 2023-03-03 19:15:55 +00:00
Micha Reiser cdbe2ee496
refactor: Introduce `CacheKey` trait (#3323)
This PR introduces a new `CacheKey` trait for types that can be used as a cache key.

I'm not entirely sure if this is worth the "overhead", but I was surprised to find `HashableHashSet` and got scared when I looked at the time complexity of the `hash` function. These implementations must be extremely slow in hashed collections.

I then searched for usages and quickly realized that only the cache uses these `Hash` implementations, where performance is less sensitive.

This PR introduces a new `CacheKey` trait to communicate the difference between a hash and computing a key for the cache. The new trait can be implemented for types that don't implement `Hash` for performance reasons, and we can define additional constraints on the implementation:  For example, we'll want to enforce portability when we add remote caching support. Using a different trait further allows us not to implement it for types without stable identities (e.g. pointers) or use other implementations than the standard hash function.
2023-03-03 18:29:49 +00:00
konstin 3bcffb5bdd
Add flake-pyi PYI033 "Do not use type comments in stubs" (#3302) 2023-03-03 10:45:34 -05:00
Martin Packman 98209be8aa
Detect quote style ignoring docstrings (#3306)
Currently the quote style of the first string in a file is used for autodetecting what to use when rewriting code for fixes. This is an okay heuristic, but often the first line in a file is a docstring, rather than a string constant, and it's not uncommon for pre-Black code to have different quoting styles for those.

For example, in the Google style guide:
https://google.github.io/styleguide/pyguide.html
> Be consistent with your choice of string quote character within a file. Pick ' or " and stick with it. ... Docstrings must use """ regardless.

This branch adjusts the logic to instead skip over any `"""` triple doublequote string tokens. The default, if there are no single quoted strings, is still to use double quote as the style.
2023-03-02 23:59:33 -05:00
Charlie Marsh a03fa93c3a
Abort when unable to fix relative imports past module root (#3319) 2023-03-03 04:38:51 +00:00
Charlie Marsh 4de3882088
Upgrade RustPython (#3316) 2023-03-02 22:59:29 -05:00
Charlie Marsh 3a98b68dc0
Always include `@classmethod` and `@staticmethod` in decorator lists (#3314) 2023-03-03 03:49:04 +00:00
Carlos Gonçalves 7e291e542d
feat(e225,226,227,228): add rules (#3300) 2023-03-02 22:54:45 +00:00
Carlos Gonçalves 6f649d6579
feat(E211): add rule + autofix (#3313) 2023-03-02 22:48:04 +00:00
Yaroslav Chvanov 508bc605a5
Implement `property-decorators` configuration option for pydocstyle (#3311) 2023-03-02 16:59:56 -05:00
Charlie Marsh ffdf6e35e6
Treat function type annotations within classes as runtime-required (#3312) 2023-03-02 16:45:26 -05:00
Martin Lehoux 886992c6c2
Replace tuples with type union in isinstance or issubclass calls (#3280) 2023-03-02 15:59:15 -05:00
Charlie Marsh 3ed539d50e
Add a CLI flag to force-ignore noqa directives (#3296) 2023-03-01 22:28:13 -05:00
Charlie Marsh 4a70a4c323
Ignore unused imports in `ModuleNotFoundError` blocks (#3288) 2023-03-01 18:08:37 -05:00
Charlie Marsh 310f13c7db
Redirect `RUF004` to `B026` (#3293) 2023-03-01 13:00:02 -05:00
konstin 2168404fc2
flake8-pyi PYI006 bad version info comparison (#3291)
Implement PYI006 "bad version info comparison"

## What it does

Ensures that you only `<` and `>=` for version info comparisons with
`sys.version_info` in `.pyi` files. All other comparisons such as
`<`, `<=` and `==` are banned.

## Why is this bad?

```python
>>> import sys
>>> print(sys.version_info)
sys.version_info(major=3, minor=8, micro=10, releaselevel='final', serial=0)
>>> print(sys.version_info > (3, 8))
True
>>> print(sys.version_info == (3, 8))
False
>>> print(sys.version_info <= (3, 8))
False
>>> print(sys.version_info in (3, 8))
False
```

Co-authored-by: Charlie Marsh <charlie.r.marsh@gmail.com>
2023-03-01 18:58:57 +01:00
Charlie Marsh a032b66c2e
Avoid PEP 585 rewrites when builtins are shadowed (#3286) 2023-02-28 23:25:42 +00:00
Charlie Marsh af5f7dbd83
Avoid pluralization for single `--add-noqa` result (#3282) 2023-02-28 15:41:18 -05:00
Carlos Gonçalves 074a343a63
feat(E251,E252): add rules (#3274) 2023-02-28 12:02:36 -05:00
Charlie Marsh c7e09b54b0
Use expression span for yoda-conditions fixes (#3276) 2023-02-28 16:59:02 +00:00
Charlie Marsh 67d1f74587
Avoid raising TRY200 violations within new scopes (#3275) 2023-02-28 11:56:29 -05:00
Matthew Lloyd 1c79dff3bd
Improve the message for PLW2901: use "outer" and "inner" judiciously (#3263) 2023-02-28 16:33:01 +00:00
Charlie Marsh f5f09b489b
Introduce dedicated CST tokens for other operator kinds (#3267) 2023-02-27 23:54:57 -05:00
Charlie Marsh 061495a9eb
Make BoolOp its own located token (#3265) 2023-02-28 03:43:28 +00:00
Charlie Marsh 470e1c1754
Preserve comments on non-defaulted arguments (#3264) 2023-02-27 23:41:40 +00:00
Charlie Marsh 16be691712
Enable more non-panicking formatter tests (#3262) 2023-02-27 18:21:53 -05:00
Charlie Marsh 270015865b
Don't flag keyword-based logging format strings (#3261) 2023-02-27 23:11:13 +00:00
Charlie Marsh ccfa9d5b20
Deduplicate SIM116 errors (#3260) 2023-02-27 18:08:45 -05:00
Charlie Marsh 2261e194a0
Create dedicated `Body` nodes in the formatter CST (#3223) 2023-02-27 22:55:05 +00:00
Ville Skyttä cd6413ca09
Match non-lowercase with S105 again (#3258) 2023-02-27 16:38:23 -05:00
Charlie Marsh c65585e14a
Use `identifier_range` for a few more rules (#3254) 2023-02-27 18:23:33 +00:00
Charlie Marsh 16e2dae0c2
Handle empty NamedTuple and TypedDict conversions (#3251) 2023-02-27 11:18:34 -05:00
Carlos Gonçalves e8ba9c9e21
feat(W191): add indentation_contains_tabs (#3249) 2023-02-27 10:36:03 -05:00
Jonathan Plasse d285f5c90a
Run automatically format code blocks with Black (#3191) 2023-02-27 10:14:05 -05:00
Charlie Marsh 386ca7c9a1
Bump version to 0.0.253 (#3245) 2023-02-26 23:10:04 -05:00
Charlie Marsh 40c5abf16e
Avoid flagging Pylint logging rules with starred arguments (#3244) 2023-02-26 22:58:24 -05:00
Matthew Lloyd 7e7aec7d74
Expand the range of the COM812 autofix to include the preceding token (#3241)
This prevents the UP034 autofix simultaneously stripping the
parentheses from generators in the same linter pass, which causes
a SyntaxError.

Closes #3234.

With this fix:

```python
$ cat test.py
the_first_one = next(
    (i for i in range(10) if i // 2 == 0)
)

$ cargo run --bin ruff check test.py --no-cache --select UP034,COM812 --fix
    Finished dev [unoptimized + debuginfo] target(s) in 0.08s
     Running `target/debug/ruff check test.py --no-cache --select UP034,COM812 --fix`
Found 1 error (1 fixed, 0 remaining).

$ cat test.py
the_first_one = next(
    i for i in range(10) if i // 2 == 0
)
```

* Use format

---------

Co-authored-by: Charlie Marsh <charlie.r.marsh@gmail.com>
2023-02-27 03:47:07 +00:00
Ivan Gozali 4b5538f74e
[`pylint`] W0603: `global-statement` (#3227)
Implements pylint rule [W0603: global-statement](https://pylint.readthedocs.io/en/latest/user_guide/messages/warning/global-statement.html).

Currently checks for global statement usage in a few StmtKinds (as tested in the `pylint` `global-statement` test case [here](b70d2abd7f/tests/functional/g/globals.py)):

* Assign
* AugAssign
* ClassDef
* FunctionDef | AsyncFunctionDef
* Import
* ImportFrom
* Delete
2023-02-26 23:40:24 +00:00
Chris Chan 0b7d6b9097
Implement pylint's `else-if-used` rule (`PLR5501`) (#3231)
Attempt to implement else-if-used
https://pylint.pycqa.org/en/latest/user_guide/messages/refactor/else-if-used.html

Issue #970
2023-02-26 22:42:33 +00:00
Nick Pope 994e2e0903
Rename some `flake8-simplify` rules (#2915)
Renames the following rules that stood out to me at a glance as needing better names:

- `or-true` to `expr-or-true`
- `and-false` to `expr-and-false`
- `a-or-not-a` to `expr-or-not-expr`
- `a-and-not-a` to `expr-and-not-expr`

Related to #2902.
2023-02-26 22:35:15 +00:00
Luc Khai Hai bc79f540e4
[flake8-django] DJ003, DJ006, DJ007 (#3236)
Implements [flake8-django](https://github.com/rocioar/flake8-django) rules:
- DJ03
- DJ06
- DJ07
2023-02-26 22:29:42 +00:00
Steve Dignam 3a78b59314
[flake8-pyi]: PYI011, PYI014 (#3238)
Implement PYI011 and PYI014 with the latest changes:

https://github.com/PyCQA/flake8-pyi/pull/326
https://github.com/PyCQA/flake8-pyi/issues/316

rel: https://github.com/charliermarsh/ruff/issues/848
rel: 4212bec43d/pyi.py (L718)
2023-02-26 22:11:58 +00:00
Edgar R. M 5f83851329
[pydocstyle]: Implement `ignore-decorators` (#3229) 2023-02-26 21:40:01 +00:00
Carlos Gonçalves 484ce7b8fc
feat(E275): add Missing whitespace after keyword (#3225) 2023-02-26 21:36:05 +00:00
Charlie Marsh 1c75071136
Implement basic rendering of remaining AST nodes (#3233) 2023-02-26 05:05:56 +00:00
Charlie Marsh 51bca19c1d
Add builders for common comment rendering (#3232) 2023-02-26 04:16:24 +00:00
Steve Dignam a8a312e862
[flake8-pyi]: PYI009, PYI010, PYI021 (#3230)
PYI009 and PYI010 are very similar, always use `...` in function and class bodies in stubs.

PYI021 bans doc strings in stubs.

I think all of these rules should be relatively straightforward to implement auto fixes for but can do that later once we get all the other rules added.

rel: https://github.com/charliermarsh/ruff/issues/848
2023-02-25 22:29:04 -05:00
Ran Benita 33c31cda27
Add `noqa_row` to diagnostics JSON format (#3228)
In ruff-lsp (https://github.com/charliermarsh/ruff-lsp/pull/76) we want to add a "Disable \<rule\> for this line" quickfix. However, finding the correct line into which the `noqa` comment should be inserted is non-trivial (multi-line strings for example).

Ruff already has this info, so expose it in the JSON output for use by ruff-lsp.
2023-02-25 18:13:16 -05:00
Edgar R. M cd9fbeb560
[bandit]: Do not treat "passed" as "password" for `S105`/`S106`/`S107` (#3222) 2023-02-25 15:32:53 -05:00
Jeong YunWon 84e96cdcd9
More enum work (#3212) 2023-02-25 11:40:16 -05:00
Charlie Marsh 248590224a
Avoid flagging logging-too-few-args with no arguments (#3220) 2023-02-24 21:57:49 -05:00
Charlie Marsh bbc55cdb04
Allow ruff.toml file to be dot-prefixed (as .ruff.toml) (#3221) 2023-02-24 23:14:26 +00:00
Charlie Marsh 0694aee1b6
Avoid EXE001 and EXE002 errors from stdin input (#3218) 2023-02-24 22:55:32 +00:00
Charlie Marsh a17b5c134a
Avoid rewriting any PEP 604 runtime annotations (#3217)
Following `pyupgrade`, we'll just _never_ touch these.

Closes #2981.

Closes #3215.
2023-02-24 22:39:58 +00:00
Charlie Marsh 42f61535b5
Normalize treatment of aliased and unaliased imports (#3216) 2023-02-24 22:11:03 +00:00
Carlos Gonçalves 1c01b3c934
fix(docs): broken links inside Configuration.md (#3205) 2023-02-24 18:55:33 +00:00
monosans 24add5f56c
Avoid boolean-trap rules for ConfigParser get() methods (#3209) 2023-02-24 12:52:33 -05:00
Samuel Cormier-Iijima 0b7736ad79
[`flake8-tidy-imports`] fix autofix for relative imports (#3197) 2023-02-23 23:40:28 -05:00
Charlie Marsh eef85067c8
Exclude globsets for --show-settings (#3201) 2023-02-24 04:23:00 +00:00
Jeong YunWon da98fab4ae
Adapt is-macro for a few enums (#3182) 2023-02-24 04:06:56 +00:00
Charlie Marsh 0f37a98d91
Use then-some pattern for sometimes-fixable rules (#3199) 2023-02-24 03:57:14 +00:00
Charlie Marsh f38624824d
Avoid autofixing some PT violations when comments are present (#3198) 2023-02-24 03:48:41 +00:00
Charlie Marsh 159422071e
Handle end-of-line comments on `excepthandler` and `alias` (#3196) 2023-02-23 22:35:39 -05:00
Charlie Marsh 6eaacf96be
Introduce a new CST element for slice segments (#3195) 2023-02-24 00:49:41 +00:00
Charlie Marsh eb15371453
Make Locator available in AST-to-CST conversion pass (#3194) 2023-02-23 19:43:03 -05:00
Matt Nawara 198b301baf
[pycodestyle] trailing-whitespace, blank-line-contains-whitespace (W291, W293) (#3122) 2023-02-23 19:04:45 -05:00
Jeong YunWon c8c575dd43
Adapt BoolLike to flags (#3175) 2023-02-23 16:31:46 -05:00
Jonathan Plasse 6e54cd8233
Normalize relative markdown links (#3190) 2023-02-23 16:24:31 -05:00
Charlie Marsh bda2a0007a
Parenthesize numbers during attribute accesses (#3189) 2023-02-23 14:57:23 -05:00
Charlie Marsh 32d165b7ad
Implement complex literal formatting (#3186) 2023-02-23 19:09:33 +00:00
Charlie Marsh ac79bf4ee9
Implement float literal formatting (#3184) 2023-02-23 14:02:23 -05:00
Charlie Marsh 376eab3a53
Implement integer literal formatting (#3183) 2023-02-23 18:31:56 +00:00
Charlie Marsh 08be7bd285
Add a TODO to string_literal (#3181) 2023-02-23 12:46:20 -05:00
Charlie Marsh f5241451d8
Use `writeln` with --show-settings (#3180) 2023-02-23 17:23:31 +00:00
Charlie Marsh 09f8c487ea
Update RustPython to support *tuple annotations (#3178) 2023-02-23 16:58:38 +00:00
Charlie Marsh 1e7233a8eb
Add support for reformatting byte strings (#3176) 2023-02-23 16:50:24 +00:00
Charlie Marsh f967f344fc
Add support for basic `Constant::Str` formatting (#3173)
This PR enables us to apply the proper quotation marks, including support for escapes. There are some significant TODOs, especially around implicit concatenations like:

```py
(
  "abc"
  "def"
)
```

Which are represented as a single AST node, which requires us to tokenize _within_ the formatter to identify all the individual string parts.
2023-02-23 16:23:10 +00:00
Charlie Marsh 095f005bf4
Move RustPython vendored and helper code into its own crate (#3171) 2023-02-23 14:14:16 +00:00
Charlie Marsh 0f04aa2a5f
Bind star patterns in match statements (#3169) 2023-02-23 12:39:03 +00:00
Jonathan Plasse ad7ba77fff
Fix ExceptionGroup F821 false positive (#3167) 2023-02-23 12:36:11 +00:00
Jeong YunWon 77d43795f8
Replace Autofix::is_enabled to result_like::BoolLike (#3165) 2023-02-23 07:29:13 -05:00
Jeong YunWon 4357f2be0f
Add Autofix::is_enabled() to remove repeative patterns (#3159) 2023-02-22 23:52:07 -05:00
Charlie Marsh e5c1f95545
Check-in updated snapshot (#3161) 2023-02-23 03:42:27 +00:00
Charlie Marsh 227ff62a4e
Don't touch tuple brackets after `in` (#3160) 2023-02-23 03:10:24 +00:00
Charlie Marsh d8e4902516
Un-modify `tupleassign` and `function2` tests (#3158)
I manually changed these in #3080 and #3083 to get the tests passing (with notes around the deviations) -- but that's no longer necessary, now that we have proper testing that takes deviations into account.
2023-02-23 02:37:25 +00:00
Charlie Marsh 5fd827545b
Add a trailing newline to all .py.expect files (#3156)
This just re-formats all the `.py.expect` files with Black, both to add a trailing newline and be doubly-certain that they're correctly formatted.

I also ensured that we add a hard line break after each statement, and that we avoid including an extra newline in the generated Markdown (since the code should contain the exact expected newlines).
2023-02-23 02:29:27 +00:00
Matthew Lloyd c1ddcb8a60
[flake8-pie] Unnecessary list comprehension, with autofix (PIE802) (#3149) 2023-02-22 20:58:45 -05:00
Charlie Marsh 21d02cd51f
Omit non-.py[i] files from module naming rules (#3153) 2023-02-23 00:38:46 +00:00
Charlie Marsh b9bfb81e36
Move configuration out of README and into permanent docs (#3150) 2023-02-22 19:25:53 -05:00
Charlie Marsh 2d4fae45d9
Avoid flagging unfixable `TypedDict` and `NamedTuple` definitions (#3148) 2023-02-22 23:23:25 +00:00
Charlie Marsh 726adb7efc
Avoid suggesting 'is' for constant literals (#3146) 2023-02-22 22:37:22 +00:00
Charlie Marsh 1c41789c2a
Bump version to 0.0.252 (#3142) 2023-02-22 14:50:14 -05:00
Charlie Marsh 2f9de335db
Upgrade RustPython to match new flattened exports (#3141) 2023-02-22 19:36:13 +00:00
Ran Benita ba61bb6a6c
Fix isort `no-lines-before` preceded by an empty section (#3139)
Fix isort no-lines-before preceded by an empty section

Fix #3138.
2023-02-22 14:35:53 -05:00
Charlie Marsh 17ab71ff75
Include match in nested block check (#3137) 2023-02-22 14:32:08 -05:00
Charlie Marsh 4ad4e3e091
Avoid useless-else-on-loop for break within match (#3136) 2023-02-22 19:12:44 +00:00
Florian Best 6ced5122e4
refactor(use-from-import): build fixed variant via AST (#3132) 2023-02-22 13:17:37 -05:00
Charlie Marsh 1efa2e07ad
Avoid match statement misidentification in token rules (#3129) 2023-02-22 15:44:45 +00:00
Charlie Marsh df3932f750
Use file-specific quote for C408 (#3128) 2023-02-22 15:26:46 +00:00
Rupert Tombs 817d0b4902
Fix =/== error in `ManualDictLookup` (#3117) 2023-02-22 15:14:30 +00:00
Micha Reiser ffd8e958fc
chore: Upgrade Rust to 1.67.0 (#3125) 2023-02-22 10:03:17 -05:00
Micha Reiser ed33b75bad
test(ruff_python_formatter): Run all Black tests (#2993)
This PR changes the testing infrastructure to run all black tests and:

* Pass if Ruff and Black generate the same formatting
* Fail and write a markdown snapshot that shows the input code, the differences between Black and Ruff, Ruffs output, and Blacks output

This is achieved by introducing a new `fixture` macro (open to better name suggestions) that "duplicates" the attributed test for every file that matches the specified glob pattern. Creating a new test for each file over having a test that iterates over all files has the advantage that you can run a single test, and that test failures indicate which case is failing. 

The `fixture` macro also makes it straightforward to e.g. setup our own spec tests that test very specific formatting by creating a new folder and use insta to assert the formatted output.
2023-02-22 09:25:06 -05:00
Micha Reiser 262e768fd3
refactor(ruff): Implement `doc_lines_from_tokens` as iterator (#3124)
This is a nit refactor... It implements the extraction of document lines as an iterator instead of a Vector to avoid the extra allocation.
2023-02-22 09:22:06 -05:00
Ran Benita bc3a9ce003
Mark `typing.assert_never` as no return (#3121)
This function always raises, so RET503 shouldn't trigger for it.
2023-02-22 09:15:39 -05:00
Charlie Marsh 48005d87f8
Add missing backticks from rustdoc (#3112) 2023-02-22 05:03:06 +00:00
Charlie Marsh e37e9c2ca3
Skip EXE001 and EXE002 rules on Windows (#3111) 2023-02-21 23:39:56 -05:00
Matthieu Devlin 8fde63b323
[`pylint`] Implement E1205 and E106 (#3084) 2023-02-21 22:53:11 -05:00
Matthew Lloyd 97338e4cd6
[pylint] redefined-loop-name (W2901) (#3022)
Slightly broadens W2901 to cover `with` statements too.

Closes #2972.
2023-02-22 03:23:47 +00:00
Charlie Marsh 9645790a8b
Support shell expansion for --config argument (#3107) 2023-02-21 23:33:41 +00:00
Charlie Marsh 18800c6884
Include file permissions in cache key (#3104) 2023-02-21 18:20:06 -05:00
Charlie Marsh fd638a2e54
Bump version to 0.0.251 (#3105) 2023-02-21 18:13:59 -05:00
Charlie Marsh fa1459d56e
Avoid prefer-list-builtin for lambdas with `*args` or `**kwargs` (#3102) 2023-02-21 17:44:37 -05:00
Charlie Marsh d93c5811ea
Create bindings for `MatchAs` patterns (#3098) 2023-02-21 22:04:09 +00:00
Charlie Marsh 06e426f509
Bump version to 0.0.250 (#3095) 2023-02-21 15:20:46 -05:00
Carlos Gonçalves 6eb014b3b2
feat(B032): add b032 flake8_bugbear (#3085) 2023-02-21 19:53:29 +00:00
Charlie Marsh d9fd78d907
Ignore setters in flake8-boolean-trap (#3092) 2023-02-21 19:31:00 +00:00
Charlie Marsh d5c65b5f1b
Add support for structural pattern matching (#3047) 2023-02-21 18:52:10 +00:00
Charlie Marsh cdc4e86158
Add support for TryStar (#3089) 2023-02-21 13:42:20 -05:00
Charlie Marsh 50ec6d3b0f
Use LibCST to fix chained assertions (#3087) 2023-02-21 13:10:31 -05:00
Charlie Marsh a6eb60cdd5
Enable `function2` test (#3083) 2023-02-21 04:37:50 +00:00
Charlie Marsh 90c04b9cff
Enable `tupleassign` test (#3080) 2023-02-21 00:42:23 +00:00
Charlie Marsh b701cca779
Enable some already-passing Black tests (#3079) 2023-02-21 00:10:35 +00:00
Charlie Marsh ce8953442d
Add support for trailing colons in slice expressions (#3077) 2023-02-20 23:24:32 +00:00
Charlie Marsh 7d4e513a82
Omit while-True loops from implicit return enforcement (#3076) 2023-02-20 18:22:28 -05:00
Charlie Marsh 35f7f7b66d
Avoid boolean-trap rules for positional-only builtin calls (#3075) 2023-02-20 23:08:18 +00:00
Charlie Marsh 6e02405bd6
Add `StmtKind::Try`; fix trailing newlines (#3074) 2023-02-20 22:55:32 +00:00
Carlos Gonçalves b657468346
feat(B029): Add B029 from flake8-bugbear (#3068) 2023-02-20 15:57:13 -05:00
Micha Reiser f72ed255e5
chore: Use `LF` on all platforms (#3005)
I worked on #2993 and ran into issues that the formatter tests are failing on Windows because `writeln!` emits `\n` as line terminator on all platforms, but `git` on Windows converted the line endings in the snapshots to `\r\n`.

I then tried to replicate the issue on my Windows machine and was surprised that all linter snapshot tests are failing on my machine. I figured out after some time that it is due to my global git config keeping the input line endings rather than converting to `\r\n`. 

Luckily, I've been made aware of #2033 which introduced an "override" for the `assert_yaml_snapshot` macro that normalizes new lines, by splitting the formatted string using the platform-specific newline character. This is a clever approach and gives nice diffs for multiline fixes but makes assumptions about the setup contributors use and requires special care whenever we use line endings inside of tests. 

I recommend that we remove the special new line handling and use `.gitattributes` to enforce the use of `LF` on all platforms [guide](https://docs.github.com/en/get-started/getting-started-with-git/configuring-git-to-handle-line-endings). This gives us platform agnostic tests without having to worry about line endings in our tests or different git configurations.

## Note

It may be necessary for Windows contributors to run the following command to update the line endings of their files

```bash
git rm --cached -r .
git reset --hard
```
2023-02-20 20:13:37 +00:00
Colin Delahunty 9545958ad8
[`flake8-simplify`]: Implement manual-dict-lookup (#2767) 2023-02-20 20:00:59 +00:00
Colin Delahunty 41faa335d1
[`tryceratops`]: Verbose Log Messages (#3036) 2023-02-20 18:21:04 +00:00
Charlie Marsh 4cfa350112
Bump version to 0.0.249 (#3063) 2023-02-20 13:11:29 -05:00
Charlie Marsh 41f163fc8d
Avoid assert() to assert statement conversion in expressions (#3062) 2023-02-20 17:49:22 +00:00
Charlie Marsh d21dd994e6
Increase expected size of FormatElement (#3049) 2023-02-20 12:47:35 -05:00
Josh Karpel 6f5a6b8c8b
Do not autofix `E731` in class bodies (#3050) 2023-02-20 12:38:42 -05:00
Jeong YunWon 35606d7b05
clean up to fix nightly clippy warnings and dedents (#3057) 2023-02-20 09:33:47 -05:00
Charlie Marsh b39f960cd1
Relax constraints on pep8-naming module validation (#3043) 2023-02-19 17:34:23 -05:00
Charlie Marsh c297d46899
Remove unused `AsFormat` trait for `Option<T>` (#3041)
We should re-add this, but it's currently unused and doesn't compile under 1.66.0.

See: #3039.
2023-02-19 20:19:35 +00:00
Jonathan Plasse d6a100028c
Update docs and pre-commit after #3006 (#3038) 2023-02-19 14:23:01 -05:00
Jonathan Plasse 35d4e03f2a
Fix ruff_dev regex workspace dependency (#3037) 2023-02-19 18:02:08 +00:00
Charlie Marsh 2ff3dd5fbe
Bump version to 0.0.248 (#3034) 2023-02-19 16:21:30 +00:00
Charlie Marsh 0f0e7a521a
Avoid false-positives for break in with (#3032) 2023-02-19 11:17:04 -05:00
Jonathan Plasse b75663be6d
Add missing rust-version in crates (#3009) 2023-02-19 15:07:17 +00:00
Tomer Chachamu 4d3d04ee61
[`PLE0101`] error when `__init__` returns a value (#3007) 2023-02-19 14:54:43 +00:00
Manuel Jacob 87422ba362
Add configuration option for C408 to allow dict calls with keyword arguments. (#2977)
When creating a dict with string keys, some prefer to call dict instead of writing a dict literal.
For example: `dict(a=1, b=2, c=3)` instead of `{"a": 1, "b": 2, "c": 3}`.
2023-02-19 14:47:03 +00:00
Jeremy Goh c1d2976fff
[docs] Add docs for `flake8-implicit-str-concat` rules (#3028) 2023-02-19 14:38:59 +00:00
Jeremy Goh 13281cd9ca
[docs] Add some docs for `flake8-simplify` (#3027) 2023-02-19 14:26:56 +00:00
Jonathan Plasse e53652779d
Avoid raising `B027` violations in `.pyi` files (#3016) 2023-02-19 14:21:33 +00:00
Nyakku Shigure 216aa929af
Remove duplicate underline in B007 autofix message (#3021) 2023-02-18 19:38:20 -05:00
Simon Brugman 9e45424ed6
[`pycodestyle`] autofix useless semicolons (#3001) 2023-02-17 18:52:42 -05:00
Charlie Marsh db7f16e276
Support positional messages in assertion rewrites (#3002) 2023-02-17 23:44:13 +00:00
Charlie Marsh a10a500a26
Ignore namedtuple methods in flake8-self (#2998) 2023-02-17 17:16:25 -05:00
Simon Brugman a934d01bdb
[`flake8-tidy-imports`] extend autofix of relative imports (#2990)
This extends the autofix for TID252 to work with for relative imports without `module` (i.e. `from .. import`). Tested with `matplotlib` and `bokeh`.
(Previously it would panic on unwrap of the module) 

Note that pandas has [replaced](6057d7a93e) `absolufy-imports` with `ruff` now!
2023-02-17 19:35:28 +00:00
Simon Brugman 0dd590f137
Fix for F541 unescape f-string (#2971) 2023-02-17 14:27:01 -05:00
Charlie Marsh 909a5c3253
Avoid zero-indexed column for IOError (#2995) 2023-02-17 14:14:28 -05:00
Charlie Marsh 5c987874c4
Enforce D403 on methods (#2992) 2023-02-17 18:05:48 +00:00
Nyakku Shigure 0cfe4f9c69
Remove a whitespace in B004 message (#2991) 2023-02-17 12:37:08 -05:00
Martin Fischer d658bfc024 Remove options from README 2023-02-17 07:55:50 -05:00
Martin Fischer b0d72c47b4 refactor: Move Top-level heading into ruff_dev 2023-02-17 07:55:50 -05:00
Martin Fischer 8195873cdf Remove rule tables from README 2023-02-17 07:55:50 -05:00
Martin Fischer bf8108469f Remove auto-generated table of contents 2023-02-17 07:55:50 -05:00
Martin Fischer a2277cfeba refactor: Move fix symbol legend into ruff_dev 2023-02-17 07:55:50 -05:00
Charlie Marsh 180541a924
Unify comment terminology with that of `rome_formatter` (#2979) 2023-02-17 03:02:25 +00:00
Simon Brugman 34664a0ca0
[`numpy`] numpy-legacy-random (#2960)
The new `Generator` in NumPy uses bits provided by [PCG64](https://numpy.org/doc/stable/reference/random/bit_generators/pcg64.html#numpy.random.PCG64) which has better statistical properties than the legacy [MT19937](https://numpy.org/doc/stable/reference/random/bit_generators/mt19937.html#numpy.random.MT19937) used in [RandomState](https://numpy.org/doc/stable/reference/random/legacy.html#numpy.random.RandomState). Global random functions can also be problematic with parallel processing.

This rule is probably quite useful for data scientists (perhaps in combination with `nbqa`)

References:
- [Legacy Random Generation](https://numpy.org/doc/stable/reference/random/legacy.html#legacy)
- [Random Sampling](https://numpy.org/doc/stable/reference/random/index.html#random-quick-start)
- [Using PyTorch + NumPy? You're making a mistake.](https://tanelp.github.io/posts/a-bug-that-plagues-thousands-of-open-source-ml-projects/)
2023-02-17 02:06:30 +00:00
Charlie Marsh e081455b06
Add support for file-scoped `noqa` directives (#2978)
# Summary

This allows users to do things like:

```py
# ruff: noqa: F401
```

...to ignore all `F401` directives in a file. It's equivalent to `per-file-ignores`, but allows users to specify the behavior inline.

Note that Flake8 does _not_ support this, so we _don't_ respect `# flake8: noqa: F401`. (Flake8 treats that as equivalent to `# flake8: noqa`, so ignores _all_ errors in the file. I think all of [these usages](https://cs.github.com/?scopeName=All+repos&scope=&q=%22%23+flake8%3A+noqa%3A+%22) are probably mistakes!)

A couple notes on the details:

- If a user has `# ruff: noqa: F401` in the file, but also `# noqa: F401` on a line that would legitimately trigger an `F401` violation, we _do_ mark that as "unused" for `RUF100` purposes. This may be the wrong choice. The `noqa` is legitimately unused, but it's also not "wrong". It's just redundant.
- If a user has `# ruff: noqa: F401`, and runs `--add-noqa`, we _won't_ add `# noqa: F401` to any lines (which seems like the obvious right choice to me).

Closes #1054 (which has some extra pieces that I'll carve out into a separate issue).

Closes #2446.
2023-02-17 01:59:01 +00:00
Artem Mukhin 4f18fa6733
Add test case for '\u' prefix in B005 (#2976)
Based on #2958.
2023-02-16 19:45:29 -05:00
Charlie Marsh 6088a36cd3
Use `line_suffix` for end-of-line comments (#2975) 2023-02-16 18:37:40 -05:00
Charlie Marsh 66a162fa40
Handle non-from __future__ imports (#2974)
These are uncommon, but currently panic.

Closes #2967.
2023-02-16 22:56:03 +00:00
Charlie Marsh 750c28868f
Enable jemalloc on FreeBSD and NetBSD (#2965) 2023-02-16 15:21:34 -05:00
Charlie Marsh 5157f584ab
Improve pow operator spacing (#2970)
Ensure that we add spaces to expressions like `foo.bar() ** 2`.
2023-02-16 15:17:32 -05:00
Charlie Marsh 1c01ec21cb
Regenerate expected Black snapshots (#2968) 2023-02-16 19:39:17 +00:00
Manuel Jacob 879512742f
Skip .pytype directory by default. (#2966)
Pytype stores .pyi files in .pytype that ruff shouldn’t check or touch.
2023-02-16 14:38:08 -05:00
Florian Best a919041dda
feat(isort): Implement isort.force_to_top (#2877) 2023-02-16 19:01:59 +00:00
Charlie Marsh 059601d968
Avoid trying to fix implicit returns with control flow (#2962) 2023-02-16 13:42:46 -05:00
Charlie Marsh 2ec1701543
Remove link in asyncio.create_task (#2963) 2023-02-16 17:50:56 +00:00
Charlie Marsh 370c3a5daf
Remove mdcat dependency (#2959) 2023-02-16 12:09:37 -05:00
Charlie Marsh fdcb78fd8c
Avoid jemallocator on BSD (#2957) 2023-02-16 11:48:51 -05:00
Simon Brugman 2a744d24e5
docs: `flake8-self` remove unnecessary backticks (#2951) 2023-02-16 08:25:34 -05:00
Simon Brugman cc30738148
Implement `flake8-module-naming` (#2855)
- Implement N999 (following flake8-module-naming) in pep8_naming
- Refactor pep8_naming: split rules.rs into file per rule
- Documentation for majority of the violations

Closes https://github.com/charliermarsh/ruff/issues/2734
2023-02-16 04:20:33 +00:00
Charlie Marsh 036380e6a8
Fix add-required-import with multi-line offsets (#2946) 2023-02-16 03:24:55 +00:00
Charlie Marsh b6587e51ee
Use an enum to represent composition kind (#2945) 2023-02-15 22:14:00 -05:00
Simon Brugman 1bc37110d4
[`flake8-pytest-style`] autofix for composite-assertion (PT018) (#2732) 2023-02-16 00:36:07 +00:00
Lunarmagpie 28acdb76cf
Add support for `ensure_future` for RUF006 (#2943) 2023-02-15 23:18:11 +00:00
Martin Fischer 7b09972c97 Merge convert-loop-to-any & convert-loop-to-all to reimplemented-builtin 2023-02-15 16:24:31 -05:00
Charlie Marsh f8d46d09ef
Implement `asyncio-dangling-task` to track `asyncio.create_task` calls (#2935)
This rule guards against `asyncio.create_task` usages of the form:

```py
asyncio.create_task(coordinator.ws_connect())  # Error
```

...which can lead to unexpected bugs due to the lack of a strong reference to the created task. See Will McGugan's blog post for reference: https://textual.textualize.io/blog/2023/02/11/the-heisenbug-lurking-in-your-async-code/.

Note that we can't detect issues like:

```py
def f():
    # Stored as `task`, but never used...
    task = asyncio.create_task(coordinator.ws_connect())
```

So that would be a false negative. But this catches the common case of failing to assign the task in any way.

Closes #2809.
2023-02-15 15:19:03 -05:00
Charlie Marsh 52cc4d6537
Deduplicate files provided on the command-line (#2931) 2023-02-15 12:08:34 -05:00
Charlie Marsh 39fdc71b49
Bump version to 0.0.247 (#2932) 2023-02-15 12:06:58 -05:00
Charlie Marsh 6b0736cf4b
Allow private accesses on current class (#2929) 2023-02-15 16:52:05 +00:00
Charlie Marsh 58269a918a
Apply nullable-model-string-field to all classes (#2928) 2023-02-15 15:54:14 +00:00
Sawbez 9168a12679
[docs] `flake8-self` Private member access docs (#2912) 2023-02-15 15:42:38 +00:00
Charlie Marsh cb971d3a48
Respect self as positional-only argument in annotation rules (#2927) 2023-02-15 15:25:17 +00:00
Charlie Marsh 57a5071b4e
Rename some methods on `Locator` (#2926) 2023-02-15 10:21:49 -05:00
Martin Fischer 70e378b736 Implement shell autocompletion for rule codes
For example:

    $ ruff check --select=EM<Tab>
    EM          -- flake8-errmsg
    EM10   EM1  --
    EM101       -- raw-string-in-exception
    EM102       -- f-string-in-exception
    EM103       -- dot-format-in-exception

(You will need to enable autocompletion as described
 in the Autocompletion section in the README.)

Fixes #2808.

(The --help help change in the README is due to a clap bug,
 for which I already submitted a fix:
 https://github.com/clap-rs/clap/pull/4710.)
2023-02-15 08:09:34 -05:00
Charlie Marsh ca49b00e55
Add initial formatter implementation (#2883)
# Summary

This PR contains the code for the autoformatter proof-of-concept.

## Crate structure

The primary formatting hook is the `fmt` function in `crates/ruff_python_formatter/src/lib.rs`.

The current formatter approach is outlined in `crates/ruff_python_formatter/src/lib.rs`, and is structured as follows:

- Tokenize the code using the RustPython lexer.
- In `crates/ruff_python_formatter/src/trivia.rs`, extract a variety of trivia tokens from the token stream. These include comments, trailing commas, and empty lines.
- Generate the AST via the RustPython parser.
- In `crates/ruff_python_formatter/src/cst.rs`, convert the AST to a CST structure. As of now, the CST is nearly identical to the AST, except that every node gets a `trivia` vector. But we might want to modify it further.
- In `crates/ruff_python_formatter/src/attachment.rs`, attach each trivia token to the corresponding CST node. The logic for this is mostly in `decorate_trivia` and is ported almost directly from Prettier (given each token, find its preceding, following, and enclosing nodes, then attach the token to the appropriate node in a second pass).
- In `crates/ruff_python_formatter/src/newlines.rs`, normalize newlines to match Black’s preferences. This involves traversing the CST and inserting or removing `TriviaToken` values as we go.
- Call `format!` on the CST, which delegates to type-specific formatter implementations (e.g., `crates/ruff_python_formatter/src/format/stmt.rs` for `Stmt` nodes, and similar for `Expr` nodes; the others are trivial). Those type-specific implementations delegate to kind-specific functions (e.g., `format_func_def`).

## Testing and iteration

The formatter is being developed against the Black test suite, which was copied over in-full to `crates/ruff_python_formatter/resources/test/fixtures/black`.

The Black fixtures had to be modified to create `[insta](https://github.com/mitsuhiko/insta)`-compatible snapshots, which now exist in the repo.

My approach thus far has been to try and improve coverage by tackling fixtures one-by-one.

## What works, and what doesn’t

- *Most* nodes are supported at a basic level (though there are a few stragglers at time of writing, like `StmtKind::Try`).
- Newlines are properly preserved in most cases.
- Magic trailing commas are properly preserved in some (but not all) cases.
- Trivial leading and trailing standalone comments mostly work (although maybe not at the end of a file).
- Inline comments, and comments within expressions, often don’t work -- they work in a few cases, but it’s one-off right now. (We’re probably associating them with the “right” nodes more often than we are actually rendering them in the right place.)
- We don’t properly normalize string quotes. (At present, we just repeat any constants verbatim.)
- We’re mishandling a bunch of wrapping cases (if we treat Black as the reference implementation). Here are a few examples (demonstrating Black's stable behavior):

```py
# In some cases, if the end expression is "self-closing" (functions,
# lists, dictionaries, sets, subscript accesses, and any length-two
# boolean operations that end in these elments), Black
# will wrap like this...
if some_expression and f(
    b,
    c,
    d,
):
    pass

# ...whereas we do this:
if (
    some_expression
    and f(
        b,
        c,
        d,
    )
):
    pass

# If function arguments can fit on a single line, then Black will
# format them like this, rather than exploding them vertically.
if f(
    a, b, c, d, e, f, g, ...
):
    pass
```

- We don’t properly preserve parentheses in all cases. Black preserves parentheses in some but not all cases.
2023-02-15 04:06:35 +00:00
Charlie Marsh f661c90bd7
Remove dependency on `ruff_rowan` (#2875)
This PR removes the dependency on `ruff_rowan` (i.e., Rome's fork of rust-analyzer's `rowan`), and in turn, trims out a lot of code in `ruff_formatter` that isn't necessary (or isn't _yet_ necessary) to power the autoformatter.

We may end up pulling some of this back in -- TBD. For example, the autoformatter has its own comment representation right now, but we may eventually want to use the `comments.rs` data structures defined in `rome_formatter`.
2023-02-15 03:54:08 +00:00
Charlie Marsh 5a84df293f
Allow printing of consecutive empty lines (#2874) 2023-02-14 22:35:02 -05:00
Charlie Marsh 98ea94fdb7
Add `StaticTextSlice` kind to `FormatElement` enum (#2873)
Given our current parser abstractions, we need the ability to tell `ruff_formatter` to print a pre-defined slice from a fixed string of source code, which we've introduced here as `FormatElement::StaticTextSlice`.
2023-02-14 22:27:52 -05:00
Charlie Marsh 3ef1c2e303
Add `rome_formatter` fork as `ruff_formatter` (#2872)
The Ruff autoformatter is going to be based on an intermediate representation (IR) formatted via [Wadler's algorithm](https://homepages.inf.ed.ac.uk/wadler/papers/prettier/prettier.pdf). This is architecturally similar to [Rome](https://github.com/rome/tools), Prettier, [Skip](https://github.com/skiplang/skip/blob/master/src/tools/printer/printer.sk), and others.

This PR adds a fork of the `rome_formatter` crate from [Rome](https://github.com/rome/tools), renamed here to `ruff_formatter`, which provides generic definitions for a formatter IR as well as a generic IR printer. (We've also pulled in `rome_rowan`, `rome_text_size`, and `rome_text_edit`, though some of these will be removed in future PRs.)

Why fork? `rome_formatter` contains code that's specific to Rome's AST representation (e.g., it relies on a fork of rust-analyzer's `rowan`), and we'll likely want to support different abstractions and formatting capabilities (there are already a few changes coming in future PRs). Once we've dropped `ruff_rowan` and trimmed down `ruff_formatter` to the code we currently need, it's also not a huge surface area to maintain and update.
2023-02-14 19:22:55 -05:00
Simon Brugman ac028cd9f8
[`numpy`] deprecated type aliases (#2810)
Closes https://github.com/charliermarsh/ruff/issues/2455

Used `NPY` as prefix code as agreed in the issue.
2023-02-14 23:45:12 +00:00
Edgar R. M c0eb5c28d1
[docs] Add docs for `flake8-errmsg` (#2888) 2023-02-14 23:21:34 +00:00
Martin Fischer a77b4566e4 Fix option links in mkdocs rule pages
In 28c9263722 I introduced automatic
linkification of option references in rule documentation,
which automatically converted the following:

    ## Options

    * `namespace-packages`

to:

    ## Options

    * [`namespace-packages`]

    [`namespace-packages`]: ../../settings#namespace-packages

While the above is a correct CommonMark[1] link definition,
what I was missing was that we used mkdocs for our documentation
generation, which as it turns out uses a non-CommonMark-compliant
Markdown parser, namely Python-Markdown, which contrary to CommonMark
doesn't support link definitions containing code tags.

This commit fixes the broken links via a regex hack.

[1]: https://commonmark.org/
2023-02-14 17:56:21 -05:00
Charlie Marsh 58d4e00604
Add `publish = false` to unpublished crates (#2905) 2023-02-14 22:41:14 +00:00
Simon Brugman 4f927fbacc
[`flake8-tidy-imports`] autofix relative imports (#2891)
Previous fix was bugged. This one is only fixing when the `module_path` is present, making it far more robust.

Closes #2764 and closes #2869
2023-02-14 22:24:59 +00:00
Anders Kaseorg 2e41301520
Switch some quotes to backticks in errors (#2889)
Improves consistency with the style decision in #723, I think.
2023-02-14 22:24:41 +00:00
Martin Fischer 3179fc110d Disable many-to-one mapping for now 2023-02-14 16:16:12 -05:00
Martin Fischer 03ae0118b7 many-to-one 9/9: Update table generation 2023-02-14 16:16:12 -05:00
Martin Fischer 05176890ee many-to-one 8/9: Drop codes from registry
This commit was generated by running:

    fastmod --accept-all '[A-Z]+[0-9]+ => ' '' crates/ruff/src/registry.rs
2023-02-14 16:16:12 -05:00
Martin Fischer 849b947b3e many-to-one 7/9: Update JSON schema 2023-02-14 16:16:12 -05:00
Martin Fischer c314e10e54 many-to-one 6/9: Implement ruff_macros::map_codes 2023-02-14 16:16:12 -05:00
Martin Fischer 9eda286dcd many-to-one 5/9: Generate codes.rs from registry.rs
# This commit was generated by running the following Python code:
# (followed by `sed -Ei 's/(mod registry;)/\1mod codes;/' crates/ruff/src/lib.rs`
# and `cargo fmt`).

import json
import re
import subprocess

def parse_registry():
    file = open('crates/ruff/src/registry.rs')

    rules = []

    while next(file) != 'ruff_macros::register_rules!(\n':
        continue

    while (line := next(file)) != ');\n':
        line = line.strip().rstrip(',')
        if line.startswith('//') or line.startswith('#['):
            rules.append(line)
            continue
        code, path = line.split(' => ')
        name = path.rsplit('::')[-1]
        rules.append((code, name))

    while (line := next(file)) != 'pub enum Linter {\n':
        continue

    prefixes = []
    prefix2linter = []

    while (line := next(file).strip()) != '}':
        if line.startswith('//'):
            continue
        if line.startswith('#[prefix = '):
            prefixes.append(line.split()[-1].strip('"]'))
        else:
            for prefix in prefixes:
                prefix2linter.append((prefix, line.rstrip(',')))
            prefixes.clear()

    prefix2linter.sort(key = lambda t: len(t[0]), reverse=True)

    return rules, prefix2linter

rules, prefix2linter = parse_registry()

def parse_code(code):
    prefix = re.match('[A-Z]+', code).group()
    if prefix in ('E', 'W'):
        return 'Pycodestyle', code

    for prefix, linter in prefix2linter:
        if code.startswith(prefix):
            return linter, code[len(prefix) :]

    assert False

text = '''
use crate::registry::{Linter, Rule};

pub fn code_to_rule(linter: Linter, code: &str) -> Option<Rule> {
    #[allow(clippy::enum_glob_use)]
    use Linter::*;

    Some(match (linter, code) {
'''

for entry in rules:
    if isinstance(entry, str):
        if entry.startswith('//'):
            text += '\n' + entry
        else:
            text += entry
    else:
        namespace, code = parse_code(entry[0])
        text += f'({namespace}, "{code}") => Rule::{entry[1]},'
    text += '\n'

text += '''
       _ => return  None,
    })
}
'''

with open('crates/ruff/src/codes.rs', 'w') as f:
    f.write(text)
2023-02-14 16:16:12 -05:00
Martin Fischer 65a3461519 many-to-one 4/9: Rename define_rule_mapping! to register_rules!
Currently the define_rule_mapping! macro generates both the Rule enum as
well as the RuleCodePrefix enum and the mapping between the two.  After
this commit series the macro will only generate the Rule enum and the
RuleCodePrefix enum and the mapping will be generated by a new map_codes
proc macro, so we rename the macro now to fit its new purpose.
2023-02-14 16:16:12 -05:00
Martin Fischer 1b8d2df3bf many-to-one 3/9: Update RuleSelector::short_code
Same reasoning as for the previous commit ... one &'static str
becomes two &'static str because we split the RuleCodePrefix enum.
Note that the .unwrap() we have to add now, will actually
be removed in the 6th commit.
2023-02-14 16:16:12 -05:00
Martin Fischer 179ead0157 many-to-one 2/9: Newtype Rule::noqa_code return type
Rule::noqa_code previously return a single &'static str,
which was possible because we had one enum listing all
rule code prefixes. This commit series will however split up
the RuleCodePrefix enum into several enums ... so we'll end up
with two &'static str ... this commit wraps the return type
of Rule::noqa_code into a newtype so that we can easily change
it to return two &'static str in the 6th commit of this series.
2023-02-14 16:16:12 -05:00
Martin Fischer d451c7a506 many-to-one 1/9: Rename Rule::code to Rule::noqa_code
Post this commit series several codes can be mapped to a single rule,
this commit therefore renames Rule::code to Rule::noqa_code,
which is the code that --add-noqa will add to ignore a rule.
2023-02-14 16:16:12 -05:00
Martin Fischer 502ce80c91 many-to-one 0/9: Introduce RuleSelector::Linter variant
We want to remove the variants denoting whole Linters
from the RuleCodePrefix enum, so we have to introduce
a new RuleSelector::Linter variant.
2023-02-14 16:16:12 -05:00
Charlie Marsh 49d22d8fe2
Ignore non-imperative-mood in Google docstring convention (#2900) 2023-02-14 20:42:20 +00:00
Charlie Marsh f7515739ac
Improve consistency of some rule docs (#2887) 2023-02-14 04:36:37 +00:00
Sawbez 53e810ed3e
[docs] Add docs for the entirety of `flake8-builtins` (#2840) 2023-02-14 04:30:30 +00:00
Charlie Marsh 66a195f805
Extend B904 to else branches (#2886) 2023-02-14 03:58:15 +00:00
Jeremiah England b8483975a4
docs(SIM114): fix typo in example Python code (#2884) 2023-02-14 03:23:19 +00:00
Charlie Marsh 4dd2032687
Unversion unpublished crates (#2882) 2023-02-14 03:03:49 +00:00
Charlie Marsh c6c15d5cf9
Avoid unnecessary-else violations in `elif` branches (#2881)
Long-time source of confusion -- two reports over 1800 issues apart.

Closes #1035.

Closes #2879.
2023-02-14 02:51:12 +00:00
Charlie Marsh 2bf7b35268
Re-enable custom allocators (#2876) 2023-02-14 02:37:22 +00:00
Charlie Marsh 6d1adc85fc
Remove autofix for prefer-type-error (#2880) 2023-02-14 02:26:22 +00:00
Martin Fischer 8120d7c974 Change rule page links in README from GitHub to beta.ruff.rs 2023-02-13 19:34:06 -05:00
Anders Kaseorg b9d075c252
Alphabetize flake8-raise and flake8-self in documentation (#2871) 2023-02-13 18:03:09 -05:00
Charlie Marsh 7627e840c9
Avoid noqa removal upon unhandled syntax errors (#2864) 2023-02-13 10:37:55 -05:00
Charlie Marsh 3c03e2cb2e
Rename flake8-django rules to match convention (#2861) 2023-02-13 15:30:04 +00:00
Charlie Marsh aeae63b7ea
Avoid false-positives for runtime-types in type checking blocks (#2863) 2023-02-13 10:26:34 -05:00
Charlie Marsh 7be17c5f1e
Avoid false-positives with multi-byte characters in B005 (#2862) 2023-02-13 15:07:55 +00:00
Charlie Marsh 6128346b08
Re-show --target-version on CLI interface (#2859) 2023-02-13 15:04:11 +00:00
Charlie Marsh 1705574e75
Handle multiple receiver decorators in receiver-decorator (#2858) 2023-02-13 14:57:11 +00:00
Ville Skyttä d1cf0ee52b
Remove "blanket" from RUF100 README message (#2844) 2023-02-13 14:43:35 +00:00
Charlie Marsh dde69d50b5
Move more dependencies into workspace dependencies (#2842) 2023-02-13 04:19:26 +00:00
Charlie Marsh 48a5cd1dd9
Revert "perf: Use custom allocator (#2768)" (#2841)
This is causing wheel creation to fail on some of our more exotic build targets: https://github.com/charliermarsh/ruff/actions/runs/4159524132.

Let's figure out how to gate appropriately, but for now, reverting to get the release out.
2023-02-12 22:31:34 -05:00
Charlie Marsh 7dab4807d0
Allow compound statements of single ellipsis (#2837)
This allows `class C: ...`-style compound statements in stub files.

Closes #2835.
2023-02-12 18:56:43 -05:00
Charlie Marsh 83f6e52c92
Bump version to 0.0.246 (#2834) 2023-02-12 23:39:51 +00:00
Charlie Marsh 5ce7ce5bc3
Check-in updated snapshot for SIM111 (#2836) 2023-02-12 23:37:52 +00:00
Florian Best 749d197119
docs(SIM114): fix typo in python code (#2833) 2023-02-12 18:35:29 -05:00
Charlie Marsh 46c184600f
Include package inference during --add-noqa command (#2832) 2023-02-12 22:45:39 +00:00
Charlie Marsh e2051ef72f
Use smarter inversion for comparison checks (#2831) 2023-02-12 22:39:29 +00:00
Charlie Marsh 1abaece9ed
Fix unused multi-assignments in a single pass (#2829) 2023-02-12 22:28:03 +00:00
Charlie Marsh 8b35b052b8
Avoid duplicates in if-with-same-arms (#2827) 2023-02-12 22:22:19 +00:00
Charlie Marsh 5a34504149
Implement `ComparableStmt` (#2826) 2023-02-12 22:00:01 +00:00
Colin Delahunty 1f07ad6e61
[`flake8-simplify`]: combine-if-conditions (#2823) 2023-02-12 21:00:32 +00:00
Charlie Marsh 1666e8ba1e
Add a `--show-fixes` flag to include applied fixes in output (#2707) 2023-02-12 20:48:01 +00:00
Martin Fischer 28c9263722 Automatically linkify option references in rule documentation
Previously the rule documentation referenced configuration options
via full https:// URLs, which was bad for several reasons:

* changing the website would mean you'd have to change all URLs
* the links didn't work when building mkdocs locally
* the URLs showed up in the `ruff rule` output
* broken references weren't detected by our CI

This commit solves all of these problems by post-processing the
Markdown, recognizing sections such as:

    ## Options

    * `flake8-tidy-imports.ban-relative-imports`

`cargo dev generate-all` will automatically linkify such references
and panic if the referenced option doesn't exist.
Note that the option can also be linked in the other Markdown sections
via e.g. [`flake8-tidy-imports.ban-relative-imports`] since
the post-processing code generates a CommonMark link definition.

Resolves #2766.
2023-02-12 13:19:11 -05:00
Martin Fischer fc4c927788 refactor: Introduce ConfigurationOptions::get method 2023-02-12 13:19:11 -05:00
Zeddicus414 26f39cac2f
Add PD002 use-of-inplace-argument documentation (#2799) 2023-02-12 18:10:34 +00:00
Simon Brugman 02897a141b
[`flake8-tidy-imports`] add documentation for `banned-api` (#2819) 2023-02-12 18:09:39 +00:00
Nyakku Shigure fc465cc2af
[`flake8-pyi`]: add rules for unrecognized platform check (PYI007, PYI008) (#2805)
Add two [flake8-pyi](https://github.com/PyCQA/flake8-pyi) rules (Y007, Y008). ref: #848

The specifications are described in [PEP 484 - Version and platform checking](https://peps.python.org/pep-0484/#version-and-platform-checking)

The original implementation in flake8-pyi is shown below.

- Implemention: 66f28a4407/pyi.py (L1429-L1443)
- Tests: 66f28a4407/tests/sysplatform.pyi
2023-02-12 18:02:38 +00:00
Karol Onyśko 6769a5bce7
Implement flake8-django plugin rules (#2586) 2023-02-12 17:47:59 +00:00
Zeddicus414 fda93c6245
Add E722 bare-except documentation (#2796) 2023-02-12 16:51:32 +00:00
Charlie Marsh 099d5414f2
Allow non-verbose raise when cause is present (#2816)
The motivating issue here is of the following form:

```py
try:
    raise Exception("We want to hide this error message")
except Exception:
    try:
        raise Exception("We want to show this")
    except Exception as exc:
        raise exc from None
```

However, I think we should avoid this if _any_ cause is present, since causes require a named exception.

Closes #2814.
2023-02-12 16:48:13 +00:00
Charlie Marsh 9ddd5e4cfe
Allow private accesses on super calls (#2815) 2023-02-12 16:11:25 +00:00
Simon Brugman 1d4422f004
[`flake8-comprehensions`] improve autofix for C401, C402 and C417 (#2806) 2023-02-12 16:03:37 +00:00
Simon Brugman 2dccb7611a
[`flake8-comprehensions`] bugfix for C413 autofix (#2804) 2023-02-12 15:56:07 +00:00
Simon Brugman 0123425be1
[`flake8-comprehensions`] autofix C414 and C417 + bugfix (#2693)
Closes https://github.com/charliermarsh/ruff/issues/2262 and closes https://github.com/charliermarsh/ruff/issues/2423

Fixes bug where some cases generated duplicated violations (see https://github.com/charliermarsh/ruff/pull/2732#issuecomment-1426397842)
2023-02-12 05:20:42 +00:00
Charlie Marsh c53f91d943
Remove public re-export of commands (#2801) 2023-02-12 04:59:35 +00:00
Charlie Marsh 4a12ebb9b1
Improve f-string-missing-placeholders documentation (#2800) 2023-02-12 04:58:24 +00:00
Martin Fischer 0e4d5eeea7 Implement config subcommand
The synopsis is as follows.

List all top-level config keys:

    $ ruff config
    allowed-confusables
    builtins
    cache-dir
    ... etc.

List all config keys in a specific section:

    $ ruff config mccabe
    max-complexity

Describe a specific config option:

    $ ruff config mccabe.max-complexity
    The maximum McCabe complexity to allow before triggering `C901` errors.

    Default value: 10
    Type: int
    Example usage:
    ```toml
    # Flag errors (`C901`) whenever the complexity level exceeds 5.
    max-complexity = 5
    ```
2023-02-11 23:43:09 -05:00
Martin Fischer bbe44360e8 refactor: Move name out of OptionField & OptionGroup 2023-02-11 23:43:09 -05:00
Martin Fischer 37e80d98ab refactor: Reorder members in ruff::settings::options_base 2023-02-11 23:43:09 -05:00
Charlie Marsh 306393063d
Refactor generator to use Astor-derived precedence levels (#2798) 2023-02-12 04:30:16 +00:00
Martin Fischer f5a3c90288 Rename new `ruff rule` output format to "pretty"
The new `ruff rule` output format introduced in
551b810aeb doesn't print Markdown but
rather some rich text with escape sequences for colors and links,
it's actually the "text" format that prints Markdown, so naming the new
format "markdown" is very confusing. This commit therefore renames it to
"pretty".

This isn't a breaking change since there hasn't been a release yet.
2023-02-11 23:23:37 -05:00
Charlie Marsh 8289ede00f
Use output-stdout pattern for linter command (#2794) 2023-02-12 03:09:03 +00:00
Charlie Marsh 77e65c9ff5
Split commands.rs into separate files (#2792) 2023-02-12 02:58:13 +00:00
Charlie Marsh 418808895e
Add docs for f-string-missing-placeholders and unused-variable (#2790) 2023-02-12 02:48:36 +00:00
Nick Pope 551b810aeb
Add rendering of rule markdown for terminal output (#2747)
Add rendering of rule markdown for terminal output
    
This is achieved by making use of the `mdcat` crate.
    
See the following links for details:
    
- https://crates.io/crates/mdcat
- https://github.com/swsnr/mdcat
- https://docs.rs/mdcat/latest/mdcat/
2023-02-12 02:32:45 +00:00
Charlie Marsh 1b61d4e18b
Support unused variable removal in multi-assignment statements (#2786) 2023-02-12 00:53:11 +00:00
Charlie Marsh 752c0150e1
Improve unused-variable autofixes for with statements (#2785) 2023-02-12 00:38:14 +00:00
Charlie Marsh 81651a8479
Respect continuations in `noqa` enforcement (#2783) 2023-02-11 23:29:37 +00:00
Charlie Marsh 86d0749ed7
Use consistent formatting for lint-failure messages (#2782) 2023-02-11 22:52:18 +00:00
Charlie Marsh 19fc410683
Remove raw string from hardcoded-sql-expression (#2780) 2023-02-11 20:05:57 +00:00
Charlie Marsh 5a70a573cd
Avoid treating deferred string annotations as required-at-runtime (#2779) 2023-02-11 15:00:08 -05:00
Charlie Marsh 74731a3456
Fix reference to ban-relative-imports setting (#2776) 2023-02-11 18:34:25 +00:00
Micha Reiser 863e39fe5f
perf: Use custom allocator (#2768)
This PR replaces the system allocator with a custom allocator to improve performance:

* Windows: mimalloc
* Unix: tikv-jemallocator

## Performance:

* Linux
  * `cpython --no-cache`: 208.8ms -> 190.5ms
  * `cpython`: 32.8ms -> 31ms
* Mac: 
  * `cpython --no-cache`: 436.3ms -> 380ms
  * `cpython`: 40.9ms -> 39.6ms
* Windows: 
  * `cpython --no-cache`: 367ms -> 268ms
  * `cpython`: 92.5ms -> 92.3ms
  
## Size

* Linux: +5MB from 13MB -> 18MB (I need to double check this)
* Mac: +0.7MB from 8.3MB-> 9MB
* Windows: -0.16MB from 8.29MB -> 8.13MB (that's unexpected)
2023-02-11 13:26:07 -05:00
Charlie Marsh d0f9ee33ec Remove erroneous print statements 2023-02-11 12:45:40 -05:00
Charlie Marsh 1cf3d880a7
Don't treat all future import accesses as non-runtime (#2774)
This was just an oversight and misunderstanding on my part. We had some helpful tests, but I misunderstood the "right" behavior so thought they were passing.

Closes #2761.
2023-02-11 12:44:15 -05:00
Charlie Marsh ffb4e89a98
Remove multiple-statements-on-one-line-def (E704) (#2773) 2023-02-11 12:34:21 -05:00
Charlie Marsh 43b7ee215c
Ignore colon-after-lambda in compound statement rules (#2771) 2023-02-11 12:22:53 -05:00
Michał Mrówka 77099dcd4d
implemented option lines-between-types for isort (#2762)
Fixes #2585

Add support for the isort option [lines_between_types](https://pycqa.github.io/isort/docs/configuration/options.html#lines-between-types)
2023-02-11 12:17:37 -05:00
Martin Fischer 70ff65154d Rename function-is-too-complex to complex-structure 2023-02-11 12:05:17 -05:00
Martin Fischer 7db6a2d6d4 Rename rules containing PEP reference in name 2023-02-11 12:05:17 -05:00
Martin Fischer 42924c0d9a Rename a bunch of pydocstyle rules 2023-02-11 12:05:17 -05:00
Martin Fischer 31d00936ee Drop no- from no-unnecessary-* rule names 2023-02-11 12:05:17 -05:00
Martin Fischer c3c5d9a852 Rename nested-if-statements to collapsible-if 2023-02-11 12:05:17 -05:00
Martin Fischer 7e5c19385c Rename return-bool-condition-directly to needless-bool 2023-02-11 12:05:17 -05:00
Charlie Marsh 24faabf1f4 Bump version to 0.0.245 2023-02-10 22:15:27 -05:00
Charlie Marsh 9fd29e2c54 Mention default in relative-imports doc 2023-02-10 22:12:22 -05:00
Simon Brugman e83ed0ecba
Implement autofix for relative imports (TID252) (#2739) 2023-02-10 22:05:47 -05:00
Charlie Marsh dadbfea497
Flag private member accesses on calls et al (#2753) 2023-02-10 19:23:22 -05:00
Nick Pope 9f84c497f9
Adjust heading level in rule documentation (#2749) 2023-02-10 19:10:42 -05:00
Martin Fischer 0ec25d1514
Rename dynamically-typed-expression to any-type (#2751) 2023-02-10 19:02:31 -05:00
Charlie Marsh 6a87c99004 Use explicit fields for implicit-namespace-package 2023-02-10 18:09:30 -05:00
Charlie Marsh c8f60c9588 Improve implicit-namespace-package documentation 2023-02-10 18:06:48 -05:00
Charlie Marsh 113610a8d4 Improve hardcoded-sql-expression documentation 2023-02-10 18:03:01 -05:00
Charlie Marsh 6376e5915e Improve dynamically-typed-expression documentation 2023-02-10 17:55:26 -05:00
Charlie Marsh 3d8fb5be20
Rewrite documentation for yield-in-init (#2748) 2023-02-10 17:49:55 -05:00
Charlie Marsh 0040991778
Respect NO_COLOR flags in --show-source (#2750) 2023-02-10 17:27:40 -05:00
Charlie Marsh 6eb9268675
Allow named unicodes in bidirectional escape check (#2710) 2023-02-10 16:59:28 -05:00
Charlie Marsh e5f5142e3e Improve yield-in-init documentation 2023-02-10 16:47:44 -05:00
Charlie Marsh 98d5ffb817 Fix __init__.py-to-__init__ in documentation 2023-02-10 16:30:36 -05:00
Charlie Marsh 3f20f73413
Use `function_type::classify` for `yield-in-init` (#2742) 2023-02-10 16:19:45 -05:00
tomecki a5e42d2f7c
pylint: E0100 yield-in-init (#2716) 2023-02-10 16:15:15 -05:00
Charlie Marsh 0bc1f68111
Only trigger compound statements after select keywords (#2737) 2023-02-10 15:21:06 -05:00
Charlie Marsh d2b09d77c5
Only validate `__all__` bindings for global scope (#2738) 2023-02-10 15:16:21 -05:00
Charlie Marsh 0377834f9f
Mark `__all__` members as used at end-of-scope (#2733) 2023-02-10 14:32:05 -05:00
Charlie Marsh 3d650f9dd6
Relax conditions in bad-string-format-type (#2731) 2023-02-10 14:25:59 -05:00
Charlie Marsh a72590ecde
Expand S110 and S112 ranges to include entire exception handler (#2729) 2023-02-10 13:27:18 -05:00
Charlie Marsh 812b227334
Avoid flagging typed exceptions in tuples (#2728) 2023-02-10 13:24:45 -05:00
Martin Fischer 6f58717ba4 refactor: Stop including Rule::code() in pycodestyle .snap filenames 2023-02-10 13:15:47 -05:00
Florian Best 8aab96fb9e
feat(isort): Implement known-local-folder (#2657) 2023-02-10 13:15:34 -05:00
Nick Pope 9e6f7153a9
Handle more functions that never return in RET503 (#2719) 2023-02-10 12:09:05 -05:00
Peter Pentchev cda2ff0b18
Handle functions that never return in RET503 (#2701) 2023-02-10 09:28:34 -05:00
Martin Fischer ec63658250 Disallow rule names starting with avoid-* 2023-02-10 09:25:29 -05:00
Martin Fischer 1a97de0b01 Disallow rule names starting with uses-* 2023-02-10 09:25:29 -05:00
Martin Fischer 1cbe48522e Disallow rule names ending in *-used 2023-02-10 09:25:29 -05:00
Martin Fischer bfbde537af Disallow rule names starting with do-not-* 2023-02-10 09:25:29 -05:00
Martin Fischer cba91b758b Add test for rule names 2023-02-10 09:25:29 -05:00
Martin Fischer bd09a1819f Drop unused once_cell dependency from ruff_macros 2023-02-10 09:25:29 -05:00
Martin Fischer 682d206992 refactor: Reduce code duplication 2023-02-10 08:24:22 -05:00
Martin Fischer c32441e4ab refactor: Use format! keyword arguments 2023-02-10 08:24:22 -05:00
Martin Fischer 6f16f1c39b refactor: Reduce code duplication 2023-02-10 08:24:22 -05:00
Martin Fischer 9011456aa1 refactor: Simplify attribute handling in rule_code_prefix
if_all_same(codes.values().cloned()).unwrap_or_default()

was quite unreadable because it wasn't obvious that codes.values() are
the prefixes. It's better to introduce another Map rather than having
Maps within Maps.
2023-02-10 08:24:22 -05:00
Martin Fischer fa191cceeb refactor: Avoid implicit precondition 2023-02-10 08:24:22 -05:00
Charlie Marsh ac6c3affdd
Remove public Rust API (#2709) 2023-02-09 23:16:49 -05:00
Charlie Marsh 9a018c1650 Import AutofixKind from violation 2023-02-09 23:06:02 -05:00
Charlie Marsh a048594416
Gate `Path.readlink()` behind Python 3.9+ guard (#2708) 2023-02-09 22:57:31 -05:00
Charlie Marsh 5437f1299b
Remove lifetimes from Printer (#2704) 2023-02-09 21:44:15 -05:00
Charlie Marsh 41c0608a69
Add test module a test-only module (#2703) 2023-02-09 21:28:10 -05:00
messense eb0d42187f
Manage LibCST and RustPython with cargo workspace dependencies (#2700) 2023-02-09 20:49:50 -05:00
Colin Delahunty 48daa0f0ca
[`pylint`]: bad-string-format-type (#2572) 2023-02-09 20:08:56 -05:00
Charlie Marsh 417fe4355f
Add colors to statistics output (#2699) 2023-02-09 19:40:29 -05:00
Florian Best a129181407
feat(cli): let --statistics show fixable codes (#2659) 2023-02-09 19:36:31 -05:00
Matt Oberle fc628de667
Implement bandit's 'hardcoded-sql-expressions' S608 (#2698)
This is an attempt to implement `bandit` rule `B608` (renamed here `S608`).
- https://bandit.readthedocs.io/en/latest/plugins/b608_hardcoded_sql_expressions.html

The rule inspects strings constructed via `+`, `%`, `.format`, and `f""`.

- `+` and `%` via `BinOp`
- `.format` via `Call`
- `f""` via `JoinedString`

Any SQL-ish strings that use Python string formatting are flagged.

The expressions and targeted expression types for the rule come from here:
- 7104b336d3/bandit/plugins/injection_sql.py

> Related Issue: https://github.com/charliermarsh/ruff/issues/1646
2023-02-09 19:28:17 -05:00
Steve Dignam 67e58a024a
Add flake8-pyi with one rule (#2682)
Add basic scaffold for [flake8-pyi](https://github.com/PyCQA/flake8-pyi) and the first rule, Y001

rel: https://github.com/charliermarsh/ruff/issues/848
2023-02-09 19:03:11 -05:00
Charlie Marsh 233be0e074
Suppress parse errors with explicit `# noqa: E999` directives (#2697) 2023-02-09 18:24:19 -05:00
Charlie Marsh 7d5fb0de8a
Add documentation for mccabe, isort, and flake8-annotations (#2691) 2023-02-09 11:56:18 -05:00
Charlie Marsh 8a98cfc4b8
Treat re-exported annotations as used-at-runtime (#2689) 2023-02-09 11:22:15 -05:00
Charlie Marsh 54d1719424
Hide rule configuration settings on CLI (#2687) 2023-02-09 11:13:04 -05:00
Charlie Marsh 0f622f0126
Upgrade RustPython to pull in newline-handling optimizations (#2688) 2023-02-09 11:12:43 -05:00
Charlie Marsh 739a92e99d
Implement compound-statements (E701, E702, E703, E704) (#2680) 2023-02-08 22:57:39 -05:00
Charlie Marsh 5a07c9f57c
Only include rule links once in README (#2678) 2023-02-08 21:48:05 -05:00
Colin Delahunty 31027497c6
[`flake8-bandit`]: try-except-continue (#2674) 2023-02-08 21:44:01 -05:00
Charlie Marsh dabfdf718e
Mark flake8-simplify rules as unfixable in non-fixable cases (#2676) 2023-02-08 21:28:28 -05:00
Charlie Marsh 5829bae976
Support callable decorators in classmethod_decorators et al (#2675) 2023-02-08 21:11:36 -05:00
Charlie Marsh ff3665a24b Mark RUF005 as fixable 2023-02-08 18:02:33 -05:00
Charlie Marsh 125615af12 Bump version to 0.0.244 2023-02-08 17:28:59 -05:00
Charlie Marsh 6339f8e009
Use separate exit codes for fatal errors vs. lint errors (#2670) 2023-02-08 15:21:15 -05:00
Charlie Marsh 81abc5d7d8
Move error and warning messages into log macro (#2669) 2023-02-08 14:39:09 -05:00
Charlie Marsh 75fad989f4
Add `--exit-non-zero-on-fix` (#2668) 2023-02-08 14:27:54 -05:00
Charlie Marsh cb4a221905
Treat annotated assignments in class and module scopes as runtime (#2667) 2023-02-08 13:59:25 -05:00
Charlie Marsh 286d8c18dd
Remove ExprKind::Call from call path collection (#2666) 2023-02-08 13:35:18 -05:00
Florian Best 124461bddf
test(UP003): let type reference be the builtin (#2664) 2023-02-08 12:44:37 -05:00
Charlie Marsh 7482a4a5b8
Avoid false-positive in chained type calls (#2663) 2023-02-08 12:18:36 -05:00
Charlie Marsh 9f9f25ff7c
Accommodate multiple `@pytest.mark.parametrize` decorators (#2662) 2023-02-08 11:13:24 -05:00
Nuno Mendes 9cd1bf9c03
doc: add documentation for TRY002 (#2655) 2023-02-08 11:04:31 -05:00
Charlie Marsh 824c0d2680
Implement whitespace-before-comment (E261, E262, E265, E266) (#2654) 2023-02-07 23:41:32 -05:00
Charlie Marsh f5efdd058e
Implement whitespace-around-keywords (E271, E272, E273, E274) (#2653) 2023-02-07 22:31:13 -05:00
Charlie Marsh 4c35feaa18
Add documentation for eradicate, flake8-import-conventions, and flake8-no-pep420 (#2652) 2023-02-07 22:19:21 -05:00
Charlie Marsh 8261d0656e
Disable autofix for flake8-print rules (#2651) 2023-02-07 21:38:57 -05:00
Charlie Marsh a9aa96b24f
Add documentation for flake8-quotes rules (#2650) 2023-02-07 21:20:24 -05:00
Charlie Marsh 367f115d83
Add color to fixable error asterisk (#2647) 2023-02-07 19:12:18 -05:00
Charlie Marsh 56398e0002
Tweak format for rule explanations (#2645) 2023-02-07 19:02:41 -05:00
Ville Skyttä 4b49fd9494
Ignore all non-`.py` wrt. implicit namespace package (#2640)
It's not only `.pyi` that should be exempt for this, but also for example scripts which don't have an extension, explicitly passed in command line args.
2023-02-07 18:21:59 -05:00
Charlie Marsh 271e4fda8c
Create per-rule pages and link from README (#2644) 2023-02-07 18:15:05 -05:00
Charlie Marsh f1cdd108e6
Derive `explanation` method on Rule struct via rustdoc (#2642)
```console
❯ cargo run rule B017
    Finished dev [unoptimized + debuginfo] target(s) in 0.13s
     Running `target/debug/ruff rule B017`
no-assert-raises-exception

Code: B017 (flake8-bugbear)

### What it does
Checks for `self.assertRaises(Exception)`.

## Why is this bad?
`assertRaises(Exception)` can lead to your test passing even if the
code being tested is never executed due to a typo.

Either assert for a more specific exception (builtin or custom), use
`assertRaisesRegex` or the context manager form of `assertRaises`.
```
2023-02-07 17:23:29 -05:00
Charlie Marsh 8fd29b3b60
Remove dependency on `"unparse"` feature (#2641) 2023-02-07 17:23:09 -05:00
Charlie Marsh e427171323
Unify imports from `rustpython_parser::ast` (#2639) 2023-02-07 16:54:50 -05:00
Charlie Marsh 2f7f4943e3 Rename some local variables 2023-02-07 16:24:53 -05:00
Charlie Marsh 67e9ff7cc8
Reorder imports (#2638) 2023-02-07 16:22:47 -05:00
Charlie Marsh 0355ba571e
Skip ternary fixes for yields and awaits (#2637) 2023-02-07 15:18:52 -05:00
Charlie Marsh 38db7fd114
Avoid boolean-trap errors in `__setitem__` (#2636) 2023-02-07 15:04:33 -05:00
Charlie Marsh 8ee51eb5c6
Treat @staticmethod as higher-precedence than ABC (#2635) 2023-02-07 14:57:03 -05:00
Aarni Koskela 2bc16eb4e3
flake8-annotations: add ignore-fully-untyped (#2128)
This PR adds a configuration option to inhibit ANN* violations for functions that have no other annotations either, for easier gradual typing of a large codebase.
2023-02-07 11:35:57 -05:00
Charlie Marsh 4e36225145
Avoid no-unnecessary-dict-kwargs errors with reserved keywords (#2628) 2023-02-07 11:25:09 -05:00
Charlie Marsh 850069d0aa
Avoid non-recursion in nested typing function calls (#2627) 2023-02-07 11:21:49 -05:00
Charlie Marsh 9fa98ed90b
Accommodate pos-only arguments when checking self name (#2626) 2023-02-07 10:50:50 -05:00
Charlie Marsh 2b4ce78830
Delete unreferenced snapshots (#2619) 2023-02-06 23:22:41 -05:00
Colin Delahunty 7647cafe12
[`pylint`]: bidirectional-unicode (#2589) 2023-02-06 22:49:18 -05:00
Charlie Marsh bf718fdf26 Bump Ruff version to 0.0.243 2023-02-06 21:22:54 -05:00
Steve Dignam 3b3466f6da
Add flake8-pie single_starts_ends_with (#2616) 2023-02-06 21:22:32 -05:00
Charlie Marsh f981f491aa
Support `ignore-names` for all relevant pep8-naming rules (#2617) 2023-02-06 21:14:55 -05:00
Charlie Marsh 95fef43c4d Add some additional tests for relative imports 2023-02-06 21:13:23 -05:00
Charlie Marsh 097c679cf3
Support relative paths for typing-modules (#2615) 2023-02-06 19:51:37 -05:00
Charlie Marsh 3bca987665
Avoid removing quotes from runtime annotations (#2614) 2023-02-06 18:15:19 -05:00
Ville Skyttä 60ee1d2c17
fix(pep8-naming): `typing.NamedTuple` and `typing.TypedDict` treatment (#2611) 2023-02-06 17:11:37 -05:00
Charlie Marsh 2dd04dd6a3 Check in updated snapshot 2023-02-06 16:34:47 -05:00
Charlie Marsh e59b75d31b Bump version to 0.0.242 2023-02-06 16:25:29 -05:00
Charlie Marsh 610f150dd1
Remove autofix from bad-str-strip-call; add suggestions instead (#2610) 2023-02-06 16:25:20 -05:00
Charlie Marsh cee0d0abaa Check in updated snapshot 2023-02-06 15:48:23 -05:00
Charlie Marsh 12ed1837ee
Ignore typos in snapshots (#2609) 2023-02-06 15:43:03 -05:00
Colin Delahunty 6272293180
[`pylint`]: bad-str-strip-call (With Autofix) (#2570) 2023-02-06 15:34:37 -05:00
Charlie Marsh f8b8b05b80
Visit deferred assignments after deferred type annotations (#2607) 2023-02-06 14:40:41 -05:00
Charlie Marsh 79776c12e2
Allow blank line before sticky-comment functions in docstrings (#2597) 2023-02-05 18:48:29 -05:00
Charlie Marsh 7fa5ce8b63
Automatically remove empty type-checking blocks (#2598) 2023-02-05 18:46:07 -05:00
Charlie Marsh f6864a96f6
Enable autofix for unnecessary-paren-on-raise-exception (#2596) 2023-02-05 18:19:27 -05:00
Charlie Marsh 291ef9856a
Remove unnecessary `super_args.rs` (#2594) 2023-02-05 18:02:09 -05:00
Charlie Marsh 87d0aa5561
Move `python` into its own `ruff_python` crate (#2593) 2023-02-05 17:53:58 -05:00
Micha Reiser cd8be8c0be
refactor: Introduce crates folder (#2088)
This PR introduces a new `crates` directory and moves all "product" crates into that folder. 

Part of #2059.
2023-02-05 16:47:48 -05:00
Charlie Marsh 937c83d57f
Remove crates subdirectory (#563) 2022-11-03 09:19:54 -04:00
Charlie Marsh e00bcd19f5 Bump version to 0.0.97 2022-11-02 22:38:43 -04:00
Charlie Marsh e473df1fe9 Bump version to 0.0.96 2022-11-02 22:10:56 -04:00
Charlie Marsh f9def0a139 Bump version to 0.0.95 2022-11-02 09:03:34 -04:00
Charlie Marsh b4a46ab6f0
Add tests for converter.rs (#542) 2022-11-01 22:36:08 -04:00
Charlie Marsh f6e14edc3e
Use max-line-length in converter.rs (#541) 2022-11-01 22:27:13 -04:00
Charlie Marsh 79ca66ace5
Use nightly rustfmt with rustfmt.toml (#536) 2022-11-01 20:34:38 -04:00
Charlie Marsh bad5723d80
Add plugin configuration to flake8-to-ruff (#535) 2022-11-01 17:08:53 -04:00
Charlie Marsh 2d83f99dbf Bump version to 0.0.94 2022-11-01 16:38:59 -04:00
Charlie Marsh 927d716edd Enable flake8-to-ruff builds on all platforms 2022-11-01 12:15:43 -04:00
Charlie Marsh df6a48fced Use separate tokens for each PyPI release 2022-10-31 22:43:38 -04:00
Charlie Marsh 5797884262
Represent per-file ignores as a map (#531) 2022-10-31 22:15:33 -04:00
Charlie Marsh 8fd713739b Use pretty-print for flake8-to-ruff 2022-10-31 17:52:03 -04:00
Charlie Marsh 5de1fcd653 Add to flake8-to-ruff README 2022-10-31 17:50:32 -04:00
Charlie Marsh 621db96e7f
Use more consistent Option in pyproject settings (#530) 2022-10-31 16:34:58 -04:00
Charlie Marsh 1ce4585c88
Add a separate release job for flake8-to-ruff (#529) 2022-10-31 16:21:38 -04:00
Charlie Marsh f3f010cdf5
Move flake8-to-ruff to a separate crate (#528) 2022-10-31 14:22:07 -04:00