-
Notifications
You must be signed in to change notification settings - Fork 16.3k
Description
✅ Goal
Ensure that BaseHook is imported through version_compat.py to support both Airflow 2 and 3 cleanly, and avoid mypy issues.
Steps
Step 0: Grab the provider (file under it also ok) that you are interested in by commenting on this issue. DO NOT WORK ON A PROVIDER / TASK WITHOUT commenting, as it can cause conflict of PRs.
Step 1: Add BaseHook to version_compat.py
Update/Create the existing version_compat.py file in your provider (found under providers/{provider_name}/src/airflow/providers/{provider_name}/version_compat.py), to introduce a AIRFLOW_V_3_1_PLUS check like below:
--- a/providers/standard/src/airflow/providers/standard/version_compat.py
+++ b/providers/standard/src/airflow/providers/standard/version_compat.py
@@ -35,6 +35,11 @@ def get_base_airflow_version_tuple() -> tuple[int, int, int]:
+AIRFLOW_V_3_1_PLUS: bool = get_base_airflow_version_tuple() >= (3, 1, 0)
+if AIRFLOW_V_3_1_PLUS:
+ from airflow.sdk import BaseHook
+else:
+ from airflow.hooks.base import BaseHook # type: ignore[attr-defined,no-redef]
If the version_compat.py doesn't exist for that provider, create one with a template like so:
# In providers/{provider_name}/src/airflow/providers/{provider_name}/version_compat.py
from __future__ import annotations
def get_base_airflow_version_tuple() -> tuple[int, int, int]:
from packaging.version import Version
from airflow import __version__
airflow_version = Version(__version__)
return airflow_version.major, airflow_version.minor, airflow_version.micro
AIRFLOW_V_3_0_PLUS = get_base_airflow_version_tuple() >= (3, 0, 0)
AIRFLOW_V_3_1_PLUS: bool = get_base_airflow_version_tuple() >= (3, 1, 0)
if AIRFLOW_V_3_1_PLUS:
from airflow.sdk import BaseHook
else:
from airflow.hooks.base import BaseHook # type: ignore[attr-defined,no-redef]
if AIRFLOW_V_3_0_PLUS:
from airflow.sdk import BaseOperator
else:
from airflow.models import BaseOperator
__all__ = ["AIRFLOW_V_3_0_PLUS", "BaseHook", "BaseOperator"]
Note: Export only what's needed in __all__.
Step 2: Replace the imports
Replace all direct imports like:
try:
from airflow.sdk import BaseHook
except ImportError:
from airflow.hooks.base import BaseHook # type: ignore[attr-defined,no-redef]
With that from version_compat:
from airflow.providers.standard.version_compat import BaseHook
Step 3: Run Tests
Run the provider tests using:
breeze testing providers-tests --test-type "Providers[{provider_name}]"
Example:
breeze testing providers-tests --test-type "Providers[microsoft.azure]"
Step 4: Open a PR
Providers that need changes
Airbyte
Alibaba Cloud @sunank200
- providers/alibaba/src/airflow/providers/alibaba/cloud/hooks/analyticdb_spark.py (@sunank200 )
- providers/alibaba/src/airflow/providers/alibaba/cloud/hooks/base_alibaba.py (@sunank200 )
- providers/alibaba/src/airflow/providers/alibaba/cloud/hooks/oss.py (@sunank200 )
Amazon AWS @sunank200
- providers/amazon/src/airflow/providers/amazon/aws/hooks/base_aws.py (@sunank200 )
- providers/amazon/src/airflow/providers/amazon/aws/hooks/sagemaker_unified_studio.py (@sunank200 )
- providers/amazon/src/airflow/providers/amazon/aws/transfers/s3_to_sql.py (@sunank200 )
- providers/amazon/src/airflow/providers/amazon/aws/transfers/sql_to_s3.py (@sunank200 )
- providers/amazon/tests/unit/amazon/aws/operators/test_base_aws.py (@sunank200 )
- providers/amazon/tests/unit/amazon/aws/sensors/test_base_aws.py (@sunank200 )
Apache (@bdsoha)
- providers/apache/beam/src/airflow/providers/apache/beam/hooks/beam.py
- providers/apache/cassandra/src/airflow/providers/apache/cassandra/hooks/cassandra.py
- providers/apache/druid/src/airflow/providers/apache/druid/hooks/druid.py
- providers/apache/hdfs/src/airflow/providers/apache/hdfs/hooks/webhdfs.py
- providers/apache/hive/src/airflow/providers/apache/hive/hooks/hive.py
- providers/apache/iceberg/src/airflow/providers/apache/iceberg/hooks/iceberg.py
- providers/apache/kafka/src/airflow/providers/apache/kafka/hooks/base.py
- providers/apache/kylin/src/airflow/providers/apache/kylin/hooks/kylin.py
- providers/apache/pig/src/airflow/providers/apache/pig/hooks/pig.py
- providers/apache/pinot/src/airflow/providers/apache/pinot/hooks/pinot.py
- providers/apache/spark/src/airflow/providers/apache/spark/decorators/pyspark.py
- providers/apache/spark/src/airflow/providers/apache/spark/hooks/spark_connect.py
- providers/apache/spark/src/airflow/providers/apache/spark/hooks/spark_sql.py
- providers/apache/spark/src/airflow/providers/apache/spark/hooks/spark_submit.py
- providers/apache/tinkerpop/src/airflow/providers/apache/tinkerpop/hooks/gremlin.py
Apprise @sunank200
ArangoDB @sunank200
Asana
Atlassian @sunank200
Cloudant @sunank200
CNCF Kubernetes
Cohere @sunank200
Common SQL @sunank200
- providers/common/sql/src/airflow/providers/common/sql/hooks/sql.py
- providers/common/sql/src/airflow/providers/common/sql/operators/generic_transfer.py
- providers/common/sql/src/airflow/providers/common/sql/operators/sql.py
- providers/common/sql/src/airflow/providers/common/sql/sensors/sql.py
- providers/common/sql/src/airflow/providers/common/sql/triggers/sql.py
- providers/common/sql/tests/unit/common/sql/hooks/test_dbapi.py
Datadog @sunank200
Docker @sunank200
Edge3: Not applicable, example dags should not be changed.
~- [ ] providers/edge3/src/airflow/providers/edge3/example_dags/integration_test.py
- [ ] providers/edge3/src/airflow/providers/edge3/example_dags/win_test.py
Elasticsearch @sunank200
Facebook @sunank200
FTP @sunank200
Git @amoghrajesh
GitHub @sunank200
Google @fweilun
- providers/google/src/airflow/providers/google/ads/hooks/ads.py (@fweilun)
- providers/google/src/airflow/providers/google/cloud/hooks/cloud_sql.py (@fweilun)
- providers/google/src/airflow/providers/google/cloud/hooks/dataprep.py (@fweilun)
- providers/google/src/airflow/providers/google/cloud/hooks/looker.py (@fweilun)
- providers/google/src/airflow/providers/google/cloud/operators/cloud_sql.py (@fweilun)
- providers/google/src/airflow/providers/google/common/hooks/base_google.py (@fweilun)
- providers/google/src/airflow/providers/google/leveldb/hooks/leveldb.py (@fweilun)
gRPC @sunank200
HashiCorp @sunank200
HTTP @sunank200
IMAP @sunank200
InfluxDB @sunank200
Jenkins @sunank200
Microsoft Azure @fweilun
- providers/microsoft/azure/src/airflow/providers/microsoft/azure/fs/adls.py (@fweilun)
- providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/adx.py (@fweilun)
- providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/asb.py (@fweilun)
- providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/base_azure.py (@fweilun)
- providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/batch.py (@fweilun)
- providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/container_registry.py (@fweilun)
- providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/container_volume.py (@fweilun)
- providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/cosmos.py (@fweilun)
- providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/data_factory.py (@fweilun)
- providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/data_lake.py (@fweilun)
- providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/fileshare.py (@fweilun)
- providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/msgraph.py (@fweilun)
- providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/synapse.py (@fweilun)
- providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/wasb.py (@fweilun)
- providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/data_factory.py (@fweilun)
- providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/synapse.py (@fweilun)
Microsoft PSRP
Microsoft WinRM
MongoDB
OpenAI @mingdaoy
OpenFaaS @amoghrajesh
- providers/openfaas/src/airflow/providers/openfaas/hooks/openfaas.py
- providers/openfaas/tests/unit/openfaas/hooks/test_openfaas.py
OpenSearch @kyungjunleeme
- providers/opensearch/src/airflow/providers/opensearch/hooks/opensearch.py
- providers/opensearch/tests/unit/opensearch/conftest.py
Opsgenie
PagerDuty @amoghrajesh
- providers/pagerduty/src/airflow/providers/pagerduty/hooks/pagerduty.py
- providers/pagerduty/src/airflow/providers/pagerduty/hooks/pagerduty_events.py
Papermill @amoghrajesh
Pinecone @amoghrajesh
Qdrant @amoghrajesh
Redis @dominikhei
Salesforce @amoghrajesh
Samba @amoghrajesh
Segment @amoghrajesh
SendGrid @amoghrajesh
SFTP @sjyangkevin
Slack @amoghrajesh
- providers/slack/src/airflow/providers/slack/hooks/slack.py
- providers/slack/src/airflow/providers/slack/hooks/slack_webhook.py
- providers/slack/src/airflow/providers/slack/transfers/base_sql_to_slack.py
SMTP @amoghrajesh
SSH @sunank200
Standard @amoghrajesh
- providers/standard/src/airflow/providers/standard/hooks/filesystem.py
- providers/standard/src/airflow/providers/standard/hooks/package_index.py
- providers/standard/src/airflow/providers/standard/hooks/subprocess.py
Tableau @dominikhei
Telegram @sunank200
Teradata @phanikumv
Weaviate @phanikumv
Yandex @phanikumv
Zendesk @phanikumv
TLDR of how to contribute:
- Pick an unchecked provider from the list above
- Comment on this issue to claim it (prevents duplicate work)
- Follow the steps 1 - 4
- Submit a PR
- Check off the completed provider in this issue if you have access
Committer
- I acknowledge that I am a maintainer/committer of the Apache Airflow project.