Skip to content

Commit 55a567e

Browse files
committed
fix(AIR302,AIR312): In the later development of Airflow 3.0, backward compatibility was not added for some cases. Thus, the following rules are moved back to AIR302
airflow.hooks.subprocess.SubprocessResult → airflow.providers.standard.hooks.subprocess.SubprocessResult airflow.hooks.subprocess.working_directory → airflow.providers.standard.hooks.subprocess.working_directory airflow.operators.datetime.target_times_as_dates → airflow.providers.standard.operators.datetime.target_times_as_dates airflow.operators.trigger_dagrun.TriggerDagRunLink → airflow.providers.standard.operators.trigger_dagrun.TriggerDagRunLink airflow.sensors.external_task.ExternalTaskSensorLink → airflow.providers.standard.sensors.external_task.ExternalDagLink (This one contains a minor change) airflow.sensors.time_delta.WaitSensor → airflow.providers.standard.sensors.time_delta.WaitSensor
1 parent 196e4be commit 55a567e

File tree

6 files changed

+183
-125
lines changed

6 files changed

+183
-125
lines changed

crates/ruff_linter/resources/test/fixtures/airflow/AIR302_standard.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,16 @@
4747

4848
DummyOperator()
4949
EmptyOperator()
50+
51+
from airflow.hooks.subprocess import SubprocessResult
52+
SubprocessResult()
53+
from airflow.hooks.subprocess import working_directory
54+
working_directory()
55+
from airflow.operators.datetime import target_times_as_dates
56+
target_times_as_dates()
57+
from airflow.operators.trigger_dagrun import TriggerDagRunLink
58+
TriggerDagRunLink()
59+
from airflow.sensors.external_task import ExternalTaskSensorLink
60+
ExternalTaskSensorLink()
61+
from airflow.sensors.time_delta import WaitSensor
62+
WaitSensor()

crates/ruff_linter/resources/test/fixtures/airflow/AIR312.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
from airflow.hooks.filesystem import FSHook
44
from airflow.hooks.package_index import PackageIndexHook
5-
from airflow.hooks.subprocess import SubprocessHook, SubprocessResult, working_directory
5+
from airflow.hooks.subprocess import SubprocessHook
66
from airflow.operators.bash import BashOperator
7-
from airflow.operators.datetime import BranchDateTimeOperator, target_times_as_dates
7+
from airflow.operators.datetime import BranchDateTimeOperator
88
from airflow.operators.empty import EmptyOperator
99
from airflow.operators.latest_only import LatestOnlyOperator
1010
from airflow.operators.python import (
@@ -13,16 +13,16 @@
1313
PythonVirtualenvOperator,
1414
ShortCircuitOperator,
1515
)
16-
from airflow.operators.trigger_dagrun import TriggerDagRunLink, TriggerDagRunOperator
16+
from airflow.operators.trigger_dagrun import TriggerDagRunOperator
1717
from airflow.operators.weekday import BranchDayOfWeekOperator
1818
from airflow.sensors.date_time import DateTimeSensor, DateTimeSensorAsync
1919
from airflow.sensors.external_task import (
2020
ExternalTaskMarker,
2121
ExternalTaskSensor,
22-
ExternalTaskSensorLink,
22+
2323
)
2424
from airflow.sensors.filesystem import FileSensor
25-
from airflow.sensors.time_delta import TimeDeltaSensor, TimeDeltaSensorAsync, WaitSensor
25+
from airflow.sensors.time_delta import TimeDeltaSensor, TimeDeltaSensorAsync
2626
from airflow.sensors.time_sensor import TimeSensor, TimeSensorAsync
2727
from airflow.sensors.weekday import DayOfWeekSensor
2828
from airflow.triggers.external_task import DagStateTrigger, WorkflowTrigger
@@ -31,10 +31,10 @@
3131

