Compare commits
60 Commits
cjm/displa
...
bump-allo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
56edbef069 | ||
|
|
ab9b01b0c4 | ||
|
|
678f8732e4 | ||
|
|
811dd2bb68 | ||
|
|
a3e67abf4c | ||
|
|
ee0518e8f7 | ||
|
|
d774a3bd48 | ||
|
|
7e6b19048e | ||
|
|
8e383b9587 | ||
|
|
3f49ab126f | ||
|
|
c1bc7f4dee | ||
|
|
a44d579f21 | ||
|
|
a3900d2b0b | ||
|
|
83b1c48a93 | ||
|
|
138e70bd5c | ||
|
|
ee103ffb25 | ||
|
|
18f87b9497 | ||
|
|
adc8d4e1e7 | ||
|
|
90db361199 | ||
|
|
4738135801 | ||
|
|
264cd750e9 | ||
|
|
7a4419a2a5 | ||
|
|
ac1666d6e2 | ||
|
|
459c85ba27 | ||
|
|
aaa56eb0bd | ||
|
|
f3c14a4276 | ||
|
|
3169d408fa | ||
|
|
a2286c8e47 | ||
|
|
fb9f566f56 | ||
|
|
381bd1ff4a | ||
|
|
2f54d05d97 | ||
|
|
e18b4e42d3 | ||
|
|
9495331a5f | ||
|
|
e1076db7d0 | ||
|
|
1986c9e8e2 | ||
|
|
d7e80dc955 | ||
|
|
87d09f77cd | ||
|
|
bd37ef13b8 | ||
|
|
ec23c974db | ||
|
|
122e5ab428 | ||
|
|
2f2149aca8 | ||
|
|
9d5c31e7da | ||
|
|
25f3ad6238 | ||
|
|
79926329a4 | ||
|
|
9cdc578dd9 | ||
|
|
665c75f7ab | ||
|
|
f37b39d6cc | ||
|
|
e18c45c310 | ||
|
|
d930052de8 | ||
|
|
7ad4df9e9f | ||
|
|
425761e960 | ||
|
|
4b69271809 | ||
|
|
bf23d38a21 | ||
|
|
49f51583fa | ||
|
|
1fe4a5faed | ||
|
|
998bfe0847 | ||
|
|
6f4db8675b | ||
|
|
71f7aa4971 | ||
|
|
9f72f474e6 | ||
|
|
10c993e21a |
4
.github/workflows/ci.yaml
vendored
4
.github/workflows/ci.yaml
vendored
@@ -616,10 +616,10 @@ jobs:
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
|
||||
- name: "Build benchmarks"
|
||||
run: cargo codspeed build --features codspeed -p ruff_benchmark
|
||||
run: cargo codspeed build -p ruff_benchmark
|
||||
|
||||
- name: "Run benchmarks"
|
||||
uses: CodSpeedHQ/action@v2
|
||||
uses: CodSpeedHQ/action@v3
|
||||
with:
|
||||
run: cargo codspeed run
|
||||
token: ${{ secrets.CODSPEED_TOKEN }}
|
||||
|
||||
2
.github/workflows/pr-comment.yaml
vendored
2
.github/workflows/pr-comment.yaml
vendored
@@ -23,6 +23,7 @@ jobs:
|
||||
name: pr-number
|
||||
run_id: ${{ github.event.workflow_run.id || github.event.inputs.workflow_run_id }}
|
||||
if_no_artifact_found: ignore
|
||||
allow_forks: true
|
||||
|
||||
- name: Parse pull request number
|
||||
id: pr-number
|
||||
@@ -43,6 +44,7 @@ jobs:
|
||||
path: pr/ecosystem
|
||||
workflow_conclusion: completed
|
||||
if_no_artifact_found: ignore
|
||||
allow_forks: true
|
||||
|
||||
- name: Generate comment content
|
||||
id: generate-comment
|
||||
|
||||
@@ -43,7 +43,7 @@ repos:
|
||||
)$
|
||||
|
||||
- repo: https://github.com/crate-ci/typos
|
||||
rev: v1.23.2
|
||||
rev: v1.23.5
|
||||
hooks:
|
||||
- id: typos
|
||||
|
||||
@@ -57,7 +57,7 @@ repos:
|
||||
pass_filenames: false # This makes it a lot faster
|
||||
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: v0.5.4
|
||||
rev: v0.5.5
|
||||
hooks:
|
||||
- id: ruff-format
|
||||
- id: ruff
|
||||
|
||||
204
Cargo.lock
generated
204
Cargo.lock
generated
@@ -141,9 +141,9 @@ checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457"
|
||||
|
||||
[[package]]
|
||||
name = "argfile"
|
||||
version = "0.2.0"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b7c5c8e418080ef8aa932039d12eda7b6f5043baf48f1523c166fbc32d004534"
|
||||
checksum = "0a1cc0ba69de57db40674c66f7cf2caee3981ddef084388482c95c0e2133e5e8"
|
||||
dependencies = [
|
||||
"fs-err",
|
||||
"os_str_bytes",
|
||||
@@ -189,10 +189,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
|
||||
|
||||
[[package]]
|
||||
name = "bstr"
|
||||
version = "1.9.1"
|
||||
name = "boomphf"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706"
|
||||
checksum = "617e2d952880a00583ddb9237ac3965732e8df6a92a8e7bcc054100ec467ec3b"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
"log",
|
||||
"rayon",
|
||||
"wyhash",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bstr"
|
||||
version = "1.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"regex-automata 0.4.6",
|
||||
@@ -314,9 +326,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "4.5.9"
|
||||
version = "4.5.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "64acc1846d54c1fe936a78dc189c34e28d3f5afc348403f28ecf53660b9b8462"
|
||||
checksum = "35723e6a11662c2afb578bcf0b88bf6ea8e21282a953428f240574fcc3a2b5b3"
|
||||
dependencies = [
|
||||
"clap_builder",
|
||||
"clap_derive",
|
||||
@@ -324,9 +336,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap_builder"
|
||||
version = "4.5.9"
|
||||
version = "4.5.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6fb8393d67ba2e7bfaf28a23458e4e2b543cc73a99595511eb207fdb8aede942"
|
||||
checksum = "49eb96cbfa7cfa35017b7cd548c75b14c3118c98b423041d70562665e07fb0fa"
|
||||
dependencies = [
|
||||
"anstream",
|
||||
"anstyle",
|
||||
@@ -367,9 +379,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap_derive"
|
||||
version = "4.5.8"
|
||||
version = "4.5.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085"
|
||||
checksum = "5d029b67f89d30bbb547c89fd5161293c0aec155fc691d7924b64550662db93e"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro2",
|
||||
@@ -759,9 +771,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "env_logger"
|
||||
version = "0.11.3"
|
||||
version = "0.11.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9"
|
||||
checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d"
|
||||
dependencies = [
|
||||
"anstream",
|
||||
"anstyle",
|
||||
@@ -930,9 +942,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "hashlink"
|
||||
version = "0.8.4"
|
||||
version = "0.9.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7"
|
||||
checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af"
|
||||
dependencies = [
|
||||
"hashbrown",
|
||||
]
|
||||
@@ -1021,9 +1033,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "imara-diff"
|
||||
version = "0.1.6"
|
||||
version = "0.1.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "af13c8ceb376860ff0c6a66d83a8cdd4ecd9e464da24621bbffcd02b49619434"
|
||||
checksum = "fc9da1a252bd44cd341657203722352efc9bc0c847d06ea6d2dc1cd1135e0a01"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"hashbrown",
|
||||
@@ -1031,9 +1043,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "imperative"
|
||||
version = "1.0.5"
|
||||
version = "1.0.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8b70798296d538cdaa6d652941fcc795963f8b9878b9e300c9fab7a522bd2fc0"
|
||||
checksum = "29a1f6526af721f9aec9ceed7ab8ebfca47f3399d08b80056c2acca3fcb694a9"
|
||||
dependencies = [
|
||||
"phf",
|
||||
"rust-stemmers",
|
||||
@@ -1526,10 +1538,84 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "os_str_bytes"
|
||||
version = "6.6.1"
|
||||
name = "orx-concurrent-ordered-bag"
|
||||
version = "2.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1"
|
||||
checksum = "9aa866e2be4aa03927eddb481e7c479d5109fe3121324fb7db6d97f91adf9876"
|
||||
dependencies = [
|
||||
"orx-fixed-vec",
|
||||
"orx-pinned-concurrent-col",
|
||||
"orx-pinned-vec",
|
||||
"orx-pseudo-default",
|
||||
"orx-split-vec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "orx-concurrent-vec"
|
||||
version = "2.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c5912426ffb660f8b61e8f0812a1d07400803cd5513969d2c7af4d69602ba8a1"
|
||||
dependencies = [
|
||||
"orx-concurrent-ordered-bag",
|
||||
"orx-fixed-vec",
|
||||
"orx-pinned-concurrent-col",
|
||||
"orx-pinned-vec",
|
||||
"orx-pseudo-default",
|
||||
"orx-split-vec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "orx-fixed-vec"
|
||||
version = "3.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f69466c7c1fc2e1f00b58e39059b78c438b9fad144d1937ef177ecfc413e997"
|
||||
dependencies = [
|
||||
"orx-pinned-vec",
|
||||
"orx-pseudo-default",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "orx-pinned-concurrent-col"
|
||||
version = "2.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fdbcb1fa05dc1676f1c9cf19f443b3d2d2ca5835911477d22fa77cad8b79208d"
|
||||
dependencies = [
|
||||
"orx-fixed-vec",
|
||||
"orx-pinned-vec",
|
||||
"orx-pseudo-default",
|
||||
"orx-split-vec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "orx-pinned-vec"
|
||||
version = "3.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c1071baf586de45722668234bddf56c52c1ece6a6153d16541bbb0505f0ac055"
|
||||
dependencies = [
|
||||
"orx-pseudo-default",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "orx-pseudo-default"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a2f627c439e723fa78e410a0faba89047a8a47d0dc013da5c0e05806e8a6cddb"
|
||||
|
||||
[[package]]
|
||||
name = "orx-split-vec"
|
||||
version = "3.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "52b9dbfa8c7069ae73a890870d3aa9097a897d616751d3d0278f2b42d5214730"
|
||||
dependencies = [
|
||||
"orx-pinned-vec",
|
||||
"orx-pseudo-default",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "os_str_bytes"
|
||||
version = "7.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7ac44c994af577c799b1b4bd80dc214701e349873ad894d6cdf96f4f7526e0b9"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
@@ -1858,6 +1944,7 @@ dependencies = [
|
||||
"countme",
|
||||
"crossbeam",
|
||||
"ctrlc",
|
||||
"filetime",
|
||||
"notify",
|
||||
"rayon",
|
||||
"red_knot_module_resolver",
|
||||
@@ -2043,19 +2130,24 @@ dependencies = [
|
||||
"wild",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ruff_allocator"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ruff_benchmark"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"codspeed-criterion-compat",
|
||||
"criterion",
|
||||
"mimalloc",
|
||||
"once_cell",
|
||||
"red_knot",
|
||||
"ruff_allocator",
|
||||
"ruff_db",
|
||||
"ruff_linter",
|
||||
"ruff_python_ast",
|
||||
"ruff_python_formatter",
|
||||
"ruff_python_parser",
|
||||
"ruff_python_trivia",
|
||||
"serde",
|
||||
@@ -2088,6 +2180,9 @@ dependencies = [
|
||||
"filetime",
|
||||
"ignore",
|
||||
"insta",
|
||||
"matchit",
|
||||
"path-slash",
|
||||
"ruff_allocator",
|
||||
"ruff_cache",
|
||||
"ruff_notebook",
|
||||
"ruff_python_ast",
|
||||
@@ -2206,6 +2301,7 @@ dependencies = [
|
||||
"pyproject-toml",
|
||||
"quick-junit",
|
||||
"regex",
|
||||
"ruff_allocator",
|
||||
"ruff_cache",
|
||||
"ruff_diagnostics",
|
||||
"ruff_macros",
|
||||
@@ -2232,6 +2328,7 @@ dependencies = [
|
||||
"thiserror",
|
||||
"toml",
|
||||
"typed-arena",
|
||||
"unicode-normalization",
|
||||
"unicode-width",
|
||||
"unicode_names2",
|
||||
"url",
|
||||
@@ -2277,6 +2374,7 @@ dependencies = [
|
||||
"is-macro",
|
||||
"itertools 0.13.0",
|
||||
"once_cell",
|
||||
"ruff_allocator",
|
||||
"ruff_cache",
|
||||
"ruff_macros",
|
||||
"ruff_python_trivia",
|
||||
@@ -2303,6 +2401,7 @@ name = "ruff_python_codegen"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"once_cell",
|
||||
"ruff_allocator",
|
||||
"ruff_python_ast",
|
||||
"ruff_python_literal",
|
||||
"ruff_python_parser",
|
||||
@@ -2373,6 +2472,7 @@ dependencies = [
|
||||
"compact_str",
|
||||
"insta",
|
||||
"memchr",
|
||||
"ruff_allocator",
|
||||
"ruff_python_ast",
|
||||
"ruff_python_trivia",
|
||||
"ruff_source_file",
|
||||
@@ -2401,13 +2501,17 @@ version = "0.0.0"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"is-macro",
|
||||
"ruff_cache",
|
||||
"ruff_index",
|
||||
"ruff_macros",
|
||||
"ruff_python_ast",
|
||||
"ruff_python_parser",
|
||||
"ruff_python_stdlib",
|
||||
"ruff_source_file",
|
||||
"ruff_text_size",
|
||||
"rustc-hash 2.0.0",
|
||||
"schemars",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2540,6 +2644,7 @@ dependencies = [
|
||||
"ruff_macros",
|
||||
"ruff_python_ast",
|
||||
"ruff_python_formatter",
|
||||
"ruff_python_semantic",
|
||||
"ruff_source_file",
|
||||
"rustc-hash 2.0.0",
|
||||
"schemars",
|
||||
@@ -2632,25 +2737,34 @@ checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1"
|
||||
[[package]]
|
||||
name = "salsa"
|
||||
version = "0.18.0"
|
||||
source = "git+https://github.com/salsa-rs/salsa.git?rev=a1bf3a613f451af7fc0a59411c56abc47fe8e8e1#a1bf3a613f451af7fc0a59411c56abc47fe8e8e1"
|
||||
source = "git+https://github.com/MichaReiser/salsa.git?rev=0cae5c52a3240172ef0be5c9d19e63448c53397c#0cae5c52a3240172ef0be5c9d19e63448c53397c"
|
||||
dependencies = [
|
||||
"arc-swap",
|
||||
"boomphf",
|
||||
"crossbeam",
|
||||
"dashmap 5.5.3",
|
||||
"dashmap 6.0.1",
|
||||
"hashlink",
|
||||
"indexmap",
|
||||
"log",
|
||||
"orx-concurrent-vec",
|
||||
"parking_lot",
|
||||
"rustc-hash 1.1.0",
|
||||
"rustc-hash 2.0.0",
|
||||
"salsa-macro-rules",
|
||||
"salsa-macros",
|
||||
"smallvec",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "salsa-macro-rules"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/MichaReiser/salsa.git?rev=0cae5c52a3240172ef0be5c9d19e63448c53397c#0cae5c52a3240172ef0be5c9d19e63448c53397c"
|
||||
|
||||
[[package]]
|
||||
name = "salsa-macros"
|
||||
version = "0.18.0"
|
||||
source = "git+https://github.com/salsa-rs/salsa.git?rev=a1bf3a613f451af7fc0a59411c56abc47fe8e8e1#a1bf3a613f451af7fc0a59411c56abc47fe8e8e1"
|
||||
source = "git+https://github.com/MichaReiser/salsa.git?rev=0cae5c52a3240172ef0be5c9d19e63448c53397c#0cae5c52a3240172ef0be5c9d19e63448c53397c"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
@@ -2752,11 +2866,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.120"
|
||||
version = "1.0.121"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5"
|
||||
checksum = "4ab380d7d9f22ef3f21ad3e6c1ebe8e4fc7a2000ccba2e4d71fc96f15b2cb609"
|
||||
dependencies = [
|
||||
"itoa",
|
||||
"memchr",
|
||||
"ryu",
|
||||
"serde",
|
||||
]
|
||||
@@ -2774,9 +2889,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "serde_spanned"
|
||||
version = "0.6.6"
|
||||
version = "0.6.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0"
|
||||
checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
@@ -3077,9 +3192,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
|
||||
|
||||
[[package]]
|
||||
name = "toml"
|
||||
version = "0.8.15"
|
||||
version = "0.8.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ac2caab0bf757388c6c0ae23b3293fdb463fee59434529014f85e3263b995c28"
|
||||
checksum = "81967dd0dd2c1ab0bc3468bd7caecc32b8a4aa47d0c8c695d8c2b2108168d62c"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_spanned",
|
||||
@@ -3089,18 +3204,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "toml_datetime"
|
||||
version = "0.6.6"
|
||||
version = "0.6.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf"
|
||||
checksum = "f8fb9f64314842840f1d940ac544da178732128f1c78c21772e876579e0da1db"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_edit"
|
||||
version = "0.22.16"
|
||||
version = "0.22.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "278f3d518e152219c994ce877758516bca5e118eaed6996192a774fb9fbf0788"
|
||||
checksum = "8d9f8729f5aea9562aac1cc0441f5d6de3cff1ee0c5d67293eeca5eb36ee7c16"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"serde",
|
||||
@@ -3747,6 +3862,15 @@ version = "0.0.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904"
|
||||
|
||||
[[package]]
|
||||
name = "wyhash"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "baf6e163c25e3fac820b4b453185ea2dea3b6a3e0a721d4d23d75bd33734c295"
|
||||
dependencies = [
|
||||
"rand_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "yansi"
|
||||
version = "0.5.1"
|
||||
|
||||
@@ -4,7 +4,7 @@ resolver = "2"
|
||||
|
||||
[workspace.package]
|
||||
edition = "2021"
|
||||
rust-version = "1.75"
|
||||
rust-version = "1.76"
|
||||
homepage = "https://docs.astral.sh/ruff"
|
||||
documentation = "https://docs.astral.sh/ruff"
|
||||
repository = "https://github.com/astral-sh/ruff"
|
||||
@@ -13,6 +13,7 @@ license = "MIT"
|
||||
|
||||
[workspace.dependencies]
|
||||
ruff = { path = "crates/ruff" }
|
||||
ruff_allocator = { path = "crates/ruff_allocator" }
|
||||
ruff_cache = { path = "crates/ruff_cache" }
|
||||
ruff_db = { path = "crates/ruff_db" }
|
||||
ruff_diagnostics = { path = "crates/ruff_diagnostics" }
|
||||
@@ -46,6 +47,7 @@ argfile = { version = "0.2.0" }
|
||||
bincode = { version = "1.3.3" }
|
||||
bitflags = { version = "2.5.0" }
|
||||
bstr = { version = "1.9.1" }
|
||||
bumpalo = { version = "3.16.0" }
|
||||
cachedir = { version = "0.3.1" }
|
||||
camino = { version = "1.1.7" }
|
||||
chrono = { version = "0.4.35", default-features = false, features = ["clock"] }
|
||||
@@ -58,7 +60,6 @@ console_error_panic_hook = { version = "0.1.7" }
|
||||
console_log = { version = "1.0.0" }
|
||||
countme = { version = "3.0.1" }
|
||||
compact_str = "0.8.0"
|
||||
criterion = { version = "0.5.1", default-features = false }
|
||||
crossbeam = { version = "0.8.4" }
|
||||
dashmap = { version = "6.0.1" }
|
||||
drop_bomb = { version = "0.1.5" }
|
||||
@@ -108,7 +109,7 @@ rand = { version = "0.8.5" }
|
||||
rayon = { version = "1.10.0" }
|
||||
regex = { version = "1.10.2" }
|
||||
rustc-hash = { version = "2.0.0" }
|
||||
salsa = { git = "https://github.com/salsa-rs/salsa.git", rev = "a1bf3a613f451af7fc0a59411c56abc47fe8e8e1" }
|
||||
salsa = { git = "https://github.com/MichaReiser/salsa.git", rev = "0cae5c52a3240172ef0be5c9d19e63448c53397c" }
|
||||
schemars = { version = "0.8.16" }
|
||||
seahash = { version = "4.1.0" }
|
||||
serde = { version = "1.0.197", features = ["derive"] }
|
||||
@@ -157,6 +158,7 @@ zip = { version = "0.6.6", default-features = false, features = ["zstd"] }
|
||||
[workspace.lints.rust]
|
||||
unsafe_code = "warn"
|
||||
unreachable_pub = "warn"
|
||||
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(fuzzing)'] }
|
||||
|
||||
[workspace.lints.clippy]
|
||||
pedantic = { level = "warn", priority = -2 }
|
||||
|
||||
@@ -424,6 +424,7 @@ Ruff is used by a number of major open-source projects and companies, including:
|
||||
- [Dagger](https://github.com/dagger/dagger)
|
||||
- [Dagster](https://github.com/dagster-io/dagster)
|
||||
- Databricks ([MLflow](https://github.com/mlflow/mlflow))
|
||||
- [Dify](https://github.com/langgenius/dify)
|
||||
- [FastAPI](https://github.com/tiangolo/fastapi)
|
||||
- [Godot](https://github.com/godotengine/godot)
|
||||
- [Gradio](https://github.com/gradio-app/gradio)
|
||||
|
||||
@@ -11,3 +11,11 @@ doc-valid-idents = [
|
||||
"SQLAlchemy",
|
||||
"StackOverflow",
|
||||
]
|
||||
|
||||
ignore-interior-mutability = [
|
||||
# Interned is read-only. The wrapped `Rc` never gets updated.
|
||||
"ruff_formatter::format_element::Interned",
|
||||
|
||||
# The expression is read-only.
|
||||
"ruff_python_ast::hashable::HashableExpr",
|
||||
]
|
||||
|
||||
@@ -27,6 +27,7 @@ notify = { workspace = true }
|
||||
rayon = { workspace = true }
|
||||
rustc-hash = { workspace = true }
|
||||
salsa = { workspace = true }
|
||||
filetime = { workspace = true }
|
||||
tracing = { workspace = true }
|
||||
tracing-subscriber = { workspace = true }
|
||||
tracing-tree = { workspace = true }
|
||||
|
||||
@@ -1,34 +1,25 @@
|
||||
use std::panic::{AssertUnwindSafe, RefUnwindSafe};
|
||||
use std::sync::Arc;
|
||||
|
||||
use salsa::{Cancelled, Database, DbWithJar};
|
||||
use salsa::Cancelled;
|
||||
|
||||
use red_knot_module_resolver::{vendored_typeshed_stubs, Db as ResolverDb, Jar as ResolverJar};
|
||||
use red_knot_python_semantic::{Db as SemanticDb, Jar as SemanticJar};
|
||||
use red_knot_module_resolver::{vendored_typeshed_stubs, Db as ResolverDb};
|
||||
use red_knot_python_semantic::Db as SemanticDb;
|
||||
use ruff_db::files::{File, Files};
|
||||
use ruff_db::program::{Program, ProgramSettings};
|
||||
use ruff_db::system::System;
|
||||
use ruff_db::vendored::VendoredFileSystem;
|
||||
use ruff_db::{Db as SourceDb, Jar as SourceJar, Upcast};
|
||||
use ruff_db::{Db as SourceDb, Upcast};
|
||||
|
||||
use crate::lint::{lint_semantic, lint_syntax, unwind_if_cancelled, Diagnostics};
|
||||
use crate::workspace::{check_file, Package, Package_files, Workspace, WorkspaceMetadata};
|
||||
use crate::lint::Diagnostics;
|
||||
use crate::workspace::{check_file, Workspace, WorkspaceMetadata};
|
||||
|
||||
mod changes;
|
||||
|
||||
pub trait Db: DbWithJar<Jar> + SemanticDb + Upcast<dyn SemanticDb> {}
|
||||
#[salsa::db]
|
||||
pub trait Db: SemanticDb + Upcast<dyn SemanticDb> {}
|
||||
|
||||
#[salsa::jar(db=Db)]
|
||||
pub struct Jar(
|
||||
Workspace,
|
||||
Package,
|
||||
Package_files,
|
||||
lint_syntax,
|
||||
lint_semantic,
|
||||
unwind_if_cancelled,
|
||||
);
|
||||
|
||||
#[salsa::db(SourceJar, ResolverJar, SemanticJar, Jar)]
|
||||
#[salsa::db]
|
||||
pub struct RootDatabase {
|
||||
workspace: Option<Workspace>,
|
||||
storage: salsa::Storage<RootDatabase>,
|
||||
@@ -127,10 +118,13 @@ impl Upcast<dyn ResolverDb> for RootDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
#[salsa::db]
|
||||
impl ResolverDb for RootDatabase {}
|
||||
|
||||
#[salsa::db]
|
||||
impl SemanticDb for RootDatabase {}
|
||||
|
||||
#[salsa::db]
|
||||
impl SourceDb for RootDatabase {
|
||||
fn vendored(&self) -> &VendoredFileSystem {
|
||||
vendored_typeshed_stubs()
|
||||
@@ -145,33 +139,23 @@ impl SourceDb for RootDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
impl Database for RootDatabase {}
|
||||
#[salsa::db]
|
||||
impl salsa::Database for RootDatabase {}
|
||||
|
||||
#[salsa::db]
|
||||
impl Db for RootDatabase {}
|
||||
|
||||
impl salsa::ParallelDatabase for RootDatabase {
|
||||
fn snapshot(&self) -> salsa::Snapshot<Self> {
|
||||
salsa::Snapshot::new(Self {
|
||||
workspace: self.workspace,
|
||||
storage: self.storage.snapshot(),
|
||||
files: self.files.snapshot(),
|
||||
system: self.system.clone(),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
pub(crate) mod tests {
|
||||
use red_knot_module_resolver::{vendored_typeshed_stubs, Db as ResolverDb, Jar as ResolverJar};
|
||||
use red_knot_python_semantic::{Db as SemanticDb, Jar as SemanticJar};
|
||||
use crate::db::Db;
|
||||
use red_knot_module_resolver::{vendored_typeshed_stubs, Db as ResolverDb};
|
||||
use red_knot_python_semantic::Db as SemanticDb;
|
||||
use ruff_db::files::Files;
|
||||
use ruff_db::system::{DbWithTestSystem, System, TestSystem};
|
||||
use ruff_db::vendored::VendoredFileSystem;
|
||||
use ruff_db::{Db as SourceDb, Jar as SourceJar, Upcast};
|
||||
use ruff_db::{Db as SourceDb, Upcast};
|
||||
|
||||
use super::{Db, Jar};
|
||||
|
||||
#[salsa::db(Jar, SemanticJar, ResolverJar, SourceJar)]
|
||||
#[salsa::db]
|
||||
pub(crate) struct TestDb {
|
||||
storage: salsa::Storage<Self>,
|
||||
files: Files,
|
||||
@@ -184,7 +168,7 @@ pub(crate) mod tests {
|
||||
Self {
|
||||
storage: salsa::Storage::default(),
|
||||
system: TestSystem::default(),
|
||||
vendored: vendored_typeshed_stubs().snapshot(),
|
||||
vendored: vendored_typeshed_stubs().clone(),
|
||||
files: Files::default(),
|
||||
}
|
||||
}
|
||||
@@ -200,6 +184,7 @@ pub(crate) mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
#[salsa::db]
|
||||
impl SourceDb for TestDb {
|
||||
fn vendored(&self) -> &VendoredFileSystem {
|
||||
&self.vendored
|
||||
@@ -241,20 +226,13 @@ pub(crate) mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
#[salsa::db]
|
||||
impl red_knot_module_resolver::Db for TestDb {}
|
||||
#[salsa::db]
|
||||
impl red_knot_python_semantic::Db for TestDb {}
|
||||
#[salsa::db]
|
||||
impl Db for TestDb {}
|
||||
|
||||
#[salsa::db]
|
||||
impl salsa::Database for TestDb {}
|
||||
|
||||
impl salsa::ParallelDatabase for TestDb {
|
||||
fn snapshot(&self) -> salsa::Snapshot<Self> {
|
||||
salsa::Snapshot::new(Self {
|
||||
storage: self.storage.snapshot(),
|
||||
files: self.files.snapshot(),
|
||||
system: self.system.snapshot(),
|
||||
vendored: self.vendored.snapshot(),
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -173,7 +173,7 @@ impl RootDatabase {
|
||||
let package = workspace.package(self, &path);
|
||||
let file = system_path_to_file(self, &path);
|
||||
|
||||
if let (Some(package), Some(file)) = (package, file) {
|
||||
if let (Some(package), Ok(file)) = (package, file) {
|
||||
package.add_file(self, file);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
use crate::db::Jar;
|
||||
|
||||
pub mod db;
|
||||
pub mod lint;
|
||||
pub mod watch;
|
||||
|
||||
@@ -38,7 +38,7 @@ pub(crate) fn lint_syntax(db: &dyn Db, file_id: File) -> Diagnostics {
|
||||
let source = source_text(db.upcast(), file_id);
|
||||
lint_lines(&source, &mut diagnostics);
|
||||
|
||||
let parsed = parsed_module(db.upcast(), file_id);
|
||||
let parsed = parsed_module(db.upcast(), file_id).parsed();
|
||||
|
||||
if parsed.errors().is_empty() {
|
||||
let ast = parsed.syntax();
|
||||
@@ -76,13 +76,13 @@ fn lint_lines(source: &str, diagnostics: &mut Vec<String>) {
|
||||
#[allow(unreachable_pub)]
|
||||
#[salsa::tracked(return_ref)]
|
||||
pub fn lint_semantic(db: &dyn Db, file_id: File) -> Diagnostics {
|
||||
let _span = trace_span!("lint_semantic", ?file_id).entered();
|
||||
let _span = trace_span!("lint_semantic", file=?file_id.path(db)).entered();
|
||||
|
||||
let source = source_text(db.upcast(), file_id);
|
||||
let parsed = parsed_module(db.upcast(), file_id);
|
||||
let semantic = SemanticModel::new(db.upcast(), file_id);
|
||||
|
||||
if !parsed.is_valid() {
|
||||
if !parsed.parsed().is_valid() {
|
||||
return Diagnostics::Empty;
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ pub fn lint_semantic(db: &dyn Db, file_id: File) -> Diagnostics {
|
||||
diagnostics: RefCell::new(Vec::new()),
|
||||
};
|
||||
|
||||
SemanticVisitor { context: &context }.visit_body(parsed.suite());
|
||||
SemanticVisitor { context: &context }.visit_body(parsed.parsed().suite());
|
||||
|
||||
Diagnostics::from(context.diagnostics.take())
|
||||
}
|
||||
@@ -201,7 +201,7 @@ impl<'db> SemanticLintContext<'db> {
|
||||
|
||||
#[allow(unused)]
|
||||
pub(crate) fn ast(&self) -> &'db ast::ModModule {
|
||||
self.parsed.syntax()
|
||||
self.parsed.parsed().syntax()
|
||||
}
|
||||
|
||||
pub(crate) fn push_diagnostic(&self, diagnostic: String) {
|
||||
@@ -220,7 +220,7 @@ struct SyntaxLintVisitor<'a> {
|
||||
source: &'a str,
|
||||
}
|
||||
|
||||
impl Visitor<'_> for SyntaxLintVisitor<'_> {
|
||||
impl Visitor<'_, '_> for SyntaxLintVisitor<'_> {
|
||||
fn visit_string_literal(&mut self, string_literal: &'_ ast::StringLiteral) {
|
||||
// A very naive implementation of use double quotes
|
||||
let text = &self.source[string_literal.range];
|
||||
@@ -236,7 +236,7 @@ struct SemanticVisitor<'a> {
|
||||
context: &'a SemanticLintContext<'a>,
|
||||
}
|
||||
|
||||
impl Visitor<'_> for SemanticVisitor<'_> {
|
||||
impl Visitor<'_, '_> for SemanticVisitor<'_> {
|
||||
fn visit_stmt(&mut self, stmt: &ast::Stmt) {
|
||||
match stmt {
|
||||
ast::Stmt::ClassDef(class) => {
|
||||
@@ -299,9 +299,9 @@ impl From<Vec<String>> for Diagnostics {
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
enum AnyImportRef<'a> {
|
||||
Import(&'a ast::StmtImport),
|
||||
ImportFrom(&'a ast::StmtImportFrom),
|
||||
enum AnyImportRef<'a, 'ast> {
|
||||
Import(&'a ast::StmtImport<'ast>),
|
||||
ImportFrom(&'a ast::StmtImportFrom<'ast>),
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
||||
@@ -2,7 +2,6 @@ use std::sync::Mutex;
|
||||
|
||||
use clap::Parser;
|
||||
use crossbeam::channel as crossbeam_channel;
|
||||
use salsa::ParallelDatabase;
|
||||
use tracing::subscriber::Interest;
|
||||
use tracing::{Level, Metadata};
|
||||
use tracing_subscriber::filter::LevelFilter;
|
||||
@@ -111,7 +110,7 @@ pub fn main() -> anyhow::Result<()> {
|
||||
|
||||
// TODO: Use the `program_settings` to compute the key for the database's persistent
|
||||
// cache and load the cache if it exists.
|
||||
let mut db = RootDatabase::new(workspace_metadata, program_settings, system);
|
||||
let db = RootDatabase::new(workspace_metadata, program_settings, system);
|
||||
|
||||
let (main_loop, main_loop_cancellation_token) = MainLoop::new(verbosity);
|
||||
|
||||
@@ -125,11 +124,14 @@ pub fn main() -> anyhow::Result<()> {
|
||||
}
|
||||
})?;
|
||||
|
||||
let mut db = salsa::Handle::new(db);
|
||||
if watch {
|
||||
main_loop.watch(&mut db)?;
|
||||
} else {
|
||||
main_loop.run(&mut db);
|
||||
}
|
||||
};
|
||||
|
||||
std::mem::forget(db);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -162,7 +164,7 @@ impl MainLoop {
|
||||
)
|
||||
}
|
||||
|
||||
fn watch(mut self, db: &mut RootDatabase) -> anyhow::Result<()> {
|
||||
fn watch(mut self, db: &mut salsa::Handle<RootDatabase>) -> anyhow::Result<()> {
|
||||
let sender = self.sender.clone();
|
||||
let watcher = watch::directory_watcher(move |event| {
|
||||
sender.send(MainLoopMessage::ApplyChanges(event)).unwrap();
|
||||
@@ -170,12 +172,11 @@ impl MainLoop {
|
||||
|
||||
self.watcher = Some(WorkspaceWatcher::new(watcher, db));
|
||||
self.run(db);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[allow(clippy::print_stderr)]
|
||||
fn run(mut self, db: &mut RootDatabase) {
|
||||
fn run(mut self, db: &mut salsa::Handle<RootDatabase>) {
|
||||
// Schedule the first check.
|
||||
self.sender.send(MainLoopMessage::CheckWorkspace).unwrap();
|
||||
let mut revision = 0usize;
|
||||
@@ -185,7 +186,7 @@ impl MainLoop {
|
||||
|
||||
match message {
|
||||
MainLoopMessage::CheckWorkspace => {
|
||||
let db = db.snapshot();
|
||||
let db = db.clone();
|
||||
let sender = self.sender.clone();
|
||||
|
||||
// Spawn a new task that checks the workspace. This needs to be done in a separate thread
|
||||
@@ -220,7 +221,7 @@ impl MainLoop {
|
||||
MainLoopMessage::ApplyChanges(changes) => {
|
||||
revision += 1;
|
||||
// Automatically cancels any pending queries and waits for them to complete.
|
||||
db.apply_changes(changes);
|
||||
db.get_mut().apply_changes(changes);
|
||||
if let Some(watcher) = self.watcher.as_mut() {
|
||||
watcher.update(db);
|
||||
}
|
||||
@@ -231,6 +232,8 @@ impl MainLoop {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.exit();
|
||||
}
|
||||
|
||||
#[allow(clippy::print_stderr, clippy::unused_self)]
|
||||
@@ -296,6 +299,9 @@ impl LoggingFilter {
|
||||
fn is_enabled(&self, meta: &Metadata<'_>) -> bool {
|
||||
let filter = if meta.target().starts_with("red_knot") || meta.target().starts_with("ruff") {
|
||||
self.trace_level
|
||||
} else if meta.target().starts_with("salsa") && self.trace_level <= Level::INFO {
|
||||
// Salsa emits very verbose query traces with level info. Let's not show these to the user.
|
||||
Level::WARN
|
||||
} else {
|
||||
Level::INFO
|
||||
};
|
||||
|
||||
@@ -240,7 +240,7 @@ impl Debouncer {
|
||||
}
|
||||
|
||||
ModifyKind::Data(_) => ChangeEvent::Changed {
|
||||
kind: ChangedKind::FileMetadata,
|
||||
kind: ChangedKind::FileContent,
|
||||
path,
|
||||
},
|
||||
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
// TODO: Fix clippy warnings created by salsa macros
|
||||
#![allow(clippy::used_underscore_binding, unreachable_pub)]
|
||||
|
||||
use salsa::{Durability, Setter as _};
|
||||
use std::{collections::BTreeMap, sync::Arc};
|
||||
|
||||
use rustc_hash::{FxBuildHasher, FxHashSet};
|
||||
@@ -67,7 +65,6 @@ mod metadata;
|
||||
/// holding on to the most fundamental settings required for checking.
|
||||
#[salsa::input]
|
||||
pub struct Workspace {
|
||||
#[id]
|
||||
#[return_ref]
|
||||
root_buf: SystemPathBuf,
|
||||
|
||||
@@ -90,7 +87,6 @@ pub struct Package {
|
||||
pub name: Name,
|
||||
|
||||
/// The path to the root directory of the package.
|
||||
#[id]
|
||||
#[return_ref]
|
||||
root_buf: SystemPathBuf,
|
||||
|
||||
@@ -109,7 +105,9 @@ impl Workspace {
|
||||
packages.insert(package.root.clone(), Package::from_metadata(db, package));
|
||||
}
|
||||
|
||||
Workspace::new(db, metadata.root, None, packages)
|
||||
Workspace::builder(metadata.root, None, packages)
|
||||
.durability(Durability::MEDIUM)
|
||||
.new(db)
|
||||
}
|
||||
|
||||
pub fn root(self, db: &dyn Db) -> &SystemPath {
|
||||
@@ -140,7 +138,9 @@ impl Workspace {
|
||||
new_packages.insert(path, package);
|
||||
}
|
||||
|
||||
self.set_package_tree(db).to(new_packages);
|
||||
self.set_package_tree(db)
|
||||
.with_durability(Durability::MEDIUM)
|
||||
.to(new_packages);
|
||||
}
|
||||
|
||||
#[tracing::instrument(level = "debug", skip_all)]
|
||||
@@ -229,13 +229,11 @@ impl Workspace {
|
||||
///
|
||||
/// This changes the behavior of `check` to check all files in the workspace instead of just the open files.
|
||||
pub fn take_open_files(self, db: &mut dyn Db) -> FxHashSet<File> {
|
||||
let open_files = self.open_file_set(db).clone();
|
||||
// Salsa will cancel any pending queries and remove its own reference to `open_files`
|
||||
// so that the reference counter to `open_files` now drops to 1.
|
||||
let open_files = self.set_open_file_set(db).to(None);
|
||||
|
||||
if let Some(open_files) = open_files {
|
||||
// Salsa will cancel any pending queries and remove its own reference to `open_files`
|
||||
// so that the reference counter to `open_files` now drops to 1.
|
||||
self.set_open_file_set(db).to(None);
|
||||
|
||||
Arc::try_unwrap(open_files).unwrap()
|
||||
} else {
|
||||
FxHashSet::default()
|
||||
@@ -311,20 +309,28 @@ impl Package {
|
||||
}
|
||||
|
||||
fn from_metadata(db: &dyn Db, metadata: PackageMetadata) -> Self {
|
||||
Self::new(db, metadata.name, metadata.root, PackageFiles::default())
|
||||
Self::builder(metadata.name, metadata.root, PackageFiles::default())
|
||||
.durability(Durability::MEDIUM)
|
||||
.new(db)
|
||||
}
|
||||
|
||||
fn update(self, db: &mut dyn Db, metadata: PackageMetadata) {
|
||||
let root = self.root(db);
|
||||
assert_eq!(root, metadata.root());
|
||||
|
||||
self.set_name(db).to(metadata.name);
|
||||
if self.name(db) != metadata.name() {
|
||||
self.set_name(db)
|
||||
.with_durability(Durability::MEDIUM)
|
||||
.to(metadata.name);
|
||||
}
|
||||
}
|
||||
|
||||
#[tracing::instrument(level = "debug", skip(db))]
|
||||
pub fn reload_files(self, db: &mut dyn Db) {
|
||||
// Force a re-index of the files in the next revision.
|
||||
self.set_file_set(db).to(PackageFiles::lazy());
|
||||
if !self.file_set(db).is_lazy() {
|
||||
// Force a re-index of the files in the next revision.
|
||||
self.set_file_set(db).to(PackageFiles::lazy());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -370,7 +376,7 @@ fn discover_package_files(db: &dyn Db, path: &SystemPath) -> FxHashSet<File> {
|
||||
for path in paths {
|
||||
// If this returns `None`, then the file was deleted between the `walk_directory` call and now.
|
||||
// We can ignore this.
|
||||
if let Some(file) = system_path_to_file(db.upcast(), &path) {
|
||||
if let Ok(file) = system_path_to_file(db.upcast(), &path) {
|
||||
files.insert(file);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,10 +3,12 @@ use std::ops::Deref;
|
||||
use std::sync::Arc;
|
||||
|
||||
use rustc_hash::FxHashSet;
|
||||
use salsa::Setter;
|
||||
|
||||
use ruff_db::files::File;
|
||||
|
||||
use crate::db::Db;
|
||||
use crate::workspace::Package;
|
||||
use ruff_db::files::File;
|
||||
|
||||
/// The indexed files of a package.
|
||||
///
|
||||
@@ -45,6 +47,10 @@ impl PackageFiles {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_lazy(&self) -> bool {
|
||||
matches!(*self.state.lock().unwrap(), State::Lazy)
|
||||
}
|
||||
|
||||
/// Returns a mutable view on the index that allows cheap in-place mutations.
|
||||
///
|
||||
/// The changes are automatically written back to the database once the view is dropped.
|
||||
|
||||
@@ -3,13 +3,15 @@
|
||||
use std::time::Duration;
|
||||
|
||||
use anyhow::{anyhow, Context};
|
||||
use filetime::FileTime;
|
||||
use salsa::Setter;
|
||||
|
||||
use red_knot::db::RootDatabase;
|
||||
use red_knot::watch;
|
||||
use red_knot::watch::{directory_watcher, WorkspaceWatcher};
|
||||
use red_knot::workspace::WorkspaceMetadata;
|
||||
use red_knot_module_resolver::{resolve_module, ModuleName};
|
||||
use ruff_db::files::{system_path_to_file, File};
|
||||
use ruff_db::files::{system_path_to_file, File, FileError};
|
||||
use ruff_db::program::{Program, ProgramSettings, SearchPathSettings, TargetVersion};
|
||||
use ruff_db::source::source_text;
|
||||
use ruff_db::system::{OsSystem, SystemPath, SystemPathBuf};
|
||||
@@ -81,7 +83,7 @@ impl TestCase {
|
||||
collected
|
||||
}
|
||||
|
||||
fn system_file(&self, path: impl AsRef<SystemPath>) -> Option<File> {
|
||||
fn system_file(&self, path: impl AsRef<SystemPath>) -> Result<File, FileError> {
|
||||
system_path_to_file(self.db(), path.as_ref())
|
||||
}
|
||||
}
|
||||
@@ -182,6 +184,27 @@ where
|
||||
Ok(test_case)
|
||||
}
|
||||
|
||||
/// The precision of the last modified time is platform dependent and not arbitrarily precise.
|
||||
/// This method sleeps until the last modified time of a newly created file changes. This guarantees
|
||||
/// that the last modified time of any file written **after** this method completes should be different.
|
||||
fn next_io_tick() {
|
||||
let temp = tempfile::tempfile().unwrap();
|
||||
|
||||
let last_modified = FileTime::from_last_modification_time(&temp.metadata().unwrap());
|
||||
|
||||
loop {
|
||||
filetime::set_file_handle_times(&temp, None, Some(FileTime::now())).unwrap();
|
||||
|
||||
let new_last_modified = FileTime::from_last_modification_time(&temp.metadata().unwrap());
|
||||
|
||||
if new_last_modified != last_modified {
|
||||
break;
|
||||
}
|
||||
|
||||
std::thread::sleep(Duration::from_nanos(100));
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn new_file() -> anyhow::Result<()> {
|
||||
let mut case = setup([("bar.py", "")])?;
|
||||
@@ -189,7 +212,7 @@ fn new_file() -> anyhow::Result<()> {
|
||||
let bar_file = case.system_file(&bar_path).unwrap();
|
||||
let foo_path = case.workspace_path("foo.py");
|
||||
|
||||
assert_eq!(case.system_file(&foo_path), None);
|
||||
assert_eq!(case.system_file(&foo_path), Err(FileError::NotFound));
|
||||
assert_eq!(&case.collect_package_files(&bar_path), &[bar_file]);
|
||||
|
||||
std::fs::write(foo_path.as_std_path(), "print('Hello')")?;
|
||||
@@ -212,7 +235,7 @@ fn new_ignored_file() -> anyhow::Result<()> {
|
||||
let bar_file = case.system_file(&bar_path).unwrap();
|
||||
let foo_path = case.workspace_path("foo.py");
|
||||
|
||||
assert_eq!(case.system_file(&foo_path), None);
|
||||
assert_eq!(case.system_file(&foo_path), Err(FileError::NotFound));
|
||||
assert_eq!(&case.collect_package_files(&bar_path), &[bar_file]);
|
||||
|
||||
std::fs::write(foo_path.as_std_path(), "print('Hello')")?;
|
||||
@@ -221,7 +244,7 @@ fn new_ignored_file() -> anyhow::Result<()> {
|
||||
|
||||
case.db_mut().apply_changes(changes);
|
||||
|
||||
assert!(case.system_file(&foo_path).is_some());
|
||||
assert!(case.system_file(&foo_path).is_ok());
|
||||
assert_eq!(&case.collect_package_files(&bar_path), &[bar_file]);
|
||||
|
||||
Ok(())
|
||||
@@ -233,16 +256,17 @@ fn changed_file() -> anyhow::Result<()> {
|
||||
let mut case = setup([("foo.py", foo_source)])?;
|
||||
let foo_path = case.workspace_path("foo.py");
|
||||
|
||||
let foo = case
|
||||
.system_file(&foo_path)
|
||||
.ok_or_else(|| anyhow!("Foo not found"))?;
|
||||
let foo = case.system_file(&foo_path)?;
|
||||
assert_eq!(source_text(case.db(), foo).as_str(), foo_source);
|
||||
assert_eq!(&case.collect_package_files(&foo_path), &[foo]);
|
||||
|
||||
next_io_tick();
|
||||
std::fs::write(foo_path.as_std_path(), "print('Version 2')")?;
|
||||
|
||||
let changes = case.stop_watch();
|
||||
|
||||
assert!(!changes.is_empty());
|
||||
|
||||
case.db_mut().apply_changes(changes);
|
||||
|
||||
assert_eq!(source_text(case.db(), foo).as_str(), "print('Version 2')");
|
||||
@@ -259,9 +283,7 @@ fn changed_metadata() -> anyhow::Result<()> {
|
||||
let mut case = setup([("foo.py", "")])?;
|
||||
let foo_path = case.workspace_path("foo.py");
|
||||
|
||||
let foo = case
|
||||
.system_file(&foo_path)
|
||||
.ok_or_else(|| anyhow!("Foo not found"))?;
|
||||
let foo = case.system_file(&foo_path)?;
|
||||
assert_eq!(
|
||||
foo.permissions(case.db()),
|
||||
Some(
|
||||
@@ -272,6 +294,7 @@ fn changed_metadata() -> anyhow::Result<()> {
|
||||
)
|
||||
);
|
||||
|
||||
next_io_tick();
|
||||
std::fs::set_permissions(
|
||||
foo_path.as_std_path(),
|
||||
std::fs::Permissions::from_mode(0o777),
|
||||
@@ -301,9 +324,7 @@ fn deleted_file() -> anyhow::Result<()> {
|
||||
let mut case = setup([("foo.py", foo_source)])?;
|
||||
let foo_path = case.workspace_path("foo.py");
|
||||
|
||||
let foo = case
|
||||
.system_file(&foo_path)
|
||||
.ok_or_else(|| anyhow!("Foo not found"))?;
|
||||
let foo = case.system_file(&foo_path)?;
|
||||
|
||||
assert!(foo.exists(case.db()));
|
||||
assert_eq!(&case.collect_package_files(&foo_path), &[foo]);
|
||||
@@ -332,9 +353,7 @@ fn move_file_to_trash() -> anyhow::Result<()> {
|
||||
let trash_path = case.root_path().join(".trash");
|
||||
std::fs::create_dir_all(trash_path.as_std_path())?;
|
||||
|
||||
let foo = case
|
||||
.system_file(&foo_path)
|
||||
.ok_or_else(|| anyhow!("Foo not found"))?;
|
||||
let foo = case.system_file(&foo_path)?;
|
||||
|
||||
assert!(foo.exists(case.db()));
|
||||
assert_eq!(&case.collect_package_files(&foo_path), &[foo]);
|
||||
@@ -366,7 +385,7 @@ fn move_file_to_workspace() -> anyhow::Result<()> {
|
||||
|
||||
let foo_in_workspace_path = case.workspace_path("foo.py");
|
||||
|
||||
assert!(case.system_file(&foo_path).is_some());
|
||||
assert!(case.system_file(&foo_path).is_ok());
|
||||
assert_eq!(&case.collect_package_files(&bar_path), &[bar]);
|
||||
assert!(case
|
||||
.db()
|
||||
@@ -380,9 +399,7 @@ fn move_file_to_workspace() -> anyhow::Result<()> {
|
||||
|
||||
case.db_mut().apply_changes(changes);
|
||||
|
||||
let foo_in_workspace = case
|
||||
.system_file(&foo_in_workspace_path)
|
||||
.ok_or_else(|| anyhow!("Foo not found"))?;
|
||||
let foo_in_workspace = case.system_file(&foo_in_workspace_path)?;
|
||||
|
||||
assert!(foo_in_workspace.exists(case.db()));
|
||||
assert_eq!(
|
||||
@@ -400,9 +417,7 @@ fn rename_file() -> anyhow::Result<()> {
|
||||
let foo_path = case.workspace_path("foo.py");
|
||||
let bar_path = case.workspace_path("bar.py");
|
||||
|
||||
let foo = case
|
||||
.system_file(&foo_path)
|
||||
.ok_or_else(|| anyhow!("Foo not found"))?;
|
||||
let foo = case.system_file(&foo_path)?;
|
||||
|
||||
assert_eq!(case.collect_package_files(&foo_path), [foo]);
|
||||
|
||||
@@ -414,9 +429,7 @@ fn rename_file() -> anyhow::Result<()> {
|
||||
|
||||
assert!(!foo.exists(case.db()));
|
||||
|
||||
let bar = case
|
||||
.system_file(&bar_path)
|
||||
.ok_or_else(|| anyhow!("Bar not found"))?;
|
||||
let bar = case.system_file(&bar_path)?;
|
||||
|
||||
assert!(bar.exists(case.db()));
|
||||
assert_eq!(case.collect_package_files(&foo_path), [bar]);
|
||||
@@ -655,7 +668,6 @@ fn search_path() -> anyhow::Result<()> {
|
||||
);
|
||||
|
||||
std::fs::write(site_packages.join("a.py").as_std_path(), "class A: ...")?;
|
||||
std::fs::write(site_packages.join("__init__.py").as_std_path(), "")?;
|
||||
|
||||
let changes = case.stop_watch();
|
||||
|
||||
@@ -686,7 +698,6 @@ fn add_search_path() -> anyhow::Result<()> {
|
||||
});
|
||||
|
||||
std::fs::write(site_packages.join("a.py").as_std_path(), "class A: ...")?;
|
||||
std::fs::write(site_packages.join("__init__.py").as_std_path(), "")?;
|
||||
|
||||
let changes = case.stop_watch();
|
||||
|
||||
|
||||
@@ -1,29 +1,12 @@
|
||||
use ruff_db::Upcast;
|
||||
|
||||
use crate::resolver::{
|
||||
editable_install_resolution_paths, file_to_module, internal::ModuleNameIngredient,
|
||||
module_resolution_settings, resolve_module_query,
|
||||
};
|
||||
use crate::typeshed::parse_typeshed_versions;
|
||||
|
||||
#[salsa::jar(db=Db)]
|
||||
pub struct Jar(
|
||||
ModuleNameIngredient<'_>,
|
||||
module_resolution_settings,
|
||||
editable_install_resolution_paths,
|
||||
resolve_module_query,
|
||||
file_to_module,
|
||||
parse_typeshed_versions,
|
||||
);
|
||||
|
||||
pub trait Db: salsa::DbWithJar<Jar> + ruff_db::Db + Upcast<dyn ruff_db::Db> {}
|
||||
#[salsa::db]
|
||||
pub trait Db: ruff_db::Db + Upcast<dyn ruff_db::Db> {}
|
||||
|
||||
#[cfg(test)]
|
||||
pub(crate) mod tests {
|
||||
use std::sync;
|
||||
|
||||
use salsa::DebugWithDb;
|
||||
|
||||
use ruff_db::files::Files;
|
||||
use ruff_db::system::{DbWithTestSystem, TestSystem};
|
||||
use ruff_db::vendored::VendoredFileSystem;
|
||||
@@ -32,7 +15,7 @@ pub(crate) mod tests {
|
||||
|
||||
use super::*;
|
||||
|
||||
#[salsa::db(Jar, ruff_db::Jar)]
|
||||
#[salsa::db]
|
||||
pub(crate) struct TestDb {
|
||||
storage: salsa::Storage<Self>,
|
||||
system: TestSystem,
|
||||
@@ -46,7 +29,7 @@ pub(crate) mod tests {
|
||||
Self {
|
||||
storage: salsa::Storage::default(),
|
||||
system: TestSystem::default(),
|
||||
vendored: vendored_typeshed_stubs().snapshot(),
|
||||
vendored: vendored_typeshed_stubs().clone(),
|
||||
events: sync::Arc::default(),
|
||||
files: Files::default(),
|
||||
}
|
||||
@@ -81,6 +64,7 @@ pub(crate) mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
#[salsa::db]
|
||||
impl ruff_db::Db for TestDb {
|
||||
fn vendored(&self) -> &VendoredFileSystem {
|
||||
&self.vendored
|
||||
@@ -95,6 +79,7 @@ pub(crate) mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
#[salsa::db]
|
||||
impl Db for TestDb {}
|
||||
|
||||
impl DbWithTestSystem for TestDb {
|
||||
@@ -107,23 +92,14 @@ pub(crate) mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
#[salsa::db]
|
||||
impl salsa::Database for TestDb {
|
||||
fn salsa_event(&self, event: salsa::Event) {
|
||||
tracing::trace!("event: {:?}", event.debug(self));
|
||||
let mut events = self.events.lock().unwrap();
|
||||
events.push(event);
|
||||
}
|
||||
}
|
||||
|
||||
impl salsa::ParallelDatabase for TestDb {
|
||||
fn snapshot(&self) -> salsa::Snapshot<Self> {
|
||||
salsa::Snapshot::new(Self {
|
||||
storage: self.storage.snapshot(),
|
||||
system: self.system.snapshot(),
|
||||
vendored: self.vendored.snapshot(),
|
||||
files: self.files.snapshot(),
|
||||
events: self.events.clone(),
|
||||
})
|
||||
self.attach(|_| {
|
||||
tracing::trace!("event: {event:?}");
|
||||
let mut events = self.events.lock().unwrap();
|
||||
events.push(event);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
use std::iter::FusedIterator;
|
||||
|
||||
pub use db::{Db, Jar};
|
||||
pub use db::Db;
|
||||
pub use module::{Module, ModuleKind};
|
||||
pub use module_name::ModuleName;
|
||||
pub use resolver::{file_to_module, resolve_module};
|
||||
pub use resolver::resolve_module;
|
||||
use ruff_db::system::SystemPath;
|
||||
pub use typeshed::{
|
||||
vendored_typeshed_stubs, TypeshedVersionsParseError, TypeshedVersionsParseErrorKind,
|
||||
|
||||
@@ -3,7 +3,6 @@ use std::sync::Arc;
|
||||
|
||||
use ruff_db::files::File;
|
||||
|
||||
use crate::db::Db;
|
||||
use crate::module_name::ModuleName;
|
||||
use crate::path::SearchPath;
|
||||
|
||||
@@ -62,17 +61,6 @@ impl std::fmt::Debug for Module {
|
||||
}
|
||||
}
|
||||
|
||||
impl salsa::DebugWithDb<dyn Db> for Module {
|
||||
fn fmt(&self, f: &mut Formatter<'_>, db: &dyn Db) -> std::fmt::Result {
|
||||
f.debug_struct("Module")
|
||||
.field("name", &self.name())
|
||||
.field("kind", &self.kind())
|
||||
.field("file", &self.file().debug(db.upcast()))
|
||||
.field("search_path", &self.search_path())
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Eq)]
|
||||
struct ModuleInner {
|
||||
name: ModuleName,
|
||||
|
||||
@@ -5,7 +5,7 @@ use std::sync::Arc;
|
||||
|
||||
use camino::{Utf8Path, Utf8PathBuf};
|
||||
|
||||
use ruff_db::files::{system_path_to_file, vendored_path_to_file, File, FilePath};
|
||||
use ruff_db::files::{system_path_to_file, vendored_path_to_file, File, FileError};
|
||||
use ruff_db::system::{System, SystemPath, SystemPathBuf};
|
||||
use ruff_db::vendored::{VendoredPath, VendoredPathBuf};
|
||||
|
||||
@@ -68,16 +68,18 @@ impl ModulePath {
|
||||
SearchPathInner::Extra(search_path)
|
||||
| SearchPathInner::FirstParty(search_path)
|
||||
| SearchPathInner::SitePackages(search_path)
|
||||
| SearchPathInner::Editable(search_path) => resolver
|
||||
.system()
|
||||
.is_directory(&search_path.join(relative_path)),
|
||||
| SearchPathInner::Editable(search_path) => {
|
||||
system_path_to_file(resolver.db.upcast(), search_path.join(relative_path))
|
||||
== Err(FileError::IsADirectory)
|
||||
}
|
||||
SearchPathInner::StandardLibraryCustom(stdlib_root) => {
|
||||
match query_stdlib_version(Some(stdlib_root), relative_path, resolver) {
|
||||
TypeshedVersionsQueryResult::DoesNotExist => false,
|
||||
TypeshedVersionsQueryResult::Exists
|
||||
| TypeshedVersionsQueryResult::MaybeExists => resolver
|
||||
.system()
|
||||
.is_directory(&stdlib_root.join(relative_path)),
|
||||
| TypeshedVersionsQueryResult::MaybeExists => {
|
||||
system_path_to_file(resolver.db.upcast(), stdlib_root.join(relative_path))
|
||||
== Err(FileError::IsADirectory)
|
||||
}
|
||||
}
|
||||
}
|
||||
SearchPathInner::StandardLibraryVendored(stdlib_root) => {
|
||||
@@ -105,10 +107,9 @@ impl ModulePath {
|
||||
| SearchPathInner::SitePackages(search_path)
|
||||
| SearchPathInner::Editable(search_path) => {
|
||||
let absolute_path = search_path.join(relative_path);
|
||||
system_path_to_file(resolver.db.upcast(), absolute_path.join("__init__.py"))
|
||||
.is_some()
|
||||
system_path_to_file(resolver.db.upcast(), absolute_path.join("__init__.py")).is_ok()
|
||||
|| system_path_to_file(resolver.db.upcast(), absolute_path.join("__init__.py"))
|
||||
.is_some()
|
||||
.is_ok()
|
||||
}
|
||||
SearchPathInner::StandardLibraryCustom(search_path) => {
|
||||
match query_stdlib_version(Some(search_path), relative_path, resolver) {
|
||||
@@ -118,7 +119,7 @@ impl ModulePath {
|
||||
resolver.db.upcast(),
|
||||
search_path.join(relative_path).join("__init__.pyi"),
|
||||
)
|
||||
.is_some(),
|
||||
.is_ok(),
|
||||
}
|
||||
}
|
||||
SearchPathInner::StandardLibraryVendored(search_path) => {
|
||||
@@ -145,14 +146,14 @@ impl ModulePath {
|
||||
| SearchPathInner::FirstParty(search_path)
|
||||
| SearchPathInner::SitePackages(search_path)
|
||||
| SearchPathInner::Editable(search_path) => {
|
||||
system_path_to_file(db, search_path.join(relative_path))
|
||||
system_path_to_file(db, search_path.join(relative_path)).ok()
|
||||
}
|
||||
SearchPathInner::StandardLibraryCustom(stdlib_root) => {
|
||||
match query_stdlib_version(Some(stdlib_root), relative_path, resolver) {
|
||||
TypeshedVersionsQueryResult::DoesNotExist => None,
|
||||
TypeshedVersionsQueryResult::Exists
|
||||
| TypeshedVersionsQueryResult::MaybeExists => {
|
||||
system_path_to_file(db, stdlib_root.join(relative_path))
|
||||
system_path_to_file(db, stdlib_root.join(relative_path)).ok()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -161,7 +162,7 @@ impl ModulePath {
|
||||
TypeshedVersionsQueryResult::DoesNotExist => None,
|
||||
TypeshedVersionsQueryResult::Exists
|
||||
| TypeshedVersionsQueryResult::MaybeExists => {
|
||||
vendored_path_to_file(db, stdlib_root.join(relative_path))
|
||||
vendored_path_to_file(db, stdlib_root.join(relative_path)).ok()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -301,11 +302,15 @@ pub(crate) enum SearchPathValidationError {
|
||||
/// (This is only relevant for stdlib search paths.)
|
||||
NoStdlibSubdirectory(SystemPathBuf),
|
||||
|
||||
/// The path provided by the user is a directory,
|
||||
/// The typeshed path provided by the user is a directory,
|
||||
/// but no `stdlib/VERSIONS` file exists.
|
||||
/// (This is only relevant for stdlib search paths.)
|
||||
NoVersionsFile(SystemPathBuf),
|
||||
|
||||
/// `stdlib/VERSIONS` is a directory.
|
||||
/// (This is only relevant for stdlib search paths.)
|
||||
VersionsIsADirectory(SystemPathBuf),
|
||||
|
||||
/// The path provided by the user is a directory,
|
||||
/// and a `stdlib/VERSIONS` file exists, but it fails to parse.
|
||||
/// (This is only relevant for stdlib search paths.)
|
||||
@@ -319,7 +324,8 @@ impl fmt::Display for SearchPathValidationError {
|
||||
Self::NoStdlibSubdirectory(path) => {
|
||||
write!(f, "The directory at {path} has no `stdlib/` subdirectory")
|
||||
}
|
||||
Self::NoVersionsFile(path) => write!(f, "Expected a file at {path}/stldib/VERSIONS"),
|
||||
Self::NoVersionsFile(path) => write!(f, "Expected a file at {path}/stdlib/VERSIONS"),
|
||||
Self::VersionsIsADirectory(path) => write!(f, "{path}/stdlib/VERSIONS is a directory."),
|
||||
Self::VersionsParseError(underlying_error) => underlying_error.fmt(f),
|
||||
}
|
||||
}
|
||||
@@ -408,10 +414,13 @@ impl SearchPath {
|
||||
typeshed.to_path_buf(),
|
||||
));
|
||||
}
|
||||
let Some(typeshed_versions) = system_path_to_file(db.upcast(), stdlib.join("VERSIONS"))
|
||||
else {
|
||||
return Err(SearchPathValidationError::NoVersionsFile(typeshed));
|
||||
};
|
||||
let typeshed_versions =
|
||||
system_path_to_file(db.upcast(), stdlib.join("VERSIONS")).map_err(|err| match err {
|
||||
FileError::NotFound => SearchPathValidationError::NoVersionsFile(typeshed),
|
||||
FileError::IsADirectory => {
|
||||
SearchPathValidationError::VersionsIsADirectory(typeshed)
|
||||
}
|
||||
})?;
|
||||
crate::typeshed::parse_typeshed_versions(db, typeshed_versions)
|
||||
.as_ref()
|
||||
.map_err(|validation_error| {
|
||||
@@ -474,18 +483,21 @@ impl SearchPath {
|
||||
matches!(&*self.0, SearchPathInner::SitePackages(_))
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub(crate) fn relativize_path(&self, path: &FilePath) -> Option<ModulePath> {
|
||||
let extension = path.extension();
|
||||
|
||||
fn is_valid_extension(&self, extension: &str) -> bool {
|
||||
if self.is_standard_library() {
|
||||
if extension.is_some_and(|extension| extension != "pyi") {
|
||||
return None;
|
||||
}
|
||||
extension == "pyi"
|
||||
} else {
|
||||
if extension.is_some_and(|extension| !matches!(extension, "pyi" | "py")) {
|
||||
return None;
|
||||
}
|
||||
matches!(extension, "pyi" | "py")
|
||||
}
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub(crate) fn relativize_system_path(&self, path: &SystemPath) -> Option<ModulePath> {
|
||||
if path
|
||||
.extension()
|
||||
.is_some_and(|extension| !self.is_valid_extension(extension))
|
||||
{
|
||||
return None;
|
||||
}
|
||||
|
||||
match &*self.0 {
|
||||
@@ -493,16 +505,36 @@ impl SearchPath {
|
||||
| SearchPathInner::FirstParty(search_path)
|
||||
| SearchPathInner::StandardLibraryCustom(search_path)
|
||||
| SearchPathInner::SitePackages(search_path)
|
||||
| SearchPathInner::Editable(search_path) => path
|
||||
.as_system_path()
|
||||
.and_then(|absolute_path| absolute_path.strip_prefix(search_path).ok())
|
||||
.map(|relative_path| ModulePath {
|
||||
search_path: self.clone(),
|
||||
relative_path: relative_path.as_utf8_path().to_path_buf(),
|
||||
}),
|
||||
| SearchPathInner::Editable(search_path) => {
|
||||
path.strip_prefix(search_path)
|
||||
.ok()
|
||||
.map(|relative_path| ModulePath {
|
||||
search_path: self.clone(),
|
||||
relative_path: relative_path.as_utf8_path().to_path_buf(),
|
||||
})
|
||||
}
|
||||
SearchPathInner::StandardLibraryVendored(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub(crate) fn relativize_vendored_path(&self, path: &VendoredPath) -> Option<ModulePath> {
|
||||
if path
|
||||
.extension()
|
||||
.is_some_and(|extension| !self.is_valid_extension(extension))
|
||||
{
|
||||
return None;
|
||||
}
|
||||
|
||||
match &*self.0 {
|
||||
SearchPathInner::Extra(_)
|
||||
| SearchPathInner::FirstParty(_)
|
||||
| SearchPathInner::StandardLibraryCustom(_)
|
||||
| SearchPathInner::SitePackages(_)
|
||||
| SearchPathInner::Editable(_) => None,
|
||||
SearchPathInner::StandardLibraryVendored(search_path) => path
|
||||
.as_vendored_path()
|
||||
.and_then(|absolute_path| absolute_path.strip_prefix(search_path).ok())
|
||||
.strip_prefix(search_path)
|
||||
.ok()
|
||||
.map(|relative_path| ModulePath {
|
||||
search_path: self.clone(),
|
||||
relative_path: relative_path.as_utf8_path().to_path_buf(),
|
||||
@@ -792,14 +824,14 @@ mod tests {
|
||||
let root = SearchPath::custom_stdlib(&db, stdlib.parent().unwrap().to_path_buf()).unwrap();
|
||||
|
||||
// Must have a `.pyi` extension or no extension:
|
||||
let bad_absolute_path = FilePath::system("foo/stdlib/x.py");
|
||||
assert_eq!(root.relativize_path(&bad_absolute_path), None);
|
||||
let second_bad_absolute_path = FilePath::system("foo/stdlib/x.rs");
|
||||
assert_eq!(root.relativize_path(&second_bad_absolute_path), None);
|
||||
let bad_absolute_path = SystemPath::new("foo/stdlib/x.py");
|
||||
assert_eq!(root.relativize_system_path(bad_absolute_path), None);
|
||||
let second_bad_absolute_path = SystemPath::new("foo/stdlib/x.rs");
|
||||
assert_eq!(root.relativize_system_path(second_bad_absolute_path), None);
|
||||
|
||||
// Must be a path that is a child of `root`:
|
||||
let third_bad_absolute_path = FilePath::system("bar/stdlib/x.pyi");
|
||||
assert_eq!(root.relativize_path(&third_bad_absolute_path), None);
|
||||
let third_bad_absolute_path = SystemPath::new("bar/stdlib/x.pyi");
|
||||
assert_eq!(root.relativize_system_path(third_bad_absolute_path), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -808,19 +840,21 @@ mod tests {
|
||||
|
||||
let root = SearchPath::extra(db.system(), src.clone()).unwrap();
|
||||
// Must have a `.py` extension, a `.pyi` extension, or no extension:
|
||||
let bad_absolute_path = FilePath::System(src.join("x.rs"));
|
||||
assert_eq!(root.relativize_path(&bad_absolute_path), None);
|
||||
let bad_absolute_path = src.join("x.rs");
|
||||
assert_eq!(root.relativize_system_path(&bad_absolute_path), None);
|
||||
// Must be a path that is a child of `root`:
|
||||
let second_bad_absolute_path = FilePath::system("bar/src/x.pyi");
|
||||
assert_eq!(root.relativize_path(&second_bad_absolute_path), None);
|
||||
let second_bad_absolute_path = SystemPath::new("bar/src/x.pyi");
|
||||
assert_eq!(root.relativize_system_path(second_bad_absolute_path), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn relativize_path() {
|
||||
let TestCase { db, src, .. } = TestCaseBuilder::new().build();
|
||||
let src_search_path = SearchPath::first_party(db.system(), src.clone()).unwrap();
|
||||
let eggs_package = FilePath::System(src.join("eggs/__init__.pyi"));
|
||||
let module_path = src_search_path.relativize_path(&eggs_package).unwrap();
|
||||
let eggs_package = src.join("eggs/__init__.pyi");
|
||||
let module_path = src_search_path
|
||||
.relativize_system_path(&eggs_package)
|
||||
.unwrap();
|
||||
assert_eq!(
|
||||
&module_path.relative_path,
|
||||
Utf8Path::new("eggs/__init__.pyi")
|
||||
|
||||
@@ -4,9 +4,10 @@ use std::iter::FusedIterator;
|
||||
use once_cell::sync::Lazy;
|
||||
use rustc_hash::{FxBuildHasher, FxHashSet};
|
||||
|
||||
use ruff_db::files::{File, FilePath};
|
||||
use ruff_db::files::{File, FilePath, FileRootKind};
|
||||
use ruff_db::program::{Program, SearchPathSettings, TargetVersion};
|
||||
use ruff_db::system::{DirectoryEntry, System, SystemPath, SystemPathBuf};
|
||||
use ruff_db::vendored::VendoredPath;
|
||||
|
||||
use crate::db::Db;
|
||||
use crate::module::{Module, ModuleKind};
|
||||
@@ -16,7 +17,7 @@ use crate::state::ResolverState;
|
||||
|
||||
/// Resolves a module name to a module.
|
||||
pub fn resolve_module(db: &dyn Db, module_name: ModuleName) -> Option<Module> {
|
||||
let interned_name = internal::ModuleNameIngredient::new(db, module_name);
|
||||
let interned_name = ModuleNameIngredient::new(db, module_name);
|
||||
|
||||
resolve_module_query(db, interned_name)
|
||||
}
|
||||
@@ -28,7 +29,7 @@ pub fn resolve_module(db: &dyn Db, module_name: ModuleName) -> Option<Module> {
|
||||
#[salsa::tracked]
|
||||
pub(crate) fn resolve_module_query<'db>(
|
||||
db: &'db dyn Db,
|
||||
module_name: internal::ModuleNameIngredient<'db>,
|
||||
module_name: ModuleNameIngredient<'db>,
|
||||
) -> Option<Module> {
|
||||
let name = module_name.name(db);
|
||||
let _span = tracing::trace_span!("resolve_module", %name).entered();
|
||||
@@ -57,15 +58,24 @@ pub(crate) fn path_to_module(db: &dyn Db, path: &FilePath) -> Option<Module> {
|
||||
file_to_module(db, file)
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
enum SystemOrVendoredPathRef<'a> {
|
||||
System(&'a SystemPath),
|
||||
Vendored(&'a VendoredPath),
|
||||
}
|
||||
|
||||
/// Resolves the module for the file with the given id.
|
||||
///
|
||||
/// Returns `None` if the file is not a module locatable via any of the known search paths.
|
||||
#[allow(unreachable_pub)]
|
||||
#[salsa::tracked]
|
||||
pub fn file_to_module(db: &dyn Db, file: File) -> Option<Module> {
|
||||
pub(crate) fn file_to_module(db: &dyn Db, file: File) -> Option<Module> {
|
||||
let _span = tracing::trace_span!("file_to_module", ?file).entered();
|
||||
|
||||
let path = file.path(db.upcast());
|
||||
let path = match file.path(db.upcast()) {
|
||||
FilePath::System(system) => SystemOrVendoredPathRef::System(system),
|
||||
FilePath::Vendored(vendored) => SystemOrVendoredPathRef::Vendored(vendored),
|
||||
FilePath::SystemVirtual(_) => return None,
|
||||
};
|
||||
|
||||
let settings = module_resolution_settings(db);
|
||||
|
||||
@@ -73,7 +83,11 @@ pub fn file_to_module(db: &dyn Db, file: File) -> Option<Module> {
|
||||
|
||||
let module_name = loop {
|
||||
let candidate = search_paths.next()?;
|
||||
if let Some(relative_path) = candidate.relativize_path(path) {
|
||||
let relative_path = match path {
|
||||
SystemOrVendoredPathRef::System(path) => candidate.relativize_system_path(path),
|
||||
SystemOrVendoredPathRef::Vendored(path) => candidate.relativize_vendored_path(path),
|
||||
};
|
||||
if let Some(relative_path) = relative_path {
|
||||
break relative_path.to_module_name()?;
|
||||
}
|
||||
};
|
||||
@@ -125,24 +139,33 @@ fn try_resolve_module_resolution_settings(
|
||||
}
|
||||
|
||||
let system = db.system();
|
||||
let files = db.files();
|
||||
|
||||
let mut static_search_paths = vec![];
|
||||
|
||||
for path in extra_paths.iter().cloned() {
|
||||
static_search_paths.push(SearchPath::extra(system, path)?);
|
||||
for path in extra_paths {
|
||||
files.try_add_root(db.upcast(), path, FileRootKind::LibrarySearchPath);
|
||||
static_search_paths.push(SearchPath::extra(system, path.clone())?);
|
||||
}
|
||||
|
||||
static_search_paths.push(SearchPath::first_party(system, workspace_root.clone())?);
|
||||
|
||||
static_search_paths.push(if let Some(custom_typeshed) = custom_typeshed.as_ref() {
|
||||
files.try_add_root(
|
||||
db.upcast(),
|
||||
custom_typeshed,
|
||||
FileRootKind::LibrarySearchPath,
|
||||
);
|
||||
SearchPath::custom_stdlib(db, custom_typeshed.clone())?
|
||||
} else {
|
||||
SearchPath::vendored_stdlib()
|
||||
});
|
||||
|
||||
if let Some(site_packages) = site_packages {
|
||||
files.try_add_root(db.upcast(), site_packages, FileRootKind::LibrarySearchPath);
|
||||
|
||||
static_search_paths.push(SearchPath::site_packages(system, site_packages.clone())?);
|
||||
}
|
||||
};
|
||||
|
||||
// TODO vendor typeshed's third-party stubs as well as the stdlib and fallback to them as a final step
|
||||
|
||||
@@ -183,62 +206,62 @@ pub(crate) fn module_resolution_settings(db: &dyn Db) -> ModuleResolutionSetting
|
||||
/// due to editable installations of third-party packages.
|
||||
#[salsa::tracked(return_ref)]
|
||||
pub(crate) fn editable_install_resolution_paths(db: &dyn Db) -> Vec<SearchPath> {
|
||||
// This query needs to be re-executed each time a `.pth` file
|
||||
// is added, modified or removed from the `site-packages` directory.
|
||||
// However, we don't use Salsa queries to read the source text of `.pth` files;
|
||||
// we use the APIs on the `System` trait directly. As such, for now we simply ask
|
||||
// Salsa to recompute this query on each new revision.
|
||||
//
|
||||
// TODO: add some kind of watcher for the `site-packages` directory that looks
|
||||
// for `site-packages/*.pth` files being added/modified/removed; get rid of this.
|
||||
// When doing so, also make the test
|
||||
// `deleting_pth_file_on_which_module_resolution_depends_invalidates_cache()`
|
||||
// more principled!
|
||||
db.report_untracked_read();
|
||||
let settings = module_resolution_settings(db);
|
||||
let static_search_paths = &settings.static_search_paths;
|
||||
|
||||
let static_search_paths = &module_resolution_settings(db).static_search_paths;
|
||||
let site_packages = static_search_paths
|
||||
.iter()
|
||||
.find(|path| path.is_site_packages());
|
||||
|
||||
let Some(site_packages) = site_packages else {
|
||||
return Vec::new();
|
||||
};
|
||||
|
||||
let site_packages = site_packages
|
||||
.as_system_path()
|
||||
.expect("Expected site-packages never to be a VendoredPath!");
|
||||
|
||||
let mut dynamic_paths = Vec::default();
|
||||
|
||||
if let Some(site_packages) = site_packages {
|
||||
let site_packages = site_packages
|
||||
.as_system_path()
|
||||
.expect("Expected site-packages never to be a VendoredPath!");
|
||||
// This query needs to be re-executed each time a `.pth` file
|
||||
// is added, modified or removed from the `site-packages` directory.
|
||||
// However, we don't use Salsa queries to read the source text of `.pth` files;
|
||||
// we use the APIs on the `System` trait directly. As such, add a dependency on the
|
||||
// site-package directory's revision.
|
||||
if let Some(site_packages_root) = db.files().root(db.upcast(), site_packages) {
|
||||
let _ = site_packages_root.revision(db.upcast());
|
||||
}
|
||||
|
||||
// As well as modules installed directly into `site-packages`,
|
||||
// the directory may also contain `.pth` files.
|
||||
// Each `.pth` file in `site-packages` may contain one or more lines
|
||||
// containing a (relative or absolute) path.
|
||||
// Each of these paths may point to an editable install of a package,
|
||||
// so should be considered an additional search path.
|
||||
let Ok(pth_file_iterator) = PthFileIterator::new(db, site_packages) else {
|
||||
return dynamic_paths;
|
||||
};
|
||||
// As well as modules installed directly into `site-packages`,
|
||||
// the directory may also contain `.pth` files.
|
||||
// Each `.pth` file in `site-packages` may contain one or more lines
|
||||
// containing a (relative or absolute) path.
|
||||
// Each of these paths may point to an editable install of a package,
|
||||
// so should be considered an additional search path.
|
||||
let Ok(pth_file_iterator) = PthFileIterator::new(db, site_packages) else {
|
||||
return dynamic_paths;
|
||||
};
|
||||
|
||||
// The Python documentation specifies that `.pth` files in `site-packages`
|
||||
// are processed in alphabetical order, so collecting and then sorting is necessary.
|
||||
// https://docs.python.org/3/library/site.html#module-site
|
||||
let mut all_pth_files: Vec<PthFile> = pth_file_iterator.collect();
|
||||
all_pth_files.sort_by(|a, b| a.path.cmp(&b.path));
|
||||
// The Python documentation specifies that `.pth` files in `site-packages`
|
||||
// are processed in alphabetical order, so collecting and then sorting is necessary.
|
||||
// https://docs.python.org/3/library/site.html#module-site
|
||||
let mut all_pth_files: Vec<PthFile> = pth_file_iterator.collect();
|
||||
all_pth_files.sort_by(|a, b| a.path.cmp(&b.path));
|
||||
|
||||
let mut existing_paths: FxHashSet<_> = static_search_paths
|
||||
.iter()
|
||||
.filter_map(|path| path.as_system_path())
|
||||
.map(Cow::Borrowed)
|
||||
.collect();
|
||||
let mut existing_paths: FxHashSet<_> = static_search_paths
|
||||
.iter()
|
||||
.filter_map(|path| path.as_system_path())
|
||||
.map(Cow::Borrowed)
|
||||
.collect();
|
||||
|
||||
dynamic_paths.reserve(all_pth_files.len());
|
||||
dynamic_paths.reserve(all_pth_files.len());
|
||||
|
||||
for pth_file in &all_pth_files {
|
||||
for installation in pth_file.editable_installations() {
|
||||
if existing_paths.insert(Cow::Owned(
|
||||
installation.as_system_path().unwrap().to_path_buf(),
|
||||
)) {
|
||||
dynamic_paths.push(installation);
|
||||
}
|
||||
for pth_file in &all_pth_files {
|
||||
for installation in pth_file.editable_installations() {
|
||||
if existing_paths.insert(Cow::Owned(
|
||||
installation.as_system_path().unwrap().to_path_buf(),
|
||||
)) {
|
||||
dynamic_paths.push(installation);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -383,9 +406,6 @@ pub(crate) struct ModuleResolutionSettings {
|
||||
target_version: TargetVersion,
|
||||
/// Search paths that have been statically determined purely from reading Ruff's configuration settings.
|
||||
/// These shouldn't ever change unless the config settings themselves change.
|
||||
///
|
||||
/// Note that `site-packages` *is included* as a search path in this sequence,
|
||||
/// but it is also stored separately so that we're able to find editable installs later.
|
||||
static_search_paths: Vec<SearchPath>,
|
||||
}
|
||||
|
||||
@@ -403,22 +423,13 @@ impl ModuleResolutionSettings {
|
||||
}
|
||||
}
|
||||
|
||||
// The singleton methods generated by salsa are all `pub` instead of `pub(crate)` which triggers
|
||||
// `unreachable_pub`. Work around this by creating a module and allow `unreachable_pub` for it.
|
||||
// Salsa also generates uses to `_db` variables for `interned` which triggers `clippy::used_underscore_binding`. Suppress that too
|
||||
// TODO(micha): Contribute a fix for this upstream where the singleton methods have the same visibility as the struct.
|
||||
#[allow(unreachable_pub, clippy::used_underscore_binding)]
|
||||
pub(crate) mod internal {
|
||||
use crate::module_name::ModuleName;
|
||||
|
||||
/// A thin wrapper around `ModuleName` to make it a Salsa ingredient.
|
||||
///
|
||||
/// This is needed because Salsa requires that all query arguments are salsa ingredients.
|
||||
#[salsa::interned]
|
||||
pub(crate) struct ModuleNameIngredient<'db> {
|
||||
#[return_ref]
|
||||
pub(super) name: ModuleName,
|
||||
}
|
||||
/// A thin wrapper around `ModuleName` to make it a Salsa ingredient.
|
||||
///
|
||||
/// This is needed because Salsa requires that all query arguments are salsa ingredients.
|
||||
#[salsa::interned]
|
||||
struct ModuleNameIngredient<'db> {
|
||||
#[return_ref]
|
||||
pub(super) name: ModuleName,
|
||||
}
|
||||
|
||||
/// Modules that are builtin to the Python interpreter itself.
|
||||
@@ -478,6 +489,7 @@ fn resolve_name(db: &dyn Db, name: &ModuleName) -> Option<(SearchPath, File, Mod
|
||||
if is_builtin_module && !search_path.is_standard_library() {
|
||||
continue;
|
||||
}
|
||||
|
||||
let mut components = name.components();
|
||||
let module_name = components.next_back()?;
|
||||
|
||||
@@ -612,10 +624,11 @@ impl PackageKind {
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use internal::ModuleNameIngredient;
|
||||
use ruff_db::files::{system_path_to_file, File, FilePath};
|
||||
use ruff_db::system::{DbWithTestSystem, OsSystem, SystemPath};
|
||||
use ruff_db::testing::assert_function_query_was_not_run;
|
||||
use ruff_db::testing::{
|
||||
assert_const_function_query_was_not_run, assert_function_query_was_not_run,
|
||||
};
|
||||
use ruff_db::Db;
|
||||
|
||||
use crate::db::tests::TestDb;
|
||||
@@ -1270,6 +1283,7 @@ mod tests {
|
||||
db.memory_file_system()
|
||||
.remove_directory(foo_init_path.parent().unwrap())?;
|
||||
File::sync_path(&mut db, &foo_init_path);
|
||||
File::sync_path(&mut db, foo_init_path.parent().unwrap());
|
||||
|
||||
let foo_module = resolve_module(&db, foo_module_name).expect("Foo module to resolve");
|
||||
assert_eq!(&src.join("foo.py"), foo_module.file().path(&db));
|
||||
@@ -1300,7 +1314,7 @@ mod tests {
|
||||
let functools_module = resolve_module(&db, functools_module_name.clone()).unwrap();
|
||||
assert_eq!(functools_module.search_path(), &stdlib);
|
||||
assert_eq!(
|
||||
Some(functools_module.file()),
|
||||
Ok(functools_module.file()),
|
||||
system_path_to_file(&db, &stdlib_functools_path)
|
||||
);
|
||||
|
||||
@@ -1312,15 +1326,15 @@ mod tests {
|
||||
.unwrap();
|
||||
let functools_module = resolve_module(&db, functools_module_name.clone()).unwrap();
|
||||
let events = db.take_salsa_events();
|
||||
assert_function_query_was_not_run::<resolve_module_query, _, _>(
|
||||
assert_function_query_was_not_run(
|
||||
&db,
|
||||
|res| &res.function,
|
||||
&ModuleNameIngredient::new(&db, functools_module_name.clone()),
|
||||
resolve_module_query,
|
||||
ModuleNameIngredient::new(&db, functools_module_name.clone()),
|
||||
&events,
|
||||
);
|
||||
assert_eq!(functools_module.search_path(), &stdlib);
|
||||
assert_eq!(
|
||||
Some(functools_module.file()),
|
||||
Ok(functools_module.file()),
|
||||
system_path_to_file(&db, &stdlib_functools_path)
|
||||
);
|
||||
}
|
||||
@@ -1346,7 +1360,7 @@ mod tests {
|
||||
let functools_module = resolve_module(&db, functools_module_name.clone()).unwrap();
|
||||
assert_eq!(functools_module.search_path(), &stdlib);
|
||||
assert_eq!(
|
||||
Some(functools_module.file()),
|
||||
Ok(functools_module.file()),
|
||||
system_path_to_file(&db, stdlib.join("functools.pyi"))
|
||||
);
|
||||
|
||||
@@ -1357,7 +1371,7 @@ mod tests {
|
||||
let functools_module = resolve_module(&db, functools_module_name.clone()).unwrap();
|
||||
assert_eq!(functools_module.search_path(), &src);
|
||||
assert_eq!(
|
||||
Some(functools_module.file()),
|
||||
Ok(functools_module.file()),
|
||||
system_path_to_file(&db, &src_functools_path)
|
||||
);
|
||||
}
|
||||
@@ -1388,7 +1402,7 @@ mod tests {
|
||||
let functools_module = resolve_module(&db, functools_module_name.clone()).unwrap();
|
||||
assert_eq!(functools_module.search_path(), &src);
|
||||
assert_eq!(
|
||||
Some(functools_module.file()),
|
||||
Ok(functools_module.file()),
|
||||
system_path_to_file(&db, &src_functools_path)
|
||||
);
|
||||
|
||||
@@ -1401,7 +1415,7 @@ mod tests {
|
||||
let functools_module = resolve_module(&db, functools_module_name.clone()).unwrap();
|
||||
assert_eq!(functools_module.search_path(), &stdlib);
|
||||
assert_eq!(
|
||||
Some(functools_module.file()),
|
||||
Ok(functools_module.file()),
|
||||
system_path_to_file(&db, stdlib.join("functools.pyi"))
|
||||
);
|
||||
}
|
||||
@@ -1564,12 +1578,7 @@ not_a_directory
|
||||
&FilePath::system("/y/src/bar.py")
|
||||
);
|
||||
let events = db.take_salsa_events();
|
||||
assert_function_query_was_not_run::<editable_install_resolution_paths, _, _>(
|
||||
&db,
|
||||
|res| &res.function,
|
||||
&(),
|
||||
&events,
|
||||
);
|
||||
assert_const_function_query_was_not_run(&db, editable_install_resolution_paths, &events);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -1598,18 +1607,7 @@ not_a_directory
|
||||
.remove_file(site_packages.join("_foo.pth"))
|
||||
.unwrap();
|
||||
|
||||
// Why are we touching a random file in the path that's been editably installed,
|
||||
// rather than the `.pth` file, when the `.pth` file is the one that has been deleted?
|
||||
// It's because the `.pth` file isn't directly tracked as a dependency by Salsa
|
||||
// currently (we don't use `system_path_to_file()` to get the file, and we don't use
|
||||
// `source_text()` to read the source of the file). Instead of using these APIs which
|
||||
// would automatically add the existence and contents of the file as a Salsa-tracked
|
||||
// dependency, we use `.report_untracked_read()` to force Salsa to re-parse all
|
||||
// `.pth` files on each new "revision". Making a random modification to a tracked
|
||||
// Salsa file forces a new revision.
|
||||
//
|
||||
// TODO: get rid of the `.report_untracked_read()` call...
|
||||
File::sync_path(&mut db, SystemPath::new("/x/src/foo.py"));
|
||||
File::sync_path(&mut db, &site_packages.join("_foo.pth"));
|
||||
|
||||
assert_eq!(resolve_module(&db, foo_module_name.clone()), None);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
use ruff_db::program::TargetVersion;
|
||||
use ruff_db::system::System;
|
||||
use ruff_db::vendored::VendoredFileSystem;
|
||||
|
||||
use crate::db::Db;
|
||||
@@ -20,10 +19,6 @@ impl<'db> ResolverState<'db> {
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn system(&self) -> &dyn System {
|
||||
self.db.system()
|
||||
}
|
||||
|
||||
pub(crate) fn vendored(&self) -> &VendoredFileSystem {
|
||||
self.db.vendored()
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ impl<'db> LazyTypeshedVersions<'db> {
|
||||
} else {
|
||||
return &VENDORED_VERSIONS;
|
||||
};
|
||||
let Some(versions_file) = system_path_to_file(db.upcast(), &versions_path) else {
|
||||
let Ok(versions_file) = system_path_to_file(db.upcast(), &versions_path) else {
|
||||
todo!(
|
||||
"Still need to figure out how to handle VERSIONS files being deleted \
|
||||
from custom typeshed directories! Expected a file to exist at {versions_path}"
|
||||
|
||||
@@ -1 +1 @@
|
||||
f863db6bc5242348ceaa6a3bca4e59aa9e62faaa
|
||||
4ef2d66663fc080fefa379e6ae5fc45d4f8b54eb
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
import sys
|
||||
from _typeshed import SupportsWrite
|
||||
from collections.abc import Iterable, Iterator
|
||||
from typing import Any, Final, Literal
|
||||
from typing import Any, Final
|
||||
from typing_extensions import TypeAlias
|
||||
|
||||
__version__: Final[str]
|
||||
|
||||
QUOTE_ALL: Literal[1]
|
||||
QUOTE_MINIMAL: Literal[0]
|
||||
QUOTE_NONE: Literal[3]
|
||||
QUOTE_NONNUMERIC: Literal[2]
|
||||
QUOTE_ALL: Final = 1
|
||||
QUOTE_MINIMAL: Final = 0
|
||||
QUOTE_NONE: Final = 3
|
||||
QUOTE_NONNUMERIC: Final = 2
|
||||
if sys.version_info >= (3, 12):
|
||||
QUOTE_STRINGS: Literal[4]
|
||||
QUOTE_NOTNULL: Literal[5]
|
||||
QUOTE_STRINGS: Final = 4
|
||||
QUOTE_NOTNULL: Final = 5
|
||||
|
||||
# Ideally this would be `QUOTE_ALL | QUOTE_MINIMAL | QUOTE_NONE | QUOTE_NONNUMERIC`
|
||||
# However, using literals in situations like these can cause false-positives (see #7258)
|
||||
|
||||
@@ -71,7 +71,7 @@ class _CData(metaclass=_CDataMeta):
|
||||
@classmethod
|
||||
def from_address(cls, address: int) -> Self: ...
|
||||
@classmethod
|
||||
def from_param(cls, obj: Any) -> Self | _CArgObject: ...
|
||||
def from_param(cls, value: Any, /) -> Self | _CArgObject: ...
|
||||
@classmethod
|
||||
def in_dll(cls, library: CDLL, name: str) -> Self: ...
|
||||
def __buffer__(self, flags: int, /) -> memoryview: ...
|
||||
|
||||
@@ -368,11 +368,7 @@ def tparm(
|
||||
) -> bytes: ...
|
||||
def typeahead(fd: int, /) -> None: ...
|
||||
def unctrl(ch: _ChType, /) -> bytes: ...
|
||||
|
||||
if sys.version_info < (3, 12) or sys.platform != "darwin":
|
||||
# The support for macos was dropped in 3.12
|
||||
def unget_wch(ch: int | str, /) -> None: ...
|
||||
|
||||
def unget_wch(ch: int | str, /) -> None: ...
|
||||
def ungetch(ch: _ChType, /) -> None: ...
|
||||
def ungetmouse(id: int, x: int, y: int, z: int, bstate: int, /) -> None: ...
|
||||
def update_lines_cols() -> None: ...
|
||||
@@ -447,13 +443,10 @@ class _CursesWindow:
|
||||
def getch(self) -> int: ...
|
||||
@overload
|
||||
def getch(self, y: int, x: int) -> int: ...
|
||||
if sys.version_info < (3, 12) or sys.platform != "darwin":
|
||||
# The support for macos was dropped in 3.12
|
||||
@overload
|
||||
def get_wch(self) -> int | str: ...
|
||||
@overload
|
||||
def get_wch(self, y: int, x: int) -> int | str: ...
|
||||
|
||||
@overload
|
||||
def get_wch(self) -> int | str: ...
|
||||
@overload
|
||||
def get_wch(self, y: int, x: int) -> int | str: ...
|
||||
@overload
|
||||
def getkey(self) -> str: ...
|
||||
@overload
|
||||
|
||||
@@ -17,20 +17,20 @@ class DecimalTuple(NamedTuple):
|
||||
digits: tuple[int, ...]
|
||||
exponent: int | Literal["n", "N", "F"]
|
||||
|
||||
ROUND_DOWN: str
|
||||
ROUND_HALF_UP: str
|
||||
ROUND_HALF_EVEN: str
|
||||
ROUND_CEILING: str
|
||||
ROUND_FLOOR: str
|
||||
ROUND_UP: str
|
||||
ROUND_HALF_DOWN: str
|
||||
ROUND_05UP: str
|
||||
HAVE_CONTEXTVAR: bool
|
||||
HAVE_THREADS: bool
|
||||
MAX_EMAX: int
|
||||
MAX_PREC: int
|
||||
MIN_EMIN: int
|
||||
MIN_ETINY: int
|
||||
ROUND_DOWN: Final[str]
|
||||
ROUND_HALF_UP: Final[str]
|
||||
ROUND_HALF_EVEN: Final[str]
|
||||
ROUND_CEILING: Final[str]
|
||||
ROUND_FLOOR: Final[str]
|
||||
ROUND_UP: Final[str]
|
||||
ROUND_HALF_DOWN: Final[str]
|
||||
ROUND_05UP: Final[str]
|
||||
HAVE_CONTEXTVAR: Final[bool]
|
||||
HAVE_THREADS: Final[bool]
|
||||
MAX_EMAX: Final[int]
|
||||
MAX_PREC: Final[int]
|
||||
MIN_EMIN: Final[int]
|
||||
MIN_ETINY: Final[int]
|
||||
|
||||
class DecimalException(ArithmeticError): ...
|
||||
class Clamped(DecimalException): ...
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
from _typeshed import structseq
|
||||
from typing import Final, Literal, SupportsIndex, final
|
||||
from typing import Any, Final, Literal, SupportsIndex, final
|
||||
from typing_extensions import Buffer, Self
|
||||
|
||||
class ChannelError(RuntimeError): ...
|
||||
@@ -72,13 +72,15 @@ class ChannelInfo(structseq[int], tuple[bool, bool, bool, int, int, int, int, in
|
||||
@property
|
||||
def send_released(self) -> bool: ...
|
||||
|
||||
def create() -> ChannelID: ...
|
||||
def create(unboundop: Literal[1, 2, 3]) -> ChannelID: ...
|
||||
def destroy(cid: SupportsIndex) -> None: ...
|
||||
def list_all() -> list[ChannelID]: ...
|
||||
def list_interpreters(cid: SupportsIndex, *, send: bool) -> list[int]: ...
|
||||
def send(cid: SupportsIndex, obj: object, *, blocking: bool = True, timeout: float | None = None) -> None: ...
|
||||
def send_buffer(cid: SupportsIndex, obj: Buffer, *, blocking: bool = True, timeout: float | None = None) -> None: ...
|
||||
def recv(cid: SupportsIndex, default: object = ...) -> object: ...
|
||||
def recv(cid: SupportsIndex, default: object = ...) -> tuple[Any, Literal[1, 2, 3]]: ...
|
||||
def close(cid: SupportsIndex, *, send: bool = False, recv: bool = False) -> None: ...
|
||||
def get_count(cid: SupportsIndex) -> int: ...
|
||||
def get_info(cid: SupportsIndex) -> ChannelInfo: ...
|
||||
def get_channel_defaults(cid: SupportsIndex) -> Literal[1, 2, 3]: ...
|
||||
def release(cid: SupportsIndex, *, send: bool = False, recv: bool = False, force: bool = False) -> None: ...
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
from collections.abc import Iterable, Sequence
|
||||
from typing import TypeVar
|
||||
from typing import Final, TypeVar
|
||||
|
||||
_T = TypeVar("_T")
|
||||
_K = TypeVar("_K")
|
||||
@@ -7,15 +7,15 @@ _V = TypeVar("_V")
|
||||
|
||||
__all__ = ["compiler_fixup", "customize_config_vars", "customize_compiler", "get_platform_osx"]
|
||||
|
||||
_UNIVERSAL_CONFIG_VARS: tuple[str, ...] # undocumented
|
||||
_COMPILER_CONFIG_VARS: tuple[str, ...] # undocumented
|
||||
_INITPRE: str # undocumented
|
||||
_UNIVERSAL_CONFIG_VARS: Final[tuple[str, ...]] # undocumented
|
||||
_COMPILER_CONFIG_VARS: Final[tuple[str, ...]] # undocumented
|
||||
_INITPRE: Final[str] # undocumented
|
||||
|
||||
def _find_executable(executable: str, path: str | None = None) -> str | None: ... # undocumented
|
||||
def _read_output(commandstring: str, capture_stderr: bool = False) -> str | None: ... # undocumented
|
||||
def _find_build_tool(toolname: str) -> str: ... # undocumented
|
||||
|
||||
_SYSTEM_VERSION: str | None # undocumented
|
||||
_SYSTEM_VERSION: Final[str | None] # undocumented
|
||||
|
||||
def _get_system_version() -> str: ... # undocumented
|
||||
def _remove_original_values(_config_vars: dict[str, str]) -> None: ... # undocumented
|
||||
|
||||
@@ -1,30 +1,30 @@
|
||||
import sys
|
||||
from typing import Literal
|
||||
from typing import Final
|
||||
|
||||
SF_APPEND: Literal[0x00040000]
|
||||
SF_ARCHIVED: Literal[0x00010000]
|
||||
SF_IMMUTABLE: Literal[0x00020000]
|
||||
SF_NOUNLINK: Literal[0x00100000]
|
||||
SF_SNAPSHOT: Literal[0x00200000]
|
||||
SF_APPEND: Final = 0x00040000
|
||||
SF_ARCHIVED: Final = 0x00010000
|
||||
SF_IMMUTABLE: Final = 0x00020000
|
||||
SF_NOUNLINK: Final = 0x00100000
|
||||
SF_SNAPSHOT: Final = 0x00200000
|
||||
|
||||
ST_MODE: Literal[0]
|
||||
ST_INO: Literal[1]
|
||||
ST_DEV: Literal[2]
|
||||
ST_NLINK: Literal[3]
|
||||
ST_UID: Literal[4]
|
||||
ST_GID: Literal[5]
|
||||
ST_SIZE: Literal[6]
|
||||
ST_ATIME: Literal[7]
|
||||
ST_MTIME: Literal[8]
|
||||
ST_CTIME: Literal[9]
|
||||
ST_MODE: Final = 0
|
||||
ST_INO: Final = 1
|
||||
ST_DEV: Final = 2
|
||||
ST_NLINK: Final = 3
|
||||
ST_UID: Final = 4
|
||||
ST_GID: Final = 5
|
||||
ST_SIZE: Final = 6
|
||||
ST_ATIME: Final = 7
|
||||
ST_MTIME: Final = 8
|
||||
ST_CTIME: Final = 9
|
||||
|
||||
S_IFIFO: Literal[0o010000]
|
||||
S_IFLNK: Literal[0o120000]
|
||||
S_IFREG: Literal[0o100000]
|
||||
S_IFSOCK: Literal[0o140000]
|
||||
S_IFBLK: Literal[0o060000]
|
||||
S_IFCHR: Literal[0o020000]
|
||||
S_IFDIR: Literal[0o040000]
|
||||
S_IFIFO: Final = 0o010000
|
||||
S_IFLNK: Final = 0o120000
|
||||
S_IFREG: Final = 0o100000
|
||||
S_IFSOCK: Final = 0o140000
|
||||
S_IFBLK: Final = 0o060000
|
||||
S_IFCHR: Final = 0o020000
|
||||
S_IFDIR: Final = 0o040000
|
||||
|
||||
# These are 0 on systems that don't support the specific kind of file.
|
||||
# Example: Linux doesn't support door files, so S_IFDOOR is 0 on linux.
|
||||
@@ -32,37 +32,37 @@ S_IFDOOR: int
|
||||
S_IFPORT: int
|
||||
S_IFWHT: int
|
||||
|
||||
S_ISUID: Literal[0o4000]
|
||||
S_ISGID: Literal[0o2000]
|
||||
S_ISVTX: Literal[0o1000]
|
||||
S_ISUID: Final = 0o4000
|
||||
S_ISGID: Final = 0o2000
|
||||
S_ISVTX: Final = 0o1000
|
||||
|
||||
S_IRWXU: Literal[0o0700]
|
||||
S_IRUSR: Literal[0o0400]
|
||||
S_IWUSR: Literal[0o0200]
|
||||
S_IXUSR: Literal[0o0100]
|
||||
S_IRWXU: Final = 0o0700
|
||||
S_IRUSR: Final = 0o0400
|
||||
S_IWUSR: Final = 0o0200
|
||||
S_IXUSR: Final = 0o0100
|
||||
|
||||
S_IRWXG: Literal[0o0070]
|
||||
S_IRGRP: Literal[0o0040]
|
||||
S_IWGRP: Literal[0o0020]
|
||||
S_IXGRP: Literal[0o0010]
|
||||
S_IRWXG: Final = 0o0070
|
||||
S_IRGRP: Final = 0o0040
|
||||
S_IWGRP: Final = 0o0020
|
||||
S_IXGRP: Final = 0o0010
|
||||
|
||||
S_IRWXO: Literal[0o0007]
|
||||
S_IROTH: Literal[0o0004]
|
||||
S_IWOTH: Literal[0o0002]
|
||||
S_IXOTH: Literal[0o0001]
|
||||
S_IRWXO: Final = 0o0007
|
||||
S_IROTH: Final = 0o0004
|
||||
S_IWOTH: Final = 0o0002
|
||||
S_IXOTH: Final = 0o0001
|
||||
|
||||
S_ENFMT: Literal[0o2000]
|
||||
S_IREAD: Literal[0o0400]
|
||||
S_IWRITE: Literal[0o0200]
|
||||
S_IEXEC: Literal[0o0100]
|
||||
S_ENFMT: Final = 0o2000
|
||||
S_IREAD: Final = 0o0400
|
||||
S_IWRITE: Final = 0o0200
|
||||
S_IEXEC: Final = 0o0100
|
||||
|
||||
UF_APPEND: Literal[0x00000004]
|
||||
UF_COMPRESSED: Literal[0x00000020] # OS X 10.6+ only
|
||||
UF_HIDDEN: Literal[0x00008000] # OX X 10.5+ only
|
||||
UF_IMMUTABLE: Literal[0x00000002]
|
||||
UF_NODUMP: Literal[0x00000001]
|
||||
UF_NOUNLINK: Literal[0x00000010]
|
||||
UF_OPAQUE: Literal[0x00000008]
|
||||
UF_APPEND: Final = 0x00000004
|
||||
UF_COMPRESSED: Final = 0x00000020 # OS X 10.6+ only
|
||||
UF_HIDDEN: Final = 0x00008000 # OX X 10.5+ only
|
||||
UF_IMMUTABLE: Final = 0x00000002
|
||||
UF_NODUMP: Final = 0x00000001
|
||||
UF_NOUNLINK: Final = 0x00000010
|
||||
UF_OPAQUE: Final = 0x00000008
|
||||
|
||||
def S_IMODE(mode: int, /) -> int: ...
|
||||
def S_IFMT(mode: int, /) -> int: ...
|
||||
@@ -84,34 +84,36 @@ if sys.platform == "win32":
|
||||
IO_REPARSE_TAG_APPEXECLINK: int
|
||||
|
||||
if sys.platform == "win32":
|
||||
FILE_ATTRIBUTE_ARCHIVE: Literal[32]
|
||||
FILE_ATTRIBUTE_COMPRESSED: Literal[2048]
|
||||
FILE_ATTRIBUTE_DEVICE: Literal[64]
|
||||
FILE_ATTRIBUTE_DIRECTORY: Literal[16]
|
||||
FILE_ATTRIBUTE_ENCRYPTED: Literal[16384]
|
||||
FILE_ATTRIBUTE_HIDDEN: Literal[2]
|
||||
FILE_ATTRIBUTE_INTEGRITY_STREAM: Literal[32768]
|
||||
FILE_ATTRIBUTE_NORMAL: Literal[128]
|
||||
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: Literal[8192]
|
||||
FILE_ATTRIBUTE_NO_SCRUB_DATA: Literal[131072]
|
||||
FILE_ATTRIBUTE_OFFLINE: Literal[4096]
|
||||
FILE_ATTRIBUTE_READONLY: Literal[1]
|
||||
FILE_ATTRIBUTE_REPARSE_POINT: Literal[1024]
|
||||
FILE_ATTRIBUTE_SPARSE_FILE: Literal[512]
|
||||
FILE_ATTRIBUTE_SYSTEM: Literal[4]
|
||||
FILE_ATTRIBUTE_TEMPORARY: Literal[256]
|
||||
FILE_ATTRIBUTE_VIRTUAL: Literal[65536]
|
||||
FILE_ATTRIBUTE_ARCHIVE: Final = 32
|
||||
FILE_ATTRIBUTE_COMPRESSED: Final = 2048
|
||||
FILE_ATTRIBUTE_DEVICE: Final = 64
|
||||
FILE_ATTRIBUTE_DIRECTORY: Final = 16
|
||||
FILE_ATTRIBUTE_ENCRYPTED: Final = 16384
|
||||
FILE_ATTRIBUTE_HIDDEN: Final = 2
|
||||
FILE_ATTRIBUTE_INTEGRITY_STREAM: Final = 32768
|
||||
FILE_ATTRIBUTE_NORMAL: Final = 128
|
||||
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: Final = 8192
|
||||
FILE_ATTRIBUTE_NO_SCRUB_DATA: Final = 131072
|
||||
FILE_ATTRIBUTE_OFFLINE: Final = 4096
|
||||
FILE_ATTRIBUTE_READONLY: Final = 1
|
||||
FILE_ATTRIBUTE_REPARSE_POINT: Final = 1024
|
||||
FILE_ATTRIBUTE_SPARSE_FILE: Final = 512
|
||||
FILE_ATTRIBUTE_SYSTEM: Final = 4
|
||||
FILE_ATTRIBUTE_TEMPORARY: Final = 256
|
||||
FILE_ATTRIBUTE_VIRTUAL: Final = 65536
|
||||
|
||||
if sys.version_info >= (3, 13):
|
||||
SF_SETTABLE: Literal[0x3FFF0000]
|
||||
# Varies by platform.
|
||||
SF_SETTABLE: Final[int]
|
||||
# https://github.com/python/cpython/issues/114081#issuecomment-2119017790
|
||||
# SF_RESTRICTED: Literal[0x00080000]
|
||||
SF_FIRMLINK: Literal[0x00800000]
|
||||
SF_DATALESS: Literal[0x40000000]
|
||||
SF_FIRMLINK: Final = 0x00800000
|
||||
SF_DATALESS: Final = 0x40000000
|
||||
|
||||
SF_SUPPORTED: Literal[0x9F0000]
|
||||
SF_SYNTHETIC: Literal[0xC0000000]
|
||||
if sys.platform == "darwin":
|
||||
SF_SUPPORTED: Final = 0x9F0000
|
||||
SF_SYNTHETIC: Final = 0xC0000000
|
||||
|
||||
UF_TRACKED: Literal[0x00000040]
|
||||
UF_DATAVAULT: Literal[0x00000080]
|
||||
UF_SETTABLE: Literal[0x0000FFFF]
|
||||
UF_TRACKED: Final = 0x00000040
|
||||
UF_DATAVAULT: Final = 0x00000080
|
||||
UF_SETTABLE: Final = 0x0000FFFF
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import sys
|
||||
from collections.abc import Callable
|
||||
from typing import Any, ClassVar, Literal, final
|
||||
from typing import Any, ClassVar, Final, final
|
||||
from typing_extensions import TypeAlias
|
||||
|
||||
# _tkinter is meant to be only used internally by tkinter, but some tkinter
|
||||
@@ -95,16 +95,16 @@ class TkappType:
|
||||
def settrace(self, func: _TkinterTraceFunc | None, /) -> None: ...
|
||||
|
||||
# These should be kept in sync with tkinter.tix constants, except ALL_EVENTS which doesn't match TCL_ALL_EVENTS
|
||||
ALL_EVENTS: Literal[-3]
|
||||
FILE_EVENTS: Literal[8]
|
||||
IDLE_EVENTS: Literal[32]
|
||||
TIMER_EVENTS: Literal[16]
|
||||
WINDOW_EVENTS: Literal[4]
|
||||
ALL_EVENTS: Final = -3
|
||||
FILE_EVENTS: Final = 8
|
||||
IDLE_EVENTS: Final = 32
|
||||
TIMER_EVENTS: Final = 16
|
||||
WINDOW_EVENTS: Final = 4
|
||||
|
||||
DONT_WAIT: Literal[2]
|
||||
EXCEPTION: Literal[8]
|
||||
READABLE: Literal[2]
|
||||
WRITABLE: Literal[4]
|
||||
DONT_WAIT: Final = 2
|
||||
EXCEPTION: Final = 8
|
||||
READABLE: Final = 2
|
||||
WRITABLE: Final = 4
|
||||
|
||||
TCL_VERSION: str
|
||||
TK_VERSION: str
|
||||
|
||||
@@ -1,117 +1,117 @@
|
||||
import sys
|
||||
from _typeshed import ReadableBuffer
|
||||
from collections.abc import Sequence
|
||||
from typing import Any, Literal, NoReturn, final, overload
|
||||
from typing import Any, Final, Literal, NoReturn, final, overload
|
||||
|
||||
if sys.platform == "win32":
|
||||
ABOVE_NORMAL_PRIORITY_CLASS: Literal[0x8000]
|
||||
BELOW_NORMAL_PRIORITY_CLASS: Literal[0x4000]
|
||||
ABOVE_NORMAL_PRIORITY_CLASS: Final = 0x8000
|
||||
BELOW_NORMAL_PRIORITY_CLASS: Final = 0x4000
|
||||
|
||||
CREATE_BREAKAWAY_FROM_JOB: Literal[0x1000000]
|
||||
CREATE_DEFAULT_ERROR_MODE: Literal[0x4000000]
|
||||
CREATE_NO_WINDOW: Literal[0x8000000]
|
||||
CREATE_NEW_CONSOLE: Literal[0x10]
|
||||
CREATE_NEW_PROCESS_GROUP: Literal[0x200]
|
||||
CREATE_BREAKAWAY_FROM_JOB: Final = 0x1000000
|
||||
CREATE_DEFAULT_ERROR_MODE: Final = 0x4000000
|
||||
CREATE_NO_WINDOW: Final = 0x8000000
|
||||
CREATE_NEW_CONSOLE: Final = 0x10
|
||||
CREATE_NEW_PROCESS_GROUP: Final = 0x200
|
||||
|
||||
DETACHED_PROCESS: Literal[8]
|
||||
DUPLICATE_CLOSE_SOURCE: Literal[1]
|
||||
DUPLICATE_SAME_ACCESS: Literal[2]
|
||||
DETACHED_PROCESS: Final = 8
|
||||
DUPLICATE_CLOSE_SOURCE: Final = 1
|
||||
DUPLICATE_SAME_ACCESS: Final = 2
|
||||
|
||||
ERROR_ALREADY_EXISTS: Literal[183]
|
||||
ERROR_BROKEN_PIPE: Literal[109]
|
||||
ERROR_IO_PENDING: Literal[997]
|
||||
ERROR_MORE_DATA: Literal[234]
|
||||
ERROR_NETNAME_DELETED: Literal[64]
|
||||
ERROR_NO_DATA: Literal[232]
|
||||
ERROR_NO_SYSTEM_RESOURCES: Literal[1450]
|
||||
ERROR_OPERATION_ABORTED: Literal[995]
|
||||
ERROR_PIPE_BUSY: Literal[231]
|
||||
ERROR_PIPE_CONNECTED: Literal[535]
|
||||
ERROR_SEM_TIMEOUT: Literal[121]
|
||||
ERROR_ALREADY_EXISTS: Final = 183
|
||||
ERROR_BROKEN_PIPE: Final = 109
|
||||
ERROR_IO_PENDING: Final = 997
|
||||
ERROR_MORE_DATA: Final = 234
|
||||
ERROR_NETNAME_DELETED: Final = 64
|
||||
ERROR_NO_DATA: Final = 232
|
||||
ERROR_NO_SYSTEM_RESOURCES: Final = 1450
|
||||
ERROR_OPERATION_ABORTED: Final = 995
|
||||
ERROR_PIPE_BUSY: Final = 231
|
||||
ERROR_PIPE_CONNECTED: Final = 535
|
||||
ERROR_SEM_TIMEOUT: Final = 121
|
||||
|
||||
FILE_FLAG_FIRST_PIPE_INSTANCE: Literal[0x80000]
|
||||
FILE_FLAG_OVERLAPPED: Literal[0x40000000]
|
||||
FILE_FLAG_FIRST_PIPE_INSTANCE: Final = 0x80000
|
||||
FILE_FLAG_OVERLAPPED: Final = 0x40000000
|
||||
|
||||
FILE_GENERIC_READ: Literal[1179785]
|
||||
FILE_GENERIC_WRITE: Literal[1179926]
|
||||
FILE_GENERIC_READ: Final = 1179785
|
||||
FILE_GENERIC_WRITE: Final = 1179926
|
||||
|
||||
FILE_MAP_ALL_ACCESS: Literal[983071]
|
||||
FILE_MAP_COPY: Literal[1]
|
||||
FILE_MAP_EXECUTE: Literal[32]
|
||||
FILE_MAP_READ: Literal[4]
|
||||
FILE_MAP_WRITE: Literal[2]
|
||||
FILE_MAP_ALL_ACCESS: Final = 983071
|
||||
FILE_MAP_COPY: Final = 1
|
||||
FILE_MAP_EXECUTE: Final = 32
|
||||
FILE_MAP_READ: Final = 4
|
||||
FILE_MAP_WRITE: Final = 2
|
||||
|
||||
FILE_TYPE_CHAR: Literal[2]
|
||||
FILE_TYPE_DISK: Literal[1]
|
||||
FILE_TYPE_PIPE: Literal[3]
|
||||
FILE_TYPE_REMOTE: Literal[32768]
|
||||
FILE_TYPE_UNKNOWN: Literal[0]
|
||||
FILE_TYPE_CHAR: Final = 2
|
||||
FILE_TYPE_DISK: Final = 1
|
||||
FILE_TYPE_PIPE: Final = 3
|
||||
FILE_TYPE_REMOTE: Final = 32768
|
||||
FILE_TYPE_UNKNOWN: Final = 0
|
||||
|
||||
GENERIC_READ: Literal[0x80000000]
|
||||
GENERIC_WRITE: Literal[0x40000000]
|
||||
HIGH_PRIORITY_CLASS: Literal[0x80]
|
||||
INFINITE: Literal[0xFFFFFFFF]
|
||||
GENERIC_READ: Final = 0x80000000
|
||||
GENERIC_WRITE: Final = 0x40000000
|
||||
HIGH_PRIORITY_CLASS: Final = 0x80
|
||||
INFINITE: Final = 0xFFFFFFFF
|
||||
# Ignore the Flake8 error -- flake8-pyi assumes
|
||||
# most numbers this long will be implementation details,
|
||||
# but here we can see that it's a power of 2
|
||||
INVALID_HANDLE_VALUE: Literal[0xFFFFFFFFFFFFFFFF] # noqa: Y054
|
||||
IDLE_PRIORITY_CLASS: Literal[0x40]
|
||||
NORMAL_PRIORITY_CLASS: Literal[0x20]
|
||||
REALTIME_PRIORITY_CLASS: Literal[0x100]
|
||||
NMPWAIT_WAIT_FOREVER: Literal[0xFFFFFFFF]
|
||||
INVALID_HANDLE_VALUE: Final = 0xFFFFFFFFFFFFFFFF # noqa: Y054
|
||||
IDLE_PRIORITY_CLASS: Final = 0x40
|
||||
NORMAL_PRIORITY_CLASS: Final = 0x20
|
||||
REALTIME_PRIORITY_CLASS: Final = 0x100
|
||||
NMPWAIT_WAIT_FOREVER: Final = 0xFFFFFFFF
|
||||
|
||||
MEM_COMMIT: Literal[0x1000]
|
||||
MEM_FREE: Literal[0x10000]
|
||||
MEM_IMAGE: Literal[0x1000000]
|
||||
MEM_MAPPED: Literal[0x40000]
|
||||
MEM_PRIVATE: Literal[0x20000]
|
||||
MEM_RESERVE: Literal[0x2000]
|
||||
MEM_COMMIT: Final = 0x1000
|
||||
MEM_FREE: Final = 0x10000
|
||||
MEM_IMAGE: Final = 0x1000000
|
||||
MEM_MAPPED: Final = 0x40000
|
||||
MEM_PRIVATE: Final = 0x20000
|
||||
MEM_RESERVE: Final = 0x2000
|
||||
|
||||
NULL: Literal[0]
|
||||
OPEN_EXISTING: Literal[3]
|
||||
NULL: Final = 0
|
||||
OPEN_EXISTING: Final = 3
|
||||
|
||||
PIPE_ACCESS_DUPLEX: Literal[3]
|
||||
PIPE_ACCESS_INBOUND: Literal[1]
|
||||
PIPE_READMODE_MESSAGE: Literal[2]
|
||||
PIPE_TYPE_MESSAGE: Literal[4]
|
||||
PIPE_UNLIMITED_INSTANCES: Literal[255]
|
||||
PIPE_WAIT: Literal[0]
|
||||
PIPE_ACCESS_DUPLEX: Final = 3
|
||||
PIPE_ACCESS_INBOUND: Final = 1
|
||||
PIPE_READMODE_MESSAGE: Final = 2
|
||||
PIPE_TYPE_MESSAGE: Final = 4
|
||||
PIPE_UNLIMITED_INSTANCES: Final = 255
|
||||
PIPE_WAIT: Final = 0
|
||||
|
||||
PAGE_EXECUTE: Literal[0x10]
|
||||
PAGE_EXECUTE_READ: Literal[0x20]
|
||||
PAGE_EXECUTE_READWRITE: Literal[0x40]
|
||||
PAGE_EXECUTE_WRITECOPY: Literal[0x80]
|
||||
PAGE_GUARD: Literal[0x100]
|
||||
PAGE_NOACCESS: Literal[0x1]
|
||||
PAGE_NOCACHE: Literal[0x200]
|
||||
PAGE_READONLY: Literal[0x2]
|
||||
PAGE_READWRITE: Literal[0x4]
|
||||
PAGE_WRITECOMBINE: Literal[0x400]
|
||||
PAGE_WRITECOPY: Literal[0x8]
|
||||
PAGE_EXECUTE: Final = 0x10
|
||||
PAGE_EXECUTE_READ: Final = 0x20
|
||||
PAGE_EXECUTE_READWRITE: Final = 0x40
|
||||
PAGE_EXECUTE_WRITECOPY: Final = 0x80
|
||||
PAGE_GUARD: Final = 0x100
|
||||
PAGE_NOACCESS: Final = 0x1
|
||||
PAGE_NOCACHE: Final = 0x200
|
||||
PAGE_READONLY: Final = 0x2
|
||||
PAGE_READWRITE: Final = 0x4
|
||||
PAGE_WRITECOMBINE: Final = 0x400
|
||||
PAGE_WRITECOPY: Final = 0x8
|
||||
|
||||
PROCESS_ALL_ACCESS: Literal[0x1FFFFF]
|
||||
PROCESS_DUP_HANDLE: Literal[0x40]
|
||||
PROCESS_ALL_ACCESS: Final = 0x1FFFFF
|
||||
PROCESS_DUP_HANDLE: Final = 0x40
|
||||
|
||||
SEC_COMMIT: Literal[0x8000000]
|
||||
SEC_IMAGE: Literal[0x1000000]
|
||||
SEC_LARGE_PAGES: Literal[0x80000000]
|
||||
SEC_NOCACHE: Literal[0x10000000]
|
||||
SEC_RESERVE: Literal[0x4000000]
|
||||
SEC_WRITECOMBINE: Literal[0x40000000]
|
||||
SEC_COMMIT: Final = 0x8000000
|
||||
SEC_IMAGE: Final = 0x1000000
|
||||
SEC_LARGE_PAGES: Final = 0x80000000
|
||||
SEC_NOCACHE: Final = 0x10000000
|
||||
SEC_RESERVE: Final = 0x4000000
|
||||
SEC_WRITECOMBINE: Final = 0x40000000
|
||||
|
||||
STARTF_USESHOWWINDOW: Literal[0x1]
|
||||
STARTF_USESTDHANDLES: Literal[0x100]
|
||||
STARTF_USESHOWWINDOW: Final = 0x1
|
||||
STARTF_USESTDHANDLES: Final = 0x100
|
||||
|
||||
STD_ERROR_HANDLE: Literal[0xFFFFFFF4]
|
||||
STD_OUTPUT_HANDLE: Literal[0xFFFFFFF5]
|
||||
STD_INPUT_HANDLE: Literal[0xFFFFFFF6]
|
||||
STD_ERROR_HANDLE: Final = 0xFFFFFFF4
|
||||
STD_OUTPUT_HANDLE: Final = 0xFFFFFFF5
|
||||
STD_INPUT_HANDLE: Final = 0xFFFFFFF6
|
||||
|
||||
STILL_ACTIVE: Literal[259]
|
||||
SW_HIDE: Literal[0]
|
||||
SYNCHRONIZE: Literal[0x100000]
|
||||
WAIT_ABANDONED_0: Literal[128]
|
||||
WAIT_OBJECT_0: Literal[0]
|
||||
WAIT_TIMEOUT: Literal[258]
|
||||
STILL_ACTIVE: Final = 259
|
||||
SW_HIDE: Final = 0
|
||||
SYNCHRONIZE: Final = 0x100000
|
||||
WAIT_ABANDONED_0: Final = 128
|
||||
WAIT_OBJECT_0: Final = 0
|
||||
WAIT_TIMEOUT: Final = 258
|
||||
|
||||
if sys.version_info >= (3, 10):
|
||||
LOCALE_NAME_INVARIANT: str
|
||||
@@ -131,32 +131,32 @@ if sys.platform == "win32":
|
||||
LCMAP_UPPERCASE: int
|
||||
|
||||
if sys.version_info >= (3, 12):
|
||||
COPYFILE2_CALLBACK_CHUNK_STARTED: Literal[1]
|
||||
COPYFILE2_CALLBACK_CHUNK_FINISHED: Literal[2]
|
||||
COPYFILE2_CALLBACK_STREAM_STARTED: Literal[3]
|
||||
COPYFILE2_CALLBACK_STREAM_FINISHED: Literal[4]
|
||||
COPYFILE2_CALLBACK_POLL_CONTINUE: Literal[5]
|
||||
COPYFILE2_CALLBACK_ERROR: Literal[6]
|
||||
COPYFILE2_CALLBACK_CHUNK_STARTED: Final = 1
|
||||
COPYFILE2_CALLBACK_CHUNK_FINISHED: Final = 2
|
||||
COPYFILE2_CALLBACK_STREAM_STARTED: Final = 3
|
||||
COPYFILE2_CALLBACK_STREAM_FINISHED: Final = 4
|
||||
COPYFILE2_CALLBACK_POLL_CONTINUE: Final = 5
|
||||
COPYFILE2_CALLBACK_ERROR: Final = 6
|
||||
|
||||
COPYFILE2_PROGRESS_CONTINUE: Literal[0]
|
||||
COPYFILE2_PROGRESS_CANCEL: Literal[1]
|
||||
COPYFILE2_PROGRESS_STOP: Literal[2]
|
||||
COPYFILE2_PROGRESS_QUIET: Literal[3]
|
||||
COPYFILE2_PROGRESS_PAUSE: Literal[4]
|
||||
COPYFILE2_PROGRESS_CONTINUE: Final = 0
|
||||
COPYFILE2_PROGRESS_CANCEL: Final = 1
|
||||
COPYFILE2_PROGRESS_STOP: Final = 2
|
||||
COPYFILE2_PROGRESS_QUIET: Final = 3
|
||||
COPYFILE2_PROGRESS_PAUSE: Final = 4
|
||||
|
||||
COPY_FILE_FAIL_IF_EXISTS: Literal[0x1]
|
||||
COPY_FILE_RESTARTABLE: Literal[0x2]
|
||||
COPY_FILE_OPEN_SOURCE_FOR_WRITE: Literal[0x4]
|
||||
COPY_FILE_ALLOW_DECRYPTED_DESTINATION: Literal[0x8]
|
||||
COPY_FILE_COPY_SYMLINK: Literal[0x800]
|
||||
COPY_FILE_NO_BUFFERING: Literal[0x1000]
|
||||
COPY_FILE_REQUEST_SECURITY_PRIVILEGES: Literal[0x2000]
|
||||
COPY_FILE_RESUME_FROM_PAUSE: Literal[0x4000]
|
||||
COPY_FILE_NO_OFFLOAD: Literal[0x40000]
|
||||
COPY_FILE_REQUEST_COMPRESSED_TRAFFIC: Literal[0x10000000]
|
||||
COPY_FILE_FAIL_IF_EXISTS: Final = 0x1
|
||||
COPY_FILE_RESTARTABLE: Final = 0x2
|
||||
COPY_FILE_OPEN_SOURCE_FOR_WRITE: Final = 0x4
|
||||
COPY_FILE_ALLOW_DECRYPTED_DESTINATION: Final = 0x8
|
||||
COPY_FILE_COPY_SYMLINK: Final = 0x800
|
||||
COPY_FILE_NO_BUFFERING: Final = 0x1000
|
||||
COPY_FILE_REQUEST_SECURITY_PRIVILEGES: Final = 0x2000
|
||||
COPY_FILE_RESUME_FROM_PAUSE: Final = 0x4000
|
||||
COPY_FILE_NO_OFFLOAD: Final = 0x40000
|
||||
COPY_FILE_REQUEST_COMPRESSED_TRAFFIC: Final = 0x10000000
|
||||
|
||||
ERROR_ACCESS_DENIED: Literal[5]
|
||||
ERROR_PRIVILEGE_NOT_HELD: Literal[1314]
|
||||
ERROR_ACCESS_DENIED: Final = 5
|
||||
ERROR_PRIVILEGE_NOT_HELD: Final = 1314
|
||||
|
||||
def CloseHandle(handle: int, /) -> None: ...
|
||||
@overload
|
||||
|
||||
@@ -2,7 +2,7 @@ import sys
|
||||
from _typeshed import sentinel
|
||||
from collections.abc import Callable, Generator, Iterable, Sequence
|
||||
from re import Pattern
|
||||
from typing import IO, Any, Generic, Literal, NewType, NoReturn, Protocol, TypeVar, overload
|
||||
from typing import IO, Any, Final, Generic, NewType, NoReturn, Protocol, TypeVar, overload
|
||||
from typing_extensions import Self, TypeAlias, deprecated
|
||||
|
||||
__all__ = [
|
||||
@@ -43,15 +43,15 @@ _ActionStr: TypeAlias = str
|
||||
# callers that don't use a literal argument
|
||||
_NArgsStr: TypeAlias = str
|
||||
|
||||
ONE_OR_MORE: Literal["+"]
|
||||
OPTIONAL: Literal["?"]
|
||||
PARSER: Literal["A..."]
|
||||
REMAINDER: Literal["..."]
|
||||
ONE_OR_MORE: Final = "+"
|
||||
OPTIONAL: Final = "?"
|
||||
PARSER: Final = "A..."
|
||||
REMAINDER: Final = "..."
|
||||
_SUPPRESS_T = NewType("_SUPPRESS_T", str)
|
||||
SUPPRESS: _SUPPRESS_T | str # not using Literal because argparse sometimes compares SUPPRESS with is
|
||||
# the | str is there so that foo = argparse.SUPPRESS; foo = "test" checks out in mypy
|
||||
ZERO_OR_MORE: Literal["*"]
|
||||
_UNRECOGNIZED_ARGS_ATTR: str # undocumented
|
||||
ZERO_OR_MORE: Final = "*"
|
||||
_UNRECOGNIZED_ARGS_ATTR: Final[str] # undocumented
|
||||
|
||||
class ArgumentError(Exception):
|
||||
argument_name: str | None
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from collections.abc import Callable, Sequence
|
||||
from contextvars import Context
|
||||
from typing import Any, Literal
|
||||
from typing import Any, Final
|
||||
|
||||
from . import futures
|
||||
|
||||
@@ -11,9 +11,9 @@ __all__ = ()
|
||||
# That's why the import order is reversed.
|
||||
from .futures import isfuture as isfuture
|
||||
|
||||
_PENDING: Literal["PENDING"] # undocumented
|
||||
_CANCELLED: Literal["CANCELLED"] # undocumented
|
||||
_FINISHED: Literal["FINISHED"] # undocumented
|
||||
_PENDING: Final = "PENDING" # undocumented
|
||||
_CANCELLED: Final = "CANCELLED" # undocumented
|
||||
_FINISHED: Final = "FINISHED" # undocumented
|
||||
|
||||
def _format_callbacks(cb: Sequence[tuple[Callable[[futures.Future[Any]], None], Context]]) -> str: ... # undocumented
|
||||
def _future_repr_info(future: futures.Future[Any]) -> list[str]: ... # undocumented
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
import enum
|
||||
import sys
|
||||
from typing import Literal
|
||||
from typing import Final
|
||||
|
||||
LOG_THRESHOLD_FOR_CONNLOST_WRITES: Literal[5]
|
||||
ACCEPT_RETRY_DELAY: Literal[1]
|
||||
DEBUG_STACK_DEPTH: Literal[10]
|
||||
LOG_THRESHOLD_FOR_CONNLOST_WRITES: Final = 5
|
||||
ACCEPT_RETRY_DELAY: Final = 1
|
||||
DEBUG_STACK_DEPTH: Final = 10
|
||||
SSL_HANDSHAKE_TIMEOUT: float
|
||||
SENDFILE_FALLBACK_READBUFFER_SIZE: Literal[262144]
|
||||
SENDFILE_FALLBACK_READBUFFER_SIZE: Final = 262144
|
||||
if sys.version_info >= (3, 11):
|
||||
SSL_SHUTDOWN_TIMEOUT: float
|
||||
FLOW_CONTROL_HIGH_WATER_SSL_READ: Literal[256]
|
||||
FLOW_CONTROL_HIGH_WATER_SSL_WRITE: Literal[512]
|
||||
FLOW_CONTROL_HIGH_WATER_SSL_READ: Final = 256
|
||||
FLOW_CONTROL_HIGH_WATER_SSL_WRITE: Final = 512
|
||||
if sys.version_info >= (3, 12):
|
||||
THREAD_JOIN_TIMEOUT: Literal[300]
|
||||
THREAD_JOIN_TIMEOUT: Final = 300
|
||||
|
||||
class _SendfileMode(enum.Enum):
|
||||
UNSUPPORTED = 1
|
||||
|
||||
@@ -3,7 +3,7 @@ import sys
|
||||
from collections import deque
|
||||
from collections.abc import Callable
|
||||
from enum import Enum
|
||||
from typing import Any, ClassVar, Literal
|
||||
from typing import Any, ClassVar, Final, Literal
|
||||
from typing_extensions import TypeAlias
|
||||
|
||||
from . import constants, events, futures, protocols, transports
|
||||
@@ -29,10 +29,10 @@ if sys.version_info >= (3, 11):
|
||||
def add_flowcontrol_defaults(high: int | None, low: int | None, kb: int) -> tuple[int, int]: ...
|
||||
|
||||
else:
|
||||
_UNWRAPPED: Literal["UNWRAPPED"]
|
||||
_DO_HANDSHAKE: Literal["DO_HANDSHAKE"]
|
||||
_WRAPPED: Literal["WRAPPED"]
|
||||
_SHUTDOWN: Literal["SHUTDOWN"]
|
||||
_UNWRAPPED: Final = "UNWRAPPED"
|
||||
_DO_HANDSHAKE: Final = "DO_HANDSHAKE"
|
||||
_WRAPPED: Final = "WRAPPED"
|
||||
_SHUTDOWN: Final = "SHUTDOWN"
|
||||
|
||||
if sys.version_info < (3, 11):
|
||||
class _SSLPipe:
|
||||
|
||||
@@ -429,7 +429,11 @@ class Task(Future[_T_co]): # type: ignore[type-var] # pyright: ignore[reportIn
|
||||
self, coro: _TaskCompatibleCoro[_T_co], *, loop: AbstractEventLoop = ..., name: str | None = ...
|
||||
) -> None: ...
|
||||
|
||||
def get_coro(self) -> _TaskCompatibleCoro[_T_co]: ...
|
||||
if sys.version_info >= (3, 12):
|
||||
def get_coro(self) -> _TaskCompatibleCoro[_T_co] | None: ...
|
||||
else:
|
||||
def get_coro(self) -> _TaskCompatibleCoro[_T_co]: ...
|
||||
|
||||
def get_name(self) -> str: ...
|
||||
def set_name(self, value: object, /) -> None: ...
|
||||
if sys.version_info >= (3, 12):
|
||||
|
||||
@@ -2,7 +2,7 @@ import socket
|
||||
import sys
|
||||
from _typeshed import Incomplete, ReadableBuffer, WriteableBuffer
|
||||
from collections.abc import Callable
|
||||
from typing import IO, Any, ClassVar, Literal, NoReturn
|
||||
from typing import IO, Any, ClassVar, Final, NoReturn
|
||||
|
||||
from . import events, futures, proactor_events, selector_events, streams, windows_utils
|
||||
|
||||
@@ -28,10 +28,10 @@ if sys.platform == "win32":
|
||||
"WindowsProactorEventLoopPolicy",
|
||||
)
|
||||
|
||||
NULL: Literal[0]
|
||||
INFINITE: Literal[0xFFFFFFFF]
|
||||
ERROR_CONNECTION_REFUSED: Literal[1225]
|
||||
ERROR_CONNECTION_ABORTED: Literal[1236]
|
||||
NULL: Final = 0
|
||||
INFINITE: Final = 0xFFFFFFFF
|
||||
ERROR_CONNECTION_REFUSED: Final = 1225
|
||||
ERROR_CONNECTION_ABORTED: Final = 1236
|
||||
CONNECT_PIPE_INIT_DELAY: float
|
||||
CONNECT_PIPE_MAX_DELAY: float
|
||||
|
||||
|
||||
@@ -2,13 +2,13 @@ import subprocess
|
||||
import sys
|
||||
from collections.abc import Callable
|
||||
from types import TracebackType
|
||||
from typing import Any, AnyStr, Literal
|
||||
from typing import Any, AnyStr, Final
|
||||
from typing_extensions import Self
|
||||
|
||||
if sys.platform == "win32":
|
||||
__all__ = ("pipe", "Popen", "PIPE", "PipeHandle")
|
||||
|
||||
BUFSIZE: Literal[8192]
|
||||
BUFSIZE: Final = 8192
|
||||
PIPE = subprocess.PIPE
|
||||
STDOUT = subprocess.STDOUT
|
||||
def pipe(*, duplex: bool = False, overlapped: tuple[bool, bool] = (True, True), bufsize: int = 8192) -> tuple[int, int]: ...
|
||||
|
||||
@@ -2,7 +2,7 @@ import sys
|
||||
from _typeshed import ExcInfo, TraceFunction, Unused
|
||||
from collections.abc import Callable, Iterable, Mapping
|
||||
from types import CodeType, FrameType, TracebackType
|
||||
from typing import IO, Any, Literal, SupportsInt, TypeVar
|
||||
from typing import IO, Any, Final, SupportsInt, TypeVar
|
||||
from typing_extensions import ParamSpec
|
||||
|
||||
__all__ = ["BdbQuit", "Bdb", "Breakpoint"]
|
||||
@@ -10,7 +10,10 @@ __all__ = ["BdbQuit", "Bdb", "Breakpoint"]
|
||||
_T = TypeVar("_T")
|
||||
_P = ParamSpec("_P")
|
||||
|
||||
GENERATOR_AND_COROUTINE_FLAGS: Literal[672]
|
||||
# A union of code-object flags at runtime.
|
||||
# The exact values of code-object flags are implementation details,
|
||||
# so we don't include the value of this constant in the stubs.
|
||||
GENERATOR_AND_COROUTINE_FLAGS: Final[int]
|
||||
|
||||
class BdbQuit(Exception): ...
|
||||
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
from _typeshed import SizedBuffer
|
||||
from typing import IO, Any, Literal
|
||||
from typing import IO, Any, Final
|
||||
from typing_extensions import TypeAlias
|
||||
|
||||
__all__ = ["binhex", "hexbin", "Error"]
|
||||
|
||||
class Error(Exception): ...
|
||||
|
||||
REASONABLY_LARGE: Literal[32768]
|
||||
LINELEN: Literal[64]
|
||||
RUNCHAR: Literal[b"\x90"]
|
||||
REASONABLY_LARGE: Final = 32768
|
||||
LINELEN: Final = 64
|
||||
RUNCHAR: Final = b"\x90"
|
||||
|
||||
class FInfo:
|
||||
Type: str
|
||||
|
||||
@@ -1868,6 +1868,7 @@ class BaseException:
|
||||
__suppress_context__: bool
|
||||
__traceback__: TracebackType | None
|
||||
def __init__(self, *args: object) -> None: ...
|
||||
def __new__(cls, *args: Any, **kwds: Any) -> Self: ...
|
||||
def __setstate__(self, state: dict[str, Any] | None, /) -> None: ...
|
||||
def with_traceback(self, tb: TracebackType | None, /) -> Self: ...
|
||||
if sys.version_info >= (3, 11):
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
from collections.abc import Callable
|
||||
from typing import IO, Any, Literal
|
||||
from typing import IO, Any, Final
|
||||
|
||||
__all__ = ["Cmd"]
|
||||
|
||||
PROMPT: Literal["(Cmd) "]
|
||||
PROMPT: Final = "(Cmd) "
|
||||
IDENTCHARS: str # Too big to be `Literal`
|
||||
|
||||
class Cmd:
|
||||
|
||||
@@ -3,7 +3,7 @@ from _codecs import *
|
||||
from _typeshed import ReadableBuffer
|
||||
from abc import abstractmethod
|
||||
from collections.abc import Callable, Generator, Iterable
|
||||
from typing import Any, BinaryIO, Literal, Protocol, TextIO
|
||||
from typing import Any, BinaryIO, Final, Literal, Protocol, TextIO
|
||||
from typing_extensions import Self
|
||||
|
||||
__all__ = [
|
||||
@@ -53,10 +53,10 @@ __all__ = [
|
||||
"lookup_error",
|
||||
]
|
||||
|
||||
BOM32_BE: Literal[b"\xfe\xff"]
|
||||
BOM32_LE: Literal[b"\xff\xfe"]
|
||||
BOM64_BE: Literal[b"\x00\x00\xfe\xff"]
|
||||
BOM64_LE: Literal[b"\xff\xfe\x00\x00"]
|
||||
BOM32_BE: Final = b"\xfe\xff"
|
||||
BOM32_LE: Final = b"\xff\xfe"
|
||||
BOM64_BE: Final = b"\x00\x00\xfe\xff"
|
||||
BOM64_LE: Final = b"\xff\xfe\x00\x00"
|
||||
|
||||
class _WritableStream(Protocol):
|
||||
def write(self, data: bytes, /) -> object: ...
|
||||
@@ -135,23 +135,23 @@ def EncodedFile(file: _Stream, data_encoding: str, file_encoding: str | None = N
|
||||
def iterencode(iterator: Iterable[str], encoding: str, errors: str = "strict") -> Generator[bytes, None, None]: ...
|
||||
def iterdecode(iterator: Iterable[bytes], encoding: str, errors: str = "strict") -> Generator[str, None, None]: ...
|
||||
|
||||
BOM: Literal[b"\xff\xfe", b"\xfe\xff"] # depends on `sys.byteorder`
|
||||
BOM_BE: Literal[b"\xfe\xff"]
|
||||
BOM_LE: Literal[b"\xff\xfe"]
|
||||
BOM_UTF8: Literal[b"\xef\xbb\xbf"]
|
||||
BOM_UTF16: Literal[b"\xff\xfe", b"\xfe\xff"] # depends on `sys.byteorder`
|
||||
BOM_UTF16_BE: Literal[b"\xfe\xff"]
|
||||
BOM_UTF16_LE: Literal[b"\xff\xfe"]
|
||||
BOM_UTF32: Literal[b"\xff\xfe\x00\x00", b"\x00\x00\xfe\xff"] # depends on `sys.byteorder`
|
||||
BOM_UTF32_BE: Literal[b"\x00\x00\xfe\xff"]
|
||||
BOM_UTF32_LE: Literal[b"\xff\xfe\x00\x00"]
|
||||
BOM: Final[Literal[b"\xff\xfe", b"\xfe\xff"]] # depends on `sys.byteorder`
|
||||
BOM_BE: Final = b"\xfe\xff"
|
||||
BOM_LE: Final = b"\xff\xfe"
|
||||
BOM_UTF8: Final = b"\xef\xbb\xbf"
|
||||
BOM_UTF16: Final[Literal[b"\xff\xfe", b"\xfe\xff"]] # depends on `sys.byteorder`
|
||||
BOM_UTF16_BE: Final = b"\xfe\xff"
|
||||
BOM_UTF16_LE: Final = b"\xff\xfe"
|
||||
BOM_UTF32: Final[Literal[b"\xff\xfe\x00\x00", b"\x00\x00\xfe\xff"]] # depends on `sys.byteorder`
|
||||
BOM_UTF32_BE: Final = b"\x00\x00\xfe\xff"
|
||||
BOM_UTF32_LE: Final = b"\xff\xfe\x00\x00"
|
||||
|
||||
def strict_errors(exception: UnicodeError) -> tuple[str | bytes, int]: ...
|
||||
def replace_errors(exception: UnicodeError) -> tuple[str | bytes, int]: ...
|
||||
def ignore_errors(exception: UnicodeError) -> tuple[str | bytes, int]: ...
|
||||
def xmlcharrefreplace_errors(exception: UnicodeError) -> tuple[str | bytes, int]: ...
|
||||
def backslashreplace_errors(exception: UnicodeError) -> tuple[str | bytes, int]: ...
|
||||
def namereplace_errors(exception: UnicodeError) -> tuple[str | bytes, int]: ...
|
||||
def strict_errors(exception: UnicodeError, /) -> tuple[str | bytes, int]: ...
|
||||
def replace_errors(exception: UnicodeError, /) -> tuple[str | bytes, int]: ...
|
||||
def ignore_errors(exception: UnicodeError, /) -> tuple[str | bytes, int]: ...
|
||||
def xmlcharrefreplace_errors(exception: UnicodeError, /) -> tuple[str | bytes, int]: ...
|
||||
def backslashreplace_errors(exception: UnicodeError, /) -> tuple[str | bytes, int]: ...
|
||||
def namereplace_errors(exception: UnicodeError, /) -> tuple[str | bytes, int]: ...
|
||||
|
||||
class Codec:
|
||||
# These are sort of @abstractmethod but sort of not.
|
||||
|
||||
@@ -4,20 +4,20 @@ from _typeshed import Unused
|
||||
from collections.abc import Callable, Collection, Iterable, Iterator
|
||||
from logging import Logger
|
||||
from types import TracebackType
|
||||
from typing import Any, Generic, Literal, NamedTuple, Protocol, TypeVar
|
||||
from typing import Any, Final, Generic, NamedTuple, Protocol, TypeVar
|
||||
from typing_extensions import ParamSpec, Self
|
||||
|
||||
if sys.version_info >= (3, 9):
|
||||
from types import GenericAlias
|
||||
|
||||
FIRST_COMPLETED: Literal["FIRST_COMPLETED"]
|
||||
FIRST_EXCEPTION: Literal["FIRST_EXCEPTION"]
|
||||
ALL_COMPLETED: Literal["ALL_COMPLETED"]
|
||||
PENDING: Literal["PENDING"]
|
||||
RUNNING: Literal["RUNNING"]
|
||||
CANCELLED: Literal["CANCELLED"]
|
||||
CANCELLED_AND_NOTIFIED: Literal["CANCELLED_AND_NOTIFIED"]
|
||||
FINISHED: Literal["FINISHED"]
|
||||
FIRST_COMPLETED: Final = "FIRST_COMPLETED"
|
||||
FIRST_EXCEPTION: Final = "FIRST_EXCEPTION"
|
||||
ALL_COMPLETED: Final = "ALL_COMPLETED"
|
||||
PENDING: Final = "PENDING"
|
||||
RUNNING: Final = "RUNNING"
|
||||
CANCELLED: Final = "CANCELLED"
|
||||
CANCELLED_AND_NOTIFIED: Final = "CANCELLED_AND_NOTIFIED"
|
||||
FINISHED: Final = "FINISHED"
|
||||
_FUTURE_STATES: list[str]
|
||||
_STATE_TO_DESCRIPTION_MAP: dict[str, str]
|
||||
LOGGER: Logger
|
||||
|
||||
@@ -2,7 +2,7 @@ import sys
|
||||
from _typeshed import StrOrBytesPath, SupportsWrite
|
||||
from collections.abc import Callable, ItemsView, Iterable, Iterator, Mapping, MutableMapping, Sequence
|
||||
from re import Pattern
|
||||
from typing import Any, ClassVar, Literal, TypeVar, overload
|
||||
from typing import Any, ClassVar, Final, Literal, TypeVar, overload
|
||||
from typing_extensions import TypeAlias
|
||||
|
||||
if sys.version_info >= (3, 13):
|
||||
@@ -83,8 +83,8 @@ _ConverterCallback: TypeAlias = Callable[[str], Any]
|
||||
_ConvertersMap: TypeAlias = dict[str, _ConverterCallback]
|
||||
_T = TypeVar("_T")
|
||||
|
||||
DEFAULTSECT: Literal["DEFAULT"]
|
||||
MAX_INTERPOLATION_DEPTH: Literal[10]
|
||||
DEFAULTSECT: Final = "DEFAULT"
|
||||
MAX_INTERPOLATION_DEPTH: Final = 10
|
||||
|
||||
class Interpolation:
|
||||
def before_get(self, parser: _Parser, section: str, option: str, value: str, defaults: _Section) -> str: ...
|
||||
|
||||
@@ -1,8 +1,16 @@
|
||||
from typing import Any, TypeVar
|
||||
import sys
|
||||
from typing import Any, Protocol, TypeVar
|
||||
from typing_extensions import ParamSpec, Self
|
||||
|
||||
__all__ = ["Error", "copy", "deepcopy"]
|
||||
|
||||
_T = TypeVar("_T")
|
||||
_SR = TypeVar("_SR", bound=_SupportsReplace[Any])
|
||||
_P = ParamSpec("_P")
|
||||
|
||||
class _SupportsReplace(Protocol[_P]):
|
||||
# In reality doesn't support args, but there's no other great way to express this.
|
||||
def __replace__(self, *args: _P.args, **kwargs: _P.kwargs) -> Self: ...
|
||||
|
||||
# None in CPython but non-None in Jython
|
||||
PyStringMap: Any
|
||||
@@ -11,6 +19,10 @@ PyStringMap: Any
|
||||
def deepcopy(x: _T, memo: dict[int, Any] | None = None, _nil: Any = []) -> _T: ...
|
||||
def copy(x: _T) -> _T: ...
|
||||
|
||||
if sys.version_info >= (3, 13):
|
||||
__all__ += ["replace"]
|
||||
def replace(obj: _SR, /, **changes: Any) -> _SR: ...
|
||||
|
||||
class Error(Exception): ...
|
||||
|
||||
error = Error
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import sys
|
||||
from abc import abstractmethod
|
||||
from time import struct_time
|
||||
from typing import ClassVar, Literal, NamedTuple, NoReturn, SupportsIndex, final, overload
|
||||
from typing import ClassVar, Final, NamedTuple, NoReturn, SupportsIndex, final, overload
|
||||
from typing_extensions import Self, TypeAlias, deprecated
|
||||
|
||||
if sys.version_info >= (3, 11):
|
||||
@@ -9,8 +9,8 @@ if sys.version_info >= (3, 11):
|
||||
elif sys.version_info >= (3, 9):
|
||||
__all__ = ("date", "datetime", "time", "timedelta", "timezone", "tzinfo", "MINYEAR", "MAXYEAR")
|
||||
|
||||
MINYEAR: Literal[1]
|
||||
MAXYEAR: Literal[9999]
|
||||
MINYEAR: Final = 1
|
||||
MAXYEAR: Final = 9999
|
||||
|
||||
class tzinfo:
|
||||
@abstractmethod
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
from _typeshed import BytesPath, StrPath
|
||||
from _typeshed import BytesPath, StrPath, Unused
|
||||
from collections.abc import Callable, Iterable
|
||||
from distutils.file_util import _BytesPathT, _StrPathT
|
||||
from typing import Any, Literal, overload
|
||||
from typing_extensions import TypeAlias
|
||||
from typing import Literal, overload
|
||||
from typing_extensions import TypeAlias, TypeVarTuple, Unpack
|
||||
|
||||
_Macro: TypeAlias = tuple[str] | tuple[str, str | None]
|
||||
_Ts = TypeVarTuple("_Ts")
|
||||
|
||||
def gen_lib_options(
|
||||
compiler: CCompiler, library_dirs: list[str], runtime_library_dirs: list[str], libraries: list[str]
|
||||
@@ -161,7 +162,9 @@ class CCompiler:
|
||||
def shared_object_filename(self, basename: str, strip_dir: Literal[0, False] = 0, output_dir: StrPath = "") -> str: ...
|
||||
@overload
|
||||
def shared_object_filename(self, basename: StrPath, strip_dir: Literal[1, True], output_dir: StrPath = "") -> str: ...
|
||||
def execute(self, func: Callable[..., object], args: tuple[Any, ...], msg: str | None = None, level: int = 1) -> None: ...
|
||||
def execute(
|
||||
self, func: Callable[[Unpack[_Ts]], Unused], args: tuple[Unpack[_Ts]], msg: str | None = None, level: int = 1
|
||||
) -> None: ...
|
||||
def spawn(self, cmd: list[str]) -> None: ...
|
||||
def mkpath(self, name: str, mode: int = 0o777) -> None: ...
|
||||
@overload
|
||||
|
||||
@@ -3,7 +3,11 @@ from abc import abstractmethod
|
||||
from collections.abc import Callable, Iterable
|
||||
from distutils.dist import Distribution
|
||||
from distutils.file_util import _BytesPathT, _StrPathT
|
||||
from typing import Any, ClassVar, Literal, overload
|
||||
from typing import Any, ClassVar, Literal, TypeVar, overload
|
||||
from typing_extensions import TypeVarTuple, Unpack
|
||||
|
||||
_CommandT = TypeVar("_CommandT", bound=Command)
|
||||
_Ts = TypeVarTuple("_Ts")
|
||||
|
||||
class Command:
|
||||
distribution: Distribution
|
||||
@@ -19,17 +23,22 @@ class Command:
|
||||
def announce(self, msg: str, level: int = 1) -> None: ...
|
||||
def debug_print(self, msg: str) -> None: ...
|
||||
def ensure_string(self, option: str, default: str | None = None) -> None: ...
|
||||
def ensure_string_list(self, option: str | list[str]) -> None: ...
|
||||
def ensure_string_list(self, option: str) -> None: ...
|
||||
def ensure_filename(self, option: str) -> None: ...
|
||||
def ensure_dirname(self, option: str) -> None: ...
|
||||
def get_command_name(self) -> str: ...
|
||||
def set_undefined_options(self, src_cmd: str, *option_pairs: tuple[str, str]) -> None: ...
|
||||
def get_finalized_command(self, command: str, create: bool | Literal[0, 1] = 1) -> Command: ...
|
||||
def reinitialize_command(self, command: Command | str, reinit_subcommands: bool | Literal[0, 1] = 0) -> Command: ...
|
||||
@overload
|
||||
def reinitialize_command(self, command: str, reinit_subcommands: bool | Literal[0, 1] = 0) -> Command: ...
|
||||
@overload
|
||||
def reinitialize_command(self, command: _CommandT, reinit_subcommands: bool | Literal[0, 1] = 0) -> _CommandT: ...
|
||||
def run_command(self, command: str) -> None: ...
|
||||
def get_sub_commands(self) -> list[str]: ...
|
||||
def warn(self, msg: str) -> None: ...
|
||||
def execute(self, func: Callable[..., object], args: Iterable[Any], msg: str | None = None, level: int = 1) -> None: ...
|
||||
def execute(
|
||||
self, func: Callable[[Unpack[_Ts]], Unused], args: tuple[Unpack[_Ts]], msg: str | None = None, level: int = 1
|
||||
) -> None: ...
|
||||
def mkpath(self, name: str, mode: int = 0o777) -> None: ...
|
||||
@overload
|
||||
def copy_file(
|
||||
@@ -89,8 +98,8 @@ class Command:
|
||||
self,
|
||||
infiles: str | list[str] | tuple[str, ...],
|
||||
outfile: StrOrBytesPath,
|
||||
func: Callable[..., object],
|
||||
args: list[Any],
|
||||
func: Callable[[Unpack[_Ts]], Unused],
|
||||
args: tuple[Unpack[_Ts]],
|
||||
exec_msg: str | None = None,
|
||||
skip_msg: str | None = None,
|
||||
level: Unused = 1,
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
from typing import Any
|
||||
from _typeshed import Unused
|
||||
from collections.abc import Callable
|
||||
from typing import Any, ClassVar
|
||||
|
||||
from ..cmd import Command
|
||||
|
||||
@@ -6,13 +8,13 @@ def show_formats() -> None: ...
|
||||
|
||||
class bdist(Command):
|
||||
description: str
|
||||
user_options: Any
|
||||
boolean_options: Any
|
||||
help_options: Any
|
||||
no_format_option: Any
|
||||
default_format: Any
|
||||
format_commands: Any
|
||||
format_command: Any
|
||||
user_options: ClassVar[list[tuple[str, str | None, str]]]
|
||||
boolean_options: ClassVar[list[str]]
|
||||
help_options: ClassVar[list[tuple[str, str | None, str, Callable[[], Unused]]]]
|
||||
no_format_option: ClassVar[tuple[str, ...]]
|
||||
default_format: ClassVar[dict[str, str]]
|
||||
format_commands: ClassVar[list[str]]
|
||||
format_command: ClassVar[dict[str, tuple[str, str]]]
|
||||
bdist_base: Any
|
||||
plat_name: Any
|
||||
formats: Any
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
from typing import Any
|
||||
from typing import Any, ClassVar
|
||||
|
||||
from ..cmd import Command
|
||||
|
||||
class bdist_dumb(Command):
|
||||
description: str
|
||||
user_options: Any
|
||||
boolean_options: Any
|
||||
default_format: Any
|
||||
user_options: ClassVar[list[tuple[str, str | None, str]]]
|
||||
boolean_options: ClassVar[list[str]]
|
||||
default_format: ClassVar[dict[str, str]]
|
||||
bdist_dir: Any
|
||||
plat_name: Any
|
||||
format: Any
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import sys
|
||||
from typing import Any, Literal
|
||||
from typing import Any, ClassVar, Literal
|
||||
|
||||
from ..cmd import Command
|
||||
|
||||
@@ -16,8 +16,8 @@ if sys.platform == "win32":
|
||||
|
||||
class bdist_msi(Command):
|
||||
description: str
|
||||
user_options: Any
|
||||
boolean_options: Any
|
||||
user_options: ClassVar[list[tuple[str, str | None, str]]]
|
||||
boolean_options: ClassVar[list[str]]
|
||||
all_versions: Any
|
||||
other_version: str
|
||||
if sys.version_info >= (3, 9):
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
from typing import Any
|
||||
from typing import Any, ClassVar
|
||||
|
||||
from ..cmd import Command
|
||||
|
||||
class bdist_rpm(Command):
|
||||
description: str
|
||||
user_options: Any
|
||||
boolean_options: Any
|
||||
negative_opt: Any
|
||||
user_options: ClassVar[list[tuple[str, str | None, str]]]
|
||||
boolean_options: ClassVar[list[str]]
|
||||
negative_opt: ClassVar[dict[str, str]]
|
||||
bdist_base: Any
|
||||
rpm_base: Any
|
||||
dist_dir: Any
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
from _typeshed import StrOrBytesPath
|
||||
from distutils.cmd import Command
|
||||
from typing import Any, ClassVar
|
||||
from typing import ClassVar
|
||||
|
||||
class bdist_wininst(Command):
|
||||
description: ClassVar[str]
|
||||
user_options: ClassVar[list[tuple[Any, ...]]]
|
||||
user_options: ClassVar[list[tuple[str, str | None, str]]]
|
||||
boolean_options: ClassVar[list[str]]
|
||||
|
||||
def initialize_options(self) -> None: ...
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from _typeshed import Unused
|
||||
from collections.abc import Callable
|
||||
from typing import Any, ClassVar
|
||||
|
||||
@@ -7,9 +8,9 @@ def show_compilers() -> None: ...
|
||||
|
||||
class build(Command):
|
||||
description: str
|
||||
user_options: Any
|
||||
boolean_options: Any
|
||||
help_options: Any
|
||||
user_options: ClassVar[list[tuple[str, str | None, str]]]
|
||||
boolean_options: ClassVar[list[str]]
|
||||
help_options: ClassVar[list[tuple[str, str | None, str, Callable[[], Unused]]]]
|
||||
build_base: str
|
||||
build_purelib: Any
|
||||
build_platlib: Any
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
from typing import Any
|
||||
from _typeshed import Unused
|
||||
from collections.abc import Callable
|
||||
from typing import Any, ClassVar
|
||||
|
||||
from ..cmd import Command
|
||||
|
||||
@@ -6,9 +8,9 @@ def show_compilers() -> None: ...
|
||||
|
||||
class build_clib(Command):
|
||||
description: str
|
||||
user_options: Any
|
||||
boolean_options: Any
|
||||
help_options: Any
|
||||
user_options: ClassVar[list[tuple[str, str, str]]]
|
||||
boolean_options: ClassVar[list[str]]
|
||||
help_options: ClassVar[list[tuple[str, str | None, str, Callable[[], Unused]]]]
|
||||
build_clib: Any
|
||||
build_temp: Any
|
||||
libraries: Any
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
from typing import Any
|
||||
from _typeshed import Unused
|
||||
from collections.abc import Callable
|
||||
from typing import Any, ClassVar
|
||||
|
||||
from ..cmd import Command
|
||||
|
||||
@@ -9,9 +11,9 @@ def show_compilers() -> None: ...
|
||||
class build_ext(Command):
|
||||
description: str
|
||||
sep_by: Any
|
||||
user_options: Any
|
||||
boolean_options: Any
|
||||
help_options: Any
|
||||
user_options: ClassVar[list[tuple[str, str | None, str]]]
|
||||
boolean_options: ClassVar[list[str]]
|
||||
help_options: ClassVar[list[tuple[str, str | None, str, Callable[[], Unused]]]]
|
||||
extensions: Any
|
||||
build_lib: Any
|
||||
plat_name: Any
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
from typing import Any, Literal
|
||||
from typing import Any, ClassVar, Literal
|
||||
|
||||
from ..cmd import Command
|
||||
from ..util import Mixin2to3 as Mixin2to3
|
||||
|
||||
class build_py(Command):
|
||||
description: str
|
||||
user_options: Any
|
||||
boolean_options: Any
|
||||
negative_opt: Any
|
||||
user_options: ClassVar[list[tuple[str, str | None, str]]]
|
||||
boolean_options: ClassVar[list[str]]
|
||||
negative_opt: ClassVar[dict[str, str]]
|
||||
build_lib: Any
|
||||
py_modules: Any
|
||||
package: Any
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from typing import Any
|
||||
from typing import Any, ClassVar
|
||||
|
||||
from ..cmd import Command
|
||||
from ..util import Mixin2to3 as Mixin2to3
|
||||
@@ -7,8 +7,8 @@ first_line_re: Any
|
||||
|
||||
class build_scripts(Command):
|
||||
description: str
|
||||
user_options: Any
|
||||
boolean_options: Any
|
||||
user_options: ClassVar[list[tuple[str, str, str]]]
|
||||
boolean_options: ClassVar[list[str]]
|
||||
build_dir: Any
|
||||
scripts: Any
|
||||
force: Any
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from typing import Any, Literal
|
||||
from typing import Any, ClassVar, Literal
|
||||
from typing_extensions import TypeAlias
|
||||
|
||||
from ..cmd import Command
|
||||
@@ -26,8 +26,8 @@ HAS_DOCUTILS: bool
|
||||
|
||||
class check(Command):
|
||||
description: str
|
||||
user_options: Any
|
||||
boolean_options: Any
|
||||
user_options: ClassVar[list[tuple[str, str, str]]]
|
||||
boolean_options: ClassVar[list[str]]
|
||||
restructuredtext: int
|
||||
metadata: int
|
||||
strict: int
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
from typing import Any
|
||||
from typing import Any, ClassVar
|
||||
|
||||
from ..cmd import Command
|
||||
|
||||
class clean(Command):
|
||||
description: str
|
||||
user_options: Any
|
||||
boolean_options: Any
|
||||
user_options: ClassVar[list[tuple[str, str | None, str]]]
|
||||
boolean_options: ClassVar[list[str]]
|
||||
build_base: Any
|
||||
build_lib: Any
|
||||
build_temp: Any
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
from _typeshed import StrOrBytesPath
|
||||
from collections.abc import Sequence
|
||||
from re import Pattern
|
||||
from typing import Any, Literal
|
||||
from typing import Any, ClassVar, Literal
|
||||
|
||||
from ..ccompiler import CCompiler
|
||||
from ..cmd import Command
|
||||
@@ -11,7 +11,7 @@ LANG_EXT: dict[str, str]
|
||||
class config(Command):
|
||||
description: str
|
||||
# Tuple is full name, short name, description
|
||||
user_options: Sequence[tuple[str, str | None, str]]
|
||||
user_options: ClassVar[list[tuple[str, str | None, str]]]
|
||||
compiler: str | CCompiler
|
||||
cc: str | None
|
||||
include_dirs: Sequence[str] | None
|
||||
|
||||
@@ -9,9 +9,9 @@ INSTALL_SCHEMES: dict[str, dict[Any, Any]]
|
||||
|
||||
class install(Command):
|
||||
description: str
|
||||
user_options: Any
|
||||
boolean_options: Any
|
||||
negative_opt: Any
|
||||
user_options: ClassVar[list[tuple[str, str | None, str]]]
|
||||
boolean_options: ClassVar[list[str]]
|
||||
negative_opt: ClassVar[dict[str, str]]
|
||||
prefix: str | None
|
||||
exec_prefix: Any
|
||||
home: str | None
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
from typing import Any
|
||||
from typing import Any, ClassVar
|
||||
|
||||
from ..cmd import Command
|
||||
|
||||
class install_data(Command):
|
||||
description: str
|
||||
user_options: Any
|
||||
boolean_options: Any
|
||||
user_options: ClassVar[list[tuple[str, str | None, str]]]
|
||||
boolean_options: ClassVar[list[str]]
|
||||
install_dir: Any
|
||||
outfiles: Any
|
||||
root: Any
|
||||
|
||||
@@ -4,7 +4,7 @@ from ..cmd import Command
|
||||
|
||||
class install_egg_info(Command):
|
||||
description: ClassVar[str]
|
||||
user_options: ClassVar[list[tuple[str, str | None, str]]]
|
||||
user_options: ClassVar[list[tuple[str, str, str]]]
|
||||
install_dir: Any
|
||||
def initialize_options(self) -> None: ...
|
||||
target: Any
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
from typing import Any
|
||||
from typing import Any, ClassVar
|
||||
|
||||
from ..cmd import Command
|
||||
|
||||
class install_headers(Command):
|
||||
description: str
|
||||
user_options: Any
|
||||
boolean_options: Any
|
||||
user_options: ClassVar[list[tuple[str, str, str]]]
|
||||
boolean_options: ClassVar[list[str]]
|
||||
install_dir: Any
|
||||
force: int
|
||||
outfiles: Any
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from typing import Any
|
||||
from typing import Any, ClassVar
|
||||
|
||||
from ..cmd import Command
|
||||
|
||||
@@ -6,9 +6,9 @@ PYTHON_SOURCE_EXTENSION: str
|
||||
|
||||
class install_lib(Command):
|
||||
description: str
|
||||
user_options: Any
|
||||
boolean_options: Any
|
||||
negative_opt: Any
|
||||
user_options: ClassVar[list[tuple[str, str | None, str]]]
|
||||
boolean_options: ClassVar[list[str]]
|
||||
negative_opt: ClassVar[dict[str, str]]
|
||||
install_dir: Any
|
||||
build_dir: Any
|
||||
force: int
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
from typing import Any
|
||||
from typing import Any, ClassVar
|
||||
|
||||
from ..cmd import Command
|
||||
|
||||
class install_scripts(Command):
|
||||
description: str
|
||||
user_options: Any
|
||||
boolean_options: Any
|
||||
user_options: ClassVar[list[tuple[str, str | None, str]]]
|
||||
boolean_options: ClassVar[list[str]]
|
||||
install_dir: Any
|
||||
force: int
|
||||
build_dir: Any
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from _typeshed import Unused
|
||||
from collections.abc import Callable
|
||||
from typing import Any, ClassVar
|
||||
|
||||
@@ -8,13 +9,13 @@ def show_formats() -> None: ...
|
||||
class sdist(Command):
|
||||
description: str
|
||||
def checking_metadata(self): ...
|
||||
user_options: Any
|
||||
boolean_options: Any
|
||||
help_options: Any
|
||||
negative_opt: Any
|
||||
user_options: ClassVar[list[tuple[str, str | None, str]]]
|
||||
boolean_options: ClassVar[list[str]]
|
||||
help_options: ClassVar[list[tuple[str, str | None, str, Callable[[], Unused]]]]
|
||||
negative_opt: ClassVar[dict[str, str]]
|
||||
# Any to work around variance issues
|
||||
sub_commands: ClassVar[list[tuple[str, Callable[[Any], bool] | None]]]
|
||||
READMES: Any
|
||||
READMES: ClassVar[tuple[str, ...]]
|
||||
template: Any
|
||||
manifest: Any
|
||||
use_defaults: int
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
from _typeshed import Incomplete, StrOrBytesPath, StrPath, SupportsWrite
|
||||
from collections.abc import Iterable, Mapping
|
||||
from collections.abc import Iterable, MutableMapping
|
||||
from distutils.cmd import Command
|
||||
from re import Pattern
|
||||
from typing import IO, Any, ClassVar, Literal, TypeVar, overload
|
||||
from typing import IO, ClassVar, Literal, TypeVar, overload
|
||||
from typing_extensions import TypeAlias
|
||||
|
||||
command_re: Pattern[str]
|
||||
@@ -60,7 +60,7 @@ class DistributionMetadata:
|
||||
class Distribution:
|
||||
cmdclass: dict[str, type[Command]]
|
||||
metadata: DistributionMetadata
|
||||
def __init__(self, attrs: Mapping[str, Any] | None = None) -> None: ...
|
||||
def __init__(self, attrs: MutableMapping[str, Incomplete] | None = None) -> None: ...
|
||||
def get_option_dict(self, command: str) -> dict[str, tuple[str, str]]: ...
|
||||
def parse_config_files(self, filenames: Iterable[str] | None = None) -> None: ...
|
||||
@overload
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
from _typeshed import StrPath, Unused
|
||||
from collections.abc import Callable, Container, Iterable, Mapping
|
||||
from typing import Any, Literal
|
||||
from typing_extensions import TypeVarTuple, Unpack
|
||||
|
||||
_Ts = TypeVarTuple("_Ts")
|
||||
|
||||
def get_host_platform() -> str: ...
|
||||
def get_platform() -> str: ...
|
||||
@@ -10,8 +13,8 @@ def check_environ() -> None: ...
|
||||
def subst_vars(s: str, local_vars: Mapping[str, str]) -> None: ...
|
||||
def split_quoted(s: str) -> list[str]: ...
|
||||
def execute(
|
||||
func: Callable[..., object],
|
||||
args: tuple[Any, ...],
|
||||
func: Callable[[Unpack[_Ts]], Unused],
|
||||
args: tuple[Unpack[_Ts]],
|
||||
msg: str | None = None,
|
||||
verbose: bool | Literal[0, 1] = 0,
|
||||
dry_run: bool | Literal[0, 1] = 0,
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
from collections.abc import Callable, Iterator
|
||||
from email.message import Message
|
||||
from typing import overload
|
||||
from typing import Final, overload
|
||||
|
||||
__all__ = ["Charset", "add_alias", "add_charset", "add_codec"]
|
||||
|
||||
QP: int # undocumented
|
||||
BASE64: int # undocumented
|
||||
SHORTEST: int # undocumented
|
||||
QP: Final[int] # undocumented
|
||||
BASE64: Final[int] # undocumented
|
||||
SHORTEST: Final[int] # undocumented
|
||||
|
||||
class Charset:
|
||||
input_charset: str
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import sys
|
||||
from _typeshed import FileDescriptorLike, ReadOnlyBuffer, WriteableBuffer
|
||||
from typing import Any, Literal, overload
|
||||
from typing import Any, Final, Literal, overload
|
||||
from typing_extensions import Buffer
|
||||
|
||||
if sys.platform != "win32":
|
||||
@@ -44,9 +44,10 @@ if sys.platform != "win32":
|
||||
F_SEAL_SHRINK: int
|
||||
F_SEAL_WRITE: int
|
||||
if sys.version_info >= (3, 9):
|
||||
F_OFD_GETLK: int
|
||||
F_OFD_SETLK: int
|
||||
F_OFD_SETLKW: int
|
||||
F_OFD_GETLK: Final[int]
|
||||
F_OFD_SETLK: Final[int]
|
||||
F_OFD_SETLKW: Final[int]
|
||||
|
||||
if sys.version_info >= (3, 10):
|
||||
F_GETPIPE_SZ: int
|
||||
F_SETPIPE_SZ: int
|
||||
@@ -105,6 +106,36 @@ if sys.platform != "win32":
|
||||
FICLONE: int
|
||||
FICLONERANGE: int
|
||||
|
||||
if sys.version_info >= (3, 13) and sys.platform == "linux":
|
||||
F_OWNER_TID: Final = 0
|
||||
F_OWNER_PID: Final = 1
|
||||
F_OWNER_PGRP: Final = 2
|
||||
F_SETOWN_EX: Final = 15
|
||||
F_GETOWN_EX: Final = 16
|
||||
F_SEAL_FUTURE_WRITE: Final = 16
|
||||
F_GET_RW_HINT: Final = 1035
|
||||
F_SET_RW_HINT: Final = 1036
|
||||
F_GET_FILE_RW_HINT: Final = 1037
|
||||
F_SET_FILE_RW_HINT: Final = 1038
|
||||
RWH_WRITE_LIFE_NOT_SET: Final = 0
|
||||
RWH_WRITE_LIFE_NONE: Final = 1
|
||||
RWH_WRITE_LIFE_SHORT: Final = 2
|
||||
RWH_WRITE_LIFE_MEDIUM: Final = 3
|
||||
RWH_WRITE_LIFE_LONG: Final = 4
|
||||
RWH_WRITE_LIFE_EXTREME: Final = 5
|
||||
|
||||
if sys.version_info >= (3, 11) and sys.platform == "darwin":
|
||||
F_OFD_SETLK: Final = 90
|
||||
F_OFD_SETLKW: Final = 91
|
||||
F_OFD_GETLK: Final = 92
|
||||
|
||||
if sys.version_info >= (3, 13) and sys.platform != "linux":
|
||||
# OSx and NetBSD
|
||||
F_GETNOSIGPIPE: Final[int]
|
||||
F_SETNOSIGPIPE: Final[int]
|
||||
# OSx and FreeBSD
|
||||
F_RDAHEAD: Final[int]
|
||||
|
||||
@overload
|
||||
def fcntl(fd: FileDescriptorLike, cmd: int, arg: int = 0, /) -> int: ...
|
||||
@overload
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import sys
|
||||
from _typeshed import GenericPath, StrOrBytesPath
|
||||
from collections.abc import Callable, Iterable, Sequence
|
||||
from typing import Any, AnyStr, Generic, Literal
|
||||
from typing import Any, AnyStr, Final, Generic, Literal
|
||||
|
||||
if sys.version_info >= (3, 9):
|
||||
from types import GenericAlias
|
||||
@@ -9,7 +9,7 @@ if sys.version_info >= (3, 9):
|
||||
__all__ = ["clear_cache", "cmp", "dircmp", "cmpfiles", "DEFAULT_IGNORES"]
|
||||
|
||||
DEFAULT_IGNORES: list[str]
|
||||
BUFSIZE: Literal[8192]
|
||||
BUFSIZE: Final = 8192
|
||||
|
||||
def cmp(f1: StrOrBytesPath, f2: StrOrBytesPath, shallow: bool | Literal[0, 1] = True) -> bool: ...
|
||||
def cmpfiles(
|
||||
|
||||
@@ -4,16 +4,16 @@ from collections.abc import Callable, Iterable, Iterator
|
||||
from socket import socket
|
||||
from ssl import SSLContext
|
||||
from types import TracebackType
|
||||
from typing import Any, Literal, TextIO
|
||||
from typing import Any, Final, Literal, TextIO
|
||||
from typing_extensions import Self
|
||||
|
||||
__all__ = ["FTP", "error_reply", "error_temp", "error_perm", "error_proto", "all_errors", "FTP_TLS"]
|
||||
|
||||
MSG_OOB: Literal[1]
|
||||
FTP_PORT: Literal[21]
|
||||
MAXLINE: Literal[8192]
|
||||
CRLF: Literal["\r\n"]
|
||||
B_CRLF: Literal[b"\r\n"]
|
||||
MSG_OOB: Final = 1
|
||||
FTP_PORT: Final = 21
|
||||
MAXLINE: Final = 8192
|
||||
CRLF: Final = "\r\n"
|
||||
B_CRLF: Final = b"\r\n"
|
||||
|
||||
class Error(Exception): ...
|
||||
class error_reply(Error): ...
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
import sys
|
||||
from collections.abc import Callable
|
||||
from typing import Any, Literal
|
||||
from typing import Any, Final, Literal
|
||||
from typing_extensions import TypeAlias
|
||||
|
||||
DEBUG_COLLECTABLE: Literal[2]
|
||||
DEBUG_LEAK: Literal[38]
|
||||
DEBUG_SAVEALL: Literal[32]
|
||||
DEBUG_STATS: Literal[1]
|
||||
DEBUG_UNCOLLECTABLE: Literal[4]
|
||||
DEBUG_COLLECTABLE: Final = 2
|
||||
DEBUG_LEAK: Final = 38
|
||||
DEBUG_SAVEALL: Final = 32
|
||||
DEBUG_STATS: Final = 1
|
||||
DEBUG_UNCOLLECTABLE: Final = 4
|
||||
|
||||
_CallbackType: TypeAlias = Callable[[Literal["start", "stop"], dict[str, int]], object]
|
||||
|
||||
@@ -34,4 +34,4 @@ if sys.version_info >= (3, 9):
|
||||
|
||||
def isenabled() -> bool: ...
|
||||
def set_debug(flags: int, /) -> None: ...
|
||||
def set_threshold(threshold0: int, threshold1: int = ..., threshold2: int = ...) -> None: ...
|
||||
def set_threshold(threshold0: int, threshold1: int = ..., threshold2: int = ..., /) -> None: ...
|
||||
|
||||
@@ -3,7 +3,7 @@ import sys
|
||||
import zlib
|
||||
from _typeshed import ReadableBuffer, SizedBuffer, StrOrBytesPath
|
||||
from io import FileIO
|
||||
from typing import Literal, Protocol, TextIO, overload
|
||||
from typing import Final, Literal, Protocol, TextIO, overload
|
||||
from typing_extensions import TypeAlias
|
||||
|
||||
__all__ = ["BadGzipFile", "GzipFile", "open", "compress", "decompress"]
|
||||
@@ -12,14 +12,14 @@ _ReadBinaryMode: TypeAlias = Literal["r", "rb"]
|
||||
_WriteBinaryMode: TypeAlias = Literal["a", "ab", "w", "wb", "x", "xb"]
|
||||
_OpenTextMode: TypeAlias = Literal["rt", "at", "wt", "xt"]
|
||||
|
||||
READ: object # undocumented
|
||||
WRITE: object # undocumented
|
||||
READ: Final[object] # undocumented
|
||||
WRITE: Final[object] # undocumented
|
||||
|
||||
FTEXT: int # actually Literal[1] # undocumented
|
||||
FHCRC: int # actually Literal[2] # undocumented
|
||||
FEXTRA: int # actually Literal[4] # undocumented
|
||||
FNAME: int # actually Literal[8] # undocumented
|
||||
FCOMMENT: int # actually Literal[16] # undocumented
|
||||
FTEXT: Final[int] # actually Literal[1] # undocumented
|
||||
FHCRC: Final[int] # actually Literal[2] # undocumented
|
||||
FEXTRA: Final[int] # actually Literal[4] # undocumented
|
||||
FNAME: Final[int] # actually Literal[8] # undocumented
|
||||
FCOMMENT: Final[int] # actually Literal[16] # undocumented
|
||||
|
||||
class _ReadableFileobj(Protocol):
|
||||
def read(self, n: int, /) -> bytes: ...
|
||||
|
||||
@@ -42,7 +42,7 @@ class CookieJar(Iterable[Cookie]):
|
||||
def __len__(self) -> int: ...
|
||||
|
||||
class FileCookieJar(CookieJar):
|
||||
filename: str
|
||||
filename: str | None
|
||||
delayload: bool
|
||||
def __init__(self, filename: StrPath | None = None, delayload: bool = False, policy: CookiePolicy | None = None) -> None: ...
|
||||
def save(self, filename: str | None = None, ignore_discard: bool = False, ignore_expires: bool = False) -> None: ...
|
||||
|
||||
@@ -25,7 +25,7 @@ from types import (
|
||||
TracebackType,
|
||||
WrapperDescriptorType,
|
||||
)
|
||||
from typing import Any, ClassVar, Literal, NamedTuple, Protocol, TypeVar, overload
|
||||
from typing import Any, ClassVar, Final, Literal, NamedTuple, Protocol, TypeVar, overload
|
||||
from typing_extensions import ParamSpec, Self, TypeAlias, TypeGuard, TypeIs
|
||||
|
||||
if sys.version_info >= (3, 11):
|
||||
@@ -161,17 +161,17 @@ class BlockFinder:
|
||||
last: int
|
||||
def tokeneater(self, type: int, token: str, srowcol: tuple[int, int], erowcol: tuple[int, int], line: str) -> None: ...
|
||||
|
||||
CO_OPTIMIZED: Literal[1]
|
||||
CO_NEWLOCALS: Literal[2]
|
||||
CO_VARARGS: Literal[4]
|
||||
CO_VARKEYWORDS: Literal[8]
|
||||
CO_NESTED: Literal[16]
|
||||
CO_GENERATOR: Literal[32]
|
||||
CO_NOFREE: Literal[64]
|
||||
CO_COROUTINE: Literal[128]
|
||||
CO_ITERABLE_COROUTINE: Literal[256]
|
||||
CO_ASYNC_GENERATOR: Literal[512]
|
||||
TPFLAGS_IS_ABSTRACT: Literal[1048576]
|
||||
CO_OPTIMIZED: Final = 1
|
||||
CO_NEWLOCALS: Final = 2
|
||||
CO_VARARGS: Final = 4
|
||||
CO_VARKEYWORDS: Final = 8
|
||||
CO_NESTED: Final = 16
|
||||
CO_GENERATOR: Final = 32
|
||||
CO_NOFREE: Final = 64
|
||||
CO_COROUTINE: Final = 128
|
||||
CO_ITERABLE_COROUTINE: Final = 256
|
||||
CO_ASYNC_GENERATOR: Final = 512
|
||||
TPFLAGS_IS_ABSTRACT: Final = 1048576
|
||||
|
||||
modulesbyfile: dict[str, Any]
|
||||
|
||||
@@ -364,10 +364,10 @@ class _ParameterKind(enum.IntEnum):
|
||||
def description(self) -> str: ...
|
||||
|
||||
if sys.version_info >= (3, 12):
|
||||
AGEN_CREATED: Literal["AGEN_CREATED"]
|
||||
AGEN_RUNNING: Literal["AGEN_RUNNING"]
|
||||
AGEN_SUSPENDED: Literal["AGEN_SUSPENDED"]
|
||||
AGEN_CLOSED: Literal["AGEN_CLOSED"]
|
||||
AGEN_CREATED: Final = "AGEN_CREATED"
|
||||
AGEN_RUNNING: Final = "AGEN_RUNNING"
|
||||
AGEN_SUSPENDED: Final = "AGEN_SUSPENDED"
|
||||
AGEN_CLOSED: Final = "AGEN_CLOSED"
|
||||
|
||||
def getasyncgenstate(
|
||||
agen: AsyncGenerator[Any, Any]
|
||||
@@ -584,19 +584,19 @@ def getattr_static(obj: object, attr: str, default: Any | None = ...) -> Any: ..
|
||||
# Current State of Generators and Coroutines
|
||||
#
|
||||
|
||||
GEN_CREATED: Literal["GEN_CREATED"]
|
||||
GEN_RUNNING: Literal["GEN_RUNNING"]
|
||||
GEN_SUSPENDED: Literal["GEN_SUSPENDED"]
|
||||
GEN_CLOSED: Literal["GEN_CLOSED"]
|
||||
GEN_CREATED: Final = "GEN_CREATED"
|
||||
GEN_RUNNING: Final = "GEN_RUNNING"
|
||||
GEN_SUSPENDED: Final = "GEN_SUSPENDED"
|
||||
GEN_CLOSED: Final = "GEN_CLOSED"
|
||||
|
||||
def getgeneratorstate(
|
||||
generator: Generator[Any, Any, Any]
|
||||
) -> Literal["GEN_CREATED", "GEN_RUNNING", "GEN_SUSPENDED", "GEN_CLOSED"]: ...
|
||||
|
||||
CORO_CREATED: Literal["CORO_CREATED"]
|
||||
CORO_RUNNING: Literal["CORO_RUNNING"]
|
||||
CORO_SUSPENDED: Literal["CORO_SUSPENDED"]
|
||||
CORO_CLOSED: Literal["CORO_CLOSED"]
|
||||
CORO_CREATED: Final = "CORO_CREATED"
|
||||
CORO_RUNNING: Final = "CORO_RUNNING"
|
||||
CORO_SUSPENDED: Final = "CORO_SUSPENDED"
|
||||
CORO_CLOSED: Final = "CORO_CLOSED"
|
||||
|
||||
def getcoroutinestate(
|
||||
coroutine: Coroutine[Any, Any, Any]
|
||||
|
||||
@@ -6,7 +6,7 @@ from _typeshed import FileDescriptorOrPath, ReadableBuffer, WriteableBuffer
|
||||
from collections.abc import Callable, Iterable, Iterator
|
||||
from os import _Opener
|
||||
from types import TracebackType
|
||||
from typing import IO, Any, BinaryIO, Generic, Literal, Protocol, TextIO, TypeVar, overload, type_check_only
|
||||
from typing import IO, Any, BinaryIO, Final, Generic, Literal, Protocol, TextIO, TypeVar, overload, type_check_only
|
||||
from typing_extensions import Self
|
||||
|
||||
__all__ = [
|
||||
@@ -36,11 +36,11 @@ if sys.version_info >= (3, 11):
|
||||
|
||||
_T = TypeVar("_T")
|
||||
|
||||
DEFAULT_BUFFER_SIZE: Literal[8192]
|
||||
DEFAULT_BUFFER_SIZE: Final = 8192
|
||||
|
||||
SEEK_SET: Literal[0]
|
||||
SEEK_CUR: Literal[1]
|
||||
SEEK_END: Literal[2]
|
||||
SEEK_SET: Final = 0
|
||||
SEEK_CUR: Final = 1
|
||||
SEEK_END: Final = 2
|
||||
|
||||
open = builtins.open
|
||||
|
||||
@@ -168,7 +168,7 @@ class _WrappedBuffer(Protocol):
|
||||
def writable(self) -> bool: ...
|
||||
def truncate(self, size: int, /) -> int: ...
|
||||
def fileno(self) -> int: ...
|
||||
def isatty(self) -> int: ...
|
||||
def isatty(self) -> bool: ...
|
||||
# Optional: Only needs to be present if seekable() returns True.
|
||||
# def seek(self, offset: Literal[0], whence: Literal[2]) -> int: ...
|
||||
# def tell(self) -> int: ...
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import sys
|
||||
from collections.abc import Iterable, Iterator
|
||||
from typing import Any, Generic, Literal, SupportsInt, TypeVar, overload
|
||||
from typing import Any, Final, Generic, Literal, SupportsInt, TypeVar, overload
|
||||
from typing_extensions import Self, TypeAlias
|
||||
|
||||
# Undocumented length constants
|
||||
IPV4LENGTH: Literal[32]
|
||||
IPV6LENGTH: Literal[128]
|
||||
IPV4LENGTH: Final = 32
|
||||
IPV6LENGTH: Final = 128
|
||||
|
||||
_A = TypeVar("_A", IPv4Address, IPv6Address)
|
||||
_N = TypeVar("_N", IPv4Network, IPv6Network)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
from typing import ClassVar, Literal
|
||||
from typing import ClassVar, Final, Literal
|
||||
|
||||
from ..fixer_base import BaseFix
|
||||
|
||||
NAMES: dict[str, str]
|
||||
NAMES: Final[dict[str, str]]
|
||||
|
||||
class FixAsserts(BaseFix):
|
||||
BM_compatible: ClassVar[Literal[False]]
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
from typing import ClassVar, Literal
|
||||
from typing import ClassVar, Final, Literal
|
||||
|
||||
from .. import fixer_base
|
||||
|
||||
CMP: str
|
||||
TYPE: str
|
||||
CMP: Final[str]
|
||||
TYPE: Final[str]
|
||||
|
||||
class FixIdioms(fixer_base.BaseFix):
|
||||
BM_compatible: ClassVar[Literal[False]]
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
from _typeshed import StrPath
|
||||
from collections.abc import Generator
|
||||
from typing import ClassVar, Literal
|
||||
from typing import ClassVar, Final, Literal
|
||||
|
||||
from .. import fixer_base
|
||||
from ..pytree import Node
|
||||
|
||||
MAPPING: dict[str, str]
|
||||
MAPPING: Final[dict[str, str]]
|
||||
|
||||
def alternates(members): ...
|
||||
def build_pattern(mapping=...) -> Generator[str, None, None]: ...
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
from typing import Final
|
||||
|
||||
from . import fix_imports
|
||||
|
||||
MAPPING: dict[str, str]
|
||||
MAPPING: Final[dict[str, str]]
|
||||
|
||||
class FixImports2(fix_imports.FixImports):
|
||||
mapping = MAPPING
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
from typing import ClassVar, Literal
|
||||
from typing import ClassVar, Final, Literal
|
||||
|
||||
from .. import fixer_base
|
||||
|
||||
MAP: dict[str, str]
|
||||
MAP: Final[dict[str, str]]
|
||||
|
||||
class FixMethodattrs(fixer_base.BaseFix):
|
||||
BM_compatible: ClassVar[Literal[True]]
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
from collections.abc import Generator
|
||||
from typing import ClassVar, Literal
|
||||
from typing import ClassVar, Final, Literal
|
||||
|
||||
from .. import fixer_base
|
||||
|
||||
MAPPING: dict[str, dict[str, str]]
|
||||
LOOKUP: dict[tuple[str, str], str]
|
||||
MAPPING: Final[dict[str, dict[str, str]]]
|
||||
LOOKUP: Final[dict[tuple[str, str], str]]
|
||||
|
||||
def alternates(members): ...
|
||||
def build_pattern() -> Generator[str, None, None]: ...
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
from collections.abc import Generator
|
||||
from typing import Literal
|
||||
from typing import Final, Literal
|
||||
|
||||
from .fix_imports import FixImports
|
||||
|
||||
MAPPING: dict[str, list[tuple[Literal["urllib.request", "urllib.parse", "urllib.error"], list[str]]]]
|
||||
MAPPING: Final[dict[str, list[tuple[Literal["urllib.request", "urllib.parse", "urllib.error"], list[str]]]]]
|
||||
|
||||
def build_pattern() -> Generator[str, None, None]: ...
|
||||
|
||||
|
||||
@@ -1,65 +1,67 @@
|
||||
ENDMARKER: int
|
||||
NAME: int
|
||||
NUMBER: int
|
||||
STRING: int
|
||||
NEWLINE: int
|
||||
INDENT: int
|
||||
DEDENT: int
|
||||
LPAR: int
|
||||
RPAR: int
|
||||
LSQB: int
|
||||
RSQB: int
|
||||
COLON: int
|
||||
COMMA: int
|
||||
SEMI: int
|
||||
PLUS: int
|
||||
MINUS: int
|
||||
STAR: int
|
||||
SLASH: int
|
||||
VBAR: int
|
||||
AMPER: int
|
||||
LESS: int
|
||||
GREATER: int
|
||||
EQUAL: int
|
||||
DOT: int
|
||||
PERCENT: int
|
||||
BACKQUOTE: int
|
||||
LBRACE: int
|
||||
RBRACE: int
|
||||
EQEQUAL: int
|
||||
NOTEQUAL: int
|
||||
LESSEQUAL: int
|
||||
GREATEREQUAL: int
|
||||
TILDE: int
|
||||
CIRCUMFLEX: int
|
||||
LEFTSHIFT: int
|
||||
RIGHTSHIFT: int
|
||||
DOUBLESTAR: int
|
||||
PLUSEQUAL: int
|
||||
MINEQUAL: int
|
||||
STAREQUAL: int
|
||||
SLASHEQUAL: int
|
||||
PERCENTEQUAL: int
|
||||
AMPEREQUAL: int
|
||||
VBAREQUAL: int
|
||||
CIRCUMFLEXEQUAL: int
|
||||
LEFTSHIFTEQUAL: int
|
||||
RIGHTSHIFTEQUAL: int
|
||||
DOUBLESTAREQUAL: int
|
||||
DOUBLESLASH: int
|
||||
DOUBLESLASHEQUAL: int
|
||||
OP: int
|
||||
COMMENT: int
|
||||
NL: int
|
||||
RARROW: int
|
||||
AT: int
|
||||
ATEQUAL: int
|
||||
AWAIT: int
|
||||
ASYNC: int
|
||||
ERRORTOKEN: int
|
||||
COLONEQUAL: int
|
||||
N_TOKENS: int
|
||||
NT_OFFSET: int
|
||||
from typing import Final
|
||||
|
||||
ENDMARKER: Final[int]
|
||||
NAME: Final[int]
|
||||
NUMBER: Final[int]
|
||||
STRING: Final[int]
|
||||
NEWLINE: Final[int]
|
||||
INDENT: Final[int]
|
||||
DEDENT: Final[int]
|
||||
LPAR: Final[int]
|
||||
RPAR: Final[int]
|
||||
LSQB: Final[int]
|
||||
RSQB: Final[int]
|
||||
COLON: Final[int]
|
||||
COMMA: Final[int]
|
||||
SEMI: Final[int]
|
||||
PLUS: Final[int]
|
||||
MINUS: Final[int]
|
||||
STAR: Final[int]
|
||||
SLASH: Final[int]
|
||||
VBAR: Final[int]
|
||||
AMPER: Final[int]
|
||||
LESS: Final[int]
|
||||
GREATER: Final[int]
|
||||
EQUAL: Final[int]
|
||||
DOT: Final[int]
|
||||
PERCENT: Final[int]
|
||||
BACKQUOTE: Final[int]
|
||||
LBRACE: Final[int]
|
||||
RBRACE: Final[int]
|
||||
EQEQUAL: Final[int]
|
||||
NOTEQUAL: Final[int]
|
||||
LESSEQUAL: Final[int]
|
||||
GREATEREQUAL: Final[int]
|
||||
TILDE: Final[int]
|
||||
CIRCUMFLEX: Final[int]
|
||||
LEFTSHIFT: Final[int]
|
||||
RIGHTSHIFT: Final[int]
|
||||
DOUBLESTAR: Final[int]
|
||||
PLUSEQUAL: Final[int]
|
||||
MINEQUAL: Final[int]
|
||||
STAREQUAL: Final[int]
|
||||
SLASHEQUAL: Final[int]
|
||||
PERCENTEQUAL: Final[int]
|
||||
AMPEREQUAL: Final[int]
|
||||
VBAREQUAL: Final[int]
|
||||
CIRCUMFLEXEQUAL: Final[int]
|
||||
LEFTSHIFTEQUAL: Final[int]
|
||||
RIGHTSHIFTEQUAL: Final[int]
|
||||
DOUBLESTAREQUAL: Final[int]
|
||||
DOUBLESLASH: Final[int]
|
||||
DOUBLESLASHEQUAL: Final[int]
|
||||
OP: Final[int]
|
||||
COMMENT: Final[int]
|
||||
NL: Final[int]
|
||||
RARROW: Final[int]
|
||||
AT: Final[int]
|
||||
ATEQUAL: Final[int]
|
||||
AWAIT: Final[int]
|
||||
ASYNC: Final[int]
|
||||
ERRORTOKEN: Final[int]
|
||||
COLONEQUAL: Final[int]
|
||||
N_TOKENS: Final[int]
|
||||
NT_OFFSET: Final[int]
|
||||
tok_name: dict[int, str]
|
||||
|
||||
def ISTERMINAL(x: int) -> bool: ...
|
||||
|
||||
@@ -7,7 +7,7 @@ from re import Pattern
|
||||
from string import Template
|
||||
from time import struct_time
|
||||
from types import FrameType, TracebackType
|
||||
from typing import Any, ClassVar, Generic, Literal, Protocol, TextIO, TypeVar, overload
|
||||
from typing import Any, ClassVar, Final, Generic, Literal, Protocol, TextIO, TypeVar, overload
|
||||
from typing_extensions import Self, TypeAlias, deprecated
|
||||
|
||||
if sys.version_info >= (3, 11):
|
||||
@@ -236,14 +236,14 @@ class Logger(Filterer):
|
||||
def hasHandlers(self) -> bool: ...
|
||||
def callHandlers(self, record: LogRecord) -> None: ... # undocumented
|
||||
|
||||
CRITICAL: int
|
||||
FATAL: int
|
||||
ERROR: int
|
||||
WARNING: int
|
||||
WARN: int
|
||||
INFO: int
|
||||
DEBUG: int
|
||||
NOTSET: int
|
||||
CRITICAL: Final = 50
|
||||
FATAL: Final = CRITICAL
|
||||
ERROR: Final = 40
|
||||
WARNING: Final = 30
|
||||
WARN: Final = WARNING
|
||||
INFO: Final = 20
|
||||
DEBUG: Final = 10
|
||||
NOTSET: Final = 0
|
||||
|
||||
class Handler(Filterer):
|
||||
level: int # undocumented
|
||||
@@ -684,6 +684,6 @@ class StrFormatStyle(PercentStyle): # undocumented
|
||||
class StringTemplateStyle(PercentStyle): # undocumented
|
||||
_tpl: Template
|
||||
|
||||
_STYLES: dict[str, tuple[PercentStyle, str]]
|
||||
_STYLES: Final[dict[str, tuple[PercentStyle, str]]]
|
||||
|
||||
BASIC_FORMAT: str
|
||||
BASIC_FORMAT: Final[str]
|
||||
|
||||
@@ -4,14 +4,14 @@ from collections.abc import Callable, Hashable, Iterable, Sequence
|
||||
from configparser import RawConfigParser
|
||||
from re import Pattern
|
||||
from threading import Thread
|
||||
from typing import IO, Any, Literal, SupportsIndex, TypedDict, overload
|
||||
from typing import IO, Any, Final, Literal, SupportsIndex, TypedDict, overload
|
||||
from typing_extensions import Required, TypeAlias
|
||||
|
||||
from . import Filter, Filterer, Formatter, Handler, Logger, _FilterType, _FormatStyle, _Level
|
||||
|
||||
DEFAULT_LOGGING_CONFIG_PORT: int
|
||||
RESET_ERROR: int # undocumented
|
||||
IDENTIFIER: Pattern[str] # undocumented
|
||||
RESET_ERROR: Final[int] # undocumented
|
||||
IDENTIFIER: Final[Pattern[str]] # undocumented
|
||||
|
||||
if sys.version_info >= (3, 11):
|
||||
class _RootLoggerConfiguration(TypedDict, total=False):
|
||||
|
||||
@@ -8,16 +8,16 @@ from logging import FileHandler, Handler, LogRecord
|
||||
from re import Pattern
|
||||
from socket import SocketKind, socket
|
||||
from threading import Thread
|
||||
from typing import Any, ClassVar, Protocol, TypeVar
|
||||
from typing import Any, ClassVar, Final, Protocol, TypeVar
|
||||
|
||||
_T = TypeVar("_T")
|
||||
|
||||
DEFAULT_TCP_LOGGING_PORT: int
|
||||
DEFAULT_UDP_LOGGING_PORT: int
|
||||
DEFAULT_HTTP_LOGGING_PORT: int
|
||||
DEFAULT_SOAP_LOGGING_PORT: int
|
||||
SYSLOG_UDP_PORT: int
|
||||
SYSLOG_TCP_PORT: int
|
||||
DEFAULT_TCP_LOGGING_PORT: Final[int]
|
||||
DEFAULT_UDP_LOGGING_PORT: Final[int]
|
||||
DEFAULT_HTTP_LOGGING_PORT: Final[int]
|
||||
DEFAULT_SOAP_LOGGING_PORT: Final[int]
|
||||
SYSLOG_UDP_PORT: Final[int]
|
||||
SYSLOG_TCP_PORT: Final[int]
|
||||
|
||||
class WatchedFileHandler(FileHandler):
|
||||
dev: int # undocumented
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
from _compression import BaseStream
|
||||
from _typeshed import ReadableBuffer, StrOrBytesPath
|
||||
from collections.abc import Mapping, Sequence
|
||||
from typing import IO, Any, Literal, TextIO, final, overload
|
||||
from typing import IO, Any, Final, Literal, TextIO, final, overload
|
||||
from typing_extensions import Self, TypeAlias
|
||||
|
||||
__all__ = [
|
||||
@@ -50,33 +50,33 @@ _PathOrFile: TypeAlias = StrOrBytesPath | IO[bytes]
|
||||
|
||||
_FilterChain: TypeAlias = Sequence[Mapping[str, Any]]
|
||||
|
||||
FORMAT_AUTO: Literal[0]
|
||||
FORMAT_XZ: Literal[1]
|
||||
FORMAT_ALONE: Literal[2]
|
||||
FORMAT_RAW: Literal[3]
|
||||
CHECK_NONE: Literal[0]
|
||||
CHECK_CRC32: Literal[1]
|
||||
CHECK_CRC64: Literal[4]
|
||||
CHECK_SHA256: Literal[10]
|
||||
CHECK_ID_MAX: Literal[15]
|
||||
CHECK_UNKNOWN: Literal[16]
|
||||
FORMAT_AUTO: Final = 0
|
||||
FORMAT_XZ: Final = 1
|
||||
FORMAT_ALONE: Final = 2
|
||||
FORMAT_RAW: Final = 3
|
||||
CHECK_NONE: Final = 0
|
||||
CHECK_CRC32: Final = 1
|
||||
CHECK_CRC64: Final = 4
|
||||
CHECK_SHA256: Final = 10
|
||||
CHECK_ID_MAX: Final = 15
|
||||
CHECK_UNKNOWN: Final = 16
|
||||
FILTER_LZMA1: int # v big number
|
||||
FILTER_LZMA2: Literal[33]
|
||||
FILTER_DELTA: Literal[3]
|
||||
FILTER_X86: Literal[4]
|
||||
FILTER_IA64: Literal[6]
|
||||
FILTER_ARM: Literal[7]
|
||||
FILTER_ARMTHUMB: Literal[8]
|
||||
FILTER_SPARC: Literal[9]
|
||||
FILTER_POWERPC: Literal[5]
|
||||
MF_HC3: Literal[3]
|
||||
MF_HC4: Literal[4]
|
||||
MF_BT2: Literal[18]
|
||||
MF_BT3: Literal[19]
|
||||
MF_BT4: Literal[20]
|
||||
MODE_FAST: Literal[1]
|
||||
MODE_NORMAL: Literal[2]
|
||||
PRESET_DEFAULT: Literal[6]
|
||||
FILTER_LZMA2: Final = 33
|
||||
FILTER_DELTA: Final = 3
|
||||
FILTER_X86: Final = 4
|
||||
FILTER_IA64: Final = 6
|
||||
FILTER_ARM: Final = 7
|
||||
FILTER_ARMTHUMB: Final = 8
|
||||
FILTER_SPARC: Final = 9
|
||||
FILTER_POWERPC: Final = 5
|
||||
MF_HC3: Final = 3
|
||||
MF_HC4: Final = 4
|
||||
MF_BT2: Final = 18
|
||||
MF_BT3: Final = 19
|
||||
MF_BT4: Final = 20
|
||||
MODE_FAST: Final = 1
|
||||
MODE_NORMAL: Final = 2
|
||||
PRESET_DEFAULT: Final = 6
|
||||
PRESET_EXTREME: int # v big number
|
||||
|
||||
# from _lzma.c
|
||||
|
||||
@@ -118,4 +118,16 @@ if sys.version_info >= (3, 13) and sys.platform != "win32":
|
||||
MAP_32BIT: Final = 32768
|
||||
|
||||
if sys.version_info >= (3, 13) and sys.platform == "darwin":
|
||||
MAP_NORESERVE: Final = 64
|
||||
MAP_NOEXTEND: Final = 256
|
||||
MAP_HASSEMAPHORE: Final = 512
|
||||
MAP_NOCACHE: Final = 1024
|
||||
MAP_JIT: Final = 2048
|
||||
MAP_RESILIENT_CODESIGN: Final = 8192
|
||||
MAP_RESILIENT_MEDIA: Final = 16384
|
||||
MAP_TRANSLATED_ALLOW_EXECUTE: Final = 131072
|
||||
MAP_UNIX03: Final = 262144
|
||||
MAP_TPRO: Final = 524288
|
||||
|
||||
if sys.version_info >= (3, 13) and sys.platform == "linux":
|
||||
MAP_NORESERVE: Final = 16384
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
import sys
|
||||
from collections.abc import Container, Iterable, Iterator, Sequence
|
||||
from types import CodeType
|
||||
from typing import IO, Any
|
||||
from typing import IO, Any, Final
|
||||
|
||||
if sys.version_info < (3, 11):
|
||||
LOAD_CONST: int # undocumented
|
||||
IMPORT_NAME: int # undocumented
|
||||
STORE_NAME: int # undocumented
|
||||
STORE_GLOBAL: int # undocumented
|
||||
STORE_OPS: tuple[int, int] # undocumented
|
||||
EXTENDED_ARG: int # undocumented
|
||||
LOAD_CONST: Final[int] # undocumented
|
||||
IMPORT_NAME: Final[int] # undocumented
|
||||
STORE_NAME: Final[int] # undocumented
|
||||
STORE_GLOBAL: Final[int] # undocumented
|
||||
STORE_OPS: Final[tuple[int, int]] # undocumented
|
||||
EXTENDED_ARG: Final[int] # undocumented
|
||||
|
||||
packagePathMap: dict[str, list[str]] # undocumented
|
||||
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
import sys
|
||||
from typing import Final, Literal
|
||||
from typing import Final
|
||||
|
||||
# This module is only available on Windows
|
||||
if sys.platform == "win32":
|
||||
CRT_ASSEMBLY_VERSION: Final[str]
|
||||
LK_UNLCK: Literal[0]
|
||||
LK_LOCK: Literal[1]
|
||||
LK_NBLCK: Literal[2]
|
||||
LK_RLCK: Literal[3]
|
||||
LK_NBRLCK: Literal[4]
|
||||
LK_UNLCK: Final = 0
|
||||
LK_LOCK: Final = 1
|
||||
LK_NBLCK: Final = 2
|
||||
LK_RLCK: Final = 3
|
||||
LK_NBRLCK: Final = 4
|
||||
SEM_FAILCRITICALERRORS: int
|
||||
SEM_NOALIGNMENTFAULTEXCEPT: int
|
||||
SEM_NOGPFAULTERRORBOX: int
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
from _typeshed import FileDescriptorLike, Unused
|
||||
from collections.abc import Sequence
|
||||
from struct import Struct
|
||||
from typing import Any
|
||||
from typing import Any, Final
|
||||
|
||||
__all__ = ["ensure_running", "get_inherited_fds", "connect_to_new_process", "set_forkserver_preload"]
|
||||
|
||||
MAXFDS_TO_SEND: int
|
||||
SIGNED_STRUCT: Struct
|
||||
MAXFDS_TO_SEND: Final = 256
|
||||
SIGNED_STRUCT: Final[Struct]
|
||||
|
||||
class ForkServer:
|
||||
def set_forkserver_preload(self, modules_names: list[str]) -> None: ...
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user