This is an automated email from the ASF dual-hosted git repository.
kaxilnaik pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new ad809637152 Migrate redis provider to ``common.compat`` (#57006)
ad809637152 is described below
commit ad8096371520607d24055f172300f8a2b7607c26
Author: Kaxil Naik <[email protected]>
AuthorDate: Wed Oct 22 13:59:25 2025 +0100
Migrate redis provider to ``common.compat`` (#57006)
Replace version-specific conditional imports with common.compat layer.
This standardizes compatibility handling across Airflow 2.x and 3.x.
---
providers/redis/pyproject.toml | 2 ++
providers/redis/src/airflow/providers/redis/hooks/redis.py | 2 +-
.../src/airflow/providers/redis/operators/redis_publish.py | 8 ++------
.../redis/src/airflow/providers/redis/sensors/redis_key.py | 8 ++------
.../src/airflow/providers/redis/sensors/redis_pub_sub.py | 8 ++------
.../redis/src/airflow/providers/redis/version_compat.py | 13 +------------
.../redis/tests/unit/redis/log/test_redis_task_handler.py | 5 ++---
7 files changed, 12 insertions(+), 34 deletions(-)
diff --git a/providers/redis/pyproject.toml b/providers/redis/pyproject.toml
index 8a41940c383..48d9590672d 100644
--- a/providers/redis/pyproject.toml
+++ b/providers/redis/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
# 5.0.2 excluded due to breaking changes which fixed in
https://github.com/redis/redis-py/pull/3176
"redis>=4.5.2,!=4.5.5,!=5.0.2",
]
@@ -74,6 +75,7 @@ dev = [
"apache-airflow",
"apache-airflow-task-sdk",
"apache-airflow-devel-common",
+ "apache-airflow-providers-common-compat",
"apache-airflow-providers-common-messaging",
# Additional devel dependencies (do not remove this line and add extra
development dependencies)
]
diff --git a/providers/redis/src/airflow/providers/redis/hooks/redis.py
b/providers/redis/src/airflow/providers/redis/hooks/redis.py
index 3f7d0a7a500..1e9740768ba 100644
--- a/providers/redis/src/airflow/providers/redis/hooks/redis.py
+++ b/providers/redis/src/airflow/providers/redis/hooks/redis.py
@@ -23,7 +23,7 @@ from typing import Any
from redis import Redis
-from airflow.providers.redis.version_compat import BaseHook
+from airflow.providers.common.compat.sdk import BaseHook
DEFAULT_SSL_CERT_REQS = "required"
ALLOWED_SSL_CERT_REQS = [DEFAULT_SSL_CERT_REQS, "optional", "none"]
diff --git
a/providers/redis/src/airflow/providers/redis/operators/redis_publish.py
b/providers/redis/src/airflow/providers/redis/operators/redis_publish.py
index dc933000cf5..abdb3f647bc 100644
--- a/providers/redis/src/airflow/providers/redis/operators/redis_publish.py
+++ b/providers/redis/src/airflow/providers/redis/operators/redis_publish.py
@@ -20,15 +20,11 @@ from __future__ import annotations
from collections.abc import Sequence
from typing import TYPE_CHECKING
+from airflow.providers.common.compat.sdk import BaseOperator
from airflow.providers.redis.hooks.redis import RedisHook
-from airflow.providers.redis.version_compat import BaseOperator
if TYPE_CHECKING:
- try:
- from airflow.sdk.definitions.context import Context
- except ImportError:
- # TODO: Remove once provider drops support for Airflow 2
- from airflow.utils.context import Context
+ from airflow.providers.common.compat.sdk import Context
class RedisPublishOperator(BaseOperator):
diff --git a/providers/redis/src/airflow/providers/redis/sensors/redis_key.py
b/providers/redis/src/airflow/providers/redis/sensors/redis_key.py
index 5f4eeb9fab4..e2c47c4357c 100644
--- a/providers/redis/src/airflow/providers/redis/sensors/redis_key.py
+++ b/providers/redis/src/airflow/providers/redis/sensors/redis_key.py
@@ -20,15 +20,11 @@ from __future__ import annotations
from collections.abc import Sequence
from typing import TYPE_CHECKING
+from airflow.providers.common.compat.sdk import BaseSensorOperator
from airflow.providers.redis.hooks.redis import RedisHook
-from airflow.providers.redis.version_compat import BaseSensorOperator
if TYPE_CHECKING:
- try:
- from airflow.sdk.definitions.context import Context
- except ImportError:
- # TODO: Remove once provider drops support for Airflow 2
- from airflow.utils.context import Context
+ from airflow.providers.common.compat.sdk import Context
class RedisKeySensor(BaseSensorOperator):
diff --git
a/providers/redis/src/airflow/providers/redis/sensors/redis_pub_sub.py
b/providers/redis/src/airflow/providers/redis/sensors/redis_pub_sub.py
index d2ba79d8246..1c13afeabbe 100644
--- a/providers/redis/src/airflow/providers/redis/sensors/redis_pub_sub.py
+++ b/providers/redis/src/airflow/providers/redis/sensors/redis_pub_sub.py
@@ -21,15 +21,11 @@ from collections.abc import Sequence
from functools import cached_property
from typing import TYPE_CHECKING
+from airflow.providers.common.compat.sdk import BaseSensorOperator
from airflow.providers.redis.hooks.redis import RedisHook
-from airflow.providers.redis.version_compat import BaseSensorOperator
if TYPE_CHECKING:
- try:
- from airflow.sdk.definitions.context import Context
- except ImportError:
- # TODO: Remove once provider drops support for Airflow 2
- from airflow.utils.context import Context
+ from airflow.providers.common.compat.sdk import Context
class RedisPubSubSensor(BaseSensorOperator):
diff --git a/providers/redis/src/airflow/providers/redis/version_compat.py
b/providers/redis/src/airflow/providers/redis/version_compat.py
index 698933df67f..f5bb3ae555c 100644
--- a/providers/redis/src/airflow/providers/redis/version_compat.py
+++ b/providers/redis/src/airflow/providers/redis/version_compat.py
@@ -35,15 +35,4 @@ 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_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, BaseSensorOperator
-else:
- from airflow.models import BaseOperator
- from airflow.sensors.base import BaseSensorOperator # type:
ignore[no-redef]
-
-__all__ = ["BaseOperator", "BaseSensorOperator", "BaseHook"]
+__all__ = ["AIRFLOW_V_3_0_PLUS", "AIRFLOW_V_3_1_PLUS"]
diff --git a/providers/redis/tests/unit/redis/log/test_redis_task_handler.py
b/providers/redis/tests/unit/redis/log/test_redis_task_handler.py
index 4d1e1927f26..f6704d24e8a 100644
--- a/providers/redis/tests/unit/redis/log/test_redis_task_handler.py
+++ b/providers/redis/tests/unit/redis/log/test_redis_task_handler.py
@@ -23,6 +23,7 @@ from unittest.mock import patch
import pytest
from airflow.models import DagRun, TaskInstance
+from airflow.providers.common.compat.sdk import timezone
from airflow.providers.redis.log.redis_task_handler import RedisTaskHandler
from airflow.providers.standard.operators.empty import EmptyOperator
from airflow.utils.session import create_session
@@ -40,10 +41,8 @@ from tests_common.test_utils.version_compat import (
if AIRFLOW_V_3_1_PLUS:
from airflow.sdk import DAG
- from airflow.sdk.timezone import datetime
else:
from airflow.models import DAG
- from airflow.utils.timezone import datetime # type: ignore[no-redef]
class TestRedisTaskHandler:
@@ -56,7 +55,7 @@ class TestRedisTaskHandler:
@pytest.fixture
def ti(self):
- date = datetime(2020, 1, 1)
+ date = timezone.datetime(2020, 1, 1)
dag = DAG(dag_id="dag_for_testing_redis_task_handler", schedule=None,
start_date=date)
task = EmptyOperator(task_id="task_for_testing_redis_log_handler",
dag=dag)
if AIRFLOW_V_3_0_PLUS: