mirror of
https://github.com/astral-sh/ruff.git
synced 2026-10-28 10:45:37 +08:00
Summary
--
This PR bumps our libcst version to 1.9 and incorporates the new support
for Python 3.15 into fixes
that involved imports and unpacking in comprehensions. The unpacking
fixes affect three C4 rules and are
in the first (non-empty) commit, while the lazy import fixes are a bit
more widespread and are in
the second commit.
I admittedly wasn't that familiar with our usage of libcst before this,
but it looks like we have
kind of a weird mix between using libcst and additional manual string
manipulation. My changes
preserve that with a couple of `format!("lazy {fix}")` calls. libcst
also itself makes this change a
bit awkward by using separate node types for lazy and non-lazy imports,
so I ended up returning the
parts of the imports instead of `Import` types directly in a couple of
cases.
Test Plan
--
Updated existing snapshots for the C4 rules and new mdtests for the
import helpers
394 lines
18 KiB
TOML
394 lines
18 KiB
TOML
[workspace]
|
|
members = ["crates/*"]
|
|
resolver = "2"
|
|
|
|
[workspace.package]
|
|
# Please update rustfmt.toml when bumping the Rust edition
|
|
edition = "2024"
|
|
rust-version = "1.96"
|
|
homepage = "https://docs.astral.sh/ruff"
|
|
documentation = "https://docs.astral.sh/ruff"
|
|
repository = "https://github.com/astral-sh/ruff"
|
|
authors = ["Charlie Marsh <charlie.r.marsh@gmail.com>"]
|
|
license = "MIT"
|
|
|
|
[workspace.dependencies]
|
|
char_str = { version = "0.0.4", default-features = false, features = ["std"] }
|
|
ruff = { version = "0.16.8", path = "crates/ruff" }
|
|
ruff_annotate_snippets = { version = "0.0.14", path = "crates/ruff_annotate_snippets" }
|
|
ruff_cache = { version = "0.0.14", path = "crates/ruff_cache" }
|
|
ruff_db = { version = "0.0.14", path = "crates/ruff_db", default-features = false }
|
|
ruff_diagnostics = { version = "0.0.14", path = "crates/ruff_diagnostics" }
|
|
ruff_formatter = { version = "0.0.14", path = "crates/ruff_formatter" }
|
|
ruff_graph = { version = "0.0.14", path = "crates/ruff_graph" }
|
|
ruff_index = { version = "0.0.14", path = "crates/ruff_index" }
|
|
ruff_linter = { version = "0.16.8", path = "crates/ruff_linter" }
|
|
ruff_macros = { version = "0.0.14", path = "crates/ruff_macros" }
|
|
ruff_markdown = { version = "0.0.14", path = "crates/ruff_markdown" }
|
|
ruff_memory_usage = { version = "0.0.14", path = "crates/ruff_memory_usage" }
|
|
ruff_notebook = { version = "0.0.14", path = "crates/ruff_notebook" }
|
|
ruff_options_metadata = { version = "0.0.14", path = "crates/ruff_options_metadata" }
|
|
ruff_python_ast = { version = "0.0.14", path = "crates/ruff_python_ast" }
|
|
ruff_python_codegen = { version = "0.0.14", path = "crates/ruff_python_codegen" }
|
|
ruff_python_edits = { version = "0.0.14", path = "crates/ruff_python_edits" }
|
|
ruff_python_formatter = { version = "0.0.14", path = "crates/ruff_python_formatter" }
|
|
ruff_python_importer = { version = "0.0.14", path = "crates/ruff_python_importer" }
|
|
ruff_python_index = { version = "0.0.14", path = "crates/ruff_python_index" }
|
|
ruff_python_literal = { version = "0.0.14", path = "crates/ruff_python_literal" }
|
|
ruff_python_parser = { version = "0.0.14", path = "crates/ruff_python_parser" }
|
|
ruff_python_semantic = { version = "0.0.14", path = "crates/ruff_python_semantic" }
|
|
ruff_python_stdlib = { version = "0.0.14", path = "crates/ruff_python_stdlib" }
|
|
ruff_python_trivia = { version = "0.0.14", path = "crates/ruff_python_trivia" }
|
|
ruff_server = { version = "0.0.14", path = "crates/ruff_server" }
|
|
ruff_source_file = { version = "0.0.14", path = "crates/ruff_source_file" }
|
|
ruff_mdtest = { path = "crates/ruff_mdtest" }
|
|
ruff_ranged_value = { version = "0.0.14", path = "crates/ruff_ranged_value" }
|
|
ruff_text_size = { version = "0.0.14", path = "crates/ruff_text_size" }
|
|
ruff_workspace = { version = "0.0.14", path = "crates/ruff_workspace" }
|
|
|
|
ty = { path = "crates/ty" }
|
|
ty_combine = { version = "0.0.14", path = "crates/ty_combine" }
|
|
ty_completion_bench = { path = "crates/ty_completion_bench" }
|
|
ty_completion_eval = { path = "crates/ty_completion_eval" }
|
|
ty_ide = { path = "crates/ty_ide" }
|
|
ty_module_resolver = { version = "0.0.14", path = "crates/ty_module_resolver" }
|
|
ty_project = { path = "crates/ty_project", default-features = false }
|
|
ty_python_semantic = { version = "0.0.14", path = "crates/ty_python_semantic" }
|
|
ty_python_core = { version = "0.0.14", path = "crates/ty_python_core" }
|
|
ty_server = { path = "crates/ty_server" }
|
|
ty_site_packages = { version = "0.0.14", path = "crates/ty_site_packages" }
|
|
ty_static = { version = "0.0.14", path = "crates/ty_static" }
|
|
ty_test = { path = "crates/ty_test" }
|
|
ty_vendored = { version = "0.0.14", path = "crates/ty_vendored" }
|
|
|
|
mdtest = { path = "crates/mdtest" }
|
|
|
|
aho-corasick = { version = "1.1.3", default-features = false, features = ["perf-literal", "std"] }
|
|
arrayvec = { version = "0.7.6", default-features = false }
|
|
anstream = { version = "1.0.0", default-features = false, features = ["auto", "wincon"] }
|
|
anstyle = { version = "1.0.10", default-features = false, features = ["std"] }
|
|
anyhow = { version = "1.0.80", default-features = false, features = ["std"] }
|
|
arc-swap = { version = "1.7.1", default-features = false }
|
|
argfile = { version = "1.0.0", default-features = false }
|
|
assert_fs = { version = "1.1.0", default-features = false }
|
|
rkyv = { version = "0.8.16", default-features = false, features = ["bytecheck", "std"] }
|
|
bitflags = { version = "2.5.0", default-features = false }
|
|
bitvec = { version = "1.0.1", default-features = false, features = [
|
|
"alloc",
|
|
] }
|
|
bstr = { version = "1.9.1", default-features = false, features = ["std"] }
|
|
cachedir = { version = "0.3.1", default-features = false }
|
|
camino = { version = "1.1.7", default-features = false }
|
|
clap = { version = "4.5.3", default-features = false, features = [
|
|
"color",
|
|
"derive",
|
|
"error-context",
|
|
"help",
|
|
"std",
|
|
"suggestions",
|
|
"usage",
|
|
] }
|
|
clap_complete_command = { version = "0.6.0", default-features = false, features = ["nushell"] }
|
|
clearscreen = { version = "4.0.0", default-features = false }
|
|
codspeed-criterion-compat = { version = "5.0.0", default-features = false }
|
|
colored = { version = "3.0.0", default-features = false }
|
|
compact_str = { version = "0.10.0", default-features = false, features = ["std"] }
|
|
console_error_panic_hook = { version = "0.1.7", default-features = false }
|
|
console_log = { version = "1.0.0", default-features = false }
|
|
countme = { version = "3.0.1", default-features = false }
|
|
criterion = { version = "0.8.0", default-features = false }
|
|
crossbeam = { version = "0.8.4", default-features = false, features = ["std"] }
|
|
csv = { version = "1.3.1", default-features = false }
|
|
dashmap = { version = "6.0.1", default-features = false }
|
|
datatest-stable = { version = "0.3.3", default-features = false }
|
|
divan = { package = "codspeed-divan-compat", version = "5.0.0", default-features = false }
|
|
drop_bomb = { version = "0.1.5", default-features = false }
|
|
dunce = { version = "1.0.5", default-features = false }
|
|
etcetera = { version = "0.11.0", default-features = false }
|
|
fern = { version = "0.7.0", default-features = false }
|
|
filetime = { version = "0.2.23", default-features = false }
|
|
get-size2 = { version = "0.11.0", default-features = false, features = [
|
|
"compact-str",
|
|
"derive",
|
|
"hashbrown",
|
|
"ordermap",
|
|
"smallvec",
|
|
"std",
|
|
"thin-vec",
|
|
] }
|
|
glob = { version = "0.3.1", default-features = false }
|
|
globset = { version = "0.4.14", default-features = false, features = ["log"] }
|
|
globwalk = { version = "0.9.1", default-features = false }
|
|
hashbrown = { version = "0.17.0", default-features = false, features = [
|
|
"inline-more",
|
|
] }
|
|
heck = { version = "0.5.0", default-features = false }
|
|
icu_properties = { version = "2.1.2", default-features = false, features = ["compiled_data"] }
|
|
ignore = { version = "0.4.30", default-features = false }
|
|
imara-diff = { version = "0.2.0", default-features = false }
|
|
imperative = { version = "1.0.4", default-features = false }
|
|
indexmap = { version = "2.6.0", default-features = false, features = ["std"] }
|
|
indicatif = { version = "0.18.0", default-features = false, features = ["unicode-width"] }
|
|
indoc = { version = "2.0.4", default-features = false }
|
|
insta = { version = "1.35.1", default-features = false, features = ["colors"] }
|
|
insta-cmd = { version = "0.7.0", default-features = false }
|
|
is-macro = { version = "0.3.5", default-features = false }
|
|
itertools = { version = "0.15.0", default-features = false, features = ["use_std"] }
|
|
jiff = { version = "0.2.0", default-features = false, features = [
|
|
"perf-inline",
|
|
"std",
|
|
"tz-fat",
|
|
"tz-system",
|
|
"tzdb-bundle-platform",
|
|
"tzdb-concatenated",
|
|
"tzdb-zoneinfo",
|
|
] }
|
|
jod-thread = { version = "1.0.0", default-features = false }
|
|
js-sys = { version = "0.3.69", default-features = false, features = ["std"] }
|
|
libc = { version = "0.2.153", default-features = false, features = ["std"] }
|
|
libcst = { version = "1.9.0", default-features = false }
|
|
log = { version = "0.4.17", default-features = false }
|
|
lsp-server = { version = "0.10.0", default-features = false }
|
|
lsp-types = { package = "gen-lsp-types", version = "0.11.0", default-features = false, features = ["url"] }
|
|
matchit = { version = "0.9.0", default-features = false }
|
|
memchr = { version = "2.7.1", default-features = false, features = ["std"] }
|
|
# mimalloc v3.3.2 crashes on Windows CPUs that do not support POPCNT.
|
|
# Fixed in mimalloc v3.4.0: https://github.com/microsoft/mimalloc/issues/1291
|
|
# Keep v2 until an updated Rust crate includes the fix.
|
|
mimalloc = { version = "0.1.52", default-features = false, features = ["v2"] }
|
|
natord = { version = "1.0.9", default-features = false }
|
|
notify = { version = "8.0.0", default-features = false, features = ["macos_fsevent"] }
|
|
ordermap = { version = "1.0.0", default-features = false, features = ["std"] }
|
|
parking_lot = { version = "0.12.4", default-features = false }
|
|
path-absolutize = { version = "4.0.0", default-features = false }
|
|
path-slash = { version = "0.2.1", default-features = false }
|
|
pathdiff = { version = "0.2.1", default-features = false }
|
|
pep440_rs = { version = "0.7.1", default-features = false }
|
|
pretty_assertions = { version = "1.3.0", default-features = false, features = ["std"] }
|
|
proc-macro2 = { version = "1.0.79", default-features = false, features = ["proc-macro"] }
|
|
pyproject-toml = { version = "0.13.4", default-features = false }
|
|
quick-junit = { version = "0.6.0", default-features = false }
|
|
quickcheck = { version = "1.0.3", default-features = false }
|
|
quickcheck_macros = { version = "1.0.0", default-features = false }
|
|
quote = { version = "1.0.23", default-features = false, features = ["proc-macro"] }
|
|
rand = { version = "0.10.0", default-features = false, features = ["std_rng"] }
|
|
rayon = { version = "1.10.0", default-features = false }
|
|
regex = { version = "1.10.2", default-features = false, features = ["perf", "std", "unicode"] }
|
|
regex-automata = { version = "0.4.9", default-features = false, features = [
|
|
"dfa-build",
|
|
"dfa-search",
|
|
"perf",
|
|
"std",
|
|
"syntax",
|
|
] }
|
|
regex-syntax = { version = "0.8.8", default-features = false }
|
|
rustc-hash = { version = "2.0.0", default-features = false, features = ["std"] }
|
|
rustc-stable-hash = { version = "0.1.2", default-features = false }
|
|
# When updating salsa, make sure to also update the version in `fuzz/Cargo.toml`
|
|
salsa = { version = "0.28.2", default-features = false, features = [
|
|
"compact_str",
|
|
"macros",
|
|
"salsa_unstable",
|
|
"inventory",
|
|
] }
|
|
same-file = { version = "1.0.6", default-features = false }
|
|
schemars = { version = "1.0.4", default-features = false, features = ["derive", "std"] }
|
|
seahash = { version = "4.1.0", default-features = false }
|
|
serde = { version = "1.0.197", default-features = false, features = ["derive", "std"] }
|
|
serde-wasm-bindgen = { version = "0.6.4", default-features = false }
|
|
serde_json = { version = "1.0.113", default-features = false, features = ["std"] }
|
|
serde_test = { version = "1.0.152", default-features = false }
|
|
shellexpand = { version = "3.0.0", default-features = false, features = ["base-0", "tilde"] }
|
|
similar = { version = "3.0.0", default-features = false, features = ["inline", "std", "text"] }
|
|
smallvec = { version = "1.13.2", default-features = false, features = ["union", "const_generics", "const_new"] }
|
|
snapbox = { version = "1.0.0", default-features = false, features = [
|
|
"color-auto",
|
|
"diff",
|
|
"term-svg",
|
|
"cmd",
|
|
"examples",
|
|
] }
|
|
static_assertions = { version = "1.1.0", default-features = false }
|
|
stacker = { version = "0.1.24", default-features = false }
|
|
strum = { version = "0.28.0", default-features = false, features = ["std", "strum_macros"] }
|
|
strum_macros = { version = "0.28.0", default-features = false }
|
|
supports-hyperlinks = { version = "3.1.0", default-features = false }
|
|
syn = { version = "3.0.0", default-features = false, features = [
|
|
"clone-impls",
|
|
"derive",
|
|
"parsing",
|
|
"printing",
|
|
"proc-macro",
|
|
] }
|
|
tempfile = { version = "3.9.0", default-features = false, features = ["getrandom"] }
|
|
test-case = { version = "3.3.1", default-features = false }
|
|
thiserror = { version = "2.0.0", default-features = false, features = ["std"] }
|
|
thin-vec = { version = "0.2.14", default-features = false, features = ["std"] }
|
|
tikv-jemallocator = { version = "0.6.0", default-features = false, features = ["background_threads_runtime_support"] }
|
|
toml = { version = "1.0.0", default-features = false, features = ["display", "parse", "serde", "std"] }
|
|
toml_parser = { version = "1.0.0", default-features = false, features = ["std"] }
|
|
tracing = { version = "0.1.40", default-features = false, features = ["attributes", "std"] }
|
|
tracing-flame = { version = "0.2.0", default-features = false, features = ["smallvec"] }
|
|
tracing-indicatif = { version = "0.3.11", default-features = false }
|
|
tracing-log = { version = "0.2.0", default-features = false, features = ["log-tracer", "std"] }
|
|
tracing-subscriber = { version = "0.3.18", default-features = false, features = [
|
|
"env-filter",
|
|
"fmt",
|
|
"ansi",
|
|
"smallvec",
|
|
] }
|
|
typed-arena = { version = "2.0.2", default-features = false, features = ["std"] }
|
|
unicode-ident = { version = "1.0.12", default-features = false }
|
|
unicode-normalization = { version = "0.1.23", default-features = false, features = ["std"] }
|
|
unicode-width = { version = "0.2.0", default-features = false }
|
|
unicode_names2 = { version = "1.2.2", default-features = false }
|
|
url = { version = "2.5.0", default-features = false, features = ["std"] }
|
|
uuid = { version = "1.6.1", default-features = false, features = ["std"] }
|
|
walkdir = { version = "2.3.2", default-features = false }
|
|
wasm-bindgen = { version = "0.2.92", default-features = false, features = ["std"] }
|
|
wasm-bindgen-test = { version = "0.3.42", default-features = false, features = ["std"] }
|
|
which = { version = "8.0.0", default-features = false, features = ["real-sys"] }
|
|
wild = { version = "2", default-features = false }
|
|
zip = { version = "8.0", default-features = false }
|
|
|
|
[workspace.metadata.cargo-shear]
|
|
ignored = [
|
|
"ruff_mdtest",
|
|
"ty_completion_bench",
|
|
"ty_completion_eval",
|
|
]
|
|
|
|
[workspace.lints.rust]
|
|
unsafe_code = "warn"
|
|
unreachable_pub = "warn"
|
|
unexpected_cfgs = { level = "warn", check-cfg = [
|
|
"cfg(fuzzing)",
|
|
"cfg(codspeed)",
|
|
] }
|
|
|
|
[workspace.lints.clippy]
|
|
pedantic = { level = "warn", priority = -2 }
|
|
# Enabled at the crate level
|
|
disallowed_methods = "allow"
|
|
# Allowed pedantic lints
|
|
char_lit_as_u8 = "allow"
|
|
collapsible_else_if = "allow"
|
|
collapsible_if = "allow"
|
|
implicit_hasher = "allow"
|
|
map_unwrap_or = "allow"
|
|
match_same_arms = "allow"
|
|
missing_errors_doc = "allow"
|
|
missing_panics_doc = "allow"
|
|
module_name_repetitions = "allow"
|
|
must_use_candidate = "allow"
|
|
similar_names = "allow"
|
|
single_match_else = "allow"
|
|
too_many_lines = "allow"
|
|
collapsible_match = "allow" # Not always an improvement in readability, quite opinionated
|
|
needless_continue = "allow" # An explicit continue can be more readable, especially if the alternative is an empty block.
|
|
unnecessary_debug_formatting = "allow" # too many instances, the display also doesn't quote the path which is often desired in logs where we use them the most often.
|
|
# Without the hashes we run into a `rustfmt` bug in some snapshot tests, see #13250
|
|
needless_raw_string_hashes = "allow"
|
|
# Disallowed restriction lints
|
|
ignore_without_reason = "allow" # Too many existing instances, and there's no auto fix.
|
|
iter_over_hash_type = "warn"
|
|
print_stdout = "warn"
|
|
print_stderr = "warn"
|
|
dbg_macro = "warn"
|
|
empty_drop = "warn"
|
|
empty_structs_with_brackets = "warn"
|
|
exit = "warn"
|
|
get_unwrap = "warn"
|
|
rc_buffer = "warn"
|
|
rc_mutex = "warn"
|
|
rest_pat_in_fully_bound_structs = "warn"
|
|
# nursery rules
|
|
redundant_clone = "warn"
|
|
debug_assert_with_mut_call = "warn"
|
|
unused_peekable = "warn"
|
|
# This lint sometimes flags code whose `if` and `else`
|
|
# bodies could be flipped when a `!` operator is removed.
|
|
# While perhaps sometimes a good idea, it is also often
|
|
# not a good idea due to other factors impacting
|
|
# readability. For example, if flipping the bodies results
|
|
# in the `if` being an order of magnitude bigger than the
|
|
# `else`, then some might consider that harder to read.
|
|
if_not_else = "allow"
|
|
|
|
[profile.release]
|
|
lto = "fat"
|
|
codegen-units = 16
|
|
|
|
# Some crates don't change as much but benefit more from
|
|
# more expensive optimization passes, so we selectively
|
|
# decrease codegen-units in some cases.
|
|
[profile.release.package.ruff_python_parser]
|
|
codegen-units = 1
|
|
[profile.release.package.ruff_python_ast]
|
|
codegen-units = 1
|
|
[profile.release.package.salsa]
|
|
codegen-units = 1
|
|
|
|
# Profile to build a minimally sized binary for ruff/ty
|
|
[profile.minimal-size]
|
|
inherits = "release"
|
|
opt-level = "z"
|
|
codegen-units = 1
|
|
|
|
[profile.dev]
|
|
opt-level = 1
|
|
debug = "line-tables-only"
|
|
# Avoid the local ThinLTO that Cargo enables at nonzero optimization levels.
|
|
lto = "off"
|
|
|
|
[profile.dev.package.insta]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.similar]
|
|
opt-level = 3
|
|
|
|
[profile.dev.package.salsa]
|
|
opt-level = 3
|
|
|
|
# Reduce complexity of a parser function that would trigger a locals limit in a wasm tool.
|
|
# https://github.com/bytecodealliance/wasm-tools/blob/b5c3d98e40590512a3b12470ef358d5c7b983b15/crates/wasmparser/src/limits.rs#L29
|
|
[profile.dev.package.ruff_python_parser]
|
|
opt-level = 1
|
|
|
|
# This profile is meant to mimic the `release` profile as closely as
|
|
# possible, but using settings that are more beneficial for iterative
|
|
# development. That is, the `release` profile is intended for actually
|
|
# building the release, where as `profiling` is meant for building ty/ruff
|
|
# for running benchmarks.
|
|
#
|
|
# The main differences here are to avoid stripping debug information
|
|
# and disabling fat lto. This does result in a mismatch between our release
|
|
# configuration and our benchmarking configuration, which is unfortunate.
|
|
# But compile times with `lto = fat` are completely untenable.
|
|
#
|
|
# This setup does risk that we are measuring something in benchmarks
|
|
# that we aren't shipping, but in order to make those two the same, we'd
|
|
# either need to make compile times way worse for development, or take
|
|
# a hit to binary size and a slight hit to runtime performance in our
|
|
# release builds.
|
|
#
|
|
# Use the `--profile profiling` flag to show symbols in release mode.
|
|
# e.g. `cargo build --profile profiling`
|
|
[profile.profiling]
|
|
inherits = "release"
|
|
strip = false
|
|
debug = "full"
|
|
lto = false
|
|
|
|
# Profile for faster iteration: applies minimal optimizations for faster tests.
|
|
[profile.fast-test]
|
|
inherits = "dev"
|
|
opt-level = 1
|
|
debug = "line-tables-only"
|
|
# Avoid the local ThinLTO that Cargo enables at nonzero optimization levels.
|
|
lto = "off"
|
|
|
|
# The profile that 'cargo dist' will build with.
|
|
[profile.dist]
|
|
inherits = "release"
|