diff --git a/shared/secrets_masker/src/airflow_shared/secrets_masker/secrets_masker.py b/shared/secrets_masker/src/airflow_shared/secrets_masker/secrets_masker.py index 5b7ff4e1c81e4..bf3fd91ebd7e6 100644 --- a/shared/secrets_masker/src/airflow_shared/secrets_masker/secrets_masker.py +++ b/shared/secrets_masker/src/airflow_shared/secrets_masker/secrets_masker.py @@ -127,9 +127,7 @@ def merge( return _secrets_masker().merge(new_value, old_value, name, max_depth) -_global_secrets_masker: SecretsMasker | None = None - - +@cache def _secrets_masker() -> SecretsMasker: """ Get or create the module-level secrets masker instance. @@ -139,10 +137,7 @@ def _secrets_masker() -> SecretsMasker: airflow.sdk._shared) will have separate global variables and thus separate masker instances. """ - global _global_secrets_masker - if _global_secrets_masker is None: - _global_secrets_masker = SecretsMasker() - return _global_secrets_masker + return SecretsMasker() def reset_secrets_masker() -> None: diff --git a/shared/timezones/src/airflow_shared/timezones/timezone.py b/shared/timezones/src/airflow_shared/timezones/timezone.py index 9621c3856a16e..4fe40ef1e5919 100644 --- a/shared/timezones/src/airflow_shared/timezones/timezone.py +++ b/shared/timezones/src/airflow_shared/timezones/timezone.py @@ -37,6 +37,12 @@ utc = pendulum.UTC +class _Timezone: + """Keep track of current timezone w/o global variable.""" + + initialized_timezone: FixedTimezone | Timezone = utc + + def is_localized(value: dt.datetime) -> bool: """ Determine if a given datetime.datetime is aware. @@ -87,7 +93,7 @@ def convert_to_utc(value: dt.datetime | None) -> DateTime | None: return value if not is_localized(value): - value = pendulum.instance(value, TIMEZONE) + value = pendulum.instance(value, _Timezone.initialized_timezone) return pendulum.instance(value.astimezone(utc)) @@ -113,7 +119,7 @@ def make_aware(value: dt.datetime | None, timezone: dt.tzinfo | None = None) -> :return: localized datetime in settings.TIMEZONE or timezone """ if timezone is None: - timezone = TIMEZONE + timezone = _Timezone.initialized_timezone if not value: return None @@ -146,7 +152,7 @@ def make_naive(value, timezone=None): :return: naive datetime """ if timezone is None: - timezone = TIMEZONE + timezone = _Timezone.initialized_timezone # Emulate the behavior of astimezone() on Python < 3.6. if is_naive(value): @@ -169,7 +175,7 @@ def datetime(*args, **kwargs): :return: datetime.datetime """ if "tzinfo" not in kwargs: - kwargs["tzinfo"] = TIMEZONE + kwargs["tzinfo"] = _Timezone.initialized_timezone return dt.datetime(*args, **kwargs) @@ -182,7 +188,7 @@ def parse(string: str, timezone=None, *, strict=False) -> DateTime: :param timezone: the timezone :param strict: if False, it will fall back on the dateutil parser if unable to parse with pendulum """ - return pendulum.parse(string, tz=timezone or TIMEZONE, strict=strict) # type: ignore + return pendulum.parse(string, tz=timezone or _Timezone.initialized_timezone, strict=strict) # type: ignore @overload @@ -279,20 +285,16 @@ def local_timezone() -> FixedTimezone | Timezone: return pendulum.tz.local_timezone() -TIMEZONE: FixedTimezone | Timezone = utc - - def initialize(default_timezone: str) -> None: """ Initialize the default timezone for the timezone library. Automatically called by airflow-core and task-sdk during their initialization. """ - global TIMEZONE if default_timezone == "system": - TIMEZONE = local_timezone() + _Timezone.initialized_timezone = local_timezone() else: - TIMEZONE = parse_timezone(default_timezone) + _Timezone.initialized_timezone = parse_timezone(default_timezone) def from_timestamp(timestamp: int | float, tz: str | FixedTimezone | Timezone = utc) -> DateTime: