apache-airflow-providers-standard 1.3.0__py3-none-any.whl → 1.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of apache-airflow-providers-standard might be problematic. Click here for more details.

Files changed (34) hide show
  1. airflow/providers/standard/__init__.py +1 -1
  2. airflow/providers/standard/decorators/bash.py +2 -2
  3. airflow/providers/standard/decorators/branch_external_python.py +2 -1
  4. airflow/providers/standard/decorators/branch_python.py +2 -1
  5. airflow/providers/standard/decorators/branch_virtualenv.py +2 -1
  6. airflow/providers/standard/decorators/external_python.py +2 -1
  7. airflow/providers/standard/decorators/python.py +2 -2
  8. airflow/providers/standard/decorators/python_virtualenv.py +2 -1
  9. airflow/providers/standard/decorators/sensor.py +2 -2
  10. airflow/providers/standard/decorators/short_circuit.py +2 -1
  11. airflow/providers/standard/hooks/filesystem.py +4 -1
  12. airflow/providers/standard/hooks/package_index.py +4 -1
  13. airflow/providers/standard/hooks/subprocess.py +4 -1
  14. airflow/providers/standard/operators/bash.py +3 -4
  15. airflow/providers/standard/operators/branch.py +2 -3
  16. airflow/providers/standard/operators/empty.py +1 -1
  17. airflow/providers/standard/operators/python.py +28 -6
  18. airflow/providers/standard/operators/smooth.py +1 -1
  19. airflow/providers/standard/operators/trigger_dagrun.py +1 -4
  20. airflow/providers/standard/sensors/bash.py +1 -1
  21. airflow/providers/standard/sensors/date_time.py +1 -2
  22. airflow/providers/standard/sensors/external_task.py +12 -19
  23. airflow/providers/standard/sensors/filesystem.py +1 -1
  24. airflow/providers/standard/sensors/python.py +3 -3
  25. airflow/providers/standard/sensors/time.py +1 -1
  26. airflow/providers/standard/sensors/time_delta.py +3 -4
  27. airflow/providers/standard/sensors/weekday.py +1 -1
  28. airflow/providers/standard/utils/python_virtualenv.py +10 -1
  29. airflow/providers/standard/utils/skipmixin.py +12 -3
  30. airflow/providers/standard/version_compat.py +26 -1
  31. {apache_airflow_providers_standard-1.3.0.dist-info → apache_airflow_providers_standard-1.4.0.dist-info}/METADATA +8 -9
  32. {apache_airflow_providers_standard-1.3.0.dist-info → apache_airflow_providers_standard-1.4.0.dist-info}/RECORD +34 -34
  33. {apache_airflow_providers_standard-1.3.0.dist-info → apache_airflow_providers_standard-1.4.0.dist-info}/WHEEL +0 -0
  34. {apache_airflow_providers_standard-1.3.0.dist-info → apache_airflow_providers_standard-1.4.0.dist-info}/entry_points.txt +0 -0
@@ -29,7 +29,7 @@ from airflow import __version__ as airflow_version
29
29
 
30
30
  __all__ = ["__version__"]
31
31
 
32
- __version__ = "1.3.0"
32
+ __version__ = "1.4.0"
33
33
 
34
34
  if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
35
35
  "2.10.0"
@@ -18,8 +18,8 @@
18
18
  from __future__ import annotations
19
19
 
20
20
  import warnings
21
- from collections.abc import Collection, Mapping, Sequence
22
- from typing import TYPE_CHECKING, Any, Callable, ClassVar
21
+ from collections.abc import Callable, Collection, Mapping, Sequence
22
+ from typing import TYPE_CHECKING, Any, ClassVar
23
23
 
24
24
  from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
25
25
 
@@ -16,7 +16,8 @@
16
16
  # under the License.
17
17
  from __future__ import annotations
18
18
 
19
- from typing import TYPE_CHECKING, Callable
19
+ from collections.abc import Callable
20
+ from typing import TYPE_CHECKING
20
21
 
21
22
  from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
22
23
 
@@ -16,7 +16,8 @@
16
16
  # under the License.
17
17
  from __future__ import annotations
18
18
 
19
- from typing import TYPE_CHECKING, Callable
19
+ from collections.abc import Callable
20
+ from typing import TYPE_CHECKING
20
21
 
21
22
  from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
22
23
 
@@ -16,7 +16,8 @@
16
16
  # under the License.
17
17
  from __future__ import annotations
18
18
 
19
- from typing import TYPE_CHECKING, Callable
19
+ from collections.abc import Callable
20
+ from typing import TYPE_CHECKING
20
21
 
21
22
  from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
22
23
 
@@ -16,7 +16,8 @@
16
16
  # under the License.
17
17
  from __future__ import annotations
18
18
 
19
- from typing import TYPE_CHECKING, Callable
19
+ from collections.abc import Callable
20
+ from typing import TYPE_CHECKING
20
21
 
21
22
  from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
22
23
 
@@ -16,8 +16,8 @@
16
16
  # under the License.
17
17
  from __future__ import annotations
18
18
 
19
- from collections.abc import Sequence
20
- from typing import TYPE_CHECKING, Callable
19
+ from collections.abc import Callable, Sequence
20
+ from typing import TYPE_CHECKING
21
21
 
22
22
  from airflow.providers.standard.operators.python import PythonOperator
23
23
  from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
@@ -16,7 +16,8 @@
16
16
  # under the License.
17
17
  from __future__ import annotations
18
18
 
19
- from typing import TYPE_CHECKING, Callable
19
+ from collections.abc import Callable
20
+ from typing import TYPE_CHECKING
20
21
 
21
22
  from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
22
23
 
@@ -17,8 +17,8 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- from collections.abc import Sequence
21
- from typing import TYPE_CHECKING, Callable, ClassVar
20
+ from collections.abc import Callable, Sequence
21
+ from typing import TYPE_CHECKING, ClassVar
22
22
 
23
23
  from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
24
24
 
