apache-airflow-providers-standard 1.5.0rc1__tar.gz → 1.6.0rc2__tar.gz

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 (144) hide show
  1. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/PKG-INFO +6 -6
  2. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/README.rst +3 -3
  3. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/changelog.rst +42 -2
  4. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/index.rst +1 -1
  5. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/operators/python.rst +7 -7
  6. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/provider.yaml +2 -1
  7. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/pyproject.toml +3 -3
  8. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/__init__.py +1 -1
  9. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/decorators/bash.py +1 -1
  10. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/example_external_task_parent_deferrable.py +5 -1
  11. apache_airflow_providers_standard-1.6.0rc2/src/airflow/providers/standard/example_dags/example_hitl_operator.py +170 -0
  12. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/operators/hitl.py +38 -12
  13. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/operators/python.py +5 -5
  14. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/sensors/python.py +2 -3
  15. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/sensors/time.py +8 -3
  16. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/triggers/hitl.py +11 -3
  17. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/triggers/temporal.py +5 -1
  18. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/utils/python_virtualenv.py +10 -0
  19. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/version_compat.py +3 -0
  20. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/operators/test_hitl.py +85 -2
  21. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/operators/test_python.py +6 -2
  22. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/sensors/test_date_time.py +2 -1
  23. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/sensors/test_python.py +1 -1
  24. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/sensors/test_time.py +14 -0
  25. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/sensors/test_time_delta.py +12 -15
  26. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/sensors/test_weekday.py +4 -6
  27. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/triggers/test_hitl.py +33 -25
  28. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/utils/test_python_virtualenv.py +1 -1
  29. apache_airflow_providers_standard-1.5.0rc1/src/airflow/providers/standard/example_dags/example_hitl_operator.py +0 -81
  30. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/commits.rst +0 -0
  31. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/conf.py +0 -0
  32. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/configurations-ref.rst +0 -0
  33. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/installing-providers-from-sources.rst +0 -0
  34. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/operators/bash.rst +0 -0
  35. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/operators/datetime.rst +0 -0
  36. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/operators/index.rst +0 -0
  37. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/operators/latest_only.rst +0 -0
  38. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/operators/trigger_dag_run.rst +0 -0
  39. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/security.rst +0 -0
  40. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/sensors/bash.rst +0 -0
  41. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/sensors/datetime.rst +0 -0
  42. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/sensors/external_task_sensor.rst +0 -0
  43. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/sensors/file.rst +0 -0
  44. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/sensors/index.rst +0 -0
  45. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/docs/sensors/python.rst +0 -0
  46. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/__init__.py +0 -0
  47. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/__init__.py +0 -0
  48. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/LICENSE +0 -0
  49. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/decorators/__init__.py +0 -0
  50. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/decorators/branch_external_python.py +0 -0
  51. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/decorators/branch_python.py +0 -0
  52. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/decorators/branch_virtualenv.py +0 -0
  53. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/decorators/external_python.py +0 -0
  54. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/decorators/python.py +0 -0
  55. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/decorators/python_virtualenv.py +0 -0
  56. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/decorators/sensor.py +0 -0
  57. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/decorators/short_circuit.py +0 -0
  58. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/__init__.py +0 -0
  59. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/example_bash_decorator.py +0 -0
  60. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/example_bash_operator.py +0 -0
  61. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/example_branch_datetime_operator.py +0 -0
  62. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/example_branch_day_of_week_operator.py +0 -0
  63. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/example_branch_operator.py +0 -0
  64. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/example_branch_operator_decorator.py +0 -0
  65. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/example_external_task_child_deferrable.py +0 -0
  66. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/example_external_task_marker_dag.py +0 -0
  67. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/example_latest_only.py +0 -0
  68. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/example_python_decorator.py +0 -0
  69. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/example_python_operator.py +0 -0
  70. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/example_sensor_decorator.py +0 -0
  71. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/example_sensors.py +0 -0
  72. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/example_short_circuit_decorator.py +0 -0
  73. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/example_short_circuit_operator.py +0 -0
  74. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/example_trigger_controller_dag.py +0 -0
  75. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/sql/__init__.py +0 -0
  76. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/example_dags/sql/sample.sql +0 -0
  77. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/exceptions.py +0 -0
  78. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/get_provider_info.py +0 -0
  79. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/hooks/__init__.py +0 -0
  80. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/hooks/filesystem.py +0 -0
  81. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/hooks/package_index.py +0 -0
  82. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/hooks/subprocess.py +0 -0
  83. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/models/__init__.py +0 -0
  84. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/operators/__init__.py +0 -0
  85. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/operators/bash.py +0 -0
  86. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/operators/branch.py +0 -0
  87. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/operators/datetime.py +0 -0
  88. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/operators/empty.py +0 -0
  89. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/operators/latest_only.py +0 -0
  90. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/operators/smooth.py +0 -0
  91. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/operators/trigger_dagrun.py +0 -0
  92. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/operators/weekday.py +0 -0
  93. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/sensors/__init__.py +0 -0
  94. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/sensors/bash.py +0 -0
  95. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/sensors/date_time.py +0 -0
  96. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/sensors/external_task.py +0 -0
  97. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/sensors/filesystem.py +0 -0
  98. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/sensors/time_delta.py +0 -0
  99. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/sensors/weekday.py +0 -0
  100. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/triggers/__init__.py +0 -0
  101. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/triggers/external_task.py +0 -0
  102. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/triggers/file.py +0 -0
  103. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/utils/__init__.py +0 -0
  104. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/utils/python_virtualenv_script.jinja2 +0 -0
  105. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/utils/sensor_helper.py +0 -0
  106. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/utils/skipmixin.py +0 -0
  107. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/src/airflow/providers/standard/utils/weekday.py +0 -0
  108. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/conftest.py +0 -0
  109. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/__init__.py +0 -0
  110. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/__init__.py +0 -0
  111. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/decorators/__init__.py +0 -0
  112. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/decorators/test_bash.py +0 -0
  113. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/decorators/test_branch_external_python.py +0 -0
  114. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/decorators/test_branch_python.py +0 -0
  115. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/decorators/test_branch_virtualenv.py +0 -0
  116. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/decorators/test_external_python.py +0 -0
  117. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/decorators/test_python.py +0 -0
  118. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/decorators/test_python_virtualenv.py +0 -0
  119. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/decorators/test_sensor.py +0 -0
  120. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/decorators/test_short_circuit.py +0 -0
  121. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/hooks/__init__.py +0 -0
  122. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/hooks/test_filesystem.py +0 -0
  123. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/hooks/test_package_index.py +0 -0
  124. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/hooks/test_subprocess.py +0 -0
  125. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/operators/__init__.py +0 -0
  126. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/operators/test_bash.py +0 -0
  127. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/operators/test_branch_operator.py +0 -0
  128. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/operators/test_datetime.py +0 -0
  129. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/operators/test_latest_only_operator.py +0 -0
  130. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/operators/test_smooth.py +0 -0
  131. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/operators/test_trigger_dagrun.py +0 -0
  132. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/operators/test_weekday.py +0 -0
  133. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/sensors/__init__.py +0 -0
  134. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/sensors/test_bash.py +0 -0
  135. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/sensors/test_external_task_sensor.py +0 -0
  136. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/test_exceptions.py +0 -0
  137. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/triggers/__init__.py +0 -0
  138. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/triggers/test_external_task.py +0 -0
  139. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/triggers/test_file.py +0 -0
  140. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/triggers/test_temporal.py +0 -0
  141. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/utils/__init__.py +0 -0
  142. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/utils/test_sensor_helper.py +0 -0
  143. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/utils/test_skipmixin.py +0 -0
  144. {apache_airflow_providers_standard-1.5.0rc1 → apache_airflow_providers_standard-1.6.0rc2}/tests/unit/standard/utils/test_weekday.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apache-airflow-providers-standard
3
- Version: 1.5.0rc1
3
+ Version: 1.6.0rc2
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>
@@ -22,8 +22,8 @@ Classifier: Programming Language :: Python :: 3.13
22
22
  Classifier: Topic :: System :: Monitoring
23
23
  Requires-Dist: apache-airflow>=2.10.0rc1
24
24
  Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
25
- Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-standard/1.5.0/changelog.html
26
- Project-URL: Documentation, https://airflow.staged.apache.org/docs/apache-airflow-providers-standard/1.5.0
25
+ Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-standard/1.6.0/changelog.html
26
+ Project-URL: Documentation, https://airflow.staged.apache.org/docs/apache-airflow-providers-standard/1.6.0
27
27
  Project-URL: Mastodon, https://fosstodon.org/@airflow
28
28
  Project-URL: Slack Chat, https://s.apache.org/airflow-slack
29
29
  Project-URL: Source Code, https://github.com/apache/airflow
@@ -54,7 +54,7 @@ Project-URL: YouTube, https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/
54
54
 
55
55
  Package ``apache-airflow-providers-standard``
56
56
 
57
- Release: ``1.5.0``
57
+ Release: ``1.6.0``
58
58
 
59
59
  Release Date: ``|PypiReleaseDate|``
60
60
 
@@ -68,7 +68,7 @@ This is a provider package for ``standard`` provider. All classes for this provi
68
68
  are in ``airflow.providers.standard`` python package.
69
69
 
70
70
  You can find package information and changelog for the provider
71
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-standard/1.5.0/>`_.
71
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-standard/1.6.0/>`_.
72
72
 
73
73
  Installation
74
74
  ------------
@@ -89,5 +89,5 @@ PIP package Version required
89
89
  ================== ==================
90
90
 
91
91
  The changelog for the provider package can be found in the
92
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-standard/1.5.0/changelog.html>`_.
92
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-standard/1.6.0/changelog.html>`_.
93
93
 
@@ -23,7 +23,7 @@
23
23
 
24
24
  Package ``apache-airflow-providers-standard``
25
25
 
26
- Release: ``1.5.0``
26
+ Release: ``1.6.0``
27
27
 
28
28
  Release Date: ``|PypiReleaseDate|``
29
29
 
@@ -37,7 +37,7 @@ This is a provider package for ``standard`` provider. All classes for this provi
37
37
  are in ``airflow.providers.standard`` python package.
38
38
 
39
39
  You can find package information and changelog for the provider
40
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-standard/1.5.0/>`_.
40
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-standard/1.6.0/>`_.
41
41
 
42
42
  Installation
43
43
  ------------
@@ -58,4 +58,4 @@ PIP package Version required
58
58
  ================== ==================
59
59
 
60
60
  The changelog for the provider package can be found in the
61
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-standard/1.5.0/changelog.html>`_.
61
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-standard/1.6.0/changelog.html>`_.
@@ -35,6 +35,46 @@
35
35
  Changelog
36
36
  ---------
37
37
 
38
+ 1.6.0
39
+ .....
40
+
41
+ Features
42
+ ~~~~~~~~
43
+
44
+ * ``feat(HITL): add 'notifiers' to HITLOperator (#54128)``
45
+ * ``feat(HITL): add HITLBranchOperator (#53960)``
46
+ * ``feat(HITL): improve hitl trigger logging message (#53850)``
47
+ * ``feat(HITL): add "timedout" column to HITLTriggerEventSuccessPayload (#53852)``
48
+
49
+ Bug Fixes
50
+ ~~~~~~~~~
51
+
52
+ * ``Restore 'execute_complete' functionality 'TimeSensor' when 'deferrable=True' (#53669)``
53
+ * ``Fix several deprecation warnings related to airflow.sdk (#53791)``
54
+ * ``Fix pycache_cleanup path handling in PythonVirtualenvOperator (#54214)``
55
+ * ``fix(HITL): guard empty options or chosen_options when writing response (#54355)``
56
+
57
+ Misc
58
+ ~~~~
59
+
60
+ * ``refactor(HITL): replace timezone usage with airflow.sdk.timezone (#53962)``
61
+ * ``refactor(HITL): make default options class variables to avoid typo (#53849)``
62
+ * ``Add a warning about python interpreter using with uv (#54262)``
63
+ * ``Introduce 'StdoutCaptureManager' to isolate stdout from 'logging' logs (#54065)``
64
+ * ``Move some items in 'airflow.utils.context' to appropriate places (#53600)``
65
+
66
+ Doc-only
67
+ ~~~~~~~~
68
+
69
+ * ``Fix BranchPythonOperator doc (#54205)``
70
+
71
+ .. Below changes are excluded from the changelog. Move them to
72
+ appropriate section above if needed. Do not delete the lines(!):
73
+ * ``Documentation for Human-in-the-loop operator (#53694)``
74
+ * ``Correct HITL version warnings to avoid confusion (#53876)``
75
+ * ``Move functions in 'airflow.utils.decorator' to more appropriate places (#53420)``
76
+ * ``Prepare release for Aug 2025 1st wave of providers (#54193)``
77
+
38
78
  1.5.0
39
79
  .....
40
80
 
@@ -49,8 +89,8 @@ Bug Fixes
49
89
 
50
90
  * ``Fix key error in _handle_execution_date_fn for ExternalTaskSensor (#53728)``
51
91
  * ``fix: Type mismatch for DateInterval in latest only operator (#53541)``
52
- * ``fix(hitl): Fix HITLEntryOperator "options" and "defaults" handling (#53184)``
53
- * ``fix(hitl): handle hitl details when task instance is retried (#53824)``
92
+ * ``fix(HITL): Fix HITLEntryOperator "options" and "defaults" handling (#53184)``
93
+ * ``fix(HITL): handle hitl details when task instance is retried (#53824)``
54
94
 
55
95
  Misc
56
96
  ~~~~
@@ -66,7 +66,7 @@ apache-airflow-providers-standard package
66
66
  Airflow Standard Provider
67
67
 
68
68
 
69
- Release: 1.5.0
69
+ Release: 1.6.0
70
70
 
71
71
  Release Date: ``|PypiReleaseDate|``
72
72
 
@@ -298,16 +298,16 @@ Templating
298
298
  Jinja templating can be used in same way as described for the :ref:`howto/operator:PythonOperator`.
299
299
 
300
300
 
301
- .. _howto/operator:PythonBranchOperator:
301
+ .. _howto/operator:BranchPythonOperator:
302
302
 
303
- PythonBranchOperator
303
+ BranchPythonOperator
304
304
  ====================
305
305
 
306
- Use the :class:`~airflow.providers.standard.operators.python.PythonBranchOperator` to execute Python :ref:`branching <concepts:branching>`
306
+ Use the :class:`~airflow.providers.standard.operators.python.BranchPythonOperator` to execute Python :ref:`branching <concepts:branching>`
307
307
  tasks.
308
308
 
309
309
  .. tip::
310
- The ``@task.branch`` decorator is recommended over the classic ``PythonBranchOperator``
310
+ The ``@task.branch`` decorator is recommended over the classic ``BranchPythonOperator``
311
311
  to execute Python code.
312
312
 
313
313
  .. tab-set::
@@ -321,7 +321,7 @@ tasks.
321
321
  :start-after: [START howto_operator_branch_python]
322
322
  :end-before: [END howto_operator_branch_python]
323
323
 
324
- .. tab-item:: PythonBranchOperator
324
+ .. tab-item:: BranchPythonOperator
325
325
  :sync: operator
326
326
 
327
327
  .. exampleinclude:: /../src/airflow/providers/standard/example_dags/example_branch_operator.py
@@ -341,7 +341,7 @@ BranchPythonVirtualenvOperator
341
341
  ==============================
342
342
 
343
343
  Use the :class:`~airflow.providers.standard.operators.python.BranchPythonVirtualenvOperator` decorator to execute Python :ref:`branching <concepts:branching>`
344
- tasks and is a hybrid of the :class:`~airflow.providers.standard.operators.python.PythonBranchOperator` with execution in a virtual environment.
344
+ tasks and is a hybrid of the :class:`~airflow.providers.standard.operators.python.BranchPythonOperator` with execution in a virtual environment.
345
345
 
346
346
  .. tip::
347
347
  The ``@task.branch_virtualenv`` decorator is recommended over the classic
@@ -378,7 +378,7 @@ BranchExternalPythonOperator
378
378
  ============================
379
379
 
380
380
  Use the :class:`~airflow.providers.standard.operators.python.BranchExternalPythonOperator` to execute Python :ref:`branching <concepts:branching>`
381
- tasks and is a hybrid of the :class:`~airflow.providers.standard.operators.python.PythonBranchOperator` with execution in an
381
+ tasks and is a hybrid of the :class:`~airflow.providers.standard.operators.python.BranchPythonOperator` with execution in an
382
382
  external Python environment.
383
383
 
384
384
  .. tip::
@@ -21,12 +21,13 @@ name: Standard
21
21
  description: |
22
22
  Airflow Standard Provider
23
23
  state: ready
24
- source-date-epoch: 1753692022
24
+ source-date-epoch: 1754503555
25
25
  # Note that those versions are maintained by release manager - do not update them manually
26
26
  # with the exception of case where other provider in sources has >= new provider version.
27
27
  # In such case adding >= NEW_VERSION and bumping to NEW_VERSION in a provider have
28
28
  # to be done in the same PR
29
29
  versions:
30
+ - 1.6.0
30
31
  - 1.5.0
31
32
  - 1.4.1
32
33
  - 1.4.0
@@ -25,7 +25,7 @@ build-backend = "flit_core.buildapi"
25
25
 
26
26
  [project]
27
27
  name = "apache-airflow-providers-standard"
28
- version = "1.5.0rc1"
28
+ version = "1.6.0rc2"
29
29
  description = "Provider package apache-airflow-providers-standard for Apache Airflow"
30
30
  readme = "README.rst"
31
31
  authors = [
@@ -95,8 +95,8 @@ apache-airflow-providers-common-sql = {workspace = true}
95
95
  apache-airflow-providers-standard = {workspace = true}
96
96
 
97
97
  [project.urls]
98
- "Documentation" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-standard/1.5.0"
99
- "Changelog" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-standard/1.5.0/changelog.html"
98
+ "Documentation" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-standard/1.6.0"
99
+ "Changelog" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-standard/1.6.0/changelog.html"
100
100
  "Bug Tracker" = "https://github.com/apache/airflow/issues"
101
101
  "Source Code" = "https://github.com/apache/airflow"
102
102
  "Slack Chat" = "https://s.apache.org/airflow-slack"
@@ -29,7 +29,7 @@ from airflow import __version__ as airflow_version
29
29
 
30
30
  __all__ = ["__version__"]
31
31
 
32
- __version__ = "1.5.0"
32
+ __version__ = "1.6.0"
33
33
 
34
34
  if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
35
35
  "2.10.0"
@@ -33,8 +33,8 @@ else:
33
33
  )
34
34
 
35
35
  from airflow.providers.standard.operators.bash import BashOperator
36
+ from airflow.providers.standard.version_compat import context_merge
36
37
  from airflow.sdk.definitions._internal.types import SET_DURING_EXECUTION
37
- from airflow.utils.context import context_merge
38
38
  from airflow.utils.operator_helpers import determine_kwargs
39
39
 
40
40
  if TYPE_CHECKING:
@@ -20,7 +20,11 @@ from airflow import DAG
20
20
  from airflow.providers.standard.operators.empty import EmptyOperator
21
21
  from airflow.providers.standard.operators.trigger_dagrun import TriggerDagRunOperator
22
22
  from airflow.providers.standard.sensors.external_task import ExternalTaskSensor
23
- from airflow.utils.timezone import datetime
23
+
24
+ try:
25
+ from airflow.sdk.timezone import datetime
26
+ except ImportError:
27
+ from airflow.utils.timezone import datetime # type: ignore[no-redef]
24
28
 
25
29
  with DAG(
26
30
  dag_id="example_external_task",
@@ -0,0 +1,170 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one
2
+ # or more contributor license agreements. See the NOTICE file
3
+ # distributed with this work for additional information
4
+ # regarding copyright ownership. The ASF licenses this file
5
+ # to you under the Apache License, Version 2.0 (the
6
+ # "License"); you may not use this file except in compliance
7
+ # with the License. You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
18
+ from __future__ import annotations
19
+
20
+ import datetime
21
+ from typing import TYPE_CHECKING
22
+
23
+ import pendulum
24
+
25
+ from airflow.providers.standard.operators.hitl import (
26
+ ApprovalOperator,
27
+ HITLBranchOperator,
28
+ HITLEntryOperator,
29
+ HITLOperator,
30
+ )
31
+ from airflow.sdk import DAG, Param, task
32
+ from airflow.sdk.bases.notifier import BaseNotifier
33
+
34
+ if TYPE_CHECKING:
35
+ from airflow.sdk.definitions.context import Context
36
+
37
+ # [START hitl_tutorial]
38
+
39
+
40
+ class LocalLogNotifier(BaseNotifier):
41
+ """Simple notifier to demonstrate HITL notification without setup any connection."""
42
+
43
+ template_fields = ("message",)
44
+
45
+ def __init__(self, message: str) -> None:
46
+ self.message = message
47
+
48
+ def notify(self, context: Context) -> None:
49
+ self.log.info(self.message)
50
+
51
+
52
+ # [START htil_notifer]
53
+ hitl_request_callback = LocalLogNotifier(
54
+ message="""
55
+ [HITL]
56
+ Subject: {{ task.subject }}
57
+ Body: {{ task.body }}
58
+ Options: {{ task.options }}
59
+ Is Multiple Option: {{ task.multiple }}
60
+ Default Options: {{ task.defaults }}
61
+ Params: {{ task.params }}
62
+ """
63
+ )
64
+ hitl_success_callback = LocalLogNotifier(
65
+ message="{% set task_id = task.task_id -%}{{ ti.xcom_pull(task_ids=task_id) }}"
66
+ )
67
+ hitl_failure_callback = LocalLogNotifier(message="Request to response to '{{ task.subject }}' failed")
68
+ # [END htil_notifer]
69
+
70
+ with DAG(
71
+ dag_id="example_hitl_operator",
72
+ start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
73
+ catchup=False,
74
+ tags=["example", "HITL"],
75
+ ):
76
+ # [START howto_hitl_entry_operator]
77
+ wait_for_input = HITLEntryOperator(
78
+ task_id="wait_for_input",
79
+ subject="Please provide required information: ",
80
+ params={"information": Param("", type="string")},
81
+ notifiers=[hitl_request_callback],
82
+ on_success_callback=hitl_success_callback,
83
+ on_failure_callback=hitl_failure_callback,
84
+ )
85
+ # [END howto_hitl_entry_operator]
86
+
87
+ # [START howto_hitl_operator]
88
+ wait_for_option = HITLOperator(
89
+ task_id="wait_for_option",
90
+ subject="Please choose one option to proceed: ",
91
+ options=["option 1", "option 2", "option 3"],
92
+ notifiers=[hitl_request_callback],
93
+ on_success_callback=hitl_success_callback,
94
+ on_failure_callback=hitl_failure_callback,
95
+ )
96
+ # [END howto_hitl_operator]
97
+
98
+ # [START howto_hitl_operator_muliple]
99
+ wait_for_multiple_options = HITLOperator(
100
+ task_id="wait_for_multiple_options",
101
+ subject="Please choose option to proceed: ",
102
+ options=["option 4", "option 5", "option 6"],
103
+ multiple=True,
104
+ notifiers=[hitl_request_callback],
105
+ on_success_callback=hitl_success_callback,
106
+ on_failure_callback=hitl_failure_callback,
107
+ )
108
+ # [END howto_hitl_operator_muliple]
109
+
110
+ # [START howto_hitl_operator_timeout]
111
+ wait_for_default_option = HITLOperator(
112
+ task_id="wait_for_default_option",
113
+ subject="Please choose option to proceed: ",
114
+ options=["option 7", "option 8", "option 9"],
115
+ defaults=["option 7"],
116
+ execution_timeout=datetime.timedelta(seconds=1),
117
+ notifiers=[hitl_request_callback],
118
+ on_success_callback=hitl_success_callback,
119
+ on_failure_callback=hitl_failure_callback,
120
+ )
121
+ # [END howto_hitl_operator_timeout]
122
+
123
+ # [START howto_hitl_approval_operator]
124
+ valid_input_and_options = ApprovalOperator(
125
+ task_id="valid_input_and_options",
126
+ subject="Are the following input and options valid?",
127
+ body="""
128
+ Input: {{ ti.xcom_pull(task_ids='wait_for_input')["params_input"]["information"] }}
129
+ Option: {{ ti.xcom_pull(task_ids='wait_for_option')["chosen_options"] }}
130
+ Multiple Options: {{ ti.xcom_pull(task_ids='wait_for_option')["chosen_options"] }}
131
+ Timeout Option: {{ ti.xcom_pull(task_ids='wait_for_option')["chosen_options"] }}
132
+ """,
133
+ defaults="Reject",
134
+ execution_timeout=datetime.timedelta(minutes=1),
135
+ notifiers=[hitl_request_callback],
136
+ on_success_callback=hitl_success_callback,
137
+ on_failure_callback=hitl_failure_callback,
138
+ )
139
+ # [END howto_hitl_approval_operator]
140
+
141
+ # [START howto_hitl_branch_operator]
142
+ choose_a_branch_to_run = HITLBranchOperator(
143
+ task_id="choose_a_branch_to_run",
144
+ subject="You're now allowed to proceeded. Please choose one task to run: ",
145
+ options=["task_1", "task_2", "task_3"],
146
+ notifiers=[hitl_request_callback],
147
+ on_success_callback=hitl_success_callback,
148
+ on_failure_callback=hitl_failure_callback,
149
+ )
150
+ # [END howto_hitl_branch_operator]
151
+
152
+ # [START howto_hitl_workflow]
153
+ @task
154
+ def task_1(): ...
155
+
156
+ @task
157
+ def task_2(): ...
158
+
159
+ @task
160
+ def task_3(): ...
161
+
162
+ (
163
+ [wait_for_input, wait_for_option, wait_for_default_option, wait_for_multiple_options]
164
+ >> valid_input_and_options
165
+ >> choose_a_branch_to_run
166
+ >> [task_1(), task_2(), task_3()]
167
+ )
168
+ # [END howto_hitl_workflow]
169
+
170
+ # [END hitl_tutorial]
@@ -20,21 +20,23 @@ import logging
20
20
 
21
21
  from airflow.exceptions import AirflowOptionalProviderFeatureException
22
22
  from airflow.providers.standard.version_compat import AIRFLOW_V_3_1_PLUS
23
+ from airflow.sdk.bases.notifier import BaseNotifier
23
24
 
24
25
  if not AIRFLOW_V_3_1_PLUS:
25
26
  raise AirflowOptionalProviderFeatureException("Human in the loop functionality needs Airflow 3.1+.")
26
27
 
27
28
 
28
- from collections.abc import Collection, Mapping
29
- from datetime import datetime, timezone
29
+ from collections.abc import Collection, Mapping, Sequence
30
30
  from typing import TYPE_CHECKING, Any
31
31
 
32
32
  from airflow.providers.standard.exceptions import HITLTimeoutError, HITLTriggerEventError
33
+ from airflow.providers.standard.operators.branch import BranchMixIn
33
34
  from airflow.providers.standard.triggers.hitl import HITLTrigger, HITLTriggerEventSuccessPayload
34
35
  from airflow.providers.standard.utils.skipmixin import SkipMixin
35
36
  from airflow.providers.standard.version_compat import BaseOperator
36
37
  from airflow.sdk.definitions.param import ParamsDict
37
38
  from airflow.sdk.execution_time.hitl import upsert_hitl_detail
39
+ from airflow.sdk.timezone import utcnow
38
40
 
39
41
  if TYPE_CHECKING:
40
42
  from airflow.sdk.definitions.context import Context
@@ -65,6 +67,7 @@ class HITLOperator(BaseOperator):
65
67
  defaults: str | list[str] | None = None,
66
68
  multiple: bool = False,
67
69
  params: ParamsDict | dict[str, Any] | None = None,
70
+ notifiers: Sequence[BaseNotifier] | BaseNotifier | None = None,
68
71
  **kwargs,
69
72
  ) -> None:
70
73
  super().__init__(**kwargs)
@@ -77,9 +80,17 @@ class HITLOperator(BaseOperator):
77
80
  self.multiple = multiple
78
81
 
79
82
  self.params: ParamsDict = params if isinstance(params, ParamsDict) else ParamsDict(params or {})
83
+ self.notifiers: Sequence[BaseNotifier] = (
84
+ [notifiers] if isinstance(notifiers, BaseNotifier) else notifiers or []
85
+ )
80
86
 
87
+ self.validate_options()
81
88
  self.validate_defaults()
82
89
 
90
+ def validate_options(self) -> None:
91
+ if not self.options:
92
+ raise ValueError('"options" cannot be empty.')
93
+
83
94
  def validate_defaults(self) -> None:
84
95
  """
85
96
  Validate whether the given defaults pass the following criteria.
@@ -107,11 +118,16 @@ class HITLOperator(BaseOperator):
107
118
  multiple=self.multiple,
108
119
  params=self.serialized_params,
109
120
  )
121
+
110
122
  if self.execution_timeout:
111
- timeout_datetime = datetime.now(timezone.utc) + self.execution_timeout
123
+ timeout_datetime = utcnow() + self.execution_timeout
112
124
  else:
113
125
  timeout_datetime = None
126
+
114
127
  self.log.info("Waiting for response")
128
+ for notifier in self.notifiers:
129
+ notifier(context)
130
+
115
131
  # Defer the Human-in-the-loop response checking process to HITLTrigger
116
132
  self.defer(
117
133
  trigger=HITLTrigger(
@@ -170,6 +186,9 @@ class ApprovalOperator(HITLOperator, SkipMixin):
170
186
 
171
187
  FIXED_ARGS = ["options", "multiple"]
172
188
 
189
+ APPROVE = "Approve"
190
+ REJECT = "Reject"
191
+
173
192
  def __init__(self, ignore_downstream_trigger_rules: bool = False, **kwargs) -> None:
174
193
  for arg in self.FIXED_ARGS:
175
194
  if arg in kwargs:
@@ -177,13 +196,17 @@ class ApprovalOperator(HITLOperator, SkipMixin):
177
196
 
178
197
  self.ignore_downstream_trigger_rules = ignore_downstream_trigger_rules
179
198
 
180
- super().__init__(options=["Approve", "Reject"], multiple=False, **kwargs)
199
+ super().__init__(
200
+ options=[self.APPROVE, self.REJECT],
201
+ multiple=False,
202
+ **kwargs,
203
+ )
181
204
 
182
205
  def execute_complete(self, context: Context, event: dict[str, Any]) -> Any:
183
206
  ret = super().execute_complete(context=context, event=event)
184
207
 
185
208
  chosen_option = ret["chosen_options"][0]
186
- if chosen_option == "Approve":
209
+ if chosen_option == self.APPROVE:
187
210
  self.log.info("Approved. Proceeding with downstream tasks...")
188
211
  return ret
189
212
 
@@ -211,24 +234,27 @@ class ApprovalOperator(HITLOperator, SkipMixin):
211
234
  return ret
212
235
 
213
236
 
214
- class HITLBranchOperator(HITLOperator):
237
+ class HITLBranchOperator(HITLOperator, BranchMixIn):
215
238
  """BranchOperator based on Human-in-the-loop Response."""
216
239
 
217
- def __init__(self, **kwargs) -> None:
218
- super().__init__(**kwargs)
240
+ inherits_from_skipmixin = True
219
241
 
220
- def execute_complete(self, context: Context, event: dict[str, Any]) -> None:
221
- raise NotImplementedError
242
+ def execute_complete(self, context: Context, event: dict[str, Any]) -> Any:
243
+ ret = super().execute_complete(context=context, event=event)
244
+ chosen_options = ret["chosen_options"]
245
+ return self.do_branch(context=context, branches_to_execute=chosen_options)
222
246
 
223
247
 
224
248
  class HITLEntryOperator(HITLOperator):
225
249
  """Human-in-the-loop Operator that is used to accept user input through TriggerForm."""
226
250
 
251
+ OK = "OK"
252
+
227
253
  def __init__(self, **kwargs) -> None:
228
254
  if "options" not in kwargs:
229
- kwargs["options"] = ["OK"]
255
+ kwargs["options"] = [self.OK]
230
256
 
231
257
  if "defaults" not in kwargs:
232
- kwargs["defaults"] = ["OK"]
258
+ kwargs["defaults"] = [self.OK]
233
259
 
234
260
  super().__init__(**kwargs)
@@ -51,9 +51,8 @@ from airflow.exceptions import (
51
51
  from airflow.models.variable import Variable
52
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, BaseOperator
54
+ from airflow.providers.standard.version_compat import AIRFLOW_V_3_0_PLUS, BaseOperator, context_merge
55
55
  from airflow.utils import hashlib_wrapper
56
- from airflow.utils.context import context_copy_partial, context_merge
57
56
  from airflow.utils.file import get_unique_dag_module_name
58
57
  from airflow.utils.operator_helpers import KeywordParameters
59
58
  from airflow.utils.process_utils import execute_in_subprocess
@@ -487,7 +486,8 @@ class _BasePythonVirtualenvOperator(PythonOperator, metaclass=ABCMeta):
487
486
 
488
487
  def execute(self, context: Context) -> Any:
489
488
  serializable_keys = set(self._iter_serializable_context_keys())
490
- serializable_context = context_copy_partial(context, serializable_keys)
489
+ new = {k: v for k, v in context.items() if k in serializable_keys}
490
+ serializable_context = cast("Context", new)
491
491
  return super().execute(context=serializable_context)
492
492
 
493
493
  def get_python_source(self):
@@ -889,9 +889,9 @@ class PythonVirtualenvOperator(_BasePythonVirtualenvOperator):
889
889
 
890
890
  with TemporaryDirectory(prefix="venv") as tmp_dir:
891
891
  tmp_path = Path(tmp_dir)
892
- tmp_dir, temp_venv_dir = tmp_path.relative_to(tmp_path.anchor).parts
893
892
  custom_pycache_prefix = Path(sys.pycache_prefix or "")
894
- venv_python_cache_dir = Path.cwd() / custom_pycache_prefix / tmp_dir / temp_venv_dir
893
+ r_path = tmp_path.relative_to(tmp_path.anchor)
894
+ venv_python_cache_dir = Path.cwd() / custom_pycache_prefix / r_path
895
895
  self._prepare_venv(tmp_path)
896
896
  python_path = tmp_path / "bin" / "python"
897
897
  result = self._execute_python_callable_in_subprocess(python_path)
@@ -20,8 +20,7 @@ from __future__ import annotations
20
20
  from collections.abc import Callable, Mapping, Sequence
21
21
  from typing import TYPE_CHECKING, Any
22
22
 
23
- from airflow.providers.standard.version_compat import BaseSensorOperator, PokeReturnValue
24
- from airflow.utils.context import context_merge
23
+ from airflow.providers.standard.version_compat import BaseSensorOperator, PokeReturnValue, context_merge
25
24
  from airflow.utils.operator_helpers import determine_kwargs
26
25
 
27
26
  if TYPE_CHECKING:
@@ -29,7 +28,7 @@ if TYPE_CHECKING:
29
28
  from airflow.sdk.definitions.context import Context
30
29
  except ImportError:
31
30
  # TODO: Remove once provider drops support for Airflow 2
32
- from airflow.utils.context import Context
31
+ from airflow.utils.context import Context # type: ignore[no-redef, attr-defined]
33
32
 
34
33
 
35
34
  class PythonSensor(BaseSensorOperator):
@@ -42,7 +42,10 @@ except ImportError:
42
42
  timeout: datetime.timedelta | None = None
43
43
 
44
44
 
45
- from airflow.utils import timezone
45
+ try:
46
+ from airflow.sdk import timezone
47
+ except ImportError:
48
+ from airflow.utils import timezone # type: ignore[attr-defined,no-redef]
46
49
 
47
50
  if TYPE_CHECKING:
48
51
  try:
@@ -116,9 +119,11 @@ class TimeSensor(BaseSensorOperator):
116
119
  ),
117
120
  method_name="execute_complete",
118
121
  )
122
+ else:
123
+ super().execute(context)
119
124
 
120
- def execute_complete(self, context: Context) -> None:
121
- return
125
+ def execute_complete(self, context: Context, event: Any = None) -> None:
126
+ return None
122
127
 
123
128
  def poke(self, context: Context) -> bool:
124
129
  self.log.info("Checking if the time (%s) has come", self.target_datetime)