[airflow]: extend removed names (AIR302) (#14804)

## Summary

Airflow 3.0 removes various deprecated functions, members, modules, and
other values. They have been deprecated in 2.x, but the removal causes
incompatibilities that we want to detect. This PR deprecates the
following names.
The full list of rules we will extend
https://github.com/apache/airflow/issues/44556


#### package
* `airflow.contrib.*` 

#### module
* `airflow.operators.subdag.*` 

#### class
* `airflow.sensors.external_task.ExternalTaskSensorLink` →
`airflow.sensors.external_task.ExternalDagLin`
* `airflow.operators.bash_operator.BashOperator` →
`airflow.operators.bash.BashOperator`
* `airflow.operators.branch_operator.BaseBranchOperator` →
`airflow.operators.branch.BaseBranchOperator`
* `airflow.operators.dummy.EmptyOperator` →
`airflow.operators.empty.EmptyOperator`
* `airflow.operators.dummy.DummyOperator` →
`airflow.operators.empty.EmptyOperator`
* `airflow.operators.dummy_operator.EmptyOperator` →
`airflow.operators.empty.EmptyOperator`
* `airflow.operators.dummy_operator.DummyOperator` →
`airflow.operators.empty.EmptyOperator`
* `airflow.operators.email_operator.EmailOperator` →
`airflow.operators.email.EmailOperator`
* `airflow.sensors.base_sensor_operator.BaseSensorOperator` →
`airflow.sensors.base.BaseSensorOperator`
* `airflow.sensors.date_time_sensor.DateTimeSensor` →
`airflow.sensors.date_time.DateTimeSensor`
* `airflow.sensors.external_task_sensor.ExternalTaskMarker` →
`airflow.sensors.external_task.ExternalTaskMarker`
* `airflow.sensors.external_task_sensor.ExternalTaskSensor` →
`airflow.sensors.external_task.ExternalTaskSensor`
* `airflow.sensors.external_task_sensor.ExternalTaskSensorLink` →
`airflow.sensors.external_task.ExternalTaskSensorLink`
* `airflow.sensors.time_delta_sensor.TimeDeltaSensor` →
`airflow.sensors.time_delta.TimeDeltaSensor`

#### function
* `airflow.utils.decorators.apply_defaults`
* `airflow.www.utils.get_sensitive_variables_fields` →
`airflow.utils.log.secrets_masker.get_sensitive_variables_fields`
* `airflow.www.utils.should_hide_value_for_key` →
`airflow.utils.log.secrets_masker.should_hide_value_for_key`
* `airflow.configuration.get` → `airflow.configuration.conf.get` 
* `airflow.configuration.getboolean` →
`airflow.configuration.conf.getboolean`
* `airflow.configuration.getfloat` →
`airflow.configuration.conf.getfloat`
* `airflow.configuration.getint` → `airflow.configuration.conf.getint` 
* `airflow.configuration.has_option` →
`airflow.configuration.conf.has_option`
* `airflow.configuration.remove_option` →
`airflow.configuration.conf.remove_option`
* `airflow.configuration.as_dict` → `airflow.configuration.conf.as_dict`
* `airflow.configuration.set` → `airflow.configuration.conf.set` 
* `airflow.secrets.local_filesystem.load_connections` →
`airflow.secrets.local_filesystem.load_connections_dict`
* `airflow.secrets.local_filesystem.get_connection` →
`airflow.secrets.local_filesystem.load_connections_dict`
* `airflow.utils.helpers.chain` → `airflow.models.baseoperator.chain` 
* `airflow.utils.helpers.cross_downstream` →
`airflow.models.baseoperator.cross_downstream`

#### attribute
* in `airflow.utils.trigger_rule.TriggerRule`
    * `DUMMY` 
    * `NONE_FAILED_OR_SKIPPED` 

#### constant / variable
* `airflow.PY\d\d`
This commit is contained in:
Wei Lee 2024-12-06 18:34:48 +08:00 committed by GitHub
parent 918358aaa6
commit 39623f8d40
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 723 additions and 99 deletions

View file

@ -1,8 +1,35 @@
from airflow import PY36, PY37, PY38, PY39, PY310, PY311, PY312
from airflow.triggers.external_task import TaskStateTrigger from airflow.triggers.external_task import TaskStateTrigger
from airflow.www.auth import has_access
from airflow.api_connexion.security import requires_access from airflow.api_connexion.security import requires_access
from airflow.configuration import (
get,
getboolean,
getfloat,
getint,
has_option,
remove_option,
as_dict,
set,
)
from airflow.contrib.aws_athena_hook import AWSAthenaHook
from airflow.metrics.validators import AllowListValidator from airflow.metrics.validators import AllowListValidator
from airflow.metrics.validators import BlockListValidator from airflow.metrics.validators import BlockListValidator
from airflow.operators.subdag import SubDagOperator
from airflow.sensors.external_task import ExternalTaskSensorLink
from airflow.operators.bash_operator import BashOperator
from airflow.operators.branch_operator import BaseBranchOperator
from airflow.operators.dummy import EmptyOperator, DummyOperator
from airflow.operators import dummy_operator
from airflow.operators.email_operator import EmailOperator
from airflow.sensors.base_sensor_operator import BaseSensorOperator
from airflow.sensors.date_time_sensor import DateTimeSensor
from airflow.sensors.external_task_sensor import (
ExternalTaskMarker,
ExternalTaskSensor,
ExternalTaskSensorLink,
)
from airflow.sensors.time_delta_sensor import TimeDeltaSensor
from airflow.secrets.local_filesystem import get_connection, load_connections
from airflow.utils import dates from airflow.utils import dates
from airflow.utils.dates import ( from airflow.utils.dates import (
date_range, date_range,
@ -13,20 +40,27 @@ from airflow.utils.dates import (
round_time, round_time,
scale_time_units, scale_time_units,
) )
from airflow.utils.decorators import apply_defaults
from airflow.utils.file import TemporaryDirectory, mkdirs from airflow.utils.file import TemporaryDirectory, mkdirs
from airflow.utils.helpers import chain, cross_downstream
from airflow.utils.state import SHUTDOWN, terminating_states from airflow.utils.state import SHUTDOWN, terminating_states
from airflow.utils.dag_cycle_tester import test_cycle from airflow.utils.dag_cycle_tester import test_cycle
from airflow.utils.trigger_rule import TriggerRule
from airflow.www.auth import has_access
from airflow.www.utils import get_sensitive_variables_fields, should_hide_value_for_key
PY36, PY37, PY38, PY39, PY310, PY311, PY312
AWSAthenaHook
TaskStateTrigger TaskStateTrigger
has_access
requires_access requires_access
AllowListValidator AllowListValidator
BlockListValidator BlockListValidator
SubDagOperator
dates.date_range dates.date_range
dates.days_ago dates.days_ago
@ -42,11 +76,38 @@ infer_time_unit
datetime_to_nano datetime_to_nano
dates.datetime_to_nano dates.datetime_to_nano
get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
get_connection, load_connections
ExternalTaskSensorLink
BashOperator
BaseBranchOperator
EmptyOperator, DummyOperator
dummy_operator.EmptyOperator
dummy_operator.DummyOperator
EmailOperator
BaseSensorOperator
DateTimeSensor
(ExternalTaskMarker, ExternalTaskSensor, ExternalTaskSensorLink)
TimeDeltaSensor
apply_defaults
TemporaryDirectory TemporaryDirectory
mkdirs mkdirs
chain
cross_downstream
SHUTDOWN SHUTDOWN
terminating_states terminating_states
TriggerRule.DUMMY
TriggerRule.NONE_FAILED_OR_SKIPPED
test_cycle test_cycle
has_access
get_sensitive_variables_fields, should_hide_value_for_key

View file

@ -10,6 +10,7 @@ use crate::checkers::ast::Checker;
enum Replacement { enum Replacement {
None, None,
Name(String), Name(String),
Message(String),
} }
/// ## What it does /// ## What it does
@ -53,6 +54,9 @@ impl Violation for Airflow3Removal {
Replacement::Name(name) => { Replacement::Name(name) => {
format!("`{deprecated}` is removed in Airflow 3.0; use `{name}` instead") format!("`{deprecated}` is removed in Airflow 3.0; use `{name}` instead")
} }
Replacement::Message(message) => {
format!("`{deprecated}` is removed in Airflow 3.0; {message}")
}
} }
} }
} }
@ -106,16 +110,76 @@ fn removed_name(checker: &mut Checker, expr: &Expr, ranged: impl Ranged) {
["airflow", "triggers", "external_task", "TaskStateTrigger"] => { ["airflow", "triggers", "external_task", "TaskStateTrigger"] => {
Some((qualname.to_string(), Replacement::None)) Some((qualname.to_string(), Replacement::None))
} }
["airflow", "www", "auth", "has_access"] => Some((
qualname.to_string(),
Replacement::Name("airflow.www.auth.has_access_*".to_string()),
)),
["airflow", "api_connexion", "security", "requires_access"] => Some(( ["airflow", "api_connexion", "security", "requires_access"] => Some((
qualname.to_string(), qualname.to_string(),
Replacement::Name( Replacement::Name(
"airflow.api_connexion.security.requires_access_*".to_string(), "airflow.api_connexion.security.requires_access_*".to_string(),
), ),
)), )),
// airflow.PY\d{1,2}
["airflow", "PY36"] => Some((
qualname.to_string(),
Replacement::Name("sys.version_info".to_string()),
)),
["airflow", "PY37"] => Some((
qualname.to_string(),
Replacement::Name("sys.version_info".to_string()),
)),
["airflow", "PY38"] => Some((
qualname.to_string(),
Replacement::Name("sys.version_info".to_string()),
)),
["airflow", "PY39"] => Some((
qualname.to_string(),
Replacement::Name("sys.version_info".to_string()),
)),
["airflow", "PY310"] => Some((
qualname.to_string(),
Replacement::Name("sys.version_info".to_string()),
)),
["airflow", "PY311"] => Some((
qualname.to_string(),
Replacement::Name("sys.version_info".to_string()),
)),
["airflow", "PY312"] => Some((
qualname.to_string(),
Replacement::Name("sys.version_info".to_string()),
)),
// airflow.configuration
["airflow", "configuration", "get"] => Some((
qualname.to_string(),
Replacement::Name("airflow.configuration.conf.get".to_string()),
)),
["airflow", "configuration", "getboolean"] => Some((
qualname.to_string(),
Replacement::Name("airflow.configuration.conf.getboolean".to_string()),
)),
["airflow", "configuration", "getfloat"] => Some((
qualname.to_string(),
Replacement::Name("airflow.configuration.conf.getfloat".to_string()),
)),
["airflow", "configuration", "getint"] => Some((
qualname.to_string(),
Replacement::Name("airflow.configuration.conf.getint".to_string()),
)),
["airflow", "configuration", "has_option"] => Some((
qualname.to_string(),
Replacement::Name("airflow.configuration.conf.has_option".to_string()),
)),
["airflow", "configuration", "remove_option"] => Some((
qualname.to_string(),
Replacement::Name("airflow.configuration.conf.remove_option".to_string()),
)),
["airflow", "configuration", "as_dict"] => Some((
qualname.to_string(),
Replacement::Name("airflow.configuration.conf.as_dict".to_string()),
)),
["airflow", "configuration", "set"] => Some((
qualname.to_string(),
Replacement::Name("airflow.configuration.conf.set".to_string()),
)),
// airflow.contrib.*
["airflow", "contrib", ..] => Some((qualname.to_string(), Replacement::None)),
// airflow.metrics.validators // airflow.metrics.validators
["airflow", "metrics", "validators", "AllowListValidator"] => Some(( ["airflow", "metrics", "validators", "AllowListValidator"] => Some((
qualname.to_string(), qualname.to_string(),
@ -129,6 +193,85 @@ fn removed_name(checker: &mut Checker, expr: &Expr, ranged: impl Ranged) {
"airflow.metrics.validators.PatternBlockListValidator".to_string(), "airflow.metrics.validators.PatternBlockListValidator".to_string(),
), ),
)), )),
// airflow.operators
["airflow", "operators", "subdag", ..] => {
Some((qualname.to_string(), Replacement::None))
}
["airflow.sensors.external_task.ExternalTaskSensorLink"] => Some((
qualname.to_string(),
Replacement::Name("airflow.sensors.external_task.ExternalDagLin".to_string()),
)),
["airflow", "operators", "bash_operator", "BashOperator"] => Some((
qualname.to_string(),
Replacement::Name("airflow.operators.bash.BashOperator".to_string()),
)),
["airflow", "operators", "branch_operator", "BaseBranchOperator"] => Some((
qualname.to_string(),
Replacement::Name("airflow.operators.branch.BaseBranchOperator".to_string()),
)),
["airflow", "operators", " dummy", "EmptyOperator"] => Some((
qualname.to_string(),
Replacement::Name("airflow.operators.empty.EmptyOperator".to_string()),
)),
["airflow", "operators", "dummy", "DummyOperator"] => Some((
qualname.to_string(),
Replacement::Name("airflow.operators.empty.EmptyOperator".to_string()),
)),
["airflow", "operators", "dummy_operator", "EmptyOperator"] => Some((
qualname.to_string(),
Replacement::Name("airflow.operators.empty.EmptyOperator".to_string()),
)),
["airflow", "operators", "dummy_operator", "DummyOperator"] => Some((
qualname.to_string(),
Replacement::Name("airflow.operators.empty.EmptyOperator".to_string()),
)),
["airflow", "operators", "email_operator", "EmailOperator"] => Some((
qualname.to_string(),
Replacement::Name("airflow.operators.email.EmailOperator".to_string()),
)),
["airflow", "sensors", "base_sensor_operator", "BaseSensorOperator"] => Some((
qualname.to_string(),
Replacement::Name("airflow.sensors.base.BaseSensorOperator".to_string()),
)),
["airflow", "sensors", "date_time_sensor", "DateTimeSensor"] => Some((
qualname.to_string(),
Replacement::Name("airflow.sensors.date_time.DateTimeSensor".to_string()),
)),
["airflow", "sensors", "external_task_sensor", "ExternalTaskMarker"] => Some((
qualname.to_string(),
Replacement::Name(
"airflow.sensors.external_task.ExternalTaskMarker".to_string(),
),
)),
["airflow", "sensors", "external_task_sensor", "ExternalTaskSensor"] => Some((
qualname.to_string(),
Replacement::Name(
"airflow.sensors.external_task.ExternalTaskSensor".to_string(),
),
)),
["airflow", "sensors", "external_task_sensor", "ExternalTaskSensorLink"] => Some((
qualname.to_string(),
Replacement::Name(
"airflow.sensors.external_task.ExternalTaskSensorLink".to_string(),
),
)),
["airflow", "sensors", "time_delta_sensor", "TimeDeltaSensor"] => Some((
qualname.to_string(),
Replacement::Name("airflow.sensors.time_delta.TimeDeltaSensor".to_string()),
)),
// airflow.secrets
["airflow", "secrets", "local_filesystem", "load_connections"] => Some((
qualname.to_string(),
Replacement::Name(
"airflow.secrets.local_filesystem.load_connections_dict".to_string(),
),
)),
["airflow", "secrets", "local_filesystem", "get_connection"] => Some((
qualname.to_string(),
Replacement::Name(
"airflow.secrets.local_filesystem.load_connections_dict".to_string(),
),
)),
// airflow.utils.dates // airflow.utils.dates
["airflow", "utils", "dates", "date_range"] => Some(( ["airflow", "utils", "dates", "date_range"] => Some((
qualname.to_string(), qualname.to_string(),
@ -158,6 +301,16 @@ fn removed_name(checker: &mut Checker, expr: &Expr, ranged: impl Ranged) {
qualname.to_string(), qualname.to_string(),
Replacement::Name("pendulum.today('UTC').add(days=-N, ...)".to_string()), Replacement::Name("pendulum.today('UTC').add(days=-N, ...)".to_string()),
)), )),
// airflow.utils.helpers
["airflow", "utils", "helpers", "chain"] => Some((
qualname.to_string(),
Replacement::Name("airflow.models.baseoperator.chain".to_string()),
)),
["airflow", "utils", "helpers", "cross_downstream"] => Some((
qualname.to_string(),
Replacement::Name("airflow.models.baseoperator.cross_downstream".to_string()),
)),
// airflow.utils.state // airflow.utils.state
["airflow", "utils", "state", "SHUTDOWN"] => { ["airflow", "utils", "state", "SHUTDOWN"] => {
Some((qualname.to_string(), Replacement::None)) Some((qualname.to_string(), Replacement::None))
@ -165,13 +318,42 @@ fn removed_name(checker: &mut Checker, expr: &Expr, ranged: impl Ranged) {
["airflow", "utils", "state", "terminating_states"] => { ["airflow", "utils", "state", "terminating_states"] => {
Some((qualname.to_string(), Replacement::None)) Some((qualname.to_string(), Replacement::None))
} }
// airflow.utils.trigger_rule
["airflow", "utils", "trigger_rule", "TriggerRule", "DUMMY"] => {
Some((qualname.to_string(), Replacement::None))
}
["airflow", "utils", "trigger_rule", "TriggerRule", "NONE_FAILED_OR_SKIPPED"] => {
Some((qualname.to_string(), Replacement::None))
}
// airflow.uilts // airflow.uilts
["airflow", "utils", "dag_cycle_tester", "test_cycle"] => { ["airflow", "utils", "dag_cycle_tester", "test_cycle"] => {
Some((qualname.to_string(), Replacement::None)) Some((qualname.to_string(), Replacement::None))
} }
["airflow", "utils", "decorators", "apply_defaults"] => { ["airflow", "utils", "decorators", "apply_defaults"] => Some((
Some((qualname.to_string(), Replacement::None)) qualname.to_string(),
} Replacement::Message(
"`apply_defaults` is now unconditionally done and can be safely removed."
.to_string(),
),
)),
// airflow.www
["airflow", "www", "auth", "has_access"] => Some((
qualname.to_string(),
Replacement::Name("airflow.www.auth.has_access_*".to_string()),
)),
["airflow", "www", "utils", "get_sensitive_variables_fields"] => Some((
qualname.to_string(),
Replacement::Name(
"airflow.utils.log.secrets_masker.get_sensitive_variables_fields"
.to_string(),
),
)),
["airflow", "www", "utils", "should_hide_value_for_key"] => Some((
qualname.to_string(),
Replacement::Name(
"airflow.utils.log.secrets_masker.should_hide_value_for_key".to_string(),
),
)),
_ => None, _ => None,
}); });
if let Some((deprecated, replacement)) = result { if let Some((deprecated, replacement)) = result {

View file

@ -2,156 +2,537 @@
source: crates/ruff_linter/src/rules/airflow/mod.rs source: crates/ruff_linter/src/rules/airflow/mod.rs
snapshot_kind: text snapshot_kind: text
--- ---
AIR302_names.py:21:1: AIR302 `airflow.triggers.external_task.TaskStateTrigger` is removed in Airflow 3.0 AIR302_names.py:52:1: AIR302 `airflow.PY36` is removed in Airflow 3.0; use `sys.version_info` instead
| |
21 | TaskStateTrigger 50 | from airflow.www.utils import get_sensitive_variables_fields, should_hide_value_for_key
51 |
52 | PY36, PY37, PY38, PY39, PY310, PY311, PY312
| ^^^^ AIR302
53 |
54 | AWSAthenaHook
|
AIR302_names.py:52:7: AIR302 `airflow.PY37` is removed in Airflow 3.0; use `sys.version_info` instead
|
50 | from airflow.www.utils import get_sensitive_variables_fields, should_hide_value_for_key
51 |
52 | PY36, PY37, PY38, PY39, PY310, PY311, PY312
| ^^^^ AIR302
53 |
54 | AWSAthenaHook
|
AIR302_names.py:52:13: AIR302 `airflow.PY38` is removed in Airflow 3.0; use `sys.version_info` instead
|
50 | from airflow.www.utils import get_sensitive_variables_fields, should_hide_value_for_key
51 |
52 | PY36, PY37, PY38, PY39, PY310, PY311, PY312
| ^^^^ AIR302
53 |
54 | AWSAthenaHook
|
AIR302_names.py:52:19: AIR302 `airflow.PY39` is removed in Airflow 3.0; use `sys.version_info` instead
|
50 | from airflow.www.utils import get_sensitive_variables_fields, should_hide_value_for_key
51 |
52 | PY36, PY37, PY38, PY39, PY310, PY311, PY312
| ^^^^ AIR302
53 |
54 | AWSAthenaHook
|
AIR302_names.py:52:25: AIR302 `airflow.PY310` is removed in Airflow 3.0; use `sys.version_info` instead
|
50 | from airflow.www.utils import get_sensitive_variables_fields, should_hide_value_for_key
51 |
52 | PY36, PY37, PY38, PY39, PY310, PY311, PY312
| ^^^^^ AIR302
53 |
54 | AWSAthenaHook
|
AIR302_names.py:52:32: AIR302 `airflow.PY311` is removed in Airflow 3.0; use `sys.version_info` instead
|
50 | from airflow.www.utils import get_sensitive_variables_fields, should_hide_value_for_key
51 |
52 | PY36, PY37, PY38, PY39, PY310, PY311, PY312
| ^^^^^ AIR302
53 |
54 | AWSAthenaHook
|
AIR302_names.py:52:39: AIR302 `airflow.PY312` is removed in Airflow 3.0; use `sys.version_info` instead
|
50 | from airflow.www.utils import get_sensitive_variables_fields, should_hide_value_for_key
51 |
52 | PY36, PY37, PY38, PY39, PY310, PY311, PY312
| ^^^^^ AIR302
53 |
54 | AWSAthenaHook
|
AIR302_names.py:54:1: AIR302 `airflow.contrib.aws_athena_hook.AWSAthenaHook` is removed in Airflow 3.0
|
52 | PY36, PY37, PY38, PY39, PY310, PY311, PY312
53 |
54 | AWSAthenaHook
| ^^^^^^^^^^^^^ AIR302
55 | TaskStateTrigger
|
AIR302_names.py:55:1: AIR302 `airflow.triggers.external_task.TaskStateTrigger` is removed in Airflow 3.0
|
54 | AWSAthenaHook
55 | TaskStateTrigger
| ^^^^^^^^^^^^^^^^ AIR302 | ^^^^^^^^^^^^^^^^ AIR302
56 |
57 | requires_access
| |
AIR302_names.py:24:1: AIR302 `airflow.www.auth.has_access` is removed in Airflow 3.0; use `airflow.www.auth.has_access_*` instead AIR302_names.py:57:1: AIR302 `airflow.api_connexion.security.requires_access` is removed in Airflow 3.0; use `airflow.api_connexion.security.requires_access_*` instead
| |
24 | has_access 55 | TaskStateTrigger
| ^^^^^^^^^^ AIR302 56 |
25 | requires_access 57 | requires_access
|
AIR302_names.py:25:1: AIR302 `airflow.api_connexion.security.requires_access` is removed in Airflow 3.0; use `airflow.api_connexion.security.requires_access_*` instead
|
24 | has_access
25 | requires_access
| ^^^^^^^^^^^^^^^ AIR302 | ^^^^^^^^^^^^^^^ AIR302
26 | 58 |
27 | AllowListValidator 59 | AllowListValidator
| |
AIR302_names.py:27:1: AIR302 `airflow.metrics.validators.AllowListValidator` is removed in Airflow 3.0; use `airflow.metrics.validators.PatternAllowListValidator` instead AIR302_names.py:59:1: AIR302 `airflow.metrics.validators.AllowListValidator` is removed in Airflow 3.0; use `airflow.metrics.validators.PatternAllowListValidator` instead
| |
25 | requires_access 57 | requires_access
26 | 58 |
27 | AllowListValidator 59 | AllowListValidator
| ^^^^^^^^^^^^^^^^^^ AIR302 | ^^^^^^^^^^^^^^^^^^ AIR302
28 | BlockListValidator 60 | BlockListValidator
| |
AIR302_names.py:28:1: AIR302 `airflow.metrics.validators.BlockListValidator` is removed in Airflow 3.0; use `airflow.metrics.validators.PatternBlockListValidator` instead AIR302_names.py:60:1: AIR302 `airflow.metrics.validators.BlockListValidator` is removed in Airflow 3.0; use `airflow.metrics.validators.PatternBlockListValidator` instead
| |
27 | AllowListValidator 59 | AllowListValidator
28 | BlockListValidator 60 | BlockListValidator
| ^^^^^^^^^^^^^^^^^^ AIR302 | ^^^^^^^^^^^^^^^^^^ AIR302
29 | 61 |
30 | dates.date_range 62 | SubDagOperator
| |
AIR302_names.py:30:7: AIR302 `airflow.utils.dates.date_range` is removed in Airflow 3.0; use `airflow.timetables.` instead AIR302_names.py:62:1: AIR302 `airflow.operators.subdag.SubDagOperator` is removed in Airflow 3.0
| |
28 | BlockListValidator 60 | BlockListValidator
29 | 61 |
30 | dates.date_range 62 | SubDagOperator
| ^^^^^^^^^^^^^^ AIR302
63 |
64 | dates.date_range
|
AIR302_names.py:64:7: AIR302 `airflow.utils.dates.date_range` is removed in Airflow 3.0; use `airflow.timetables.` instead
|
62 | SubDagOperator
63 |
64 | dates.date_range
| ^^^^^^^^^^ AIR302 | ^^^^^^^^^^ AIR302
31 | dates.days_ago 65 | dates.days_ago
| |
AIR302_names.py:31:7: AIR302 `airflow.utils.dates.days_ago` is removed in Airflow 3.0; use `pendulum.today('UTC').add(days=-N, ...)` instead AIR302_names.py:65:7: AIR302 `airflow.utils.dates.days_ago` is removed in Airflow 3.0; use `pendulum.today('UTC').add(days=-N, ...)` instead
| |
30 | dates.date_range 64 | dates.date_range
31 | dates.days_ago 65 | dates.days_ago
| ^^^^^^^^ AIR302 | ^^^^^^^^ AIR302
32 | 66 |
33 | date_range 67 | date_range
| |
AIR302_names.py:33:1: AIR302 `airflow.utils.dates.date_range` is removed in Airflow 3.0; use `airflow.timetables.` instead AIR302_names.py:67:1: AIR302 `airflow.utils.dates.date_range` is removed in Airflow 3.0; use `airflow.timetables.` instead
| |
31 | dates.days_ago 65 | dates.days_ago
32 | 66 |
33 | date_range 67 | date_range
| ^^^^^^^^^^ AIR302 | ^^^^^^^^^^ AIR302
34 | days_ago 68 | days_ago
35 | parse_execution_date 69 | parse_execution_date
| |
AIR302_names.py:34:1: AIR302 `airflow.utils.dates.days_ago` is removed in Airflow 3.0; use `pendulum.today('UTC').add(days=-N, ...)` instead AIR302_names.py:68:1: AIR302 `airflow.utils.dates.days_ago` is removed in Airflow 3.0; use `pendulum.today('UTC').add(days=-N, ...)` instead
| |
33 | date_range 67 | date_range
34 | days_ago 68 | days_ago
| ^^^^^^^^ AIR302 | ^^^^^^^^ AIR302
35 | parse_execution_date 69 | parse_execution_date
36 | round_time 70 | round_time
| |
AIR302_names.py:35:1: AIR302 `airflow.utils.dates.parse_execution_date` is removed in Airflow 3.0 AIR302_names.py:69:1: AIR302 `airflow.utils.dates.parse_execution_date` is removed in Airflow 3.0
| |
33 | date_range 67 | date_range
34 | days_ago 68 | days_ago
35 | parse_execution_date 69 | parse_execution_date
| ^^^^^^^^^^^^^^^^^^^^ AIR302 | ^^^^^^^^^^^^^^^^^^^^ AIR302
36 | round_time 70 | round_time
37 | scale_time_units 71 | scale_time_units
| |
AIR302_names.py:36:1: AIR302 `airflow.utils.dates.round_time` is removed in Airflow 3.0 AIR302_names.py:70:1: AIR302 `airflow.utils.dates.round_time` is removed in Airflow 3.0
| |
34 | days_ago 68 | days_ago
35 | parse_execution_date 69 | parse_execution_date
36 | round_time 70 | round_time
| ^^^^^^^^^^ AIR302 | ^^^^^^^^^^ AIR302
37 | scale_time_units 71 | scale_time_units
38 | infer_time_unit 72 | infer_time_unit
| |
AIR302_names.py:37:1: AIR302 `airflow.utils.dates.scale_time_units` is removed in Airflow 3.0 AIR302_names.py:71:1: AIR302 `airflow.utils.dates.scale_time_units` is removed in Airflow 3.0
| |
35 | parse_execution_date 69 | parse_execution_date
36 | round_time 70 | round_time
37 | scale_time_units 71 | scale_time_units
| ^^^^^^^^^^^^^^^^ AIR302 | ^^^^^^^^^^^^^^^^ AIR302
38 | infer_time_unit 72 | infer_time_unit
| |
AIR302_names.py:38:1: AIR302 `airflow.utils.dates.infer_time_unit` is removed in Airflow 3.0 AIR302_names.py:72:1: AIR302 `airflow.utils.dates.infer_time_unit` is removed in Airflow 3.0
| |
36 | round_time 70 | round_time
37 | scale_time_units 71 | scale_time_units
38 | infer_time_unit 72 | infer_time_unit
| ^^^^^^^^^^^^^^^ AIR302 | ^^^^^^^^^^^^^^^ AIR302
| |
AIR302_names.py:45:1: AIR302 `airflow.utils.file.TemporaryDirectory` is removed in Airflow 3.0 AIR302_names.py:79:1: AIR302 `airflow.configuration.get` is removed in Airflow 3.0; use `airflow.configuration.conf.get` instead
| |
43 | dates.datetime_to_nano 77 | dates.datetime_to_nano
44 | 78 |
45 | TemporaryDirectory 79 | get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
| ^^^ AIR302
80 |
81 | get_connection, load_connections
|
AIR302_names.py:79:6: AIR302 `airflow.configuration.getboolean` is removed in Airflow 3.0; use `airflow.configuration.conf.getboolean` instead
|
77 | dates.datetime_to_nano
78 |
79 | get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
| ^^^^^^^^^^ AIR302
80 |
81 | get_connection, load_connections
|
AIR302_names.py:79:18: AIR302 `airflow.configuration.getfloat` is removed in Airflow 3.0; use `airflow.configuration.conf.getfloat` instead
|
77 | dates.datetime_to_nano
78 |
79 | get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
| ^^^^^^^^ AIR302
80 |
81 | get_connection, load_connections
|
AIR302_names.py:79:28: AIR302 `airflow.configuration.getint` is removed in Airflow 3.0; use `airflow.configuration.conf.getint` instead
|
77 | dates.datetime_to_nano
78 |
79 | get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
| ^^^^^^ AIR302
80 |
81 | get_connection, load_connections
|
AIR302_names.py:79:36: AIR302 `airflow.configuration.has_option` is removed in Airflow 3.0; use `airflow.configuration.conf.has_option` instead
|
77 | dates.datetime_to_nano
78 |
79 | get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
| ^^^^^^^^^^ AIR302
80 |
81 | get_connection, load_connections
|
AIR302_names.py:79:48: AIR302 `airflow.configuration.remove_option` is removed in Airflow 3.0; use `airflow.configuration.conf.remove_option` instead
|
77 | dates.datetime_to_nano
78 |
79 | get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
| ^^^^^^^^^^^^^ AIR302
80 |
81 | get_connection, load_connections
|
AIR302_names.py:79:63: AIR302 `airflow.configuration.as_dict` is removed in Airflow 3.0; use `airflow.configuration.conf.as_dict` instead
|
77 | dates.datetime_to_nano
78 |
79 | get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
| ^^^^^^^ AIR302
80 |
81 | get_connection, load_connections
|
AIR302_names.py:79:72: AIR302 `airflow.configuration.set` is removed in Airflow 3.0; use `airflow.configuration.conf.set` instead
|
77 | dates.datetime_to_nano
78 |
79 | get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
| ^^^ AIR302
80 |
81 | get_connection, load_connections
|
AIR302_names.py:81:1: AIR302 `airflow.secrets.local_filesystem.get_connection` is removed in Airflow 3.0; use `airflow.secrets.local_filesystem.load_connections_dict` instead
|
79 | get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
80 |
81 | get_connection, load_connections
| ^^^^^^^^^^^^^^ AIR302
|
AIR302_names.py:81:17: AIR302 `airflow.secrets.local_filesystem.load_connections` is removed in Airflow 3.0; use `airflow.secrets.local_filesystem.load_connections_dict` instead
|
79 | get, getboolean, getfloat, getint, has_option, remove_option, as_dict, set
80 |
81 | get_connection, load_connections
| ^^^^^^^^^^^^^^^^ AIR302
|
AIR302_names.py:84:1: AIR302 `airflow.sensors.external_task_sensor.ExternalTaskSensorLink` is removed in Airflow 3.0; use `airflow.sensors.external_task.ExternalTaskSensorLink` instead
|
84 | ExternalTaskSensorLink
| ^^^^^^^^^^^^^^^^^^^^^^ AIR302
85 | BashOperator
86 | BaseBranchOperator
|
AIR302_names.py:85:1: AIR302 `airflow.operators.bash_operator.BashOperator` is removed in Airflow 3.0; use `airflow.operators.bash.BashOperator` instead
|
84 | ExternalTaskSensorLink
85 | BashOperator
| ^^^^^^^^^^^^ AIR302
86 | BaseBranchOperator
87 | EmptyOperator, DummyOperator
|
AIR302_names.py:86:1: AIR302 `airflow.operators.branch_operator.BaseBranchOperator` is removed in Airflow 3.0; use `airflow.operators.branch.BaseBranchOperator` instead
|
84 | ExternalTaskSensorLink
85 | BashOperator
86 | BaseBranchOperator
| ^^^^^^^^^^^^^^^^^^ AIR302 | ^^^^^^^^^^^^^^^^^^ AIR302
46 | mkdirs 87 | EmptyOperator, DummyOperator
88 | dummy_operator.EmptyOperator
| |
AIR302_names.py:46:1: AIR302 `airflow.utils.file.mkdirs` is removed in Airflow 3.0; use `pendulum.today('UTC').add(days=-N, ...)` instead AIR302_names.py:87:16: AIR302 `airflow.operators.dummy.DummyOperator` is removed in Airflow 3.0; use `airflow.operators.empty.EmptyOperator` instead
| |
45 | TemporaryDirectory 85 | BashOperator
46 | mkdirs 86 | BaseBranchOperator
| ^^^^^^ AIR302 87 | EmptyOperator, DummyOperator
47 | | ^^^^^^^^^^^^^ AIR302
48 | SHUTDOWN 88 | dummy_operator.EmptyOperator
89 | dummy_operator.DummyOperator
| |
AIR302_names.py:48:1: AIR302 `airflow.utils.state.SHUTDOWN` is removed in Airflow 3.0 AIR302_names.py:88:16: AIR302 `airflow.operators.dummy_operator.EmptyOperator` is removed in Airflow 3.0; use `airflow.operators.empty.EmptyOperator` instead
| |
46 | mkdirs 86 | BaseBranchOperator
47 | 87 | EmptyOperator, DummyOperator
48 | SHUTDOWN 88 | dummy_operator.EmptyOperator
| ^^^^^^^^ AIR302 | ^^^^^^^^^^^^^ AIR302
49 | terminating_states 89 | dummy_operator.DummyOperator
90 | EmailOperator
| |
AIR302_names.py:49:1: AIR302 `airflow.utils.state.terminating_states` is removed in Airflow 3.0 AIR302_names.py:89:16: AIR302 `airflow.operators.dummy_operator.DummyOperator` is removed in Airflow 3.0; use `airflow.operators.empty.EmptyOperator` instead
| |
48 | SHUTDOWN 87 | EmptyOperator, DummyOperator
49 | terminating_states 88 | dummy_operator.EmptyOperator
89 | dummy_operator.DummyOperator
| ^^^^^^^^^^^^^ AIR302
90 | EmailOperator
91 | BaseSensorOperator
|
AIR302_names.py:90:1: AIR302 `airflow.operators.email_operator.EmailOperator` is removed in Airflow 3.0; use `airflow.operators.email.EmailOperator` instead
|
88 | dummy_operator.EmptyOperator
89 | dummy_operator.DummyOperator
90 | EmailOperator
| ^^^^^^^^^^^^^ AIR302
91 | BaseSensorOperator
92 | DateTimeSensor
|
AIR302_names.py:91:1: AIR302 `airflow.sensors.base_sensor_operator.BaseSensorOperator` is removed in Airflow 3.0; use `airflow.sensors.base.BaseSensorOperator` instead
|
89 | dummy_operator.DummyOperator
90 | EmailOperator
91 | BaseSensorOperator
| ^^^^^^^^^^^^^^^^^^ AIR302 | ^^^^^^^^^^^^^^^^^^ AIR302
92 | DateTimeSensor
93 | (ExternalTaskMarker, ExternalTaskSensor, ExternalTaskSensorLink)
| |
AIR302_names.py:52:1: AIR302 `airflow.utils.dag_cycle_tester.test_cycle` is removed in Airflow 3.0 AIR302_names.py:92:1: AIR302 `airflow.sensors.date_time_sensor.DateTimeSensor` is removed in Airflow 3.0; use `airflow.sensors.date_time.DateTimeSensor` instead
| |
52 | test_cycle 90 | EmailOperator
| ^^^^^^^^^^ AIR302 91 | BaseSensorOperator
92 | DateTimeSensor
| ^^^^^^^^^^^^^^ AIR302
93 | (ExternalTaskMarker, ExternalTaskSensor, ExternalTaskSensorLink)
94 | TimeDeltaSensor
| |
AIR302_names.py:93:2: AIR302 `airflow.sensors.external_task_sensor.ExternalTaskMarker` is removed in Airflow 3.0; use `airflow.sensors.external_task.ExternalTaskMarker` instead
|
91 | BaseSensorOperator
92 | DateTimeSensor
93 | (ExternalTaskMarker, ExternalTaskSensor, ExternalTaskSensorLink)
| ^^^^^^^^^^^^^^^^^^ AIR302
94 | TimeDeltaSensor
|
AIR302_names.py:93:22: AIR302 `airflow.sensors.external_task_sensor.ExternalTaskSensor` is removed in Airflow 3.0; use `airflow.sensors.external_task.ExternalTaskSensor` instead
|
91 | BaseSensorOperator
92 | DateTimeSensor
93 | (ExternalTaskMarker, ExternalTaskSensor, ExternalTaskSensorLink)
| ^^^^^^^^^^^^^^^^^^ AIR302
94 | TimeDeltaSensor
|
AIR302_names.py:93:42: AIR302 `airflow.sensors.external_task_sensor.ExternalTaskSensorLink` is removed in Airflow 3.0; use `airflow.sensors.external_task.ExternalTaskSensorLink` instead
|
91 | BaseSensorOperator
92 | DateTimeSensor
93 | (ExternalTaskMarker, ExternalTaskSensor, ExternalTaskSensorLink)
| ^^^^^^^^^^^^^^^^^^^^^^ AIR302
94 | TimeDeltaSensor
|
AIR302_names.py:94:1: AIR302 `airflow.sensors.time_delta_sensor.TimeDeltaSensor` is removed in Airflow 3.0; use `airflow.sensors.time_delta.TimeDeltaSensor` instead
|
92 | DateTimeSensor
93 | (ExternalTaskMarker, ExternalTaskSensor, ExternalTaskSensorLink)
94 | TimeDeltaSensor
| ^^^^^^^^^^^^^^^ AIR302
95 |
96 | apply_defaults
|
AIR302_names.py:96:1: AIR302 `airflow.utils.decorators.apply_defaults` is removed in Airflow 3.0; `apply_defaults` is now unconditionally done and can be safely removed.
|
94 | TimeDeltaSensor
95 |
96 | apply_defaults
| ^^^^^^^^^^^^^^ AIR302
97 |
98 | TemporaryDirectory
|
AIR302_names.py:98:1: AIR302 `airflow.utils.file.TemporaryDirectory` is removed in Airflow 3.0
|
96 | apply_defaults
97 |
98 | TemporaryDirectory
| ^^^^^^^^^^^^^^^^^^ AIR302
99 | mkdirs
|
AIR302_names.py:99:1: AIR302 `airflow.utils.file.mkdirs` is removed in Airflow 3.0; use `pendulum.today('UTC').add(days=-N, ...)` instead
|
98 | TemporaryDirectory
99 | mkdirs
| ^^^^^^ AIR302
100 |
101 | chain
|
AIR302_names.py:101:1: AIR302 `airflow.utils.helpers.chain` is removed in Airflow 3.0; use `airflow.models.baseoperator.chain` instead
|
99 | mkdirs
100 |
101 | chain
| ^^^^^ AIR302
102 | cross_downstream
|
AIR302_names.py:102:1: AIR302 `airflow.utils.helpers.cross_downstream` is removed in Airflow 3.0; use `airflow.models.baseoperator.cross_downstream` instead
|
101 | chain
102 | cross_downstream
| ^^^^^^^^^^^^^^^^ AIR302
103 |
104 | SHUTDOWN
|
AIR302_names.py:104:1: AIR302 `airflow.utils.state.SHUTDOWN` is removed in Airflow 3.0
|
102 | cross_downstream
103 |
104 | SHUTDOWN
| ^^^^^^^^ AIR302
105 | terminating_states
|
AIR302_names.py:105:1: AIR302 `airflow.utils.state.terminating_states` is removed in Airflow 3.0
|
104 | SHUTDOWN
105 | terminating_states
| ^^^^^^^^^^^^^^^^^^ AIR302
106 |
107 | TriggerRule.DUMMY
|
AIR302_names.py:107:13: AIR302 `airflow.utils.trigger_rule.TriggerRule.DUMMY` is removed in Airflow 3.0
|
105 | terminating_states
106 |
107 | TriggerRule.DUMMY
| ^^^^^ AIR302
108 | TriggerRule.NONE_FAILED_OR_SKIPPED
|
AIR302_names.py:108:13: AIR302 `airflow.utils.trigger_rule.TriggerRule.NONE_FAILED_OR_SKIPPED` is removed in Airflow 3.0
|
107 | TriggerRule.DUMMY
108 | TriggerRule.NONE_FAILED_OR_SKIPPED
| ^^^^^^^^^^^^^^^^^^^^^^ AIR302
109 |
110 | test_cycle
|
AIR302_names.py:110:1: AIR302 `airflow.utils.dag_cycle_tester.test_cycle` is removed in Airflow 3.0
|
108 | TriggerRule.NONE_FAILED_OR_SKIPPED
109 |
110 | test_cycle
| ^^^^^^^^^^ AIR302
111 |
112 | has_access
|
AIR302_names.py:112:1: AIR302 `airflow.www.auth.has_access` is removed in Airflow 3.0; use `airflow.www.auth.has_access_*` instead
|
110 | test_cycle
111 |
112 | has_access
| ^^^^^^^^^^ AIR302
113 | get_sensitive_variables_fields, should_hide_value_for_key
|
AIR302_names.py:113:1: AIR302 `airflow.www.utils.get_sensitive_variables_fields` is removed in Airflow 3.0; use `airflow.utils.log.secrets_masker.get_sensitive_variables_fields` instead
|
112 | has_access
113 | get_sensitive_variables_fields, should_hide_value_for_key
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AIR302
|
AIR302_names.py:113:33: AIR302 `airflow.www.utils.should_hide_value_for_key` is removed in Airflow 3.0; use `airflow.utils.log.secrets_masker.should_hide_value_for_key` instead
|
112 | has_access
113 | get_sensitive_variables_fields, should_hide_value_for_key
| ^^^^^^^^^^^^^^^^^^^^^^^^^ AIR302
|