@@ -16,7 +16,8 @@
16
16
  # under the License.
17
17
  from __future__ import annotations
18
18
 
19
- from typing import TYPE_CHECKING, Callable
19
+ from collections.abc import Callable
20
+ from typing import TYPE_CHECKING
20
21
 
21
22
  from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
22
23
 
@@ -20,7 +20,10 @@ from __future__ import annotations
20
20
  from pathlib import Path
21
21
  from typing import Any
22
22
 
23
- from airflow.hooks.base import BaseHook
23
+ try:
24
+ from airflow.sdk import BaseHook
25
+ except ImportError:
26
+ from airflow.hooks.base import BaseHook # type: ignore[attr-defined,no-redef]
24
27
 
25
28
 
26
29
  class FSHook(BaseHook):
@@ -23,7 +23,10 @@ import subprocess
23
23
  from typing import Any
24
24
  from urllib.parse import quote, urlparse
25
25
 
26
- from airflow.hooks.base import BaseHook
26
+ try:
27
+ from airflow.sdk import BaseHook
28
+ except ImportError:
29
+ from airflow.hooks.base import BaseHook # type: ignore[attr-defined,no-redef]
27
30
 
28
31
 
29
32
  class PackageIndexHook(BaseHook):
@@ -24,7 +24,10 @@ from collections.abc import Iterator
24
24
  from subprocess import PIPE, STDOUT, Popen
25
25
  from tempfile import TemporaryDirectory, gettempdir
26
26
 
27
- from airflow.hooks.base import BaseHook
27
+ try:
28
+ from airflow.sdk import BaseHook
29
+ except ImportError:
30
+ from airflow.hooks.base import BaseHook # type: ignore[attr-defined,no-redef]
28
31
 
29
32
  SubprocessResult = namedtuple("SubprocessResult", ["exit_code", "output"])
30
33
 
@@ -20,14 +20,13 @@ from __future__ import annotations
20
20
  import os
21
21
  import shutil
22
22
  import tempfile
23
- from collections.abc import Container, Sequence
23
+ from collections.abc import Callable, Container, Sequence
24
24
  from functools import cached_property
25
- from typing import TYPE_CHECKING, Any, Callable, cast
25
+ from typing import TYPE_CHECKING, Any, cast
26
26
 
27
27
  from airflow.exceptions import AirflowException, AirflowSkipException
28
- from airflow.models.baseoperator import BaseOperator
29
28
  from airflow.providers.standard.hooks.subprocess import SubprocessHook, SubprocessResult, working_directory
30
- from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
29
+ from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS, BaseOperator
31
30
 
32
31
  if AIRFLOW_V_3_0_PLUS:
33
32
  from airflow.sdk.execution_time.context import context_to_airflow_vars
@@ -22,13 +22,12 @@ from __future__ import annotations
22
22
  from collections.abc import Iterable
23
23
  from typing import TYPE_CHECKING
24
24
 
25
- from airflow.models.baseoperator import BaseOperator
26
- from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
25
+ from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS, BaseOperator
27
26
 
28
27
  if AIRFLOW_V_3_0_PLUS:
29
28
  from airflow.providers.standard.utils.skipmixin import SkipMixin
30
29
  else:
31
- from airflow.models.skipmixin import SkipMixin
30
+ from airflow.models.skipmixin import SkipMixin # type: ignore[no-redef]
32
31
 
33
32
  if TYPE_CHECKING:
34
33
  from airflow.sdk.definitions.context import Context
@@ -18,7 +18,7 @@ from __future__ import annotations
18
18
 
19
19
  from typing import TYPE_CHECKING
20
20
 
21
- from airflow.models.baseoperator import BaseOperator
21
+ from airflow.providers.standard.version_compat import BaseOperator
22
22
 
23
23
  if TYPE_CHECKING:
24
24
  from airflow.sdk.definitions.context import Context
@@ -29,12 +29,12 @@ import textwrap
29
29
  import types
30
30
  import warnings
31
31
  from abc import ABCMeta, abstractmethod
32
- from collections.abc import Collection, Container, Iterable, Mapping, Sequence
32
+ from collections.abc import Callable, Collection, Container, Iterable, Mapping, Sequence
33
33
  from functools import cache
34
34
  from itertools import chain
35
35
  from pathlib import Path
36
36
  from tempfile import TemporaryDirectory
37
- from typing import TYPE_CHECKING, Any, Callable, NamedTuple, cast
37
+ from typing import TYPE_CHECKING, Any, NamedTuple, cast
38
38
 
39
39
  import lazy_object_proxy
40
40
  from packaging.requirements import InvalidRequirement, Requirement
@@ -48,10 +48,10 @@ from airflow.exceptions import (
48
48
  AirflowSkipException,
49
49
  DeserializingResultError,
50
50
  )
51
- from airflow.models.baseoperator import BaseOperator
52
51
  from airflow.models.variable import Variable
52
+ from airflow.providers.standard.hooks.package_index import PackageIndexHook
53
53
  from airflow.providers.standard.utils.python_virtualenv import prepare_virtualenv, write_python_script
54
- from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
54
+ from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS, BaseOperator
55
55
  from airflow.utils import hashlib_wrapper
56
56
  from airflow.utils.context import context_copy_partial, context_merge
57
57
  from airflow.utils.file import get_unique_dag_module_name
@@ -62,7 +62,7 @@ if AIRFLOW_V_3_0_PLUS:
62
62
  from airflow.providers.standard.operators.branch import BaseBranchOperator
63
63
  from airflow.providers.standard.utils.skipmixin import SkipMixin
64
64
  else:
65
- from airflow.models.skipmixin import SkipMixin
65
+ from airflow.models.skipmixin import SkipMixin # type: ignore[no-redef]
66
66
  from airflow.operators.branch import BaseBranchOperator # type: ignore[no-redef]
67
67
 
68
68
 
@@ -656,6 +656,8 @@ class PythonVirtualenvOperator(_BasePythonVirtualenvOperator):
656
656
  exit code will be treated as a failure.
