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",