Source code for airflow_config.utils
from configparser import ConfigParser
from inspect import currentframe
from os import environ, getcwd, path
from typing import cast
from uuid import uuid4
__all__ = ("generate_dag_id",)
def _get_calling_dag(offset: int = 2) -> str:
cur_frame = currentframe()
for _ in range(offset):
if hasattr(cur_frame, "f_back") and cur_frame.f_back and hasattr(cur_frame.f_back, "f_globals"):
cur_frame = cur_frame.f_back
else:
break
if "__file__" not in cur_frame.f_globals: # pragma: no cover
# Assumed in ipython/interpreter
return path.join(getcwd(), "ipython.py") # pragma: no cover
return cur_frame.f_globals["__file__"]
def _get_dag_root() -> str:
home = environ.get("AIRFLOW_HOME", "")
file = path.join(home, "airflow.cfg")
if home and path.exists(file):
config = ConfigParser()
config.read(file)
return config["core"]["dags_folder"]
return ""
[docs]
def generate_dag_id(name: str = "", dag_root: str = "", offset: int = 2) -> str:
if not name:
try:
# get file of calling python file, can't use the module name as one might
# have the same module in multiple folders
caller = _get_calling_dag(offset=offset)
# remove python suffix, replace path with dash
name = caller.replace(".py", "").replace("/", "-").replace("_", "-")
# remove root folder
dag_root = dag_root or _get_dag_root()
name = name.replace(dag_root.replace("/", "-").replace("_", "-"), "")
while name.startswith("-"):
name = name[1:]
except Exception:
name = cast(str, uuid4())
return name