657
657
  :param index_urls: an optional list of index urls to load Python packages from.
658
658
  If not provided the system pip conf will be used to source packages from.
659
+ :param index_urls_from_connection_ids: An optional list of ``PackageIndex`` connection IDs.
660
+ Will be appended to ``index_urls``.
659
661
  :param venv_cache_path: Optional path to the virtual environment parent folder in which the
660
662
  virtual environment will be cached, creates a sub-folder venv-{hash} whereas hash will be replaced
661
663
  with a checksum of requirements. If not provided the virtual environment will be created and deleted
@@ -669,7 +671,9 @@ class PythonVirtualenvOperator(_BasePythonVirtualenvOperator):
669
671
  """
670
672
 
671
673
  template_fields: Sequence[str] = tuple(
672
- {"requirements", "index_urls", "venv_cache_path"}.union(PythonOperator.template_fields)
674
+ {"requirements", "index_urls", "index_urls_from_connection_ids", "venv_cache_path"}.union(
675
+ PythonOperator.template_fields
676
+ )
673
677
  )
674
678
  template_ext: Sequence[str] = (".txt",)
675
679
 
@@ -690,6 +694,7 @@ class PythonVirtualenvOperator(_BasePythonVirtualenvOperator):
690
694
  expect_airflow: bool = True,
691
695
  skip_on_exit_code: int | Container[int] | None = None,
692
696
  index_urls: None | Collection[str] | str = None,
697
+ index_urls_from_connection_ids: None | Collection[str] | str = None,
693
698
  venv_cache_path: None | os.PathLike[str] = None,
694
699
  env_vars: dict[str, str] | None = None,
695
700
  inherit_env: bool = True,
@@ -724,6 +729,12 @@ class PythonVirtualenvOperator(_BasePythonVirtualenvOperator):
724
729
  self.index_urls = list(index_urls)
725
730
  else:
726
731
  self.index_urls = None
732
+ if isinstance(index_urls_from_connection_ids, str):
733
+ self.index_urls_from_connection_ids: list[str] | None = [index_urls_from_connection_ids]
734
+ elif isinstance(index_urls_from_connection_ids, Collection):
735
+ self.index_urls_from_connection_ids = list(index_urls_from_connection_ids)
736
+ else:
737
+ self.index_urls_from_connection_ids = None
727
738
  self.venv_cache_path = venv_cache_path
728
739
  super().__init__(
729
740
  python_callable=python_callable,
@@ -850,7 +861,18 @@ class PythonVirtualenvOperator(_BasePythonVirtualenvOperator):
850
861
  self.log.info("New Python virtual environment created in %s", venv_path)
851
862
  return venv_path
852
863
 
864
+ def _retrieve_index_urls_from_connection_ids(self):
865
+ """Retrieve index URLs from Package Index connections."""
866
+ if self.index_urls is None:
867
+ self.index_urls = []
868
+ for conn_id in self.index_urls_from_connection_ids:
869
+ conn_url = PackageIndexHook(conn_id).get_connection_url()
870
+ self.index_urls.append(conn_url)
871
+
853
872
  def execute_callable(self):
873
+ if self.index_urls_from_connection_ids:
874
+ self._retrieve_index_urls_from_connection_ids()
875
+
854
876
  if self.venv_cache_path:
855
877
  venv_path = self._ensure_venv_cache_exists(Path(self.venv_cache_path))
856
878
  python_path = venv_path / "bin" / "python"
@@ -19,7 +19,7 @@ from __future__ import annotations
19
19
 
20
20
  from typing import TYPE_CHECKING
21
21
 
22
- from airflow.models.baseoperator import BaseOperator
22
+ from airflow.providers.standard.version_compat import BaseOperator
23
23
 
24
24
  if TYPE_CHECKING:
25
25
  from airflow.sdk.definitions.context import Context
@@ -34,12 +34,11 @@ from airflow.exceptions import (
34
34
  DagNotFound,
35
35
  DagRunAlreadyExists,
36
36
  )
37
- from airflow.models import BaseOperator
38
37
  from airflow.models.dag import DagModel
39
38
  from airflow.models.dagbag import DagBag
40
39
  from airflow.models.dagrun import DagRun
41
40
  from airflow.providers.standard.triggers.external_task import DagStateTrigger
42
- from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
41
+ from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS, BaseOperator, BaseOperatorLink
43
42
  from airflow.utils import timezone
44
43
  from airflow.utils.state import DagRunState
45
44
  from airflow.utils.types import NOTSET, ArgNotSet, DagRunType
@@ -60,11 +59,9 @@ if TYPE_CHECKING:
60
59
  from airflow.utils.context import Context
61
60
 
62
61
  if AIRFLOW_V_3_0_PLUS:
63
- from airflow.sdk import BaseOperatorLink
64
62
  from airflow.sdk.execution_time.xcom import XCom
65
63
  else:
66
64
  from airflow.models import XCom # type: ignore[no-redef]
67
- from airflow.models.baseoperatorlink import BaseOperatorLink # type: ignore[no-redef]
68
65
 
69
66
 
70
67
  class DagIsPaused(AirflowException):
@@ -24,7 +24,7 @@ from tempfile import NamedTemporaryFile, TemporaryDirectory, gettempdir
24
24
  from typing import TYPE_CHECKING
25
25
 
26
26
  from airflow.exceptions import AirflowFailException
27
- from airflow.sensors.base import BaseSensorOperator
27
+ from airflow.providers.standard.version_compat import BaseSensorOperator
28
28
 
29
29
  if TYPE_CHECKING:
30
30
  try:
@@ -23,8 +23,7 @@ from dataclasses import dataclass
23
23
  from typing import TYPE_CHECKING, Any, NoReturn
24
24
 
25
25
  from airflow.providers.standard.triggers.temporal import DateTimeTrigger
26
- from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
27
- from airflow.sensors.base import BaseSensorOperator
26
+ from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS, BaseSensorOperator
28
27
  from airflow.utils import timezone
29
28
 
30
29
  try:
@@ -19,8 +19,8 @@ from __future__ import annotations
19
19
  import datetime
20
20
  import os
21
21
  import warnings
22
- from collections.abc import Collection, Iterable
23
- from typing import TYPE_CHECKING, Any, Callable, ClassVar
22
+ from collections.abc import Callable, Collection, Iterable
23
+ from typing import TYPE_CHECKING, Any, ClassVar
24
24
 
25
25
  from airflow.configuration import conf
26
26
  from airflow.exceptions import AirflowSkipException
@@ -39,14 +39,16 @@ from airflow.providers.standard.exceptions import (
39
39
  from airflow.providers.standard.operators.empty import EmptyOperator
40
40
  from airflow.providers.standard.triggers.external_task import WorkflowTrigger
41
41
  from airflow.providers.standard.utils.sensor_helper import _get_count, _get_external_task_group_task_ids
42
- from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
42
+ from airflow.providers.standard.version_compat import (
43
+ AIRFLOW_V_3_0_PLUS,
44
+ BaseOperator,
45
+ BaseOperatorLink,
46
+ BaseSensorOperator,
47
+ )
43
48
  from airflow.utils.file import correct_maybe_zipped
44
49
  from airflow.utils.state import State, TaskInstanceState
45
50
 
46
- if AIRFLOW_V_3_0_PLUS:
47
- from airflow.sdk.bases.sensor import BaseSensorOperator
48
- else:
49
- from airflow.sensors.base import BaseSensorOperator
51
+ if not AIRFLOW_V_3_0_PLUS:
50
52
  from airflow.utils.session import NEW_SESSION, provide_session
51
53
 
52
54
  if TYPE_CHECKING:
@@ -54,19 +56,10 @@ if TYPE_CHECKING:
54
56
 
55
57
  from airflow.models.taskinstancekey import TaskInstanceKey
56
58
 
57
- try:
58
- from airflow.sdk import BaseOperator
59
+ if AIRFLOW_V_3_0_PLUS:
59
60
  from airflow.sdk.definitions.context import Context
60
- except ImportError:
61
- # TODO: Remove once provider drops support for Airflow 2
62
- from airflow.models.baseoperator import BaseOperator
63
- from airflow.utils.context import Context
64
-
65
-
66
- if AIRFLOW_V_3_0_PLUS:
67
- from airflow.sdk import BaseOperatorLink
68
- else:
69
- from airflow.models.baseoperatorlink import BaseOperatorLink # type: ignore[no-redef]
61
+ else:
62
+ from airflow.utils.context import Context # type: ignore[no-redef]
70
63
 
71
64
 
72
65
  class ExternalDagLink(BaseOperatorLink):
@@ -29,7 +29,7 @@ from airflow.configuration import conf
29
29
  from airflow.exceptions import AirflowException
30
30
  from airflow.providers.standard.hooks.filesystem import FSHook
31
31
  from airflow.providers.standard.triggers.file import FileTrigger
32
- from airflow.sensors.base import BaseSensorOperator
32
+ from airflow.providers.standard.version_compat import BaseSensorOperator
33
33
 
34
34
  try:
35
35
  from airflow.triggers.base import StartTriggerArgs
@@ -17,10 +17,10 @@
17
17
  # under the License.
18
18
  from __future__ import annotations
19
19
 
20
- from collections.abc import Mapping, Sequence
21
- from typing import TYPE_CHECKING, Any, Callable
20
+ from collections.abc import Callable, Mapping, Sequence
21
+ from typing import TYPE_CHECKING, Any
22
22
 
23
- from airflow.sensors.base import BaseSensorOperator, PokeReturnValue
23
+ from airflow.providers.standard.version_compat import BaseSensorOperator, PokeReturnValue
24
24
  from airflow.utils.context import context_merge
25
25
  from airflow.utils.operator_helpers import determine_kwargs
26
26
 
@@ -25,7 +25,7 @@ from typing import TYPE_CHECKING, Any
25
25
  from airflow.configuration import conf
26
26
  from airflow.exceptions import AirflowProviderDeprecationWarning
27
27
  from airflow.providers.standard.triggers.temporal import DateTimeTrigger
28
- from airflow.sensors.base import BaseSensorOperator
28
+ from airflow.providers.standard.version_compat import BaseSensorOperator
29
29
 
30
30
  try:
31
31
  from airflow.triggers.base import StartTriggerArgs
@@ -20,7 +20,7 @@ from __future__ import annotations
20
20
  import warnings
21
21
  from datetime import datetime, timedelta
22
22
  from time import sleep
23
- from typing import TYPE_CHECKING, Any, NoReturn
23
+ from typing import TYPE_CHECKING, Any
24
24
 
25
25
  from deprecated.classic import deprecated
26
26
  from packaging.version import Version
@@ -28,8 +28,7 @@ from packaging.version import Version
28
28
  from airflow.configuration import conf
29
29
  from airflow.exceptions import AirflowProviderDeprecationWarning, AirflowSkipException
30
30
  from airflow.providers.standard.triggers.temporal import DateTimeTrigger, TimeDeltaTrigger
31
- from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS
32
- from airflow.sensors.base import BaseSensorOperator
31
+ from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS, BaseSensorOperator
33
32
  from airflow.utils import timezone
34
33
 
35
34
  if TYPE_CHECKING:
@@ -106,7 +105,7 @@ class TimeDeltaSensor(BaseSensorOperator):
106
105
  Asynchronous execution
107
106
  """
