Compare commits
3 Commits
david/fix-
...
dcreager/e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3782ccf028 | ||
|
|
5945ca6fce | ||
|
|
b5456c9395 |
1
.github/mypy-primer-ty.toml
vendored
1
.github/mypy-primer-ty.toml
vendored
@@ -5,4 +5,3 @@
|
||||
[rules]
|
||||
possibly-unresolved-reference = "warn"
|
||||
unused-ignore-comment = "warn"
|
||||
division-by-zero = "warn"
|
||||
|
||||
32
.github/workflows/ci.yaml
vendored
32
.github/workflows/ci.yaml
vendored
@@ -237,13 +237,13 @@ jobs:
|
||||
- name: "Install Rust toolchain"
|
||||
run: rustup show
|
||||
- name: "Install mold"
|
||||
uses: rui314/setup-mold@67424c1b3680e35255d95971cbd5de0047bf31c3 # v1
|
||||
uses: rui314/setup-mold@e16410e7f8d9e167b74ad5697a9089a35126eb50 # v1
|
||||
- name: "Install cargo nextest"
|
||||
uses: taiki-e/install-action@6c6479b49816fcc0975a31af977bdc1f847c2920 # v2.52.1
|
||||
uses: taiki-e/install-action@941e8a4d9d7cdb696bd4f017cf54aca281f8ffff # v2.51.2
|
||||
with:
|
||||
tool: cargo-nextest
|
||||
- name: "Install cargo insta"
|
||||
uses: taiki-e/install-action@6c6479b49816fcc0975a31af977bdc1f847c2920 # v2.52.1
|
||||
uses: taiki-e/install-action@941e8a4d9d7cdb696bd4f017cf54aca281f8ffff # v2.51.2
|
||||
with:
|
||||
tool: cargo-insta
|
||||
- name: ty mdtests (GitHub annotations)
|
||||
@@ -295,13 +295,13 @@ jobs:
|
||||
- name: "Install Rust toolchain"
|
||||
run: rustup show
|
||||
- name: "Install mold"
|
||||
uses: rui314/setup-mold@67424c1b3680e35255d95971cbd5de0047bf31c3 # v1
|
||||
uses: rui314/setup-mold@e16410e7f8d9e167b74ad5697a9089a35126eb50 # v1
|
||||
- name: "Install cargo nextest"
|
||||
uses: taiki-e/install-action@6c6479b49816fcc0975a31af977bdc1f847c2920 # v2.52.1
|
||||
uses: taiki-e/install-action@941e8a4d9d7cdb696bd4f017cf54aca281f8ffff # v2.51.2
|
||||
with:
|
||||
tool: cargo-nextest
|
||||
- name: "Install cargo insta"
|
||||
uses: taiki-e/install-action@6c6479b49816fcc0975a31af977bdc1f847c2920 # v2.52.1
|
||||
uses: taiki-e/install-action@941e8a4d9d7cdb696bd4f017cf54aca281f8ffff # v2.51.2
|
||||
with:
|
||||
tool: cargo-insta
|
||||
- name: "Run tests"
|
||||
@@ -324,7 +324,7 @@ jobs:
|
||||
- name: "Install Rust toolchain"
|
||||
run: rustup show
|
||||
- name: "Install cargo nextest"
|
||||
uses: taiki-e/install-action@6c6479b49816fcc0975a31af977bdc1f847c2920 # v2.52.1
|
||||
uses: taiki-e/install-action@941e8a4d9d7cdb696bd4f017cf54aca281f8ffff # v2.51.2
|
||||
with:
|
||||
tool: cargo-nextest
|
||||
- name: "Run tests"
|
||||
@@ -380,7 +380,7 @@ jobs:
|
||||
- name: "Install Rust toolchain"
|
||||
run: rustup show
|
||||
- name: "Install mold"
|
||||
uses: rui314/setup-mold@67424c1b3680e35255d95971cbd5de0047bf31c3 # v1
|
||||
uses: rui314/setup-mold@e16410e7f8d9e167b74ad5697a9089a35126eb50 # v1
|
||||
- name: "Build"
|
||||
run: cargo build --release --locked
|
||||
|
||||
@@ -405,13 +405,13 @@ jobs:
|
||||
MSRV: ${{ steps.msrv.outputs.value }}
|
||||
run: rustup default "${MSRV}"
|
||||
- name: "Install mold"
|
||||
uses: rui314/setup-mold@67424c1b3680e35255d95971cbd5de0047bf31c3 # v1
|
||||
uses: rui314/setup-mold@e16410e7f8d9e167b74ad5697a9089a35126eb50 # v1
|
||||
- name: "Install cargo nextest"
|
||||
uses: taiki-e/install-action@6c6479b49816fcc0975a31af977bdc1f847c2920 # v2.52.1
|
||||
uses: taiki-e/install-action@941e8a4d9d7cdb696bd4f017cf54aca281f8ffff # v2.51.2
|
||||
with:
|
||||
tool: cargo-nextest
|
||||
- name: "Install cargo insta"
|
||||
uses: taiki-e/install-action@6c6479b49816fcc0975a31af977bdc1f847c2920 # v2.52.1
|
||||
uses: taiki-e/install-action@941e8a4d9d7cdb696bd4f017cf54aca281f8ffff # v2.51.2
|
||||
with:
|
||||
tool: cargo-insta
|
||||
- name: "Run tests"
|
||||
@@ -459,7 +459,7 @@ jobs:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af426746bb # v6.1.0
|
||||
- uses: astral-sh/setup-uv@6b9c6063abd6010835644d4c2e1bef4cf5cd0fca # v6.0.1
|
||||
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
||||
name: Download Ruff binary to test
|
||||
id: download-cached-binary
|
||||
@@ -660,7 +660,7 @@ jobs:
|
||||
branch: ${{ github.event.pull_request.base.ref }}
|
||||
workflow: "ci.yaml"
|
||||
check_artifacts: true
|
||||
- uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af426746bb # v6.1.0
|
||||
- uses: astral-sh/setup-uv@6b9c6063abd6010835644d4c2e1bef4cf5cd0fca # v6.0.1
|
||||
- name: Fuzz
|
||||
env:
|
||||
FORCE_COLOR: 1
|
||||
@@ -730,7 +730,7 @@ jobs:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af426746bb # v6.1.0
|
||||
- uses: astral-sh/setup-uv@6b9c6063abd6010835644d4c2e1bef4cf5cd0fca # v6.0.1
|
||||
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
|
||||
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
@@ -773,7 +773,7 @@ jobs:
|
||||
- name: "Install Rust toolchain"
|
||||
run: rustup show
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af426746bb # v6.1.0
|
||||
uses: astral-sh/setup-uv@6b9c6063abd6010835644d4c2e1bef4cf5cd0fca # v6.0.1
|
||||
- name: "Install Insiders dependencies"
|
||||
if: ${{ env.MKDOCS_INSIDERS_SSH_KEY_EXISTS == 'true' }}
|
||||
run: uv pip install -r docs/requirements-insiders.txt --system
|
||||
@@ -910,7 +910,7 @@ jobs:
|
||||
run: rustup show
|
||||
|
||||
- name: "Install codspeed"
|
||||
uses: taiki-e/install-action@6c6479b49816fcc0975a31af977bdc1f847c2920 # v2.52.1
|
||||
uses: taiki-e/install-action@941e8a4d9d7cdb696bd4f017cf54aca281f8ffff # v2.51.2
|
||||
with:
|
||||
tool: cargo-codspeed
|
||||
|
||||
|
||||
4
.github/workflows/daily_fuzz.yaml
vendored
4
.github/workflows/daily_fuzz.yaml
vendored
@@ -34,11 +34,11 @@ jobs:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af426746bb # v6.1.0
|
||||
- uses: astral-sh/setup-uv@6b9c6063abd6010835644d4c2e1bef4cf5cd0fca # v6.0.1
|
||||
- name: "Install Rust toolchain"
|
||||
run: rustup show
|
||||
- name: "Install mold"
|
||||
uses: rui314/setup-mold@67424c1b3680e35255d95971cbd5de0047bf31c3 # v1
|
||||
uses: rui314/setup-mold@e16410e7f8d9e167b74ad5697a9089a35126eb50 # v1
|
||||
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
|
||||
- name: Build ruff
|
||||
# A debug build means the script runs slower once it gets started,
|
||||
|
||||
3
.github/workflows/mypy_primer.yaml
vendored
3
.github/workflows/mypy_primer.yaml
vendored
@@ -11,7 +11,6 @@ on:
|
||||
- "crates/ruff_python_parser"
|
||||
- ".github/workflows/mypy_primer.yaml"
|
||||
- ".github/workflows/mypy_primer_comment.yaml"
|
||||
- "Cargo.lock"
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number || github.sha }}
|
||||
@@ -37,7 +36,7 @@ jobs:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Install the latest version of uv
|
||||
uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af426746bb # v6.1.0
|
||||
uses: astral-sh/setup-uv@6b9c6063abd6010835644d4c2e1bef4cf5cd0fca # v6.0.1
|
||||
|
||||
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
|
||||
with:
|
||||
|
||||
2
.github/workflows/publish-pypi.yml
vendored
2
.github/workflows/publish-pypi.yml
vendored
@@ -22,7 +22,7 @@ jobs:
|
||||
id-token: write
|
||||
steps:
|
||||
- name: "Install uv"
|
||||
uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af426746bb # v6.1.0
|
||||
uses: astral-sh/setup-uv@6b9c6063abd6010835644d4c2e1bef4cf5cd0fca # v6.0.1
|
||||
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
||||
with:
|
||||
pattern: wheels-*
|
||||
|
||||
@@ -80,7 +80,7 @@ repos:
|
||||
pass_filenames: false # This makes it a lot faster
|
||||
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: v0.11.11
|
||||
rev: v0.11.10
|
||||
hooks:
|
||||
- id: ruff-format
|
||||
- id: ruff
|
||||
@@ -98,7 +98,7 @@ repos:
|
||||
# zizmor detects security vulnerabilities in GitHub Actions workflows.
|
||||
# Additional configuration for the tool is found in `.github/zizmor.yml`
|
||||
- repo: https://github.com/woodruffw/zizmor-pre-commit
|
||||
rev: v1.8.0
|
||||
rev: v1.7.0
|
||||
hooks:
|
||||
- id: zizmor
|
||||
|
||||
|
||||
25
CHANGELOG.md
25
CHANGELOG.md
@@ -1,30 +1,5 @@
|
||||
# Changelog
|
||||
|
||||
## 0.11.11
|
||||
|
||||
### Preview features
|
||||
|
||||
- \[`airflow`\] Add autofixes for `AIR302` and `AIR312` ([#17942](https://github.com/astral-sh/ruff/pull/17942))
|
||||
- \[`airflow`\] Move rules from `AIR312` to `AIR302` ([#17940](https://github.com/astral-sh/ruff/pull/17940))
|
||||
- \[`airflow`\] Update `AIR301` and `AIR311` with the latest Airflow implementations ([#17985](https://github.com/astral-sh/ruff/pull/17985))
|
||||
- \[`flake8-simplify`\] Enable fix in preview mode (`SIM117`) ([#18208](https://github.com/astral-sh/ruff/pull/18208))
|
||||
|
||||
### Bug fixes
|
||||
|
||||
- Fix inconsistent formatting of match-case on `[]` and `_` ([#18147](https://github.com/astral-sh/ruff/pull/18147))
|
||||
- \[`pylint`\] Fix `PLW1514` not recognizing the `encoding` positional argument of `codecs.open` ([#18109](https://github.com/astral-sh/ruff/pull/18109))
|
||||
|
||||
### CLI
|
||||
|
||||
- Add full option name in formatter warning ([#18217](https://github.com/astral-sh/ruff/pull/18217))
|
||||
|
||||
### Documentation
|
||||
|
||||
- Fix rendering of admonition in docs ([#18163](https://github.com/astral-sh/ruff/pull/18163))
|
||||
- \[`flake8-print`\] Improve print/pprint docs for `T201` and `T203` ([#18130](https://github.com/astral-sh/ruff/pull/18130))
|
||||
- \[`flake8-simplify`\] Add fix safety section (`SIM110`,`SIM210`) ([#18114](https://github.com/astral-sh/ruff/pull/18114),[#18100](https://github.com/astral-sh/ruff/pull/18100))
|
||||
- \[`pylint`\] Fix docs example that produced different output (`PLW0603`) ([#18216](https://github.com/astral-sh/ruff/pull/18216))
|
||||
|
||||
## 0.11.10
|
||||
|
||||
### Preview features
|
||||
|
||||
49
Cargo.lock
generated
49
Cargo.lock
generated
@@ -1,6 +1,6 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 4
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "adler2"
|
||||
@@ -486,7 +486,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c"
|
||||
dependencies = [
|
||||
"lazy_static",
|
||||
"windows-sys 0.52.0",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -495,7 +495,7 @@ version = "3.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e"
|
||||
dependencies = [
|
||||
"windows-sys 0.52.0",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -909,7 +909,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"windows-sys 0.52.0",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1444,7 +1444,7 @@ checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9"
|
||||
dependencies = [
|
||||
"hermit-abi 0.5.1",
|
||||
"libc",
|
||||
"windows-sys 0.52.0",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1498,9 +1498,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
|
||||
|
||||
[[package]]
|
||||
name = "jiff"
|
||||
version = "0.2.14"
|
||||
version = "0.2.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a194df1107f33c79f4f93d02c80798520551949d59dfad22b6157048a88cca93"
|
||||
checksum = "f02000660d30638906021176af16b17498bd0d12813dbfe7b276d8bc7f3c0806"
|
||||
dependencies = [
|
||||
"jiff-static",
|
||||
"jiff-tzdb-platform",
|
||||
@@ -1508,14 +1508,14 @@ dependencies = [
|
||||
"portable-atomic",
|
||||
"portable-atomic-util",
|
||||
"serde",
|
||||
"windows-sys 0.52.0",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jiff-static"
|
||||
version = "0.2.14"
|
||||
version = "0.2.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6c6e1db7ed32c6c71b759497fae34bf7933636f75a251b9e736555da426f6442"
|
||||
checksum = "f3c30758ddd7188629c6713fc45d1188af4f44c90582311d0c8d8c9907f60c48"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -2485,7 +2485,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "ruff"
|
||||
version = "0.11.11"
|
||||
version = "0.11.10"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"argfile",
|
||||
@@ -2725,7 +2725,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "ruff_linter"
|
||||
version = "0.11.11"
|
||||
version = "0.11.10"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"anyhow",
|
||||
@@ -3061,7 +3061,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "ruff_wasm"
|
||||
version = "0.11.11"
|
||||
version = "0.11.10"
|
||||
dependencies = [
|
||||
"console_error_panic_hook",
|
||||
"console_log",
|
||||
@@ -3081,7 +3081,6 @@ dependencies = [
|
||||
"ruff_workspace",
|
||||
"serde",
|
||||
"serde-wasm-bindgen",
|
||||
"uuid",
|
||||
"wasm-bindgen",
|
||||
"wasm-bindgen-test",
|
||||
]
|
||||
@@ -3163,7 +3162,7 @@ dependencies = [
|
||||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys",
|
||||
"windows-sys 0.52.0",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -3181,7 +3180,7 @@ checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
|
||||
[[package]]
|
||||
name = "salsa"
|
||||
version = "0.21.1"
|
||||
source = "git+https://github.com/salsa-rs/salsa.git?rev=4818b15f3b7516555d39f5a41cb75970448bee4c#4818b15f3b7516555d39f5a41cb75970448bee4c"
|
||||
source = "git+https://github.com/salsa-rs/salsa.git?rev=7edce6e248f35c8114b4b021cdb474a3fb2813b3#7edce6e248f35c8114b4b021cdb474a3fb2813b3"
|
||||
dependencies = [
|
||||
"boxcar",
|
||||
"compact_str",
|
||||
@@ -3204,12 +3203,12 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "salsa-macro-rules"
|
||||
version = "0.21.1"
|
||||
source = "git+https://github.com/salsa-rs/salsa.git?rev=4818b15f3b7516555d39f5a41cb75970448bee4c#4818b15f3b7516555d39f5a41cb75970448bee4c"
|
||||
source = "git+https://github.com/salsa-rs/salsa.git?rev=7edce6e248f35c8114b4b021cdb474a3fb2813b3#7edce6e248f35c8114b4b021cdb474a3fb2813b3"
|
||||
|
||||
[[package]]
|
||||
name = "salsa-macros"
|
||||
version = "0.21.1"
|
||||
source = "git+https://github.com/salsa-rs/salsa.git?rev=4818b15f3b7516555d39f5a41cb75970448bee4c#4818b15f3b7516555d39f5a41cb75970448bee4c"
|
||||
source = "git+https://github.com/salsa-rs/salsa.git?rev=7edce6e248f35c8114b4b021cdb474a3fb2813b3#7edce6e248f35c8114b4b021cdb474a3fb2813b3"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro2",
|
||||
@@ -3532,7 +3531,7 @@ dependencies = [
|
||||
"getrandom 0.3.3",
|
||||
"once_cell",
|
||||
"rustix",
|
||||
"windows-sys 0.52.0",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -4004,7 +4003,6 @@ dependencies = [
|
||||
"ruff_source_file",
|
||||
"ruff_text_size",
|
||||
"rustc-hash 2.1.1",
|
||||
"salsa",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"shellexpand",
|
||||
@@ -4073,7 +4071,6 @@ dependencies = [
|
||||
"ty_ide",
|
||||
"ty_project",
|
||||
"ty_python_semantic",
|
||||
"uuid",
|
||||
"wasm-bindgen",
|
||||
"wasm-bindgen-test",
|
||||
]
|
||||
@@ -4243,9 +4240,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
|
||||
|
||||
[[package]]
|
||||
name = "uuid"
|
||||
version = "1.17.0"
|
||||
version = "1.16.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d"
|
||||
checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9"
|
||||
dependencies = [
|
||||
"getrandom 0.3.3",
|
||||
"js-sys",
|
||||
@@ -4256,9 +4253,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "uuid-macro-internal"
|
||||
version = "1.17.0"
|
||||
version = "1.16.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "26b682e8c381995ea03130e381928e0e005b7c9eb483c6c8682f50e07b33c2b7"
|
||||
checksum = "72dcd78c4f979627a754f5522cea6e6a25e55139056535fe6e69c506cd64a862"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -4526,7 +4523,7 @@ version = "0.1.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
|
||||
dependencies = [
|
||||
"windows-sys 0.52.0",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
||||
@@ -129,7 +129,7 @@ regex = { version = "1.10.2" }
|
||||
rustc-hash = { version = "2.0.0" }
|
||||
rustc-stable-hash = { version = "0.1.2" }
|
||||
# When updating salsa, make sure to also update the revision in `fuzz/Cargo.toml`
|
||||
salsa = { git = "https://github.com/salsa-rs/salsa.git", rev = "4818b15f3b7516555d39f5a41cb75970448bee4c" }
|
||||
salsa = { git = "https://github.com/salsa-rs/salsa.git", rev = "7edce6e248f35c8114b4b021cdb474a3fb2813b3" }
|
||||
schemars = { version = "0.8.16" }
|
||||
seahash = { version = "4.1.0" }
|
||||
serde = { version = "1.0.197", features = ["derive"] }
|
||||
@@ -179,6 +179,7 @@ uuid = { version = "1.6.1", features = [
|
||||
"v4",
|
||||
"fast-rng",
|
||||
"macro-diagnostics",
|
||||
"js",
|
||||
] }
|
||||
walkdir = { version = "2.3.2" }
|
||||
wasm-bindgen = { version = "0.2.92" }
|
||||
@@ -187,7 +188,7 @@ wild = { version = "2" }
|
||||
zip = { version = "0.6.6", default-features = false }
|
||||
|
||||
[workspace.metadata.cargo-shear]
|
||||
ignored = ["getrandom", "ruff_options_metadata", "uuid"]
|
||||
ignored = ["getrandom", "ruff_options_metadata"]
|
||||
|
||||
|
||||
[workspace.lints.rust]
|
||||
|
||||
@@ -34,7 +34,8 @@ An extremely fast Python linter and code formatter, written in Rust.
|
||||
- 🔧 Fix support, for automatic error correction (e.g., automatically remove unused imports)
|
||||
- 📏 Over [800 built-in rules](https://docs.astral.sh/ruff/rules/), with native re-implementations
|
||||
of popular Flake8 plugins, like flake8-bugbear
|
||||
- ⌨️ First-party [editor integrations](https://docs.astral.sh/ruff/editors) for [VS Code](https://github.com/astral-sh/ruff-vscode) and [more](https://docs.astral.sh/ruff/editors/setup)
|
||||
- ⌨️ First-party [editor integrations](https://docs.astral.sh/ruff/integrations/) for
|
||||
[VS Code](https://github.com/astral-sh/ruff-vscode) and [more](https://docs.astral.sh/ruff/editors/setup)
|
||||
- 🌎 Monorepo-friendly, with [hierarchical and cascading configuration](https://docs.astral.sh/ruff/configuration/#config-file-discovery)
|
||||
|
||||
Ruff aims to be orders of magnitude faster than alternative tools while integrating more
|
||||
@@ -148,8 +149,8 @@ curl -LsSf https://astral.sh/ruff/install.sh | sh
|
||||
powershell -c "irm https://astral.sh/ruff/install.ps1 | iex"
|
||||
|
||||
# For a specific version.
|
||||
curl -LsSf https://astral.sh/ruff/0.11.11/install.sh | sh
|
||||
powershell -c "irm https://astral.sh/ruff/0.11.11/install.ps1 | iex"
|
||||
curl -LsSf https://astral.sh/ruff/0.11.10/install.sh | sh
|
||||
powershell -c "irm https://astral.sh/ruff/0.11.10/install.ps1 | iex"
|
||||
```
|
||||
|
||||
You can also install Ruff via [Homebrew](https://formulae.brew.sh/formula/ruff), [Conda](https://anaconda.org/conda-forge/ruff),
|
||||
@@ -182,7 +183,7 @@ Ruff can also be used as a [pre-commit](https://pre-commit.com/) hook via [`ruff
|
||||
```yaml
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
# Ruff version.
|
||||
rev: v0.11.11
|
||||
rev: v0.11.10
|
||||
hooks:
|
||||
# Run the linter.
|
||||
- id: ruff
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
doc-valid-idents = [
|
||||
"..",
|
||||
"CodeQL",
|
||||
"CPython",
|
||||
"FastAPI",
|
||||
"IPython",
|
||||
"LangChain",
|
||||
@@ -15,7 +14,7 @@ doc-valid-idents = [
|
||||
"SNMPv1",
|
||||
"SNMPv2",
|
||||
"SNMPv3",
|
||||
"PyFlakes",
|
||||
"PyFlakes"
|
||||
]
|
||||
|
||||
ignore-interior-mutability = [
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "ruff"
|
||||
version = "0.11.11"
|
||||
version = "0.11.10"
|
||||
publish = true
|
||||
authors = { workspace = true }
|
||||
edition = { workspace = true }
|
||||
|
||||
@@ -822,11 +822,11 @@ pub(super) fn warn_incompatible_formatter_settings(resolver: &Resolver) {
|
||||
rule_names.sort();
|
||||
if let [rule] = rule_names.as_slice() {
|
||||
warn_user_once!(
|
||||
"The following rule may cause conflicts when used with the formatter: {rule}. To avoid unexpected behavior, we recommend disabling this rule, either by removing it from the `lint.select` or `lint.extend-select` configuration, or adding it to the `lint.ignore` configuration."
|
||||
"The following rule may cause conflicts when used with the formatter: {rule}. To avoid unexpected behavior, we recommend disabling this rule, either by removing it from the `select` or `extend-select` configuration, or adding it to the `ignore` configuration."
|
||||
);
|
||||
} else {
|
||||
warn_user_once!(
|
||||
"The following rules may cause conflicts when used with the formatter: {}. To avoid unexpected behavior, we recommend disabling these rules, either by removing them from the `lint.select` or `lint.extend-select` configuration, or adding them to the `lint.ignore` configuration.",
|
||||
"The following rules may cause conflicts when used with the formatter: {}. To avoid unexpected behavior, we recommend disabling these rules, either by removing them from the `select` or `extend-select` configuration, or adding them to the `ignore` configuration.",
|
||||
rule_names.join(", ")
|
||||
);
|
||||
}
|
||||
|
||||
@@ -862,7 +862,7 @@ if condition:
|
||||
print('Should change quotes')
|
||||
|
||||
----- stderr -----
|
||||
warning: The following rule may cause conflicts when used with the formatter: `COM812`. To avoid unexpected behavior, we recommend disabling this rule, either by removing it from the `lint.select` or `lint.extend-select` configuration, or adding it to the `lint.ignore` configuration.
|
||||
warning: The following rule may cause conflicts when used with the formatter: `COM812`. To avoid unexpected behavior, we recommend disabling this rule, either by removing it from the `select` or `extend-select` configuration, or adding it to the `ignore` configuration.
|
||||
"#);
|
||||
Ok(())
|
||||
}
|
||||
@@ -999,7 +999,7 @@ def say_hy(name: str):
|
||||
1 file reformatted
|
||||
|
||||
----- stderr -----
|
||||
warning: The following rule may cause conflicts when used with the formatter: `COM812`. To avoid unexpected behavior, we recommend disabling this rule, either by removing it from the `lint.select` or `lint.extend-select` configuration, or adding it to the `lint.ignore` configuration.
|
||||
warning: The following rule may cause conflicts when used with the formatter: `COM812`. To avoid unexpected behavior, we recommend disabling this rule, either by removing it from the `select` or `extend-select` configuration, or adding it to the `ignore` configuration.
|
||||
warning: The `format.indent-style="tab"` option is incompatible with `W191`, which lints against all uses of tabs. We recommend disabling these rules when using the formatter, which enforces a consistent indentation style. Alternatively, set the `format.indent-style` option to `"space"`.
|
||||
warning: The `lint.flake8-implicit-str-concat.allow-multiline = false` option is incompatible with the formatter unless `ISC001` is enabled. We recommend enabling `ISC001` or setting `allow-multiline=true`.
|
||||
warning: The `format.indent-style="tab"` option is incompatible with `D206`, with requires space-based indentation. We recommend disabling these rules when using the formatter, which enforces a consistent indentation style. Alternatively, set the `format.indent-style` option to `"space"`.
|
||||
@@ -1059,7 +1059,7 @@ def say_hy(name: str):
|
||||
print(f"Hy {name}")
|
||||
|
||||
----- stderr -----
|
||||
warning: The following rule may cause conflicts when used with the formatter: `COM812`. To avoid unexpected behavior, we recommend disabling this rule, either by removing it from the `lint.select` or `lint.extend-select` configuration, or adding it to the `lint.ignore` configuration.
|
||||
warning: The following rule may cause conflicts when used with the formatter: `COM812`. To avoid unexpected behavior, we recommend disabling this rule, either by removing it from the `select` or `extend-select` configuration, or adding it to the `ignore` configuration.
|
||||
warning: The `format.indent-style="tab"` option is incompatible with `W191`, which lints against all uses of tabs. We recommend disabling these rules when using the formatter, which enforces a consistent indentation style. Alternatively, set the `format.indent-style` option to `"space"`.
|
||||
warning: The `format.indent-style="tab"` option is incompatible with `D206`, with requires space-based indentation. We recommend disabling these rules when using the formatter, which enforces a consistent indentation style. Alternatively, set the `format.indent-style` option to `"space"`.
|
||||
warning: The `flake8-quotes.inline-quotes="single"` option is incompatible with the formatter's `format.quote-style="double"`. We recommend disabling `Q000` and `Q003` when using the formatter, which enforces a consistent quote style. Alternatively, set both options to either `"single"` or `"double"`.
|
||||
@@ -1199,7 +1199,7 @@ def say_hy(name: str):
|
||||
----- stderr -----
|
||||
warning: `incorrect-blank-line-before-class` (D203) and `no-blank-line-before-class` (D211) are incompatible. Ignoring `incorrect-blank-line-before-class`.
|
||||
warning: `multi-line-summary-first-line` (D212) and `multi-line-summary-second-line` (D213) are incompatible. Ignoring `multi-line-summary-second-line`.
|
||||
warning: The following rule may cause conflicts when used with the formatter: `COM812`. To avoid unexpected behavior, we recommend disabling this rule, either by removing it from the `lint.select` or `lint.extend-select` configuration, or adding it to the `lint.ignore` configuration.
|
||||
warning: The following rule may cause conflicts when used with the formatter: `COM812`. To avoid unexpected behavior, we recommend disabling this rule, either by removing it from the `select` or `extend-select` configuration, or adding it to the `ignore` configuration.
|
||||
");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ fn benchmark_incremental(criterion: &mut Criterion) {
|
||||
fn setup() -> Case {
|
||||
let case = setup_tomllib_case();
|
||||
|
||||
let result: Vec<_> = case.db.check();
|
||||
let result: Vec<_> = case.db.check().unwrap();
|
||||
|
||||
assert_diagnostics(&case.db, &result, EXPECTED_TOMLLIB_DIAGNOSTICS);
|
||||
|
||||
@@ -159,7 +159,7 @@ fn benchmark_incremental(criterion: &mut Criterion) {
|
||||
None,
|
||||
);
|
||||
|
||||
let result = db.check();
|
||||
let result = db.check().unwrap();
|
||||
|
||||
assert_eq!(result.len(), EXPECTED_TOMLLIB_DIAGNOSTICS.len());
|
||||
}
|
||||
@@ -179,7 +179,7 @@ fn benchmark_cold(criterion: &mut Criterion) {
|
||||
setup_tomllib_case,
|
||||
|case| {
|
||||
let Case { db, .. } = case;
|
||||
let result: Vec<_> = db.check();
|
||||
let result: Vec<_> = db.check().unwrap();
|
||||
|
||||
assert_diagnostics(db, &result, EXPECTED_TOMLLIB_DIAGNOSTICS);
|
||||
},
|
||||
@@ -293,7 +293,7 @@ fn benchmark_many_string_assignments(criterion: &mut Criterion) {
|
||||
},
|
||||
|case| {
|
||||
let Case { db, .. } = case;
|
||||
let result = db.check();
|
||||
let result = db.check().unwrap();
|
||||
assert_eq!(result.len(), 0);
|
||||
},
|
||||
BatchSize::SmallInput,
|
||||
@@ -339,7 +339,7 @@ fn benchmark_many_tuple_assignments(criterion: &mut Criterion) {
|
||||
},
|
||||
|case| {
|
||||
let Case { db, .. } = case;
|
||||
let result = db.check();
|
||||
let result = db.check().unwrap();
|
||||
assert_eq!(result.len(), 0);
|
||||
},
|
||||
BatchSize::SmallInput,
|
||||
|
||||
@@ -275,12 +275,7 @@ impl fmt::Debug for Files {
|
||||
impl std::panic::RefUnwindSafe for Files {}
|
||||
|
||||
/// A file that's either stored on the host system's file system or in the vendored file system.
|
||||
///
|
||||
/// # Ordering
|
||||
/// Ordering is based on the file's salsa-assigned id and not on its values.
|
||||
/// The id may change between runs.
|
||||
#[salsa::input]
|
||||
#[derive(PartialOrd, Ord)]
|
||||
pub struct File {
|
||||
/// The path of the file (immutable).
|
||||
#[returns(ref)]
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
use std::any::Any;
|
||||
use std::backtrace::BacktraceStatus;
|
||||
use std::cell::Cell;
|
||||
use std::panic::Location;
|
||||
@@ -25,25 +24,17 @@ impl Payload {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
pub fn downcast_ref<R: Any>(&self) -> Option<&R> {
|
||||
self.0.downcast_ref::<R>()
|
||||
}
|
||||
}
|
||||
|
||||
impl std::fmt::Display for PanicError {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
write!(f, "panicked at")?;
|
||||
writeln!(f, "panicked at")?;
|
||||
if let Some(location) = &self.location {
|
||||
write!(f, " {location}")?;
|
||||
}
|
||||
if let Some(payload) = self.payload.as_str() {
|
||||
write!(f, ":\n{payload}")?;
|
||||
}
|
||||
if let Some(query_trace) = self.salsa_backtrace.as_ref() {
|
||||
let _ = writeln!(f, "{query_trace}");
|
||||
}
|
||||
|
||||
if let Some(backtrace) = &self.backtrace {
|
||||
match backtrace.status() {
|
||||
BacktraceStatus::Disabled => {
|
||||
@@ -58,7 +49,6 @@ impl std::fmt::Display for PanicError {
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,43 +18,44 @@ const FIX_SYMBOL: &str = "🛠️";
|
||||
const PREVIEW_SYMBOL: &str = "🧪";
|
||||
const REMOVED_SYMBOL: &str = "❌";
|
||||
const WARNING_SYMBOL: &str = "⚠️";
|
||||
const STABLE_SYMBOL: &str = "✔️";
|
||||
const SPACER: &str = " ";
|
||||
|
||||
/// Style for the rule's fixability and status icons.
|
||||
const SYMBOL_STYLE: &str = "style='width: 1em; display: inline-block;'";
|
||||
/// Style for the container wrapping the fixability and status icons.
|
||||
const SYMBOLS_CONTAINER: &str = "style='display: flex; gap: 0.5rem; justify-content: end;'";
|
||||
|
||||
fn generate_table(table_out: &mut String, rules: impl IntoIterator<Item = Rule>, linter: &Linter) {
|
||||
table_out.push_str("| Code | Name | Message | |");
|
||||
table_out.push_str("| Code | Name | Message | |");
|
||||
table_out.push('\n');
|
||||
table_out.push_str("| ---- | ---- | ------- | -: |");
|
||||
table_out.push_str("| ---- | ---- | ------- | ------: |");
|
||||
table_out.push('\n');
|
||||
for rule in rules {
|
||||
let status_token = match rule.group() {
|
||||
RuleGroup::Removed => {
|
||||
format!(
|
||||
"<span {SYMBOL_STYLE} title='Rule has been removed'>{REMOVED_SYMBOL}</span>"
|
||||
)
|
||||
format!("<span title='Rule has been removed'>{REMOVED_SYMBOL}</span>")
|
||||
}
|
||||
RuleGroup::Deprecated => {
|
||||
format!(
|
||||
"<span {SYMBOL_STYLE} title='Rule has been deprecated'>{WARNING_SYMBOL}</span>"
|
||||
)
|
||||
format!("<span title='Rule has been deprecated'>{WARNING_SYMBOL}</span>")
|
||||
}
|
||||
RuleGroup::Preview => {
|
||||
format!("<span {SYMBOL_STYLE} title='Rule is in preview'>{PREVIEW_SYMBOL}</span>")
|
||||
format!("<span title='Rule is in preview'>{PREVIEW_SYMBOL}</span>")
|
||||
}
|
||||
RuleGroup::Stable => {
|
||||
// A full opacity checkmark is a bit aggressive for indicating stable
|
||||
format!("<span title='Rule is stable' style='opacity: 0.6'>{STABLE_SYMBOL}</span>")
|
||||
}
|
||||
RuleGroup::Stable => format!("<span {SYMBOL_STYLE}></span>"),
|
||||
};
|
||||
|
||||
let fix_token = match rule.fixable() {
|
||||
FixAvailability::Always | FixAvailability::Sometimes => {
|
||||
format!("<span {SYMBOL_STYLE} title='Automatic fix available'>{FIX_SYMBOL}</span>")
|
||||
format!("<span title='Automatic fix available'>{FIX_SYMBOL}</span>")
|
||||
}
|
||||
FixAvailability::None => {
|
||||
format!(
|
||||
"<span title='Automatic fix not available' style='opacity: 0.1' aria-hidden='true'>{FIX_SYMBOL}</span>"
|
||||
)
|
||||
}
|
||||
FixAvailability::None => format!("<span {SYMBOL_STYLE}></span>"),
|
||||
};
|
||||
|
||||
let tokens = format!("{status_token} {fix_token}");
|
||||
|
||||
let rule_name = rule.as_ref();
|
||||
|
||||
// If the message ends in a bracketed expression (like: "Use {replacement}"), escape the
|
||||
@@ -81,14 +82,15 @@ fn generate_table(table_out: &mut String, rules: impl IntoIterator<Item = Rule>,
|
||||
#[expect(clippy::or_fun_call)]
|
||||
let _ = write!(
|
||||
table_out,
|
||||
"| {ss}{prefix}{code}{se} {{ #{prefix}{code} }} | {ss}{explanation}{se} | {ss}{message}{se} | <div {SYMBOLS_CONTAINER}>{status_token}{fix_token}</div>|",
|
||||
prefix = linter.common_prefix(),
|
||||
code = linter.code_for_rule(rule).unwrap(),
|
||||
explanation = rule
|
||||
.explanation()
|
||||
"| {ss}{0}{1}{se} {{ #{0}{1} }} | {ss}{2}{se} | {ss}{3}{se} | {ss}{4}{se} |",
|
||||
linter.common_prefix(),
|
||||
linter.code_for_rule(rule).unwrap(),
|
||||
rule.explanation()
|
||||
.is_some()
|
||||
.then_some(format_args!("[{rule_name}](rules/{rule_name}.md)"))
|
||||
.unwrap_or(format_args!("{rule_name}")),
|
||||
message,
|
||||
tokens,
|
||||
);
|
||||
table_out.push('\n');
|
||||
}
|
||||
@@ -102,6 +104,12 @@ pub(crate) fn generate() -> String {
|
||||
table_out.push_str("### Legend");
|
||||
table_out.push('\n');
|
||||
|
||||
let _ = write!(
|
||||
&mut table_out,
|
||||
"{SPACER}{STABLE_SYMBOL}{SPACER} The rule is stable."
|
||||
);
|
||||
table_out.push_str("<br />");
|
||||
|
||||
let _ = write!(
|
||||
&mut table_out,
|
||||
"{SPACER}{PREVIEW_SYMBOL}{SPACER} The rule is unstable and is in [\"preview\"](faq.md#what-is-preview)."
|
||||
@@ -124,8 +132,7 @@ pub(crate) fn generate() -> String {
|
||||
&mut table_out,
|
||||
"{SPACER}{FIX_SYMBOL}{SPACER} The rule is automatically fixable by the `--fix` command-line option."
|
||||
);
|
||||
table_out.push_str("\n\n");
|
||||
table_out.push_str("All rules not marked as preview, deprecated or removed are stable.");
|
||||
table_out.push_str("<br />");
|
||||
table_out.push('\n');
|
||||
|
||||
for linter in Linter::iter() {
|
||||
|
||||
@@ -80,7 +80,6 @@ fn generate() -> String {
|
||||
|
||||
let mut parents = Vec::new();
|
||||
|
||||
output.push_str("<!-- WARNING: This file is auto-generated (cargo dev generate-all). Edit the doc comments in 'crates/ty/src/args.rs' if you want to change anything here. -->\n\n");
|
||||
output.push_str("# CLI Reference\n\n");
|
||||
generate_command(&mut output, &ty, &mut parents);
|
||||
|
||||
|
||||
@@ -25,10 +25,6 @@ pub(crate) fn main(args: &Args) -> anyhow::Result<()> {
|
||||
let file_name = "crates/ty/docs/configuration.md";
|
||||
let markdown_path = PathBuf::from(ROOT_DIR).join(file_name);
|
||||
|
||||
output.push_str(
|
||||
"<!-- WARNING: This file is auto-generated (cargo dev generate-all). Update the doc comments on the 'Options' struct in 'crates/ty_project/src/metadata/options.rs' if you want to change anything here. -->\n\n",
|
||||
);
|
||||
|
||||
generate_set(
|
||||
&mut output,
|
||||
Set::Toplevel(Options::metadata()),
|
||||
|
||||
@@ -56,10 +56,6 @@ fn generate_markdown() -> String {
|
||||
|
||||
let mut output = String::new();
|
||||
|
||||
let _ = writeln!(
|
||||
&mut output,
|
||||
"<!-- WARNING: This file is auto-generated (cargo dev generate-all). Edit the lint-declarations in 'crates/ty_python_semantic/src/types/diagnostic.rs' if you want to change anything here. -->\n"
|
||||
);
|
||||
let _ = writeln!(&mut output, "# Rules\n");
|
||||
|
||||
let mut lints: Vec<_> = registry.lints().iter().collect();
|
||||
|
||||
@@ -9,8 +9,8 @@ use ruff_db::{Db as SourceDb, Upcast};
|
||||
use ruff_python_ast::PythonVersion;
|
||||
use ty_python_semantic::lint::{LintRegistry, RuleSelection};
|
||||
use ty_python_semantic::{
|
||||
Db, Program, ProgramSettings, PythonPath, PythonPlatform, PythonVersionSource,
|
||||
PythonVersionWithSource, SearchPathSettings, default_lint_registry,
|
||||
Db, Program, ProgramSettings, PythonPath, PythonPlatform, SearchPathSettings,
|
||||
default_lint_registry,
|
||||
};
|
||||
|
||||
static EMPTY_VENDORED: std::sync::LazyLock<VendoredFileSystem> = std::sync::LazyLock::new(|| {
|
||||
@@ -44,10 +44,7 @@ impl ModuleDb {
|
||||
Program::from_settings(
|
||||
&db,
|
||||
ProgramSettings {
|
||||
python_version: PythonVersionWithSource {
|
||||
version: python_version,
|
||||
source: PythonVersionSource::default(),
|
||||
},
|
||||
python_version,
|
||||
python_platform: PythonPlatform::default(),
|
||||
search_paths,
|
||||
},
|
||||
|
||||
@@ -19,20 +19,19 @@ impl<'a> Resolver<'a> {
|
||||
pub(crate) fn resolve(&self, import: CollectedImport) -> Option<&'a FilePath> {
|
||||
match import {
|
||||
CollectedImport::Import(import) => {
|
||||
let module = resolve_module(self.db, &import)?;
|
||||
Some(module.file()?.path(self.db))
|
||||
resolve_module(self.db, &import).map(|module| module.file().path(self.db))
|
||||
}
|
||||
CollectedImport::ImportFrom(import) => {
|
||||
// Attempt to resolve the member (e.g., given `from foo import bar`, look for `foo.bar`).
|
||||
let parent = import.parent();
|
||||
|
||||
let module = resolve_module(self.db, &import).or_else(|| {
|
||||
// Attempt to resolve the module (e.g., given `from foo import bar`, look for `foo`).
|
||||
resolve_module(self.db, &import)
|
||||
.map(|module| module.file().path(self.db))
|
||||
.or_else(|| {
|
||||
// Attempt to resolve the module (e.g., given `from foo import bar`, look for `foo`).
|
||||
|
||||
resolve_module(self.db, &parent?)
|
||||
})?;
|
||||
|
||||
Some(module.file()?.path(self.db))
|
||||
resolve_module(self.db, &parent?).map(|module| module.file().path(self.db))
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "ruff_linter"
|
||||
version = "0.11.11"
|
||||
version = "0.11.10"
|
||||
publish = false
|
||||
authors = { workspace = true }
|
||||
edition = { workspace = true }
|
||||
|
||||
@@ -114,11 +114,16 @@ from airflow.sensors.sql_sensor import SqlSensor
|
||||
SqlSensor()
|
||||
|
||||
|
||||
from airflow.providers.common.sql.operators.sql import SQLExecuteQueryOperator
|
||||
from airflow.operators.jdbc_operator import JdbcOperator
|
||||
from airflow.operators.mssql_operator import MsSqlOperator
|
||||
from airflow.operators.mysql_operator import MySqlOperator
|
||||
from airflow.operators.oracle_operator import OracleOperator
|
||||
from airflow.operators.postgres_operator import PostgresOperator
|
||||
from airflow.operators.sqlite_operator import SqliteOperator
|
||||
|
||||
SQLExecuteQueryOperator()
|
||||
SQLExecuteQueryOperator()
|
||||
SQLExecuteQueryOperator()
|
||||
SQLExecuteQueryOperator()
|
||||
SQLExecuteQueryOperator()
|
||||
SQLExecuteQueryOperator()
|
||||
JdbcOperator()
|
||||
MsSqlOperator()
|
||||
MySqlOperator()
|
||||
OracleOperator()
|
||||
PostgresOperator()
|
||||
SqliteOperator()
|
||||
|
||||
@@ -145,23 +145,3 @@ def func():
|
||||
sleep = 10
|
||||
|
||||
anyio.run(main)
|
||||
|
||||
|
||||
async def test_anyio_async115_helpers():
|
||||
import anyio
|
||||
|
||||
await anyio.sleep(delay=1) # OK
|
||||
await anyio.sleep(seconds=1) # OK
|
||||
|
||||
await anyio.sleep(delay=0) # ASYNC115
|
||||
await anyio.sleep(seconds=0) # OK
|
||||
|
||||
|
||||
async def test_trio_async115_helpers():
|
||||
import trio
|
||||
|
||||
await trio.sleep(seconds=1) # OK
|
||||
await trio.sleep(delay=1) # OK
|
||||
|
||||
await trio.sleep(seconds=0) # ASYNC115
|
||||
await trio.sleep(delay=0) # OK
|
||||
|
||||
@@ -108,23 +108,3 @@ async def import_from_anyio():
|
||||
|
||||
# catch from import
|
||||
await sleep(86401) # error: 116, "async"
|
||||
|
||||
|
||||
async def test_anyio_async116_helpers():
|
||||
import anyio
|
||||
|
||||
await anyio.sleep(delay=1) # OK
|
||||
await anyio.sleep(seconds=1) # OK
|
||||
|
||||
await anyio.sleep(delay=86401) # ASYNC116
|
||||
await anyio.sleep(seconds=86401) # OK
|
||||
|
||||
|
||||
async def test_trio_async116_helpers():
|
||||
import trio
|
||||
|
||||
await trio.sleep(seconds=1) # OK
|
||||
await trio.sleep(delay=1) # OK
|
||||
|
||||
await trio.sleep(seconds=86401) # ASYNC116
|
||||
await trio.sleep(delay=86401) # OK
|
||||
|
||||
@@ -9,11 +9,3 @@ class Foo:
|
||||
yield 3
|
||||
yield from 3
|
||||
await f()
|
||||
|
||||
def _():
|
||||
# Invalid yield scopes; but not outside a function
|
||||
type X[T: (yield 1)] = int
|
||||
type Y = (yield 2)
|
||||
|
||||
# Valid yield scope
|
||||
yield 3
|
||||
|
||||
@@ -12,4 +12,3 @@ if True:
|
||||
if True:
|
||||
from __future__ import generator_stop
|
||||
from __future__ import invalid_module, generators
|
||||
from __future__ import generators # comment
|
||||
|
||||
@@ -83,7 +83,11 @@ pub(crate) fn bindings(checker: &Checker) {
|
||||
}
|
||||
}
|
||||
if !checker.source_type.is_stub() && checker.enabled(Rule::UnquotedTypeAlias) {
|
||||
flake8_type_checking::rules::unquoted_type_alias(checker, binding);
|
||||
if let Some(diagnostics) =
|
||||
flake8_type_checking::rules::unquoted_type_alias(checker, binding)
|
||||
{
|
||||
checker.report_diagnostics(diagnostics);
|
||||
}
|
||||
}
|
||||
if checker.enabled(Rule::UnsortedDunderSlots) {
|
||||
if let Some(diagnostic) = ruff::rules::sort_dunder_slots(checker, binding) {
|
||||
|
||||
@@ -137,7 +137,11 @@ pub(crate) fn definitions(checker: &mut Checker) {
|
||||
&checker.semantic,
|
||||
)
|
||||
}) {
|
||||
flake8_annotations::rules::definition(checker, definition, *visibility);
|
||||
checker.report_diagnostics(flake8_annotations::rules::definition(
|
||||
checker,
|
||||
definition,
|
||||
*visibility,
|
||||
));
|
||||
}
|
||||
overloaded_name =
|
||||
flake8_annotations::helpers::overloaded_name(definition, &checker.semantic);
|
||||
|
||||
@@ -385,6 +385,15 @@ impl<'a> Checker<'a> {
|
||||
diagnostics.push(diagnostic);
|
||||
}
|
||||
|
||||
/// Extend the collection of [`Diagnostic`] objects in the [`Checker`]
|
||||
pub(crate) fn report_diagnostics<I>(&self, diagnostics: I)
|
||||
where
|
||||
I: IntoIterator<Item = Diagnostic>,
|
||||
{
|
||||
let mut checker_diagnostics = self.diagnostics.borrow_mut();
|
||||
checker_diagnostics.extend(diagnostics);
|
||||
}
|
||||
|
||||
/// Adds a [`TextRange`] to the set of ranges of variable names
|
||||
/// flagged in `flake8-bugbear` violations so far.
|
||||
///
|
||||
@@ -681,17 +690,6 @@ impl SemanticSyntaxContext for Checker<'_> {
|
||||
false
|
||||
}
|
||||
|
||||
fn in_yield_allowed_context(&self) -> bool {
|
||||
for scope in self.semantic.current_scopes() {
|
||||
match scope.kind {
|
||||
ScopeKind::Class(_) | ScopeKind::Generator { .. } => return false,
|
||||
ScopeKind::Function(_) | ScopeKind::Lambda(_) => return true,
|
||||
ScopeKind::Module | ScopeKind::Type => {}
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn in_sync_comprehension(&self) -> bool {
|
||||
for scope in self.semantic.current_scopes() {
|
||||
if let ScopeKind::Generator {
|
||||
|
||||
@@ -127,10 +127,6 @@ pub(crate) const fn is_check_file_level_directives_enabled(settings: &LinterSett
|
||||
}
|
||||
|
||||
// https://github.com/astral-sh/ruff/pull/17644
|
||||
pub(crate) const fn is_readlines_in_for_fix_safe_enabled(settings: &LinterSettings) -> bool {
|
||||
settings.preview.is_enabled()
|
||||
}
|
||||
|
||||
pub(crate) const fn multiple_with_statements_fix_safe_enabled(settings: &LinterSettings) -> bool {
|
||||
pub(crate) const fn is_readlines_in_for_fix_safe(settings: &LinterSettings) -> bool {
|
||||
settings.preview.is_enabled()
|
||||
}
|
||||
|
||||
@@ -65,26 +65,24 @@ impl Violation for Airflow3MovedToProvider {
|
||||
|
||||
fn fix_title(&self) -> Option<String> {
|
||||
let Airflow3MovedToProvider { replacement, .. } = self;
|
||||
if let Some((module, name, provider, version)) = match &replacement {
|
||||
ProviderReplacement::AutoImport {
|
||||
module,
|
||||
name,
|
||||
provider,
|
||||
version,
|
||||
} => Some((module, *name, provider, version)),
|
||||
ProviderReplacement::SourceModuleMovedToProvider {
|
||||
module,
|
||||
name,
|
||||
provider,
|
||||
version,
|
||||
} => Some((module, name.as_str(), provider, version)),
|
||||
match replacement {
|
||||
ProviderReplacement::None => None,
|
||||
} {
|
||||
Some(format!(
|
||||
"Install `apache-airflow-providers-{provider}>={version}` and use `{name}` from `{module}` instead."
|
||||
))
|
||||
} else {
|
||||
None
|
||||
ProviderReplacement::AutoImport {
|
||||
name,
|
||||
module,
|
||||
provider,
|
||||
version,
|
||||
} => Some(format!(
|
||||
"Install `apache-airflow-providers-{provider}>={version}` and use `{module}.{name}` instead."
|
||||
)),
|
||||
ProviderReplacement::SourceModuleMovedToProvider {
|
||||
name,
|
||||
module,
|
||||
provider,
|
||||
version,
|
||||
} => Some(format!(
|
||||
"Install `apache-airflow-providers-{provider}>={version}` and use `{module}.{name}` instead."
|
||||
)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,10 +73,10 @@ impl Violation for Airflow3Removal {
|
||||
Replacement::AttrName(name) => Some(format!("Use `{name}` instead")),
|
||||
Replacement::Message(message) => Some((*message).to_string()),
|
||||
Replacement::AutoImport { module, name } => {
|
||||
Some(format!("Use `{name}` from `{module}` instead."))
|
||||
Some(format!("Use `{module}.{name}` instead"))
|
||||
}
|
||||
Replacement::SourceModuleMoved { module, name } => {
|
||||
Some(format!("Use `{name}` from `{module}` instead."))
|
||||
Some(format!("Use `{module}.{name}` instead"))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -190,12 +190,24 @@ fn check_call_arguments(checker: &Checker, qualified_name: &QualifiedName, argum
|
||||
match qualified_name.segments() {
|
||||
["airflow", .., "DAG" | "dag"] => {
|
||||
// with replacement
|
||||
diagnostic_for_argument(checker, arguments, "fail_stop", Some("fail_fast"));
|
||||
diagnostic_for_argument(checker, arguments, "schedule_interval", Some("schedule"));
|
||||
diagnostic_for_argument(checker, arguments, "timetable", Some("schedule"));
|
||||
checker.report_diagnostics(diagnostic_for_argument(
|
||||
arguments,
|
||||
"fail_stop",
|
||||
Some("fail_fast"),
|
||||
));
|
||||
checker.report_diagnostics(diagnostic_for_argument(
|
||||
arguments,
|
||||
"schedule_interval",
|
||||
Some("schedule"),
|
||||
));
|
||||
checker.report_diagnostics(diagnostic_for_argument(
|
||||
arguments,
|
||||
"timetable",
|
||||
Some("schedule"),
|
||||
));
|
||||
// without replacement
|
||||
diagnostic_for_argument(checker, arguments, "default_view", None);
|
||||
diagnostic_for_argument(checker, arguments, "orientation", None);
|
||||
checker.report_diagnostics(diagnostic_for_argument(arguments, "default_view", None));
|
||||
checker.report_diagnostics(diagnostic_for_argument(arguments, "orientation", None));
|
||||
}
|
||||
segments => {
|
||||
if is_airflow_auth_manager(segments) {
|
||||
@@ -211,14 +223,17 @@ fn check_call_arguments(checker: &Checker, qualified_name: &QualifiedName, argum
|
||||
));
|
||||
}
|
||||
} else if is_airflow_task_handler(segments) {
|
||||
diagnostic_for_argument(checker, arguments, "filename_template", None);
|
||||
checker.report_diagnostics(diagnostic_for_argument(
|
||||
arguments,
|
||||
"filename_template",
|
||||
None,
|
||||
));
|
||||
} else if is_airflow_builtin_or_provider(segments, "operators", "Operator") {
|
||||
diagnostic_for_argument(
|
||||
checker,
|
||||
checker.report_diagnostics(diagnostic_for_argument(
|
||||
arguments,
|
||||
"task_concurrency",
|
||||
Some("max_active_tis_per_dag"),
|
||||
);
|
||||
));
|
||||
match segments {
|
||||
[
|
||||
"airflow",
|
||||
@@ -227,12 +242,11 @@ fn check_call_arguments(checker: &Checker, qualified_name: &QualifiedName, argum
|
||||
"trigger_dagrun",
|
||||
"TriggerDagRunOperator",
|
||||
] => {
|
||||
diagnostic_for_argument(
|
||||
checker,
|
||||
checker.report_diagnostics(diagnostic_for_argument(
|
||||
arguments,
|
||||
"execution_date",
|
||||
Some("logical_date"),
|
||||
);
|
||||
));
|
||||
}
|
||||
[
|
||||
"airflow",
|
||||
@@ -249,12 +263,11 @@ fn check_call_arguments(checker: &Checker, qualified_name: &QualifiedName, argum
|
||||
"BranchDayOfWeekOperator",
|
||||
]
|
||||
| ["airflow", .., "sensors", "weekday", "DayOfWeekSensor"] => {
|
||||
diagnostic_for_argument(
|
||||
checker,
|
||||
checker.report_diagnostics(diagnostic_for_argument(
|
||||
arguments,
|
||||
"use_task_execution_day",
|
||||
Some("use_task_logical_date"),
|
||||
);
|
||||
));
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
@@ -1044,14 +1057,11 @@ fn check_airflow_plugin_extension(
|
||||
/// Check if the `deprecated` keyword argument is being used and create a diagnostic if so along
|
||||
/// with a possible `replacement`.
|
||||
fn diagnostic_for_argument(
|
||||
checker: &Checker,
|
||||
arguments: &Arguments,
|
||||
deprecated: &str,
|
||||
replacement: Option<&'static str>,
|
||||
) {
|
||||
let Some(keyword) = arguments.find_keyword(deprecated) else {
|
||||
return;
|
||||
};
|
||||
) -> Option<Diagnostic> {
|
||||
let keyword = arguments.find_keyword(deprecated)?;
|
||||
let mut diagnostic = Diagnostic::new(
|
||||
Airflow3Removal {
|
||||
deprecated: deprecated.to_string(),
|
||||
@@ -1073,7 +1083,7 @@ fn diagnostic_for_argument(
|
||||
)));
|
||||
}
|
||||
|
||||
checker.report_diagnostic(diagnostic);
|
||||
Some(diagnostic)
|
||||
}
|
||||
|
||||
/// Check whether the symbol is coming from the `secrets` builtin or provider module which ends
|
||||
|
||||
@@ -77,7 +77,7 @@ impl Violation for Airflow3SuggestedToMoveToProvider {
|
||||
provider,
|
||||
version,
|
||||
} => Some(format!(
|
||||
"Install `apache-airflow-providers-{provider}>={version}` and use `{name}` from `{module}` instead."
|
||||
"Install `apache-airflow-providers-{provider}>={version}` and use `{module}.{name}` instead."
|
||||
)),
|
||||
ProviderReplacement::SourceModuleMovedToProvider {
|
||||
module,
|
||||
@@ -85,7 +85,7 @@ impl Violation for Airflow3SuggestedToMoveToProvider {
|
||||
provider,
|
||||
version,
|
||||
} => Some(format!(
|
||||
"Install `apache-airflow-providers-{provider}>={version}` and use `{name}` from `{module}` instead."
|
||||
"Install `apache-airflow-providers-{provider}>={version}` and use `{module}.{name}` instead."
|
||||
)),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,10 +72,10 @@ impl Violation for Airflow3SuggestedUpdate {
|
||||
Replacement::AttrName(name) => Some(format!("Use `{name}` instead")),
|
||||
Replacement::Message(message) => Some((*message).to_string()),
|
||||
Replacement::AutoImport { module, name } => {
|
||||
Some(format!("Use `{name}` from `{module}` instead."))
|
||||
Some(format!("Use `{module}.{name}` instead"))
|
||||
}
|
||||
Replacement::SourceModuleMoved { module, name } => {
|
||||
Some(format!("Use `{name}` from `{module}` instead."))
|
||||
Some(format!("Use `{module}.{name}` instead"))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -112,14 +112,11 @@ pub(crate) fn airflow_3_0_suggested_update_expr(checker: &Checker, expr: &Expr)
|
||||
/// Check if the `deprecated` keyword argument is being used and create a diagnostic if so along
|
||||
/// with a possible `replacement`.
|
||||
fn diagnostic_for_argument(
|
||||
checker: &Checker,
|
||||
arguments: &Arguments,
|
||||
deprecated: &str,
|
||||
replacement: Option<&'static str>,
|
||||
) {
|
||||
let Some(keyword) = arguments.find_keyword(deprecated) else {
|
||||
return;
|
||||
};
|
||||
) -> Option<Diagnostic> {
|
||||
let keyword = arguments.find_keyword(deprecated)?;
|
||||
let mut diagnostic = Diagnostic::new(
|
||||
Airflow3SuggestedUpdate {
|
||||
deprecated: deprecated.to_string(),
|
||||
@@ -141,7 +138,7 @@ fn diagnostic_for_argument(
|
||||
)));
|
||||
}
|
||||
|
||||
checker.report_diagnostic(diagnostic);
|
||||
Some(diagnostic)
|
||||
}
|
||||
/// Check whether a removed Airflow argument is passed.
|
||||
///
|
||||
@@ -155,11 +152,15 @@ fn diagnostic_for_argument(
|
||||
fn check_call_arguments(checker: &Checker, qualified_name: &QualifiedName, arguments: &Arguments) {
|
||||
match qualified_name.segments() {
|
||||
["airflow", .., "DAG" | "dag"] => {
|
||||
diagnostic_for_argument(checker, arguments, "sla_miss_callback", None);
|
||||
checker.report_diagnostics(diagnostic_for_argument(
|
||||
arguments,
|
||||
"sla_miss_callback",
|
||||
None,
|
||||
));
|
||||
}
|
||||
segments => {
|
||||
if is_airflow_builtin_or_provider(segments, "operators", "Operator") {
|
||||
diagnostic_for_argument(checker, arguments, "sla", None);
|
||||
checker.report_diagnostics(diagnostic_for_argument(arguments, "sla", None));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -171,7 +171,7 @@ AIR301_class_attribute.py:42:6: AIR301 [*] `airflow.datasets.manager.DatasetMana
|
||||
43 | dm.register_dataset_change()
|
||||
44 | dm.create_datasets()
|
||||
|
|
||||
= help: Use `AssetManager` from `airflow.assets.manager` instead.
|
||||
= help: Use `airflow.assets.manager.AssetManager` instead
|
||||
|
||||
ℹ Safe fix
|
||||
19 19 | from airflow.providers_manager import ProvidersManager
|
||||
@@ -302,7 +302,7 @@ AIR301_class_attribute.py:50:11: AIR301 [*] `airflow.lineage.hook.DatasetLineage
|
||||
| ^^^^^^^^^^^^^^^^^^ AIR301
|
||||
51 | dl_info.dataset
|
||||
|
|
||||
= help: Use `AssetLineageInfo` from `airflow.lineage.hook` instead.
|
||||
= help: Use `airflow.lineage.hook.AssetLineageInfo` instead
|
||||
|
||||
ℹ Safe fix
|
||||
9 9 | DatasetAny,
|
||||
|
||||
@@ -85,7 +85,7 @@ AIR301_names.py:60:1: AIR301 [*] `airflow.configuration.get` is removed in Airfl
|
||||
60 | get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
|
||||
| ^^^ AIR301
|
||||
|
|
||||
= help: Use `conf.get` from `airflow.configuration` instead.
|
||||
= help: Use `airflow.configuration.conf.get` instead
|
||||
|
||||
ℹ Safe fix
|
||||
19 19 | has_option,
|
||||
@@ -111,7 +111,7 @@ AIR301_names.py:60:6: AIR301 [*] `airflow.configuration.getboolean` is removed i
|
||||
60 | get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
|
||||
| ^^^^^^^^^^ AIR301
|
||||
|
|
||||
= help: Use `conf.getboolean` from `airflow.configuration` instead.
|
||||
= help: Use `airflow.configuration.conf.getboolean` instead
|
||||
|
||||
ℹ Safe fix
|
||||
19 19 | has_option,
|
||||
@@ -137,7 +137,7 @@ AIR301_names.py:60:18: AIR301 [*] `airflow.configuration.getfloat` is removed in
|
||||
60 | get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
|
||||
| ^^^^^^^^ AIR301
|
||||
|
|
||||
= help: Use `conf.getfloat` from `airflow.configuration` instead.
|
||||
= help: Use `airflow.configuration.conf.getfloat` instead
|
||||
|
||||
ℹ Safe fix
|
||||
19 19 | has_option,
|
||||
@@ -163,7 +163,7 @@ AIR301_names.py:60:28: AIR301 [*] `airflow.configuration.getint` is removed in A
|
||||
60 | get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
|
||||
| ^^^^^^ AIR301
|
||||
|
|
||||
= help: Use `conf.getint` from `airflow.configuration` instead.
|
||||
= help: Use `airflow.configuration.conf.getint` instead
|
||||
|
||||
ℹ Safe fix
|
||||
19 19 | has_option,
|
||||
@@ -189,7 +189,7 @@ AIR301_names.py:60:36: AIR301 [*] `airflow.configuration.has_option` is removed
|
||||
60 | get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
|
||||
| ^^^^^^^^^^ AIR301
|
||||
|
|
||||
= help: Use `conf.has_option` from `airflow.configuration` instead.
|
||||
= help: Use `airflow.configuration.conf.has_option` instead
|
||||
|
||||
ℹ Safe fix
|
||||
19 19 | has_option,
|
||||
@@ -215,7 +215,7 @@ AIR301_names.py:60:48: AIR301 [*] `airflow.configuration.remove_option` is remov
|
||||
60 | get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
|
||||
| ^^^^^^^^^^^^^ AIR301
|
||||
|
|
||||
= help: Use `conf.remove_option` from `airflow.configuration` instead.
|
||||
= help: Use `airflow.configuration.conf.remove_option` instead
|
||||
|
||||
ℹ Safe fix
|
||||
19 19 | has_option,
|
||||
@@ -241,7 +241,7 @@ AIR301_names.py:60:63: AIR301 [*] `airflow.configuration.as_dict` is removed in
|
||||
60 | get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
|
||||
| ^^^^^^^ AIR301
|
||||
|
|
||||
= help: Use `conf.as_dict` from `airflow.configuration` instead.
|
||||
= help: Use `airflow.configuration.conf.as_dict` instead
|
||||
|
||||
ℹ Safe fix
|
||||
19 19 | has_option,
|
||||
@@ -267,7 +267,7 @@ AIR301_names.py:60:72: AIR301 [*] `airflow.configuration.set` is removed in Airf
|
||||
60 | get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
|
||||
| ^^^ AIR301
|
||||
|
|
||||
= help: Use `conf.set` from `airflow.configuration` instead.
|
||||
= help: Use `airflow.configuration.conf.set` instead
|
||||
|
||||
ℹ Safe fix
|
||||
19 19 | has_option,
|
||||
@@ -308,7 +308,7 @@ AIR301_names.py:72:1: AIR301 `airflow.hooks.base_hook.BaseHook` is removed in Ai
|
||||
72 | BaseHook()
|
||||
| ^^^^^^^^ AIR301
|
||||
|
|
||||
= help: Use `BaseHook` from `airflow.hooks.base` instead.
|
||||
= help: Use `airflow.hooks.base.BaseHook` instead
|
||||
|
||||
AIR301_names.py:76:1: AIR301 `airflow.operators.subdag.SubDagOperator` is removed in Airflow 3.0
|
||||
|
|
||||
@@ -324,7 +324,7 @@ AIR301_names.py:85:1: AIR301 `airflow.sensors.base_sensor_operator.BaseSensorOpe
|
||||
85 | BaseSensorOperator()
|
||||
| ^^^^^^^^^^^^^^^^^^ AIR301
|
||||
|
|
||||
= help: Use `BaseSensorOperator` from `airflow.sdk.bases.sensor` instead.
|
||||
= help: Use `airflow.sdk.bases.sensor.BaseSensorOperator` instead
|
||||
|
||||
AIR301_names.py:89:1: AIR301 `airflow.triggers.external_task.TaskStateTrigger` is removed in Airflow 3.0
|
||||
|
|
||||
@@ -446,7 +446,7 @@ AIR301_names.py:117:1: AIR301 `airflow.utils.file.TemporaryDirectory` is removed
|
||||
| ^^^^^^^^^^^^^^^^^^ AIR301
|
||||
118 | mkdirs
|
||||
|
|
||||
= help: Use `TemporaryDirectory` from `tempfile` instead.
|
||||
= help: Use `tempfile.TemporaryDirectory` instead
|
||||
|
||||
AIR301_names.py:118:1: AIR301 `airflow.utils.file.mkdirs` is removed in Airflow 3.0
|
||||
|
|
||||
@@ -466,7 +466,7 @@ AIR301_names.py:121:1: AIR301 [*] `airflow.utils.helpers.chain` is removed in Ai
|
||||
| ^^^^^^^^^^^^ AIR301
|
||||
122 | helper_cross_downstream
|
||||
|
|
||||
= help: Use `chain` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.chain` instead
|
||||
|
||||
ℹ Safe fix
|
||||
48 48 | from airflow.utils.trigger_rule import TriggerRule
|
||||
@@ -495,7 +495,7 @@ AIR301_names.py:122:1: AIR301 [*] `airflow.utils.helpers.cross_downstream` is re
|
||||
123 |
|
||||
124 | # airflow.utils.log
|
||||
|
|
||||
= help: Use `cross_downstream` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.cross_downstream` instead
|
||||
|
||||
ℹ Safe fix
|
||||
48 48 | from airflow.utils.trigger_rule import TriggerRule
|
||||
@@ -523,7 +523,7 @@ AIR301_names.py:125:1: AIR301 `airflow.utils.log.secrets_masker` is removed in A
|
||||
126 |
|
||||
127 | # airflow.utils.state
|
||||
|
|
||||
= help: Use `secrets_masker` from `airflow.sdk.execution_time` instead.
|
||||
= help: Use `airflow.sdk.execution_time.secrets_masker` instead
|
||||
|
||||
AIR301_names.py:128:1: AIR301 `airflow.utils.state.SHUTDOWN` is removed in Airflow 3.0
|
||||
|
|
||||
@@ -595,7 +595,7 @@ AIR301_names.py:146:1: AIR301 `airflow.operators.python.get_current_context` is
|
||||
147 |
|
||||
148 | # airflow.providers.mysql
|
||||
|
|
||||
= help: Use `get_current_context` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.get_current_context` instead
|
||||
|
||||
AIR301_names.py:151:1: AIR301 `airflow.providers.mysql.datasets.mysql.sanitize_uri` is removed in Airflow 3.0
|
||||
|
|
||||
@@ -606,7 +606,7 @@ AIR301_names.py:151:1: AIR301 `airflow.providers.mysql.datasets.mysql.sanitize_u
|
||||
152 |
|
||||
153 | # airflow.providers.postgres
|
||||
|
|
||||
= help: Use `sanitize_uri` from `airflow.providers.mysql.assets.mysql` instead.
|
||||
= help: Use `airflow.providers.mysql.assets.mysql.sanitize_uri` instead
|
||||
|
||||
AIR301_names.py:156:1: AIR301 `airflow.providers.postgres.datasets.postgres.sanitize_uri` is removed in Airflow 3.0
|
||||
|
|
||||
@@ -617,7 +617,7 @@ AIR301_names.py:156:1: AIR301 `airflow.providers.postgres.datasets.postgres.sani
|
||||
157 |
|
||||
158 | # airflow.providers.trino
|
||||
|
|
||||
= help: Use `sanitize_uri` from `airflow.providers.postgres.assets.postgres` instead.
|
||||
= help: Use `airflow.providers.postgres.assets.postgres.sanitize_uri` instead
|
||||
|
||||
AIR301_names.py:161:1: AIR301 `airflow.providers.trino.datasets.trino.sanitize_uri` is removed in Airflow 3.0
|
||||
|
|
||||
@@ -628,7 +628,7 @@ AIR301_names.py:161:1: AIR301 `airflow.providers.trino.datasets.trino.sanitize_u
|
||||
162 |
|
||||
163 | # airflow.notifications.basenotifier
|
||||
|
|
||||
= help: Use `sanitize_uri` from `airflow.providers.trino.assets.trino` instead.
|
||||
= help: Use `airflow.providers.trino.assets.trino.sanitize_uri` instead
|
||||
|
||||
AIR301_names.py:166:1: AIR301 `airflow.notifications.basenotifier.BaseNotifier` is removed in Airflow 3.0
|
||||
|
|
||||
@@ -639,7 +639,7 @@ AIR301_names.py:166:1: AIR301 `airflow.notifications.basenotifier.BaseNotifier`
|
||||
167 |
|
||||
168 | # airflow.auth.manager
|
||||
|
|
||||
= help: Use `BaseNotifier` from `airflow.sdk.bases.notifier` instead.
|
||||
= help: Use `airflow.sdk.bases.notifier.BaseNotifier` instead
|
||||
|
||||
AIR301_names.py:171:1: AIR301 `airflow.auth.managers.base_auth_manager.BaseAuthManager` is removed in Airflow 3.0
|
||||
|
|
||||
@@ -648,4 +648,4 @@ AIR301_names.py:171:1: AIR301 `airflow.auth.managers.base_auth_manager.BaseAuthM
|
||||
171 | BaseAuthManager()
|
||||
| ^^^^^^^^^^^^^^^ AIR301
|
||||
|
|
||||
= help: Use `BaseAuthManager` from `airflow.api_fastapi.auth.managers.base_auth_manager` instead.
|
||||
= help: Use `airflow.api_fastapi.auth.managers.base_auth_manager.BaseAuthManager` instead
|
||||
|
||||
@@ -10,7 +10,7 @@ AIR301_names_fix.py:19:1: AIR301 [*] `airflow.api_connexion.security.requires_ac
|
||||
20 |
|
||||
21 | DatasetDetails()
|
||||
|
|
||||
= help: Use `requires_access_asset` from `airflow.api_fastapi.core_api.security` instead.
|
||||
= help: Use `airflow.api_fastapi.core_api.security.requires_access_asset` instead
|
||||
|
||||
ℹ Safe fix
|
||||
15 15 | from airflow.secrets.local_filesystm import load_connections
|
||||
@@ -31,7 +31,7 @@ AIR301_names_fix.py:21:1: AIR301 [*] `airflow.auth.managers.models.resource_deta
|
||||
21 | DatasetDetails()
|
||||
| ^^^^^^^^^^^^^^ AIR301
|
||||
|
|
||||
= help: Use `AssetDetails` from `airflow.api_fastapi.auth.managers.models.resource_details` instead.
|
||||
= help: Use `airflow.api_fastapi.auth.managers.models.resource_details.AssetDetails` instead
|
||||
|
||||
ℹ Safe fix
|
||||
15 15 | from airflow.secrets.local_filesystm import load_connections
|
||||
@@ -54,7 +54,7 @@ AIR301_names_fix.py:24:1: AIR301 [*] `airflow.datasets.manager.DatasetManager` i
|
||||
25 | dataset_manager()
|
||||
26 | resolve_dataset_manager()
|
||||
|
|
||||
= help: Use `AssetManager` from `airflow.assets.manager` instead.
|
||||
= help: Use `airflow.assets.manager.AssetManager` instead
|
||||
|
||||
ℹ Safe fix
|
||||
15 15 | from airflow.secrets.local_filesystm import load_connections
|
||||
@@ -80,7 +80,7 @@ AIR301_names_fix.py:25:1: AIR301 [*] `airflow.datasets.manager.dataset_manager`
|
||||
| ^^^^^^^^^^^^^^^ AIR301
|
||||
26 | resolve_dataset_manager()
|
||||
|
|
||||
= help: Use `asset_manager` from `airflow.assets.manager` instead.
|
||||
= help: Use `airflow.assets.manager.asset_manager` instead
|
||||
|
||||
ℹ Safe fix
|
||||
15 15 | from airflow.secrets.local_filesystm import load_connections
|
||||
@@ -109,7 +109,7 @@ AIR301_names_fix.py:26:1: AIR301 [*] `airflow.datasets.manager.resolve_dataset_m
|
||||
27 |
|
||||
28 | DatasetLineageInfo()
|
||||
|
|
||||
= help: Use `resolve_asset_manager` from `airflow.assets.manager` instead.
|
||||
= help: Use `airflow.assets.manager.resolve_asset_manager` instead
|
||||
|
||||
ℹ Safe fix
|
||||
15 15 | from airflow.secrets.local_filesystm import load_connections
|
||||
@@ -138,7 +138,7 @@ AIR301_names_fix.py:28:1: AIR301 [*] `airflow.lineage.hook.DatasetLineageInfo` i
|
||||
29 |
|
||||
30 | AllowListValidator()
|
||||
|
|
||||
= help: Use `AssetLineageInfo` from `airflow.lineage.hook` instead.
|
||||
= help: Use `airflow.lineage.hook.AssetLineageInfo` instead
|
||||
|
||||
ℹ Safe fix
|
||||
10 10 | dataset_manager,
|
||||
@@ -167,7 +167,7 @@ AIR301_names_fix.py:30:1: AIR301 [*] `airflow.metrics.validators.AllowListValida
|
||||
| ^^^^^^^^^^^^^^^^^^ AIR301
|
||||
31 | BlockListValidator()
|
||||
|
|
||||
= help: Use `PatternAllowListValidator` from `airflow.metrics.validators` instead.
|
||||
= help: Use `airflow.metrics.validators.PatternAllowListValidator` instead
|
||||
|
||||
ℹ Safe fix
|
||||
11 11 | resolve_dataset_manager,
|
||||
@@ -196,7 +196,7 @@ AIR301_names_fix.py:31:1: AIR301 [*] `airflow.metrics.validators.BlockListValida
|
||||
32 |
|
||||
33 | load_connections()
|
||||
|
|
||||
= help: Use `PatternBlockListValidator` from `airflow.metrics.validators` instead.
|
||||
= help: Use `airflow.metrics.validators.PatternBlockListValidator` instead
|
||||
|
||||
ℹ Safe fix
|
||||
11 11 | resolve_dataset_manager,
|
||||
@@ -226,7 +226,7 @@ AIR301_names_fix.py:35:1: AIR301 [*] `airflow.security.permissions.RESOURCE_DATA
|
||||
36 |
|
||||
37 | has_access_dataset()
|
||||
|
|
||||
= help: Use `RESOURCE_ASSET` from `airflow.security.permissions` instead.
|
||||
= help: Use `airflow.security.permissions.RESOURCE_ASSET` instead
|
||||
|
||||
ℹ Safe fix
|
||||
13 13 | from airflow.lineage.hook import DatasetLineageInfo
|
||||
@@ -265,7 +265,7 @@ AIR301_names_fix.py:44:1: AIR301 [*] `airflow.listeners.spec.dataset.on_dataset_
|
||||
| ^^^^^^^^^^^^^^^^^^ AIR301
|
||||
45 | on_dataset_changed()
|
||||
|
|
||||
= help: Use `on_asset_created` from `airflow.listeners.spec.asset` instead.
|
||||
= help: Use `airflow.listeners.spec.asset.on_asset_created` instead
|
||||
|
||||
ℹ Safe fix
|
||||
40 40 | on_dataset_changed,
|
||||
@@ -283,7 +283,7 @@ AIR301_names_fix.py:45:1: AIR301 [*] `airflow.listeners.spec.dataset.on_dataset_
|
||||
45 | on_dataset_changed()
|
||||
| ^^^^^^^^^^^^^^^^^^ AIR301
|
||||
|
|
||||
= help: Use `on_asset_changed` from `airflow.listeners.spec.asset` instead.
|
||||
= help: Use `airflow.listeners.spec.asset.on_asset_changed` instead
|
||||
|
||||
ℹ Safe fix
|
||||
40 40 | on_dataset_changed,
|
||||
|
||||
@@ -10,7 +10,7 @@ AIR301_provider_names_fix.py:25:1: AIR301 [*] `airflow.providers.amazon.aws.auth
|
||||
26 |
|
||||
27 | s3_create_dataset()
|
||||
|
|
||||
= help: Use `AvpEntities.ASSET` from `airflow.providers.amazon.aws.auth_manager.avp.entities` instead.
|
||||
= help: Use `airflow.providers.amazon.aws.auth_manager.avp.entities.AvpEntities.ASSET` instead
|
||||
|
||||
ℹ Safe fix
|
||||
22 22 | translate_airflow_dataset,
|
||||
@@ -30,7 +30,7 @@ AIR301_provider_names_fix.py:27:1: AIR301 [*] `airflow.providers.amazon.aws.data
|
||||
| ^^^^^^^^^^^^^^^^^ AIR301
|
||||
28 | s3_convert_dataset_to_openlineage()
|
||||
|
|
||||
= help: Use `create_asset` from `airflow.providers.amazon.aws.assets.s3` instead.
|
||||
= help: Use `airflow.providers.amazon.aws.assets.s3.create_asset` instead
|
||||
|
||||
ℹ Safe fix
|
||||
21 21 | DatasetInfo,
|
||||
@@ -54,7 +54,7 @@ AIR301_provider_names_fix.py:28:1: AIR301 [*] `airflow.providers.amazon.aws.data
|
||||
29 |
|
||||
30 | io_create_dataset()
|
||||
|
|
||||
= help: Use `convert_asset_to_openlineage` from `airflow.providers.amazon.aws.assets.s3` instead.
|
||||
= help: Use `airflow.providers.amazon.aws.assets.s3.convert_asset_to_openlineage` instead
|
||||
|
||||
ℹ Safe fix
|
||||
21 21 | DatasetInfo,
|
||||
@@ -79,7 +79,7 @@ AIR301_provider_names_fix.py:36:1: AIR301 [*] `airflow.providers.google.datasets
|
||||
37 | # airflow.providers.google.datasets.gcs
|
||||
38 | gcs_create_dataset()
|
||||
|
|
||||
= help: Use `create_asset` from `airflow.providers.google.assets.bigquery` instead.
|
||||
= help: Use `airflow.providers.google.assets.bigquery.create_asset` instead
|
||||
|
||||
ℹ Safe fix
|
||||
21 21 | DatasetInfo,
|
||||
@@ -108,7 +108,7 @@ AIR301_provider_names_fix.py:38:1: AIR301 [*] `airflow.providers.google.datasets
|
||||
39 | gcs_convert_dataset_to_openlineage()
|
||||
40 | # airflow.providers.openlineage.utils.utils
|
||||
|
|
||||
= help: Use `create_asset` from `airflow.providers.google.assets.gcs` instead.
|
||||
= help: Use `airflow.providers.google.assets.gcs.create_asset` instead
|
||||
|
||||
ℹ Safe fix
|
||||
21 21 | DatasetInfo,
|
||||
@@ -137,7 +137,7 @@ AIR301_provider_names_fix.py:39:1: AIR301 [*] `airflow.providers.google.datasets
|
||||
40 | # airflow.providers.openlineage.utils.utils
|
||||
41 | DatasetInfo()
|
||||
|
|
||||
= help: Use `convert_asset_to_openlineage` from `airflow.providers.google.assets.gcs` instead.
|
||||
= help: Use `airflow.providers.google.assets.gcs.convert_asset_to_openlineage` instead
|
||||
|
||||
ℹ Safe fix
|
||||
21 21 | DatasetInfo,
|
||||
@@ -166,7 +166,7 @@ AIR301_provider_names_fix.py:41:1: AIR301 [*] `airflow.providers.openlineage.uti
|
||||
42 | translate_airflow_dataset()
|
||||
43 | #
|
||||
|
|
||||
= help: Use `AssetInfo` from `airflow.providers.openlineage.utils.utils` instead.
|
||||
= help: Use `airflow.providers.openlineage.utils.utils.AssetInfo` instead
|
||||
|
||||
ℹ Safe fix
|
||||
20 20 | from airflow.providers.openlineage.utils.utils import (
|
||||
@@ -195,7 +195,7 @@ AIR301_provider_names_fix.py:42:1: AIR301 [*] `airflow.providers.openlineage.uti
|
||||
43 | #
|
||||
44 | # airflow.secrets.local_filesystem
|
||||
|
|
||||
= help: Use `translate_airflow_asset` from `airflow.providers.openlineage.utils.utils` instead.
|
||||
= help: Use `airflow.providers.openlineage.utils.utils.translate_airflow_asset` instead
|
||||
|
||||
ℹ Safe fix
|
||||
20 20 | from airflow.providers.openlineage.utils.utils import (
|
||||
|
||||
@@ -9,7 +9,7 @@ AIR302_amazon.py:23:1: AIR302 `airflow.hooks.S3_hook.S3Hook` is moved into `amaz
|
||||
| ^^^^^^ AIR302
|
||||
24 | provide_bucket_name()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `S3Hook` from `airflow.providers.amazon.aws.hooks.s3` instead.
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `airflow.providers.amazon.aws.hooks.s3.S3Hook` instead.
|
||||
|
||||
AIR302_amazon.py:24:1: AIR302 `airflow.hooks.S3_hook.provide_bucket_name` is moved into `amazon` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -19,7 +19,7 @@ AIR302_amazon.py:24:1: AIR302 `airflow.hooks.S3_hook.provide_bucket_name` is mov
|
||||
25 |
|
||||
26 | GCSToS3Operator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `provide_bucket_name` from `airflow.providers.amazon.aws.hooks.s3` instead.
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `airflow.providers.amazon.aws.hooks.s3.provide_bucket_name` instead.
|
||||
|
||||
AIR302_amazon.py:26:1: AIR302 `airflow.operators.gcs_to_s3.GCSToS3Operator` is moved into `amazon` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -30,7 +30,7 @@ AIR302_amazon.py:26:1: AIR302 `airflow.operators.gcs_to_s3.GCSToS3Operator` is m
|
||||
27 |
|
||||
28 | GoogleApiToS3Operator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `GCSToS3Operator` from `airflow.providers.amazon.aws.transfers.gcs_to_s3` instead.
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `airflow.providers.amazon.aws.transfers.gcs_to_s3.GCSToS3Operator` instead.
|
||||
|
||||
AIR302_amazon.py:28:1: AIR302 `airflow.operators.google_api_to_s3_transfer.GoogleApiToS3Operator` is moved into `amazon` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -40,7 +40,7 @@ AIR302_amazon.py:28:1: AIR302 `airflow.operators.google_api_to_s3_transfer.Googl
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
29 | GoogleApiToS3Transfer()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `GoogleApiToS3Operator` from `airflow.providers.amazon.aws.transfers.google_api_to_s3` instead.
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `airflow.providers.amazon.aws.transfers.google_api_to_s3.GoogleApiToS3Operator` instead.
|
||||
|
||||
AIR302_amazon.py:29:1: AIR302 `airflow.operators.google_api_to_s3_transfer.GoogleApiToS3Transfer` is moved into `amazon` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -50,7 +50,7 @@ AIR302_amazon.py:29:1: AIR302 `airflow.operators.google_api_to_s3_transfer.Googl
|
||||
30 |
|
||||
31 | RedshiftToS3Operator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `GoogleApiToS3Operator` from `airflow.providers.amazon.aws.transfers.google_api_to_s3` instead.
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `airflow.providers.amazon.aws.transfers.google_api_to_s3.GoogleApiToS3Operator` instead.
|
||||
|
||||
AIR302_amazon.py:31:1: AIR302 `airflow.operators.redshift_to_s3_operator.RedshiftToS3Operator` is moved into `amazon` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -60,7 +60,7 @@ AIR302_amazon.py:31:1: AIR302 `airflow.operators.redshift_to_s3_operator.Redshif
|
||||
| ^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
32 | RedshiftToS3Transfer()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `RedshiftToS3Operator` from `airflow.providers.amazon.aws.transfers.redshift_to_s3` instead.
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `airflow.providers.amazon.aws.transfers.redshift_to_s3.RedshiftToS3Operator` instead.
|
||||
|
||||
AIR302_amazon.py:32:1: AIR302 `airflow.operators.redshift_to_s3_operator.RedshiftToS3Transfer` is moved into `amazon` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -70,7 +70,7 @@ AIR302_amazon.py:32:1: AIR302 `airflow.operators.redshift_to_s3_operator.Redshif
|
||||
33 |
|
||||
34 | S3FileTransformOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `RedshiftToS3Operator` from `airflow.providers.amazon.aws.transfers.redshift_to_s3` instead.
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `airflow.providers.amazon.aws.transfers.redshift_to_s3.RedshiftToS3Operator` instead.
|
||||
|
||||
AIR302_amazon.py:34:1: AIR302 `airflow.operators.s3_file_transform_operator.S3FileTransformOperator` is moved into `amazon` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -81,7 +81,7 @@ AIR302_amazon.py:34:1: AIR302 `airflow.operators.s3_file_transform_operator.S3Fi
|
||||
35 |
|
||||
36 | S3ToRedshiftOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-amazon>=3.0.0` and use `S3FileTransformOperator` from `airflow.providers.amazon.aws.operators.s3` instead.
|
||||
= help: Install `apache-airflow-providers-amazon>=3.0.0` and use `airflow.providers.amazon.aws.operators.s3.S3FileTransformOperator` instead.
|
||||
|
||||
AIR302_amazon.py:36:1: AIR302 `airflow.operators.s3_to_redshift_operator.S3ToRedshiftOperator` is moved into `amazon` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -91,7 +91,7 @@ AIR302_amazon.py:36:1: AIR302 `airflow.operators.s3_to_redshift_operator.S3ToRed
|
||||
| ^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
37 | S3ToRedshiftTransfer()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `S3ToRedshiftOperator` from `airflow.providers.amazon.aws.transfers.s3_to_redshift` instead.
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `airflow.providers.amazon.aws.transfers.s3_to_redshift.S3ToRedshiftOperator` instead.
|
||||
|
||||
AIR302_amazon.py:37:1: AIR302 `airflow.operators.s3_to_redshift_operator.S3ToRedshiftTransfer` is moved into `amazon` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -101,7 +101,7 @@ AIR302_amazon.py:37:1: AIR302 `airflow.operators.s3_to_redshift_operator.S3ToRed
|
||||
38 |
|
||||
39 | S3KeySensor()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `S3ToRedshiftOperator` from `airflow.providers.amazon.aws.transfers.s3_to_redshift` instead.
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `airflow.providers.amazon.aws.transfers.s3_to_redshift.S3ToRedshiftOperator` instead.
|
||||
|
||||
AIR302_amazon.py:39:1: AIR302 `airflow.sensors.s3_key_sensor.S3KeySensor` is moved into `amazon` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -110,4 +110,4 @@ AIR302_amazon.py:39:1: AIR302 `airflow.sensors.s3_key_sensor.S3KeySensor` is mov
|
||||
39 | S3KeySensor()
|
||||
| ^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `S3KeySensor` from `airflow.providers.amazon.aws.sensors.s3` instead.
|
||||
= help: Install `apache-airflow-providers-amazon>=1.0.0` and use `airflow.providers.amazon.aws.sensors.s3.S3KeySensor` instead.
|
||||
|
||||
@@ -10,7 +10,7 @@ AIR302_celery.py:9:1: AIR302 `airflow.config_templates.default_celery.DEFAULT_CE
|
||||
10 |
|
||||
11 | app
|
||||
|
|
||||
= help: Install `apache-airflow-providers-celery>=3.3.0` and use `DEFAULT_CELERY_CONFIG` from `airflow.providers.celery.executors.default_celery` instead.
|
||||
= help: Install `apache-airflow-providers-celery>=3.3.0` and use `airflow.providers.celery.executors.default_celery.DEFAULT_CELERY_CONFIG` instead.
|
||||
|
||||
AIR302_celery.py:11:1: AIR302 `airflow.executors.celery_executor.app` is moved into `celery` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -20,7 +20,7 @@ AIR302_celery.py:11:1: AIR302 `airflow.executors.celery_executor.app` is moved i
|
||||
| ^^^ AIR302
|
||||
12 | CeleryExecutor()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-celery>=3.3.0` and use `app` from `airflow.providers.celery.executors.celery_executor_utils` instead.
|
||||
= help: Install `apache-airflow-providers-celery>=3.3.0` and use `airflow.providers.celery.executors.celery_executor_utils.app` instead.
|
||||
|
||||
AIR302_celery.py:12:1: AIR302 `airflow.executors.celery_executor.CeleryExecutor` is moved into `celery` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -28,4 +28,4 @@ AIR302_celery.py:12:1: AIR302 `airflow.executors.celery_executor.CeleryExecutor`
|
||||
12 | CeleryExecutor()
|
||||
| ^^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-celery>=3.3.0` and use `CeleryExecutor` from `airflow.providers.celery.executors.celery_executor` instead.
|
||||
= help: Install `apache-airflow-providers-celery>=3.3.0` and use `airflow.providers.celery.executors.celery_executor.CeleryExecutor` instead.
|
||||
|
||||
@@ -10,7 +10,7 @@ AIR302_common_sql.py:10:1: AIR302 `airflow.hooks.dbapi.ConnectorProtocol` is mov
|
||||
11 | DbApiHook()
|
||||
12 | SQLCheckOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.0.0` and use `ConnectorProtocol` from `airflow.providers.common.sql.hooks.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.0.0` and use `airflow.providers.common.sql.hooks.sql.ConnectorProtocol` instead.
|
||||
|
||||
AIR302_common_sql.py:11:1: AIR302 `airflow.hooks.dbapi_hook.DbApiHook` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -19,7 +19,7 @@ AIR302_common_sql.py:11:1: AIR302 `airflow.hooks.dbapi_hook.DbApiHook` is moved
|
||||
| ^^^^^^^^^ AIR302
|
||||
12 | SQLCheckOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.0.0` and use `DbApiHook` from `airflow.providers.common.sql.hooks.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.0.0` and use `airflow.providers.common.sql.hooks.sql.DbApiHook` instead.
|
||||
|
||||
AIR302_common_sql.py:12:1: AIR302 `airflow.operators.check_operator.SQLCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -28,7 +28,7 @@ AIR302_common_sql.py:12:1: AIR302 `airflow.operators.check_operator.SQLCheckOper
|
||||
12 | SQLCheckOperator()
|
||||
| ^^^^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:18:1: AIR302 `airflow.operators.sql.SQLCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -38,7 +38,7 @@ AIR302_common_sql.py:18:1: AIR302 `airflow.operators.sql.SQLCheckOperator` is mo
|
||||
| ^^^^^^^^^^^^^^^^ AIR302
|
||||
19 | CheckOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:19:1: AIR302 `airflow.operators.check_operator.CheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -46,7 +46,7 @@ AIR302_common_sql.py:19:1: AIR302 `airflow.operators.check_operator.CheckOperato
|
||||
19 | CheckOperator()
|
||||
| ^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:24:1: AIR302 `airflow.operators.druid_check_operator.CheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -55,7 +55,7 @@ AIR302_common_sql.py:24:1: AIR302 `airflow.operators.druid_check_operator.CheckO
|
||||
24 | CheckOperator()
|
||||
| ^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:29:1: AIR302 `airflow.operators.presto_check_operator.CheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -64,7 +64,7 @@ AIR302_common_sql.py:29:1: AIR302 `airflow.operators.presto_check_operator.Check
|
||||
29 | CheckOperator()
|
||||
| ^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:39:1: AIR302 `airflow.operators.druid_check_operator.DruidCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -75,7 +75,7 @@ AIR302_common_sql.py:39:1: AIR302 `airflow.operators.druid_check_operator.DruidC
|
||||
40 | PrestoCheckOperator()
|
||||
41 | IntervalCheckOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:40:1: AIR302 `airflow.operators.presto_check_operator.PrestoCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -85,7 +85,7 @@ AIR302_common_sql.py:40:1: AIR302 `airflow.operators.presto_check_operator.Prest
|
||||
41 | IntervalCheckOperator()
|
||||
42 | SQLIntervalCheckOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:41:1: AIR302 `airflow.operators.check_operator.IntervalCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -95,7 +95,7 @@ AIR302_common_sql.py:41:1: AIR302 `airflow.operators.check_operator.IntervalChec
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
42 | SQLIntervalCheckOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLIntervalCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLIntervalCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:42:1: AIR302 `airflow.operators.check_operator.SQLIntervalCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -104,7 +104,7 @@ AIR302_common_sql.py:42:1: AIR302 `airflow.operators.check_operator.SQLIntervalC
|
||||
42 | SQLIntervalCheckOperator()
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLIntervalCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLIntervalCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:51:1: AIR302 `airflow.operators.presto_check_operator.IntervalCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -115,7 +115,7 @@ AIR302_common_sql.py:51:1: AIR302 `airflow.operators.presto_check_operator.Inter
|
||||
52 | SQLIntervalCheckOperator()
|
||||
53 | PrestoIntervalCheckOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLIntervalCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLIntervalCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:52:1: AIR302 `airflow.operators.sql.SQLIntervalCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -124,7 +124,7 @@ AIR302_common_sql.py:52:1: AIR302 `airflow.operators.sql.SQLIntervalCheckOperato
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
53 | PrestoIntervalCheckOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLIntervalCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLIntervalCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:53:1: AIR302 `airflow.operators.presto_check_operator.PrestoIntervalCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -133,7 +133,7 @@ AIR302_common_sql.py:53:1: AIR302 `airflow.operators.presto_check_operator.Prest
|
||||
53 | PrestoIntervalCheckOperator()
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLIntervalCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLIntervalCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:61:1: AIR302 `airflow.operators.check_operator.SQLThresholdCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -143,7 +143,7 @@ AIR302_common_sql.py:61:1: AIR302 `airflow.operators.check_operator.SQLThreshold
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
62 | ThresholdCheckOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLThresholdCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLThresholdCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:62:1: AIR302 `airflow.operators.check_operator.ThresholdCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -151,7 +151,7 @@ AIR302_common_sql.py:62:1: AIR302 `airflow.operators.check_operator.ThresholdChe
|
||||
62 | ThresholdCheckOperator()
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLThresholdCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLThresholdCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:67:1: AIR302 `airflow.operators.sql.SQLThresholdCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -160,7 +160,7 @@ AIR302_common_sql.py:67:1: AIR302 `airflow.operators.sql.SQLThresholdCheckOperat
|
||||
67 | SQLThresholdCheckOperator()
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLThresholdCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLThresholdCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:75:1: AIR302 `airflow.operators.check_operator.SQLValueCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -170,7 +170,7 @@ AIR302_common_sql.py:75:1: AIR302 `airflow.operators.check_operator.SQLValueChec
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
76 | ValueCheckOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLValueCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLValueCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:76:1: AIR302 `airflow.operators.check_operator.ValueCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -178,7 +178,7 @@ AIR302_common_sql.py:76:1: AIR302 `airflow.operators.check_operator.ValueCheckOp
|
||||
76 | ValueCheckOperator()
|
||||
| ^^^^^^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLValueCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLValueCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:85:1: AIR302 `airflow.operators.sql.SQLValueCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -189,7 +189,7 @@ AIR302_common_sql.py:85:1: AIR302 `airflow.operators.sql.SQLValueCheckOperator`
|
||||
86 | ValueCheckOperator()
|
||||
87 | PrestoValueCheckOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLValueCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLValueCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:86:1: AIR302 `airflow.operators.presto_check_operator.ValueCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -198,7 +198,7 @@ AIR302_common_sql.py:86:1: AIR302 `airflow.operators.presto_check_operator.Value
|
||||
| ^^^^^^^^^^^^^^^^^^ AIR302
|
||||
87 | PrestoValueCheckOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLValueCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLValueCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:87:1: AIR302 `airflow.operators.presto_check_operator.PrestoValueCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -207,7 +207,7 @@ AIR302_common_sql.py:87:1: AIR302 `airflow.operators.presto_check_operator.Prest
|
||||
87 | PrestoValueCheckOperator()
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLValueCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLValueCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:99:1: AIR302 `airflow.operators.sql.BaseSQLOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -218,7 +218,7 @@ AIR302_common_sql.py:99:1: AIR302 `airflow.operators.sql.BaseSQLOperator` is mov
|
||||
100 | BranchSQLOperator()
|
||||
101 | SQLTableCheckOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `BaseSQLOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.BaseSQLOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:100:1: AIR302 `airflow.operators.sql.BranchSQLOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -228,7 +228,7 @@ AIR302_common_sql.py:100:1: AIR302 `airflow.operators.sql.BranchSQLOperator` is
|
||||
101 | SQLTableCheckOperator()
|
||||
102 | SQLColumnCheckOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `BranchSQLOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.BranchSQLOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:101:1: AIR302 `airflow.operators.sql.SQLTableCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -239,7 +239,7 @@ AIR302_common_sql.py:101:1: AIR302 `airflow.operators.sql.SQLTableCheckOperator`
|
||||
102 | SQLColumnCheckOperator()
|
||||
103 | _convert_to_float_if_possible()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `SQLTableCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.SQLTableCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:102:1: AIR302 `airflow.operators.sql.SQLColumnCheckOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -250,7 +250,7 @@ AIR302_common_sql.py:102:1: AIR302 `airflow.operators.sql.SQLColumnCheckOperator
|
||||
103 | _convert_to_float_if_possible()
|
||||
104 | parse_boolean()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.0.0` and use `SQLColumnCheckOperator` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.0.0` and use `airflow.providers.common.sql.operators.sql.SQLColumnCheckOperator` instead.
|
||||
|
||||
AIR302_common_sql.py:103:1: AIR302 `airflow.operators.sql._convert_to_float_if_possible` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -260,7 +260,7 @@ AIR302_common_sql.py:103:1: AIR302 `airflow.operators.sql._convert_to_float_if_p
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
104 | parse_boolean()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.0.0` and use `_convert_to_float_if_possible` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.0.0` and use `airflow.providers.common.sql.operators.sql._convert_to_float_if_possible` instead.
|
||||
|
||||
AIR302_common_sql.py:104:1: AIR302 `airflow.operators.sql.parse_boolean` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -269,7 +269,7 @@ AIR302_common_sql.py:104:1: AIR302 `airflow.operators.sql.parse_boolean` is move
|
||||
104 | parse_boolean()
|
||||
| ^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.0.0` and use `parse_boolean` from `airflow.providers.common.sql.operators.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.0.0` and use `airflow.providers.common.sql.operators.sql.parse_boolean` instead.
|
||||
|
||||
AIR302_common_sql.py:109:1: AIR302 `airflow.sensors.sql.SqlSensor` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -278,7 +278,7 @@ AIR302_common_sql.py:109:1: AIR302 `airflow.sensors.sql.SqlSensor` is moved into
|
||||
109 | SqlSensor()
|
||||
| ^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.0.0` and use `SqlSensor` from `airflow.providers.common.sql.sensors.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.0.0` and use `airflow.providers.common.sql.sensors.sql.SqlSensor` instead.
|
||||
|
||||
AIR302_common_sql.py:114:1: AIR302 `airflow.sensors.sql_sensor.SqlSensor` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -287,4 +287,147 @@ AIR302_common_sql.py:114:1: AIR302 `airflow.sensors.sql_sensor.SqlSensor` is mov
|
||||
114 | SqlSensor()
|
||||
| ^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.0.0` and use `SqlSensor` from `airflow.providers.common.sql.sensors.sql` instead.
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.0.0` and use `airflow.providers.common.sql.sensors.sql.SqlSensor` instead.
|
||||
|
||||
AIR302_common_sql.py:124:1: AIR302 [*] `airflow.operators.jdbc_operator.JdbcOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
122 | from airflow.operators.sqlite_operator import SqliteOperator
|
||||
123 |
|
||||
124 | JdbcOperator()
|
||||
| ^^^^^^^^^^^^ AIR302
|
||||
125 | MsSqlOperator()
|
||||
126 | MySqlOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.3.0` and use `airflow.providers.common.sql.operators.sql.SQLExecuteQueryOperator` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
120 120 | from airflow.operators.oracle_operator import OracleOperator
|
||||
121 121 | from airflow.operators.postgres_operator import PostgresOperator
|
||||
122 122 | from airflow.operators.sqlite_operator import SqliteOperator
|
||||
123 |+from airflow.providers.common.sql.operators.sql import SQLExecuteQueryOperator
|
||||
123 124 |
|
||||
124 |-JdbcOperator()
|
||||
125 |+SQLExecuteQueryOperator()
|
||||
125 126 | MsSqlOperator()
|
||||
126 127 | MySqlOperator()
|
||||
127 128 | OracleOperator()
|
||||
|
||||
AIR302_common_sql.py:125:1: AIR302 [*] `airflow.operators.mssql_operator.MsSqlOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
124 | JdbcOperator()
|
||||
125 | MsSqlOperator()
|
||||
| ^^^^^^^^^^^^^ AIR302
|
||||
126 | MySqlOperator()
|
||||
127 | OracleOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.3.0` and use `airflow.providers.common.sql.operators.sql.SQLExecuteQueryOperator` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
120 120 | from airflow.operators.oracle_operator import OracleOperator
|
||||
121 121 | from airflow.operators.postgres_operator import PostgresOperator
|
||||
122 122 | from airflow.operators.sqlite_operator import SqliteOperator
|
||||
123 |+from airflow.providers.common.sql.operators.sql import SQLExecuteQueryOperator
|
||||
123 124 |
|
||||
124 125 | JdbcOperator()
|
||||
125 |-MsSqlOperator()
|
||||
126 |+SQLExecuteQueryOperator()
|
||||
126 127 | MySqlOperator()
|
||||
127 128 | OracleOperator()
|
||||
128 129 | PostgresOperator()
|
||||
|
||||
AIR302_common_sql.py:126:1: AIR302 [*] `airflow.operators.mysql_operator.MySqlOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
124 | JdbcOperator()
|
||||
125 | MsSqlOperator()
|
||||
126 | MySqlOperator()
|
||||
| ^^^^^^^^^^^^^ AIR302
|
||||
127 | OracleOperator()
|
||||
128 | PostgresOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.3.0` and use `airflow.providers.common.sql.operators.sql.SQLExecuteQueryOperator` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
120 120 | from airflow.operators.oracle_operator import OracleOperator
|
||||
121 121 | from airflow.operators.postgres_operator import PostgresOperator
|
||||
122 122 | from airflow.operators.sqlite_operator import SqliteOperator
|
||||
123 |+from airflow.providers.common.sql.operators.sql import SQLExecuteQueryOperator
|
||||
123 124 |
|
||||
124 125 | JdbcOperator()
|
||||
125 126 | MsSqlOperator()
|
||||
126 |-MySqlOperator()
|
||||
127 |+SQLExecuteQueryOperator()
|
||||
127 128 | OracleOperator()
|
||||
128 129 | PostgresOperator()
|
||||
129 130 | SqliteOperator()
|
||||
|
||||
AIR302_common_sql.py:127:1: AIR302 [*] `airflow.operators.oracle_operator.OracleOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
125 | MsSqlOperator()
|
||||
126 | MySqlOperator()
|
||||
127 | OracleOperator()
|
||||
| ^^^^^^^^^^^^^^ AIR302
|
||||
128 | PostgresOperator()
|
||||
129 | SqliteOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.3.0` and use `airflow.providers.common.sql.operators.sql.SQLExecuteQueryOperator` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
120 120 | from airflow.operators.oracle_operator import OracleOperator
|
||||
121 121 | from airflow.operators.postgres_operator import PostgresOperator
|
||||
122 122 | from airflow.operators.sqlite_operator import SqliteOperator
|
||||
123 |+from airflow.providers.common.sql.operators.sql import SQLExecuteQueryOperator
|
||||
123 124 |
|
||||
124 125 | JdbcOperator()
|
||||
125 126 | MsSqlOperator()
|
||||
126 127 | MySqlOperator()
|
||||
127 |-OracleOperator()
|
||||
128 |+SQLExecuteQueryOperator()
|
||||
128 129 | PostgresOperator()
|
||||
129 130 | SqliteOperator()
|
||||
|
||||
AIR302_common_sql.py:128:1: AIR302 [*] `airflow.operators.postgres_operator.PostgresOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
126 | MySqlOperator()
|
||||
127 | OracleOperator()
|
||||
128 | PostgresOperator()
|
||||
| ^^^^^^^^^^^^^^^^ AIR302
|
||||
129 | SqliteOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.3.0` and use `airflow.providers.common.sql.operators.sql.SQLExecuteQueryOperator` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
120 120 | from airflow.operators.oracle_operator import OracleOperator
|
||||
121 121 | from airflow.operators.postgres_operator import PostgresOperator
|
||||
122 122 | from airflow.operators.sqlite_operator import SqliteOperator
|
||||
123 |+from airflow.providers.common.sql.operators.sql import SQLExecuteQueryOperator
|
||||
123 124 |
|
||||
124 125 | JdbcOperator()
|
||||
125 126 | MsSqlOperator()
|
||||
126 127 | MySqlOperator()
|
||||
127 128 | OracleOperator()
|
||||
128 |-PostgresOperator()
|
||||
129 |+SQLExecuteQueryOperator()
|
||||
129 130 | SqliteOperator()
|
||||
|
||||
AIR302_common_sql.py:129:1: AIR302 [*] `airflow.operators.sqlite_operator.SqliteOperator` is moved into `common-sql` provider in Airflow 3.0;
|
||||
|
|
||||
127 | OracleOperator()
|
||||
128 | PostgresOperator()
|
||||
129 | SqliteOperator()
|
||||
| ^^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-common-sql>=1.3.0` and use `airflow.providers.common.sql.operators.sql.SQLExecuteQueryOperator` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
120 120 | from airflow.operators.oracle_operator import OracleOperator
|
||||
121 121 | from airflow.operators.postgres_operator import PostgresOperator
|
||||
122 122 | from airflow.operators.sqlite_operator import SqliteOperator
|
||||
123 |+from airflow.providers.common.sql.operators.sql import SQLExecuteQueryOperator
|
||||
123 124 |
|
||||
124 125 | JdbcOperator()
|
||||
125 126 | MsSqlOperator()
|
||||
126 127 | MySqlOperator()
|
||||
127 128 | OracleOperator()
|
||||
128 129 | PostgresOperator()
|
||||
129 |-SqliteOperator()
|
||||
130 |+SQLExecuteQueryOperator()
|
||||
|
||||
@@ -8,4 +8,4 @@ AIR302_daskexecutor.py:5:1: AIR302 `airflow.executors.dask_executor.DaskExecutor
|
||||
5 | DaskExecutor()
|
||||
| ^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-daskexecutor>=1.0.0` and use `DaskExecutor` from `airflow.providers.daskexecutor.executors.dask_executor` instead.
|
||||
= help: Install `apache-airflow-providers-daskexecutor>=1.0.0` and use `airflow.providers.daskexecutor.executors.dask_executor.DaskExecutor` instead.
|
||||
|
||||
@@ -9,7 +9,7 @@ AIR302_druid.py:12:1: AIR302 `airflow.hooks.druid_hook.DruidDbApiHook` is moved
|
||||
| ^^^^^^^^^^^^^^ AIR302
|
||||
13 | DruidHook()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-druid>=1.0.0` and use `DruidDbApiHook` from `airflow.providers.apache.druid.hooks.druid` instead.
|
||||
= help: Install `apache-airflow-providers-apache-druid>=1.0.0` and use `airflow.providers.apache.druid.hooks.druid.DruidDbApiHook` instead.
|
||||
|
||||
AIR302_druid.py:13:1: AIR302 `airflow.hooks.druid_hook.DruidHook` is moved into `apache-druid` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -19,7 +19,7 @@ AIR302_druid.py:13:1: AIR302 `airflow.hooks.druid_hook.DruidHook` is moved into
|
||||
14 |
|
||||
15 | HiveToDruidOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-druid>=1.0.0` and use `DruidHook` from `airflow.providers.apache.druid.hooks.druid` instead.
|
||||
= help: Install `apache-airflow-providers-apache-druid>=1.0.0` and use `airflow.providers.apache.druid.hooks.druid.DruidHook` instead.
|
||||
|
||||
AIR302_druid.py:15:1: AIR302 `airflow.operators.hive_to_druid.HiveToDruidOperator` is moved into `apache-druid` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -29,7 +29,7 @@ AIR302_druid.py:15:1: AIR302 `airflow.operators.hive_to_druid.HiveToDruidOperato
|
||||
| ^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
16 | HiveToDruidTransfer()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-druid>=1.0.0` and use `HiveToDruidOperator` from `airflow.providers.apache.druid.transfers.hive_to_druid` instead.
|
||||
= help: Install `apache-airflow-providers-apache-druid>=1.0.0` and use `airflow.providers.apache.druid.transfers.hive_to_druid.HiveToDruidOperator` instead.
|
||||
|
||||
AIR302_druid.py:16:1: AIR302 `airflow.operators.hive_to_druid.HiveToDruidTransfer` is moved into `apache-druid` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -37,4 +37,4 @@ AIR302_druid.py:16:1: AIR302 `airflow.operators.hive_to_druid.HiveToDruidTransfe
|
||||
16 | HiveToDruidTransfer()
|
||||
| ^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-druid>=1.0.0` and use `HiveToDruidOperator` from `airflow.providers.apache.druid.transfers.hive_to_druid` instead.
|
||||
= help: Install `apache-airflow-providers-apache-druid>=1.0.0` and use `airflow.providers.apache.druid.transfers.hive_to_druid.HiveToDruidOperator` instead.
|
||||
|
||||
@@ -10,7 +10,7 @@ AIR302_fab.py:10:1: AIR302 `airflow.api.auth.backend.basic_auth.CLIENT_AUTH` is
|
||||
11 | init_app()
|
||||
12 | auth_current_user()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `CLIENT_AUTH` from `airflow.providers.fab.auth_manager.api.auth.backend.basic_auth` instead.
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `airflow.providers.fab.auth_manager.api.auth.backend.basic_auth.CLIENT_AUTH` instead.
|
||||
|
||||
AIR302_fab.py:11:1: AIR302 `airflow.api.auth.backend.basic_auth.init_app` is moved into `fab` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -20,7 +20,7 @@ AIR302_fab.py:11:1: AIR302 `airflow.api.auth.backend.basic_auth.init_app` is mov
|
||||
12 | auth_current_user()
|
||||
13 | requires_authentication()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `init_app` from `airflow.providers.fab.auth_manager.api.auth.backend.basic_auth` instead.
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `airflow.providers.fab.auth_manager.api.auth.backend.basic_auth.init_app` instead.
|
||||
|
||||
AIR302_fab.py:12:1: AIR302 `airflow.api.auth.backend.basic_auth.auth_current_user` is moved into `fab` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -30,7 +30,7 @@ AIR302_fab.py:12:1: AIR302 `airflow.api.auth.backend.basic_auth.auth_current_use
|
||||
| ^^^^^^^^^^^^^^^^^ AIR302
|
||||
13 | requires_authentication()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `auth_current_user` from `airflow.providers.fab.auth_manager.api.auth.backend.basic_auth` instead.
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `airflow.providers.fab.auth_manager.api.auth.backend.basic_auth.auth_current_user` instead.
|
||||
|
||||
AIR302_fab.py:13:1: AIR302 `airflow.api.auth.backend.basic_auth.requires_authentication` is moved into `fab` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -41,7 +41,7 @@ AIR302_fab.py:13:1: AIR302 `airflow.api.auth.backend.basic_auth.requires_authent
|
||||
14 |
|
||||
15 | from airflow.api.auth.backend.kerberos_auth import (
|
||||
|
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `requires_authentication` from `airflow.providers.fab.auth_manager.api.auth.backend.basic_auth` instead.
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `airflow.providers.fab.auth_manager.api.auth.backend.basic_auth.requires_authentication` instead.
|
||||
|
||||
AIR302_fab.py:23:1: AIR302 `airflow.api.auth.backend.kerberos_auth.log` is moved into `fab` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -52,7 +52,7 @@ AIR302_fab.py:23:1: AIR302 `airflow.api.auth.backend.kerberos_auth.log` is moved
|
||||
24 | CLIENT_AUTH
|
||||
25 | find_user()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `log` from `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth` instead.
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth.log` instead.
|
||||
|
||||
AIR302_fab.py:24:1: AIR302 `airflow.api.auth.backend.kerberos_auth.CLIENT_AUTH` is moved into `fab` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -62,7 +62,7 @@ AIR302_fab.py:24:1: AIR302 `airflow.api.auth.backend.kerberos_auth.CLIENT_AUTH`
|
||||
25 | find_user()
|
||||
26 | init_app()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `CLIENT_AUTH` from `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth` instead.
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth.CLIENT_AUTH` instead.
|
||||
|
||||
AIR302_fab.py:25:1: AIR302 `airflow.api.auth.backend.kerberos_auth.find_user` is moved into `fab` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -73,7 +73,7 @@ AIR302_fab.py:25:1: AIR302 `airflow.api.auth.backend.kerberos_auth.find_user` is
|
||||
26 | init_app()
|
||||
27 | requires_authentication()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `find_user` from `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth` instead.
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth.find_user` instead.
|
||||
|
||||
AIR302_fab.py:26:1: AIR302 `airflow.api.auth.backend.kerberos_auth.init_app` is moved into `fab` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -83,7 +83,7 @@ AIR302_fab.py:26:1: AIR302 `airflow.api.auth.backend.kerberos_auth.init_app` is
|
||||
| ^^^^^^^^ AIR302
|
||||
27 | requires_authentication()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `init_app` from `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth` instead.
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth.init_app` instead.
|
||||
|
||||
AIR302_fab.py:27:1: AIR302 `airflow.api.auth.backend.kerberos_auth.requires_authentication` is moved into `fab` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -94,7 +94,7 @@ AIR302_fab.py:27:1: AIR302 `airflow.api.auth.backend.kerberos_auth.requires_auth
|
||||
28 |
|
||||
29 | from airflow.auth.managers.fab.api.auth.backend.kerberos_auth import (
|
||||
|
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `requires_authentication` from `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth` instead.
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth.requires_authentication` instead.
|
||||
|
||||
AIR302_fab.py:37:1: AIR302 `airflow.auth.managers.fab.api.auth.backend.kerberos_auth.log` is moved into `fab` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -105,7 +105,7 @@ AIR302_fab.py:37:1: AIR302 `airflow.auth.managers.fab.api.auth.backend.kerberos_
|
||||
38 | CLIENT_AUTH
|
||||
39 | find_user()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `log` from `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth` instead.
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth.log` instead.
|
||||
|
||||
AIR302_fab.py:38:1: AIR302 `airflow.auth.managers.fab.api.auth.backend.kerberos_auth.CLIENT_AUTH` is moved into `fab` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -115,7 +115,7 @@ AIR302_fab.py:38:1: AIR302 `airflow.auth.managers.fab.api.auth.backend.kerberos_
|
||||
39 | find_user()
|
||||
40 | init_app()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `CLIENT_AUTH` from `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth` instead.
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth.CLIENT_AUTH` instead.
|
||||
|
||||
AIR302_fab.py:39:1: AIR302 `airflow.auth.managers.fab.api.auth.backend.kerberos_auth.find_user` is moved into `fab` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -126,7 +126,7 @@ AIR302_fab.py:39:1: AIR302 `airflow.auth.managers.fab.api.auth.backend.kerberos_
|
||||
40 | init_app()
|
||||
41 | requires_authentication()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `find_user` from `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth` instead.
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth.find_user` instead.
|
||||
|
||||
AIR302_fab.py:40:1: AIR302 `airflow.auth.managers.fab.api.auth.backend.kerberos_auth.init_app` is moved into `fab` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -136,7 +136,7 @@ AIR302_fab.py:40:1: AIR302 `airflow.auth.managers.fab.api.auth.backend.kerberos_
|
||||
| ^^^^^^^^ AIR302
|
||||
41 | requires_authentication()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `init_app` from `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth` instead.
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth.init_app` instead.
|
||||
|
||||
AIR302_fab.py:41:1: AIR302 `airflow.auth.managers.fab.api.auth.backend.kerberos_auth.requires_authentication` is moved into `fab` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -147,7 +147,7 @@ AIR302_fab.py:41:1: AIR302 `airflow.auth.managers.fab.api.auth.backend.kerberos_
|
||||
42 |
|
||||
43 | from airflow.auth.managers.fab.fab_auth_manager import FabAuthManager
|
||||
|
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `requires_authentication` from `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth` instead.
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth.requires_authentication` instead.
|
||||
|
||||
AIR302_fab.py:49:1: AIR302 `airflow.auth.managers.fab.fab_auth_manager.FabAuthManager` is moved into `fab` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -158,7 +158,7 @@ AIR302_fab.py:49:1: AIR302 `airflow.auth.managers.fab.fab_auth_manager.FabAuthMa
|
||||
50 | MAX_NUM_DATABASE_USER_SESSIONS
|
||||
51 | FabAirflowSecurityManagerOverride()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `FabAuthManager` from `airflow.providers.fab.auth_manager.fab_auth_manager` instead.
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `airflow.providers.fab.auth_manager.fab_auth_manager.FabAuthManager` instead.
|
||||
|
||||
AIR302_fab.py:50:1: AIR302 `airflow.auth.managers.fab.security_manager.override.MAX_NUM_DATABASE_USER_SESSIONS` is moved into `fab` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -167,7 +167,7 @@ AIR302_fab.py:50:1: AIR302 `airflow.auth.managers.fab.security_manager.override.
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
51 | FabAirflowSecurityManagerOverride()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `MAX_NUM_DATABASE_USER_SESSIONS` from `airflow.providers.fab.auth_manager.security_manager.override` instead.
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `airflow.providers.fab.auth_manager.security_manager.override.MAX_NUM_DATABASE_USER_SESSIONS` instead.
|
||||
|
||||
AIR302_fab.py:51:1: AIR302 `airflow.auth.managers.fab.security_manager.override.FabAirflowSecurityManagerOverride` is moved into `fab` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -178,7 +178,7 @@ AIR302_fab.py:51:1: AIR302 `airflow.auth.managers.fab.security_manager.override.
|
||||
52 |
|
||||
53 | from airflow.www.security import FabAirflowSecurityManagerOverride
|
||||
|
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `FabAirflowSecurityManagerOverride` from `airflow.providers.fab.auth_manager.security_manager.override` instead.
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `airflow.providers.fab.auth_manager.security_manager.override.FabAirflowSecurityManagerOverride` instead.
|
||||
|
||||
AIR302_fab.py:55:1: AIR302 `airflow.www.security.FabAirflowSecurityManagerOverride` is moved into `fab` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -187,4 +187,4 @@ AIR302_fab.py:55:1: AIR302 `airflow.www.security.FabAirflowSecurityManagerOverri
|
||||
55 | FabAirflowSecurityManagerOverride()
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `FabAirflowSecurityManagerOverride` from `airflow.providers.fab.auth_manager.security_manager.override` instead.
|
||||
= help: Install `apache-airflow-providers-fab>=1.0.0` and use `airflow.providers.fab.auth_manager.security_manager.override.FabAirflowSecurityManagerOverride` instead.
|
||||
|
||||
@@ -9,7 +9,7 @@ AIR302_hdfs.py:6:1: AIR302 `airflow.hooks.webhdfs_hook.WebHDFSHook` is moved int
|
||||
| ^^^^^^^^^^^ AIR302
|
||||
7 | WebHdfsSensor()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hdfs>=1.0.0` and use `WebHDFSHook` from `airflow.providers.apache.hdfs.hooks.webhdfs` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hdfs>=1.0.0` and use `airflow.providers.apache.hdfs.hooks.webhdfs.WebHDFSHook` instead.
|
||||
|
||||
AIR302_hdfs.py:7:1: AIR302 `airflow.sensors.web_hdfs_sensor.WebHdfsSensor` is moved into `apache-hdfs` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -17,4 +17,4 @@ AIR302_hdfs.py:7:1: AIR302 `airflow.sensors.web_hdfs_sensor.WebHdfsSensor` is mo
|
||||
7 | WebHdfsSensor()
|
||||
| ^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hdfs>=1.0.0` and use `WebHdfsSensor` from `airflow.providers.apache.hdfs.sensors.web_hdfs` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hdfs>=1.0.0` and use `airflow.providers.apache.hdfs.sensors.web_hdfs.WebHdfsSensor` instead.
|
||||
|
||||
@@ -9,7 +9,7 @@ AIR302_hive.py:36:1: AIR302 `airflow.macros.hive.closest_ds_partition` is moved
|
||||
| ^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
37 | max_partition()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=5.1.0` and use `closest_ds_partition` from `airflow.providers.apache.hive.macros.hive` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=5.1.0` and use `airflow.providers.apache.hive.macros.hive.closest_ds_partition` instead.
|
||||
|
||||
AIR302_hive.py:37:1: AIR302 `airflow.macros.hive.max_partition` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -19,7 +19,7 @@ AIR302_hive.py:37:1: AIR302 `airflow.macros.hive.max_partition` is moved into `a
|
||||
38 |
|
||||
39 | HiveCliHook()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=5.1.0` and use `max_partition` from `airflow.providers.apache.hive.macros.hive` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=5.1.0` and use `airflow.providers.apache.hive.macros.hive.max_partition` instead.
|
||||
|
||||
AIR302_hive.py:39:1: AIR302 `airflow.hooks.hive_hooks.HiveCliHook` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -30,7 +30,7 @@ AIR302_hive.py:39:1: AIR302 `airflow.hooks.hive_hooks.HiveCliHook` is moved into
|
||||
40 | HiveMetastoreHook()
|
||||
41 | HiveServer2Hook()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `HiveCliHook` from `airflow.providers.apache.hive.hooks.hive` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `airflow.providers.apache.hive.hooks.hive.HiveCliHook` instead.
|
||||
|
||||
AIR302_hive.py:40:1: AIR302 `airflow.hooks.hive_hooks.HiveMetastoreHook` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -40,7 +40,7 @@ AIR302_hive.py:40:1: AIR302 `airflow.hooks.hive_hooks.HiveMetastoreHook` is move
|
||||
41 | HiveServer2Hook()
|
||||
42 | HIVE_QUEUE_PRIORITIES
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `HiveMetastoreHook` from `airflow.providers.apache.hive.hooks.hive` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `airflow.providers.apache.hive.hooks.hive.HiveMetastoreHook` instead.
|
||||
|
||||
AIR302_hive.py:41:1: AIR302 `airflow.hooks.hive_hooks.HiveServer2Hook` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -50,7 +50,7 @@ AIR302_hive.py:41:1: AIR302 `airflow.hooks.hive_hooks.HiveServer2Hook` is moved
|
||||
| ^^^^^^^^^^^^^^^ AIR302
|
||||
42 | HIVE_QUEUE_PRIORITIES
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `HiveServer2Hook` from `airflow.providers.apache.hive.hooks.hive` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `airflow.providers.apache.hive.hooks.hive.HiveServer2Hook` instead.
|
||||
|
||||
AIR302_hive.py:42:1: AIR302 `airflow.hooks.hive_hooks.HIVE_QUEUE_PRIORITIES` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -61,7 +61,7 @@ AIR302_hive.py:42:1: AIR302 `airflow.hooks.hive_hooks.HIVE_QUEUE_PRIORITIES` is
|
||||
43 |
|
||||
44 | HiveOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `HIVE_QUEUE_PRIORITIES` from `airflow.providers.apache.hive.hooks.hive` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `airflow.providers.apache.hive.hooks.hive.HIVE_QUEUE_PRIORITIES` instead.
|
||||
|
||||
AIR302_hive.py:44:1: AIR302 `airflow.operators.hive_operator.HiveOperator` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -72,7 +72,7 @@ AIR302_hive.py:44:1: AIR302 `airflow.operators.hive_operator.HiveOperator` is mo
|
||||
45 |
|
||||
46 | HiveStatsCollectionOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `HiveOperator` from `airflow.providers.apache.hive.operators.hive` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `airflow.providers.apache.hive.operators.hive.HiveOperator` instead.
|
||||
|
||||
AIR302_hive.py:46:1: AIR302 `airflow.operators.hive_stats_operator.HiveStatsCollectionOperator` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -83,7 +83,7 @@ AIR302_hive.py:46:1: AIR302 `airflow.operators.hive_stats_operator.HiveStatsColl
|
||||
47 |
|
||||
48 | HiveToMySqlOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `HiveStatsCollectionOperator` from `airflow.providers.apache.hive.operators.hive_stats` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `airflow.providers.apache.hive.operators.hive_stats.HiveStatsCollectionOperator` instead.
|
||||
|
||||
AIR302_hive.py:48:1: AIR302 `airflow.operators.hive_to_mysql.HiveToMySqlOperator` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -93,7 +93,7 @@ AIR302_hive.py:48:1: AIR302 `airflow.operators.hive_to_mysql.HiveToMySqlOperator
|
||||
| ^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
49 | HiveToMySqlTransfer()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `HiveToMySqlOperator` from `airflow.providers.apache.hive.transfers.hive_to_mysql` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `airflow.providers.apache.hive.transfers.hive_to_mysql.HiveToMySqlOperator` instead.
|
||||
|
||||
AIR302_hive.py:49:1: AIR302 `airflow.operators.hive_to_mysql.HiveToMySqlTransfer` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -103,7 +103,7 @@ AIR302_hive.py:49:1: AIR302 `airflow.operators.hive_to_mysql.HiveToMySqlTransfer
|
||||
50 |
|
||||
51 | HiveToSambaOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `HiveToMySqlOperator` from `airflow.providers.apache.hive.transfers.hive_to_mysql` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `airflow.providers.apache.hive.transfers.hive_to_mysql.HiveToMySqlOperator` instead.
|
||||
|
||||
AIR302_hive.py:51:1: AIR302 `airflow.operators.hive_to_samba_operator.HiveToSambaOperator` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -114,7 +114,7 @@ AIR302_hive.py:51:1: AIR302 `airflow.operators.hive_to_samba_operator.HiveToSamb
|
||||
52 |
|
||||
53 | MsSqlToHiveOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `HiveToSambaOperator` from `airflow.providers.apache.hive.transfers.hive_to_samba` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `airflow.providers.apache.hive.transfers.hive_to_samba.HiveToSambaOperator` instead.
|
||||
|
||||
AIR302_hive.py:53:1: AIR302 `airflow.operators.mssql_to_hive.MsSqlToHiveOperator` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -124,7 +124,7 @@ AIR302_hive.py:53:1: AIR302 `airflow.operators.mssql_to_hive.MsSqlToHiveOperator
|
||||
| ^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
54 | MsSqlToHiveTransfer()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `MsSqlToHiveOperator` from `airflow.providers.apache.hive.transfers.mssql_to_hive` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `airflow.providers.apache.hive.transfers.mssql_to_hive.MsSqlToHiveOperator` instead.
|
||||
|
||||
AIR302_hive.py:54:1: AIR302 `airflow.operators.mssql_to_hive.MsSqlToHiveTransfer` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -134,7 +134,7 @@ AIR302_hive.py:54:1: AIR302 `airflow.operators.mssql_to_hive.MsSqlToHiveTransfer
|
||||
55 |
|
||||
56 | MySqlToHiveOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `MsSqlToHiveOperator` from `airflow.providers.apache.hive.transfers.mssql_to_hive` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `airflow.providers.apache.hive.transfers.mssql_to_hive.MsSqlToHiveOperator` instead.
|
||||
|
||||
AIR302_hive.py:56:1: AIR302 `airflow.operators.mysql_to_hive.MySqlToHiveOperator` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -144,7 +144,7 @@ AIR302_hive.py:56:1: AIR302 `airflow.operators.mysql_to_hive.MySqlToHiveOperator
|
||||
| ^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
57 | MySqlToHiveTransfer()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `MySqlToHiveOperator` from `airflow.providers.apache.hive.transfers.mysql_to_hive` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `airflow.providers.apache.hive.transfers.mysql_to_hive.MySqlToHiveOperator` instead.
|
||||
|
||||
AIR302_hive.py:57:1: AIR302 `airflow.operators.mysql_to_hive.MySqlToHiveTransfer` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -154,7 +154,7 @@ AIR302_hive.py:57:1: AIR302 `airflow.operators.mysql_to_hive.MySqlToHiveTransfer
|
||||
58 |
|
||||
59 | S3ToHiveOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `MySqlToHiveOperator` from `airflow.providers.apache.hive.transfers.mysql_to_hive` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `airflow.providers.apache.hive.transfers.mysql_to_hive.MySqlToHiveOperator` instead.
|
||||
|
||||
AIR302_hive.py:59:1: AIR302 `airflow.operators.s3_to_hive_operator.S3ToHiveOperator` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -164,7 +164,7 @@ AIR302_hive.py:59:1: AIR302 `airflow.operators.s3_to_hive_operator.S3ToHiveOpera
|
||||
| ^^^^^^^^^^^^^^^^ AIR302
|
||||
60 | S3ToHiveTransfer()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `S3ToHiveOperator` from `airflow.providers.apache.hive.transfers.s3_to_hive` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `airflow.providers.apache.hive.transfers.s3_to_hive.S3ToHiveOperator` instead.
|
||||
|
||||
AIR302_hive.py:60:1: AIR302 `airflow.operators.s3_to_hive_operator.S3ToHiveTransfer` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -174,7 +174,7 @@ AIR302_hive.py:60:1: AIR302 `airflow.operators.s3_to_hive_operator.S3ToHiveTrans
|
||||
61 |
|
||||
62 | HivePartitionSensor()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `S3ToHiveOperator` from `airflow.providers.apache.hive.transfers.s3_to_hive` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `airflow.providers.apache.hive.transfers.s3_to_hive.S3ToHiveOperator` instead.
|
||||
|
||||
AIR302_hive.py:62:1: AIR302 `airflow.sensors.hive_partition_sensor.HivePartitionSensor` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -185,7 +185,7 @@ AIR302_hive.py:62:1: AIR302 `airflow.sensors.hive_partition_sensor.HivePartition
|
||||
63 |
|
||||
64 | MetastorePartitionSensor()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `HivePartitionSensor` from `airflow.providers.apache.hive.sensors.hive_partition` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `airflow.providers.apache.hive.sensors.hive_partition.HivePartitionSensor` instead.
|
||||
|
||||
AIR302_hive.py:64:1: AIR302 `airflow.sensors.metastore_partition_sensor.MetastorePartitionSensor` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -196,7 +196,7 @@ AIR302_hive.py:64:1: AIR302 `airflow.sensors.metastore_partition_sensor.Metastor
|
||||
65 |
|
||||
66 | NamedHivePartitionSensor()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `MetastorePartitionSensor` from `airflow.providers.apache.hive.sensors.metastore_partition` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `airflow.providers.apache.hive.sensors.metastore_partition.MetastorePartitionSensor` instead.
|
||||
|
||||
AIR302_hive.py:66:1: AIR302 `airflow.sensors.named_hive_partition_sensor.NamedHivePartitionSensor` is moved into `apache-hive` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -205,4 +205,4 @@ AIR302_hive.py:66:1: AIR302 `airflow.sensors.named_hive_partition_sensor.NamedHi
|
||||
66 | NamedHivePartitionSensor()
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `NamedHivePartitionSensor` from `airflow.providers.apache.hive.sensors.named_hive_partition` instead.
|
||||
= help: Install `apache-airflow-providers-apache-hive>=1.0.0` and use `airflow.providers.apache.hive.sensors.named_hive_partition.NamedHivePartitionSensor` instead.
|
||||
|
||||
@@ -10,7 +10,7 @@ AIR302_http.py:7:1: AIR302 `airflow.hooks.http_hook.HttpHook` is moved into `htt
|
||||
8 | SimpleHttpOperator()
|
||||
9 | HttpSensor()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-http>=1.0.0` and use `HttpHook` from `airflow.providers.http.hooks.http` instead.
|
||||
= help: Install `apache-airflow-providers-http>=1.0.0` and use `airflow.providers.http.hooks.http.HttpHook` instead.
|
||||
|
||||
AIR302_http.py:8:1: AIR302 [*] `airflow.operators.http_operator.SimpleHttpOperator` is moved into `http` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -19,7 +19,7 @@ AIR302_http.py:8:1: AIR302 [*] `airflow.operators.http_operator.SimpleHttpOperat
|
||||
| ^^^^^^^^^^^^^^^^^^ AIR302
|
||||
9 | HttpSensor()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-http>=5.0.0` and use `HttpOperator` from `airflow.providers.http.operators.http` instead.
|
||||
= help: Install `apache-airflow-providers-http>=5.0.0` and use `airflow.providers.http.operators.http.HttpOperator` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
3 3 | from airflow.hooks.http_hook import HttpHook
|
||||
@@ -39,4 +39,4 @@ AIR302_http.py:9:1: AIR302 `airflow.sensors.http_sensor.HttpSensor` is moved int
|
||||
9 | HttpSensor()
|
||||
| ^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-http>=1.0.0` and use `HttpSensor` from `airflow.providers.http.sensors.http` instead.
|
||||
= help: Install `apache-airflow-providers-http>=1.0.0` and use `airflow.providers.http.sensors.http.HttpSensor` instead.
|
||||
|
||||
@@ -9,7 +9,7 @@ AIR302_jdbc.py:8:1: AIR302 `airflow.hooks.jdbc_hook.JdbcHook` is moved into `jdb
|
||||
| ^^^^^^^^ AIR302
|
||||
9 | jaydebeapi()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-jdbc>=1.0.0` and use `JdbcHook` from `airflow.providers.jdbc.hooks.jdbc` instead.
|
||||
= help: Install `apache-airflow-providers-jdbc>=1.0.0` and use `airflow.providers.jdbc.hooks.jdbc.JdbcHook` instead.
|
||||
|
||||
AIR302_jdbc.py:9:1: AIR302 `airflow.hooks.jdbc_hook.jaydebeapi` is moved into `jdbc` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -17,4 +17,4 @@ AIR302_jdbc.py:9:1: AIR302 `airflow.hooks.jdbc_hook.jaydebeapi` is moved into `j
|
||||
9 | jaydebeapi()
|
||||
| ^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-jdbc>=1.0.0` and use `jaydebeapi` from `airflow.providers.jdbc.hooks.jdbc` instead.
|
||||
= help: Install `apache-airflow-providers-jdbc>=1.0.0` and use `airflow.providers.jdbc.hooks.jdbc.jaydebeapi` instead.
|
||||
|
||||
@@ -9,7 +9,7 @@ AIR302_kubernetes.py:29:1: AIR302 `airflow.executors.kubernetes_executor_types.A
|
||||
| ^^^^^^^^^^^^^^ AIR302
|
||||
30 | POD_EXECUTOR_DONE_KEY
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `ALL_NAMESPACES` from `airflow.providers.cncf.kubernetes.executors.kubernetes_executor_types` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.executors.kubernetes_executor_types.ALL_NAMESPACES` instead.
|
||||
|
||||
AIR302_kubernetes.py:30:1: AIR302 `airflow.executors.kubernetes_executor_types.POD_EXECUTOR_DONE_KEY` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -19,7 +19,7 @@ AIR302_kubernetes.py:30:1: AIR302 `airflow.executors.kubernetes_executor_types.P
|
||||
31 |
|
||||
32 | K8SModel()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `POD_EXECUTOR_DONE_KEY` from `airflow.providers.cncf.kubernetes.executors.kubernetes_executor_types` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.executors.kubernetes_executor_types.POD_EXECUTOR_DONE_KEY` instead.
|
||||
|
||||
AIR302_kubernetes.py:32:1: AIR302 `airflow.kubernetes.k8s_model.K8SModel` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -29,7 +29,7 @@ AIR302_kubernetes.py:32:1: AIR302 `airflow.kubernetes.k8s_model.K8SModel` is mov
|
||||
| ^^^^^^^^ AIR302
|
||||
33 | append_to_pod()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `K8SModel` from `airflow.providers.cncf.kubernetes.k8s_model` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.k8s_model.K8SModel` instead.
|
||||
|
||||
AIR302_kubernetes.py:33:1: AIR302 `airflow.kubernetes.k8s_model.append_to_pod` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -39,7 +39,7 @@ AIR302_kubernetes.py:33:1: AIR302 `airflow.kubernetes.k8s_model.append_to_pod` i
|
||||
34 |
|
||||
35 | _disable_verify_ssl()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `append_to_pod` from `airflow.providers.cncf.kubernetes.k8s_model` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.k8s_model.append_to_pod` instead.
|
||||
|
||||
AIR302_kubernetes.py:35:1: AIR302 `airflow.kubernetes.kube_client._disable_verify_ssl` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -50,7 +50,7 @@ AIR302_kubernetes.py:35:1: AIR302 `airflow.kubernetes.kube_client._disable_verif
|
||||
36 | _enable_tcp_keepalive()
|
||||
37 | get_kube_client()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `_disable_verify_ssl` from `airflow.providers.cncf.kubernetes.kube_client` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.kube_client._disable_verify_ssl` instead.
|
||||
|
||||
AIR302_kubernetes.py:36:1: AIR302 `airflow.kubernetes.kube_client._enable_tcp_keepalive` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -59,7 +59,7 @@ AIR302_kubernetes.py:36:1: AIR302 `airflow.kubernetes.kube_client._enable_tcp_ke
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
37 | get_kube_client()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `_enable_tcp_keepalive` from `airflow.providers.cncf.kubernetes.kube_client` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.kube_client._enable_tcp_keepalive` instead.
|
||||
|
||||
AIR302_kubernetes.py:37:1: AIR302 `airflow.kubernetes.kube_client.get_kube_client` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -70,7 +70,7 @@ AIR302_kubernetes.py:37:1: AIR302 `airflow.kubernetes.kube_client.get_kube_clien
|
||||
38 |
|
||||
39 | add_pod_suffix()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `get_kube_client` from `airflow.providers.cncf.kubernetes.kube_client` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.kube_client.get_kube_client` instead.
|
||||
|
||||
AIR302_kubernetes.py:39:1: AIR302 [*] `airflow.kubernetes.kubernetes_helper_functions.add_pod_suffix` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -80,7 +80,7 @@ AIR302_kubernetes.py:39:1: AIR302 [*] `airflow.kubernetes.kubernetes_helper_func
|
||||
| ^^^^^^^^^^^^^^ AIR302
|
||||
40 | create_pod_id()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=10.0.0` and use `add_unique_suffix` from `airflow.providers.cncf.kubernetes.kubernetes_helper_functions` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=10.0.0` and use `airflow.providers.cncf.kubernetes.kubernetes_helper_functions.add_unique_suffix` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
25 25 | Port,
|
||||
@@ -108,7 +108,7 @@ AIR302_kubernetes.py:40:1: AIR302 [*] `airflow.kubernetes.kubernetes_helper_func
|
||||
41 |
|
||||
42 | annotations_for_logging_task_metadata()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=10.0.0` and use `create_unique_id` from `airflow.providers.cncf.kubernetes.kubernetes_helper_functions` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=10.0.0` and use `airflow.providers.cncf.kubernetes.kubernetes_helper_functions.create_unique_id` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
25 25 | Port,
|
||||
@@ -137,7 +137,7 @@ AIR302_kubernetes.py:42:1: AIR302 `airflow.kubernetes.kubernetes_helper_function
|
||||
43 | annotations_to_key()
|
||||
44 | get_logs_task_metadata()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `annotations_for_logging_task_metadata` from `airflow.providers.cncf.kubernetes.kubernetes_helper_functions` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.kubernetes_helper_functions.annotations_for_logging_task_metadata` instead.
|
||||
|
||||
AIR302_kubernetes.py:43:1: AIR302 `airflow.kubernetes.kubernetes_helper_functions.annotations_to_key` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -147,7 +147,7 @@ AIR302_kubernetes.py:43:1: AIR302 `airflow.kubernetes.kubernetes_helper_function
|
||||
44 | get_logs_task_metadata()
|
||||
45 | rand_str()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `annotations_to_key` from `airflow.providers.cncf.kubernetes.kubernetes_helper_functions` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.kubernetes_helper_functions.annotations_to_key` instead.
|
||||
|
||||
AIR302_kubernetes.py:44:1: AIR302 `airflow.kubernetes.kubernetes_helper_functions.get_logs_task_metadata` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -157,7 +157,7 @@ AIR302_kubernetes.py:44:1: AIR302 `airflow.kubernetes.kubernetes_helper_function
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
45 | rand_str()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `get_logs_task_metadata` from `airflow.providers.cncf.kubernetes.kubernetes_helper_functions` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.kubernetes_helper_functions.get_logs_task_metadata` instead.
|
||||
|
||||
AIR302_kubernetes.py:45:1: AIR302 `airflow.kubernetes.kubernetes_helper_functions.rand_str` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -168,7 +168,7 @@ AIR302_kubernetes.py:45:1: AIR302 `airflow.kubernetes.kubernetes_helper_function
|
||||
46 |
|
||||
47 | Port()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `rand_str` from `airflow.providers.cncf.kubernetes.kubernetes_helper_functions` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.kubernetes_helper_functions.rand_str` instead.
|
||||
|
||||
AIR302_kubernetes.py:47:1: AIR302 [*] `airflow.kubernetes.pod.Port` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -178,7 +178,7 @@ AIR302_kubernetes.py:47:1: AIR302 [*] `airflow.kubernetes.pod.Port` is moved int
|
||||
| ^^^^ AIR302
|
||||
48 | Resources()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `V1ContainerPort` from `kubernetes.client.models` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `kubernetes.client.models.V1ContainerPort` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
25 25 | Port,
|
||||
@@ -204,7 +204,7 @@ AIR302_kubernetes.py:48:1: AIR302 [*] `airflow.kubernetes.pod.Resources` is move
|
||||
48 | Resources()
|
||||
| ^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `V1ResourceRequirements` from `kubernetes.client.models` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `kubernetes.client.models.V1ResourceRequirements` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
25 25 | Port,
|
||||
@@ -233,7 +233,7 @@ AIR302_kubernetes.py:64:1: AIR302 `airflow.kubernetes.pod_generator.datetime_to_
|
||||
65 | extend_object_field()
|
||||
66 | label_safe_datestring_to_datetime()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `datetime_to_label_safe_datestring` from `airflow.providers.cncf.kubernetes.pod_generator` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.pod_generator.datetime_to_label_safe_datestring` instead.
|
||||
|
||||
AIR302_kubernetes.py:65:1: AIR302 `airflow.kubernetes.pod_generator.extend_object_field` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -243,7 +243,7 @@ AIR302_kubernetes.py:65:1: AIR302 `airflow.kubernetes.pod_generator.extend_objec
|
||||
66 | label_safe_datestring_to_datetime()
|
||||
67 | make_safe_label_value()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `extend_object_field` from `airflow.providers.cncf.kubernetes.pod_generator` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.pod_generator.extend_object_field` instead.
|
||||
|
||||
AIR302_kubernetes.py:66:1: AIR302 `airflow.kubernetes.pod_generator.label_safe_datestring_to_datetime` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -254,7 +254,7 @@ AIR302_kubernetes.py:66:1: AIR302 `airflow.kubernetes.pod_generator.label_safe_d
|
||||
67 | make_safe_label_value()
|
||||
68 | merge_objects()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `label_safe_datestring_to_datetime` from `airflow.providers.cncf.kubernetes.pod_generator` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.pod_generator.label_safe_datestring_to_datetime` instead.
|
||||
|
||||
AIR302_kubernetes.py:67:1: AIR302 `airflow.kubernetes.pod_generator.make_safe_label_value` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -265,7 +265,7 @@ AIR302_kubernetes.py:67:1: AIR302 `airflow.kubernetes.pod_generator.make_safe_la
|
||||
68 | merge_objects()
|
||||
69 | PodGenerator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `make_safe_label_value` from `airflow.providers.cncf.kubernetes.pod_generator` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.pod_generator.make_safe_label_value` instead.
|
||||
|
||||
AIR302_kubernetes.py:68:1: AIR302 `airflow.kubernetes.pod_generator.merge_objects` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -276,7 +276,7 @@ AIR302_kubernetes.py:68:1: AIR302 `airflow.kubernetes.pod_generator.merge_object
|
||||
69 | PodGenerator()
|
||||
70 | PodDefaults()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `merge_objects` from `airflow.providers.cncf.kubernetes.pod_generator` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.pod_generator.merge_objects` instead.
|
||||
|
||||
AIR302_kubernetes.py:69:1: AIR302 `airflow.kubernetes.pod_generator.PodGenerator` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -287,7 +287,7 @@ AIR302_kubernetes.py:69:1: AIR302 `airflow.kubernetes.pod_generator.PodGenerator
|
||||
70 | PodDefaults()
|
||||
71 | PodGeneratorDeprecated()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `PodGenerator` from `airflow.providers.cncf.kubernetes.pod_generator` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.pod_generator.PodGenerator` instead.
|
||||
|
||||
AIR302_kubernetes.py:70:1: AIR302 `airflow.kubernetes.pod_generator.PodDefaults` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -298,7 +298,7 @@ AIR302_kubernetes.py:70:1: AIR302 `airflow.kubernetes.pod_generator.PodDefaults`
|
||||
71 | PodGeneratorDeprecated()
|
||||
72 | add_pod_suffix()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `PodDefaults` from `airflow.providers.cncf.kubernetes.utils.xcom_sidecar` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.utils.xcom_sidecar.PodDefaults` instead.
|
||||
|
||||
AIR302_kubernetes.py:71:1: AIR302 `airflow.kubernetes.pod_generator.PodGeneratorDeprecated` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -309,7 +309,7 @@ AIR302_kubernetes.py:71:1: AIR302 `airflow.kubernetes.pod_generator.PodGenerator
|
||||
72 | add_pod_suffix()
|
||||
73 | rand_str()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `PodGenerator` from `airflow.providers.cncf.kubernetes.pod_generator` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.pod_generator.PodGenerator` instead.
|
||||
|
||||
AIR302_kubernetes.py:72:1: AIR302 [*] `airflow.kubernetes.pod_generator.add_pod_suffix` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -319,7 +319,7 @@ AIR302_kubernetes.py:72:1: AIR302 [*] `airflow.kubernetes.pod_generator.add_pod_
|
||||
| ^^^^^^^^^^^^^^ AIR302
|
||||
73 | rand_str()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=10.0.0` and use `add_unique_suffix` from `airflow.providers.cncf.kubernetes.kubernetes_helper_functions` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=10.0.0` and use `airflow.providers.cncf.kubernetes.kubernetes_helper_functions.add_unique_suffix` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
60 60 | merge_objects,
|
||||
@@ -346,7 +346,7 @@ AIR302_kubernetes.py:73:1: AIR302 `airflow.kubernetes.pod_generator.rand_str` is
|
||||
73 | rand_str()
|
||||
| ^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `rand_str` from `airflow.providers.cncf.kubernetes.kubernetes_helper_functions` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.kubernetes_helper_functions.rand_str` instead.
|
||||
|
||||
AIR302_kubernetes.py:86:1: AIR302 `airflow.kubernetes.pod_generator_deprecated.PodDefaults` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -357,7 +357,7 @@ AIR302_kubernetes.py:86:1: AIR302 `airflow.kubernetes.pod_generator_deprecated.P
|
||||
87 | PodGenerator()
|
||||
88 | make_safe_label_value()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `PodDefaults` from `airflow.providers.cncf.kubernetes.utils.xcom_sidecar` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.utils.xcom_sidecar.PodDefaults` instead.
|
||||
|
||||
AIR302_kubernetes.py:87:1: AIR302 `airflow.kubernetes.pod_generator_deprecated.PodGenerator` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -366,7 +366,7 @@ AIR302_kubernetes.py:87:1: AIR302 `airflow.kubernetes.pod_generator_deprecated.P
|
||||
| ^^^^^^^^^^^^ AIR302
|
||||
88 | make_safe_label_value()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `PodGenerator` from `airflow.providers.cncf.kubernetes.pod_generator` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.pod_generator.PodGenerator` instead.
|
||||
|
||||
AIR302_kubernetes.py:88:1: AIR302 `airflow.kubernetes.pod_generator_deprecated.make_safe_label_value` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -377,7 +377,7 @@ AIR302_kubernetes.py:88:1: AIR302 `airflow.kubernetes.pod_generator_deprecated.m
|
||||
89 |
|
||||
90 | PodLauncher()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `make_safe_label_value` from `airflow.providers.cncf.kubernetes.pod_generator` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.pod_generator.make_safe_label_value` instead.
|
||||
|
||||
AIR302_kubernetes.py:90:1: AIR302 [*] `airflow.kubernetes.pod_launcher.PodLauncher` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -387,7 +387,7 @@ AIR302_kubernetes.py:90:1: AIR302 [*] `airflow.kubernetes.pod_launcher.PodLaunch
|
||||
| ^^^^^^^^^^^ AIR302
|
||||
91 | PodStatus()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=3.0.0` and use `PodManager` from `airflow.providers.cncf.kubernetes.utils.pod_manager` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=3.0.0` and use `airflow.providers.cncf.kubernetes.utils.pod_manager.PodManager` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
82 82 | PodLauncher,
|
||||
@@ -411,7 +411,7 @@ AIR302_kubernetes.py:91:1: AIR302 [*] `airflow.kubernetes.pod_launcher.PodStatus
|
||||
91 | PodStatus()
|
||||
| ^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=3.0.0` and use `PodPhase` from ` airflow.providers.cncf.kubernetes.utils.pod_manager` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=3.0.0` and use ` airflow.providers.cncf.kubernetes.utils.pod_manager.PodPhase` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
82 82 | PodLauncher,
|
||||
@@ -439,7 +439,7 @@ AIR302_kubernetes.py:108:1: AIR302 `airflow.kubernetes.pod_launcher_deprecated.P
|
||||
109 | PodLauncher()
|
||||
110 | PodStatus()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `PodDefaults` from `airflow.providers.cncf.kubernetes.utils.xcom_sidecar` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.utils.xcom_sidecar.PodDefaults` instead.
|
||||
|
||||
AIR302_kubernetes.py:109:1: AIR302 [*] `airflow.kubernetes.pod_launcher_deprecated.PodLauncher` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -449,7 +449,7 @@ AIR302_kubernetes.py:109:1: AIR302 [*] `airflow.kubernetes.pod_launcher_deprecat
|
||||
110 | PodStatus()
|
||||
111 | get_kube_client()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=3.0.0` and use `PodManager` from `airflow.providers.cncf.kubernetes.utils.pod_manager` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=3.0.0` and use `airflow.providers.cncf.kubernetes.utils.pod_manager.PodManager` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
104 104 | )
|
||||
@@ -472,7 +472,7 @@ AIR302_kubernetes.py:110:1: AIR302 [*] `airflow.kubernetes.pod_launcher_deprecat
|
||||
| ^^^^^^^^^ AIR302
|
||||
111 | get_kube_client()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=3.0.0` and use `PodPhase` from ` airflow.providers.cncf.kubernetes.utils.pod_manager` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=3.0.0` and use ` airflow.providers.cncf.kubernetes.utils.pod_manager.PodPhase` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
104 104 | )
|
||||
@@ -497,7 +497,7 @@ AIR302_kubernetes.py:111:1: AIR302 `airflow.kubernetes.pod_launcher_deprecated.g
|
||||
112 |
|
||||
113 | PodRuntimeInfoEnv()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `get_kube_client` from `airflow.providers.cncf.kubernetes.kube_client` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.kube_client.get_kube_client` instead.
|
||||
|
||||
AIR302_kubernetes.py:113:1: AIR302 [*] `airflow.kubernetes.pod_runtime_info_env.PodRuntimeInfoEnv` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -508,7 +508,7 @@ AIR302_kubernetes.py:113:1: AIR302 [*] `airflow.kubernetes.pod_runtime_info_env.
|
||||
114 | K8SModel()
|
||||
115 | Secret()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `V1EnvVar` from `kubernetes.client.models` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `kubernetes.client.models.V1EnvVar` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
104 104 | )
|
||||
@@ -535,7 +535,7 @@ AIR302_kubernetes.py:114:1: AIR302 `airflow.kubernetes.secret.K8SModel` is moved
|
||||
115 | Secret()
|
||||
116 | Volume()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `K8SModel` from `airflow.providers.cncf.kubernetes.k8s_model` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.k8s_model.K8SModel` instead.
|
||||
|
||||
AIR302_kubernetes.py:115:1: AIR302 `airflow.kubernetes.secret.Secret` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -546,7 +546,7 @@ AIR302_kubernetes.py:115:1: AIR302 `airflow.kubernetes.secret.Secret` is moved i
|
||||
116 | Volume()
|
||||
117 | VolumeMount()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `Secret` from `airflow.providers.cncf.kubernetes.secret` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `airflow.providers.cncf.kubernetes.secret.Secret` instead.
|
||||
|
||||
AIR302_kubernetes.py:116:1: AIR302 [*] `airflow.kubernetes.volume.Volume` is moved into `cncf-kubernetes` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -556,7 +556,7 @@ AIR302_kubernetes.py:116:1: AIR302 [*] `airflow.kubernetes.volume.Volume` is mov
|
||||
| ^^^^^^ AIR302
|
||||
117 | VolumeMount()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `V1Volume` from `kubernetes.client.models` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `kubernetes.client.models.V1Volume` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
104 104 | )
|
||||
@@ -581,7 +581,7 @@ AIR302_kubernetes.py:117:1: AIR302 [*] `airflow.kubernetes.volume_mount.VolumeMo
|
||||
117 | VolumeMount()
|
||||
| ^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `V1VolumeMount` from `kubernetes.client.models` instead.
|
||||
= help: Install `apache-airflow-providers-cncf-kubernetes>=7.4.0` and use `kubernetes.client.models.V1VolumeMount` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
104 104 | )
|
||||
|
||||
@@ -10,7 +10,7 @@ AIR302_mysql.py:9:1: AIR302 `airflow.hooks.mysql_hook.MySqlHook` is moved into `
|
||||
10 | PrestoToMySqlOperator()
|
||||
11 | PrestoToMySqlTransfer()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-mysql>=1.0.0` and use `MySqlHook` from `airflow.providers.mysql.hooks.mysql` instead.
|
||||
= help: Install `apache-airflow-providers-mysql>=1.0.0` and use `airflow.providers.mysql.hooks.mysql.MySqlHook` instead.
|
||||
|
||||
AIR302_mysql.py:10:1: AIR302 `airflow.operators.presto_to_mysql.PrestoToMySqlOperator` is moved into `mysql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -19,7 +19,7 @@ AIR302_mysql.py:10:1: AIR302 `airflow.operators.presto_to_mysql.PrestoToMySqlOpe
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
11 | PrestoToMySqlTransfer()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-mysql>=1.0.0` and use `PrestoToMySqlOperator` from `airflow.providers.mysql.transfers.presto_to_mysql` instead.
|
||||
= help: Install `apache-airflow-providers-mysql>=1.0.0` and use `airflow.providers.mysql.transfers.presto_to_mysql.PrestoToMySqlOperator` instead.
|
||||
|
||||
AIR302_mysql.py:11:1: AIR302 `airflow.operators.presto_to_mysql.PrestoToMySqlTransfer` is moved into `mysql` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -28,4 +28,4 @@ AIR302_mysql.py:11:1: AIR302 `airflow.operators.presto_to_mysql.PrestoToMySqlTra
|
||||
11 | PrestoToMySqlTransfer()
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-mysql>=1.0.0` and use `PrestoToMySqlOperator` from `airflow.providers.mysql.transfers.presto_to_mysql` instead.
|
||||
= help: Install `apache-airflow-providers-mysql>=1.0.0` and use `airflow.providers.mysql.transfers.presto_to_mysql.PrestoToMySqlOperator` instead.
|
||||
|
||||
@@ -8,4 +8,4 @@ AIR302_oracle.py:5:1: AIR302 `airflow.hooks.oracle_hook.OracleHook` is moved int
|
||||
5 | OracleHook()
|
||||
| ^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-oracle>=1.0.0` and use `OracleHook` from `airflow.providers.oracle.hooks.oracle` instead.
|
||||
= help: Install `apache-airflow-providers-oracle>=1.0.0` and use `airflow.providers.oracle.hooks.oracle.OracleHook` instead.
|
||||
|
||||
@@ -8,4 +8,4 @@ AIR302_papermill.py:5:1: AIR302 `airflow.operators.papermill_operator.PapermillO
|
||||
5 | PapermillOperator()
|
||||
| ^^^^^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-papermill>=1.0.0` and use `PapermillOperator` from `airflow.providers.papermill.operators.papermill` instead.
|
||||
= help: Install `apache-airflow-providers-papermill>=1.0.0` and use `airflow.providers.papermill.operators.papermill.PapermillOperator` instead.
|
||||
|
||||
@@ -9,7 +9,7 @@ AIR302_pig.py:6:1: AIR302 `airflow.hooks.pig_hook.PigCliHook` is moved into `apa
|
||||
| ^^^^^^^^^^ AIR302
|
||||
7 | PigOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-pig>=1.0.0` and use `PigCliHook` from `airflow.providers.apache.pig.hooks.pig` instead.
|
||||
= help: Install `apache-airflow-providers-apache-pig>=1.0.0` and use `airflow.providers.apache.pig.hooks.pig.PigCliHook` instead.
|
||||
|
||||
AIR302_pig.py:7:1: AIR302 `airflow.operators.pig_operator.PigOperator` is moved into `apache-pig` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -17,4 +17,4 @@ AIR302_pig.py:7:1: AIR302 `airflow.operators.pig_operator.PigOperator` is moved
|
||||
7 | PigOperator()
|
||||
| ^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-apache-pig>=1.0.0` and use `PigOperator` from `airflow.providers.apache.pig.operators.pig` instead.
|
||||
= help: Install `apache-airflow-providers-apache-pig>=1.0.0` and use `airflow.providers.apache.pig.operators.pig.PigOperator` instead.
|
||||
|
||||
@@ -9,7 +9,7 @@ AIR302_postgres.py:6:1: AIR302 `airflow.hooks.postgres_hook.PostgresHook` is mov
|
||||
| ^^^^^^^^^^^^ AIR302
|
||||
7 | Mapping()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-postgres>=1.0.0` and use `PostgresHook` from `airflow.providers.postgres.hooks.postgres` instead.
|
||||
= help: Install `apache-airflow-providers-postgres>=1.0.0` and use `airflow.providers.postgres.hooks.postgres.PostgresHook` instead.
|
||||
|
||||
AIR302_postgres.py:7:1: AIR302 `airflow.operators.postgres_operator.Mapping` is removed in Airflow 3.0
|
||||
|
|
||||
|
||||
@@ -8,4 +8,4 @@ AIR302_presto.py:5:1: AIR302 `airflow.hooks.presto_hook.PrestoHook` is moved int
|
||||
5 | PrestoHook()
|
||||
| ^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-presto>=1.0.0` and use `PrestoHook` from `airflow.providers.presto.hooks.presto` instead.
|
||||
= help: Install `apache-airflow-providers-presto>=1.0.0` and use `airflow.providers.presto.hooks.presto.PrestoHook` instead.
|
||||
|
||||
@@ -8,4 +8,4 @@ AIR302_samba.py:5:1: AIR302 `airflow.hooks.samba_hook.SambaHook` is moved into `
|
||||
5 | SambaHook()
|
||||
| ^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-samba>=1.0.0` and use `SambaHook` from `airflow.providers.samba.hooks.samba` instead.
|
||||
= help: Install `apache-airflow-providers-samba>=1.0.0` and use `airflow.providers.samba.hooks.samba.SambaHook` instead.
|
||||
|
||||
@@ -10,7 +10,7 @@ AIR302_slack.py:6:1: AIR302 `airflow.hooks.slack_hook.SlackHook` is moved into `
|
||||
7 | SlackAPIOperator()
|
||||
8 | SlackAPIPostOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-slack>=1.0.0` and use `SlackHook` from `airflow.providers.slack.hooks.slack` instead.
|
||||
= help: Install `apache-airflow-providers-slack>=1.0.0` and use `airflow.providers.slack.hooks.slack.SlackHook` instead.
|
||||
|
||||
AIR302_slack.py:7:1: AIR302 `airflow.operators.slack_operator.SlackAPIOperator` is moved into `slack` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -19,7 +19,7 @@ AIR302_slack.py:7:1: AIR302 `airflow.operators.slack_operator.SlackAPIOperator`
|
||||
| ^^^^^^^^^^^^^^^^ AIR302
|
||||
8 | SlackAPIPostOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-slack>=1.0.0` and use `SlackAPIOperator` from `airflow.providers.slack.operators.slack` instead.
|
||||
= help: Install `apache-airflow-providers-slack>=1.0.0` and use `airflow.providers.slack.operators.slack.SlackAPIOperator` instead.
|
||||
|
||||
AIR302_slack.py:8:1: AIR302 `airflow.operators.slack_operator.SlackAPIPostOperator` is moved into `slack` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -28,4 +28,4 @@ AIR302_slack.py:8:1: AIR302 `airflow.operators.slack_operator.SlackAPIPostOperat
|
||||
8 | SlackAPIPostOperator()
|
||||
| ^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-slack>=1.0.0` and use `SlackAPIPostOperator` from `airflow.providers.slack.operators.slack` instead.
|
||||
= help: Install `apache-airflow-providers-slack>=1.0.0` and use `airflow.providers.slack.operators.slack.SlackAPIPostOperator` instead.
|
||||
|
||||
@@ -10,7 +10,7 @@ AIR302_smtp.py:5:1: AIR302 `airflow.operators.email_operator.EmailOperator` is m
|
||||
6 |
|
||||
7 | from airflow.operators.email import EmailOperator
|
||||
|
|
||||
= help: Install `apache-airflow-providers-smtp>=1.0.0` and use `EmailOperator` from `airflow.providers.smtp.operators.smtp` instead.
|
||||
= help: Install `apache-airflow-providers-smtp>=1.0.0` and use `airflow.providers.smtp.operators.smtp.EmailOperator` instead.
|
||||
|
||||
AIR302_smtp.py:9:1: AIR302 `airflow.operators.email.EmailOperator` is moved into `smtp` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -19,4 +19,4 @@ AIR302_smtp.py:9:1: AIR302 `airflow.operators.email.EmailOperator` is moved into
|
||||
9 | EmailOperator()
|
||||
| ^^^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-smtp>=1.0.0` and use `EmailOperator` from `airflow.providers.smtp.operators.smtp` instead.
|
||||
= help: Install `apache-airflow-providers-smtp>=1.0.0` and use `airflow.providers.smtp.operators.smtp.EmailOperator` instead.
|
||||
|
||||
@@ -8,4 +8,4 @@ AIR302_sqlite.py:5:1: AIR302 `airflow.hooks.sqlite_hook.SqliteHook` is moved int
|
||||
5 | SqliteHook()
|
||||
| ^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-sqlite>=1.0.0` and use `SqliteHook` from `airflow.providers.sqlite.hooks.sqlite` instead.
|
||||
= help: Install `apache-airflow-providers-sqlite>=1.0.0` and use `airflow.providers.sqlite.hooks.sqlite.SqliteHook` instead.
|
||||
|
||||
@@ -10,7 +10,7 @@ AIR302_standard.py:25:1: AIR302 `airflow.operators.bash_operator.BashOperator` i
|
||||
26 |
|
||||
27 | TriggerDagRunLink()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `BashOperator` from `airflow.providers.standard.operators.bash` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.operators.bash.BashOperator` instead.
|
||||
|
||||
AIR302_standard.py:27:1: AIR302 `airflow.operators.dagrun_operator.TriggerDagRunLink` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -21,7 +21,7 @@ AIR302_standard.py:27:1: AIR302 `airflow.operators.dagrun_operator.TriggerDagRun
|
||||
28 | TriggerDagRunOperator()
|
||||
29 | DummyOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `TriggerDagRunLink` from `airflow.providers.standard.operators.trigger_dagrun` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `airflow.providers.standard.operators.trigger_dagrun.TriggerDagRunLink` instead.
|
||||
|
||||
AIR302_standard.py:28:1: AIR302 `airflow.operators.dagrun_operator.TriggerDagRunOperator` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -31,7 +31,7 @@ AIR302_standard.py:28:1: AIR302 `airflow.operators.dagrun_operator.TriggerDagRun
|
||||
29 | DummyOperator()
|
||||
30 | EmptyOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `TriggerDagRunOperator` from `airflow.providers.standard.operators.trigger_dagrun` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `airflow.providers.standard.operators.trigger_dagrun.TriggerDagRunOperator` instead.
|
||||
|
||||
AIR302_standard.py:29:1: AIR302 `airflow.operators.dummy.DummyOperator` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -41,7 +41,7 @@ AIR302_standard.py:29:1: AIR302 `airflow.operators.dummy.DummyOperator` is moved
|
||||
| ^^^^^^^^^^^^^ AIR302
|
||||
30 | EmptyOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `EmptyOperator` from `airflow.providers.standard.operators.empty` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `airflow.providers.standard.operators.empty.EmptyOperator` instead.
|
||||
|
||||
AIR302_standard.py:30:1: AIR302 `airflow.operators.dummy.EmptyOperator` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -52,7 +52,7 @@ AIR302_standard.py:30:1: AIR302 `airflow.operators.dummy.EmptyOperator` is moved
|
||||
31 |
|
||||
32 | LatestOnlyOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `EmptyOperator` from `airflow.providers.standard.operators.empty` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `airflow.providers.standard.operators.empty.EmptyOperator` instead.
|
||||
|
||||
AIR302_standard.py:32:1: AIR302 `airflow.operators.latest_only_operator.LatestOnlyOperator` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -63,7 +63,7 @@ AIR302_standard.py:32:1: AIR302 `airflow.operators.latest_only_operator.LatestOn
|
||||
33 |
|
||||
34 | BranchPythonOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `LatestOnlyOperator` from `airflow.providers.standard.operators.latest_only` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.operators.latest_only.LatestOnlyOperator` instead.
|
||||
|
||||
AIR302_standard.py:34:1: AIR302 `airflow.operators.python_operator.BranchPythonOperator` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -74,7 +74,7 @@ AIR302_standard.py:34:1: AIR302 `airflow.operators.python_operator.BranchPythonO
|
||||
35 | PythonOperator()
|
||||
36 | PythonVirtualenvOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `BranchPythonOperator` from `airflow.providers.standard.operators.python` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.operators.python.BranchPythonOperator` instead.
|
||||
|
||||
AIR302_standard.py:35:1: AIR302 `airflow.operators.python_operator.PythonOperator` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -84,7 +84,7 @@ AIR302_standard.py:35:1: AIR302 `airflow.operators.python_operator.PythonOperato
|
||||
36 | PythonVirtualenvOperator()
|
||||
37 | ShortCircuitOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `PythonOperator` from `airflow.providers.standard.operators.python` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.operators.python.PythonOperator` instead.
|
||||
|
||||
AIR302_standard.py:36:1: AIR302 `airflow.operators.python_operator.PythonVirtualenvOperator` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -94,7 +94,7 @@ AIR302_standard.py:36:1: AIR302 `airflow.operators.python_operator.PythonVirtual
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ AIR302
|
||||
37 | ShortCircuitOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `PythonVirtualenvOperator` from `airflow.providers.standard.operators.python` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.operators.python.PythonVirtualenvOperator` instead.
|
||||
|
||||
AIR302_standard.py:37:1: AIR302 `airflow.operators.python_operator.ShortCircuitOperator` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -105,7 +105,7 @@ AIR302_standard.py:37:1: AIR302 `airflow.operators.python_operator.ShortCircuitO
|
||||
38 |
|
||||
39 | ExternalTaskMarker()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `ShortCircuitOperator` from `airflow.providers.standard.operators.python` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.operators.python.ShortCircuitOperator` instead.
|
||||
|
||||
AIR302_standard.py:39:1: AIR302 `airflow.sensors.external_task_sensor.ExternalTaskMarker` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -116,7 +116,7 @@ AIR302_standard.py:39:1: AIR302 `airflow.sensors.external_task_sensor.ExternalTa
|
||||
40 | ExternalTaskSensor()
|
||||
41 | ExternalTaskSensorLink()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `ExternalTaskMarker` from `airflow.providers.standard.sensors.external_task` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.sensors.external_task.ExternalTaskMarker` instead.
|
||||
|
||||
AIR302_standard.py:40:1: AIR302 `airflow.sensors.external_task_sensor.ExternalTaskSensor` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -125,7 +125,7 @@ AIR302_standard.py:40:1: AIR302 `airflow.sensors.external_task_sensor.ExternalTa
|
||||
| ^^^^^^^^^^^^^^^^^^ AIR302
|
||||
41 | ExternalTaskSensorLink()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `ExternalTaskSensor` from `airflow.providers.standard.sensors.external_task` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.sensors.external_task.ExternalTaskSensor` instead.
|
||||
|
||||
AIR302_standard.py:41:1: AIR302 `airflow.sensors.external_task_sensor.ExternalTaskSensorLink` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -136,7 +136,7 @@ AIR302_standard.py:41:1: AIR302 `airflow.sensors.external_task_sensor.ExternalTa
|
||||
42 |
|
||||
43 | from airflow.operators.dummy_operator import (
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `ExternalTaskSensorLink` from `airflow.providers.standard.sensors.external_task` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.sensors.external_task.ExternalTaskSensorLink` instead.
|
||||
|
||||
AIR302_standard.py:48:1: AIR302 `airflow.operators.dummy_operator.DummyOperator` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -146,7 +146,7 @@ AIR302_standard.py:48:1: AIR302 `airflow.operators.dummy_operator.DummyOperator`
|
||||
| ^^^^^^^^^^^^^ AIR302
|
||||
49 | EmptyOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `EmptyOperator` from `airflow.providers.standard.operators.empty` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `airflow.providers.standard.operators.empty.EmptyOperator` instead.
|
||||
|
||||
AIR302_standard.py:49:1: AIR302 `airflow.operators.dummy_operator.EmptyOperator` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -156,7 +156,7 @@ AIR302_standard.py:49:1: AIR302 `airflow.operators.dummy_operator.EmptyOperator`
|
||||
50 |
|
||||
51 | from airflow.hooks.subprocess import SubprocessResult
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `EmptyOperator` from `airflow.providers.standard.operators.empty` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `airflow.providers.standard.operators.empty.EmptyOperator` instead.
|
||||
|
||||
AIR302_standard.py:52:1: AIR302 `airflow.hooks.subprocess.SubprocessResult` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -166,7 +166,7 @@ AIR302_standard.py:52:1: AIR302 `airflow.hooks.subprocess.SubprocessResult` is m
|
||||
53 | from airflow.hooks.subprocess import working_directory
|
||||
54 | working_directory()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `SubprocessResult` from `airflow.providers.standard.hooks.subprocess` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.hooks.subprocess.SubprocessResult` instead.
|
||||
|
||||
AIR302_standard.py:54:1: AIR302 `airflow.hooks.subprocess.working_directory` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -177,7 +177,7 @@ AIR302_standard.py:54:1: AIR302 `airflow.hooks.subprocess.working_directory` is
|
||||
55 | from airflow.operators.datetime import target_times_as_dates
|
||||
56 | target_times_as_dates()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `working_directory` from `airflow.providers.standard.hooks.subprocess` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.hooks.subprocess.working_directory` instead.
|
||||
|
||||
AIR302_standard.py:56:1: AIR302 `airflow.operators.datetime.target_times_as_dates` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -188,7 +188,7 @@ AIR302_standard.py:56:1: AIR302 `airflow.operators.datetime.target_times_as_date
|
||||
57 | from airflow.operators.trigger_dagrun import TriggerDagRunLink
|
||||
58 | TriggerDagRunLink()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `target_times_as_dates` from `airflow.providers.standard.operators.datetime` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.operators.datetime.target_times_as_dates` instead.
|
||||
|
||||
AIR302_standard.py:58:1: AIR302 `airflow.operators.trigger_dagrun.TriggerDagRunLink` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -199,7 +199,7 @@ AIR302_standard.py:58:1: AIR302 `airflow.operators.trigger_dagrun.TriggerDagRunL
|
||||
59 | from airflow.sensors.external_task import ExternalTaskSensorLink
|
||||
60 | ExternalTaskSensorLink()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `TriggerDagRunLink` from `airflow.providers.standard.operators.trigger_dagrun` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `airflow.providers.standard.operators.trigger_dagrun.TriggerDagRunLink` instead.
|
||||
|
||||
AIR302_standard.py:60:1: AIR302 [*] `airflow.sensors.external_task.ExternalTaskSensorLink` is moved into `standard` provider in Airflow 3.0;
|
||||
|
|
||||
@@ -210,7 +210,7 @@ AIR302_standard.py:60:1: AIR302 [*] `airflow.sensors.external_task.ExternalTaskS
|
||||
61 | from airflow.sensors.time_delta import WaitSensor
|
||||
62 | WaitSensor()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `ExternalDagLink` from `airflow.providers.standard.sensors.external_task` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.sensors.external_task.ExternalDagLink` instead.
|
||||
|
||||
ℹ Safe fix
|
||||
57 57 | from airflow.operators.trigger_dagrun import TriggerDagRunLink
|
||||
@@ -229,4 +229,4 @@ AIR302_standard.py:62:1: AIR302 `airflow.sensors.time_delta.WaitSensor` is moved
|
||||
62 | WaitSensor()
|
||||
| ^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `WaitSensor` from `airflow.providers.standard.sensors.time_delta` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.sensors.time_delta.WaitSensor` instead.
|
||||
|
||||
@@ -8,4 +8,4 @@ AIR302_zendesk.py:5:1: AIR302 `airflow.hooks.zendesk_hook.ZendeskHook` is moved
|
||||
5 | ZendeskHook()
|
||||
| ^^^^^^^^^^^ AIR302
|
||||
|
|
||||
= help: Install `apache-airflow-providers-zendesk>=1.0.0` and use `ZendeskHook` from `airflow.providers.zendesk.hooks.zendesk` instead.
|
||||
= help: Install `apache-airflow-providers-zendesk>=1.0.0` and use `airflow.providers.zendesk.hooks.zendesk.ZendeskHook` instead.
|
||||
|
||||
@@ -9,7 +9,7 @@ AIR311_names.py:27:1: AIR311 [*] `airflow.Dataset` is removed in Airflow 3.0; It
|
||||
28 |
|
||||
29 | # airflow.datasets
|
||||
|
|
||||
= help: Use `Asset` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.Asset` instead
|
||||
|
||||
ℹ Safe fix
|
||||
22 22 | from airflow.models.dag import DAG as DAGFromDag
|
||||
@@ -32,7 +32,7 @@ AIR311_names.py:30:1: AIR311 [*] `airflow.datasets.Dataset` is removed in Airflo
|
||||
31 | DatasetAlias()
|
||||
32 | DatasetAll()
|
||||
|
|
||||
= help: Use `Asset` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.Asset` instead
|
||||
|
||||
ℹ Safe fix
|
||||
22 22 | from airflow.models.dag import DAG as DAGFromDag
|
||||
@@ -59,7 +59,7 @@ AIR311_names.py:31:1: AIR311 [*] `airflow.datasets.DatasetAlias` is removed in A
|
||||
32 | DatasetAll()
|
||||
33 | DatasetAny()
|
||||
|
|
||||
= help: Use `AssetAlias` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.AssetAlias` instead
|
||||
|
||||
ℹ Safe fix
|
||||
22 22 | from airflow.models.dag import DAG as DAGFromDag
|
||||
@@ -87,7 +87,7 @@ AIR311_names.py:32:1: AIR311 [*] `airflow.datasets.DatasetAll` is removed in Air
|
||||
33 | DatasetAny()
|
||||
34 | Metadata()
|
||||
|
|
||||
= help: Use `AssetAll` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.AssetAll` instead
|
||||
|
||||
ℹ Safe fix
|
||||
22 22 | from airflow.models.dag import DAG as DAGFromDag
|
||||
@@ -116,7 +116,7 @@ AIR311_names.py:33:1: AIR311 [*] `airflow.datasets.DatasetAny` is removed in Air
|
||||
34 | Metadata()
|
||||
35 | expand_alias_to_datasets()
|
||||
|
|
||||
= help: Use `AssetAny` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.AssetAny` instead
|
||||
|
||||
ℹ Safe fix
|
||||
22 22 | from airflow.models.dag import DAG as DAGFromDag
|
||||
@@ -144,7 +144,7 @@ AIR311_names.py:34:1: AIR311 `airflow.datasets.metadata.Metadata` is removed in
|
||||
| ^^^^^^^^ AIR311
|
||||
35 | expand_alias_to_datasets()
|
||||
|
|
||||
= help: Use `Metadata` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.Metadata` instead
|
||||
|
||||
AIR311_names.py:35:1: AIR311 [*] `airflow.datasets.expand_alias_to_datasets` is removed in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -155,7 +155,7 @@ AIR311_names.py:35:1: AIR311 [*] `airflow.datasets.expand_alias_to_datasets` is
|
||||
36 |
|
||||
37 | # airflow.decorators
|
||||
|
|
||||
= help: Use `expand_alias_to_assets` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.expand_alias_to_assets` instead
|
||||
|
||||
ℹ Safe fix
|
||||
22 22 | from airflow.models.dag import DAG as DAGFromDag
|
||||
@@ -183,7 +183,7 @@ AIR311_names.py:38:1: AIR311 `airflow.decorators.dag` is removed in Airflow 3.0;
|
||||
39 | task()
|
||||
40 | task_group()
|
||||
|
|
||||
= help: Use `dag` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.dag` instead
|
||||
|
||||
AIR311_names.py:39:1: AIR311 `airflow.decorators.task` is removed in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -194,7 +194,7 @@ AIR311_names.py:39:1: AIR311 `airflow.decorators.task` is removed in Airflow 3.0
|
||||
40 | task_group()
|
||||
41 | setup()
|
||||
|
|
||||
= help: Use `task` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.task` instead
|
||||
|
||||
AIR311_names.py:40:1: AIR311 `airflow.decorators.task_group` is removed in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -205,7 +205,7 @@ AIR311_names.py:40:1: AIR311 `airflow.decorators.task_group` is removed in Airfl
|
||||
41 | setup()
|
||||
42 | teardown()
|
||||
|
|
||||
= help: Use `task_group` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.task_group` instead
|
||||
|
||||
AIR311_names.py:41:1: AIR311 `airflow.decorators.setup` is removed in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -215,7 +215,7 @@ AIR311_names.py:41:1: AIR311 `airflow.decorators.setup` is removed in Airflow 3.
|
||||
| ^^^^^ AIR311
|
||||
42 | teardown()
|
||||
|
|
||||
= help: Use `setup` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.setup` instead
|
||||
|
||||
AIR311_names.py:42:1: AIR311 `airflow.decorators.teardown` is removed in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -226,7 +226,7 @@ AIR311_names.py:42:1: AIR311 `airflow.decorators.teardown` is removed in Airflow
|
||||
43 |
|
||||
44 | # airflow.io
|
||||
|
|
||||
= help: Use `teardown` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.teardown` instead
|
||||
|
||||
AIR311_names.py:45:1: AIR311 `airflow.io.path.ObjectStoragePath` is removed in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -235,7 +235,7 @@ AIR311_names.py:45:1: AIR311 `airflow.io.path.ObjectStoragePath` is removed in A
|
||||
| ^^^^^^^^^^^^^^^^^ AIR311
|
||||
46 | attach()
|
||||
|
|
||||
= help: Use `ObjectStoragePath` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.ObjectStoragePath` instead
|
||||
|
||||
AIR311_names.py:46:1: AIR311 `airflow.io.storage.attach` is removed in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -246,7 +246,7 @@ AIR311_names.py:46:1: AIR311 `airflow.io.storage.attach` is removed in Airflow 3
|
||||
47 |
|
||||
48 | # airflow.models
|
||||
|
|
||||
= help: Use `attach` from `airflow.sdk.io` instead.
|
||||
= help: Use `airflow.sdk.io.attach` instead
|
||||
|
||||
AIR311_names.py:49:1: AIR311 `airflow.models.Connection` is removed in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -256,7 +256,7 @@ AIR311_names.py:49:1: AIR311 `airflow.models.Connection` is removed in Airflow 3
|
||||
50 | DAGFromModel()
|
||||
51 | Variable()
|
||||
|
|
||||
= help: Use `Connection` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.Connection` instead
|
||||
|
||||
AIR311_names.py:50:1: AIR311 [*] `airflow.models.DAG` is removed in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -266,7 +266,7 @@ AIR311_names.py:50:1: AIR311 [*] `airflow.models.DAG` is removed in Airflow 3.0;
|
||||
| ^^^^^^^^^^^^ AIR311
|
||||
51 | Variable()
|
||||
|
|
||||
= help: Use `DAG` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.DAG` instead
|
||||
|
||||
ℹ Safe fix
|
||||
22 22 | from airflow.models.dag import DAG as DAGFromDag
|
||||
@@ -295,7 +295,7 @@ AIR311_names.py:51:1: AIR311 `airflow.models.Variable` is removed in Airflow 3.0
|
||||
52 |
|
||||
53 | # airflow.models.baseoperator
|
||||
|
|
||||
= help: Use `Variable` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.Variable` instead
|
||||
|
||||
AIR311_names.py:54:1: AIR311 `airflow.models.baseoperator.chain` is removed in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -305,7 +305,7 @@ AIR311_names.py:54:1: AIR311 `airflow.models.baseoperator.chain` is removed in A
|
||||
55 | chain_linear()
|
||||
56 | cross_downstream()
|
||||
|
|
||||
= help: Use `chain` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.chain` instead
|
||||
|
||||
AIR311_names.py:55:1: AIR311 `airflow.models.baseoperator.chain_linear` is removed in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -315,7 +315,7 @@ AIR311_names.py:55:1: AIR311 `airflow.models.baseoperator.chain_linear` is remov
|
||||
| ^^^^^^^^^^^^ AIR311
|
||||
56 | cross_downstream()
|
||||
|
|
||||
= help: Use `chain_linear` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.chain_linear` instead
|
||||
|
||||
AIR311_names.py:56:1: AIR311 `airflow.models.baseoperator.cross_downstream` is removed in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -326,7 +326,7 @@ AIR311_names.py:56:1: AIR311 `airflow.models.baseoperator.cross_downstream` is r
|
||||
57 |
|
||||
58 | # airflow.models.baseoperatolinker
|
||||
|
|
||||
= help: Use `cross_downstream` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.cross_downstream` instead
|
||||
|
||||
AIR311_names.py:59:1: AIR311 `airflow.models.baseoperatorlink.BaseOperatorLink` is removed in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -336,7 +336,7 @@ AIR311_names.py:59:1: AIR311 `airflow.models.baseoperatorlink.BaseOperatorLink`
|
||||
60 |
|
||||
61 | # airflow.models.dag
|
||||
|
|
||||
= help: Use `BaseOperatorLink` from `airflow.sdk.definitions.baseoperatorlink` instead.
|
||||
= help: Use `airflow.sdk.definitions.baseoperatorlink.BaseOperatorLink` instead
|
||||
|
||||
AIR311_names.py:62:1: AIR311 [*] `airflow.models.dag.DAG` is removed in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -346,7 +346,7 @@ AIR311_names.py:62:1: AIR311 [*] `airflow.models.dag.DAG` is removed in Airflow
|
||||
63 | # airflow.timetables.datasets
|
||||
64 | DatasetOrTimeSchedule()
|
||||
|
|
||||
= help: Use `DAG` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.DAG` instead
|
||||
|
||||
ℹ Safe fix
|
||||
22 22 | from airflow.models.dag import DAG as DAGFromDag
|
||||
@@ -375,7 +375,7 @@ AIR311_names.py:64:1: AIR311 [*] `airflow.timetables.datasets.DatasetOrTimeSched
|
||||
65 |
|
||||
66 | # airflow.utils.dag_parsing_context
|
||||
|
|
||||
= help: Use `AssetOrTimeSchedule` from `airflow.timetables.assets` instead.
|
||||
= help: Use `airflow.timetables.assets.AssetOrTimeSchedule` instead
|
||||
|
||||
ℹ Safe fix
|
||||
22 22 | from airflow.models.dag import DAG as DAGFromDag
|
||||
@@ -401,4 +401,4 @@ AIR311_names.py:67:1: AIR311 `airflow.utils.dag_parsing_context.get_parsing_cont
|
||||
67 | get_parsing_context()
|
||||
| ^^^^^^^^^^^^^^^^^^^ AIR311
|
||||
|
|
||||
= help: Use `get_parsing_context` from `airflow.sdk` instead.
|
||||
= help: Use `airflow.sdk.get_parsing_context` instead
|
||||
|
||||
@@ -10,7 +10,7 @@ AIR312.py:32:1: AIR312 `airflow.hooks.filesystem.FSHook` is deprecated and moved
|
||||
33 | PackageIndexHook()
|
||||
34 | SubprocessHook()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `FSHook` from `airflow.providers.standard.hooks.filesystem` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.hooks.filesystem.FSHook` instead.
|
||||
|
||||
AIR312.py:33:1: AIR312 `airflow.hooks.package_index.PackageIndexHook` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -20,7 +20,7 @@ AIR312.py:33:1: AIR312 `airflow.hooks.package_index.PackageIndexHook` is depreca
|
||||
34 | SubprocessHook()
|
||||
35 | BashOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `PackageIndexHook` from `airflow.providers.standard.hooks.package_index` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.hooks.package_index.PackageIndexHook` instead.
|
||||
|
||||
AIR312.py:34:1: AIR312 `airflow.hooks.subprocess.SubprocessHook` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -31,7 +31,7 @@ AIR312.py:34:1: AIR312 `airflow.hooks.subprocess.SubprocessHook` is deprecated a
|
||||
35 | BashOperator()
|
||||
36 | BranchDateTimeOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `SubprocessHook` from `airflow.providers.standard.hooks.subprocess` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.hooks.subprocess.SubprocessHook` instead.
|
||||
|
||||
AIR312.py:35:1: AIR312 `airflow.operators.bash.BashOperator` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -42,7 +42,7 @@ AIR312.py:35:1: AIR312 `airflow.operators.bash.BashOperator` is deprecated and m
|
||||
36 | BranchDateTimeOperator()
|
||||
37 | TriggerDagRunOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `BashOperator` from `airflow.providers.standard.operators.bash` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.operators.bash.BashOperator` instead.
|
||||
|
||||
AIR312.py:36:1: AIR312 `airflow.operators.datetime.BranchDateTimeOperator` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -53,7 +53,7 @@ AIR312.py:36:1: AIR312 `airflow.operators.datetime.BranchDateTimeOperator` is de
|
||||
37 | TriggerDagRunOperator()
|
||||
38 | EmptyOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `BranchDateTimeOperator` from `airflow.providers.standard.operators.datetime` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.operators.datetime.BranchDateTimeOperator` instead.
|
||||
|
||||
AIR312.py:37:1: AIR312 `airflow.operators.trigger_dagrun.TriggerDagRunOperator` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -64,7 +64,7 @@ AIR312.py:37:1: AIR312 `airflow.operators.trigger_dagrun.TriggerDagRunOperator`
|
||||
38 | EmptyOperator()
|
||||
39 | LatestOnlyOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `TriggerDagRunOperator` from `airflow.providers.standard.operators.trigger_dagrun` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `airflow.providers.standard.operators.trigger_dagrun.TriggerDagRunOperator` instead.
|
||||
|
||||
AIR312.py:38:1: AIR312 `airflow.operators.empty.EmptyOperator` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -75,7 +75,7 @@ AIR312.py:38:1: AIR312 `airflow.operators.empty.EmptyOperator` is deprecated and
|
||||
39 | LatestOnlyOperator()
|
||||
40 | (
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `EmptyOperator` from `airflow.providers.standard.operators.empty` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `airflow.providers.standard.operators.empty.EmptyOperator` instead.
|
||||
|
||||
AIR312.py:39:1: AIR312 `airflow.operators.latest_only.LatestOnlyOperator` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -86,7 +86,7 @@ AIR312.py:39:1: AIR312 `airflow.operators.latest_only.LatestOnlyOperator` is dep
|
||||
40 | (
|
||||
41 | BranchPythonOperator(),
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `LatestOnlyOperator` from `airflow.providers.standard.operators.latest_only` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.operators.latest_only.LatestOnlyOperator` instead.
|
||||
|
||||
AIR312.py:41:5: AIR312 `airflow.operators.python.BranchPythonOperator` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -97,7 +97,7 @@ AIR312.py:41:5: AIR312 `airflow.operators.python.BranchPythonOperator` is deprec
|
||||
42 | PythonOperator(),
|
||||
43 | PythonVirtualenvOperator(),
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `BranchPythonOperator` from `airflow.providers.standard.operators.python` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.operators.python.BranchPythonOperator` instead.
|
||||
|
||||
AIR312.py:42:5: AIR312 `airflow.operators.python.PythonOperator` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -108,7 +108,7 @@ AIR312.py:42:5: AIR312 `airflow.operators.python.PythonOperator` is deprecated a
|
||||
43 | PythonVirtualenvOperator(),
|
||||
44 | ShortCircuitOperator(),
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `PythonOperator` from `airflow.providers.standard.operators.python` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.operators.python.PythonOperator` instead.
|
||||
|
||||
AIR312.py:43:5: AIR312 `airflow.operators.python.PythonVirtualenvOperator` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -119,7 +119,7 @@ AIR312.py:43:5: AIR312 `airflow.operators.python.PythonVirtualenvOperator` is de
|
||||
44 | ShortCircuitOperator(),
|
||||
45 | )
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `PythonVirtualenvOperator` from `airflow.providers.standard.operators.python` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.operators.python.PythonVirtualenvOperator` instead.
|
||||
|
||||
AIR312.py:44:5: AIR312 `airflow.operators.python.ShortCircuitOperator` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -130,7 +130,7 @@ AIR312.py:44:5: AIR312 `airflow.operators.python.ShortCircuitOperator` is deprec
|
||||
45 | )
|
||||
46 | BranchDayOfWeekOperator()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `ShortCircuitOperator` from `airflow.providers.standard.operators.python` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.operators.python.ShortCircuitOperator` instead.
|
||||
|
||||
AIR312.py:46:1: AIR312 `airflow.operators.weekday.BranchDayOfWeekOperator` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -141,7 +141,7 @@ AIR312.py:46:1: AIR312 `airflow.operators.weekday.BranchDayOfWeekOperator` is de
|
||||
47 | DateTimeSensor(), DateTimeSensorAsync()
|
||||
48 | ExternalTaskMarker(), ExternalTaskSensor()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `BranchDayOfWeekOperator` from `airflow.providers.standard.operators.weekday` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.operators.weekday.BranchDayOfWeekOperator` instead.
|
||||
|
||||
AIR312.py:47:1: AIR312 `airflow.sensors.date_time.DateTimeSensor` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -152,7 +152,7 @@ AIR312.py:47:1: AIR312 `airflow.sensors.date_time.DateTimeSensor` is deprecated
|
||||
48 | ExternalTaskMarker(), ExternalTaskSensor()
|
||||
49 | FileSensor()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `DateTimeSensor` from `airflow.providers.standard.sensors.date_time` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.sensors.date_time.DateTimeSensor` instead.
|
||||
|
||||
AIR312.py:47:19: AIR312 `airflow.sensors.date_time.DateTimeSensorAsync` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -163,7 +163,7 @@ AIR312.py:47:19: AIR312 `airflow.sensors.date_time.DateTimeSensorAsync` is depre
|
||||
48 | ExternalTaskMarker(), ExternalTaskSensor()
|
||||
49 | FileSensor()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `DateTimeSensorAsync` from `airflow.providers.standard.sensors.date_time` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.sensors.date_time.DateTimeSensorAsync` instead.
|
||||
|
||||
AIR312.py:48:1: AIR312 `airflow.sensors.external_task.ExternalTaskMarker` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -174,7 +174,7 @@ AIR312.py:48:1: AIR312 `airflow.sensors.external_task.ExternalTaskMarker` is dep
|
||||
49 | FileSensor()
|
||||
50 | TimeSensor(), TimeSensorAsync()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `ExternalTaskMarker` from `airflow.providers.standard.sensors.external_task` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.sensors.external_task.ExternalTaskMarker` instead.
|
||||
|
||||
AIR312.py:48:23: AIR312 `airflow.sensors.external_task.ExternalTaskSensor` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -185,7 +185,7 @@ AIR312.py:48:23: AIR312 `airflow.sensors.external_task.ExternalTaskSensor` is de
|
||||
49 | FileSensor()
|
||||
50 | TimeSensor(), TimeSensorAsync()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `ExternalTaskSensor` from `airflow.providers.standard.sensors.external_task` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.sensors.external_task.ExternalTaskSensor` instead.
|
||||
|
||||
AIR312.py:49:1: AIR312 `airflow.sensors.filesystem.FileSensor` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -196,7 +196,7 @@ AIR312.py:49:1: AIR312 `airflow.sensors.filesystem.FileSensor` is deprecated and
|
||||
50 | TimeSensor(), TimeSensorAsync()
|
||||
51 | TimeDeltaSensor(), TimeDeltaSensorAsync()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `FileSensor` from `airflow.providers.standard.sensors.filesystem` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `airflow.providers.standard.sensors.filesystem.FileSensor` instead.
|
||||
|
||||
AIR312.py:50:1: AIR312 `airflow.sensors.time_sensor.TimeSensor` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -207,7 +207,7 @@ AIR312.py:50:1: AIR312 `airflow.sensors.time_sensor.TimeSensor` is deprecated an
|
||||
51 | TimeDeltaSensor(), TimeDeltaSensorAsync()
|
||||
52 | DayOfWeekSensor()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `TimeSensor` from `airflow.providers.standard.sensors.time` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.sensors.time.TimeSensor` instead.
|
||||
|
||||
AIR312.py:50:15: AIR312 `airflow.sensors.time_sensor.TimeSensorAsync` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -218,7 +218,7 @@ AIR312.py:50:15: AIR312 `airflow.sensors.time_sensor.TimeSensorAsync` is depreca
|
||||
51 | TimeDeltaSensor(), TimeDeltaSensorAsync()
|
||||
52 | DayOfWeekSensor()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `TimeSensorAsync` from `airflow.providers.standard.sensors.time` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.sensors.time.TimeSensorAsync` instead.
|
||||
|
||||
AIR312.py:51:1: AIR312 `airflow.sensors.time_delta.TimeDeltaSensor` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -229,7 +229,7 @@ AIR312.py:51:1: AIR312 `airflow.sensors.time_delta.TimeDeltaSensor` is deprecate
|
||||
52 | DayOfWeekSensor()
|
||||
53 | DagStateTrigger(), WorkflowTrigger()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `TimeDeltaSensor` from `airflow.providers.standard.sensors.time_delta` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.sensors.time_delta.TimeDeltaSensor` instead.
|
||||
|
||||
AIR312.py:51:20: AIR312 `airflow.sensors.time_delta.TimeDeltaSensorAsync` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -240,7 +240,7 @@ AIR312.py:51:20: AIR312 `airflow.sensors.time_delta.TimeDeltaSensorAsync` is dep
|
||||
52 | DayOfWeekSensor()
|
||||
53 | DagStateTrigger(), WorkflowTrigger()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `TimeDeltaSensorAsync` from `airflow.providers.standard.sensors.time_delta` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.sensors.time_delta.TimeDeltaSensorAsync` instead.
|
||||
|
||||
AIR312.py:52:1: AIR312 `airflow.sensors.weekday.DayOfWeekSensor` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -251,7 +251,7 @@ AIR312.py:52:1: AIR312 `airflow.sensors.weekday.DayOfWeekSensor` is deprecated a
|
||||
53 | DagStateTrigger(), WorkflowTrigger()
|
||||
54 | FileTrigger()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `DayOfWeekSensor` from `airflow.providers.standard.sensors.weekday` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.sensors.weekday.DayOfWeekSensor` instead.
|
||||
|
||||
AIR312.py:53:1: AIR312 `airflow.triggers.external_task.DagStateTrigger` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -262,7 +262,7 @@ AIR312.py:53:1: AIR312 `airflow.triggers.external_task.DagStateTrigger` is depre
|
||||
54 | FileTrigger()
|
||||
55 | DateTimeTrigger(), TimeDeltaTrigger()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `DagStateTrigger` from `airflow.providers.standard.triggers.external_task` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.triggers.external_task.DagStateTrigger` instead.
|
||||
|
||||
AIR312.py:53:20: AIR312 `airflow.triggers.external_task.WorkflowTrigger` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -273,7 +273,7 @@ AIR312.py:53:20: AIR312 `airflow.triggers.external_task.WorkflowTrigger` is depr
|
||||
54 | FileTrigger()
|
||||
55 | DateTimeTrigger(), TimeDeltaTrigger()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `WorkflowTrigger` from `airflow.providers.standard.triggers.external_task` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.triggers.external_task.WorkflowTrigger` instead.
|
||||
|
||||
AIR312.py:54:1: AIR312 `airflow.triggers.file.FileTrigger` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -283,7 +283,7 @@ AIR312.py:54:1: AIR312 `airflow.triggers.file.FileTrigger` is deprecated and mov
|
||||
| ^^^^^^^^^^^ AIR312
|
||||
55 | DateTimeTrigger(), TimeDeltaTrigger()
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `FileTrigger` from `airflow.providers.standard.triggers.file` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.triggers.file.FileTrigger` instead.
|
||||
|
||||
AIR312.py:55:1: AIR312 `airflow.triggers.temporal.DateTimeTrigger` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -292,7 +292,7 @@ AIR312.py:55:1: AIR312 `airflow.triggers.temporal.DateTimeTrigger` is deprecated
|
||||
55 | DateTimeTrigger(), TimeDeltaTrigger()
|
||||
| ^^^^^^^^^^^^^^^ AIR312
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `DateTimeTrigger` from `airflow.providers.standard.triggers.temporal` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.triggers.temporal.DateTimeTrigger` instead.
|
||||
|
||||
AIR312.py:55:20: AIR312 `airflow.triggers.temporal.TimeDeltaTrigger` is deprecated and moved into `standard` provider in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
|
||||
|
|
||||
@@ -301,4 +301,4 @@ AIR312.py:55:20: AIR312 `airflow.triggers.temporal.TimeDeltaTrigger` is deprecat
|
||||
55 | DateTimeTrigger(), TimeDeltaTrigger()
|
||||
| ^^^^^^^^^^^^^^^^ AIR312
|
||||
|
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `TimeDeltaTrigger` from `airflow.providers.standard.triggers.temporal` instead.
|
||||
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.triggers.temporal.TimeDeltaTrigger` instead.
|
||||
|
||||
@@ -52,20 +52,17 @@ impl Violation for SysVersionCmpStr3 {
|
||||
|
||||
/// ## What it does
|
||||
/// Checks for equality comparisons against the major version returned by
|
||||
/// `sys.version_info` (e.g., `sys.version_info[0] == 3` or `sys.version_info[0] != 3`).
|
||||
/// `sys.version_info` (e.g., `sys.version_info[0] == 3`).
|
||||
///
|
||||
/// ## Why is this bad?
|
||||
/// Using `sys.version_info[0] == 3` to verify that the major version is
|
||||
/// Python 3 or greater will fail if the major version number is ever
|
||||
/// incremented (e.g., to Python 4). This is likely unintended, as code
|
||||
/// that uses this comparison is likely intended to be run on Python 2,
|
||||
/// but would now run on Python 4 too. Similarly, using `sys.version_info[0] != 3`
|
||||
/// to check for Python 2 will also fail if the major version number is
|
||||
/// incremented.
|
||||
/// but would now run on Python 4 too.
|
||||
///
|
||||
/// Instead, use `>=` to check if the major version number is 3 or greater,
|
||||
/// or `<` to check if the major version number is less than 3, to future-proof
|
||||
/// the code.
|
||||
/// to future-proof the code.
|
||||
///
|
||||
/// ## Example
|
||||
/// ```python
|
||||
@@ -91,18 +88,12 @@ impl Violation for SysVersionCmpStr3 {
|
||||
/// - [Python documentation: `sys.version`](https://docs.python.org/3/library/sys.html#sys.version)
|
||||
/// - [Python documentation: `sys.version_info`](https://docs.python.org/3/library/sys.html#sys.version_info)
|
||||
#[derive(ViolationMetadata)]
|
||||
pub(crate) struct SysVersionInfo0Eq3 {
|
||||
eq: bool,
|
||||
}
|
||||
pub(crate) struct SysVersionInfo0Eq3;
|
||||
|
||||
impl Violation for SysVersionInfo0Eq3 {
|
||||
#[derive_message_formats]
|
||||
fn message(&self) -> String {
|
||||
if self.eq {
|
||||
"`sys.version_info[0] == 3` referenced (python4), use `>=`".to_string()
|
||||
} else {
|
||||
"`sys.version_info[0] != 3` referenced (python4), use `<`".to_string()
|
||||
}
|
||||
"`sys.version_info[0] == 3` referenced (python4), use `>=`".to_string()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -244,7 +235,7 @@ pub(crate) fn compare(checker: &Checker, left: &Expr, ops: &[CmpOp], comparators
|
||||
{
|
||||
if *i == 0 {
|
||||
if let (
|
||||
[operator @ (CmpOp::Eq | CmpOp::NotEq)],
|
||||
[CmpOp::Eq | CmpOp::NotEq],
|
||||
[
|
||||
Expr::NumberLiteral(ast::ExprNumberLiteral {
|
||||
value: ast::Number::Int(n),
|
||||
@@ -255,9 +246,7 @@ pub(crate) fn compare(checker: &Checker, left: &Expr, ops: &[CmpOp], comparators
|
||||
{
|
||||
if *n == 3 && checker.enabled(Rule::SysVersionInfo0Eq3) {
|
||||
checker.report_diagnostic(Diagnostic::new(
|
||||
SysVersionInfo0Eq3 {
|
||||
eq: matches!(*operator, CmpOp::Eq),
|
||||
},
|
||||
SysVersionInfo0Eq3,
|
||||
left.range(),
|
||||
));
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ YTT201.py:8:7: YTT201 `sys.version_info[0] == 3` referenced (python4), use `>=`
|
||||
10 | PY2 = version_info[0] != 3
|
||||
|
|
||||
|
||||
YTT201.py:9:7: YTT201 `sys.version_info[0] != 3` referenced (python4), use `<`
|
||||
YTT201.py:9:7: YTT201 `sys.version_info[0] == 3` referenced (python4), use `>=`
|
||||
|
|
||||
7 | PY3 = sys.version_info[0] == 3
|
||||
8 | PY3 = version_info[0] == 3
|
||||
@@ -29,7 +29,7 @@ YTT201.py:9:7: YTT201 `sys.version_info[0] != 3` referenced (python4), use `<`
|
||||
10 | PY2 = version_info[0] != 3
|
||||
|
|
||||
|
||||
YTT201.py:10:7: YTT201 `sys.version_info[0] != 3` referenced (python4), use `<`
|
||||
YTT201.py:10:7: YTT201 `sys.version_info[0] == 3` referenced (python4), use `>=`
|
||||
|
|
||||
8 | PY3 = version_info[0] == 3
|
||||
9 | PY2 = sys.version_info[0] != 3
|
||||
|
||||
@@ -604,9 +604,9 @@ pub(crate) fn definition(
|
||||
checker: &Checker,
|
||||
definition: &Definition,
|
||||
visibility: visibility::Visibility,
|
||||
) {
|
||||
) -> Vec<Diagnostic> {
|
||||
let Some(function) = definition.as_function_def() else {
|
||||
return;
|
||||
return vec![];
|
||||
};
|
||||
|
||||
let ast::StmtFunctionDef {
|
||||
@@ -899,10 +899,13 @@ pub(crate) fn definition(
|
||||
}
|
||||
}
|
||||
|
||||
if !checker.settings.flake8_annotations.ignore_fully_untyped {
|
||||
return diagnostics;
|
||||
}
|
||||
|
||||
// If settings say so, don't report any of the
|
||||
// diagnostics gathered here if there were no type annotations at all.
|
||||
if !checker.settings.flake8_annotations.ignore_fully_untyped
|
||||
|| has_any_typed_arg
|
||||
if has_any_typed_arg
|
||||
|| has_typed_return
|
||||
|| (is_method
|
||||
&& !visibility::is_staticmethod(decorator_list, checker.semantic())
|
||||
@@ -912,8 +915,8 @@ pub(crate) fn definition(
|
||||
.or_else(|| parameters.args.first())
|
||||
.is_some_and(|first_param| first_param.annotation().is_some()))
|
||||
{
|
||||
for diagnostic in diagnostics {
|
||||
checker.report_diagnostic(diagnostic);
|
||||
}
|
||||
diagnostics
|
||||
} else {
|
||||
vec![]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,25 +62,7 @@ pub(crate) fn async_zero_sleep(checker: &Checker, call: &ExprCall) {
|
||||
return;
|
||||
}
|
||||
|
||||
let Some(qualified_name) = checker
|
||||
.semantic()
|
||||
.resolve_qualified_name(call.func.as_ref())
|
||||
else {
|
||||
return;
|
||||
};
|
||||
|
||||
let Some(module) = AsyncModule::try_from(&qualified_name) else {
|
||||
return;
|
||||
};
|
||||
|
||||
// Determine the correct argument name
|
||||
let arg_name = match module {
|
||||
AsyncModule::Trio => "seconds",
|
||||
AsyncModule::AnyIo => "delay",
|
||||
AsyncModule::AsyncIo => return,
|
||||
};
|
||||
|
||||
let Some(arg) = call.arguments.find_argument_value(arg_name, 0) else {
|
||||
let Some(arg) = call.arguments.find_argument_value("seconds", 0) else {
|
||||
return;
|
||||
};
|
||||
|
||||
|
||||
@@ -71,25 +71,7 @@ pub(crate) fn long_sleep_not_forever(checker: &Checker, call: &ExprCall) {
|
||||
return;
|
||||
}
|
||||
|
||||
let Some(qualified_name) = checker
|
||||
.semantic()
|
||||
.resolve_qualified_name(call.func.as_ref())
|
||||
else {
|
||||
return;
|
||||
};
|
||||
|
||||
let Some(module) = AsyncModule::try_from(&qualified_name) else {
|
||||
return;
|
||||
};
|
||||
|
||||
// Determine the correct argument name
|
||||
let arg_name = match module {
|
||||
AsyncModule::Trio => "seconds",
|
||||
AsyncModule::AnyIo => "delay",
|
||||
AsyncModule::AsyncIo => return,
|
||||
};
|
||||
|
||||
let Some(arg) = call.arguments.find_argument_value(arg_name, 0) else {
|
||||
let Some(arg) = call.arguments.find_argument_value("seconds", 0) else {
|
||||
return;
|
||||
};
|
||||
|
||||
|
||||
@@ -214,41 +214,3 @@ ASYNC115.py:128:15: ASYNC115 [*] Use `anyio.lowlevel.checkpoint()` instead of `a
|
||||
129 129 |
|
||||
130 130 |
|
||||
131 131 | def func():
|
||||
|
||||
ASYNC115.py:156:11: ASYNC115 [*] Use `anyio.lowlevel.checkpoint()` instead of `anyio.sleep(0)`
|
||||
|
|
||||
154 | await anyio.sleep(seconds=1) # OK
|
||||
155 |
|
||||
156 | await anyio.sleep(delay=0) # ASYNC115
|
||||
| ^^^^^^^^^^^^^^^^^^^^ ASYNC115
|
||||
157 | await anyio.sleep(seconds=0) # OK
|
||||
|
|
||||
= help: Replace with `anyio.lowlevel.checkpoint()`
|
||||
|
||||
ℹ Safe fix
|
||||
153 153 | await anyio.sleep(delay=1) # OK
|
||||
154 154 | await anyio.sleep(seconds=1) # OK
|
||||
155 155 |
|
||||
156 |- await anyio.sleep(delay=0) # ASYNC115
|
||||
156 |+ await anyio.lowlevel.checkpoint() # ASYNC115
|
||||
157 157 | await anyio.sleep(seconds=0) # OK
|
||||
158 158 |
|
||||
159 159 |
|
||||
|
||||
ASYNC115.py:166:11: ASYNC115 [*] Use `trio.lowlevel.checkpoint()` instead of `trio.sleep(0)`
|
||||
|
|
||||
164 | await trio.sleep(delay=1) # OK
|
||||
165 |
|
||||
166 | await trio.sleep(seconds=0) # ASYNC115
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ ASYNC115
|
||||
167 | await trio.sleep(delay=0) # OK
|
||||
|
|
||||
= help: Replace with `trio.lowlevel.checkpoint()`
|
||||
|
||||
ℹ Safe fix
|
||||
163 163 | await trio.sleep(seconds=1) # OK
|
||||
164 164 | await trio.sleep(delay=1) # OK
|
||||
165 165 |
|
||||
166 |- await trio.sleep(seconds=0) # ASYNC115
|
||||
166 |+ await trio.lowlevel.checkpoint() # ASYNC115
|
||||
167 167 | await trio.sleep(delay=0) # OK
|
||||
|
||||
@@ -289,44 +289,3 @@ ASYNC116.py:110:11: ASYNC116 [*] `anyio.sleep()` with >24 hour interval should u
|
||||
109 110 | # catch from import
|
||||
110 |- await sleep(86401) # error: 116, "async"
|
||||
111 |+ await sleep_forever() # error: 116, "async"
|
||||
111 112 |
|
||||
112 113 |
|
||||
113 114 | async def test_anyio_async116_helpers():
|
||||
|
||||
ASYNC116.py:119:11: ASYNC116 [*] `anyio.sleep()` with >24 hour interval should usually be `anyio.sleep_forever()`
|
||||
|
|
||||
117 | await anyio.sleep(seconds=1) # OK
|
||||
118 |
|
||||
119 | await anyio.sleep(delay=86401) # ASYNC116
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ ASYNC116
|
||||
120 | await anyio.sleep(seconds=86401) # OK
|
||||
|
|
||||
= help: Replace with `anyio.sleep_forever()`
|
||||
|
||||
ℹ Unsafe fix
|
||||
116 116 | await anyio.sleep(delay=1) # OK
|
||||
117 117 | await anyio.sleep(seconds=1) # OK
|
||||
118 118 |
|
||||
119 |- await anyio.sleep(delay=86401) # ASYNC116
|
||||
119 |+ await anyio.sleep_forever() # ASYNC116
|
||||
120 120 | await anyio.sleep(seconds=86401) # OK
|
||||
121 121 |
|
||||
122 122 |
|
||||
|
||||
ASYNC116.py:129:11: ASYNC116 [*] `trio.sleep()` with >24 hour interval should usually be `trio.sleep_forever()`
|
||||
|
|
||||
127 | await trio.sleep(delay=1) # OK
|
||||
128 |
|
||||
129 | await trio.sleep(seconds=86401) # ASYNC116
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ ASYNC116
|
||||
130 | await trio.sleep(delay=86401) # OK
|
||||
|
|
||||
= help: Replace with `trio.sleep_forever()`
|
||||
|
||||
ℹ Unsafe fix
|
||||
126 126 | await trio.sleep(seconds=1) # OK
|
||||
127 127 | await trio.sleep(delay=1) # OK
|
||||
128 128 |
|
||||
129 |- await trio.sleep(seconds=86401) # ASYNC116
|
||||
129 |+ await trio.sleep_forever() # ASYNC116
|
||||
130 130 | await trio.sleep(delay=86401) # OK
|
||||
|
||||
@@ -52,21 +52,17 @@ impl Violation for HardcodedPasswordFuncArg {
|
||||
|
||||
/// S106
|
||||
pub(crate) fn hardcoded_password_func_arg(checker: &Checker, keywords: &[Keyword]) {
|
||||
for keyword in keywords {
|
||||
if string_literal(&keyword.value).is_none_or(str::is_empty) {
|
||||
continue;
|
||||
}
|
||||
let Some(arg) = &keyword.arg else {
|
||||
continue;
|
||||
};
|
||||
checker.report_diagnostics(keywords.iter().filter_map(|keyword| {
|
||||
string_literal(&keyword.value).filter(|string| !string.is_empty())?;
|
||||
let arg = keyword.arg.as_ref()?;
|
||||
if !matches_password_name(arg) {
|
||||
continue;
|
||||
return None;
|
||||
}
|
||||
checker.report_diagnostic(Diagnostic::new(
|
||||
Some(Diagnostic::new(
|
||||
HardcodedPasswordFuncArg {
|
||||
name: arg.to_string(),
|
||||
},
|
||||
keyword.range(),
|
||||
));
|
||||
}
|
||||
))
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -76,20 +76,16 @@ pub(crate) fn compare_to_hardcoded_password_string(
|
||||
left: &Expr,
|
||||
comparators: &[Expr],
|
||||
) {
|
||||
for comp in comparators {
|
||||
if string_literal(comp).is_none_or(str::is_empty) {
|
||||
continue;
|
||||
}
|
||||
let Some(name) = password_target(left) else {
|
||||
continue;
|
||||
};
|
||||
checker.report_diagnostic(Diagnostic::new(
|
||||
checker.report_diagnostics(comparators.iter().filter_map(|comp| {
|
||||
string_literal(comp).filter(|string| !string.is_empty())?;
|
||||
let name = password_target(left)?;
|
||||
Some(Diagnostic::new(
|
||||
HardcodedPasswordString {
|
||||
name: name.to_string(),
|
||||
},
|
||||
comp.range(),
|
||||
));
|
||||
}
|
||||
))
|
||||
}));
|
||||
}
|
||||
|
||||
/// S105
|
||||
|
||||
@@ -7,6 +7,7 @@ use ruff_macros::{ViolationMetadata, derive_message_formats};
|
||||
use ruff_python_ast::name::{QualifiedName, UnqualifiedName};
|
||||
use ruff_python_ast::visitor;
|
||||
use ruff_python_ast::visitor::Visitor;
|
||||
use ruff_python_semantic::SemanticModel;
|
||||
use ruff_python_semantic::analyze::typing::{
|
||||
is_immutable_annotation, is_immutable_func, is_immutable_newtype_call, is_mutable_func,
|
||||
};
|
||||
@@ -82,15 +83,20 @@ impl Violation for FunctionCallInDefaultArgument {
|
||||
}
|
||||
|
||||
struct ArgumentDefaultVisitor<'a, 'b> {
|
||||
checker: &'a Checker<'b>,
|
||||
semantic: &'a SemanticModel<'b>,
|
||||
extend_immutable_calls: &'a [QualifiedName<'b>],
|
||||
diagnostics: Vec<Diagnostic>,
|
||||
}
|
||||
|
||||
impl<'a, 'b> ArgumentDefaultVisitor<'a, 'b> {
|
||||
fn new(checker: &'a Checker<'b>, extend_immutable_calls: &'a [QualifiedName<'b>]) -> Self {
|
||||
fn new(
|
||||
semantic: &'a SemanticModel<'b>,
|
||||
extend_immutable_calls: &'a [QualifiedName<'b>],
|
||||
) -> Self {
|
||||
Self {
|
||||
checker,
|
||||
semantic,
|
||||
extend_immutable_calls,
|
||||
diagnostics: Vec::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -99,21 +105,13 @@ impl Visitor<'_> for ArgumentDefaultVisitor<'_, '_> {
|
||||
fn visit_expr(&mut self, expr: &Expr) {
|
||||
match expr {
|
||||
Expr::Call(ast::ExprCall { func, .. }) => {
|
||||
if !is_mutable_func(func, self.checker.semantic())
|
||||
&& !is_immutable_func(
|
||||
func,
|
||||
self.checker.semantic(),
|
||||
self.extend_immutable_calls,
|
||||
)
|
||||
if !is_mutable_func(func, self.semantic)
|
||||
&& !is_immutable_func(func, self.semantic, self.extend_immutable_calls)
|
||||
&& !func.as_name_expr().is_some_and(|name| {
|
||||
is_immutable_newtype_call(
|
||||
name,
|
||||
self.checker.semantic(),
|
||||
self.extend_immutable_calls,
|
||||
)
|
||||
is_immutable_newtype_call(name, self.semantic, self.extend_immutable_calls)
|
||||
})
|
||||
{
|
||||
self.checker.report_diagnostic(Diagnostic::new(
|
||||
self.diagnostics.push(Diagnostic::new(
|
||||
FunctionCallInDefaultArgument {
|
||||
name: UnqualifiedName::from_expr(func).map(|name| name.to_string()),
|
||||
},
|
||||
@@ -141,7 +139,7 @@ pub(crate) fn function_call_in_argument_default(checker: &Checker, parameters: &
|
||||
.map(|target| QualifiedName::from_dotted_name(target))
|
||||
.collect();
|
||||
|
||||
let mut visitor = ArgumentDefaultVisitor::new(checker, &extend_immutable_calls);
|
||||
let mut visitor = ArgumentDefaultVisitor::new(checker.semantic(), &extend_immutable_calls);
|
||||
for parameter in parameters.iter_non_variadic_params() {
|
||||
if let Some(default) = parameter.default() {
|
||||
if !parameter.annotation().is_some_and(|expr| {
|
||||
@@ -151,4 +149,6 @@ pub(crate) fn function_call_in_argument_default(checker: &Checker, parameters: &
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
checker.report_diagnostics(visitor.diagnostics);
|
||||
}
|
||||
|
||||
@@ -109,7 +109,5 @@ pub(crate) fn duplicate_literal_member<'a>(checker: &Checker, expr: &'a Expr) {
|
||||
}
|
||||
}
|
||||
|
||||
for diagnostic in diagnostics {
|
||||
checker.report_diagnostic(diagnostic);
|
||||
}
|
||||
checker.report_diagnostics(diagnostics);
|
||||
}
|
||||
|
||||
@@ -139,9 +139,7 @@ pub(crate) fn duplicate_union_member<'a>(checker: &Checker, expr: &'a Expr) {
|
||||
}
|
||||
|
||||
// Add all diagnostics to the checker
|
||||
for diagnostic in diagnostics {
|
||||
checker.report_diagnostic(diagnostic);
|
||||
}
|
||||
checker.report_diagnostics(diagnostics);
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
|
||||
@@ -210,23 +210,23 @@ impl Violation for PytestUnittestAssertion {
|
||||
|
||||
/// Visitor that tracks assert statements and checks if they reference
|
||||
/// the exception name.
|
||||
struct ExceptionHandlerVisitor<'a, 'b> {
|
||||
struct ExceptionHandlerVisitor<'a> {
|
||||
exception_name: &'a str,
|
||||
current_assert: Option<&'a Stmt>,
|
||||
checker: &'a Checker<'b>,
|
||||
errors: Vec<Diagnostic>,
|
||||
}
|
||||
|
||||
impl<'a, 'b> ExceptionHandlerVisitor<'a, 'b> {
|
||||
const fn new(checker: &'a Checker<'b>, exception_name: &'a str) -> Self {
|
||||
impl<'a> ExceptionHandlerVisitor<'a> {
|
||||
const fn new(exception_name: &'a str) -> Self {
|
||||
Self {
|
||||
exception_name,
|
||||
current_assert: None,
|
||||
checker,
|
||||
errors: Vec::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Visitor<'a> for ExceptionHandlerVisitor<'a, '_> {
|
||||
impl<'a> Visitor<'a> for ExceptionHandlerVisitor<'a> {
|
||||
fn visit_stmt(&mut self, stmt: &'a Stmt) {
|
||||
match stmt {
|
||||
Stmt::Assert(_) => {
|
||||
@@ -243,7 +243,7 @@ impl<'a> Visitor<'a> for ExceptionHandlerVisitor<'a, '_> {
|
||||
Expr::Name(ast::ExprName { id, .. }) => {
|
||||
if let Some(current_assert) = self.current_assert {
|
||||
if id.as_str() == self.exception_name {
|
||||
self.checker.report_diagnostic(Diagnostic::new(
|
||||
self.errors.push(Diagnostic::new(
|
||||
PytestAssertInExcept {
|
||||
name: id.to_string(),
|
||||
},
|
||||
@@ -257,12 +257,13 @@ impl<'a> Visitor<'a> for ExceptionHandlerVisitor<'a, '_> {
|
||||
}
|
||||
}
|
||||
|
||||
fn check_assert_in_except(checker: &Checker, name: &str, body: &[Stmt]) {
|
||||
fn check_assert_in_except(name: &str, body: &[Stmt]) -> Vec<Diagnostic> {
|
||||
// Walk body to find assert statements that reference the exception name
|
||||
let mut visitor = ExceptionHandlerVisitor::new(checker, name);
|
||||
let mut visitor = ExceptionHandlerVisitor::new(name);
|
||||
for stmt in body {
|
||||
visitor.visit_stmt(stmt);
|
||||
}
|
||||
visitor.errors
|
||||
}
|
||||
|
||||
/// PT009
|
||||
@@ -595,13 +596,15 @@ pub(crate) fn assert_falsy(checker: &Checker, stmt: &Stmt, test: &Expr) {
|
||||
|
||||
/// PT017
|
||||
pub(crate) fn assert_in_exception_handler(checker: &Checker, handlers: &[ExceptHandler]) {
|
||||
for handler in handlers {
|
||||
let ExceptHandler::ExceptHandler(ast::ExceptHandlerExceptHandler { name, body, .. }) =
|
||||
handler;
|
||||
if let Some(name) = name {
|
||||
check_assert_in_except(checker, name, body);
|
||||
checker.report_diagnostics(handlers.iter().flat_map(|handler| match handler {
|
||||
ExceptHandler::ExceptHandler(ast::ExceptHandlerExceptHandler { name, body, .. }) => {
|
||||
if let Some(name) = name {
|
||||
check_assert_in_except(name, body)
|
||||
} else {
|
||||
Vec::new()
|
||||
}
|
||||
}
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
|
||||
@@ -9,6 +9,7 @@ use ruff_text_size::{Ranged, TextRange, TextSize};
|
||||
use crate::Locator;
|
||||
use crate::checkers::ast::Checker;
|
||||
use crate::rules::flake8_quotes;
|
||||
use crate::settings::LinterSettings;
|
||||
|
||||
/// ## What it does
|
||||
/// Checks for strings that include escaped quotes, and suggests changing
|
||||
@@ -60,7 +61,11 @@ pub(crate) fn avoidable_escaped_quote(checker: &Checker, string_like: StringLike
|
||||
return;
|
||||
}
|
||||
|
||||
let mut rule_checker = AvoidableEscapedQuoteChecker::new(checker, checker.target_version());
|
||||
let mut rule_checker = AvoidableEscapedQuoteChecker::new(
|
||||
checker.locator(),
|
||||
checker.settings,
|
||||
checker.target_version(),
|
||||
);
|
||||
|
||||
for part in string_like.parts() {
|
||||
match part {
|
||||
@@ -73,45 +78,59 @@ pub(crate) fn avoidable_escaped_quote(checker: &Checker, string_like: StringLike
|
||||
ast::StringLikePart::FString(f_string) => rule_checker.visit_f_string(f_string),
|
||||
}
|
||||
}
|
||||
|
||||
checker.report_diagnostics(rule_checker.into_diagnostics());
|
||||
}
|
||||
|
||||
/// Checks for `Q003` violations using the [`Visitor`] implementation.
|
||||
struct AvoidableEscapedQuoteChecker<'a, 'b> {
|
||||
checker: &'a Checker<'b>,
|
||||
#[derive(Debug)]
|
||||
struct AvoidableEscapedQuoteChecker<'a> {
|
||||
locator: &'a Locator<'a>,
|
||||
quotes_settings: &'a flake8_quotes::settings::Settings,
|
||||
supports_pep701: bool,
|
||||
diagnostics: Vec<Diagnostic>,
|
||||
}
|
||||
|
||||
impl<'a, 'b> AvoidableEscapedQuoteChecker<'a, 'b> {
|
||||
fn new(checker: &'a Checker<'b>, target_version: PythonVersion) -> Self {
|
||||
impl<'a> AvoidableEscapedQuoteChecker<'a> {
|
||||
fn new(
|
||||
locator: &'a Locator<'a>,
|
||||
settings: &'a LinterSettings,
|
||||
target_version: PythonVersion,
|
||||
) -> Self {
|
||||
Self {
|
||||
checker,
|
||||
quotes_settings: &checker.settings.flake8_quotes,
|
||||
locator,
|
||||
quotes_settings: &settings.flake8_quotes,
|
||||
supports_pep701: target_version.supports_pep_701(),
|
||||
diagnostics: vec![],
|
||||
}
|
||||
}
|
||||
|
||||
/// Consumes the checker and returns a vector of [`Diagnostic`] found during the visit.
|
||||
fn into_diagnostics(self) -> Vec<Diagnostic> {
|
||||
self.diagnostics
|
||||
}
|
||||
}
|
||||
|
||||
impl Visitor<'_> for AvoidableEscapedQuoteChecker<'_, '_> {
|
||||
fn visit_string_literal(&mut self, string_literal: &ast::StringLiteral) {
|
||||
impl Visitor<'_> for AvoidableEscapedQuoteChecker<'_> {
|
||||
fn visit_string_literal(&mut self, string_literal: &'_ ast::StringLiteral) {
|
||||
if let Some(diagnostic) = check_string_or_bytes(
|
||||
self.checker.locator(),
|
||||
self.locator,
|
||||
self.quotes_settings,
|
||||
string_literal.range(),
|
||||
AnyStringFlags::from(string_literal.flags),
|
||||
) {
|
||||
self.checker.report_diagnostic(diagnostic);
|
||||
self.diagnostics.push(diagnostic);
|
||||
}
|
||||
}
|
||||
|
||||
fn visit_bytes_literal(&mut self, bytes_literal: &ast::BytesLiteral) {
|
||||
fn visit_bytes_literal(&mut self, bytes_literal: &'_ ast::BytesLiteral) {
|
||||
if let Some(diagnostic) = check_string_or_bytes(
|
||||
self.checker.locator(),
|
||||
self.locator,
|
||||
self.quotes_settings,
|
||||
bytes_literal.range(),
|
||||
AnyStringFlags::from(bytes_literal.flags),
|
||||
) {
|
||||
self.checker.report_diagnostic(diagnostic);
|
||||
self.diagnostics.push(diagnostic);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,10 +203,8 @@ impl Visitor<'_> for AvoidableEscapedQuoteChecker<'_, '_> {
|
||||
.literals()
|
||||
.any(|literal| contains_quote(literal, opposite_quote_char))
|
||||
{
|
||||
if let Some(diagnostic) =
|
||||
check_f_string(self.checker.locator(), self.quotes_settings, f_string)
|
||||
{
|
||||
self.checker.report_diagnostic(diagnostic);
|
||||
if let Some(diagnostic) = check_f_string(self.locator, self.quotes_settings, f_string) {
|
||||
self.diagnostics.push(diagnostic);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -59,7 +59,6 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test_case(Rule::IfElseBlockInsteadOfIfExp, Path::new("SIM108.py"))]
|
||||
#[test_case(Rule::MultipleWithStatements, Path::new("SIM117.py"))]
|
||||
fn preview_rules(rule_code: Rule, path: &Path) -> Result<()> {
|
||||
let snapshot = format!(
|
||||
"preview__{}_{}",
|
||||
|
||||
@@ -8,10 +8,10 @@ use ruff_python_ast::{self as ast, Stmt, WithItem};
|
||||
use ruff_python_trivia::{SimpleTokenKind, SimpleTokenizer};
|
||||
use ruff_text_size::{Ranged, TextRange};
|
||||
|
||||
use super::fix_with;
|
||||
use crate::checkers::ast::Checker;
|
||||
use crate::fix::edits::fits;
|
||||
use crate::preview::multiple_with_statements_fix_safe_enabled;
|
||||
|
||||
use super::fix_with;
|
||||
|
||||
/// ## What it does
|
||||
/// Checks for the unnecessary nesting of multiple consecutive context
|
||||
@@ -45,15 +45,8 @@ use crate::preview::multiple_with_statements_fix_safe_enabled;
|
||||
/// pass
|
||||
/// ```
|
||||
///
|
||||
/// # Fix safety
|
||||
///
|
||||
/// This fix is marked as always unsafe unless [preview] mode is enabled, in which case it is always
|
||||
/// marked as safe. Note that the fix is unavailable if it would remove comments (in either case).
|
||||
///
|
||||
/// ## References
|
||||
/// - [Python documentation: The `with` statement](https://docs.python.org/3/reference/compound_stmts.html#the-with-statement)
|
||||
///
|
||||
/// [preview]: https://docs.astral.sh/ruff/preview/
|
||||
#[derive(ViolationMetadata)]
|
||||
pub(crate) struct MultipleWithStatements;
|
||||
|
||||
@@ -195,11 +188,7 @@ pub(crate) fn multiple_with_statements(
|
||||
checker.settings.tab_size,
|
||||
)
|
||||
}) {
|
||||
if multiple_with_statements_fix_safe_enabled(checker.settings) {
|
||||
Ok(Some(Fix::safe_edit(edit)))
|
||||
} else {
|
||||
Ok(Some(Fix::unsafe_edit(edit)))
|
||||
}
|
||||
Ok(Some(Fix::unsafe_edit(edit)))
|
||||
} else {
|
||||
Ok(None)
|
||||
}
|
||||
|
||||
@@ -34,10 +34,6 @@ use crate::line_width::LineWidthBuilder;
|
||||
/// return any(predicate(item) for item in iterable)
|
||||
/// ```
|
||||
///
|
||||
/// # Fix safety
|
||||
///
|
||||
/// This fix is always marked as unsafe because it might remove comments.
|
||||
///
|
||||
/// ## References
|
||||
/// - [Python documentation: `any`](https://docs.python.org/3/library/functions.html#any)
|
||||
/// - [Python documentation: `all`](https://docs.python.org/3/library/functions.html#all)
|
||||
|
||||
@@ -1,339 +0,0 @@
|
||||
---
|
||||
source: crates/ruff_linter/src/rules/flake8_simplify/mod.rs
|
||||
---
|
||||
SIM117.py:2:1: SIM117 [*] Use a single `with` statement with multiple contexts instead of nested `with` statements
|
||||
|
|
||||
1 | # SIM117
|
||||
2 | / with A() as a:
|
||||
3 | | with B() as b:
|
||||
| |__________________^ SIM117
|
||||
4 | print("hello")
|
||||
|
|
||||
= help: Combine `with` statements
|
||||
|
||||
ℹ Safe fix
|
||||
1 1 | # SIM117
|
||||
2 |-with A() as a:
|
||||
3 |- with B() as b:
|
||||
4 |- print("hello")
|
||||
2 |+with A() as a, B() as b:
|
||||
3 |+ print("hello")
|
||||
5 4 |
|
||||
6 5 | # SIM117
|
||||
7 6 | with A():
|
||||
|
||||
SIM117.py:7:1: SIM117 [*] Use a single `with` statement with multiple contexts instead of nested `with` statements
|
||||
|
|
||||
6 | # SIM117
|
||||
7 | / with A():
|
||||
8 | | with B():
|
||||
| |_____________^ SIM117
|
||||
9 | with C():
|
||||
10 | print("hello")
|
||||
|
|
||||
= help: Combine `with` statements
|
||||
|
||||
ℹ Safe fix
|
||||
4 4 | print("hello")
|
||||
5 5 |
|
||||
6 6 | # SIM117
|
||||
7 |-with A():
|
||||
8 |- with B():
|
||||
9 |- with C():
|
||||
10 |- print("hello")
|
||||
7 |+with A(), B():
|
||||
8 |+ with C():
|
||||
9 |+ print("hello")
|
||||
11 10 |
|
||||
12 11 | # SIM117
|
||||
13 12 | with A() as a:
|
||||
|
||||
SIM117.py:13:1: SIM117 Use a single `with` statement with multiple contexts instead of nested `with` statements
|
||||
|
|
||||
12 | # SIM117
|
||||
13 | / with A() as a:
|
||||
14 | | # Unfixable due to placement of this comment.
|
||||
15 | | with B() as b:
|
||||
| |__________________^ SIM117
|
||||
16 | print("hello")
|
||||
|
|
||||
= help: Combine `with` statements
|
||||
|
||||
SIM117.py:19:1: SIM117 [*] Use a single `with` statement with multiple contexts instead of nested `with` statements
|
||||
|
|
||||
18 | # SIM117
|
||||
19 | / with A() as a:
|
||||
20 | | with B() as b:
|
||||
| |__________________^ SIM117
|
||||
21 | # Fixable due to placement of this comment.
|
||||
22 | print("hello")
|
||||
|
|
||||
= help: Combine `with` statements
|
||||
|
||||
ℹ Safe fix
|
||||
16 16 | print("hello")
|
||||
17 17 |
|
||||
18 18 | # SIM117
|
||||
19 |-with A() as a:
|
||||
20 |- with B() as b:
|
||||
21 |- # Fixable due to placement of this comment.
|
||||
22 |- print("hello")
|
||||
19 |+with A() as a, B() as b:
|
||||
20 |+ # Fixable due to placement of this comment.
|
||||
21 |+ print("hello")
|
||||
23 22 |
|
||||
24 23 | # OK
|
||||
25 24 | with A() as a:
|
||||
|
||||
SIM117.py:47:1: SIM117 [*] Use a single `with` statement with multiple contexts instead of nested `with` statements
|
||||
|
|
||||
46 | # SIM117
|
||||
47 | / async with A() as a:
|
||||
48 | | async with B() as b:
|
||||
| |________________________^ SIM117
|
||||
49 | print("hello")
|
||||
|
|
||||
= help: Combine `with` statements
|
||||
|
||||
ℹ Safe fix
|
||||
44 44 | print("hello")
|
||||
45 45 |
|
||||
46 46 | # SIM117
|
||||
47 |-async with A() as a:
|
||||
48 |- async with B() as b:
|
||||
49 |- print("hello")
|
||||
47 |+async with A() as a, B() as b:
|
||||
48 |+ print("hello")
|
||||
50 49 |
|
||||
51 50 | while True:
|
||||
52 51 | # SIM117
|
||||
|
||||
SIM117.py:53:5: SIM117 [*] Use a single `with` statement with multiple contexts instead of nested `with` statements
|
||||
|
|
||||
51 | while True:
|
||||
52 | # SIM117
|
||||
53 | / with A() as a:
|
||||
54 | | with B() as b:
|
||||
| |______________________^ SIM117
|
||||
55 | """this
|
||||
56 | is valid"""
|
||||
|
|
||||
= help: Combine `with` statements
|
||||
|
||||
ℹ Safe fix
|
||||
50 50 |
|
||||
51 51 | while True:
|
||||
52 52 | # SIM117
|
||||
53 |- with A() as a:
|
||||
54 |- with B() as b:
|
||||
55 |- """this
|
||||
53 |+ with A() as a, B() as b:
|
||||
54 |+ """this
|
||||
56 55 | is valid"""
|
||||
57 56 |
|
||||
58 |- """the indentation on
|
||||
57 |+ """the indentation on
|
||||
59 58 | this line is significant"""
|
||||
60 59 |
|
||||
61 |- "this is" \
|
||||
60 |+ "this is" \
|
||||
62 61 | "allowed too"
|
||||
63 62 |
|
||||
64 |- ("so is"
|
||||
63 |+ ("so is"
|
||||
65 64 | "this for some reason")
|
||||
66 65 |
|
||||
67 66 | # SIM117
|
||||
|
||||
SIM117.py:68:1: SIM117 [*] Use a single `with` statement with multiple contexts instead of nested `with` statements
|
||||
|
|
||||
67 | # SIM117
|
||||
68 | / with (
|
||||
69 | | A() as a,
|
||||
70 | | B() as b,
|
||||
71 | | ):
|
||||
72 | | with C() as c:
|
||||
| |__________________^ SIM117
|
||||
73 | print("hello")
|
||||
|
|
||||
= help: Combine `with` statements
|
||||
|
||||
ℹ Safe fix
|
||||
67 67 | # SIM117
|
||||
68 68 | with (
|
||||
69 69 | A() as a,
|
||||
70 |- B() as b,
|
||||
70 |+ B() as b,C() as c
|
||||
71 71 | ):
|
||||
72 |- with C() as c:
|
||||
73 |- print("hello")
|
||||
72 |+ print("hello")
|
||||
74 73 |
|
||||
75 74 | # SIM117
|
||||
76 75 | with A() as a:
|
||||
|
||||
SIM117.py:76:1: SIM117 [*] Use a single `with` statement with multiple contexts instead of nested `with` statements
|
||||
|
|
||||
75 | # SIM117
|
||||
76 | / with A() as a:
|
||||
77 | | with (
|
||||
78 | | B() as b,
|
||||
79 | | C() as c,
|
||||
80 | | ):
|
||||
| |______^ SIM117
|
||||
81 | print("hello")
|
||||
|
|
||||
= help: Combine `with` statements
|
||||
|
||||
ℹ Safe fix
|
||||
73 73 | print("hello")
|
||||
74 74 |
|
||||
75 75 | # SIM117
|
||||
76 |-with A() as a:
|
||||
77 |- with (
|
||||
78 |- B() as b,
|
||||
79 |- C() as c,
|
||||
80 |- ):
|
||||
81 |- print("hello")
|
||||
76 |+with (
|
||||
77 |+ A() as a, B() as b,
|
||||
78 |+ C() as c,
|
||||
79 |+):
|
||||
80 |+ print("hello")
|
||||
82 81 |
|
||||
83 82 | # SIM117
|
||||
84 83 | with (
|
||||
|
||||
SIM117.py:84:1: SIM117 [*] Use a single `with` statement with multiple contexts instead of nested `with` statements
|
||||
|
|
||||
83 | # SIM117
|
||||
84 | / with (
|
||||
85 | | A() as a,
|
||||
86 | | B() as b,
|
||||
87 | | ):
|
||||
88 | | with (
|
||||
89 | | C() as c,
|
||||
90 | | D() as d,
|
||||
91 | | ):
|
||||
| |______^ SIM117
|
||||
92 | print("hello")
|
||||
|
|
||||
= help: Combine `with` statements
|
||||
|
||||
ℹ Safe fix
|
||||
83 83 | # SIM117
|
||||
84 84 | with (
|
||||
85 85 | A() as a,
|
||||
86 |- B() as b,
|
||||
86 |+ B() as b,C() as c,
|
||||
87 |+ D() as d,
|
||||
87 88 | ):
|
||||
88 |- with (
|
||||
89 |- C() as c,
|
||||
90 |- D() as d,
|
||||
91 |- ):
|
||||
92 |- print("hello")
|
||||
89 |+ print("hello")
|
||||
93 90 |
|
||||
94 91 | # SIM117 (auto-fixable)
|
||||
95 92 | with A("01ß9💣2ℝ8901ß9💣2ℝ8901ß9💣2ℝ89") as a:
|
||||
|
||||
SIM117.py:95:1: SIM117 [*] Use a single `with` statement with multiple contexts instead of nested `with` statements
|
||||
|
|
||||
94 | # SIM117 (auto-fixable)
|
||||
95 | / with A("01ß9💣2ℝ8901ß9💣2ℝ8901ß9💣2ℝ89") as a:
|
||||
96 | | with B("01ß9💣2ℝ8901ß9💣2ℝ8901ß9💣2ℝ89") as b:
|
||||
| |__________________________________________________^ SIM117
|
||||
97 | print("hello")
|
||||
|
|
||||
= help: Combine `with` statements
|
||||
|
||||
ℹ Safe fix
|
||||
92 92 | print("hello")
|
||||
93 93 |
|
||||
94 94 | # SIM117 (auto-fixable)
|
||||
95 |-with A("01ß9💣2ℝ8901ß9💣2ℝ8901ß9💣2ℝ89") as a:
|
||||
96 |- with B("01ß9💣2ℝ8901ß9💣2ℝ8901ß9💣2ℝ89") as b:
|
||||
97 |- print("hello")
|
||||
95 |+with A("01ß9💣2ℝ8901ß9💣2ℝ8901ß9💣2ℝ89") as a, B("01ß9💣2ℝ8901ß9💣2ℝ8901ß9💣2ℝ89") as b:
|
||||
96 |+ print("hello")
|
||||
98 97 |
|
||||
99 98 | # SIM117 (not auto-fixable too long)
|
||||
100 99 | with A("01ß9💣2ℝ8901ß9💣2ℝ8901ß9💣2ℝ890") as a:
|
||||
|
||||
SIM117.py:100:1: SIM117 Use a single `with` statement with multiple contexts instead of nested `with` statements
|
||||
|
|
||||
99 | # SIM117 (not auto-fixable too long)
|
||||
100 | / with A("01ß9💣2ℝ8901ß9💣2ℝ8901ß9💣2ℝ890") as a:
|
||||
101 | | with B("01ß9💣2ℝ8901ß9💣2ℝ8901ß9💣2ℝ89") as b:
|
||||
| |__________________________________________________^ SIM117
|
||||
102 | print("hello")
|
||||
|
|
||||
= help: Combine `with` statements
|
||||
|
||||
SIM117.py:106:5: SIM117 Use a single `with` statement with multiple contexts instead of nested `with` statements
|
||||
|
|
||||
104 | # From issue #3025.
|
||||
105 | async def main():
|
||||
106 | / async with A() as a: # SIM117.
|
||||
107 | | async with B() as b:
|
||||
| |____________________________^ SIM117
|
||||
108 | print("async-inside!")
|
||||
|
|
||||
= help: Combine `with` statements
|
||||
|
||||
SIM117.py:126:1: SIM117 [*] Use a single `with` statement with multiple contexts instead of nested `with` statements
|
||||
|
|
||||
125 | # SIM117
|
||||
126 | / with A() as a:
|
||||
127 | | with B() as b:
|
||||
| |__________________^ SIM117
|
||||
128 | type ListOrSet[T] = list[T] | set[T]
|
||||
|
|
||||
= help: Combine `with` statements
|
||||
|
||||
ℹ Safe fix
|
||||
123 123 | f(b2, c2, d2)
|
||||
124 124 |
|
||||
125 125 | # SIM117
|
||||
126 |-with A() as a:
|
||||
127 |- with B() as b:
|
||||
128 |- type ListOrSet[T] = list[T] | set[T]
|
||||
126 |+with A() as a, B() as b:
|
||||
127 |+ type ListOrSet[T] = list[T] | set[T]
|
||||
129 128 |
|
||||
130 |- class ClassA[T: str]:
|
||||
131 |- def method1(self) -> T:
|
||||
132 |- ...
|
||||
129 |+ class ClassA[T: str]:
|
||||
130 |+ def method1(self) -> T:
|
||||
131 |+ ...
|
||||
133 132 |
|
||||
134 |- f" something { my_dict["key"] } something else "
|
||||
133 |+ f" something { my_dict["key"] } something else "
|
||||
135 134 |
|
||||
136 |- f"foo {f"bar {x}"} baz"
|
||||
135 |+ f"foo {f"bar {x}"} baz"
|
||||
137 136 |
|
||||
138 137 | # Allow cascading for some statements.
|
||||
139 138 | import anyio
|
||||
|
||||
SIM117.py:163:1: SIM117 [*] Use a single `with` statement with multiple contexts instead of nested `with` statements
|
||||
|
|
||||
162 | # Do not suppress combination, if a context manager is already combined with another.
|
||||
163 | / async with asyncio.timeout(1), A():
|
||||
164 | | async with B():
|
||||
| |___________________^ SIM117
|
||||
165 | pass
|
||||
|
|
||||
= help: Combine `with` statements
|
||||
|
||||
ℹ Safe fix
|
||||
160 160 | pass
|
||||
161 161 |
|
||||
162 162 | # Do not suppress combination, if a context manager is already combined with another.
|
||||
163 |-async with asyncio.timeout(1), A():
|
||||
164 |- async with B():
|
||||
165 |- pass
|
||||
163 |+async with asyncio.timeout(1), A(), B():
|
||||
164 |+ pass
|
||||
@@ -142,26 +142,26 @@ impl AlwaysFixableViolation for QuotedTypeAlias {
|
||||
}
|
||||
|
||||
/// TC007
|
||||
pub(crate) fn unquoted_type_alias(checker: &Checker, binding: &Binding) {
|
||||
pub(crate) fn unquoted_type_alias(checker: &Checker, binding: &Binding) -> Option<Vec<Diagnostic>> {
|
||||
if binding.context.is_typing() {
|
||||
return;
|
||||
return None;
|
||||
}
|
||||
|
||||
if !binding.is_annotated_type_alias() {
|
||||
return;
|
||||
return None;
|
||||
}
|
||||
|
||||
let Some(Stmt::AnnAssign(ast::StmtAnnAssign {
|
||||
value: Some(expr), ..
|
||||
})) = binding.statement(checker.semantic())
|
||||
else {
|
||||
return;
|
||||
return None;
|
||||
};
|
||||
|
||||
let mut names = Vec::new();
|
||||
collect_typing_references(checker, expr, &mut names);
|
||||
if names.is_empty() {
|
||||
return;
|
||||
return None;
|
||||
}
|
||||
|
||||
// We generate a diagnostic for every name that needs to be quoted
|
||||
@@ -178,13 +178,14 @@ pub(crate) fn unquoted_type_alias(checker: &Checker, binding: &Binding) {
|
||||
checker.locator(),
|
||||
checker.default_string_flags(),
|
||||
);
|
||||
let mut diagnostics = Vec::with_capacity(names.len());
|
||||
for name in names {
|
||||
checker.report_diagnostic(
|
||||
Diagnostic::new(UnquotedTypeAlias, name.range())
|
||||
.with_parent(parent)
|
||||
.with_fix(Fix::unsafe_edit(edit.clone())),
|
||||
);
|
||||
let mut diagnostic = Diagnostic::new(UnquotedTypeAlias, name.range());
|
||||
diagnostic.set_parent(parent);
|
||||
diagnostic.set_fix(Fix::unsafe_edit(edit.clone()));
|
||||
diagnostics.push(diagnostic);
|
||||
}
|
||||
Some(diagnostics)
|
||||
}
|
||||
|
||||
/// Traverses the type expression and collects `[Expr::Name]` nodes that are
|
||||
|
||||
@@ -304,21 +304,19 @@ fn call<'a>(
|
||||
) {
|
||||
let semantic = checker.semantic();
|
||||
let dummy_variable_rgx = &checker.settings.dummy_variable_rgx;
|
||||
for arg in parameters {
|
||||
let Some(binding) = scope
|
||||
checker.report_diagnostics(parameters.filter_map(|arg| {
|
||||
let binding = scope
|
||||
.get(arg.name())
|
||||
.map(|binding_id| semantic.binding(binding_id))
|
||||
else {
|
||||
continue;
|
||||
};
|
||||
.map(|binding_id| semantic.binding(binding_id))?;
|
||||
if binding.kind.is_argument()
|
||||
&& binding.is_unused()
|
||||
&& !dummy_variable_rgx.is_match(arg.name())
|
||||
{
|
||||
checker
|
||||
.report_diagnostic(argumentable.check_for(arg.name.to_string(), binding.range()));
|
||||
Some(argumentable.check_for(arg.name.to_string(), binding.range()))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
/// Returns `true` if a function appears to be a base class stub. In other
|
||||
|
||||
@@ -431,7 +431,5 @@ pub(crate) fn literal_comparisons(checker: &Checker, compare: &ast::ExprCompare)
|
||||
}
|
||||
}
|
||||
|
||||
for diagnostic in diagnostics {
|
||||
checker.report_diagnostic(diagnostic);
|
||||
}
|
||||
checker.report_diagnostics(diagnostics);
|
||||
}
|
||||
|
||||
@@ -873,6 +873,8 @@ pub(crate) fn check_docstring(
|
||||
section_contexts: &SectionContexts,
|
||||
convention: Option<Convention>,
|
||||
) {
|
||||
let mut diagnostics = Vec::new();
|
||||
|
||||
// Only check function docstrings.
|
||||
let Some(function_def) = definition.as_function_def() else {
|
||||
return;
|
||||
@@ -925,7 +927,7 @@ pub(crate) fn check_docstring(
|
||||
semantic,
|
||||
)
|
||||
{
|
||||
checker.report_diagnostic(Diagnostic::new(
|
||||
diagnostics.push(Diagnostic::new(
|
||||
DocstringMissingReturns,
|
||||
docstring.range(),
|
||||
));
|
||||
@@ -936,10 +938,8 @@ pub(crate) fn check_docstring(
|
||||
.iter()
|
||||
.any(|entry| !entry.is_none_return()) =>
|
||||
{
|
||||
checker.report_diagnostic(Diagnostic::new(
|
||||
DocstringMissingReturns,
|
||||
docstring.range(),
|
||||
));
|
||||
diagnostics
|
||||
.push(Diagnostic::new(DocstringMissingReturns, docstring.range()));
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
@@ -958,16 +958,12 @@ pub(crate) fn check_docstring(
|
||||
|arguments| arguments.first().is_none_or(Expr::is_none_literal_expr),
|
||||
) =>
|
||||
{
|
||||
checker.report_diagnostic(Diagnostic::new(
|
||||
DocstringMissingYields,
|
||||
docstring.range(),
|
||||
));
|
||||
diagnostics
|
||||
.push(Diagnostic::new(DocstringMissingYields, docstring.range()));
|
||||
}
|
||||
None if body_entries.yields.iter().any(|entry| !entry.is_none_yield) => {
|
||||
checker.report_diagnostic(Diagnostic::new(
|
||||
DocstringMissingYields,
|
||||
docstring.range(),
|
||||
));
|
||||
diagnostics
|
||||
.push(Diagnostic::new(DocstringMissingYields, docstring.range()));
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
@@ -1000,7 +996,7 @@ pub(crate) fn check_docstring(
|
||||
},
|
||||
docstring.range(),
|
||||
);
|
||||
checker.report_diagnostic(diagnostic);
|
||||
diagnostics.push(diagnostic);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1015,7 +1011,7 @@ pub(crate) fn check_docstring(
|
||||
|| body_entries.returns.iter().all(ReturnEntry::is_implicit)
|
||||
{
|
||||
let diagnostic = Diagnostic::new(DocstringExtraneousReturns, docstring.range());
|
||||
checker.report_diagnostic(diagnostic);
|
||||
diagnostics.push(diagnostic);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1025,7 +1021,7 @@ pub(crate) fn check_docstring(
|
||||
if docstring_sections.yields.is_some() {
|
||||
if body_entries.yields.is_empty() {
|
||||
let diagnostic = Diagnostic::new(DocstringExtraneousYields, docstring.range());
|
||||
checker.report_diagnostic(diagnostic);
|
||||
diagnostics.push(diagnostic);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1051,9 +1047,11 @@ pub(crate) fn check_docstring(
|
||||
},
|
||||
docstring.range(),
|
||||
);
|
||||
checker.report_diagnostic(diagnostic);
|
||||
diagnostics.push(diagnostic);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
checker.report_diagnostics(diagnostics);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
source: crates/ruff_linter/src/rules/pyflakes/mod.rs
|
||||
snapshot_kind: text
|
||||
---
|
||||
F704.py:6:5: F704 `yield` statement outside of a function
|
||||
|
|
||||
@@ -30,6 +31,4 @@ F704.py:11:1: F704 `await` statement outside of a function
|
||||
10 | yield from 3
|
||||
11 | await f()
|
||||
| ^^^^^^^^^ F704
|
||||
12 |
|
||||
13 | def _():
|
||||
|
|
||||
|
||||
@@ -158,9 +158,7 @@ pub(crate) fn boolean_chained_comparison(checker: &Checker, expr_bool_op: &ExprB
|
||||
Some(diagnostic)
|
||||
});
|
||||
|
||||
for diagnostic in diagnostics {
|
||||
checker.report_diagnostic(diagnostic);
|
||||
}
|
||||
checker.report_diagnostics(diagnostics);
|
||||
}
|
||||
|
||||
/// Checks whether two compare expressions are simplifiable
|
||||
|
||||
@@ -31,9 +31,8 @@ use crate::checkers::ast::Checker;
|
||||
///
|
||||
///
|
||||
/// def foo():
|
||||
/// var = 10
|
||||
/// print(var)
|
||||
/// return var
|
||||
/// return 10
|
||||
///
|
||||
///
|
||||
/// var = foo()
|
||||
|
||||
@@ -379,13 +379,15 @@ pub(crate) fn redefined_loop_name(checker: &Checker, stmt: &Stmt) {
|
||||
_ => panic!("redefined_loop_name called on Statement that is not a `With` or `For`"),
|
||||
};
|
||||
|
||||
let mut diagnostics = Vec::new();
|
||||
|
||||
for outer_assignment_target in &outer_assignment_targets {
|
||||
for inner_assignment_target in &inner_assignment_targets {
|
||||
// Compare the targets structurally.
|
||||
if ComparableExpr::from(outer_assignment_target.expr)
|
||||
.eq(&(ComparableExpr::from(inner_assignment_target.expr)))
|
||||
{
|
||||
checker.report_diagnostic(Diagnostic::new(
|
||||
diagnostics.push(Diagnostic::new(
|
||||
RedefinedLoopName {
|
||||
name: checker.generator().expr(outer_assignment_target.expr),
|
||||
outer_kind: outer_assignment_target.binding_kind,
|
||||
@@ -396,4 +398,6 @@ pub(crate) fn redefined_loop_name(checker: &Checker, stmt: &Stmt) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
checker.report_diagnostics(diagnostics);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use std::hash::Hash;
|
||||
|
||||
use ruff_python_semantic::analyze::class::iter_super_class;
|
||||
use ruff_python_semantic::{SemanticModel, analyze::class::iter_super_class};
|
||||
use rustc_hash::FxHashSet;
|
||||
|
||||
use ruff_diagnostics::{Diagnostic, Violation};
|
||||
@@ -66,9 +66,11 @@ pub(crate) fn redefined_slots_in_subclass(checker: &Checker, class_def: &ast::St
|
||||
return;
|
||||
}
|
||||
|
||||
for slot in class_slots {
|
||||
check_super_slots(checker, class_def, &slot);
|
||||
}
|
||||
let semantic = checker.semantic();
|
||||
let diagnostics = class_slots
|
||||
.iter()
|
||||
.filter_map(|slot| check_super_slots(class_def, semantic, slot));
|
||||
checker.report_diagnostics(diagnostics);
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
@@ -101,18 +103,25 @@ impl Ranged for Slot<'_> {
|
||||
}
|
||||
}
|
||||
|
||||
fn check_super_slots(checker: &Checker, class_def: &ast::StmtClassDef, slot: &Slot) {
|
||||
for super_class in iter_super_class(class_def, checker.semantic()).skip(1) {
|
||||
if slots_members(&super_class.body).contains(slot) {
|
||||
checker.report_diagnostic(Diagnostic::new(
|
||||
RedefinedSlotsInSubclass {
|
||||
base: super_class.name.to_string(),
|
||||
slot_name: slot.name.to_string(),
|
||||
},
|
||||
slot.range(),
|
||||
));
|
||||
}
|
||||
}
|
||||
fn check_super_slots(
|
||||
class_def: &ast::StmtClassDef,
|
||||
semantic: &SemanticModel,
|
||||
slot: &Slot,
|
||||
) -> Option<Diagnostic> {
|
||||
iter_super_class(class_def, semantic)
|
||||
.skip(1)
|
||||
.find_map(&|super_class: &ast::StmtClassDef| {
|
||||
if slots_members(&super_class.body).contains(slot) {
|
||||
return Some(Diagnostic::new(
|
||||
RedefinedSlotsInSubclass {
|
||||
base: super_class.name.to_string(),
|
||||
slot_name: slot.name.to_string(),
|
||||
},
|
||||
slot.range(),
|
||||
));
|
||||
}
|
||||
None
|
||||
})
|
||||
}
|
||||
|
||||
fn slots_members(body: &[Stmt]) -> FxHashSet<Slot> {
|
||||
|
||||
@@ -43,6 +43,7 @@ pub(crate) fn self_assignment(checker: &Checker, assign: &ast::StmtAssign) {
|
||||
if checker.semantic().current_scope().kind.is_class() {
|
||||
return;
|
||||
}
|
||||
let mut diagnostics = Vec::new();
|
||||
|
||||
for (left, right) in assign
|
||||
.targets
|
||||
@@ -50,8 +51,9 @@ pub(crate) fn self_assignment(checker: &Checker, assign: &ast::StmtAssign) {
|
||||
.chain(std::iter::once(assign.value.as_ref()))
|
||||
.tuple_combinations()
|
||||
{
|
||||
visit_assignments(checker, left, right);
|
||||
visit_assignments(left, right, &mut diagnostics);
|
||||
}
|
||||
checker.report_diagnostics(diagnostics);
|
||||
}
|
||||
|
||||
/// PLW0127
|
||||
@@ -65,21 +67,23 @@ pub(crate) fn self_annotated_assignment(checker: &Checker, assign: &ast::StmtAnn
|
||||
if checker.semantic().current_scope().kind.is_class() {
|
||||
return;
|
||||
}
|
||||
let mut diagnostics = Vec::new();
|
||||
|
||||
visit_assignments(checker, &assign.target, value);
|
||||
visit_assignments(&assign.target, value, &mut diagnostics);
|
||||
checker.report_diagnostics(diagnostics);
|
||||
}
|
||||
|
||||
fn visit_assignments(checker: &Checker, left: &Expr, right: &Expr) {
|
||||
fn visit_assignments(left: &Expr, right: &Expr, diagnostics: &mut Vec<Diagnostic>) {
|
||||
match (left, right) {
|
||||
(Expr::Tuple(lhs), Expr::Tuple(rhs)) if lhs.len() == rhs.len() => lhs
|
||||
.iter()
|
||||
.zip(rhs)
|
||||
.for_each(|(lhs_elem, rhs_elem)| visit_assignments(checker, lhs_elem, rhs_elem)),
|
||||
.for_each(|(lhs_elem, rhs_elem)| visit_assignments(lhs_elem, rhs_elem, diagnostics)),
|
||||
(
|
||||
Expr::Name(ast::ExprName { id: lhs_name, .. }),
|
||||
Expr::Name(ast::ExprName { id: rhs_name, .. }),
|
||||
) if lhs_name == rhs_name => {
|
||||
checker.report_diagnostic(Diagnostic::new(
|
||||
diagnostics.push(Diagnostic::new(
|
||||
SelfAssigningVariable {
|
||||
name: lhs_name.to_string(),
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use itertools::Itertools;
|
||||
use ruff_python_ast::{Alias, Stmt};
|
||||
|
||||
use ruff_diagnostics::{AlwaysFixableViolation, Applicability, Diagnostic, Fix};
|
||||
use ruff_diagnostics::{AlwaysFixableViolation, Diagnostic, Fix};
|
||||
use ruff_macros::{ViolationMetadata, derive_message_formats};
|
||||
use ruff_text_size::Ranged;
|
||||
|
||||
@@ -123,19 +123,9 @@ pub(crate) fn unnecessary_future_import(checker: &Checker, stmt: &Stmt, names: &
|
||||
checker.stylist(),
|
||||
checker.indexer(),
|
||||
)?;
|
||||
|
||||
let range = edit.range();
|
||||
let applicability = if checker.comment_ranges().intersects(range) {
|
||||
Applicability::Unsafe
|
||||
} else {
|
||||
Applicability::Safe
|
||||
};
|
||||
|
||||
Ok(
|
||||
Fix::applicable_edit(edit, applicability).isolate(Checker::isolation(
|
||||
checker.semantic().current_statement_parent_id(),
|
||||
)),
|
||||
)
|
||||
Ok(Fix::safe_edit(edit).isolate(Checker::isolation(
|
||||
checker.semantic().current_statement_parent_id(),
|
||||
)))
|
||||
});
|
||||
checker.report_diagnostic(diagnostic);
|
||||
}
|
||||
|
||||
@@ -156,7 +156,6 @@ UP010.py:13:5: UP010 [*] Unnecessary `__future__` import `generator_stop` for ta
|
||||
13 | from __future__ import generator_stop
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP010
|
||||
14 | from __future__ import invalid_module, generators
|
||||
15 | from __future__ import generators # comment
|
||||
|
|
||||
= help: Remove unnecessary `__future__` import
|
||||
|
||||
@@ -166,7 +165,6 @@ UP010.py:13:5: UP010 [*] Unnecessary `__future__` import `generator_stop` for ta
|
||||
12 12 | if True:
|
||||
13 |- from __future__ import generator_stop
|
||||
14 13 | from __future__ import invalid_module, generators
|
||||
15 14 | from __future__ import generators # comment
|
||||
|
||||
UP010.py:14:5: UP010 [*] Unnecessary `__future__` import `generators` for target Python version
|
||||
|
|
||||
@@ -174,7 +172,6 @@ UP010.py:14:5: UP010 [*] Unnecessary `__future__` import `generators` for target
|
||||
13 | from __future__ import generator_stop
|
||||
14 | from __future__ import invalid_module, generators
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP010
|
||||
15 | from __future__ import generators # comment
|
||||
|
|
||||
= help: Remove unnecessary `__future__` import
|
||||
|
||||
@@ -184,19 +181,3 @@ UP010.py:14:5: UP010 [*] Unnecessary `__future__` import `generators` for target
|
||||
13 13 | from __future__ import generator_stop
|
||||
14 |- from __future__ import invalid_module, generators
|
||||
14 |+ from __future__ import invalid_module
|
||||
15 15 | from __future__ import generators # comment
|
||||
|
||||
UP010.py:15:5: UP010 [*] Unnecessary `__future__` import `generators` for target Python version
|
||||
|
|
||||
13 | from __future__ import generator_stop
|
||||
14 | from __future__ import invalid_module, generators
|
||||
15 | from __future__ import generators # comment
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP010
|
||||
|
|
||||
= help: Remove unnecessary `__future__` import
|
||||
|
||||
ℹ Unsafe fix
|
||||
12 12 | if True:
|
||||
13 13 | from __future__ import generator_stop
|
||||
14 14 | from __future__ import invalid_module, generators
|
||||
15 |- from __future__ import generators # comment
|
||||
|
||||
@@ -64,26 +64,49 @@ pub(crate) fn read_whole_file(checker: &Checker, with: &ast::StmtWith) {
|
||||
}
|
||||
|
||||
// Then we need to match each `open` operation with exactly one `read` call.
|
||||
let mut matcher = ReadMatcher::new(checker, candidates);
|
||||
visitor::walk_body(&mut matcher, &with.body);
|
||||
let matches = {
|
||||
let mut matcher = ReadMatcher::new(candidates);
|
||||
visitor::walk_body(&mut matcher, &with.body);
|
||||
matcher.into_matches()
|
||||
};
|
||||
|
||||
// All the matched operations should be reported.
|
||||
let diagnostics: Vec<Diagnostic> = matches
|
||||
.iter()
|
||||
.map(|open| {
|
||||
Diagnostic::new(
|
||||
ReadWholeFile {
|
||||
filename: SourceCodeSnippet::from_str(&checker.generator().expr(open.filename)),
|
||||
suggestion: make_suggestion(open, checker.generator()),
|
||||
},
|
||||
open.item.range(),
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
checker.report_diagnostics(diagnostics);
|
||||
}
|
||||
|
||||
/// AST visitor that matches `open` operations with the corresponding `read` calls.
|
||||
struct ReadMatcher<'a, 'b> {
|
||||
checker: &'a Checker<'b>,
|
||||
#[derive(Debug)]
|
||||
struct ReadMatcher<'a> {
|
||||
candidates: Vec<FileOpen<'a>>,
|
||||
matches: Vec<FileOpen<'a>>,
|
||||
}
|
||||
|
||||
impl<'a, 'b> ReadMatcher<'a, 'b> {
|
||||
fn new(checker: &'a Checker<'b>, candidates: Vec<FileOpen<'a>>) -> Self {
|
||||
impl<'a> ReadMatcher<'a> {
|
||||
fn new(candidates: Vec<FileOpen<'a>>) -> Self {
|
||||
Self {
|
||||
checker,
|
||||
candidates,
|
||||
matches: vec![],
|
||||
}
|
||||
}
|
||||
|
||||
fn into_matches(self) -> Vec<FileOpen<'a>> {
|
||||
self.matches
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Visitor<'a> for ReadMatcher<'a, '_> {
|
||||
impl<'a> Visitor<'a> for ReadMatcher<'a> {
|
||||
fn visit_expr(&mut self, expr: &'a Expr) {
|
||||
if let Some(read_from) = match_read_call(expr) {
|
||||
if let Some(open) = self
|
||||
@@ -91,16 +114,7 @@ impl<'a> Visitor<'a> for ReadMatcher<'a, '_> {
|
||||
.iter()
|
||||
.position(|open| open.is_ref(read_from))
|
||||
{
|
||||
let open = self.candidates.remove(open);
|
||||
self.checker.report_diagnostic(Diagnostic::new(
|
||||
ReadWholeFile {
|
||||
filename: SourceCodeSnippet::from_str(
|
||||
&self.checker.generator().expr(open.filename),
|
||||
),
|
||||
suggestion: make_suggestion(&open, self.checker.generator()),
|
||||
},
|
||||
open.item.range(),
|
||||
));
|
||||
self.matches.push(self.candidates.remove(open));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use crate::preview::is_readlines_in_for_fix_safe_enabled;
|
||||
use crate::preview::is_readlines_in_for_fix_safe;
|
||||
use ruff_diagnostics::{AlwaysFixableViolation, Diagnostic, Edit, Fix};
|
||||
use ruff_macros::{ViolationMetadata, derive_message_formats};
|
||||
use ruff_python_ast::{Comprehension, Expr, StmtFor};
|
||||
@@ -86,7 +86,7 @@ fn readlines_in_iter(checker: &Checker, iter_expr: &Expr) {
|
||||
}
|
||||
|
||||
let mut diagnostic = Diagnostic::new(ReadlinesInFor, expr_call.range());
|
||||
diagnostic.set_fix(if is_readlines_in_for_fix_safe_enabled(checker.settings) {
|
||||
diagnostic.set_fix(if is_readlines_in_for_fix_safe(checker.settings) {
|
||||
Fix::safe_edit(Edit::range_deletion(
|
||||
expr_call.range().add_start(expr_attr.value.range().len()),
|
||||
))
|
||||
|
||||
@@ -86,42 +86,48 @@ pub(crate) fn repeated_append(checker: &Checker, stmt: &Stmt) {
|
||||
return;
|
||||
}
|
||||
|
||||
for group in group_appends(appends) {
|
||||
// Groups with just one element are fine, and shouldn't be replaced by `extend`.
|
||||
if group.appends.len() <= 1 {
|
||||
continue;
|
||||
}
|
||||
// group borrows from checker, so we can't directly push into checker.diagnostics
|
||||
let diagnostics: Vec<Diagnostic> = group_appends(appends)
|
||||
.iter()
|
||||
.filter_map(|group| {
|
||||
// Groups with just one element are fine, and shouldn't be replaced by `extend`.
|
||||
if group.appends.len() <= 1 {
|
||||
return None;
|
||||
}
|
||||
|
||||
let replacement = make_suggestion(&group, checker.generator());
|
||||
let replacement = make_suggestion(group, checker.generator());
|
||||
|
||||
let mut diagnostic = Diagnostic::new(
|
||||
RepeatedAppend {
|
||||
name: group.name().to_string(),
|
||||
replacement: SourceCodeSnippet::new(replacement.clone()),
|
||||
},
|
||||
group.range(),
|
||||
);
|
||||
let mut diagnostic = Diagnostic::new(
|
||||
RepeatedAppend {
|
||||
name: group.name().to_string(),
|
||||
replacement: SourceCodeSnippet::new(replacement.clone()),
|
||||
},
|
||||
group.range(),
|
||||
);
|
||||
|
||||
// We only suggest a fix when all appends in a group are clumped together. If they're
|
||||
// non-consecutive, fixing them is much more difficult.
|
||||
//
|
||||
// Avoid fixing if there are comments in between the appends:
|
||||
//
|
||||
// ```python
|
||||
// a.append(1)
|
||||
// # comment
|
||||
// a.append(2)
|
||||
// ```
|
||||
if group.is_consecutive && !checker.comment_ranges().intersects(group.range()) {
|
||||
diagnostic.set_fix(Fix::unsafe_edit(Edit::replacement(
|
||||
replacement,
|
||||
group.start(),
|
||||
group.end(),
|
||||
)));
|
||||
}
|
||||
// We only suggest a fix when all appends in a group are clumped together. If they're
|
||||
// non-consecutive, fixing them is much more difficult.
|
||||
//
|
||||
// Avoid fixing if there are comments in between the appends:
|
||||
//
|
||||
// ```python
|
||||
// a.append(1)
|
||||
// # comment
|
||||
// a.append(2)
|
||||
// ```
|
||||
if group.is_consecutive && !checker.comment_ranges().intersects(group.range()) {
|
||||
diagnostic.set_fix(Fix::unsafe_edit(Edit::replacement(
|
||||
replacement,
|
||||
group.start(),
|
||||
group.end(),
|
||||
)));
|
||||
}
|
||||
|
||||
checker.report_diagnostic(diagnostic);
|
||||
}
|
||||
Some(diagnostic)
|
||||
})
|
||||
.collect();
|
||||
|
||||
checker.report_diagnostics(diagnostics);
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
|
||||
@@ -65,28 +65,54 @@ pub(crate) fn write_whole_file(checker: &Checker, with: &ast::StmtWith) {
|
||||
}
|
||||
|
||||
// Then we need to match each `open` operation with exactly one `write` call.
|
||||
let mut matcher = WriteMatcher::new(checker, candidates);
|
||||
visitor::walk_body(&mut matcher, &with.body);
|
||||
let (matches, contents) = {
|
||||
let mut matcher = WriteMatcher::new(candidates);
|
||||
visitor::walk_body(&mut matcher, &with.body);
|
||||
matcher.finish()
|
||||
};
|
||||
|
||||
// All the matched operations should be reported.
|
||||
let diagnostics: Vec<Diagnostic> = matches
|
||||
.iter()
|
||||
.zip(contents)
|
||||
.map(|(open, content)| {
|
||||
Diagnostic::new(
|
||||
WriteWholeFile {
|
||||
filename: SourceCodeSnippet::from_str(&checker.generator().expr(open.filename)),
|
||||
suggestion: make_suggestion(open, content, checker.generator()),
|
||||
},
|
||||
open.item.range(),
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
checker.report_diagnostics(diagnostics);
|
||||
}
|
||||
|
||||
/// AST visitor that matches `open` operations with the corresponding `write` calls.
|
||||
struct WriteMatcher<'a, 'b> {
|
||||
checker: &'a Checker<'b>,
|
||||
#[derive(Debug)]
|
||||
struct WriteMatcher<'a> {
|
||||
candidates: Vec<FileOpen<'a>>,
|
||||
matches: Vec<FileOpen<'a>>,
|
||||
contents: Vec<&'a Expr>,
|
||||
loop_counter: u32,
|
||||
}
|
||||
|
||||
impl<'a, 'b> WriteMatcher<'a, 'b> {
|
||||
fn new(checker: &'a Checker<'b>, candidates: Vec<FileOpen<'a>>) -> Self {
|
||||
impl<'a> WriteMatcher<'a> {
|
||||
fn new(candidates: Vec<FileOpen<'a>>) -> Self {
|
||||
Self {
|
||||
checker,
|
||||
candidates,
|
||||
matches: vec![],
|
||||
contents: vec![],
|
||||
loop_counter: 0,
|
||||
}
|
||||
}
|
||||
|
||||
fn finish(self) -> (Vec<FileOpen<'a>>, Vec<&'a Expr>) {
|
||||
(self.matches, self.contents)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Visitor<'a> for WriteMatcher<'a, '_> {
|
||||
impl<'a> Visitor<'a> for WriteMatcher<'a> {
|
||||
fn visit_stmt(&mut self, stmt: &'a Stmt) {
|
||||
if matches!(stmt, ast::Stmt::While(_) | ast::Stmt::For(_)) {
|
||||
self.loop_counter += 1;
|
||||
@@ -105,16 +131,8 @@ impl<'a> Visitor<'a> for WriteMatcher<'a, '_> {
|
||||
.position(|open| open.is_ref(write_to))
|
||||
{
|
||||
if self.loop_counter == 0 {
|
||||
let open = self.candidates.remove(open);
|
||||
self.checker.report_diagnostic(Diagnostic::new(
|
||||
WriteWholeFile {
|
||||
filename: SourceCodeSnippet::from_str(
|
||||
&self.checker.generator().expr(open.filename),
|
||||
),
|
||||
suggestion: make_suggestion(&open, content, self.checker.generator()),
|
||||
},
|
||||
open.item.range(),
|
||||
));
|
||||
self.matches.push(self.candidates.remove(open));
|
||||
self.contents.push(content);
|
||||
} else {
|
||||
self.candidates.remove(open);
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user