123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- #
- # Licensed to the Apache Software Foundation (ASF) under one
- # or more contributor license agreements. See the NOTICE file
- # distributed with this work for additional information
- # regarding copyright ownership. The ASF licenses this file
- # to you under the Apache License, Version 2.0 (the
- # "License"); you may not use this file except in compliance
- # with the License. You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing,
- # software distributed under the License is distributed on an
- # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- # KIND, either express or implied. See the License for the
- # specific language governing permissions and limitations
- # under the License.
- from __future__ import annotations
- __version__ = "2.10.5"
- import os
- import sys
- import warnings
- from typing import TYPE_CHECKING
- if os.environ.get("_AIRFLOW_PATCH_GEVENT"):
- # If you are using gevents and start airflow webserver, you might want to run gevent monkeypatching
- # as one of the first thing when Airflow is started. This allows gevent to patch networking and other
- # system libraries to make them gevent-compatible before anything else patches them (for example boto)
- from gevent.monkey import patch_all
- patch_all()
- if sys.platform == "win32":
- warnings.warn(
- "Airflow currently can be run on POSIX-compliant Operating Systems. For development, "
- "it is regularly tested on fairly modern Linux Distros and recent versions of macOS. "
- "On Windows you can run it via WSL2 (Windows Subsystem for Linux 2) or via Linux Containers. "
- "The work to add Windows support is tracked via https://github.com/apache/airflow/issues/10388, "
- "but it is not a high priority.",
- category=RuntimeWarning,
- stacklevel=1,
- )
- # The configuration module initializes and validates the conf object as a side effect the first
- # time it is imported. If it is not imported before importing the settings module, the conf
- # object will then be initted/validated as a side effect of it being imported in settings,
- # however this can cause issues since those modules are very tightly coupled and can
- # very easily cause import cycles in the conf init/validate code (since downstream code from
- # those functions likely import settings).
- # configuration is therefore initted early here, simply by importing it.
- from airflow import configuration, settings
- __all__ = [
- "__version__",
- "DAG",
- "Dataset",
- "XComArg",
- ]
- # Make `airflow` a namespace package, supporting installing
- # airflow.providers.* in different locations (i.e. one in site, and one in user
- # lib.)
- __path__ = __import__("pkgutil").extend_path(__path__, __name__) # type: ignore
- # Perform side-effects unless someone has explicitly opted out before import
- # WARNING: DO NOT USE THIS UNLESS YOU REALLY KNOW WHAT YOU'RE DOING.
- # This environment variable prevents proper initialization, and things like
- # configs, logging, the ORM, etc. will be broken. It is only useful if you only
- # access certain trivial constants and free functions (e.g. `__version__`).
- if not os.environ.get("_AIRFLOW__AS_LIBRARY", None):
- settings.initialize()
- # Things to lazy import in form {local_name: ('target_module', 'target_name', 'deprecated')}
- __lazy_imports: dict[str, tuple[str, str, bool]] = {
- "DAG": (".models.dag", "DAG", False),
- "Dataset": (".datasets", "Dataset", False),
- "XComArg": (".models.xcom_arg", "XComArg", False),
- "version": (".version", "", False),
- # Deprecated lazy imports
- "AirflowException": (".exceptions", "AirflowException", True),
- }
- if TYPE_CHECKING:
- # These objects are imported by PEP-562, however, static analyzers and IDE's
- # have no idea about typing of these objects.
- # Add it under TYPE_CHECKING block should help with it.
- from airflow.models.dag import DAG
- from airflow.models.dataset import Dataset
- from airflow.models.xcom_arg import XComArg
- def __getattr__(name: str):
- # PEP-562: Lazy loaded attributes on python modules
- module_path, attr_name, deprecated = __lazy_imports.get(name, ("", "", False))
- if not module_path:
- if name.startswith("PY3") and (py_minor := name[3:]) in ("6", "7", "8", "9", "10", "11", "12"):
- warnings.warn(
- f"Python version constraint {name!r} is deprecated and will be removed in the future. "
- f"Please get version info from the 'sys.version_info'.",
- DeprecationWarning,
- stacklevel=2,
- )
- return sys.version_info >= (3, int(py_minor))
- raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
- elif deprecated:
- warnings.warn(
- f"Import {name!r} directly from the airflow module is deprecated and "
- f"will be removed in the future. Please import it from 'airflow{module_path}.{attr_name}'.",
- DeprecationWarning,
- stacklevel=2,
- )
- import importlib
- mod = importlib.import_module(module_path, __name__)
- if attr_name:
- val = getattr(mod, attr_name)
- else:
- val = mod
- # Store for next time
- globals()[name] = val
- return val
- if not settings.LAZY_LOAD_PROVIDERS:
- from airflow.providers_manager import ProvidersManager
- manager = ProvidersManager()
- manager.initialize_providers_list()
- manager.initialize_providers_hooks()
- manager.initialize_providers_extra_links()
- if not settings.LAZY_LOAD_PLUGINS:
- from airflow import plugins_manager
- plugins_manager.ensure_plugins_loaded()
|