From 7207c86971cbb6ca3e7cb50ffb9d81f0a99dd93b Mon Sep 17 00:00:00 2001 From: Wei Lee Date: Wed, 9 Apr 2025 22:43:07 +0800 Subject: [PATCH] [`airflow`] Extract `AIR312` from `AIR302` rules (`AIR302`, `AIR312`) (#17152) ## Summary As discussed in https://github.com/astral-sh/ruff/issues/14626#issuecomment-2766146129, we're to separate suggested changes from required changes. The following symbols has been moved to AIR312 from AIR302. They still work in Airflow 3.0, but they're suggested to be changed as they're expected to be removed in future version ```python from airflow.hooks.filesystem import FSHook from airflow.hooks.package_index import PackageIndexHook from airflow.hooks.subprocess import (SubprocessHook, SubprocessResult, working_directory) from airflow.operators.bash import BashOperator from airflow.operators.datetime import BranchDateTimeOperator, target_times_as_dates from airflow.operators.trigger_dagrun import TriggerDagRunLink, TriggerDagRunOperator from airflow.operators.empty import EmptyOperator from airflow.operators.latest_only import LatestOnlyOperator from airflow.operators.python import (BranchPythonOperator, PythonOperator, PythonVirtualenvOperator, ShortCircuitOperator) from airflow.operators.weekday import BranchDayOfWeekOperator from airflow.sensors.date_time import DateTimeSensor, DateTimeSensorAsync from airflow.sensors.external_task import ExternalTaskMarker, ExternalTaskSensor, ExternalTaskSensorLink from airflow.sensors.filesystem import FileSensor from airflow.sensors.time_sensor import TimeSensor, TimeSensorAsync from airflow.sensors.time_delta import TimeDeltaSensor, TimeDeltaSensorAsync, WaitSensor from airflow.sensors.weekday import DayOfWeekSensor from airflow.triggers.external_task import DagStateTrigger, WorkflowTrigger from airflow.triggers.file import FileTrigger from airflow.triggers.temporal import DateTimeTrigger, TimeDeltaTrigger ``` ## Test Plan The test fixture has been updated acccordingly --------- Co-authored-by: Brent Westbrook <36778786+ntBre@users.noreply.github.com> --- .../resources/test/fixtures/airflow/AIR312.py | 55 ++ .../src/checkers/ast/analyze/expression.rs | 6 + crates/ruff_linter/src/codes.rs | 1 + .../ruff_linter/src/rules/airflow/helpers.rs | 15 + crates/ruff_linter/src/rules/airflow/mod.rs | 1 + .../src/rules/airflow/rules/mod.rs | 2 + .../airflow/rules/moved_to_provider_in_3.rs | 488 +++++++----------- .../suggested_to_move_to_provider_in_3.rs | 249 +++++++++ ...les__airflow__tests__AIR302_AIR302.py.snap | 403 --------------- ...les__airflow__tests__AIR312_AIR312.py.snap | 370 +++++++++++++ ruff.schema.json | 2 + 11 files changed, 889 insertions(+), 703 deletions(-) create mode 100644 crates/ruff_linter/resources/test/fixtures/airflow/AIR312.py create mode 100644 crates/ruff_linter/src/rules/airflow/rules/suggested_to_move_to_provider_in_3.rs create mode 100644 crates/ruff_linter/src/rules/airflow/snapshots/ruff_linter__rules__airflow__tests__AIR312_AIR312.py.snap diff --git a/crates/ruff_linter/resources/test/fixtures/airflow/AIR312.py b/crates/ruff_linter/resources/test/fixtures/airflow/AIR312.py new file mode 100644 index 0000000000..a0e04a408d --- /dev/null +++ b/crates/ruff_linter/resources/test/fixtures/airflow/AIR312.py @@ -0,0 +1,55 @@ +from __future__ import annotations + +from airflow.hooks.filesystem import FSHook +from airflow.hooks.package_index import PackageIndexHook +from airflow.hooks.subprocess import SubprocessHook, SubprocessResult, working_directory +from airflow.operators.bash import BashOperator +from airflow.operators.datetime import BranchDateTimeOperator, target_times_as_dates +from airflow.operators.empty import EmptyOperator +from airflow.operators.latest_only import LatestOnlyOperator +from airflow.operators.python import ( + BranchPythonOperator, + PythonOperator, + PythonVirtualenvOperator, + ShortCircuitOperator, +) +from airflow.operators.trigger_dagrun import TriggerDagRunLink, TriggerDagRunOperator +from airflow.operators.weekday import BranchDayOfWeekOperator +from airflow.sensors.date_time import DateTimeSensor, DateTimeSensorAsync +from airflow.sensors.external_task import ( + ExternalTaskMarker, + ExternalTaskSensor, + ExternalTaskSensorLink, +) +from airflow.sensors.filesystem import FileSensor +from airflow.sensors.time_delta import TimeDeltaSensor, TimeDeltaSensorAsync, WaitSensor +from airflow.sensors.time_sensor import TimeSensor, TimeSensorAsync +from airflow.sensors.weekday import DayOfWeekSensor +from airflow.triggers.external_task import DagStateTrigger, WorkflowTrigger +from airflow.triggers.file import FileTrigger +from airflow.triggers.temporal import DateTimeTrigger, TimeDeltaTrigger + +FSHook() +PackageIndexHook() +SubprocessHook(), SubprocessResult(), working_directory() +BashOperator() +BranchDateTimeOperator(), target_times_as_dates() +TriggerDagRunLink(), TriggerDagRunOperator() +EmptyOperator() +LatestOnlyOperator() +( + BranchPythonOperator(), + PythonOperator(), + PythonVirtualenvOperator(), + ShortCircuitOperator(), +) +BranchDayOfWeekOperator() +DateTimeSensor(), DateTimeSensorAsync() +ExternalTaskMarker(), ExternalTaskSensor(), ExternalTaskSensorLink() +FileSensor() +TimeSensor(), TimeSensorAsync() +TimeDeltaSensor(), TimeDeltaSensorAsync(), WaitSensor() +DayOfWeekSensor() +DagStateTrigger(), WorkflowTrigger() +FileTrigger() +DateTimeTrigger(), TimeDeltaTrigger() diff --git a/crates/ruff_linter/src/checkers/ast/analyze/expression.rs b/crates/ruff_linter/src/checkers/ast/analyze/expression.rs index 0dedf39da7..34620f99ff 100644 --- a/crates/ruff_linter/src/checkers/ast/analyze/expression.rs +++ b/crates/ruff_linter/src/checkers/ast/analyze/expression.rs @@ -232,6 +232,9 @@ pub(crate) fn expression(expr: &Expr, checker: &Checker) { if checker.enabled(Rule::Airflow3MovedToProvider) { airflow::rules::moved_to_provider_in_3(checker, expr); } + if checker.enabled(Rule::Airflow3SuggestedToMoveToProvider) { + airflow::rules::suggested_to_move_to_provider_in_3(checker, expr); + } if checker.any_enabled(&[ Rule::SuspiciousPickleUsage, Rule::SuspiciousMarshalUsage, @@ -448,6 +451,9 @@ pub(crate) fn expression(expr: &Expr, checker: &Checker) { if checker.enabled(Rule::Airflow3Removal) { airflow::rules::airflow_3_removal_expr(checker, expr); } + if checker.enabled(Rule::Airflow3SuggestedToMoveToProvider) { + airflow::rules::suggested_to_move_to_provider_in_3(checker, expr); + } } Expr::Call( call @ ast::ExprCall { diff --git a/crates/ruff_linter/src/codes.rs b/crates/ruff_linter/src/codes.rs index 3631a59b6f..2271954d24 100644 --- a/crates/ruff_linter/src/codes.rs +++ b/crates/ruff_linter/src/codes.rs @@ -1072,6 +1072,7 @@ pub fn code_to_rule(linter: Linter, code: &str) -> Option<(RuleGroup, Rule)> { (Airflow, "002") => (RuleGroup::Preview, rules::airflow::rules::AirflowDagNoScheduleArgument), (Airflow, "301") => (RuleGroup::Preview, rules::airflow::rules::Airflow3Removal), (Airflow, "302") => (RuleGroup::Preview, rules::airflow::rules::Airflow3MovedToProvider), + (Airflow, "312") => (RuleGroup::Preview, rules::airflow::rules::Airflow3SuggestedToMoveToProvider), // perflint (Perflint, "101") => (RuleGroup::Stable, rules::perflint::rules::UnnecessaryListCast), diff --git a/crates/ruff_linter/src/rules/airflow/helpers.rs b/crates/ruff_linter/src/rules/airflow/helpers.rs index 9508153a3d..4143846c3e 100644 --- a/crates/ruff_linter/src/rules/airflow/helpers.rs +++ b/crates/ruff_linter/src/rules/airflow/helpers.rs @@ -15,6 +15,21 @@ pub(crate) enum Replacement { }, } +#[derive(Debug, Eq, PartialEq)] +pub(crate) enum ProviderReplacement { + ProviderName { + name: &'static str, + provider: &'static str, + version: &'static str, + }, + SourceModuleMovedToProvider { + name: String, + module: &'static str, + provider: &'static str, + version: &'static str, + }, +} + pub(crate) fn is_guarded_by_try_except( expr: &Expr, replacement: &Replacement, diff --git a/crates/ruff_linter/src/rules/airflow/mod.rs b/crates/ruff_linter/src/rules/airflow/mod.rs index 466a189996..c2be3df3b6 100644 --- a/crates/ruff_linter/src/rules/airflow/mod.rs +++ b/crates/ruff_linter/src/rules/airflow/mod.rs @@ -22,6 +22,7 @@ mod tests { #[test_case(Rule::Airflow3Removal, Path::new("AIR301_airflow_plugin.py"))] #[test_case(Rule::Airflow3Removal, Path::new("AIR301_context.py"))] #[test_case(Rule::Airflow3MovedToProvider, Path::new("AIR302.py"))] + #[test_case(Rule::Airflow3SuggestedToMoveToProvider, Path::new("AIR312.py"))] fn rules(rule_code: Rule, path: &Path) -> Result<()> { let snapshot = format!("{}_{}", rule_code.noqa_code(), path.to_string_lossy()); let diagnostics = test_path( diff --git a/crates/ruff_linter/src/rules/airflow/rules/mod.rs b/crates/ruff_linter/src/rules/airflow/rules/mod.rs index 033395cb75..333c11afe5 100644 --- a/crates/ruff_linter/src/rules/airflow/rules/mod.rs +++ b/crates/ruff_linter/src/rules/airflow/rules/mod.rs @@ -1,9 +1,11 @@ pub(crate) use dag_schedule_argument::*; pub(crate) use moved_to_provider_in_3::*; pub(crate) use removal_in_3::*; +pub(crate) use suggested_to_move_to_provider_in_3::*; pub(crate) use task_variable_name::*; mod dag_schedule_argument; mod moved_to_provider_in_3; mod removal_in_3; +mod suggested_to_move_to_provider_in_3; mod task_variable_name; diff --git a/crates/ruff_linter/src/rules/airflow/rules/moved_to_provider_in_3.rs b/crates/ruff_linter/src/rules/airflow/rules/moved_to_provider_in_3.rs index 51d93a6eda..319464903e 100644 --- a/crates/ruff_linter/src/rules/airflow/rules/moved_to_provider_in_3.rs +++ b/crates/ruff_linter/src/rules/airflow/rules/moved_to_provider_in_3.rs @@ -1,3 +1,4 @@ +use crate::rules::airflow::helpers::ProviderReplacement; use ruff_diagnostics::{Diagnostic, Violation}; use ruff_macros::{derive_message_formats, ViolationMetadata}; use ruff_python_ast::{Expr, ExprAttribute}; @@ -28,7 +29,7 @@ use crate::checkers::ast::Checker; #[derive(ViolationMetadata)] pub(crate) struct Airflow3MovedToProvider { deprecated: String, - replacement: Replacement, + replacement: ProviderReplacement, } impl Violation for Airflow3MovedToProvider { @@ -39,14 +40,12 @@ impl Violation for Airflow3MovedToProvider { replacement, } = self; match replacement { - Replacement::ProviderName { + ProviderReplacement::ProviderName { name: _, provider, version: _, - } => { - format!("`{deprecated}` is moved into `{provider}` provider in Airflow 3.0;") } - Replacement::SourceModuleMovedToProvider { + | ProviderReplacement::SourceModuleMovedToProvider { name: _, module: _, provider, @@ -59,25 +58,24 @@ impl Violation for Airflow3MovedToProvider { fn fix_title(&self) -> Option { let Airflow3MovedToProvider { replacement, .. } = self; - if let Replacement::ProviderName { - name, - provider, - version, - } = replacement - { - Some(format!( - "Install `apache-airflow-provider-{provider}>={version}` and use `{name}` instead." - )) - } else if let Replacement::SourceModuleMovedToProvider { - name, - module, - provider, - version, - } = replacement - { - Some(format!("Install `apache-airflow-provider-{provider}>={version}` and use `{module}.{name}` instead.")) - } else { - None + match replacement { + ProviderReplacement::ProviderName { + name, + provider, + version, + } => { + Some(format!( + "Install `apache-airflow-provider-{provider}>={version}` and use `{name}` instead." + )) + }, + ProviderReplacement::SourceModuleMovedToProvider { + name, + module, + provider, + version, + } => { + Some(format!("Install `apache-airflow-provider-{provider}>={version}` and use `{module}.{name}` instead.")) + } , } } } @@ -92,26 +90,11 @@ pub(crate) fn moved_to_provider_in_3(checker: &Checker, expr: &Expr) { Expr::Attribute(ExprAttribute { attr, .. }) => { check_names_moved_to_provider(checker, expr, attr.range()); } - ranged @ Expr::Name(_) => check_names_moved_to_provider(checker, expr, ranged.range()), + Expr::Name(_) => check_names_moved_to_provider(checker, expr, expr.range()), _ => {} } } -#[derive(Debug, Eq, PartialEq)] -enum Replacement { - ProviderName { - name: &'static str, - provider: &'static str, - version: &'static str, - }, - SourceModuleMovedToProvider { - name: String, - module: &'static str, - provider: &'static str, - version: &'static str, - }, -} - fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRange) { let Some(qualified_name) = checker.semantic().resolve_qualified_name(expr) else { return; @@ -121,65 +104,65 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan // ProviderName: for cases that only one name has been moved // apache-airflow-providers-amazon ["airflow", "hooks", "S3_hook", rest @ ( - "S3Hook" | - "provide_bucket_name" - )] => Replacement::SourceModuleMovedToProvider { + "S3Hook" + | "provide_bucket_name" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.amazon.aws.hooks.s3", provider: "amazon", version: "1.0.0" }, - ["airflow", "operators", "gcs_to_s3", "GCSToS3Operator"] => Replacement::ProviderName { + ["airflow", "operators", "gcs_to_s3", "GCSToS3Operator"] => ProviderReplacement::ProviderName { name: "airflow.providers.amazon.aws.transfers.gcs_to_s3.GCSToS3Operator", provider: "amazon", version: "1.0.0" }, - ["airflow", "operators", "google_api_to_s3_transfer", "GoogleApiToS3Operator" | "GoogleApiToS3Transfer"] => Replacement::ProviderName { + ["airflow", "operators", "google_api_to_s3_transfer", "GoogleApiToS3Operator" | "GoogleApiToS3Transfer"] => ProviderReplacement::ProviderName { name: "airflow.providers.amazon.aws.transfers.google_api_to_s3.GoogleApiToS3Operator", provider: "amazon", version: "1.0.0" }, - ["airflow", "operators", "redshift_to_s3_operator", "RedshiftToS3Operator" | "RedshiftToS3Transfer"] => Replacement::ProviderName { + ["airflow", "operators", "redshift_to_s3_operator", "RedshiftToS3Operator" | "RedshiftToS3Transfer"] => ProviderReplacement::ProviderName { name: "airflow.providers.amazon.aws.transfers.redshift_to_s3.RedshiftToS3Operator", provider: "amazon", version: "1.0.0" }, - ["airflow", "operators", "s3_file_transform_operator", "S3FileTransformOperator"] => Replacement::ProviderName { + ["airflow", "operators", "s3_file_transform_operator", "S3FileTransformOperator"] => ProviderReplacement::ProviderName { name: "airflow.providers.amazon.aws.operators.s3_file_transform.S3FileTransformOperator", provider: "amazon", version: "1.0.0" }, - ["airflow", "operators", "s3_to_redshift_operator", "S3ToRedshiftOperator" | "S3ToRedshiftTransfer"] => Replacement::ProviderName { + ["airflow", "operators", "s3_to_redshift_operator", "S3ToRedshiftOperator" | "S3ToRedshiftTransfer"] => ProviderReplacement::ProviderName { name: "airflow.providers.amazon.aws.transfers.s3_to_redshift.S3ToRedshiftOperator", provider: "amazon", version: "1.0.0" }, - ["airflow", "sensors", "s3_key_sensor", "S3KeySensor"] => Replacement::ProviderName { + ["airflow", "sensors", "s3_key_sensor", "S3KeySensor"] => ProviderReplacement::ProviderName { name: "airflow.providers.amazon.aws.sensors.s3.S3KeySensor", provider: "amazon", version: "1.0.0" }, // apache-airflow-providers-celery - ["airflow", "config_templates", "default_celery", "DEFAULT_CELERY_CONFIG"] => Replacement::ProviderName { + ["airflow", "config_templates", "default_celery", "DEFAULT_CELERY_CONFIG"] => ProviderReplacement::ProviderName { name: "airflow.providers.celery.executors.default_celery.DEFAULT_CELERY_CONFIG", provider: "celery", version: "3.3.0" }, ["airflow", "executors", "celery_executor", rest ] => match *rest { - "app" => Replacement::ProviderName { + "app" => ProviderReplacement::ProviderName { name: "airflow.providers.celery.executors.celery_executor_utils.app", provider: "celery", version: "3.3.0" }, - "CeleryExecutor" => Replacement::ProviderName { + "CeleryExecutor" => ProviderReplacement::ProviderName { name: "airflow.providers.celery.executors.celery_executor.CeleryExecutor", provider: "celery", version: "3.3.0" }, _ => return, }, - ["airflow", "executors", "celery_kubernetes_executor", "CeleryKubernetesExecutor"] => Replacement::ProviderName { + ["airflow", "executors", "celery_kubernetes_executor", "CeleryKubernetesExecutor"] => ProviderReplacement::ProviderName { name: "airflow.providers.celery.executors.celery_kubernetes_executor.CeleryKubernetesExecutor", provider: "celery", version: "3.3.0" @@ -187,36 +170,36 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan // apache-airflow-providers-common-sql ["airflow", "hooks", "dbapi", rest @ ( - "ConnectorProtocol" | - "DbApiHook" - )] => Replacement::SourceModuleMovedToProvider { + "ConnectorProtocol" + | "DbApiHook" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.common.sql.hooks.sql", provider: "common-sql", version: "1.0.0" }, - ["airflow", "hooks", "dbapi_hook", "DbApiHook"] => Replacement::ProviderName { + ["airflow", "hooks", "dbapi_hook", "DbApiHook"] => ProviderReplacement::ProviderName { name: "airflow.providers.common.sql.hooks.sql.DbApiHook", provider: "common-sql", version: "1.0.0" }, ["airflow", "operators", "check_operator", rest] => match *rest { - "SQLCheckOperator" | "CheckOperator" => Replacement::ProviderName { + "SQLCheckOperator" | "CheckOperator" => ProviderReplacement::ProviderName { name: "airflow.providers.common.sql.operators.sql.SQLCheckOperator", provider: "common-sql", version: "1.1.0" }, - "SQLIntervalCheckOperator" | "IntervalCheckOperator" => Replacement::ProviderName { + "SQLIntervalCheckOperator" | "IntervalCheckOperator" => ProviderReplacement::ProviderName { name: "airflow.providers.common.sql.operators.sql.SQLIntervalCheckOperator", provider: "common-sql", version: "1.1.0" }, - "SQLThresholdCheckOperator" | "ThresholdCheckOperator" => Replacement::ProviderName { + "SQLThresholdCheckOperator" | "ThresholdCheckOperator" => ProviderReplacement::ProviderName { name: "airflow.providers.common.sql.operators.sql.SQLThresholdCheckOperator", provider: "common-sql", version: "1.1.0" }, - "SQLValueCheckOperator" | "ValueCheckOperator" => Replacement::ProviderName { + "SQLValueCheckOperator" | "ValueCheckOperator" => ProviderReplacement::ProviderName { name: "airflow.providers.common.sql.operators.sql.SQLValueCheckOperator", provider: "common-sql", version: "1.1.0" @@ -224,17 +207,17 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan _ => return }, ["airflow", "operators", "presto_check_operator", rest] => match *rest { - "SQLCheckOperator" | "PrestoCheckOperator" => Replacement::ProviderName { + "SQLCheckOperator" | "PrestoCheckOperator" => ProviderReplacement::ProviderName { name: "airflow.providers.common.sql.operators.sql.SQLCheckOperator", provider: "common-sql", version: "1.1.0" }, - "SQLIntervalCheckOperator" | "PrestoIntervalCheckOperator" => Replacement::ProviderName { + "SQLIntervalCheckOperator" | "PrestoIntervalCheckOperator" => ProviderReplacement::ProviderName { name: "airflow.providers.common.sql.operators.sql.SQLIntervalCheckOperator", provider: "common-sql", version: "1.1.0" }, - "SQLValueCheckOperator" | "PrestoValueCheckOperator" => Replacement::ProviderName { + "SQLValueCheckOperator" | "PrestoValueCheckOperator" => ProviderReplacement::ProviderName { name: "airflow.providers.common.sql.operators.sql.SQLValueCheckOperator", provider: "common-sql", version: "1.1.0" @@ -247,7 +230,7 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan "SQLCheckOperator" | "SQLIntervalCheckOperator" | "SQLTablecheckOperator" | - "SQLThresholdCheckOperator" => Replacement::SourceModuleMovedToProvider { + "SQLThresholdCheckOperator" => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.common.sql.operators.sql", provider: "common-sql", @@ -256,7 +239,7 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan "SQLColumnCheckOperator" | "SQLValueCheckOperator" | "_convert_to_float_if_possible" | - "parse_boolean" => Replacement::SourceModuleMovedToProvider { + "parse_boolean" => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.common.sql.operators.sql", provider: "common-sql", @@ -264,26 +247,26 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan }, _ => return } - ["airflow", "sensors", "sql" | "sql_sensor", "SqlSensor"] => Replacement::ProviderName { + ["airflow", "sensors", "sql" | "sql_sensor", "SqlSensor"] => ProviderReplacement::ProviderName { name: "airflow.providers.common.sql.sensors.sql.SqlSensor", provider: "common-sql", version: "1.0.0" }, // apache-airflow-providers-daskexecutor - ["airflow", "executors", "dask_executor", "DaskExecutor"] => Replacement::ProviderName { + ["airflow", "executors", "dask_executor", "DaskExecutor"] => ProviderReplacement::ProviderName { name: "airflow.providers.daskexecutor.executors.dask_executor.DaskExecutor", provider: "daskexecutor", version: "1.0.0" }, // apache-airflow-providers-docker - ["airflow", "hooks", "docker_hook", "DockerHook"] => Replacement::ProviderName { + ["airflow", "hooks", "docker_hook", "DockerHook"] => ProviderReplacement::ProviderName { name: "airflow.providers.docker.hooks.docker.DockerHook", provider: "docker", version: "1.0.0" }, - ["airflow", "operators", "docker_operator", "DockerOperator"] => Replacement::ProviderName { + ["airflow", "operators", "docker_operator", "DockerOperator"] => ProviderReplacement::ProviderName { name: "airflow.providers.docker.operators.docker.DockerOperator", provider: "docker", version: "1.0.0" @@ -291,20 +274,20 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan // apache-airflow-providers-apache-druid ["airflow", "hooks", "druid_hook", rest @ ( - "DruidDbApiHook" | - "DruidHook" - )] => Replacement::SourceModuleMovedToProvider { + "DruidDbApiHook" + | "DruidHook" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.apache.druid.hooks.druid", provider: "apache-druid", version: "1.0.0" }, - ["airflow", "operators", "druid_check_operator", "DruidCheckOperator"] => Replacement::ProviderName { + ["airflow", "operators", "druid_check_operator", "DruidCheckOperator"] => ProviderReplacement::ProviderName { name: "DruidCheckOperator", provider: "apache-druid", version: "1.0.0" }, - ["airflow", "operators", "hive_to_druid", "HiveToDruidOperator" | "HiveToDruidTransfer"] => Replacement::ProviderName { + ["airflow", "operators", "hive_to_druid", "HiveToDruidOperator" | "HiveToDruidTransfer"] => ProviderReplacement::ProviderName { name: "airflow.providers.apache.druid.transfers.hive_to_druid.HiveToDruidOperator", provider: "apache-druid", version: "1.0.0" @@ -312,67 +295,67 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan // apache-airflow-providers-fab ["airflow", "api", "auth", "backend", "basic_auth", rest @ ( - "CLIENT_AUTH" | - "init_app" | - "auth_current_user" | - "requires_authentication" - )] => Replacement::SourceModuleMovedToProvider { + "CLIENT_AUTH" + | "init_app" + | "auth_current_user" + | "requires_authentication" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.fab.auth_manager.api.auth.backend.basic_auth", provider: "fab", version: "1.0.0" }, ["airflow", "api", "auth", "backend", "kerberos_auth", rest @ ( - "log" | - "CLIENT_AUTH" | - "find_user" | - "init_app" | - "requires_authentication" - )] => Replacement::SourceModuleMovedToProvider { + "log" + | "CLIENT_AUTH" + | "find_user" + | "init_app" + | "requires_authentication" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth", provider: "fab", version: "1.0.0" }, ["airflow", "auth", "managers", "fab", "api", "auth", "backend", "kerberos_auth", rest @ ( - "log" | - "CLIENT_AUTH" | - "find_user" | - "init_app" | - "requires_authentication" - )] => Replacement::SourceModuleMovedToProvider { + "log" + | "CLIENT_AUTH" + | "find_user" + | "init_app" + | "requires_authentication" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth", provider: "fab", version: "1.0.0" }, - ["airflow", "auth", "managers", "fab", "fab_auth_manager", "FabAuthManager"] => Replacement::ProviderName { + ["airflow", "auth", "managers", "fab", "fab_auth_manager", "FabAuthManager"] => ProviderReplacement::ProviderName { name: "airflow.providers.fab.auth_manager.security_manager.FabAuthManager", provider: "fab", version: "1.0.0" }, ["airflow", "auth", "managers", "fab", "security_manager", "override", rest @ ( - "MAX_NUM_DATABASE_USER_SESSIONS" | - "FabAirflowSecurityManagerOverride" - )] => Replacement::SourceModuleMovedToProvider { + "MAX_NUM_DATABASE_USER_SESSIONS" + | "FabAirflowSecurityManagerOverride" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.fab.auth_manager.security_manager.override", provider: "fab", version: "1.0.0" }, - ["airflow", "www", "security", "FabAirflowSecurityManagerOverride"] => Replacement::ProviderName { + ["airflow", "www", "security", "FabAirflowSecurityManagerOverride"] => ProviderReplacement::ProviderName { name: "airflow.providers.fab.auth_manager.security_manager.override.FabAirflowSecurityManagerOverride", provider: "fab", version: "1.0.0" }, // apache-airflow-providers-apache-hdfs - ["airflow", "hooks", "webhdfs_hook", "WebHDFSHook"] => Replacement::ProviderName { + ["airflow", "hooks", "webhdfs_hook", "WebHDFSHook"] => ProviderReplacement::ProviderName { name: "airflow.providers.apache.hdfs.hooks.webhdfs.WebHDFSHook", provider: "apache-hdfs", version: "1.0.0" }, - ["airflow", "sensors", "web_hdfs_sensor", "WebHdfsSensor"] => Replacement::ProviderName { + ["airflow", "sensors", "web_hdfs_sensor", "WebHdfsSensor"] => ProviderReplacement::ProviderName { name: "airflow.providers.apache.hdfs.sensors.web_hdfs.WebHdfsSensor", provider: "apache-hdfs", version: "1.0.0" @@ -380,88 +363,88 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan // apache-airflow-providers-apache-hive ["airflow", "macros", "hive", rest @ ( - "closest_ds_partition" | - "max_partition" - )] => Replacement::SourceModuleMovedToProvider { + "closest_ds_partition" + | "max_partition" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.apache.hive.macros.hive", provider: "apache-hive", version: "5.1.0" }, ["airflow", "hooks", "hive_hooks", rest @ ( - "HiveCliHook" | - "HiveMetastoreHook" | - "HiveServer2Hook" | - "HIVE_QUEUE_PRIORITIES" - )] => Replacement::SourceModuleMovedToProvider { + "HiveCliHook" + | "HiveMetastoreHook" + | "HiveServer2Hook" + | "HIVE_QUEUE_PRIORITIES" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.apache.hive.hooks.hive", provider: "apache-hive", version: "1.0.0" }, - ["airflow", "operators", "hive_operator", "HiveOperator"] => Replacement::ProviderName { + ["airflow", "operators", "hive_operator", "HiveOperator"] => ProviderReplacement::ProviderName { name: "airflow.providers.apache.hive.operators.hive.HiveOperator", provider: "apache-hive", version: "1.0.0" }, - ["airflow", "operators", "hive_stats_operator", "HiveStatsCollectionOperator"] => Replacement::ProviderName { + ["airflow", "operators", "hive_stats_operator", "HiveStatsCollectionOperator"] => ProviderReplacement::ProviderName { name: "airflow.providers.apache.hive.operators.hive_stats.HiveStatsCollectionOperator", provider: "apache-hive", version: "1.0.0" }, - ["airflow", "operators", "hive_to_mysql", "HiveToMySqlOperator" | "HiveToMySqlTransfer"] => Replacement::ProviderName { + ["airflow", "operators", "hive_to_mysql", "HiveToMySqlOperator" | "HiveToMySqlTransfer"] => ProviderReplacement::ProviderName { name: "airflow.providers.apache.hive.transfers.hive_to_mysql.HiveToMySqlOperator", provider: "apache-hive", version: "1.0.0" }, - ["airflow", "operators", "hive_to_samba_operator", "HiveToSambaOperator"] => Replacement::ProviderName { + ["airflow", "operators", "hive_to_samba_operator", "HiveToSambaOperator"] => ProviderReplacement::ProviderName { name: "HiveToSambaOperator", provider: "apache-hive", version: "1.0.0" }, - ["airflow", "operators", "mssql_to_hive", "MsSqlToHiveOperator" | "MsSqlToHiveTransfer"] => Replacement::ProviderName { + ["airflow", "operators", "mssql_to_hive", "MsSqlToHiveOperator" | "MsSqlToHiveTransfer"] => ProviderReplacement::ProviderName { name: "airflow.providers.apache.hive.transfers.mssql_to_hive.MsSqlToHiveOperator", provider: "apache-hive", version: "1.0.0" }, - ["airflow", "operators", "mysql_to_hive", "MySqlToHiveOperator" | "MySqlToHiveTransfer"] => Replacement::ProviderName { + ["airflow", "operators", "mysql_to_hive", "MySqlToHiveOperator" | "MySqlToHiveTransfer"] => ProviderReplacement::ProviderName { name: "airflow.providers.apache.hive.transfers.mysql_to_hive.MySqlToHiveOperator", provider: "apache-hive", version: "1.0.0" }, - ["airflow", "operators", "s3_to_hive_operator", "S3ToHiveOperator" | "S3ToHiveTransfer"] => Replacement::ProviderName { + ["airflow", "operators", "s3_to_hive_operator", "S3ToHiveOperator" | "S3ToHiveTransfer"] => ProviderReplacement::ProviderName { name: "airflow.providers.apache.hive.transfers.s3_to_hive.S3ToHiveOperator", provider: "apache-hive", version: "1.0.0" }, - ["airflow", "sensors", "hive_partition_sensor", "HivePartitionSensor"] => Replacement::ProviderName { + ["airflow", "sensors", "hive_partition_sensor", "HivePartitionSensor"] => ProviderReplacement::ProviderName { name: "airflow.providers.apache.hive.sensors.hive_partition.HivePartitionSensor", provider: "apache-hive", version: "1.0.0" }, - ["airflow", "sensors", "metastore_partition_sensor", "MetastorePartitionSensor"] => Replacement::ProviderName { + ["airflow", "sensors", "metastore_partition_sensor", "MetastorePartitionSensor"] => ProviderReplacement::ProviderName { name: "airflow.providers.apache.hive.sensors.metastore_partition.MetastorePartitionSensor", provider: "apache-hive", version: "1.0.0" }, - ["airflow", "sensors", "named_hive_partition_sensor", "NamedHivePartitionSensor"] => Replacement::ProviderName { + ["airflow", "sensors", "named_hive_partition_sensor", "NamedHivePartitionSensor"] => ProviderReplacement::ProviderName { name: "airflow.providers.apache.hive.sensors.named_hive_partition.NamedHivePartitionSensor", provider: "apache-hive", version: "1.0.0" }, // apache-airflow-providers-http - ["airflow", "hooks", "http_hook", "HttpHook"] => Replacement::ProviderName { + ["airflow", "hooks", "http_hook", "HttpHook"] => ProviderReplacement::ProviderName { name: "airflow.providers.http.hooks.http.HttpHook", provider: "http", version: "1.0.0" }, - ["airflow", "operators", "http_operator", "SimpleHttpOperator"] => Replacement::ProviderName { + ["airflow", "operators", "http_operator", "SimpleHttpOperator"] => ProviderReplacement::ProviderName { name: "airflow.providers.http.operators.http.SimpleHttpOperator", provider: "http", version: "1.0.0" }, - ["airflow", "sensors", "http_sensor", "HttpSensor"] => Replacement::ProviderName { + ["airflow", "sensors", "http_sensor", "HttpSensor"] => ProviderReplacement::ProviderName { name: "airflow.providers.http.sensors.http.HttpSensor", provider: "http", version: "1.0.0" @@ -469,15 +452,15 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan // apache-airflow-providers-jdbc ["airflow", "hooks", "jdbc_hook", rest @ ( - "JdbcHook" | - "jaydebeapi" - )] => Replacement::SourceModuleMovedToProvider { + "JdbcHook" + | "jaydebeapi" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.jdbc.hooks.jdbc", provider: "jdbc", version: "1.0.0" }, - ["airflow", "operators", "jdbc_operator", "JdbcOperator"] => Replacement::ProviderName { + ["airflow", "operators", "jdbc_operator", "JdbcOperator"] => ProviderReplacement::ProviderName { name: "airflow.providers.jdbc.operators.jdbc.JdbcOperator", provider: "jdbc", version: "1.0.0" @@ -485,53 +468,53 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan // apache-airflow-providers-cncf-kubernetes ["airflow", "executors", "kubernetes_executor_types", rest @ ( - "ALL_NAMESPACES" | - "POD_EXECUTOR_DONE_KEY" - )] => Replacement::SourceModuleMovedToProvider { + "ALL_NAMESPACES" + | "POD_EXECUTOR_DONE_KEY" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.cncf.kubernetes.executors.kubernetes_executor_types", provider: "cncf-kubernetes", version: "7.4.0" }, - ["airflow", "kubernetes", "k8s_model", rest@ ( - "K8SModel" | - "append_to_pod" - )] => Replacement::SourceModuleMovedToProvider { + ["airflow", "kubernetes", "k8s_model", rest @ ( + "K8SModel" + | "append_to_pod" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.cncf.kubernetes.k8s_model", provider: "cncf-kubernetes", version: "7.4.0" }, ["airflow", "kubernetes", "kube_client", rest @ ( - "_disable_verify_ssl" | - "_enable_tcp_keepalive" | - "get_kube_client" - )] => Replacement::SourceModuleMovedToProvider { + "_disable_verify_ssl" + | "_enable_tcp_keepalive" + | "get_kube_client" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.kubernetes.airflow.providers.cncf.kubernetes.kube_client", provider: "cncf-kubernetes", version: "7.4.0" }, - ["airflow", "kubernetes", "kubernetes_helper_functions", rest@ ( - "add_pod_suffix" | - "annotations_for_logging_task_metadata" | - "annotations_to_key" | - "create_pod_id" | - "get_logs_task_metadata" | - "rand_str" - )] => Replacement::SourceModuleMovedToProvider { + ["airflow", "kubernetes", "kubernetes_helper_functions", rest @ ( + "add_pod_suffix" + | "annotations_for_logging_task_metadata" + | "annotations_to_key" + | "create_pod_id" + | "get_logs_task_metadata" + | "rand_str" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.cncf.kubernetes.kubernetes_helper_functions", provider: "cncf-kubernetes", version: "7.4.0" }, ["airflow", "kubernetes", "pod", rest] => match *rest { - "Port" =>Replacement::ProviderName { + "Port" =>ProviderReplacement::ProviderName { name: "kubernetes.client.models.V1ContainerPort", provider: "cncf-kubernetes", version: "7.4.0" }, - "Resources" => Replacement::ProviderName { + "Resources" => ProviderReplacement::ProviderName { name: "kubernetes.client.models.V1ResourceRequirements", provider: "cncf-kubernetes", version: "7.4.0" @@ -545,19 +528,19 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan "make_safe_label_value" | "merge_objects" | "PodGenerator" | - "PodDefaults" => Replacement::SourceModuleMovedToProvider { + "PodDefaults" => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.cncf.kubernetes.pod_generator", provider: "cncf-kubernetes", version: "7.4.0" }, - "PodGeneratorDeprecated" => Replacement::ProviderName { + "PodGeneratorDeprecated" => ProviderReplacement::ProviderName { name: "airflow.providers.cncf.kubernetes.pod_generator.PodGenerator", provider: "cncf-kubernetes", version: "7.4.0" }, "add_pod_suffix" | - "rand_str" => Replacement::SourceModuleMovedToProvider { + "rand_str" => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.cncf.kubernetes.kubernetes_helper_functions", provider: "cncf-kubernetes", @@ -565,138 +548,138 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan }, _ => return, }, - ["airflow", "kubernetes", "pod_generator_deprecated", rest@ ( - "make_safe_label_value" | - "PodDefaults" | - "PodGenerator" - )] => Replacement::SourceModuleMovedToProvider { + ["airflow", "kubernetes", "pod_generator_deprecated", rest @ ( + "make_safe_label_value" + | "PodDefaults" + | "PodGenerator" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.cncf.kubernetes.pod_generator_deprecated", provider: "cncf-kubernetes", version: "7.4.0" }, ["airflow", "kubernetes", "pod_launcher", rest @( - "PodLauncher" | - "PodStatus" - )] => Replacement::SourceModuleMovedToProvider { + "PodLauncher" + | "PodStatus" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.cncf.kubernetes.pod_launcher_deprecated", provider: "cncf-kubernetes", version: "7.4.0" }, ["airflow", "kubernetes", "pod_launcher_deprecated", rest] => match *rest { - "PodLauncher" | "PodStatus" | "PodDefaults" => Replacement::SourceModuleMovedToProvider { + "PodLauncher" | "PodStatus" | "PodDefaults" => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.cncf.kubernetes.pod_launcher_deprecated", provider: "cncf-kubernetes", version: "7.4.0" }, - "get_kube_client" => Replacement::ProviderName { + "get_kube_client" => ProviderReplacement::ProviderName { name: "airflow.providers.cncf.kubernetes.kube_client.get_kube_client", provider: "cncf-kubernetes", version: "7.4.0" }, _ => return, } - ["airflow", "kubernetes", "pod_runtime_info_env", "PodRuntimeInfoEnv"] => Replacement::ProviderName { + ["airflow", "kubernetes", "pod_runtime_info_env", "PodRuntimeInfoEnv"] => ProviderReplacement::ProviderName { name: "kubernetes.client.models.V1EnvVar", provider: "cncf-kubernetes", version: "7.4.0" }, ["airflow", "kubernetes", "secret", rest ] => match *rest { - "K8SModel" => Replacement::ProviderName { + "K8SModel" => ProviderReplacement::ProviderName { name: "airflow.providers.cncf.kubernetes.k8s_model.K8SModel", provider: "cncf-kubernetes", version: "7.4.0" }, - "Secret" => Replacement::ProviderName { + "Secret" => ProviderReplacement::ProviderName { name: "airflow.providers.cncf.kubernetes.secret.Secret", provider: "cncf-kubernetes", version: "7.4.0" }, _ => return, }, - ["airflow", "kubernetes", "volume", "Volume"] => Replacement::ProviderName { + ["airflow", "kubernetes", "volume", "Volume"] => ProviderReplacement::ProviderName { name: "kubernetes.client.models.V1Volume", provider: "cncf-kubernetes", version: "7.4.0" }, - ["airflow", "kubernetes", "volume_mount", "VolumeMount"] => Replacement::ProviderName { + ["airflow", "kubernetes", "volume_mount", "VolumeMount"] => ProviderReplacement::ProviderName { name: "kubernetes.client.models.V1VolumeMount", provider: "cncf-kubernetes", version: "7.4.0" }, // apache-airflow-providers-microsoft-mssql - ["airflow", "hooks", "mssql_hook", "MsSqlHook"] => Replacement::ProviderName { + ["airflow", "hooks", "mssql_hook", "MsSqlHook"] => ProviderReplacement::ProviderName { name: "airflow.providers.microsoft.mssql.hooks.mssql.MsSqlHook", provider: "microsoft-mssql", version: "1.0.0" }, - ["airflow", "operators", "mssql_operator", "MsSqlOperator"] => Replacement::ProviderName { + ["airflow", "operators", "mssql_operator", "MsSqlOperator"] => ProviderReplacement::ProviderName { name: "airflow.providers.microsoft.mssql.operators.mssql.MsSqlOperator", provider: "microsoft-mssql", version: "1.0.0" }, // apache-airflow-providers-mysql - ["airflow", "hooks", "mysql_hook", "MySqlHook"] => Replacement::ProviderName { + ["airflow", "hooks", "mysql_hook", "MySqlHook"] => ProviderReplacement::ProviderName { name: "airflow.providers.mysql.hooks.mysql.MySqlHook", provider: "mysql", version: "1.0.0" }, - ["airflow", "operators", "mysql_operator", "MySqlOperator"] => Replacement::ProviderName { + ["airflow", "operators", "mysql_operator", "MySqlOperator"] => ProviderReplacement::ProviderName { name: "airflow.providers.mysql.operators.mysql.MySqlOperator", provider: "mysql", version: "1.0.0" }, - ["airflow", "operators", "presto_to_mysql", "PrestoToMySqlOperator" | "PrestoToMySqlTransfer"] => Replacement::ProviderName { + ["airflow", "operators", "presto_to_mysql", "PrestoToMySqlOperator" | "PrestoToMySqlTransfer"] => ProviderReplacement::ProviderName { name: "airflow.providers.mysql.transfers.presto_to_mysql.PrestoToMySqlOperator", provider: "mysql", version: "1.0.0" }, // apache-airflow-providers-oracle - ["airflow", "hooks", "oracle_hook", "OracleHook"] => Replacement::ProviderName { + ["airflow", "hooks", "oracle_hook", "OracleHook"] => ProviderReplacement::ProviderName { name: "airflow.providers.oracle.hooks.oracle.OracleHook", provider: "oracle", version: "1.0.0" }, - ["airflow", "operators", "oracle_operator", "OracleOperator"] => Replacement::ProviderName { + ["airflow", "operators", "oracle_operator", "OracleOperator"] => ProviderReplacement::ProviderName { name: "airflow.providers.oracle.operators.oracle.OracleOperator", provider: "oracle", version: "1.0.0" }, // apache-airflow-providers-papermill - ["airflow", "operators", "papermill_operator", "PapermillOperator"] => Replacement::ProviderName { + ["airflow", "operators", "papermill_operator", "PapermillOperator"] => ProviderReplacement::ProviderName { name: "airflow.providers.papermill.operators.papermill.PapermillOperator", provider: "papermill", version: "1.0.0" }, // apache-airflow-providers-apache-pig - ["airflow", "hooks", "pig_hook", "PigCliHook"] => Replacement::ProviderName { + ["airflow", "hooks", "pig_hook", "PigCliHook"] => ProviderReplacement::ProviderName { name: "airflow.providers.apache.pig.hooks.pig.PigCliHook", provider: "apache-pig", version: "1.0.0" }, - ["airflow", "operators", "pig_operator", "PigOperator"] => Replacement::ProviderName { + ["airflow", "operators", "pig_operator", "PigOperator"] => ProviderReplacement::ProviderName { name: "airflow.providers.apache.pig.operators.pig.PigOperator", provider: "apache-pig", version: "1.0.0" }, // apache-airflow-providers-postgres - ["airflow", "hooks", "postgres_hook", "PostgresHook"] => Replacement::ProviderName { + ["airflow", "hooks", "postgres_hook", "PostgresHook"] => ProviderReplacement::ProviderName { name: "airflow.providers.postgres.hooks.postgres.PostgresHook", provider: "postgres", version: "1.0.0" }, ["airflow", "operators", "postgres_operator", rest @ ( - "Mapping" | - "PostgresOperator" - )] => Replacement::SourceModuleMovedToProvider { + "Mapping" + | "PostgresOperator" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.postgres.operators.postgres", provider: "postgres", @@ -704,29 +687,29 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan }, // apache-airflow-providers-presto - ["airflow", "hooks", "presto_hook", "PrestoHook"] => Replacement::ProviderName { + ["airflow", "hooks", "presto_hook", "PrestoHook"] => ProviderReplacement::ProviderName { name: "airflow.providers.presto.hooks.presto.PrestoHook", provider: "presto", version: "1.0.0" }, // apache-airflow-providers-samba - ["airflow", "hooks", "samba_hook", "SambaHook"] => Replacement::ProviderName { + ["airflow", "hooks", "samba_hook", "SambaHook"] => ProviderReplacement::ProviderName { name: "airflow.providers.samba.hooks.samba.SambaHook", provider: "samba", version: "1.0.0" }, // apache-airflow-providers-slack - ["airflow", "hooks", "slack_hook", "SlackHook"] => Replacement::ProviderName { + ["airflow", "hooks", "slack_hook", "SlackHook"] => ProviderReplacement::ProviderName { name: "airflow.providers.slack.hooks.slack.SlackHook", provider: "slack", version: "1.0.0" }, ["airflow", "operators", "slack_operator", rest @ ( - "SlackAPIOperator" | - "SlackAPIPostOperator" - )] => Replacement::SourceModuleMovedToProvider { + "SlackAPIOperator" + | "SlackAPIPostOperator" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.slack.operators.slack", provider: "slack", @@ -734,19 +717,19 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan }, // apache-airflow-providers-smtp - ["airflow", "operators", "email_operator" | "email", "EmailOperator"] => Replacement::ProviderName { + ["airflow", "operators", "email_operator" | "email", "EmailOperator"] => ProviderReplacement::ProviderName { name: "airflow.providers.smtp.operators.smtp.EmailOperator", provider: "smtp", version: "1.0.0", }, // apache-airflow-providers-sqlite - ["airflow", "hooks", "sqlite_hook", "SqliteHook"] => Replacement::ProviderName { + ["airflow", "hooks", "sqlite_hook", "SqliteHook"] => ProviderReplacement::ProviderName { name: "airflow.providers.sqlite.hooks.sqlite.SqliteHook", provider: "sqlite", version: "1.0.0" }, - ["airflow", "operators", "sqlite_operator", "SqliteOperator"] => Replacement::ProviderName { + ["airflow", "operators", "sqlite_operator", "SqliteOperator"] => ProviderReplacement::ProviderName { name: "airflow.providers.sqlite.operators.sqlite.SqliteOperator", provider: "sqlite", version: "1.0.0" @@ -754,153 +737,58 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan // apache-airflow-providers-zendesk ["airflow", "hooks", "zendesk_hook", "ZendeskHook"] => - Replacement::ProviderName { + ProviderReplacement::ProviderName { name: "airflow.providers.zendesk.hooks.zendesk.ZendeskHook", provider: "zendesk", version: "1.0.0" }, // apache-airflow-providers-standard - ["airflow", "hooks", "filesystem", "FSHook"] => Replacement::ProviderName { - name: "airflow.providers.standard.hooks.filesystem.FSHook", - provider: "standard", - version: "0.0.1" - }, - ["airflow", "hooks", "package_index", "PackageIndexHook"] => Replacement::ProviderName { - name: "airflow.providers.standard.hooks.package_index.PackageIndexHook", - provider: "standard", - version: "0.0.1" - }, - ["airflow", "hooks", "subprocess", rest @ ( - "SubprocessHook" | - "SubprocessResult" | - "working_directory" - )] => Replacement::SourceModuleMovedToProvider { - name: (*rest).to_string(), - module: "airflow.providers.standard.hooks.subprocess", - provider: "standard", - version: "0.0.3" - }, - ["airflow", "operators", "bash" | "bash_operator", "BashOperator"] => Replacement::ProviderName { + ["airflow", "operators", "bash_operator", "BashOperator"] => ProviderReplacement::ProviderName { name: "airflow.providers.standard.operators.bash.BashOperator", provider: "standard", version: "0.0.1" }, - ["airflow", "operators", "datetime", rest@ ( - "BranchDateTimeOperator" | - "target_times_as_dates" - )] => Replacement::SourceModuleMovedToProvider { - name: (*rest).to_string(), - module: "airflow.providers.standard.time.operators.datetime", - provider: "standard", - version: "0.0.1" - }, - ["airflow", "operators", "dagrun_operator" | "trigger_dagrun", rest@ ( - "TriggerDagRunLink" | - "TriggerDagRunOperator" - )] => Replacement::SourceModuleMovedToProvider { + ["airflow", "operators", "dagrun_operator", rest @ ( + "TriggerDagRunLink" + | "TriggerDagRunOperator" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.standard.operators.trigger_dagrun", provider: "standard", version: "0.0.2" }, - ["airflow", "operators", "dummy" | "dummy_operator", "EmptyOperator" | "DummyOperator"] => Replacement::ProviderName { + ["airflow", "operators", "dummy" | "dummy_operator", "EmptyOperator" | "DummyOperator"] => ProviderReplacement::ProviderName { name: "airflow.providers.standard.operators.empty.EmptyOperator", provider: "standard", version: "0.0.2" }, - ["airflow", "operators", "latest_only_operator" | "latest_only", "LatestOnlyOperator"] => Replacement::ProviderName { + ["airflow", "operators", "latest_only_operator", "LatestOnlyOperator"] => ProviderReplacement::ProviderName { name: "airflow.providers.standard.operators.latest_only.LatestOnlyOperator", provider: "standard", version: "0.0.3" }, - ["airflow", "operators", "python_operator"| "python", rest @ ( - "BranchPythonOperator" | - "PythonOperator" | - "PythonVirtualenvOperator" | - "ShortCircuitOperator" - )] => Replacement::SourceModuleMovedToProvider { + ["airflow", "operators", "python_operator", rest @ ( + "BranchPythonOperator" + | "PythonOperator" + | "PythonVirtualenvOperator" + | "ShortCircuitOperator" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.standard.operators.python", provider: "standard", version: "0.0.1" }, - ["airflow", "operators", "weekday", "BranchDayOfWeekOperator"] => Replacement::ProviderName { - name: "airflow.providers.standard.time.operators.weekday.BranchDayOfWeekOperator", - provider: "standard", - version: "0.0.1" - }, - ["airflow", "sensors", "date_time", rest @ ( - "DateTimeSensor" | - "DateTimeSensorAsync" - )] => Replacement::SourceModuleMovedToProvider { - name: (*rest).to_string(), - module: "airflow.providers.standard.time.sensors.date_time", - provider: "standard", - version: "0.0.1" - }, - ["airflow", "sensors", "external_task_sensor" | "external_task", rest @ ( - "ExternalTaskMarker" | - "ExternalTaskSensor" | - "ExternalTaskSensorLink" - )] => Replacement::SourceModuleMovedToProvider { + ["airflow", "sensors", "external_task_sensor", rest @ ( + "ExternalTaskMarker" + | "ExternalTaskSensor" + | "ExternalTaskSensorLink" + )] => ProviderReplacement::SourceModuleMovedToProvider { name: (*rest).to_string(), module: "airflow.providers.standard.sensors.external_task", provider: "standard", version: "0.0.3" }, - ["airflow", "sensors", "filesystem", "FileSensor"] => Replacement::ProviderName { - name: "airflow.providers.standard.sensors.filesystem.FileSensor", - provider: "standard", - version: "0.0.2" - }, - ["airflow", "sensors", "time_sensor", rest @ ( - "TimeSensor" | - "TimeSensorAsync" - )] => Replacement::SourceModuleMovedToProvider { - name: (*rest).to_string(), - module: "airflow.providers.standard.time.sensors.time", - provider: "standard", - version: "0.0.1" - }, - ["airflow", "sensors", "time_delta", rest @ ( - "TimeDeltaSensor" | - "TimeDeltaSensorAsync" | - "WaitSensor" - )] => Replacement::SourceModuleMovedToProvider { - name: (*rest).to_string(), - module: "airflow.providers.standard.time.sensors.time_delta", - provider: "standard", - version: "0.0.1" - }, - ["airflow", "sensors", "weekday", "DayOfWeekSensor"] => Replacement::ProviderName { - name: "airflow.providers.standard.time.sensors.weekday.DayOfWeekSensor", - provider: "standard", - version: "0.0.1" - }, - ["airflow", "triggers", "external_task", rest@ ( - "DagStateTrigger" | - "WorkflowTrigger" - )] => Replacement::SourceModuleMovedToProvider { - name: (*rest).to_string(), - module: "airflow.providers.standard.triggers.external_task", - provider: "standard", - version: "0.0.3" - }, - ["airflow", "triggers", "file", "FileTrigger"] => Replacement::ProviderName { - name: "airflow.providers.standard.triggers.file.FileTrigger", - provider: "standard", - version: "0.0.3" - }, - ["airflow", "triggers", "temporal", rest @ ( - "DateTimeTrigger" | - "TimeDeltaTrigger" - )] => Replacement::SourceModuleMovedToProvider { - name: (*rest).to_string(), - module: "airflow.providers.standard.triggers.temporal", - provider: "standard", - version: "0.0.3" - }, _ => return, }; diff --git a/crates/ruff_linter/src/rules/airflow/rules/suggested_to_move_to_provider_in_3.rs b/crates/ruff_linter/src/rules/airflow/rules/suggested_to_move_to_provider_in_3.rs new file mode 100644 index 0000000000..3fb23f6879 --- /dev/null +++ b/crates/ruff_linter/src/rules/airflow/rules/suggested_to_move_to_provider_in_3.rs @@ -0,0 +1,249 @@ +use crate::rules::airflow::helpers::ProviderReplacement; +use ruff_diagnostics::{Diagnostic, Violation}; +use ruff_macros::{derive_message_formats, ViolationMetadata}; +use ruff_python_ast::{Expr, ExprAttribute}; +use ruff_python_semantic::Modules; +use ruff_text_size::Ranged; +use ruff_text_size::TextRange; + +use crate::checkers::ast::Checker; + +/// ## What it does +/// Checks for uses of Airflow functions and values that have been moved to its providers +/// but still have a compatibility layer (e.g., `apache-airflow-providers-standard`). +/// +/// ## Why is this bad? +/// Airflow 3.0 moved various deprecated functions, members, and other +/// values to its providers. Even though these symbols still work fine on Airflow 3.0, +/// they are expected to be removed in a future version. The user is suggested to install +/// the corresponding provider and replace the original usage with the one in the provider. +/// +/// ## Example +/// ```python +/// from airflow.operators.python import PythonOperator +/// ``` +/// +/// Use instead: +/// ```python +/// from airflow.providers.standard.operators.python import PythonOperator +/// ``` +#[derive(ViolationMetadata)] +pub(crate) struct Airflow3SuggestedToMoveToProvider { + deprecated: String, + replacement: ProviderReplacement, +} + +impl Violation for Airflow3SuggestedToMoveToProvider { + #[derive_message_formats] + fn message(&self) -> String { + let Airflow3SuggestedToMoveToProvider { + deprecated, + replacement, + } = self; + match replacement { + ProviderReplacement::ProviderName { + name: _, + provider, + version: _, + } + | ProviderReplacement::SourceModuleMovedToProvider { + name: _, + module: _, + provider, + version: _, + } => { + format!("`{deprecated}` is deprecated and moved into `{provider}` provider in Airflow 3.0; \ + It still works in Airflow 3.0 but is expected to be removed in a future version." + ) + } + } + } + + fn fix_title(&self) -> Option { + let Airflow3SuggestedToMoveToProvider { replacement, .. } = self; + match replacement { + ProviderReplacement::ProviderName { + name, + provider, + version, + } => { + Some(format!( + "Install `apache-airflow-provider-{provider}>={version}` and use `{name}` instead." + )) + }, + ProviderReplacement::SourceModuleMovedToProvider { + name, + module, + provider, + version, + } => { + Some(format!("Install `apache-airflow-provider-{provider}>={version}` and use `{module}.{name}` instead.")) + } + } + } +} + +// AIR312 +pub(crate) fn suggested_to_move_to_provider_in_3(checker: &Checker, expr: &Expr) { + if !checker.semantic().seen_module(Modules::AIRFLOW) { + return; + } + + match expr { + Expr::Attribute(ExprAttribute { attr, .. }) => { + check_names_moved_to_provider(checker, expr, attr.range()); + } + Expr::Name(_) => check_names_moved_to_provider(checker, expr, expr.range()), + _ => {} + } +} + +fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRange) { + let Some(qualified_name) = checker.semantic().resolve_qualified_name(expr) else { + return; + }; + + let replacement = match qualified_name.segments() { + // apache-airflow-providers-standard + ["airflow", "hooks", "filesystem", "FSHook"] => ProviderReplacement::ProviderName { + name: "airflow.providers.standard.hooks.filesystem.FSHook", + provider: "standard", + version: "0.0.1", + }, + ["airflow", "hooks", "package_index", "PackageIndexHook"] => { + ProviderReplacement::ProviderName { + name: "airflow.providers.standard.hooks.package_index.PackageIndexHook", + provider: "standard", + version: "0.0.1", + } + } + ["airflow", "hooks", "subprocess", rest @ ("SubprocessHook" | "SubprocessResult" | "working_directory")] => { + ProviderReplacement::SourceModuleMovedToProvider { + name: (*rest).to_string(), + module: "airflow.providers.standard.hooks.subprocess", + provider: "standard", + version: "0.0.3", + } + } + ["airflow", "operators", "bash", "BashOperator"] => ProviderReplacement::ProviderName { + name: "airflow.providers.standard.operators.bash.BashOperator", + provider: "standard", + version: "0.0.1", + }, + ["airflow", "operators", "datetime", rest @ ("BranchDateTimeOperator" | "target_times_as_dates")] => { + ProviderReplacement::SourceModuleMovedToProvider { + name: (*rest).to_string(), + module: "airflow.providers.standard.time.operators.datetime", + provider: "standard", + version: "0.0.1", + } + } + ["airflow", "operators", "trigger_dagrun", rest @ ("TriggerDagRunLink" | "TriggerDagRunOperator")] => { + ProviderReplacement::SourceModuleMovedToProvider { + name: (*rest).to_string(), + module: "airflow.providers.standard.operators.trigger_dagrun", + provider: "standard", + version: "0.0.2", + } + } + ["airflow", "operators", "empty", "EmptyOperator"] => ProviderReplacement::ProviderName { + name: "airflow.providers.standard.operators.empty.EmptyOperator", + provider: "standard", + version: "0.0.2", + }, + ["airflow", "operators", "latest_only", "LatestOnlyOperator"] => { + ProviderReplacement::ProviderName { + name: "airflow.providers.standard.operators.latest_only.LatestOnlyOperator", + provider: "standard", + version: "0.0.3", + } + } + ["airflow", "operators", "python", rest @ ("BranchPythonOperator" + | "PythonOperator" + | "PythonVirtualenvOperator" + | "ShortCircuitOperator")] => ProviderReplacement::SourceModuleMovedToProvider { + name: (*rest).to_string(), + module: "airflow.providers.standard.operators.python", + provider: "standard", + version: "0.0.1", + }, + ["airflow", "operators", "weekday", "BranchDayOfWeekOperator"] => { + ProviderReplacement::ProviderName { + name: "airflow.providers.standard.time.operators.weekday.BranchDayOfWeekOperator", + provider: "standard", + version: "0.0.1", + } + } + ["airflow", "sensors", "date_time", rest @ ("DateTimeSensor" | "DateTimeSensorAsync")] => { + ProviderReplacement::SourceModuleMovedToProvider { + name: (*rest).to_string(), + module: "airflow.providers.standard.time.sensors.date_time", + provider: "standard", + version: "0.0.1", + } + } + ["airflow", "sensors", "external_task", rest @ ("ExternalTaskMarker" | "ExternalTaskSensor" | "ExternalTaskSensorLink")] => { + ProviderReplacement::SourceModuleMovedToProvider { + name: (*rest).to_string(), + module: "airflow.providers.standard.sensors.external_task", + provider: "standard", + version: "0.0.3", + } + } + ["airflow", "sensors", "filesystem", "FileSensor"] => ProviderReplacement::ProviderName { + name: "airflow.providers.standard.sensors.filesystem.FileSensor", + provider: "standard", + version: "0.0.2", + }, + ["airflow", "sensors", "time_sensor", rest @ ("TimeSensor" | "TimeSensorAsync")] => { + ProviderReplacement::SourceModuleMovedToProvider { + name: (*rest).to_string(), + module: "airflow.providers.standard.time.sensors.time", + provider: "standard", + version: "0.0.1", + } + } + ["airflow", "sensors", "time_delta", rest @ ("TimeDeltaSensor" | "TimeDeltaSensorAsync" | "WaitSensor")] => { + ProviderReplacement::SourceModuleMovedToProvider { + name: (*rest).to_string(), + module: "airflow.providers.standard.time.sensors.time_delta", + provider: "standard", + version: "0.0.1", + } + } + ["airflow", "sensors", "weekday", "DayOfWeekSensor"] => ProviderReplacement::ProviderName { + name: "airflow.providers.standard.time.sensors.weekday.DayOfWeekSensor", + provider: "standard", + version: "0.0.1", + }, + ["airflow", "triggers", "external_task", rest @ ("DagStateTrigger" | "WorkflowTrigger")] => { + ProviderReplacement::SourceModuleMovedToProvider { + name: (*rest).to_string(), + module: "airflow.providers.standard.triggers.external_task", + provider: "standard", + version: "0.0.3", + } + } + ["airflow", "triggers", "file", "FileTrigger"] => ProviderReplacement::ProviderName { + name: "airflow.providers.standard.triggers.file.FileTrigger", + provider: "standard", + version: "0.0.3", + }, + ["airflow", "triggers", "temporal", rest @ ("DateTimeTrigger" | "TimeDeltaTrigger")] => { + ProviderReplacement::SourceModuleMovedToProvider { + name: (*rest).to_string(), + module: "airflow.providers.standard.triggers.temporal", + provider: "standard", + version: "0.0.3", + } + } + _ => return, + }; + checker.report_diagnostic(Diagnostic::new( + Airflow3SuggestedToMoveToProvider { + deprecated: qualified_name.to_string(), + replacement, + }, + ranged.range(), + )); +} diff --git a/crates/ruff_linter/src/rules/airflow/snapshots/ruff_linter__rules__airflow__tests__AIR302_AIR302.py.snap b/crates/ruff_linter/src/rules/airflow/snapshots/ruff_linter__rules__airflow__tests__AIR302_AIR302.py.snap index 98794c7c39..511cdba795 100644 --- a/crates/ruff_linter/src/rules/airflow/snapshots/ruff_linter__rules__airflow__tests__AIR302_AIR302.py.snap +++ b/crates/ruff_linter/src/rules/airflow/snapshots/ruff_linter__rules__airflow__tests__AIR302_AIR302.py.snap @@ -183,17 +183,6 @@ AIR302.py:246:1: AIR302 `airflow.operators.sql.BaseSQLOperator` is moved into `c | = help: Install `apache-airflow-provider-common-sql>=1.1.0` and use `airflow.providers.common.sql.operators.sql.BaseSQLOperator` instead. -AIR302.py:247:1: AIR302 `airflow.operators.bash.BashOperator` is moved into `standard` provider in Airflow 3.0; - | -245 | parse_boolean() -246 | BaseSQLOperator() -247 | BashOperator() - | ^^^^^^^^^^^^ AIR302 -248 | LegacyBashOperator() -249 | BranchSQLOperator() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.operators.bash.BashOperator` instead. - AIR302.py:248:1: AIR302 `airflow.operators.bash_operator.BashOperator` is moved into `standard` provider in Airflow 3.0; | 246 | BaseSQLOperator() @@ -1529,82 +1518,6 @@ AIR302.py:422:1: AIR302 `airflow.operators.email_operator.EmailOperator` is move | = help: Install `apache-airflow-provider-smtp>=1.0.0` and use `airflow.providers.smtp.operators.smtp.EmailOperator` instead. -AIR302.py:425:1: AIR302 `airflow.operators.datetime.BranchDateTimeOperator` is moved into `standard` provider in Airflow 3.0; - | -424 | # apache-airflow-providers-standard -425 | BranchDateTimeOperator() - | ^^^^^^^^^^^^^^^^^^^^^^ AIR302 -426 | BranchDayOfWeekOperator() -427 | BranchPythonOperator() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.operators.datetime.BranchDateTimeOperator` instead. - -AIR302.py:426:1: AIR302 `airflow.operators.weekday.BranchDayOfWeekOperator` is moved into `standard` provider in Airflow 3.0; - | -424 | # apache-airflow-providers-standard -425 | BranchDateTimeOperator() -426 | BranchDayOfWeekOperator() - | ^^^^^^^^^^^^^^^^^^^^^^^ AIR302 -427 | BranchPythonOperator() -428 | DateTimeSensor() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.operators.weekday.BranchDayOfWeekOperator` instead. - -AIR302.py:427:1: AIR302 `airflow.operators.python.BranchPythonOperator` is moved into `standard` provider in Airflow 3.0; - | -425 | BranchDateTimeOperator() -426 | BranchDayOfWeekOperator() -427 | BranchPythonOperator() - | ^^^^^^^^^^^^^^^^^^^^ AIR302 -428 | DateTimeSensor() -429 | DateTimeSensorAsync() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.operators.python.BranchPythonOperator` instead. - -AIR302.py:429:1: AIR302 `airflow.sensors.date_time.DateTimeSensorAsync` is moved into `standard` provider in Airflow 3.0; - | -427 | BranchPythonOperator() -428 | DateTimeSensor() -429 | DateTimeSensorAsync() - | ^^^^^^^^^^^^^^^^^^^ AIR302 -430 | TimeSensor() -431 | TimeDeltaSensor() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.sensors.date_time.DateTimeSensorAsync` instead. - -AIR302.py:430:1: AIR302 `airflow.sensors.time_sensor.TimeSensor` is moved into `standard` provider in Airflow 3.0; - | -428 | DateTimeSensor() -429 | DateTimeSensorAsync() -430 | TimeSensor() - | ^^^^^^^^^^ AIR302 -431 | TimeDeltaSensor() -432 | DayOfWeekSensor() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.sensors.time.TimeSensor` instead. - -AIR302.py:431:1: AIR302 `airflow.sensors.time_delta.TimeDeltaSensor` is moved into `standard` provider in Airflow 3.0; - | -429 | DateTimeSensorAsync() -430 | TimeSensor() -431 | TimeDeltaSensor() - | ^^^^^^^^^^^^^^^ AIR302 -432 | DayOfWeekSensor() -433 | DummyOperator() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.sensors.time_delta.TimeDeltaSensor` instead. - -AIR302.py:432:1: AIR302 `airflow.sensors.weekday.DayOfWeekSensor` is moved into `standard` provider in Airflow 3.0; - | -430 | TimeSensor() -431 | TimeDeltaSensor() -432 | DayOfWeekSensor() - | ^^^^^^^^^^^^^^^ AIR302 -433 | DummyOperator() -434 | EmptyOperator() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.sensors.weekday.DayOfWeekSensor` instead. - AIR302.py:433:1: AIR302 `airflow.operators.dummy.DummyOperator` is moved into `standard` provider in Airflow 3.0; | 431 | TimeDeltaSensor() @@ -1626,319 +1539,3 @@ AIR302.py:434:1: AIR302 `airflow.operators.dummy.EmptyOperator` is moved into `s 436 | ExternalTaskSensor() | = help: Install `apache-airflow-provider-standard>=0.0.2` and use `airflow.providers.standard.operators.empty.EmptyOperator` instead. - -AIR302.py:435:1: AIR302 `airflow.sensors.external_task.ExternalTaskMarker` is moved into `standard` provider in Airflow 3.0; - | -433 | DummyOperator() -434 | EmptyOperator() -435 | ExternalTaskMarker() - | ^^^^^^^^^^^^^^^^^^ AIR302 -436 | ExternalTaskSensor() -437 | ExternalTaskSensorLink() - | - = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.sensors.external_task.ExternalTaskMarker` instead. - -AIR302.py:436:1: AIR302 `airflow.sensors.external_task.ExternalTaskSensor` is moved into `standard` provider in Airflow 3.0; - | -434 | EmptyOperator() -435 | ExternalTaskMarker() -436 | ExternalTaskSensor() - | ^^^^^^^^^^^^^^^^^^ AIR302 -437 | ExternalTaskSensorLink() -438 | FileSensor() - | - = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.sensors.external_task.ExternalTaskSensor` instead. - -AIR302.py:437:1: AIR302 `airflow.sensors.external_task.ExternalTaskSensorLink` is moved into `standard` provider in Airflow 3.0; - | -435 | ExternalTaskMarker() -436 | ExternalTaskSensor() -437 | ExternalTaskSensorLink() - | ^^^^^^^^^^^^^^^^^^^^^^ AIR302 -438 | FileSensor() -439 | FileTrigger() - | - = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.sensors.external_task.ExternalTaskSensorLink` instead. - -AIR302.py:438:1: AIR302 `airflow.sensors.filesystem.FileSensor` is moved into `standard` provider in Airflow 3.0; - | -436 | ExternalTaskSensor() -437 | ExternalTaskSensorLink() -438 | FileSensor() - | ^^^^^^^^^^ AIR302 -439 | FileTrigger() -440 | FSHook() - | - = help: Install `apache-airflow-provider-standard>=0.0.2` and use `airflow.providers.standard.sensors.filesystem.FileSensor` instead. - -AIR302.py:439:1: AIR302 `airflow.triggers.file.FileTrigger` is moved into `standard` provider in Airflow 3.0; - | -437 | ExternalTaskSensorLink() -438 | FileSensor() -439 | FileTrigger() - | ^^^^^^^^^^^ AIR302 -440 | FSHook() -441 | PackageIndexHook() - | - = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.triggers.file.FileTrigger` instead. - -AIR302.py:440:1: AIR302 `airflow.hooks.filesystem.FSHook` is moved into `standard` provider in Airflow 3.0; - | -438 | FileSensor() -439 | FileTrigger() -440 | FSHook() - | ^^^^^^ AIR302 -441 | PackageIndexHook() -442 | SubprocessHook() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.hooks.filesystem.FSHook` instead. - -AIR302.py:441:1: AIR302 `airflow.hooks.package_index.PackageIndexHook` is moved into `standard` provider in Airflow 3.0; - | -439 | FileTrigger() -440 | FSHook() -441 | PackageIndexHook() - | ^^^^^^^^^^^^^^^^ AIR302 -442 | SubprocessHook() -443 | ShortCircuitOperator() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.hooks.package_index.PackageIndexHook` instead. - -AIR302.py:442:1: AIR302 `airflow.hooks.subprocess.SubprocessHook` is moved into `standard` provider in Airflow 3.0; - | -440 | FSHook() -441 | PackageIndexHook() -442 | SubprocessHook() - | ^^^^^^^^^^^^^^ AIR302 -443 | ShortCircuitOperator() -444 | TimeDeltaSensor() - | - = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.hooks.subprocess.SubprocessHook` instead. - -AIR302.py:443:1: AIR302 `airflow.operators.python.ShortCircuitOperator` is moved into `standard` provider in Airflow 3.0; - | -441 | PackageIndexHook() -442 | SubprocessHook() -443 | ShortCircuitOperator() - | ^^^^^^^^^^^^^^^^^^^^ AIR302 -444 | TimeDeltaSensor() -445 | TimeSensor() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.operators.python.ShortCircuitOperator` instead. - -AIR302.py:444:1: AIR302 `airflow.sensors.time_delta.TimeDeltaSensor` is moved into `standard` provider in Airflow 3.0; - | -442 | SubprocessHook() -443 | ShortCircuitOperator() -444 | TimeDeltaSensor() - | ^^^^^^^^^^^^^^^ AIR302 -445 | TimeSensor() -446 | TriggerDagRunOperator() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.sensors.time_delta.TimeDeltaSensor` instead. - -AIR302.py:445:1: AIR302 `airflow.sensors.time_sensor.TimeSensor` is moved into `standard` provider in Airflow 3.0; - | -443 | ShortCircuitOperator() -444 | TimeDeltaSensor() -445 | TimeSensor() - | ^^^^^^^^^^ AIR302 -446 | TriggerDagRunOperator() -447 | WorkflowTrigger() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.sensors.time.TimeSensor` instead. - -AIR302.py:446:1: AIR302 `airflow.operators.trigger_dagrun.TriggerDagRunOperator` is moved into `standard` provider in Airflow 3.0; - | -444 | TimeDeltaSensor() -445 | TimeSensor() -446 | TriggerDagRunOperator() - | ^^^^^^^^^^^^^^^^^^^^^ AIR302 -447 | WorkflowTrigger() -448 | PythonOperator() - | - = help: Install `apache-airflow-provider-standard>=0.0.2` and use `airflow.providers.standard.operators.trigger_dagrun.TriggerDagRunOperator` instead. - -AIR302.py:447:1: AIR302 `airflow.triggers.external_task.WorkflowTrigger` is moved into `standard` provider in Airflow 3.0; - | -445 | TimeSensor() -446 | TriggerDagRunOperator() -447 | WorkflowTrigger() - | ^^^^^^^^^^^^^^^ AIR302 -448 | PythonOperator() -449 | PythonVirtualenvOperator() - | - = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.triggers.external_task.WorkflowTrigger` instead. - -AIR302.py:448:1: AIR302 `airflow.operators.python.PythonOperator` is moved into `standard` provider in Airflow 3.0; - | -446 | TriggerDagRunOperator() -447 | WorkflowTrigger() -448 | PythonOperator() - | ^^^^^^^^^^^^^^ AIR302 -449 | PythonVirtualenvOperator() -450 | DagStateTrigger() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.operators.python.PythonOperator` instead. - -AIR302.py:449:1: AIR302 `airflow.operators.python.PythonVirtualenvOperator` is moved into `standard` provider in Airflow 3.0; - | -447 | WorkflowTrigger() -448 | PythonOperator() -449 | PythonVirtualenvOperator() - | ^^^^^^^^^^^^^^^^^^^^^^^^ AIR302 -450 | DagStateTrigger() -451 | FileTrigger() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.operators.python.PythonVirtualenvOperator` instead. - -AIR302.py:450:1: AIR302 `airflow.triggers.external_task.DagStateTrigger` is moved into `standard` provider in Airflow 3.0; - | -448 | PythonOperator() -449 | PythonVirtualenvOperator() -450 | DagStateTrigger() - | ^^^^^^^^^^^^^^^ AIR302 -451 | FileTrigger() -452 | DateTimeTrigger() - | - = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.triggers.external_task.DagStateTrigger` instead. - -AIR302.py:451:1: AIR302 `airflow.triggers.file.FileTrigger` is moved into `standard` provider in Airflow 3.0; - | -449 | PythonVirtualenvOperator() -450 | DagStateTrigger() -451 | FileTrigger() - | ^^^^^^^^^^^ AIR302 -452 | DateTimeTrigger() -453 | TimeDeltaTrigger() - | - = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.triggers.file.FileTrigger` instead. - -AIR302.py:452:1: AIR302 `airflow.triggers.temporal.DateTimeTrigger` is moved into `standard` provider in Airflow 3.0; - | -450 | DagStateTrigger() -451 | FileTrigger() -452 | DateTimeTrigger() - | ^^^^^^^^^^^^^^^ AIR302 -453 | TimeDeltaTrigger() -454 | SubprocessResult() - | - = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.triggers.temporal.DateTimeTrigger` instead. - -AIR302.py:453:1: AIR302 `airflow.triggers.temporal.TimeDeltaTrigger` is moved into `standard` provider in Airflow 3.0; - | -451 | FileTrigger() -452 | DateTimeTrigger() -453 | TimeDeltaTrigger() - | ^^^^^^^^^^^^^^^^ AIR302 -454 | SubprocessResult() -455 | working_directory() - | - = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.triggers.temporal.TimeDeltaTrigger` instead. - -AIR302.py:454:1: AIR302 `airflow.hooks.subprocess.SubprocessResult` is moved into `standard` provider in Airflow 3.0; - | -452 | DateTimeTrigger() -453 | TimeDeltaTrigger() -454 | SubprocessResult() - | ^^^^^^^^^^^^^^^^ AIR302 -455 | working_directory() -456 | SubprocessHook() - | - = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.hooks.subprocess.SubprocessResult` instead. - -AIR302.py:455:1: AIR302 `airflow.hooks.subprocess.working_directory` is moved into `standard` provider in Airflow 3.0; - | -453 | TimeDeltaTrigger() -454 | SubprocessResult() -455 | working_directory() - | ^^^^^^^^^^^^^^^^^ AIR302 -456 | SubprocessHook() -457 | TimeDeltaSensor() - | - = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.hooks.subprocess.working_directory` instead. - -AIR302.py:456:1: AIR302 `airflow.hooks.subprocess.SubprocessHook` is moved into `standard` provider in Airflow 3.0; - | -454 | SubprocessResult() -455 | working_directory() -456 | SubprocessHook() - | ^^^^^^^^^^^^^^ AIR302 -457 | TimeDeltaSensor() -458 | TimeDeltaSensorAsync() - | - = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.hooks.subprocess.SubprocessHook` instead. - -AIR302.py:457:1: AIR302 `airflow.sensors.time_delta.TimeDeltaSensor` is moved into `standard` provider in Airflow 3.0; - | -455 | working_directory() -456 | SubprocessHook() -457 | TimeDeltaSensor() - | ^^^^^^^^^^^^^^^ AIR302 -458 | TimeDeltaSensorAsync() -459 | WaitSensor() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.sensors.time_delta.TimeDeltaSensor` instead. - -AIR302.py:458:1: AIR302 `airflow.sensors.time_delta.TimeDeltaSensorAsync` is moved into `standard` provider in Airflow 3.0; - | -456 | SubprocessHook() -457 | TimeDeltaSensor() -458 | TimeDeltaSensorAsync() - | ^^^^^^^^^^^^^^^^^^^^ AIR302 -459 | WaitSensor() -460 | TimeSensor() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.sensors.time_delta.TimeDeltaSensorAsync` instead. - -AIR302.py:459:1: AIR302 `airflow.sensors.time_delta.WaitSensor` is moved into `standard` provider in Airflow 3.0; - | -457 | TimeDeltaSensor() -458 | TimeDeltaSensorAsync() -459 | WaitSensor() - | ^^^^^^^^^^ AIR302 -460 | TimeSensor() -461 | TimeSensorAsync() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.sensors.time_delta.WaitSensor` instead. - -AIR302.py:460:1: AIR302 `airflow.sensors.time_sensor.TimeSensor` is moved into `standard` provider in Airflow 3.0; - | -458 | TimeDeltaSensorAsync() -459 | WaitSensor() -460 | TimeSensor() - | ^^^^^^^^^^ AIR302 -461 | TimeSensorAsync() -462 | BranchDateTimeOperator() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.sensors.time.TimeSensor` instead. - -AIR302.py:461:1: AIR302 `airflow.sensors.time_sensor.TimeSensorAsync` is moved into `standard` provider in Airflow 3.0; - | -459 | WaitSensor() -460 | TimeSensor() -461 | TimeSensorAsync() - | ^^^^^^^^^^^^^^^ AIR302 -462 | BranchDateTimeOperator() -463 | target_times_as_dates() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.sensors.time.TimeSensorAsync` instead. - -AIR302.py:462:1: AIR302 `airflow.operators.datetime.BranchDateTimeOperator` is moved into `standard` provider in Airflow 3.0; - | -460 | TimeSensor() -461 | TimeSensorAsync() -462 | BranchDateTimeOperator() - | ^^^^^^^^^^^^^^^^^^^^^^ AIR302 -463 | target_times_as_dates() - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.operators.datetime.BranchDateTimeOperator` instead. - -AIR302.py:463:1: AIR302 `airflow.operators.datetime.target_times_as_dates` is moved into `standard` provider in Airflow 3.0; - | -461 | TimeSensorAsync() -462 | BranchDateTimeOperator() -463 | target_times_as_dates() - | ^^^^^^^^^^^^^^^^^^^^^ AIR302 - | - = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.operators.datetime.target_times_as_dates` instead. diff --git a/crates/ruff_linter/src/rules/airflow/snapshots/ruff_linter__rules__airflow__tests__AIR312_AIR312.py.snap b/crates/ruff_linter/src/rules/airflow/snapshots/ruff_linter__rules__airflow__tests__AIR312_AIR312.py.snap new file mode 100644 index 0000000000..71877501cd --- /dev/null +++ b/crates/ruff_linter/src/rules/airflow/snapshots/ruff_linter__rules__airflow__tests__AIR312_AIR312.py.snap @@ -0,0 +1,370 @@ +--- +source: crates/ruff_linter/src/rules/airflow/mod.rs +--- +AIR312.py:32:1: AIR312 `airflow.hooks.filesystem.FSHook` 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. + | +30 | from airflow.triggers.temporal import DateTimeTrigger, TimeDeltaTrigger +31 | +32 | FSHook() + | ^^^^^^ AIR312 +33 | PackageIndexHook() +34 | SubprocessHook(), SubprocessResult(), working_directory() + | + = help: Install `apache-airflow-provider-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. + | +32 | FSHook() +33 | PackageIndexHook() + | ^^^^^^^^^^^^^^^^ AIR312 +34 | SubprocessHook(), SubprocessResult(), working_directory() +35 | BashOperator() + | + = help: Install `apache-airflow-provider-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. + | +32 | FSHook() +33 | PackageIndexHook() +34 | SubprocessHook(), SubprocessResult(), working_directory() + | ^^^^^^^^^^^^^^ AIR312 +35 | BashOperator() +36 | BranchDateTimeOperator(), target_times_as_dates() + | + = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.hooks.subprocess.SubprocessHook` instead. + +AIR312.py:34:19: AIR312 `airflow.hooks.subprocess.SubprocessResult` 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. + | +32 | FSHook() +33 | PackageIndexHook() +34 | SubprocessHook(), SubprocessResult(), working_directory() + | ^^^^^^^^^^^^^^^^ AIR312 +35 | BashOperator() +36 | BranchDateTimeOperator(), target_times_as_dates() + | + = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.hooks.subprocess.SubprocessResult` instead. + +AIR312.py:34:39: AIR312 `airflow.hooks.subprocess.working_directory` 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. + | +32 | FSHook() +33 | PackageIndexHook() +34 | SubprocessHook(), SubprocessResult(), working_directory() + | ^^^^^^^^^^^^^^^^^ AIR312 +35 | BashOperator() +36 | BranchDateTimeOperator(), target_times_as_dates() + | + = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.hooks.subprocess.working_directory` 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. + | +33 | PackageIndexHook() +34 | SubprocessHook(), SubprocessResult(), working_directory() +35 | BashOperator() + | ^^^^^^^^^^^^ AIR312 +36 | BranchDateTimeOperator(), target_times_as_dates() +37 | TriggerDagRunLink(), TriggerDagRunOperator() + | + = help: Install `apache-airflow-provider-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. + | +34 | SubprocessHook(), SubprocessResult(), working_directory() +35 | BashOperator() +36 | BranchDateTimeOperator(), target_times_as_dates() + | ^^^^^^^^^^^^^^^^^^^^^^ AIR312 +37 | TriggerDagRunLink(), TriggerDagRunOperator() +38 | EmptyOperator() + | + = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.operators.datetime.BranchDateTimeOperator` instead. + +AIR312.py:36:27: AIR312 `airflow.operators.datetime.target_times_as_dates` 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. + | +34 | SubprocessHook(), SubprocessResult(), working_directory() +35 | BashOperator() +36 | BranchDateTimeOperator(), target_times_as_dates() + | ^^^^^^^^^^^^^^^^^^^^^ AIR312 +37 | TriggerDagRunLink(), TriggerDagRunOperator() +38 | EmptyOperator() + | + = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.operators.datetime.target_times_as_dates` instead. + +AIR312.py:37:1: AIR312 `airflow.operators.trigger_dagrun.TriggerDagRunLink` 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. + | +35 | BashOperator() +36 | BranchDateTimeOperator(), target_times_as_dates() +37 | TriggerDagRunLink(), TriggerDagRunOperator() + | ^^^^^^^^^^^^^^^^^ AIR312 +38 | EmptyOperator() +39 | LatestOnlyOperator() + | + = help: Install `apache-airflow-provider-standard>=0.0.2` and use `airflow.providers.standard.operators.trigger_dagrun.TriggerDagRunLink` instead. + +AIR312.py:37:22: 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. + | +35 | BashOperator() +36 | BranchDateTimeOperator(), target_times_as_dates() +37 | TriggerDagRunLink(), TriggerDagRunOperator() + | ^^^^^^^^^^^^^^^^^^^^^ AIR312 +38 | EmptyOperator() +39 | LatestOnlyOperator() + | + = help: Install `apache-airflow-provider-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. + | +36 | BranchDateTimeOperator(), target_times_as_dates() +37 | TriggerDagRunLink(), TriggerDagRunOperator() +38 | EmptyOperator() + | ^^^^^^^^^^^^^ AIR312 +39 | LatestOnlyOperator() +40 | ( + | + = help: Install `apache-airflow-provider-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. + | +37 | TriggerDagRunLink(), TriggerDagRunOperator() +38 | EmptyOperator() +39 | LatestOnlyOperator() + | ^^^^^^^^^^^^^^^^^^ AIR312 +40 | ( +41 | BranchPythonOperator(), + | + = help: Install `apache-airflow-provider-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. + | +39 | LatestOnlyOperator() +40 | ( +41 | BranchPythonOperator(), + | ^^^^^^^^^^^^^^^^^^^^ AIR312 +42 | PythonOperator(), +43 | PythonVirtualenvOperator(), + | + = help: Install `apache-airflow-provider-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. + | +40 | ( +41 | BranchPythonOperator(), +42 | PythonOperator(), + | ^^^^^^^^^^^^^^ AIR312 +43 | PythonVirtualenvOperator(), +44 | ShortCircuitOperator(), + | + = help: Install `apache-airflow-provider-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. + | +41 | BranchPythonOperator(), +42 | PythonOperator(), +43 | PythonVirtualenvOperator(), + | ^^^^^^^^^^^^^^^^^^^^^^^^ AIR312 +44 | ShortCircuitOperator(), +45 | ) + | + = help: Install `apache-airflow-provider-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. + | +42 | PythonOperator(), +43 | PythonVirtualenvOperator(), +44 | ShortCircuitOperator(), + | ^^^^^^^^^^^^^^^^^^^^ AIR312 +45 | ) +46 | BranchDayOfWeekOperator() + | + = help: Install `apache-airflow-provider-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. + | +44 | ShortCircuitOperator(), +45 | ) +46 | BranchDayOfWeekOperator() + | ^^^^^^^^^^^^^^^^^^^^^^^ AIR312 +47 | DateTimeSensor(), DateTimeSensorAsync() +48 | ExternalTaskMarker(), ExternalTaskSensor(), ExternalTaskSensorLink() + | + = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.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. + | +45 | ) +46 | BranchDayOfWeekOperator() +47 | DateTimeSensor(), DateTimeSensorAsync() + | ^^^^^^^^^^^^^^ AIR312 +48 | ExternalTaskMarker(), ExternalTaskSensor(), ExternalTaskSensorLink() +49 | FileSensor() + | + = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.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. + | +45 | ) +46 | BranchDayOfWeekOperator() +47 | DateTimeSensor(), DateTimeSensorAsync() + | ^^^^^^^^^^^^^^^^^^^ AIR312 +48 | ExternalTaskMarker(), ExternalTaskSensor(), ExternalTaskSensorLink() +49 | FileSensor() + | + = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.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. + | +46 | BranchDayOfWeekOperator() +47 | DateTimeSensor(), DateTimeSensorAsync() +48 | ExternalTaskMarker(), ExternalTaskSensor(), ExternalTaskSensorLink() + | ^^^^^^^^^^^^^^^^^^ AIR312 +49 | FileSensor() +50 | TimeSensor(), TimeSensorAsync() + | + = help: Install `apache-airflow-provider-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. + | +46 | BranchDayOfWeekOperator() +47 | DateTimeSensor(), DateTimeSensorAsync() +48 | ExternalTaskMarker(), ExternalTaskSensor(), ExternalTaskSensorLink() + | ^^^^^^^^^^^^^^^^^^ AIR312 +49 | FileSensor() +50 | TimeSensor(), TimeSensorAsync() + | + = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.sensors.external_task.ExternalTaskSensor` instead. + +AIR312.py:48:45: AIR312 `airflow.sensors.external_task.ExternalTaskSensorLink` 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. + | +46 | BranchDayOfWeekOperator() +47 | DateTimeSensor(), DateTimeSensorAsync() +48 | ExternalTaskMarker(), ExternalTaskSensor(), ExternalTaskSensorLink() + | ^^^^^^^^^^^^^^^^^^^^^^ AIR312 +49 | FileSensor() +50 | TimeSensor(), TimeSensorAsync() + | + = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.sensors.external_task.ExternalTaskSensorLink` 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. + | +47 | DateTimeSensor(), DateTimeSensorAsync() +48 | ExternalTaskMarker(), ExternalTaskSensor(), ExternalTaskSensorLink() +49 | FileSensor() + | ^^^^^^^^^^ AIR312 +50 | TimeSensor(), TimeSensorAsync() +51 | TimeDeltaSensor(), TimeDeltaSensorAsync(), WaitSensor() + | + = help: Install `apache-airflow-provider-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. + | +48 | ExternalTaskMarker(), ExternalTaskSensor(), ExternalTaskSensorLink() +49 | FileSensor() +50 | TimeSensor(), TimeSensorAsync() + | ^^^^^^^^^^ AIR312 +51 | TimeDeltaSensor(), TimeDeltaSensorAsync(), WaitSensor() +52 | DayOfWeekSensor() + | + = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.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. + | +48 | ExternalTaskMarker(), ExternalTaskSensor(), ExternalTaskSensorLink() +49 | FileSensor() +50 | TimeSensor(), TimeSensorAsync() + | ^^^^^^^^^^^^^^^ AIR312 +51 | TimeDeltaSensor(), TimeDeltaSensorAsync(), WaitSensor() +52 | DayOfWeekSensor() + | + = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.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. + | +49 | FileSensor() +50 | TimeSensor(), TimeSensorAsync() +51 | TimeDeltaSensor(), TimeDeltaSensorAsync(), WaitSensor() + | ^^^^^^^^^^^^^^^ AIR312 +52 | DayOfWeekSensor() +53 | DagStateTrigger(), WorkflowTrigger() + | + = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.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. + | +49 | FileSensor() +50 | TimeSensor(), TimeSensorAsync() +51 | TimeDeltaSensor(), TimeDeltaSensorAsync(), WaitSensor() + | ^^^^^^^^^^^^^^^^^^^^ AIR312 +52 | DayOfWeekSensor() +53 | DagStateTrigger(), WorkflowTrigger() + | + = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.sensors.time_delta.TimeDeltaSensorAsync` instead. + +AIR312.py:51:44: AIR312 `airflow.sensors.time_delta.WaitSensor` 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. + | +49 | FileSensor() +50 | TimeSensor(), TimeSensorAsync() +51 | TimeDeltaSensor(), TimeDeltaSensorAsync(), WaitSensor() + | ^^^^^^^^^^ AIR312 +52 | DayOfWeekSensor() +53 | DagStateTrigger(), WorkflowTrigger() + | + = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.sensors.time_delta.WaitSensor` 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. + | +50 | TimeSensor(), TimeSensorAsync() +51 | TimeDeltaSensor(), TimeDeltaSensorAsync(), WaitSensor() +52 | DayOfWeekSensor() + | ^^^^^^^^^^^^^^^ AIR312 +53 | DagStateTrigger(), WorkflowTrigger() +54 | FileTrigger() + | + = help: Install `apache-airflow-provider-standard>=0.0.1` and use `airflow.providers.standard.time.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. + | +51 | TimeDeltaSensor(), TimeDeltaSensorAsync(), WaitSensor() +52 | DayOfWeekSensor() +53 | DagStateTrigger(), WorkflowTrigger() + | ^^^^^^^^^^^^^^^ AIR312 +54 | FileTrigger() +55 | DateTimeTrigger(), TimeDeltaTrigger() + | + = help: Install `apache-airflow-provider-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. + | +51 | TimeDeltaSensor(), TimeDeltaSensorAsync(), WaitSensor() +52 | DayOfWeekSensor() +53 | DagStateTrigger(), WorkflowTrigger() + | ^^^^^^^^^^^^^^^ AIR312 +54 | FileTrigger() +55 | DateTimeTrigger(), TimeDeltaTrigger() + | + = help: Install `apache-airflow-provider-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. + | +52 | DayOfWeekSensor() +53 | DagStateTrigger(), WorkflowTrigger() +54 | FileTrigger() + | ^^^^^^^^^^^ AIR312 +55 | DateTimeTrigger(), TimeDeltaTrigger() + | + = help: Install `apache-airflow-provider-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. + | +53 | DagStateTrigger(), WorkflowTrigger() +54 | FileTrigger() +55 | DateTimeTrigger(), TimeDeltaTrigger() + | ^^^^^^^^^^^^^^^ AIR312 + | + = help: Install `apache-airflow-provider-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. + | +53 | DagStateTrigger(), WorkflowTrigger() +54 | FileTrigger() +55 | DateTimeTrigger(), TimeDeltaTrigger() + | ^^^^^^^^^^^^^^^^ AIR312 + | + = help: Install `apache-airflow-provider-standard>=0.0.3` and use `airflow.providers.standard.triggers.temporal.TimeDeltaTrigger` instead. diff --git a/ruff.schema.json b/ruff.schema.json index 37298eca81..ec46aedbc8 100644 --- a/ruff.schema.json +++ b/ruff.schema.json @@ -2948,6 +2948,8 @@ "AIR30", "AIR301", "AIR302", + "AIR31", + "AIR312", "ALL", "ANN", "ANN0",