This is an automated email from the ASF dual-hosted git repository.
husseinawala 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 58d8577f35 Improve importing the module in Airflow utils package
(#33803)
58d8577f35 is described below
commit 58d8577f3528e7e143addefb03711bdc82cb1782
Author: Hussein Awala <[email protected]>
AuthorDate: Sun Aug 27 22:00:10 2023 +0200
Improve importing the module in Airflow utils package (#33803)
---
airflow/utils/airflow_flask_app.py | 7 ++++---
airflow/utils/cli.py | 3 ++-
airflow/utils/dag_edges.py | 8 ++++++--
airflow/utils/db_cleanup.py | 12 ++++++++----
airflow/utils/dot_renderer.py | 12 +++++++-----
airflow/utils/helpers.py | 2 +-
airflow/utils/log/colored_log.py | 6 ++++--
airflow/utils/log/log_reader.py | 10 ++++++----
airflow/utils/log/logging_mixin.py | 7 +++++--
airflow/utils/log/secrets_masker.py | 3 ++-
airflow/utils/log/trigger_handler.py | 4 +++-
airflow/utils/mixins.py | 5 ++---
airflow/utils/module_loading.py | 6 ++++--
airflow/utils/session.py | 6 ++++--
airflow/utils/sqlalchemy.py | 8 +++++---
airflow/utils/task_group.py | 3 ++-
16 files changed, 65 insertions(+), 37 deletions(-)
diff --git a/airflow/utils/airflow_flask_app.py
b/airflow/utils/airflow_flask_app.py
index 751fcba8c3..f18f02a0ec 100644
--- a/airflow/utils/airflow_flask_app.py
+++ b/airflow/utils/airflow_flask_app.py
@@ -16,12 +16,13 @@
# under the License.
from __future__ import annotations
-from typing import Any, cast
+from typing import TYPE_CHECKING, Any, cast
from flask import Flask
-from airflow.models.dagbag import DagBag
-from airflow.www.extensions.init_appbuilder import AirflowAppBuilder
+if TYPE_CHECKING:
+ from airflow.models.dagbag import DagBag
+ from airflow.www.extensions.init_appbuilder import AirflowAppBuilder
class AirflowApp(Flask):
diff --git a/airflow/utils/cli.py b/airflow/utils/cli.py
index 0682e65313..4343c797d9 100644
--- a/airflow/utils/cli.py
+++ b/airflow/utils/cli.py
@@ -33,7 +33,6 @@ from typing import TYPE_CHECKING, Callable, TypeVar, cast
import re2
from sqlalchemy import select
-from sqlalchemy.orm import Session
from airflow import settings
from airflow.exceptions import AirflowException, RemovedInAirflow3Warning
@@ -45,6 +44,8 @@ from airflow.utils.session import NEW_SESSION, provide_session
T = TypeVar("T", bound=Callable)
if TYPE_CHECKING:
+ from sqlalchemy.orm import Session
+
from airflow.models.dag import DAG
logger = logging.getLogger(__name__)
diff --git a/airflow/utils/dag_edges.py b/airflow/utils/dag_edges.py
index 7e31762ad9..f7d0f7e7d8 100644
--- a/airflow/utils/dag_edges.py
+++ b/airflow/utils/dag_edges.py
@@ -16,9 +16,13 @@
# under the License.
from __future__ import annotations
-from airflow.models import Operator
+from typing import TYPE_CHECKING
+
from airflow.models.abstractoperator import AbstractOperator
-from airflow.models.dag import DAG
+
+if TYPE_CHECKING:
+ from airflow.models import Operator
+ from airflow.models.dag import DAG
def dag_edges(dag: DAG):
diff --git a/airflow/utils/db_cleanup.py b/airflow/utils/db_cleanup.py
index f4e0293430..0f7eb8064c 100644
--- a/airflow/utils/db_cleanup.py
+++ b/airflow/utils/db_cleanup.py
@@ -27,24 +27,28 @@ import logging
import os
from contextlib import contextmanager
from dataclasses import dataclass
-from typing import Any
+from typing import TYPE_CHECKING, Any
-from pendulum import DateTime
from sqlalchemy import and_, column, false, func, inspect, select, table, text
from sqlalchemy.exc import OperationalError, ProgrammingError
from sqlalchemy.ext.compiler import compiles
-from sqlalchemy.orm import Query, Session, aliased
+from sqlalchemy.orm import aliased
from sqlalchemy.sql.expression import ClauseElement, Executable, tuple_
from airflow import AirflowException
from airflow.cli.simple_table import AirflowConsole
from airflow.configuration import conf
-from airflow.models import Base
from airflow.utils import timezone
from airflow.utils.db import reflect_tables
from airflow.utils.helpers import ask_yesno
from airflow.utils.session import NEW_SESSION, provide_session
+if TYPE_CHECKING:
+ from pendulum import DateTime
+ from sqlalchemy.orm import Query, Session
+
+ from airflow.models import Base
+
logger = logging.getLogger(__file__)
ARCHIVE_TABLE_PREFIX = "_airflow_deleted__"
diff --git a/airflow/utils/dot_renderer.py b/airflow/utils/dot_renderer.py
index b6e2cdb7b0..05b91d9fc8 100644
--- a/airflow/utils/dot_renderer.py
+++ b/airflow/utils/dot_renderer.py
@@ -19,21 +19,23 @@
"""Renderer DAG (tasks and dependencies) to the graphviz object."""
from __future__ import annotations
-from typing import Any
+from typing import TYPE_CHECKING, Any
import graphviz
from airflow import AirflowException
-from airflow.models import TaskInstance
from airflow.models.baseoperator import BaseOperator
-from airflow.models.dag import DAG
from airflow.models.mappedoperator import MappedOperator
-from airflow.models.taskmixin import DependencyMixin
-from airflow.serialization.serialized_objects import DagDependency
from airflow.utils.dag_edges import dag_edges
from airflow.utils.state import State
from airflow.utils.task_group import TaskGroup
+if TYPE_CHECKING:
+ from airflow.models import TaskInstance
+ from airflow.models.dag import DAG
+ from airflow.models.taskmixin import DependencyMixin
+ from airflow.serialization.serialized_objects import DagDependency
+
def _refine_color(color: str):
"""
diff --git a/airflow/utils/helpers.py b/airflow/utils/helpers.py
index baef1d3209..acbe25bd92 100644
--- a/airflow/utils/helpers.py
+++ b/airflow/utils/helpers.py
@@ -30,7 +30,6 @@ from lazy_object_proxy import Proxy
from airflow.configuration import conf
from airflow.exceptions import AirflowException, RemovedInAirflow3Warning
-from airflow.utils.context import Context
from airflow.utils.module_loading import import_string
from airflow.utils.types import NOTSET
@@ -38,6 +37,7 @@ if TYPE_CHECKING:
import jinja2
from airflow.models.taskinstance import TaskInstance
+ from airflow.utils.context import Context
KEY_REGEX = re.compile(r"^[\w.-]+$")
GROUP_KEY_REGEX = re.compile(r"^[\w-]+$")
diff --git a/airflow/utils/log/colored_log.py b/airflow/utils/log/colored_log.py
index 3afa39410d..2ed4fb4ed8 100644
--- a/airflow/utils/log/colored_log.py
+++ b/airflow/utils/log/colored_log.py
@@ -19,8 +19,7 @@
from __future__ import annotations
import sys
-from logging import LogRecord
-from typing import Any
+from typing import TYPE_CHECKING, Any
import re2
from colorlog import TTYColoredFormatter
@@ -28,6 +27,9 @@ from colorlog.escape_codes import esc, escape_codes
from airflow.utils.log.timezone_aware import TimezoneAware
+if TYPE_CHECKING:
+ from logging import LogRecord
+
DEFAULT_COLORS = {
"DEBUG": "green",
"INFO": "",
diff --git a/airflow/utils/log/log_reader.py b/airflow/utils/log/log_reader.py
index 9e751e47b1..589281fd55 100644
--- a/airflow/utils/log/log_reader.py
+++ b/airflow/utils/log/log_reader.py
@@ -19,17 +19,19 @@ from __future__ import annotations
import logging
import time
from functools import cached_property
-from typing import Iterator
-
-from sqlalchemy.orm.session import Session
+from typing import TYPE_CHECKING, Iterator
from airflow.configuration import conf
-from airflow.models.taskinstance import TaskInstance
from airflow.utils.helpers import render_log_filename
from airflow.utils.log.logging_mixin import ExternalLoggingMixin
from airflow.utils.session import NEW_SESSION, provide_session
from airflow.utils.state import TaskInstanceState
+if TYPE_CHECKING:
+ from sqlalchemy.orm.session import Session
+
+ from airflow.models.taskinstance import TaskInstance
+
class TaskLogReader:
"""Task log reader."""
diff --git a/airflow/utils/log/logging_mixin.py
b/airflow/utils/log/logging_mixin.py
index a3d3b4b00c..5ef9885bdd 100644
--- a/airflow/utils/log/logging_mixin.py
+++ b/airflow/utils/log/logging_mixin.py
@@ -22,11 +22,14 @@ import enum
import logging
import sys
from io import IOBase
-from logging import Handler, Logger, StreamHandler
-from typing import IO, Any, TypeVar, cast
+from logging import Handler, StreamHandler
+from typing import IO, TYPE_CHECKING, Any, TypeVar, cast
import re2
+if TYPE_CHECKING:
+ from logging import Logger
+
# 7-bit C1 ANSI escape sequences
ANSI_ESCAPE = re2.compile(r"\x1B[@-_][0-?]*[ -/]*[@-~]")
diff --git a/airflow/utils/log/secrets_masker.py
b/airflow/utils/log/secrets_masker.py
index bb39dbf95b..735d6e03a7 100644
--- a/airflow/utils/log/secrets_masker.py
+++ b/airflow/utils/log/secrets_masker.py
@@ -42,11 +42,12 @@ import re2
from airflow import settings
from airflow.compat.functools import cache
-from airflow.typing_compat import TypeGuard
if TYPE_CHECKING:
from kubernetes.client import V1EnvVar
+ from airflow.typing_compat import TypeGuard
+
Redactable = TypeVar("Redactable", str, "V1EnvVar", Dict[Any, Any], Tuple[Any,
...], List[Any])
Redacted = Union[Redactable, str]
diff --git a/airflow/utils/log/trigger_handler.py
b/airflow/utils/log/trigger_handler.py
index 54f8ace65e..42afcd8afe 100644
--- a/airflow/utils/log/trigger_handler.py
+++ b/airflow/utils/log/trigger_handler.py
@@ -22,8 +22,10 @@ import logging
from contextvars import ContextVar
from copy import copy
from logging.handlers import QueueHandler
+from typing import TYPE_CHECKING
-from airflow.utils.log.file_task_handler import FileTaskHandler
+if TYPE_CHECKING:
+ from airflow.utils.log.file_task_handler import FileTaskHandler
ctx_task_instance: ContextVar = ContextVar("task_instance")
ctx_trigger_id: ContextVar = ContextVar("trigger_id")
diff --git a/airflow/utils/mixins.py b/airflow/utils/mixins.py
index e3c6a8efec..26e6c2192c 100644
--- a/airflow/utils/mixins.py
+++ b/airflow/utils/mixins.py
@@ -19,15 +19,14 @@
from __future__ import annotations
import multiprocessing
+import multiprocessing.context
import typing
from airflow.configuration import conf
-from airflow.utils.context import Context
if typing.TYPE_CHECKING:
- import multiprocessing.context
-
from airflow.models.operator import Operator
+ from airflow.utils.context import Context
class MultiprocessingStartMethodMixin:
diff --git a/airflow/utils/module_loading.py b/airflow/utils/module_loading.py
index d81ab65e85..36d935f109 100644
--- a/airflow/utils/module_loading.py
+++ b/airflow/utils/module_loading.py
@@ -19,8 +19,10 @@ from __future__ import annotations
import pkgutil
from importlib import import_module
-from types import ModuleType
-from typing import Callable
+from typing import TYPE_CHECKING, Callable
+
+if TYPE_CHECKING:
+ from types import ModuleType
def import_string(dotted_path: str):
diff --git a/airflow/utils/session.py b/airflow/utils/session.py
index 400cac7375..b3b610d199 100644
--- a/airflow/utils/session.py
+++ b/airflow/utils/session.py
@@ -21,12 +21,14 @@ from functools import wraps
from inspect import signature
from typing import Callable, Generator, TypeVar, cast
+from sqlalchemy.orm import Session as SASession
+
from airflow import settings
from airflow.typing_compat import ParamSpec
@contextlib.contextmanager
-def create_session() -> Generator[settings.SASession, None, None]:
+def create_session() -> Generator[SASession, None, None]:
"""Contextmanager that will create and teardown a session."""
Session = getattr(settings, "Session", None)
if Session is None:
@@ -83,4 +85,4 @@ def provide_session(func: Callable[PS, RT]) -> Callable[PS,
RT]:
# the 'session' argument to be of type Session instead of Session | None,
# making it easier to type hint the function body without dealing with the None
# case that can never happen at runtime.
-NEW_SESSION: settings.SASession = cast(settings.SASession, None)
+NEW_SESSION: SASession = cast(SASession, None)
diff --git a/airflow/utils/sqlalchemy.py b/airflow/utils/sqlalchemy.py
index 1a1331427f..9166a11244 100644
--- a/airflow/utils/sqlalchemy.py
+++ b/airflow/utils/sqlalchemy.py
@@ -28,9 +28,8 @@ import pendulum
from dateutil import relativedelta
from sqlalchemy import TIMESTAMP, PickleType, and_, event, false, nullsfirst,
or_, true, tuple_
from sqlalchemy.dialects import mssql, mysql
-from sqlalchemy.exc import OperationalError
-from sqlalchemy.sql import ColumnElement, Select
-from sqlalchemy.types import JSON, Text, TypeDecorator, TypeEngine, UnicodeText
+from sqlalchemy.sql import Select
+from sqlalchemy.types import JSON, Text, TypeDecorator, UnicodeText
from airflow import settings
from airflow.configuration import conf
@@ -39,8 +38,11 @@ from airflow.utils.timezone import make_naive
if TYPE_CHECKING:
from kubernetes.client.models.v1_pod import V1Pod
+ from sqlalchemy.exc import OperationalError
from sqlalchemy.orm import Query, Session
+ from sqlalchemy.sql import ColumnElement
from sqlalchemy.sql.expression import ColumnOperators
+ from sqlalchemy.types import TypeEngine
log = logging.getLogger(__name__)
diff --git a/airflow/utils/task_group.py b/airflow/utils/task_group.py
index 841abc7106..e892f0e85d 100644
--- a/airflow/utils/task_group.py
+++ b/airflow/utils/task_group.py
@@ -33,7 +33,7 @@ from airflow.exceptions import (
DuplicateTaskIdFound,
TaskAlreadyInTaskGroup,
)
-from airflow.models.taskmixin import DAGNode, DependencyMixin
+from airflow.models.taskmixin import DAGNode
from airflow.serialization.enums import DagAttributeTypes
from airflow.utils.helpers import validate_group_key
@@ -45,6 +45,7 @@ if TYPE_CHECKING:
from airflow.models.dag import DAG
from airflow.models.expandinput import ExpandInput
from airflow.models.operator import Operator
+ from airflow.models.taskmixin import DependencyMixin
from airflow.utils.edgemodifier import EdgeModifier