3232
FSHook()
3333
PackageIndexHook()
34-
SubprocessHook(), SubprocessResult(), working_directory()
34+
SubprocessHook()
3535
BashOperator()
36-
BranchDateTimeOperator(), target_times_as_dates()
37-
TriggerDagRunLink(), TriggerDagRunOperator()
36+
BranchDateTimeOperator()
37+
TriggerDagRunOperator()
3838
EmptyOperator()
3939
LatestOnlyOperator()
4040
(
@@ -45,10 +45,10 @@
4545
)
4646
BranchDayOfWeekOperator()
4747
DateTimeSensor(), DateTimeSensorAsync()
48-
ExternalTaskMarker(), ExternalTaskSensor(), ExternalTaskSensorLink()
48+
ExternalTaskMarker(), ExternalTaskSensor()
4949
FileSensor()
5050
TimeSensor(), TimeSensorAsync()
51-
TimeDeltaSensor(), TimeDeltaSensorAsync(), WaitSensor()
51+
TimeDeltaSensor(), TimeDeltaSensorAsync()
5252
DayOfWeekSensor()
5353
DagStateTrigger(), WorkflowTrigger()
5454
FileTrigger()

crates/ruff_linter/src/rules/airflow/rules/moved_to_provider_in_3.rs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -865,6 +865,14 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan
865865
},
866866

867867
// apache-airflow-providers-standard
868+
["airflow", "hooks", "subprocess", rest @ ("SubprocessResult" | "working_directory")] => {
869+
ProviderReplacement::SourceModuleMovedToProvider {
870+
name: (*rest).to_string(),
871+
module: "airflow.providers.standard.hooks.subprocess",
872+
provider: "standard",
873+
version: "0.0.3",
874+
}
875+
}
868876
["airflow", "operators", "bash_operator", "BashOperator"] => {
869877
ProviderReplacement::AutoImport {
870878
module: "airflow.providers.standard.operators.bash",
@@ -881,6 +889,22 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan
881889
version: "0.0.2",
882890
}
883891
}
892+
["airflow", "operators", "trigger_dagrun", "TriggerDagRunLink"] => {
893+
ProviderReplacement::AutoImport {
894+
module: "airflow.providers.standard.operators.trigger_dagrun",
895+
name: "TriggerDagRunLink",
896+
provider: "standard",
897+
version: "0.0.2",
898+
}
899+
}
900+
["airflow", "operators", "datetime", "target_times_as_dates"] => {
901+
ProviderReplacement::AutoImport {
902+
module: "airflow.providers.standard.operators.datetime",
903+
name: "target_times_as_dates",
904+
provider: "standard",
905+
version: "0.0.1",
906+
}
907+
}
884908
["airflow", "operators", "dummy" | "dummy_operator", "EmptyOperator" | "DummyOperator"] => {
885909
ProviderReplacement::AutoImport {
886910
module: "airflow.providers.standard.operators.empty",
@@ -906,14 +930,28 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan
906930
provider: "standard",
907931
version: "0.0.1",
908932
},
933+
["airflow", "sensors", "external_task", "ExternalTaskSensorLink"] => {
934+
ProviderReplacement::AutoImport {
935+
module: "airflow.providers.standard.sensors.external_task",
936+
name: "ExternalDagLink",
937+
provider: "standard",
938+
version: "0.0.3",
939+
}
940+
}
909941
["airflow", "sensors", "external_task_sensor", rest @ ("ExternalTaskMarker" | "ExternalTaskSensor" | "ExternalTaskSensorLink")] => {
910942
ProviderReplacement::SourceModuleMovedToProvider {
911-
name: (*rest).to_string(),
912943
module: "airflow.providers.standard.sensors.external_task",
944+
name: (*rest).to_string(),
913945
provider: "standard",
914946
version: "0.0.3",
915947
}
916948
}
949+
["airflow", "sensors", "time_delta", "WaitSensor"] => ProviderReplacement::AutoImport {
950+
module: "airflow.providers.standard.sensors.time_delta",
951+
name: "WaitSensor",
952+
provider: "standard",
953+
version: "0.0.1",
954+
},
917955

918956
_ => return,
919957
};

crates/ruff_linter/src/rules/airflow/rules/suggested_to_move_to_provider_in_3.rs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -127,32 +127,30 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan
127127
version: "0.0.1",
128128
}
129129
}
130-
["airflow", "hooks", "subprocess", rest @ ("SubprocessHook" | "SubprocessResult" | "working_directory")] => {
131-
ProviderReplacement::SourceModuleMovedToProvider {
132-
name: (*rest).to_string(),
133-
module: "airflow.providers.standard.hooks.subprocess",
134-
provider: "standard",
135-
version: "0.0.3",
136-
}
137-
}
130+
["airflow", "hooks", "subprocess", "SubprocessHook"] => ProviderReplacement::AutoImport {
131+
module: "airflow.providers.standard.hooks.subprocess",
132+
name: "SubprocessHook",
133+
provider: "standard",
134+
version: "0.0.3",
135+
},
138136
["airflow", "operators", "bash", "BashOperator"] => ProviderReplacement::AutoImport {
139137
module: "airflow.providers.standard.operators.bash",
140138
name: "BashOperator",
141139
provider: "standard",
142140
version: "0.0.1",
143141
},
144-
["airflow", "operators", "datetime", rest @ ("BranchDateTimeOperator" | "target_times_as_dates")] => {
145-
ProviderReplacement::SourceModuleMovedToProvider {
146-
name: (*rest).to_string(),
142+
["airflow", "operators", "datetime", "BranchDateTimeOperator"] => {
143+
ProviderReplacement::AutoImport {
147144
module: "airflow.providers.standard.operators.datetime",
145+
name: "BranchDateTimeOperator",
148146
provider: "standard",
149147
version: "0.0.1",
150148
}
151149
}
152-
["airflow", "operators", "trigger_dagrun", rest @ ("TriggerDagRunLink" | "TriggerDagRunOperator")] => {
153-
ProviderReplacement::SourceModuleMovedToProvider {
154-
name: (*rest).to_string(),
150+
["airflow", "operators", "trigger_dagrun", "TriggerDagRunOperator"] => {
151+
ProviderReplacement::AutoImport {
155152
module: "airflow.providers.standard.operators.trigger_dagrun",
153+
name: "TriggerDagRunOperator",
156154
provider: "standard",
157155
version: "0.0.2",
158156
}
@@ -218,7 +216,7 @@ fn check_names_moved_to_provider(checker: &Checker, expr: &Expr, ranged: TextRan
218216
version: "0.0.1",
219217
}
220218
}
221-
["airflow", "sensors", "time_delta", rest @ ("TimeDeltaSensor" | "TimeDeltaSensorAsync" | "WaitSensor")] => {
219+
["airflow", "sensors", "time_delta", rest @ ("TimeDeltaSensor" | "TimeDeltaSensorAsync")] => {
222220
ProviderReplacement::SourceModuleMovedToProvider {
223221
name: (*rest).to_string(),
224222
module: "airflow.providers.standard.sensors.time_delta",

crates/ruff_linter/src/rules/airflow/snapshots/ruff_linter__rules__airflow__tests__AIR302_AIR302_standard.py.snap

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,5 +153,80 @@ AIR302_standard.py:49:1: AIR302 `airflow.operators.dummy_operator.EmptyOperator`
153153
48 | DummyOperator()
154154
49 | EmptyOperator()
155155
| ^^^^^^^^^^^^^ AIR302
156+
50 |
157+
51 | from airflow.hooks.subprocess import SubprocessResult
156158
|
157159
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `airflow.providers.standard.operators.empty.EmptyOperator` instead.
160+
161+
AIR302_standard.py:52:1: AIR302 `airflow.hooks.subprocess.SubprocessResult` is moved into `standard` provider in Airflow 3.0;
162+
|
163+
51 | from airflow.hooks.subprocess import SubprocessResult
164+
52 | SubprocessResult()
165+
| ^^^^^^^^^^^^^^^^ AIR302
166+
53 | from airflow.hooks.subprocess import working_directory
167+
54 | working_directory()
168+
|
169+
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.hooks.subprocess.SubprocessResult` instead.
170+
171+
AIR302_standard.py:54:1: AIR302 `airflow.hooks.subprocess.working_directory` is moved into `standard` provider in Airflow 3.0;
172+
|
173+
52 | SubprocessResult()
174+
53 | from airflow.hooks.subprocess import working_directory
175+
54 | working_directory()
176+
| ^^^^^^^^^^^^^^^^^ AIR302
177+
55 | from airflow.operators.datetime import target_times_as_dates
178+
56 | target_times_as_dates()
179+
|
180+
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.hooks.subprocess.working_directory` instead.
181+
182+
AIR302_standard.py:56:1: AIR302 `airflow.operators.datetime.target_times_as_dates` is moved into `standard` provider in Airflow 3.0;
183+
|
184+
54 | working_directory()
185+
55 | from airflow.operators.datetime import target_times_as_dates
186+
56 | target_times_as_dates()
187+
| ^^^^^^^^^^^^^^^^^^^^^ AIR302
188+
57 | from airflow.operators.trigger_dagrun import TriggerDagRunLink
189+
58 | TriggerDagRunLink()
190+
|
191+
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.operators.datetime.target_times_as_dates` instead.
192+
193+
AIR302_standard.py:58:1: AIR302 `airflow.operators.trigger_dagrun.TriggerDagRunLink` is moved into `standard` provider in Airflow 3.0;
194+
|
195+
56 | target_times_as_dates()
196+
57 | from airflow.operators.trigger_dagrun import TriggerDagRunLink
197+
58 | TriggerDagRunLink()
198+
| ^^^^^^^^^^^^^^^^^ AIR302
199+
59 | from airflow.sensors.external_task import ExternalTaskSensorLink
200+
60 | ExternalTaskSensorLink()
201+
|
202+
= help: Install `apache-airflow-providers-standard>=0.0.2` and use `airflow.providers.standard.operators.trigger_dagrun.TriggerDagRunLink` instead.
203+
204+
AIR302_standard.py:60:1: AIR302 [*] `airflow.sensors.external_task.ExternalTaskSensorLink` is moved into `standard` provider in Airflow 3.0;
205+
|
206+
58 | TriggerDagRunLink()
207+
59 | from airflow.sensors.external_task import ExternalTaskSensorLink
208+
60 | ExternalTaskSensorLink()
209+
| ^^^^^^^^^^^^^^^^^^^^^^ AIR302
210+
61 | from airflow.sensors.time_delta import WaitSensor
211+
62 | WaitSensor()
212+
|
213+
= help: Install `apache-airflow-providers-standard>=0.0.3` and use `airflow.providers.standard.sensors.external_task.ExternalDagLink` instead.
214+
215+
Safe fix
216+
57 57 | from airflow.operators.trigger_dagrun import TriggerDagRunLink
217+
58 58 | TriggerDagRunLink()
218+
59 59 | from airflow.sensors.external_task import ExternalTaskSensorLink
219+
60 |-ExternalTaskSensorLink()
220+
60 |+from airflow.providers.standard.sensors.external_task import ExternalDagLink
221+
61 |+ExternalDagLink()
222+
61 62 | from airflow.sensors.time_delta import WaitSensor
223+
62 63 | WaitSensor()
224+
225+
AIR302_standard.py:62:1: AIR302 `airflow.sensors.time_delta.WaitSensor` is moved into `standard` provider in Airflow 3.0;
226+
|
227+
60 | ExternalTaskSensorLink()
228+
61 | from airflow.sensors.time_delta import WaitSensor
229+
62 | WaitSensor()
230+
| ^^^^^^^^^^ AIR302
231+
|
232+
= help: Install `apache-airflow-providers-standard>=0.0.1` and use `airflow.providers.standard.sensors.time_delta.WaitSensor` instead.

0 commit comments

Comments
 (0)