108
107
 
109
- def execute(self, context: Context) -> bool | NoReturn:
108
+ def execute(self, context: Context) -> Any:
110
109
  """
111
110
  Depending on the deferrable flag, either execute the sensor in a blocking way or defer it.
112
111
 
@@ -21,7 +21,7 @@ from collections.abc import Iterable
21
21
  from typing import TYPE_CHECKING
22
22
 
23
23
  from airflow.providers.standard.utils.weekday import WeekDay
24
- from airflow.sensors.base import BaseSensorOperator
24
+ from airflow.providers.standard.version_compat import BaseSensorOperator
25
25
  from airflow.utils import timezone
26
26
 
27
27
  if TYPE_CHECKING:
@@ -118,6 +118,15 @@ def _generate_pip_conf(conf_file: Path, index_urls: list[str]) -> None:
118
118
  conf_file.write_text(f"[global]\n{pip_conf_options}")
119
119
 
120
120
 
121
+ def _index_urls_to_uv_env_vars(index_urls: list[str] | None = None) -> dict[str, str]:
122
+ uv_index_env_vars = {}
123
+ if index_urls:
124
+ uv_index_env_vars = {"UV_DEFAULT_INDEX": index_urls[0]}
125
+ if len(index_urls) > 1:
126
+ uv_index_env_vars["UV_INDEX"] = " ".join(x for x in index_urls[1:])
127
+ return uv_index_env_vars
128
+
129
+
121
130
  def prepare_virtualenv(
122
131
  venv_directory: str,
123
132
  python_bin: str,
@@ -174,7 +183,7 @@ def prepare_virtualenv(
174
183
  )
175
184
 
176
185
  if pip_cmd:
177
- execute_in_subprocess(pip_cmd)
186
+ execute_in_subprocess(pip_cmd, env={**os.environ, **_index_urls_to_uv_env_vars(index_urls)})
178
187
 
179
188
  return f"{venv_directory}/bin/python"
180
189
 
@@ -22,13 +22,18 @@ from types import GeneratorType
22
22
  from typing import TYPE_CHECKING
23
23
 
24
24
  from airflow.exceptions import AirflowException
25
+ from airflow.providers.standard.version_compat import AIRFLOW_V_3_1_PLUS
25
26
  from airflow.utils.log.logging_mixin import LoggingMixin
26
27
 
27
28
  if TYPE_CHECKING:
28
- from airflow.models.operator import Operator
29
29
  from airflow.sdk.definitions._internal.node import DAGNode
30
30
  from airflow.sdk.types import RuntimeTaskInstanceProtocol
31
31
 
32
+ if AIRFLOW_V_3_1_PLUS:
33
+ from airflow.sdk.types import Operator
34
+ else:
35
+ from airflow.models.operator import Operator
36
+
32
37
  # The key used by SkipMixin to store XCom data.
33
38
  XCOM_SKIPMIXIN_KEY = "skipmixin_key"
34
39
 
@@ -40,8 +45,12 @@ XCOM_SKIPMIXIN_FOLLOWED = "followed"
40
45
 
41
46
 
42
47
  def _ensure_tasks(nodes: Iterable[DAGNode]) -> Sequence[Operator]:
43
- from airflow.models.baseoperator import BaseOperator
44
- from airflow.models.mappedoperator import MappedOperator
48
+ if AIRFLOW_V_3_1_PLUS:
49
+ from airflow.sdk import BaseOperator
50
+ from airflow.sdk.definitions.mappedoperator import MappedOperator
51
+ else:
52
+ from airflow.models.baseoperator import BaseOperator # type: ignore[no-redef]
53
+ from airflow.models.mappedoperator import MappedOperator # type: ignore[no-redef]
45
54
 
46
55
  return [n for n in nodes if isinstance(n, (BaseOperator, MappedOperator))]
47
56
 
@@ -32,4 +32,29 @@ def get_base_airflow_version_tuple() -> tuple[int, int, int]:
32
32
  return airflow_version.major, airflow_version.minor, airflow_version.micro
33
33
 
34
34
 
35
- AIRFLOW_V_3_0_PLUS = get_base_airflow_version_tuple() >= (3, 0, 0)
35
+ AIRFLOW_V_3_0_PLUS: bool = get_base_airflow_version_tuple() >= (3, 0, 0)
36
+ AIRFLOW_V_3_1_PLUS: bool = get_base_airflow_version_tuple() >= (3, 1, 0)
37
+
38
+ # BaseOperator is not imported from SDK from 3.0 (and only done from 3.1) due to a bug with
39
+ # DecoratedOperator -- where `DecoratedOperator._handle_output` needed `xcom_push` to exist on `BaseOperator`
40
+ # even though it wasn't used.
41
+ if AIRFLOW_V_3_1_PLUS:
42
+ from airflow.sdk import BaseOperator
43
+ else:
44
+ from airflow.models.baseoperator import BaseOperator # type: ignore[no-redef]
45
+
46
+ if AIRFLOW_V_3_0_PLUS:
47
+ from airflow.sdk import BaseOperatorLink
48
+ from airflow.sdk.bases.sensor import BaseSensorOperator, PokeReturnValue
49
+ else:
50
+ from airflow.models.baseoperatorlink import BaseOperatorLink # type: ignore[no-redef]
51
+ from airflow.sensors.base import BaseSensorOperator, PokeReturnValue # type: ignore[no-redef]
52
+
53
+ __all__ = [
54
+ "AIRFLOW_V_3_0_PLUS",
55
+ "AIRFLOW_V_3_1_PLUS",
56
+ "BaseOperator",
57
+ "BaseOperatorLink",
58
+ "BaseSensorOperator",
59
+ "PokeReturnValue",
60
+ ]
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apache-airflow-providers-standard
3
- Version: 1.3.0
3
+ Version: 1.4.0
4
4
  Summary: Provider package apache-airflow-providers-standard for Apache Airflow
5
5
  Keywords: airflow-provider,standard,airflow,integration
6
6
  Author-email: Apache Software Foundation <dev@airflow.apache.org>
7
7
  Maintainer-email: Apache Software Foundation <dev@airflow.apache.org>
8
- Requires-Python: ~=3.9
8
+ Requires-Python: ~=3.10
9
9
  Description-Content-Type: text/x-rst
10
10
  Classifier: Development Status :: 5 - Production/Stable
11
11
  Classifier: Environment :: Console
@@ -15,15 +15,14 @@ Classifier: Intended Audience :: System Administrators
15
15
  Classifier: Framework :: Apache Airflow
16
16
  Classifier: Framework :: Apache Airflow :: Provider
17
17
  Classifier: License :: OSI Approved :: Apache Software License
18
- Classifier: Programming Language :: Python :: 3.9
19
18
  Classifier: Programming Language :: Python :: 3.10
20
19
  Classifier: Programming Language :: Python :: 3.11
21
20
  Classifier: Programming Language :: Python :: 3.12
22
21
  Classifier: Topic :: System :: Monitoring
23
22
  Requires-Dist: apache-airflow>=2.10.0
24
23
  Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
25
- Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-standard/1.3.0/changelog.html
26
- Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-standard/1.3.0
24
+ Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-standard/1.4.0/changelog.html
25
+ Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-standard/1.4.0
27
26
  Project-URL: Mastodon, https://fosstodon.org/@airflow
28
27
  Project-URL: Slack Chat, https://s.apache.org/airflow-slack
29
28
  Project-URL: Source Code, https://github.com/apache/airflow
@@ -54,7 +53,7 @@ Project-URL: YouTube, https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/
54
53
 
55
54
  Package ``apache-airflow-providers-standard``
56
55
 
57
- Release: ``1.3.0``
56
+ Release: ``1.4.0``
58
57
 
59
58
 
60
59
  Airflow Standard Provider
@@ -67,7 +66,7 @@ This is a provider package for ``standard`` provider. All classes for this provi
67
66
  are in ``airflow.providers.standard`` python package.
68
67
 
69
68
  You can find package information and changelog for the provider
70
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-standard/1.3.0/>`_.
69
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-standard/1.4.0/>`_.
71
70
 
72
71
  Installation
73
72
  ------------
@@ -76,7 +75,7 @@ You can install this package on top of an existing Airflow 2 installation (see `
76
75
  for the minimum Airflow version supported) via
77
76
  ``pip install apache-airflow-providers-standard``
78
77
 
79
- The package supports the following python versions: 3.9,3.10,3.11,3.12
78
+ The package supports the following python versions: 3.10,3.11,3.12
80
79
 
81
80
  Requirements
82
81
  ------------
@@ -88,5 +87,5 @@ PIP package Version required
88
87
  ================== ==================
89
88
 
90
89
  The changelog for the provider package can be found in the
91
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-standard/1.3.0/changelog.html>`_.
90
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-standard/1.4.0/changelog.html>`_.
92
91
 
@@ -1,18 +1,18 @@
1
1
  airflow/providers/standard/LICENSE,sha256=gXPVwptPlW1TJ4HSuG5OMPg-a3h43OGMkZRR1rpwfJA,10850
2
- airflow/providers/standard/__init__.py,sha256=DWSlRY2UJACO0AHs5NTsnaYEDXkspAcyGPIjdbB10lw,1497
2
+ airflow/providers/standard/__init__.py,sha256=L_G_shJnU4zMuCkoJp1DcuKFbr5VGcJixJ5M10TaTO0,1497
3
3
  airflow/providers/standard/exceptions.py,sha256=MN4gEuNI8rFYx8zs5aAsUKDwyZQNuCig68h15CdwJ90,2075
4
4
  airflow/providers/standard/get_provider_info.py,sha256=9qlyfIHRu_d_jZyyE0SR8s2dN9HEjzV5P2EjyVCcbw4,7003
5
- airflow/providers/standard/version_compat.py,sha256=j5PCtXvZ71aBjixu-EFTNtVDPsngzzs7os0ZQDgFVDk,1536
5
+ airflow/providers/standard/version_compat.py,sha256=DrdferzYMGfcbIhpaLUTxbxbuMeoZSB95_224OjSbS8,2503
6
6
  airflow/providers/standard/decorators/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
7
- airflow/providers/standard/decorators/bash.py,sha256=J13t48yrRv7XpDV8_QWtI0IXbqNiqxW9Ct0ngmrQAdE,4396
8
- airflow/providers/standard/decorators/branch_external_python.py,sha256=M6JwUxKQj8KOHZL8cHtKmn37leEz4DKoGDrexNH2aAA,2557
9
- airflow/providers/standard/decorators/branch_python.py,sha256=MbtK3Zv5fKynrhv0PFeOzPQQ1IiW9PcurGq1bqotLqo,2476
10
- airflow/providers/standard/decorators/branch_virtualenv.py,sha256=m_3VE88QcuMj_yFg5h6MANVsfz1cKg9TyBbJ_t6zBA8,2558
11
- airflow/providers/standard/decorators/external_python.py,sha256=FxrsihfFy9oVjbyLugtFLDq7VkOdVXJScH0kuua1ApE,2877
12
- airflow/providers/standard/decorators/python.py,sha256=9Fdk8CRQJ7HQzhKT1Qh-CzfbX0_aw12ccjbh6fdBRdc,3442
13
- airflow/providers/standard/decorators/python_virtualenv.py,sha256=Xhul1iA0mJlN5N1EZl1LWIs90pUhS6bawQtVSpQhqEg,2565
14
- airflow/providers/standard/decorators/sensor.py,sha256=04PPtcDhSr_Wa4LJct2eiBczb8JEAzjiSos2CqBu3-4,3230
15
- airflow/providers/standard/decorators/short_circuit.py,sha256=3_6UHDhloPMT3fGeHFDBjf3rScXQm4wtfx59n-n__Ys,2506
7
+ airflow/providers/standard/decorators/bash.py,sha256=vYIu3MIGBh-qm85R3TrUHzmOAQYU1q0kyszZoWYXdGM,4396
8
+ airflow/providers/standard/decorators/branch_external_python.py,sha256=G1l3_sYM38wEWMRnzRuVGmAbd4uMN5D07zm3EM3-ZWo,2584
9
+ airflow/providers/standard/decorators/branch_python.py,sha256=ZngmIIXTZDBfPgOI71ag6q_87eFdoxW5xTqtC60-_xQ,2503
10
+ airflow/providers/standard/decorators/branch_virtualenv.py,sha256=9mwTQsOKFKg0xJ4KmD0qsBPXvQUX0cBJRVtqKqaNocQ,2585
11
+ airflow/providers/standard/decorators/external_python.py,sha256=vjS7q331jWP1cKQ9HxsxKBkCZHD557w5IMurnrbME38,2904
12
+ airflow/providers/standard/decorators/python.py,sha256=Y56NyfW5qtF-mLMv7yCNTnDRPJ7L5UE5CZTZTWGs1GU,3442
13
+ airflow/providers/standard/decorators/python_virtualenv.py,sha256=_8Ir-9tt1Ru5rHfxW8nwqD7EAzw8UzQpXO7O14I2HTY,2592
14
+ airflow/providers/standard/decorators/sensor.py,sha256=BEcTdFUrfiFnLLZN6Uqtiqqq6ScGRVg9JkZYZk4sc-U,3230
15
+ airflow/providers/standard/decorators/short_circuit.py,sha256=zUZgcVDrZXXU_cOhvkxGJrSUsC0oD1HAGPNVDD3U2QM,2533
16
16
  airflow/providers/standard/example_dags/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
17
17
  airflow/providers/standard/example_dags/example_bash_decorator.py,sha256=6tJyRuHso9ITzTrKWK_kvMLKQFVzajkuWfkvaP-fMp4,3878
18
18
  airflow/providers/standard/example_dags/example_bash_operator.py,sha256=tAS4cBsKW9B1nUukmYTpUw5Vf63476v_-tYjffyAtd4,2352
@@ -34,39 +34,39 @@ airflow/providers/standard/example_dags/example_trigger_controller_dag.py,sha256
34
34
  airflow/providers/standard/example_dags/sql/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
35
35
  airflow/providers/standard/example_dags/sql/sample.sql,sha256=OVk1qozBY58lp_tFtnyQiLSbKRdqKn4zbxJHH_Umdek,866
36
36
  airflow/providers/standard/hooks/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
37
- airflow/providers/standard/hooks/filesystem.py,sha256=fDZwW_EYD8z1QXnReqI7gIwSbDPZNTKtqQvgktiP02o,2870
38
- airflow/providers/standard/hooks/package_index.py,sha256=U7_s_02-wwz9kTkzKr3JAhVQj2spuntWd_GmjfpV-y4,3769
39
- airflow/providers/standard/hooks/subprocess.py,sha256=GAmdF69jwUcpc7DH5I42GnJRs6NMQvHwFhimWpIdTU4,4920
37
+ airflow/providers/standard/hooks/filesystem.py,sha256=tLMhmjVGMNdjb5siTQSYctPx2X4YcEIbiNhkmPrlGXI,2975
38
+ airflow/providers/standard/hooks/package_index.py,sha256=xt7iNl9_z8t-WwwrYHzljy9TegP_R186GiOmApPMSJ0,3874
39
+ airflow/providers/standard/hooks/subprocess.py,sha256=i7WkmfYFrlWrFjAk8fgkc45EZktItVadrK-95t1D2io,5025
40
40
  airflow/providers/standard/operators/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
41
- airflow/providers/standard/operators/bash.py,sha256=P2YLyFhE6XF09-zSKGXZiPHXGs5Gz8kyKdtcbykWENU,11405
42
- airflow/providers/standard/operators/branch.py,sha256=C_AUd7TSo_U52GiWsrR7rJIsRU5KKfrybBFw84brm_c,4070
41
+ airflow/providers/standard/operators/bash.py,sha256=yzNbi20dp6PWJzXZqJ05gyMsdb6-UsNuNrPGp2hiu1E,11366
42
+ airflow/providers/standard/operators/branch.py,sha256=nbfX2GsRerU7LnjECG482P-ajdZ527wQ5w-hwFV0e7Y,4057
43
43
  airflow/providers/standard/operators/datetime.py,sha256=bYDdbfAyAlEXRRHjOgB06UhgDum6SPdd5I3u-ylPSaw,5005
44
- airflow/providers/standard/operators/empty.py,sha256=C7_uLWJK6kExzlNc7xdMo8VAQ_ONWITvEQ2FImrMepM,1324
44
+ airflow/providers/standard/operators/empty.py,sha256=BTeZ4KRykaEHLZigSBkevcStCrbPdQpWDMnO3ZdtZqw,1338
45
45
  airflow/providers/standard/operators/latest_only.py,sha256=1yJtpi6cK4TIjARQgcrf460as4V6uVBdoDtjJEUnbvs,4884
46
- airflow/providers/standard/operators/python.py,sha256=3ybN_tse04iGYt27ld16JWkNOs_jNK15MjbuBOBKPPY,51848
47
- airflow/providers/standard/operators/smooth.py,sha256=d3OV38EzV_wlfMYN3JGWGwyzsFonx8VbqgGfXSw0_bM,1382
48
- airflow/providers/standard/operators/trigger_dagrun.py,sha256=isd9HVzYhAZS_Y3V1iQ3Gm2QlOV6KdGWHdq0PnhWxrU,16746
46
+ airflow/providers/standard/operators/python.py,sha256=IXAZEcbifTAbkP0cKWhgEnHLYApEvudUzWHOGyABaJs,53046
47
+ airflow/providers/standard/operators/smooth.py,sha256=IMs5GjM42XEiroksIZ5flGQgxfRUbXZXCWxpshVinYQ,1396
48
+ airflow/providers/standard/operators/trigger_dagrun.py,sha256=97C5DdNqwq-huRki58pyFT54ns2BRC5eELsFHVLE8As,16602
49
49
  airflow/providers/standard/operators/weekday.py,sha256=Qg7LhXYtybVSGZn8uQqF-r7RB7zOXfe3R6vSGVa_rJk,5083
50
50
  airflow/providers/standard/sensors/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
51
- airflow/providers/standard/sensors/bash.py,sha256=sNcII9aLzJhfdimOwsTggeZYk1TM_ulWDS5iKpB_9XE,4963
52
- airflow/providers/standard/sensors/date_time.py,sha256=3hW0GBVheICII6Y81doZ43SxI395KjPkHDM8oE1V44w,6240
53
- airflow/providers/standard/sensors/external_task.py,sha256=SLYf-a9PoTaDT6Ciy5YJCmn3bDoIxiRy-n5bS4zmDPw,28301
54
- airflow/providers/standard/sensors/filesystem.py,sha256=rfupSeHtFGdAcL6cw3H6u6ttBxogSThYiPqsUKgABMU,6029
55
- airflow/providers/standard/sensors/python.py,sha256=2tCCQa4ynsBpIfRKZdXnq2-9qIk9odikvRj46jxvR24,3387
56
- airflow/providers/standard/sensors/time.py,sha256=YlQnEmV-JazxOPZnnGD1leuZQROvRMDU3VtGQf05y8U,5070
57
- airflow/providers/standard/sensors/time_delta.py,sha256=D9LPHM8MIJWqbOfFmUMR-I0dd1HFNWMAZ7hXtTebNrQ,7633
58
- airflow/providers/standard/sensors/weekday.py,sha256=XoEp5HYmxHQOFZlyBPuRJcPO2srjftguilJH33H1L4M,4449
51
+ airflow/providers/standard/sensors/bash.py,sha256=jiysK84IwnVpQj1_lE65E_pSPE0FO82GGtqXf_a8STA,4984
52
+ airflow/providers/standard/sensors/date_time.py,sha256=hjbK56vc1GfwNY3Ge0c8Er8QsSKD4JJNBwe3Fa6d4HI,6208
53
+ airflow/providers/standard/sensors/external_task.py,sha256=yf8lXb1jBOSU2xbSLmKx8EiW4VhBq7WDfFjXa_bkp-o,27948
54
+ airflow/providers/standard/sensors/filesystem.py,sha256=jDgxZQ4WXRv1PSjc2o4K0Iq_AxnaPw7yIUnafK_VpaM,6050
55
+ airflow/providers/standard/sensors/python.py,sha256=rpJa61FUjQRJwQwLdHpprnLdVW78rB4svhbw1U-LiWw,3408
56
+ airflow/providers/standard/sensors/time.py,sha256=kam9KWlPahuqFo3u7CAGnQk_DBYSKawBr5MDPCGwb6g,5091
57
+ airflow/providers/standard/sensors/time_delta.py,sha256=ggDSna-m_scLFks9zx1LoC64jQBjw7ZQqH7n96UU2BQ,7579
58
+ airflow/providers/standard/sensors/weekday.py,sha256=sKDQ7xC9c32DZxaGNIjqmW6HXE4hIvKC71Kt-_d9SG8,4470
59
59
  airflow/providers/standard/triggers/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
60
60
  airflow/providers/standard/triggers/external_task.py,sha256=cuIUvLeOC6Epf4JDvFZSqcWU9fdh2plMbwop_pceb98,11599
61
61
  airflow/providers/standard/triggers/file.py,sha256=2i8-RwSjEgdOwQNcHCqLmSdpE3Ehqg4GQJ8nE3-fHxo,4886
62
62
  airflow/providers/standard/triggers/temporal.py,sha256=AlSdf3iNUMrdQmMlKHi0Ms-D_OU7hIkLFsqj23mpR3Q,4446
63
63
  airflow/providers/standard/utils/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
64
- airflow/providers/standard/utils/python_virtualenv.py,sha256=IhLLfE2xLQcEhsnhuWd-Y2D3eaM8TojFN6GjvtMFoNQ,7757
64
+ airflow/providers/standard/utils/python_virtualenv.py,sha256=RBiPWHwTngOMoohgJVmUap1DQ90EPjrGKmBjHBCHG74,8159
65
65
  airflow/providers/standard/utils/python_virtualenv_script.jinja2,sha256=3Z334hVq6hQ9EHkOoGnAHc2_XNkZQkOJGxZArDKLc-c,2770
66
66
  airflow/providers/standard/utils/sensor_helper.py,sha256=PNIETsl_a4BkmOypFfHdpP0VuTkC6eWKUDuwnNVaWsA,5000
67
- airflow/providers/standard/utils/skipmixin.py,sha256=XkhDozcXUHZ7C6AxzEW8ZYrqbra1oJGGR3ZieNQ-N0M,7791
67
+ airflow/providers/standard/utils/skipmixin.py,sha256=LwEdC108uifCRETlban0oCtlvW621kyn9RhiQw6cpWg,8169
68
68
  airflow/providers/standard/utils/weekday.py,sha256=ySDrIkWv-lqqxURo9E98IGInDqERec2O4y9o2hQTGiQ,2685
69
- apache_airflow_providers_standard-1.3.0.dist-info/entry_points.txt,sha256=mW2YRh3mVdZdaP5-iGSNgmcCh3YYdALIn28BCLBZZ40,104
70
- apache_airflow_providers_standard-1.3.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
71
- apache_airflow_providers_standard-1.3.0.dist-info/METADATA,sha256=6sfiB046dWdhRqeKCWOVey8uYbzNpV6G12kz9M9ugnw,3788
72
- apache_airflow_providers_standard-1.3.0.dist-info/RECORD,,
69
+ apache_airflow_providers_standard-1.4.0.dist-info/entry_points.txt,sha256=mW2YRh3mVdZdaP5-iGSNgmcCh3YYdALIn28BCLBZZ40,104
70
+ apache_airflow_providers_standard-1.4.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
71
+ apache_airflow_providers_standard-1.4.0.dist-info/METADATA,sha256=6zHK-6xUTuCs6MRTgOexsqk68C85o7hcUCNHwuUYVqE,3735
72
+ apache_airflow_providers_standard-1.4.0.dist-info/RECORD,,