From 80b2c9ee61b619abc2cda38be032bc24dd4796dc Mon Sep 17 00:00:00 2001 From: Kaxil Naik Date: Wed, 22 Oct 2025 01:18:37 +0100 Subject: [PATCH] Migrate microsoft providers to ``common.compat`` Replace version-specific conditional imports with ``common.compat`` layer. This standardizes compatibility handling across Airflow 2.x and 3.x. Migrated providers: - Azure: 37 source files + 4 test files - PSRP: 3 source files + 1 test file - WinRM: 3 source files --- providers/microsoft/azure/pyproject.toml | 1 + .../providers/microsoft/azure/fs/adls.py | 2 +- .../providers/microsoft/azure/fs/msgraph.py | 2 +- .../providers/microsoft/azure/hooks/adx.py | 2 +- .../providers/microsoft/azure/hooks/asb.py | 2 +- .../microsoft/azure/hooks/base_azure.py | 2 +- .../providers/microsoft/azure/hooks/batch.py | 2 +- .../azure/hooks/container_registry.py | 2 +- .../microsoft/azure/hooks/container_volume.py | 2 +- .../providers/microsoft/azure/hooks/cosmos.py | 2 +- .../microsoft/azure/hooks/data_factory.py | 2 +- .../microsoft/azure/hooks/data_lake.py | 2 +- .../microsoft/azure/hooks/fileshare.py | 2 +- .../microsoft/azure/hooks/msgraph.py | 4 +-- .../microsoft/azure/hooks/synapse.py | 2 +- .../providers/microsoft/azure/hooks/wasb.py | 2 +- .../microsoft/azure/operators/adls.py | 2 +- .../microsoft/azure/operators/adx.py | 2 +- .../microsoft/azure/operators/asb.py | 2 +- .../microsoft/azure/operators/batch.py | 2 +- .../azure/operators/container_instances.py | 2 +- .../microsoft/azure/operators/cosmos.py | 2 +- .../microsoft/azure/operators/data_factory.py | 14 +-------- .../microsoft/azure/operators/msgraph.py | 2 +- .../microsoft/azure/operators/powerbi.py | 5 +--- .../microsoft/azure/operators/synapse.py | 14 +-------- .../azure/operators/wasb_delete_blob.py | 2 +- .../microsoft/azure/sensors/cosmos.py | 7 +---- .../microsoft/azure/sensors/data_factory.py | 7 +---- .../microsoft/azure/sensors/msgraph.py | 2 +- .../providers/microsoft/azure/sensors/wasb.py | 7 +---- .../azure/transfers/local_to_adls.py | 2 +- .../azure/transfers/local_to_wasb.py | 2 +- .../transfers/oracle_to_azure_data_lake.py | 2 +- .../microsoft/azure/transfers/s3_to_wasb.py | 2 +- .../microsoft/azure/transfers/sftp_to_wasb.py | 2 +- .../microsoft/azure/version_compat.py | 29 ------------------- .../microsoft/azure/operators/test_msgraph.py | 2 +- .../microsoft/azure/operators/test_powerbi.py | 2 +- .../azure/operators/test_powerbi_list.py | 2 +- .../tests/unit/microsoft/azure/test_utils.py | 2 +- providers/microsoft/psrp/pyproject.toml | 2 ++ .../providers/microsoft/psrp/hooks/psrp.py | 2 +- .../microsoft/psrp/operators/psrp.py | 2 +- .../microsoft/psrp/version_compat.py | 12 -------- .../microsoft/psrp/operators/test_psrp.py | 2 +- providers/microsoft/winrm/pyproject.toml | 2 ++ .../providers/microsoft/winrm/hooks/winrm.py | 2 +- .../microsoft/winrm/operators/winrm.py | 2 +- .../microsoft/winrm/version_compat.py | 12 -------- 50 files changed, 50 insertions(+), 140 deletions(-) diff --git a/providers/microsoft/azure/pyproject.toml b/providers/microsoft/azure/pyproject.toml index fcfd11ea1475b..99726d7ba407c 100644 --- a/providers/microsoft/azure/pyproject.toml +++ b/providers/microsoft/azure/pyproject.toml @@ -58,6 +58,7 @@ requires-python = ">=3.10" # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build`` dependencies = [ "apache-airflow>=2.10.0", + "apache-airflow-providers-common-compat>=1.7.4", # + TODO: bump to next version "adlfs>=2023.10.0", "azure-batch>=8.0.0", "azure-cosmos>=4.6.0", diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/fs/adls.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/fs/adls.py index c42304d696a4c..169d2cec3131f 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/fs/adls.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/fs/adls.py @@ -20,8 +20,8 @@ from azure.identity import ClientSecretCredential +from airflow.providers.common.compat.sdk import BaseHook from airflow.providers.microsoft.azure.utils import get_field, parse_blob_account_url -from airflow.providers.microsoft.azure.version_compat import BaseHook if TYPE_CHECKING: from fsspec import AbstractFileSystem diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/fs/msgraph.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/fs/msgraph.py index 990b74cf0d9a8..af3fabe3d6427 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/fs/msgraph.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/fs/msgraph.py @@ -19,8 +19,8 @@ from typing import TYPE_CHECKING, Any +from airflow.providers.common.compat.sdk import BaseHook from airflow.providers.microsoft.azure.utils import get_field -from airflow.providers.microsoft.azure.version_compat import BaseHook if TYPE_CHECKING: from fsspec import AbstractFileSystem diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/adx.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/adx.py index d83cab1c05b9e..4a95efe0193ad 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/adx.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/adx.py @@ -34,11 +34,11 @@ from azure.kusto.data.exceptions import KustoServiceError from airflow.exceptions import AirflowException +from airflow.providers.common.compat.sdk import BaseHook from airflow.providers.microsoft.azure.utils import ( add_managed_identity_connection_widgets, get_sync_default_azure_credential, ) -from airflow.providers.microsoft.azure.version_compat import BaseHook if TYPE_CHECKING: from azure.kusto.data.response import KustoResponseDataSet diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/asb.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/asb.py index d13ac20345b81..5b91adcce62e6 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/asb.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/asb.py @@ -37,12 +37,12 @@ SubscriptionProperties, ) +from airflow.providers.common.compat.sdk import BaseHook from airflow.providers.microsoft.azure.utils import ( add_managed_identity_connection_widgets, get_field, get_sync_default_azure_credential, ) -from airflow.providers.microsoft.azure.version_compat import BaseHook if TYPE_CHECKING: import datetime diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/base_azure.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/base_azure.py index b04b90bce76ca..c50e473e7a253 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/base_azure.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/base_azure.py @@ -23,12 +23,12 @@ from azure.identity import ClientSecretCredential, DefaultAzureCredential from airflow.exceptions import AirflowException +from airflow.providers.common.compat.sdk import BaseHook from airflow.providers.microsoft.azure.utils import ( AzureIdentityCredentialAdapter, add_managed_identity_connection_widgets, get_sync_default_azure_credential, ) -from airflow.providers.microsoft.azure.version_compat import BaseHook if TYPE_CHECKING: from azure.core.credentials import AccessToken diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/batch.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/batch.py index 96494e56f5e48..63fb4c3fe27ec 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/batch.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/batch.py @@ -25,12 +25,12 @@ from azure.batch import BatchServiceClient, batch_auth, models as batch_models from airflow.exceptions import AirflowException +from airflow.providers.common.compat.sdk import BaseHook from airflow.providers.microsoft.azure.utils import ( AzureIdentityCredentialAdapter, add_managed_identity_connection_widgets, get_field, ) -from airflow.providers.microsoft.azure.version_compat import BaseHook from airflow.utils import timezone if TYPE_CHECKING: diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/container_registry.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/container_registry.py index 521665caf12d0..836eb43a53413 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/container_registry.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/container_registry.py @@ -25,12 +25,12 @@ from azure.mgmt.containerinstance.models import ImageRegistryCredential from azure.mgmt.containerregistry import ContainerRegistryManagementClient +from airflow.providers.common.compat.sdk import BaseHook from airflow.providers.microsoft.azure.utils import ( add_managed_identity_connection_widgets, get_field, get_sync_default_azure_credential, ) -from airflow.providers.microsoft.azure.version_compat import BaseHook class AzureContainerRegistryHook(BaseHook): diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/container_volume.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/container_volume.py index ed6a063011bd6..d596d41df3510 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/container_volume.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/container_volume.py @@ -21,12 +21,12 @@ from azure.mgmt.containerinstance.models import AzureFileVolume, Volume from azure.mgmt.storage import StorageManagementClient +from airflow.providers.common.compat.sdk import BaseHook from airflow.providers.microsoft.azure.utils import ( add_managed_identity_connection_widgets, get_field, get_sync_default_azure_credential, ) -from airflow.providers.microsoft.azure.version_compat import BaseHook class AzureContainerVolumeHook(BaseHook): diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/cosmos.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/cosmos.py index 96b60f4a7cba6..c32b1d46cafad 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/cosmos.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/cosmos.py @@ -36,12 +36,12 @@ from azure.mgmt.cosmosdb import CosmosDBManagementClient from airflow.exceptions import AirflowBadRequest, AirflowException +from airflow.providers.common.compat.sdk import BaseHook from airflow.providers.microsoft.azure.utils import ( add_managed_identity_connection_widgets, get_field, get_sync_default_azure_credential, ) -from airflow.providers.microsoft.azure.version_compat import BaseHook if TYPE_CHECKING: PartitionKeyType = str | list[str] diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/data_factory.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/data_factory.py index fc0d23c6a9381..8846a13f6d78b 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/data_factory.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/data_factory.py @@ -49,12 +49,12 @@ from azure.mgmt.datafactory.aio import DataFactoryManagementClient as AsyncDataFactoryManagementClient from airflow.exceptions import AirflowException +from airflow.providers.common.compat.sdk import BaseHook from airflow.providers.microsoft.azure.utils import ( add_managed_identity_connection_widgets, get_async_default_azure_credential, get_sync_default_azure_credential, ) -from airflow.providers.microsoft.azure.version_compat import BaseHook if TYPE_CHECKING: from azure.core.polling import LROPoller diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/data_lake.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/data_lake.py index da00868a4533c..bfacecc5fe64d 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/data_lake.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/data_lake.py @@ -33,13 +33,13 @@ ) from airflow.exceptions import AirflowException +from airflow.providers.common.compat.sdk import BaseHook from airflow.providers.microsoft.azure.utils import ( AzureIdentityCredentialAdapter, add_managed_identity_connection_widgets, get_field, get_sync_default_azure_credential, ) -from airflow.providers.microsoft.azure.version_compat import BaseHook Credentials = ClientSecretCredential | AzureIdentityCredentialAdapter | DefaultAzureCredential diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/fileshare.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/fileshare.py index 439be31bb0317..eb6421e96be79 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/fileshare.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/fileshare.py @@ -21,11 +21,11 @@ from azure.storage.fileshare import FileProperties, ShareDirectoryClient, ShareFileClient, ShareServiceClient +from airflow.providers.common.compat.sdk import BaseHook from airflow.providers.microsoft.azure.utils import ( add_managed_identity_connection_widgets, get_sync_default_azure_credential, ) -from airflow.providers.microsoft.azure.version_compat import BaseHook class AzureFileShareHook(BaseHook): diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/msgraph.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/msgraph.py index bb4c47b023a6d..0fda316b71c0e 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/msgraph.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/msgraph.py @@ -53,7 +53,7 @@ AirflowNotFoundException, AirflowProviderDeprecationWarning, ) -from airflow.providers.microsoft.azure.version_compat import BaseHook +from airflow.providers.common.compat.sdk import BaseHook if TYPE_CHECKING: from azure.identity._internal.client_credential_base import ClientCredentialBase @@ -61,7 +61,7 @@ from kiota_abstractions.response_handler import NativeResponseType from kiota_abstractions.serialization import ParsableFactory - from airflow.providers.microsoft.azure.version_compat import Connection + from airflow.providers.common.compat.sdk import Connection class DefaultResponseHandler(ResponseHandler): diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/synapse.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/synapse.py index ceb86142aecb9..2157583520e35 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/synapse.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/synapse.py @@ -25,12 +25,12 @@ from azure.synapse.spark import SparkClient from airflow.exceptions import AirflowException, AirflowTaskTimeout +from airflow.providers.common.compat.sdk import BaseHook from airflow.providers.microsoft.azure.utils import ( add_managed_identity_connection_widgets, get_field, get_sync_default_azure_credential, ) -from airflow.providers.microsoft.azure.version_compat import BaseHook if TYPE_CHECKING: from azure.synapse.artifacts.models import CreateRunResponse, PipelineRun diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/wasb.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/wasb.py index 0bc91f8d1ebc2..9ce126caa8c2e 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/wasb.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/wasb.py @@ -45,13 +45,13 @@ ) from airflow.exceptions import AirflowException +from airflow.providers.common.compat.sdk import BaseHook from airflow.providers.microsoft.azure.utils import ( add_managed_identity_connection_widgets, get_async_default_azure_credential, get_sync_default_azure_credential, parse_blob_account_url, ) -from airflow.providers.microsoft.azure.version_compat import BaseHook if TYPE_CHECKING: from azure.core.credentials import TokenCredential diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/adls.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/adls.py index 632a8394f3698..a0f12abdfaef7 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/adls.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/adls.py @@ -19,8 +19,8 @@ from collections.abc import Iterable, Sequence from typing import IO, TYPE_CHECKING, Any, AnyStr +from airflow.providers.common.compat.sdk import BaseOperator from airflow.providers.microsoft.azure.hooks.data_lake import AzureDataLakeHook, AzureDataLakeStorageV2Hook -from airflow.providers.microsoft.azure.version_compat import BaseOperator if TYPE_CHECKING: from airflow.utils.context import Context diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/adx.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/adx.py index 289db346fc70a..55548267c7699 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/adx.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/adx.py @@ -24,8 +24,8 @@ from typing import TYPE_CHECKING from airflow.configuration import conf +from airflow.providers.common.compat.sdk import BaseOperator from airflow.providers.microsoft.azure.hooks.adx import AzureDataExplorerHook -from airflow.providers.microsoft.azure.version_compat import BaseOperator if TYPE_CHECKING: from azure.kusto.data._models import KustoResultTable diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/asb.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/asb.py index 6d94d07623d69..116233095e16d 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/asb.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/asb.py @@ -20,8 +20,8 @@ from typing import TYPE_CHECKING, Any from uuid import UUID +from airflow.providers.common.compat.sdk import BaseOperator from airflow.providers.microsoft.azure.hooks.asb import AdminClientHook, MessageHook -from airflow.providers.microsoft.azure.version_compat import BaseOperator if TYPE_CHECKING: import datetime diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/batch.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/batch.py index 9b6b3d212ec22..7697ce4837cc4 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/batch.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/batch.py @@ -24,8 +24,8 @@ from azure.batch import models as batch_models from airflow.exceptions import AirflowException +from airflow.providers.common.compat.sdk import BaseOperator from airflow.providers.microsoft.azure.hooks.batch import AzureBatchHook -from airflow.providers.microsoft.azure.version_compat import BaseOperator if TYPE_CHECKING: from airflow.utils.context import Context diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/container_instances.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/container_instances.py index 1f125daab2287..1e4398aae5108 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/container_instances.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/container_instances.py @@ -40,10 +40,10 @@ from msrestazure.azure_exceptions import CloudError from airflow.exceptions import AirflowException, AirflowTaskTimeout +from airflow.providers.common.compat.sdk import BaseOperator from airflow.providers.microsoft.azure.hooks.container_instance import AzureContainerInstanceHook from airflow.providers.microsoft.azure.hooks.container_registry import AzureContainerRegistryHook from airflow.providers.microsoft.azure.hooks.container_volume import AzureContainerVolumeHook -from airflow.providers.microsoft.azure.version_compat import BaseOperator if TYPE_CHECKING: from airflow.utils.context import Context diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/cosmos.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/cosmos.py index a708aa4e20da3..021a38d733c4c 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/cosmos.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/cosmos.py @@ -20,8 +20,8 @@ from collections.abc import Sequence from typing import TYPE_CHECKING +from airflow.providers.common.compat.sdk import BaseOperator from airflow.providers.microsoft.azure.hooks.cosmos import AzureCosmosDBHook -from airflow.providers.microsoft.azure.version_compat import BaseOperator if TYPE_CHECKING: from airflow.utils.context import Context diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/data_factory.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/data_factory.py index 4ebd39d7332dc..1c7c6915aea21 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/data_factory.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/data_factory.py @@ -24,6 +24,7 @@ from airflow.configuration import conf from airflow.exceptions import AirflowException +from airflow.providers.common.compat.sdk import BaseHook, BaseOperator, BaseOperatorLink, XCom from airflow.providers.microsoft.azure.hooks.data_factory import ( AzureDataFactoryHook, AzureDataFactoryPipelineRunException, @@ -31,25 +32,12 @@ get_field, ) from airflow.providers.microsoft.azure.triggers.data_factory import AzureDataFactoryTrigger -from airflow.providers.microsoft.azure.version_compat import ( - BaseHook, - BaseOperator, -) from airflow.utils.log.logging_mixin import LoggingMixin if TYPE_CHECKING: from airflow.models.taskinstancekey import TaskInstanceKey from airflow.utils.context import Context -from airflow.providers.microsoft.azure.version_compat import AIRFLOW_V_3_0_PLUS - -if AIRFLOW_V_3_0_PLUS: - from airflow.sdk import BaseOperatorLink - from airflow.sdk.execution_time.xcom import XCom -else: - from airflow.models import XCom - from airflow.models.baseoperatorlink import BaseOperatorLink # type: ignore[no-redef] - class AzureDataFactoryPipelineRunLink(LoggingMixin, BaseOperatorLink): """Construct a link to monitor a pipeline run in Azure Data Factory.""" diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/msgraph.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/msgraph.py index 5e008d50e8449..1d86311284406 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/msgraph.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/msgraph.py @@ -27,12 +27,12 @@ ) from airflow.exceptions import AirflowException, AirflowProviderDeprecationWarning, TaskDeferred +from airflow.providers.common.compat.sdk import XCOM_RETURN_KEY, BaseOperator from airflow.providers.microsoft.azure.hooks.msgraph import KiotaRequestAdapterHook from airflow.providers.microsoft.azure.triggers.msgraph import ( MSGraphTrigger, ResponseSerializer, ) -from airflow.providers.microsoft.azure.version_compat import XCOM_RETURN_KEY, BaseOperator if TYPE_CHECKING: from io import BytesIO diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/powerbi.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/powerbi.py index 09a9311cddf2a..44202f8e60ce9 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/powerbi.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/powerbi.py @@ -21,16 +21,13 @@ from typing import TYPE_CHECKING, Any from airflow.exceptions import AirflowException +from airflow.providers.common.compat.sdk import BaseOperator, BaseOperatorLink from airflow.providers.microsoft.azure.hooks.powerbi import PowerBIHook from airflow.providers.microsoft.azure.triggers.powerbi import ( PowerBIDatasetListTrigger, PowerBITrigger, PowerBIWorkspaceListTrigger, ) -from airflow.providers.microsoft.azure.version_compat import ( - BaseOperator, - BaseOperatorLink, -) if TYPE_CHECKING: from msgraph_core import APIVersion diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/synapse.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/synapse.py index 84c8d00540f4c..e0c8437260ba3 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/synapse.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/synapse.py @@ -22,6 +22,7 @@ from urllib.parse import urlencode from airflow.exceptions import AirflowException +from airflow.providers.common.compat.sdk import BaseHook, BaseOperator, BaseOperatorLink, XCom from airflow.providers.microsoft.azure.hooks.synapse import ( AzureSynapseHook, AzureSynapsePipelineHook, @@ -29,10 +30,6 @@ AzureSynapsePipelineRunStatus, AzureSynapseSparkBatchRunStatus, ) -from airflow.providers.microsoft.azure.version_compat import ( - BaseHook, - BaseOperator, -) if TYPE_CHECKING: from azure.synapse.spark.models import SparkBatchJobOptions @@ -40,15 +37,6 @@ from airflow.models.taskinstancekey import TaskInstanceKey from airflow.utils.context import Context -from airflow.providers.microsoft.azure.version_compat import AIRFLOW_V_3_0_PLUS - -if AIRFLOW_V_3_0_PLUS: - from airflow.sdk import BaseOperatorLink - from airflow.sdk.execution_time.xcom import XCom -else: - from airflow.models import XCom - from airflow.models.baseoperatorlink import BaseOperatorLink # type: ignore[no-redef] - class AzureSynapseRunSparkBatchOperator(BaseOperator): """ diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/wasb_delete_blob.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/wasb_delete_blob.py index 7831aa9eb82f1..631700ff93861 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/wasb_delete_blob.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/operators/wasb_delete_blob.py @@ -20,8 +20,8 @@ from collections.abc import Sequence from typing import TYPE_CHECKING, Any +from airflow.providers.common.compat.sdk import BaseOperator from airflow.providers.microsoft.azure.hooks.wasb import WasbHook -from airflow.providers.microsoft.azure.version_compat import BaseOperator if TYPE_CHECKING: from airflow.utils.context import Context diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/sensors/cosmos.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/sensors/cosmos.py index 91e8f4371aef5..5ef8d49afaaba 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/sensors/cosmos.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/sensors/cosmos.py @@ -20,13 +20,8 @@ from collections.abc import Sequence from typing import TYPE_CHECKING +from airflow.providers.common.compat.sdk import BaseSensorOperator from airflow.providers.microsoft.azure.hooks.cosmos import AzureCosmosDBHook -from airflow.providers.microsoft.azure.version_compat import AIRFLOW_V_3_0_PLUS - -if AIRFLOW_V_3_0_PLUS: - from airflow.sdk import BaseSensorOperator -else: - from airflow.sensors.base import BaseSensorOperator # type: ignore[no-redef] if TYPE_CHECKING: from airflow.utils.context import Context diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/sensors/data_factory.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/sensors/data_factory.py index 441df722214b5..c23f6ef122d9d 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/sensors/data_factory.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/sensors/data_factory.py @@ -23,18 +23,13 @@ from airflow.configuration import conf from airflow.exceptions import AirflowException +from airflow.providers.common.compat.sdk import BaseSensorOperator from airflow.providers.microsoft.azure.hooks.data_factory import ( AzureDataFactoryHook, AzureDataFactoryPipelineRunException, AzureDataFactoryPipelineRunStatus, ) from airflow.providers.microsoft.azure.triggers.data_factory import ADFPipelineRunStatusSensorTrigger -from airflow.providers.microsoft.azure.version_compat import AIRFLOW_V_3_0_PLUS - -if AIRFLOW_V_3_0_PLUS: - from airflow.sdk.bases.sensor import BaseSensorOperator -else: - from airflow.sensors.base import BaseSensorOperator # type: ignore[no-redef] if TYPE_CHECKING: from airflow.utils.context import Context diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/sensors/msgraph.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/sensors/msgraph.py index 2472ef71c01e3..0be8b98c872bf 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/sensors/msgraph.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/sensors/msgraph.py @@ -21,11 +21,11 @@ from typing import TYPE_CHECKING, Any from airflow.exceptions import AirflowException +from airflow.providers.common.compat.sdk import BaseSensorOperator from airflow.providers.common.compat.standard.triggers import TimeDeltaTrigger from airflow.providers.microsoft.azure.hooks.msgraph import KiotaRequestAdapterHook from airflow.providers.microsoft.azure.operators.msgraph import execute_callable from airflow.providers.microsoft.azure.triggers.msgraph import MSGraphTrigger, ResponseSerializer -from airflow.providers.microsoft.azure.version_compat import BaseSensorOperator if TYPE_CHECKING: from datetime import timedelta diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/sensors/wasb.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/sensors/wasb.py index 7f015e6222f77..53e43da945953 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/sensors/wasb.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/sensors/wasb.py @@ -23,14 +23,9 @@ from airflow.configuration import conf from airflow.exceptions import AirflowException +from airflow.providers.common.compat.sdk import BaseSensorOperator from airflow.providers.microsoft.azure.hooks.wasb import WasbHook from airflow.providers.microsoft.azure.triggers.wasb import WasbBlobSensorTrigger, WasbPrefixSensorTrigger -from airflow.providers.microsoft.azure.version_compat import AIRFLOW_V_3_0_PLUS - -if AIRFLOW_V_3_0_PLUS: - from airflow.sdk import BaseSensorOperator -else: - from airflow.sensors.base import BaseSensorOperator # type: ignore[no-redef] if TYPE_CHECKING: from airflow.utils.context import Context diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/local_to_adls.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/local_to_adls.py index 8f007cf93643a..2dcef3526b4c8 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/local_to_adls.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/local_to_adls.py @@ -20,8 +20,8 @@ from typing import TYPE_CHECKING, Any from airflow.exceptions import AirflowException +from airflow.providers.common.compat.sdk import BaseOperator from airflow.providers.microsoft.azure.hooks.data_lake import AzureDataLakeHook -from airflow.providers.microsoft.azure.version_compat import BaseOperator if TYPE_CHECKING: from airflow.utils.context import Context diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/local_to_wasb.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/local_to_wasb.py index 4f024294646d4..06d5b8c3ac77b 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/local_to_wasb.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/local_to_wasb.py @@ -20,8 +20,8 @@ from collections.abc import Sequence from typing import TYPE_CHECKING +from airflow.providers.common.compat.sdk import BaseOperator from airflow.providers.microsoft.azure.hooks.wasb import WasbHook -from airflow.providers.microsoft.azure.version_compat import BaseOperator if TYPE_CHECKING: from airflow.utils.context import Context diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/oracle_to_azure_data_lake.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/oracle_to_azure_data_lake.py index 1d4d472c98263..4b4630124288f 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/oracle_to_azure_data_lake.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/oracle_to_azure_data_lake.py @@ -23,8 +23,8 @@ from tempfile import TemporaryDirectory from typing import TYPE_CHECKING, Any, Literal +from airflow.providers.common.compat.sdk import BaseOperator from airflow.providers.microsoft.azure.hooks.data_lake import AzureDataLakeHook -from airflow.providers.microsoft.azure.version_compat import BaseOperator from airflow.providers.oracle.hooks.oracle import OracleHook if TYPE_CHECKING: diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/s3_to_wasb.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/s3_to_wasb.py index 97926b1c6c7db..c66e9724f507e 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/s3_to_wasb.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/s3_to_wasb.py @@ -23,8 +23,8 @@ from typing import TYPE_CHECKING from airflow.providers.amazon.aws.hooks.s3 import S3Hook +from airflow.providers.common.compat.sdk import BaseOperator from airflow.providers.microsoft.azure.hooks.wasb import WasbHook -from airflow.providers.microsoft.azure.version_compat import BaseOperator if TYPE_CHECKING: from airflow.utils.context import Context diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/sftp_to_wasb.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/sftp_to_wasb.py index 9b82e64876ea3..06d0d47406c7a 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/sftp_to_wasb.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/sftp_to_wasb.py @@ -30,7 +30,7 @@ from airflow.utils.context import Context from airflow.exceptions import AirflowException -from airflow.models import BaseOperator +from airflow.providers.common.compat.sdk import BaseOperator from airflow.providers.microsoft.azure.hooks.wasb import WasbHook from airflow.providers.microsoft.azure.version_compat import AIRFLOW_V_3_0_PLUS from airflow.providers.sftp.hooks.sftp import SFTPHook diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/version_compat.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/version_compat.py index 16e9cf3573058..209e8b63f35dc 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/version_compat.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/version_compat.py @@ -35,36 +35,7 @@ def get_base_airflow_version_tuple() -> tuple[int, int, int]: AIRFLOW_V_3_0_PLUS = get_base_airflow_version_tuple() >= (3, 0, 0) AIRFLOW_V_3_1_PLUS = get_base_airflow_version_tuple() >= (3, 1, 0) -if AIRFLOW_V_3_0_PLUS: - from airflow.sdk import ( - BaseOperator, - BaseOperatorLink, - BaseSensorOperator, - Connection, - Context, - ) -else: - from airflow.models import BaseOperator, BaseOperatorLink, Connection # type: ignore[assignment] - from airflow.sensors.base import BaseSensorOperator # type: ignore[no-redef] - from airflow.utils.context import Context # type: ignore[no-redef] - -if AIRFLOW_V_3_1_PLUS: - from airflow.sdk.bases.xcom import BaseXCom - - XCOM_RETURN_KEY = BaseXCom.XCOM_RETURN_KEY - from airflow.sdk import BaseHook -else: - from airflow.hooks.base import BaseHook # type: ignore[attr-defined,no-redef] - from airflow.utils.xcom import XCOM_RETURN_KEY # type: ignore[no-redef] - __all__ = [ "AIRFLOW_V_3_0_PLUS", "AIRFLOW_V_3_1_PLUS", - "BaseHook", - "BaseOperator", - "BaseOperatorLink", - "BaseSensorOperator", - "Connection", - "Context", - "XCOM_RETURN_KEY", ] diff --git a/providers/microsoft/azure/tests/unit/microsoft/azure/operators/test_msgraph.py b/providers/microsoft/azure/tests/unit/microsoft/azure/operators/test_msgraph.py index 57c194e561131..49ad0729acddf 100644 --- a/providers/microsoft/azure/tests/unit/microsoft/azure/operators/test_msgraph.py +++ b/providers/microsoft/azure/tests/unit/microsoft/azure/operators/test_msgraph.py @@ -26,8 +26,8 @@ import pytest from airflow.exceptions import AirflowException, AirflowProviderDeprecationWarning +from airflow.providers.common.compat.sdk import Context from airflow.providers.microsoft.azure.operators.msgraph import MSGraphAsyncOperator, execute_callable -from airflow.providers.microsoft.azure.version_compat import Context from airflow.triggers.base import TriggerEvent from tests_common.test_utils.file_loading import load_file_from_resources, load_json_from_resources diff --git a/providers/microsoft/azure/tests/unit/microsoft/azure/operators/test_powerbi.py b/providers/microsoft/azure/tests/unit/microsoft/azure/operators/test_powerbi.py index 3b8e80c6ede2b..ed0ba32013881 100644 --- a/providers/microsoft/azure/tests/unit/microsoft/azure/operators/test_powerbi.py +++ b/providers/microsoft/azure/tests/unit/microsoft/azure/operators/test_powerbi.py @@ -23,13 +23,13 @@ import pytest from airflow.exceptions import AirflowException, TaskDeferred +from airflow.providers.common.compat.sdk import BaseHook from airflow.providers.microsoft.azure.hooks.powerbi import ( PowerBIDatasetRefreshFields, PowerBIDatasetRefreshStatus, ) from airflow.providers.microsoft.azure.operators.powerbi import PowerBIDatasetRefreshOperator from airflow.providers.microsoft.azure.triggers.powerbi import PowerBITrigger -from airflow.providers.microsoft.azure.version_compat import BaseHook from tests_common.test_utils.mock_context import mock_context from unit.microsoft.azure.test_utils import get_airflow_connection diff --git a/providers/microsoft/azure/tests/unit/microsoft/azure/operators/test_powerbi_list.py b/providers/microsoft/azure/tests/unit/microsoft/azure/operators/test_powerbi_list.py index f59c0fbab1714..85fca41caa97b 100644 --- a/providers/microsoft/azure/tests/unit/microsoft/azure/operators/test_powerbi_list.py +++ b/providers/microsoft/azure/tests/unit/microsoft/azure/operators/test_powerbi_list.py @@ -23,6 +23,7 @@ import pytest from airflow.exceptions import AirflowException, TaskDeferred +from airflow.providers.common.compat.sdk import BaseHook from airflow.providers.microsoft.azure.operators.powerbi import ( PowerBIDatasetListOperator, PowerBIWorkspaceListOperator, @@ -31,7 +32,6 @@ PowerBIDatasetListTrigger, PowerBIWorkspaceListTrigger, ) -from airflow.providers.microsoft.azure.version_compat import BaseHook from unit.microsoft.azure.test_utils import get_airflow_connection diff --git a/providers/microsoft/azure/tests/unit/microsoft/azure/test_utils.py b/providers/microsoft/azure/tests/unit/microsoft/azure/test_utils.py index 0cd0a26e6f688..c56d53f71957a 100644 --- a/providers/microsoft/azure/tests/unit/microsoft/azure/test_utils.py +++ b/providers/microsoft/azure/tests/unit/microsoft/azure/test_utils.py @@ -29,6 +29,7 @@ from kiota_http.httpx_request_adapter import HttpxRequestAdapter from msgraph_core import APIVersion +from airflow.providers.common.compat.sdk import BaseHook from airflow.providers.microsoft.azure.utils import ( AzureIdentityCredentialAdapter, add_managed_identity_connection_widgets, @@ -38,7 +39,6 @@ get_sync_default_azure_credential, parse_blob_account_url, ) -from airflow.providers.microsoft.azure.version_compat import BaseHook MODULE = "airflow.providers.microsoft.azure.utils" diff --git a/providers/microsoft/psrp/pyproject.toml b/providers/microsoft/psrp/pyproject.toml index 314b62ddae4e0..316642bb4d4a4 100644 --- a/providers/microsoft/psrp/pyproject.toml +++ b/providers/microsoft/psrp/pyproject.toml @@ -58,6 +58,7 @@ requires-python = ">=3.10" # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build`` dependencies = [ "apache-airflow>=2.10.0", + "apache-airflow-providers-common-compat>=1.7.4", # + TODO: bump to next version "pypsrp>=0.8.0", ] @@ -66,6 +67,7 @@ dev = [ "apache-airflow", "apache-airflow-task-sdk", "apache-airflow-devel-common", + "apache-airflow-providers-common-compat", # Additional devel dependencies (do not remove this line and add extra development dependencies) ] diff --git a/providers/microsoft/psrp/src/airflow/providers/microsoft/psrp/hooks/psrp.py b/providers/microsoft/psrp/src/airflow/providers/microsoft/psrp/hooks/psrp.py index 2308fd1b1bce4..d6a86e2a95cf0 100644 --- a/providers/microsoft/psrp/src/airflow/providers/microsoft/psrp/hooks/psrp.py +++ b/providers/microsoft/psrp/src/airflow/providers/microsoft/psrp/hooks/psrp.py @@ -29,7 +29,7 @@ from pypsrp.wsman import WSMan from airflow.exceptions import AirflowException -from airflow.providers.microsoft.psrp.version_compat import BaseHook +from airflow.providers.common.compat.sdk import BaseHook INFORMATIONAL_RECORD_LEVEL_MAP = { MessageType.DEBUG_RECORD: DEBUG, diff --git a/providers/microsoft/psrp/src/airflow/providers/microsoft/psrp/operators/psrp.py b/providers/microsoft/psrp/src/airflow/providers/microsoft/psrp/operators/psrp.py index 0fa57341e2669..0de049e672c2f 100644 --- a/providers/microsoft/psrp/src/airflow/providers/microsoft/psrp/operators/psrp.py +++ b/providers/microsoft/psrp/src/airflow/providers/microsoft/psrp/operators/psrp.py @@ -25,8 +25,8 @@ from pypsrp.serializer import TaggedValue from airflow.exceptions import AirflowException +from airflow.providers.common.compat.sdk import BaseOperator from airflow.providers.microsoft.psrp.hooks.psrp import PsrpHook -from airflow.providers.microsoft.psrp.version_compat import BaseOperator from airflow.settings import json from airflow.utils.helpers import exactly_one diff --git a/providers/microsoft/psrp/src/airflow/providers/microsoft/psrp/version_compat.py b/providers/microsoft/psrp/src/airflow/providers/microsoft/psrp/version_compat.py index 41a69e29ee302..fe3ccfcfd3d7a 100644 --- a/providers/microsoft/psrp/src/airflow/providers/microsoft/psrp/version_compat.py +++ b/providers/microsoft/psrp/src/airflow/providers/microsoft/psrp/version_compat.py @@ -30,19 +30,7 @@ def get_base_airflow_version_tuple() -> tuple[int, int, int]: 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_0_PLUS: - from airflow.sdk import BaseOperator -else: - from airflow.models import BaseOperator - -if AIRFLOW_V_3_1_PLUS: - from airflow.sdk import BaseHook -else: - from airflow.hooks.base import BaseHook # type: ignore[attr-defined,no-redef] - __all__ = [ "AIRFLOW_V_3_0_PLUS", "AIRFLOW_V_3_1_PLUS", - "BaseOperator", - "BaseHook", ] diff --git a/providers/microsoft/psrp/tests/unit/microsoft/psrp/operators/test_psrp.py b/providers/microsoft/psrp/tests/unit/microsoft/psrp/operators/test_psrp.py index ca5642247058e..e3cb20116b011 100644 --- a/providers/microsoft/psrp/tests/unit/microsoft/psrp/operators/test_psrp.py +++ b/providers/microsoft/psrp/tests/unit/microsoft/psrp/operators/test_psrp.py @@ -25,8 +25,8 @@ from pypsrp.powershell import Command, PowerShell from airflow.exceptions import AirflowException +from airflow.providers.common.compat.sdk import BaseOperator from airflow.providers.microsoft.psrp.operators.psrp import PsrpOperator -from airflow.providers.microsoft.psrp.version_compat import BaseOperator from airflow.settings import json CONNECTION_ID = "conn_id" diff --git a/providers/microsoft/winrm/pyproject.toml b/providers/microsoft/winrm/pyproject.toml index 1d3055db3c29a..72c688a78bdc8 100644 --- a/providers/microsoft/winrm/pyproject.toml +++ b/providers/microsoft/winrm/pyproject.toml @@ -58,6 +58,7 @@ requires-python = ">=3.10" # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build`` dependencies = [ "apache-airflow>=2.10.0", + "apache-airflow-providers-common-compat>=1.7.4", # + TODO: bump to next version "pywinrm>=0.5.0", ] @@ -66,6 +67,7 @@ dev = [ "apache-airflow", "apache-airflow-task-sdk", "apache-airflow-devel-common", + "apache-airflow-providers-common-compat", # Additional devel dependencies (do not remove this line and add extra development dependencies) ] diff --git a/providers/microsoft/winrm/src/airflow/providers/microsoft/winrm/hooks/winrm.py b/providers/microsoft/winrm/src/airflow/providers/microsoft/winrm/hooks/winrm.py index 5c8783835d280..edc08ef5b851b 100644 --- a/providers/microsoft/winrm/src/airflow/providers/microsoft/winrm/hooks/winrm.py +++ b/providers/microsoft/winrm/src/airflow/providers/microsoft/winrm/hooks/winrm.py @@ -26,7 +26,7 @@ from winrm.protocol import Protocol from airflow.exceptions import AirflowException -from airflow.providers.microsoft.winrm.version_compat import BaseHook +from airflow.providers.common.compat.sdk import BaseHook from airflow.utils.platform import getuser # TODO: FIXME please - I have too complex implementation diff --git a/providers/microsoft/winrm/src/airflow/providers/microsoft/winrm/operators/winrm.py b/providers/microsoft/winrm/src/airflow/providers/microsoft/winrm/operators/winrm.py index 8794139388865..917297c898ea5 100644 --- a/providers/microsoft/winrm/src/airflow/providers/microsoft/winrm/operators/winrm.py +++ b/providers/microsoft/winrm/src/airflow/providers/microsoft/winrm/operators/winrm.py @@ -24,8 +24,8 @@ from airflow.configuration import conf from airflow.exceptions import AirflowException +from airflow.providers.common.compat.sdk import BaseOperator from airflow.providers.microsoft.winrm.hooks.winrm import WinRMHook -from airflow.providers.microsoft.winrm.version_compat import BaseOperator if TYPE_CHECKING: from airflow.utils.context import Context diff --git a/providers/microsoft/winrm/src/airflow/providers/microsoft/winrm/version_compat.py b/providers/microsoft/winrm/src/airflow/providers/microsoft/winrm/version_compat.py index 41a69e29ee302..fe3ccfcfd3d7a 100644 --- a/providers/microsoft/winrm/src/airflow/providers/microsoft/winrm/version_compat.py +++ b/providers/microsoft/winrm/src/airflow/providers/microsoft/winrm/version_compat.py @@ -30,19 +30,7 @@ def get_base_airflow_version_tuple() -> tuple[int, int, int]: 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_0_PLUS: - from airflow.sdk import BaseOperator -else: - from airflow.models import BaseOperator - -if AIRFLOW_V_3_1_PLUS: - from airflow.sdk import BaseHook -else: - from airflow.hooks.base import BaseHook # type: ignore[attr-defined,no-redef] - __all__ = [ "AIRFLOW_V_3_0_PLUS", "AIRFLOW_V_3_1_PLUS", - "BaseOperator", - "BaseHook", ]