apache-airflow-task-sdk 1.2.1rc3__tar.gz → 1.2.2__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.
Files changed (269) hide show
  1. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/.pre-commit-config.yaml +2 -2
  2. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/PKG-INFO +4 -4
  3. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/pyproject.toml +10 -6
  4. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/__init__.py +1 -1
  5. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/configuration/parser.py +9 -7
  6. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/logging/_noncaching.py +2 -1
  7. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/logging/structlog.py +81 -11
  8. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/common.py +17 -5
  9. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/metrics_template.yaml +24 -0
  10. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/otel_logger.py +1 -1
  11. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/stats.py +1 -0
  12. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/plugins_manager/plugins_manager.py +4 -1
  13. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/secrets_backend/base.py +1 -1
  14. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/secrets_masker/secrets_masker.py +19 -6
  15. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/timezones/timezone.py +6 -2
  16. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/api/client.py +28 -0
  17. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/api/datamodels/_generated.py +1 -0
  18. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/exceptions.py +16 -0
  19. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/comms.py +2 -2
  20. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/context.py +16 -4
  21. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/secrets/execution_api.py +59 -32
  22. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/supervisor.py +238 -40
  23. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/task_runner.py +148 -65
  24. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/log.py +24 -2
  25. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/__init__.py +10 -5
  26. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/timezone.py +2 -0
  27. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/api/test_client.py +30 -0
  28. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_secrets.py +132 -58
  29. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_supervisor.py +324 -16
  30. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_task_runner.py +305 -5
  31. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/serde/test_serde.py +19 -1
  32. apache_airflow_task_sdk-1.2.2/tests/task_sdk/test_log.py +120 -0
  33. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/.gitignore +0 -0
  34. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/LICENSE +0 -0
  35. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/NOTICE +0 -0
  36. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/README.md +0 -0
  37. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/dev/datamodel_code_formatter.py +0 -0
  38. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/dev/generate_task_sdk_models.py +0 -0
  39. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/docs/.gitignore +0 -0
  40. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/docs/api.rst +0 -0
  41. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/docs/concepts.rst +0 -0
  42. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/docs/conf.py +0 -0
  43. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/docs/deferred-vs-async-operators.rst +0 -0
  44. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/docs/dynamic-task-mapping.rst +0 -0
  45. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/docs/examples.rst +0 -0
  46. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/docs/img/airflow-2-approach.png +0 -0
  47. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/docs/img/airflow-2-arch.png +0 -0
  48. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/docs/img/airflow-3-arch.png +0 -0
  49. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/docs/img/airflow-3-task-sdk.png +0 -0
  50. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/docs/index.rst +0 -0
  51. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/__init__.pyi +0 -0
  52. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/configuration/__init__.py +0 -0
  53. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/configuration/exceptions.py +0 -0
  54. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/dagnode/__init__.py +0 -0
  55. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/dagnode/node.py +0 -0
  56. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/listeners/__init__.py +0 -0
  57. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/listeners/listener.py +0 -0
  58. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/listeners/spec/__init__.py +0 -0
  59. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/listeners/spec/lifecycle.py +0 -0
  60. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/listeners/spec/taskinstance.py +0 -0
  61. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/logging/__init__.py +0 -0
  62. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/logging/_config.py +0 -0
  63. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/logging/percent_formatter.py +0 -0
  64. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/logging/remote.py +0 -0
  65. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/logging/types.py +0 -0
  66. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/module_loading/__init__.py +0 -0
  67. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/module_loading/file_discovery.py +0 -0
  68. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/__init__.py +0 -0
  69. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/exceptions.py +0 -0
  70. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/__init__.py +0 -0
  71. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/base_stats_logger.py +0 -0
  72. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/datadog_logger.py +0 -0
  73. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/dual_stats_manager.py +0 -0
  74. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/metrics_registry.py +0 -0
  75. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/protocols.py +0 -0
  76. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/statsd_logger.py +0 -0
  77. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/validators.py +0 -0
  78. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/otel_env_config.py +0 -0
  79. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/traces/__init__.py +0 -0
  80. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/plugins_manager/__init__.py +0 -0
  81. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/providers_discovery/__init__.py +0 -0
  82. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/providers_discovery/providers_discovery.py +0 -0
  83. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/secrets_backend/__init__.py +0 -0
  84. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/secrets_masker/__init__.py +0 -0
  85. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/serialization/__init__.py +0 -0
  86. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/template_rendering/__init__.py +0 -0
  87. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/timezones/__init__.py +0 -0
  88. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/api/__init__.py +0 -0
  89. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/api/datamodels/__init__.py +0 -0
  90. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/api/datamodels/activities.py +0 -0
  91. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/__init__.py +0 -0
  92. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/branch.py +0 -0
  93. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/decorator.py +0 -0
  94. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/hook.py +0 -0
  95. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/notifier.py +0 -0
  96. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/operator.py +0 -0
  97. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/operatorlink.py +0 -0
  98. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/secrets_backend.py +0 -0
  99. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/sensor.py +0 -0
  100. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/skipmixin.py +0 -0
  101. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/timetable.py +0 -0
  102. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/xcom.py +0 -0
  103. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/configuration.py +0 -0
  104. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/crypto.py +0 -0
  105. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/__init__.py +0 -0
  106. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/__init__.py +0 -0
  107. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/abstractoperator.py +0 -0
  108. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/contextmanager.py +0 -0
  109. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/dag_parsing_context.py +0 -0
  110. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/decorators.py +0 -0
  111. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/expandinput.py +0 -0
  112. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/logging_mixin.py +0 -0
  113. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/mixins.py +0 -0
  114. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/node.py +0 -0
  115. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/setup_teardown.py +0 -0
  116. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/templater.py +0 -0
  117. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/types.py +0 -0
  118. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/asset/__init__.py +0 -0
  119. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/asset/decorators.py +0 -0
  120. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/asset/metadata.py +0 -0
  121. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/callback.py +0 -0
  122. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/connection.py +0 -0
  123. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/context.py +0 -0
  124. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/dag.py +0 -0
  125. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/deadline.py +0 -0
  126. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/decorators/__init__.py +0 -0
  127. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/decorators/__init__.pyi +0 -0
  128. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/decorators/condition.py +0 -0
  129. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/decorators/setup_teardown.py +0 -0
  130. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/decorators/task_group.py +0 -0
  131. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/edges.py +0 -0
  132. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/mappedoperator.py +0 -0
  133. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/operator_resources.py +0 -0
  134. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/param.py +0 -0
  135. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/partition_mappers/__init__.py +0 -0
  136. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/partition_mappers/allowed_key.py +0 -0
  137. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/partition_mappers/base.py +0 -0
  138. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/partition_mappers/chain.py +0 -0
  139. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/partition_mappers/identity.py +0 -0
  140. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/partition_mappers/product.py +0 -0
  141. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/partition_mappers/temporal.py +0 -0
  142. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/taskgroup.py +0 -0
  143. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/template.py +0 -0
  144. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/timetables/__init__.py +0 -0
  145. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/timetables/_cron.py +0 -0
  146. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/timetables/_delta.py +0 -0
  147. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/timetables/assets.py +0 -0
  148. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/timetables/events.py +0 -0
  149. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/timetables/interval.py +0 -0
  150. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/timetables/simple.py +0 -0
  151. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/timetables/trigger.py +0 -0
  152. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/variable.py +0 -0
  153. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/xcom_arg.py +0 -0
  154. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/__init__.py +0 -0
  155. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/cache.py +0 -0
  156. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/callback_runner.py +0 -0
  157. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/execute_workload.py +0 -0
  158. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/hitl.py +0 -0
  159. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/lazy_sequence.py +0 -0
  160. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/macros.py +0 -0
  161. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/secrets/__init__.py +0 -0
  162. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/secrets_masker.py +0 -0
  163. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/sentry/__init__.py +0 -0
  164. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/sentry/configured.py +0 -0
  165. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/sentry/noop.py +0 -0
  166. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/task_mapping.py +0 -0
  167. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/timeout.py +0 -0
  168. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/xcom.py +0 -0
  169. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/io/__init__.py +0 -0
  170. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/io/fs.py +0 -0
  171. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/io/path.py +0 -0
  172. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/io/stat.py +0 -0
  173. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/io/store.py +0 -0
  174. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/io/typedef.py +0 -0
  175. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/lineage.py +0 -0
  176. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/listener.py +0 -0
  177. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/module_loading.py +0 -0
  178. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/observability/__init__.py +0 -0
  179. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/observability/metrics/__init__.py +0 -0
  180. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/observability/metrics/datadog_logger.py +0 -0
  181. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/observability/metrics/otel_logger.py +0 -0
  182. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/observability/metrics/stats_utils.py +0 -0
  183. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/observability/metrics/statsd_logger.py +0 -0
  184. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/observability/stats.py +0 -0
  185. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/plugins_manager.py +0 -0
  186. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/providers_manager_runtime.py +0 -0
  187. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/py.typed +0 -0
  188. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/__init__.py +0 -0
  189. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/bignum.py +0 -0
  190. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/builtin.py +0 -0
  191. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/datetime.py +0 -0
  192. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/deltalake.py +0 -0
  193. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/iceberg.py +0 -0
  194. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/kubernetes.py +0 -0
  195. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/numpy.py +0 -0
  196. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/pandas.py +0 -0
  197. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/pydantic.py +0 -0
  198. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/timezone.py +0 -0
  199. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/uuid.py +0 -0
  200. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/typing.py +0 -0
  201. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/types.py +0 -0
  202. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/yaml.py +0 -0
  203. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/__init__.py +0 -0
  204. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/conftest.py +0 -0
  205. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/__init__.py +0 -0
  206. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/api/__init__.py +0 -0
  207. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/__init__.py +0 -0
  208. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/notifier/test_notifier.txt +0 -0
  209. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/test_branch.py +0 -0
  210. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/test_decorator.py +0 -0
  211. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/test_hook.py +0 -0
  212. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/test_notifier.py +0 -0
  213. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/test_operator.py +0 -0
  214. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/test_sensor.py +0 -0
  215. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/test_skipmixin.py +0 -0
  216. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/test_xcom.py +0 -0
  217. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/dags/dag_parsing_context.py +0 -0
  218. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/dags/super_basic.py +0 -0
  219. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/dags/super_basic_deferred_run.py +0 -0
  220. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/dags/super_basic_run.py +0 -0
  221. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/__init__.py +0 -0
  222. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/_internal/__init__.py +0 -0
  223. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/_internal/test_decorators.py +0 -0
  224. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/_internal/test_templater.py +0 -0
  225. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/conftest.py +0 -0
  226. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/decorators/__init__.py +0 -0
  227. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/decorators/test_condition.py +0 -0
  228. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/decorators/test_mapped.py +0 -0
  229. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/decorators/test_setup_teardown.py +0 -0
  230. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/decorators/test_task_group.py +0 -0
  231. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/sensors/__init__.py +0 -0
  232. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_asset.py +0 -0
  233. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_asset_decorators.py +0 -0
  234. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_callback.py +0 -0
  235. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_connection.py +0 -0
  236. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_context.py +0 -0
  237. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_dag.py +0 -0
  238. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_deadline.py +0 -0
  239. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_macros.py +0 -0
  240. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_mappedoperator.py +0 -0
  241. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_mixins.py +0 -0
  242. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_module_loading.py +0 -0
  243. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_operator_resources.py +0 -0
  244. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_param.py +0 -0
  245. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_taskgroup.py +0 -0
  246. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_template.py +0 -0
  247. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_variables.py +0 -0
  248. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_xcom_arg.py +0 -0
  249. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/docs/__init__.py +0 -0
  250. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/docs/test_docs_inventory.py +0 -0
  251. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/docs/test_public_api.py +0 -0
  252. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/__init__.py +0 -0
  253. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/conftest.py +0 -0
  254. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_cache.py +0 -0
  255. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_comms.py +0 -0
  256. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_context.py +0 -0
  257. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_context_cache.py +0 -0
  258. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_hitl.py +0 -0
  259. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_lazy_sequence.py +0 -0
  260. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_sentry.py +0 -0
  261. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_task_mapping.py +0 -0
  262. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/io/__init__.py +0 -0
  263. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/io/test_path.py +0 -0
  264. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/serde/__init__.py +0 -0
  265. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/serde/test_serializers.py +0 -0
  266. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/test_configuration.py +0 -0
  267. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/test_crypto.py +0 -0
  268. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/test_lineage.py +0 -0
  269. {apache_airflow_task_sdk-1.2.1rc3 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/test_providers_manager_runtime.py +0 -0
@@ -16,7 +16,7 @@
16
16
  # under the License.
17
17
  ---
18
18
  default_stages: [pre-commit, pre-push]
19
- minimum_prek_version: '0.2.0'
19
+ minimum_prek_version: '0.3.4'
20
20
  default_language_version:
21
21
  python: python3
22
22
  node: 22.19.0
@@ -58,7 +58,7 @@ repos:
58
58
  - id: mypy-task-sdk
59
59
  name: Run mypy for task-sdk
60
60
  language: python
61
- entry: ../scripts/ci/prek/mypy_local_folder.py task-sdk
61
+ entry: ../scripts/ci/prek/run_mypy_full_dist_local_venv_or_breeze_in_ci.py task-sdk
62
62
  pass_filenames: false
63
63
  files: ^.*\.py$
64
64
  require_serial: true
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apache-airflow-task-sdk
3
- Version: 1.2.1rc3
3
+ Version: 1.2.2
4
4
  Summary: Python Task SDK for Apache Airflow DAG Authors
5
5
  Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
6
- Project-URL: Documentation, https://airflow.staged.apache.org/docs/
7
- Project-URL: Homepage, https://airflow.staged.apache.org/
6
+ Project-URL: Documentation, https://airflow.apache.org/docs/
7
+ Project-URL: Homepage, https://airflow.apache.org/
8
8
  Project-URL: Slack Chat, https://s.apache.org/airflow-slack
9
9
  Project-URL: Source Code, https://github.com/apache/airflow
10
10
  Project-URL: Mastodon, https://fosstodon.org/@airflow
@@ -29,7 +29,7 @@ Classifier: Programming Language :: Python :: 3.13
29
29
  Classifier: Programming Language :: Python :: 3.14
30
30
  Classifier: Topic :: System :: Monitoring
31
31
  Requires-Python: !=3.15,>=3.10
32
- Requires-Dist: apache-airflow-core<3.3.0,>=3.2.0rc1
32
+ Requires-Dist: apache-airflow-core<3.3.0,>=3.2.0
33
33
  Requires-Dist: asgiref>=2.3.0; python_version < '3.14'
34
34
  Requires-Dist: asgiref>=3.11.1; python_version >= '3.14'
35
35
  Requires-Dist: attrs!=25.2.0,>=24.2.0
@@ -48,7 +48,7 @@ classifiers = [
48
48
  "Topic :: System :: Monitoring",
49
49
  ]
50
50
  dependencies = [
51
- "apache-airflow-core<3.3.0,>=3.2.0rc1",
51
+ "apache-airflow-core<3.3.0,>=3.2.0",
52
52
  "asgiref>=2.3.0; python_version < '3.14'",
53
53
  "asgiref>=3.11.1; python_version >= '3.14'",
54
54
  "attrs>=24.2.0, !=25.2.0",
@@ -108,8 +108,8 @@ dependencies = [
108
108
 
109
109
  [project.urls]
110
110
  "Bug Tracker" = "https://github.com/apache/airflow/issues"
111
- Documentation = "https://airflow.staged.apache.org/docs/"
112
- Homepage = "https://airflow.staged.apache.org/"
111
+ Documentation = "https://airflow.apache.org/docs/"
112
+ Homepage = "https://airflow.apache.org/"
113
113
  "Slack Chat" = "https://s.apache.org/airflow-slack"
114
114
  "Source Code" = "https://github.com/apache/airflow"
115
115
  Mastodon = "https://fosstodon.org/@airflow"
@@ -120,11 +120,11 @@ YouTube = "https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/"
120
120
  [build-system]
121
121
  requires = [
122
122
  "hatchling==1.29.0",
123
- "packaging==26.1",
124
- "pathspec==1.0.4",
123
+ "packaging==26.2",
124
+ "pathspec==1.1.1",
125
125
  "pluggy==1.6.0",
126
126
  "tomli==2.4.1; python_version < '3.11'",
127
- "trove-classifiers==2026.1.14.14",
127
+ "trove-classifiers==2026.5.20.19",
128
128
  ]
129
129
  build-backend = "hatchling.build"
130
130
 
@@ -226,6 +226,10 @@ dev = [
226
226
  docs = [
227
227
  "apache-airflow-devel-common[docs]",
228
228
  ]
229
+ mypy = [
230
+ "apache-airflow-devel-common[mypy]",
231
+ ]
232
+
229
233
  [tool.uv.sources]
230
234
  # These names must match the names as defined in the pyproject.toml of the workspace items,
231
235
  # *not* the workspace folder paths
@@ -93,7 +93,7 @@ __all__ = [
93
93
  "teardown",
94
94
  ]
95
95
 
96
- __version__ = "1.2.1rc3"
96
+ __version__ = "1.2.2"
97
97
 
98
98
  if TYPE_CHECKING:
99
99
  from airflow.sdk.api.datamodels._generated import DagRunState, TaskInstanceState, TriggerRule, WeightRule
@@ -622,7 +622,7 @@ class AirflowConfigParser(ConfigParser):
622
622
  )
623
623
  if value is VALUE_NOT_FOUND_SENTINEL:
624
624
  value = fallback
625
- if raw and value is not None:
625
+ if raw and isinstance(value, str):
626
626
  return value.replace("%", "%%")
627
627
  return value
628
628
 
@@ -844,7 +844,7 @@ class AirflowConfigParser(ConfigParser):
844
844
  # when display_source = true, we know that the config_sources contains tuple
845
845
  opt, source = config_sources[section][key] # type: ignore
846
846
  else:
847
- opt = config_sources[section][key]
847
+ opt = config_sources[section][key] # type: ignore[assignment]
848
848
  if opt == self.get_default_value(section, key):
849
849
  del config_sources[section][key]
850
850
 
@@ -1576,12 +1576,12 @@ class AirflowConfigParser(ConfigParser):
1576
1576
  raise ValueError(f"The value {section}/{key} should be set!")
1577
1577
  return value
1578
1578
 
1579
- def read(
1579
+ def read( # type: ignore[override]
1580
1580
  self,
1581
1581
  filenames: str | bytes | os.PathLike | Iterable[str | bytes | os.PathLike],
1582
1582
  encoding: str | None = None,
1583
1583
  ) -> list[str]:
1584
- return super().read(filenames=filenames, encoding=encoding)
1584
+ return super().read(filenames=filenames, encoding=encoding) # type: ignore[arg-type,return-value]
1585
1585
 
1586
1586
  def read_dict( # type: ignore[override]
1587
1587
  self, dictionary: dict[str, dict[str, Any]], source: str = "<dict>"
@@ -1631,7 +1631,9 @@ class AirflowConfigParser(ConfigParser):
1631
1631
  )
1632
1632
  return list(dict.fromkeys(itertools.chain(all_options_from_defaults, my_own_options)))
1633
1633
 
1634
- def has_option(self, section: str, option: str, lookup_from_deprecated: bool = True, **kwargs) -> bool:
1634
+ def has_option( # type: ignore[override]
1635
+ self, section: str, option: str, lookup_from_deprecated: bool = True, **kwargs
1636
+ ) -> bool:
1635
1637
  """
1636
1638
  Check if option is defined.
1637
1639
 
@@ -1660,7 +1662,7 @@ class AirflowConfigParser(ConfigParser):
1660
1662
  except (NoOptionError, NoSectionError, AirflowConfigException):
1661
1663
  return False
1662
1664
 
1663
- def set(self, section: str, option: str, value: str | None = None) -> None:
1665
+ def set(self, section: str, option: str, value: str | None = None) -> None: # type: ignore[override]
1664
1666
  """
1665
1667
  Set an option to the given value.
1666
1668
 
@@ -1675,7 +1677,7 @@ class AirflowConfigParser(ConfigParser):
1675
1677
  self.add_section(section)
1676
1678
  super().set(section, option, value)
1677
1679
 
1678
- def remove_option(self, section: str, option: str, remove_default: bool = True):
1680
+ def remove_option(self, section: str, option: str, remove_default: bool = True): # type: ignore[override]
1679
1681
  """
1680
1682
  Remove an option if it exists in config from a file or default config.
1681
1683
 
@@ -29,7 +29,8 @@ _IO = TypeVar("_IO", TextIO, BinaryIO)
29
29
  def make_file_io_non_caching(io: _IO) -> _IO:
30
30
  try:
31
31
  fd = io.fileno()
32
- os.posix_fadvise(fd, 0, 0, os.POSIX_FADV_DONTNEED)
32
+ # posix_fadvise / POSIX_FADV_DONTNEED are Linux-only; ignored on other platforms at runtime.
33
+ os.posix_fadvise(fd, 0, 0, os.POSIX_FADV_DONTNEED) # type: ignore[attr-defined,unused-ignore]
33
34
  except Exception:
34
35
  # in case either file descriptor cannot be retrieved or fadvise is not available
35
36
  # we should simply return the wrapper retrieved by FileHandler's open method
@@ -24,6 +24,7 @@ import logging
24
24
  import os
25
25
  import re
26
26
  import sys
27
+ import weakref
27
28
  from collections.abc import Callable, Iterable, Mapping, Sequence
28
29
  from functools import cache, cached_property, partial
29
30
  from pathlib import Path
@@ -60,6 +61,44 @@ JWT_PATTERN = re.compile(r"eyJ[\.A-Za-z0-9-_]*")
60
61
  LEVEL_TO_FILTERING_LOGGER: dict[int, type[Logger]] = {}
61
62
 
62
63
 
64
+ # ``_parse_path`` was introduced in Python 3.12; older versions use a different
65
+ # parsing path (``_flavour.parse_parts``) that does not call ``sys.intern``,
66
+ # so the patch is neither necessary nor applicable there. Python 3.14 removed
67
+ # the ``sys.intern`` call upstream, so the patch is unnecessary there too.
68
+ if sys.version_info < (3, 12) or sys.version_info >= (3, 14):
69
+ _PatchedPath = Path # type: ignore[misc, assignment]
70
+ else:
71
+
72
+ class _PatchedPath(Path):
73
+ """
74
+ Backport of Python 3.14's ``PurePath._parse_path`` without ``sys.intern``.
75
+
76
+ The ``sys.intern`` call in the stock ``_parse_path`` causes memory
77
+ to grow unboundedly in long-running processes. Upstream removed it
78
+ in Python 3.14 (https://github.com/python/cpython/issues/119518);
79
+ this class applies the same fix for earlier versions.
80
+ """
81
+
82
+ @classmethod
83
+ def _parse_path(cls, path: str) -> tuple[str, str, list[str]]:
84
+ if not path:
85
+ return "", "", []
86
+ sep = os.path.sep
87
+ altsep = os.path.altsep
88
+ if altsep:
89
+ path = path.replace(altsep, sep)
90
+ drv, root, rel = os.path.splitroot(path)
91
+ if not root and drv.startswith(sep) and not drv.endswith(sep):
92
+ drv_parts = drv.split(sep)
93
+ if len(drv_parts) == 4 and drv_parts[2] not in "?.":
94
+ # e.g. //server/share
95
+ root = sep
96
+ elif len(drv_parts) == 6:
97
+ # e.g. //?/unc/server/share
98
+ root = sep
99
+ return drv, root, [x for x in rel.split(sep) if x and x != "."]
100
+
101
+
63
102
  def _make_airflow_structlogger(min_level):
64
103
  # This uses https://github.com/hynek/structlog/blob/2f0cc42d/src/structlog/_native.py#L126
65
104
  # as inspiration
@@ -165,24 +204,38 @@ def make_filtering_logger() -> Callable[..., BindableLogger]:
165
204
  return maker
166
205
 
167
206
 
207
+ # structlog >= 26.1.0 added a `name` slot + kwarg to BytesLogger
208
+ # (hynek/structlog#786). Detect it once so we can avoid a redundant slot and
209
+ # forward `name` through the parent init. The same detection is applied to
210
+ # WriteLogger so the analogous upstream change lands without a regression.
211
+ _BYTES_LOGGER_HAS_NAME = "name" in getattr(structlog.BytesLogger, "__slots__", ())
212
+ _WRITE_LOGGER_HAS_NAME = "name" in getattr(structlog.WriteLogger, "__slots__", ())
213
+
214
+
168
215
  class NamedBytesLogger(structlog.BytesLogger):
169
- __slots__ = ("name",)
216
+ __slots__ = () if _BYTES_LOGGER_HAS_NAME else ("name",)
170
217
 
171
218
  def __init__(self, name: str | None = None, file: BinaryIO | None = None):
172
- self.name = name
173
219
  if file is not None:
174
220
  file = make_file_io_non_caching(file)
175
- super().__init__(file)
221
+ if _BYTES_LOGGER_HAS_NAME:
222
+ super().__init__(file, name=name) # type: ignore[call-arg]
223
+ else:
224
+ super().__init__(file)
225
+ self.name = name
176
226
 
177
227
 
178
228
  class NamedWriteLogger(structlog.WriteLogger):
179
- __slots__ = ("name",)
229
+ __slots__ = () if _WRITE_LOGGER_HAS_NAME else ("name",)
180
230
 
181
231
  def __init__(self, name: str | None = None, file: TextIO | None = None):
182
- self.name = name
183
232
  if file is not None:
184
233
  file = make_file_io_non_caching(file)
185
- super().__init__(file)
234
+ if _WRITE_LOGGER_HAS_NAME:
235
+ super().__init__(file, name=name) # type: ignore[call-arg]
236
+ else:
237
+ super().__init__(file)
238
+ self.name = name
186
239
 
187
240
 
188
241
  LogOutputType = TypeVar("LogOutputType", bound=TextIO | BinaryIO)
@@ -555,6 +608,17 @@ def configure_logging(
555
608
  text_output = cast("TextIO", output)
556
609
  logger_factory = LoggerFactory(NamedWriteLogger, io=text_output)
557
610
 
611
+ # Replace structlog's WRITE_LOCKS dict with a WeakKeyDictionary so entries
612
+ # for closed file descriptors are garbage-collected instead of leaking.
613
+ # TODO: drop once structlog ships the upstream fix (tracked for 26.1.0).
614
+ try:
615
+ from structlog import _output as _structlog_output
616
+
617
+ if isinstance(_structlog_output.WRITE_LOCKS, dict):
618
+ _structlog_output.WRITE_LOCKS = weakref.WeakKeyDictionary() # type: ignore[assignment]
619
+ except Exception:
620
+ pass
621
+
558
622
  structlog.configure(
559
623
  processors=shared_pre_chain + [for_structlog],
560
624
  cache_logger_on_first_use=cache_logger_on_first_use,
@@ -717,10 +781,16 @@ def init_log_folder(directory: str | os.PathLike[str], new_folder_permissions: i
717
781
  sure that the same group is set as default group for both - impersonated user and main airflow
718
782
  user.
719
783
  """
720
- directory = Path(directory)
721
- for parent in reversed(Path(directory).parents):
722
- parent.mkdir(mode=new_folder_permissions, exist_ok=True)
723
- directory.mkdir(mode=new_folder_permissions, exist_ok=True)
784
+ directory = _PatchedPath(directory)
785
+ try:
786
+ directory.mkdir(mode=new_folder_permissions, parents=True, exist_ok=True)
787
+ except OSError as e:
788
+ log.warning(
789
+ "Could not create log folder %s: %s. "
790
+ "Airflow will continue but logging to this directory may fail.",
791
+ directory,
792
+ e,
793
+ )
724
794
 
725
795
 
726
796
  def init_log_file(
@@ -737,7 +807,7 @@ def init_log_file(
737
807
 
738
808
  See above ``init_log_folder`` method for more detailed explanation.
739
809
  """
740
- full_path = Path(base_log_folder, local_relative_path)
810
+ full_path = _PatchedPath(base_log_folder, local_relative_path)
741
811
  init_log_folder(full_path.parent, new_folder_permissions)
742
812
 
743
813
  try:
@@ -48,13 +48,25 @@ def get_otel_data_exporter(
48
48
 
49
49
  # If the protocol env var isn't set, then it will be None,
50
50
  # and it will default to an http/protobuf exporter.
51
+ # The grpc and http variants are incompatible types to mypy but functionally interchangeable here.
52
+ OTLPMetricExporter: type
53
+ OTLPSpanExporter: type
51
54
  if env_endpoint and env_exporter_protocol == "grpc":
52
- from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter
53
- from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
55
+ from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import (
56
+ OTLPMetricExporter, # type: ignore[no-redef]
57
+ )
58
+ from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
59
+ OTLPSpanExporter, # type: ignore[no-redef]
60
+ )
54
61
  else:
55
- from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter
56
- from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
57
-
62
+ from opentelemetry.exporter.otlp.proto.http.metric_exporter import (
63
+ OTLPMetricExporter, # type: ignore[no-redef]
64
+ )
65
+ from opentelemetry.exporter.otlp.proto.http.trace_exporter import (
66
+ OTLPSpanExporter, # type: ignore[no-redef]
67
+ )
68
+
69
+ exporter: SpanExporter | MetricExporter
58
70
  if env_endpoint:
59
71
  if host is not None and port is not None:
60
72
  log.warning(
@@ -292,6 +292,24 @@ metrics:
292
292
  legacy_name: "-"
293
293
  name_variables: []
294
294
 
295
+ - name: "api_server.dag_bag.cache_hit"
296
+ description: "Number of cache hits when retrieving SerializedDAG from DBDagBag in the API server"
297
+ type: "counter"
298
+ legacy_name: "-"
299
+ name_variables: []
300
+
301
+ - name: "api_server.dag_bag.cache_miss"
302
+ description: "Number of cache misses when retrieving SerializedDAG from DBDagBag in the API server"
303
+ type: "counter"
304
+ legacy_name: "-"
305
+ name_variables: []
306
+
307
+ - name: "api_server.dag_bag.cache_clear"
308
+ description: "Number of times the DBDagBag cache was cleared in the API server"
309
+ type: "counter"
310
+ legacy_name: "-"
311
+ name_variables: []
312
+
295
313
  # ==========
296
314
  # Gauges
297
315
  # ==========
@@ -301,6 +319,12 @@ metrics:
301
319
  legacy_name: "-"
302
320
  name_variables: []
303
321
 
322
+ - name: "api_server.dag_bag.cache_size"
323
+ description: "Current number of SerializedDAG objects cached in the API server's DBDagBag"
324
+ type: "gauge"
325
+ legacy_name: "-"
326
+ name_variables: []
327
+
304
328
  - name: "dag_processing.import_errors"
305
329
  description: "Number of errors from trying to parse Dag files"
306
330
  type: "gauge"
@@ -418,7 +418,7 @@ def get_otel_logger(
418
418
 
419
419
  readers = [
420
420
  PeriodicExportingMetricReader(
421
- exporter=metric_exporter,
421
+ exporter=metric_exporter, # type: ignore[arg-type]
422
422
  export_interval_millis=interval, # type: ignore[arg-type]
423
423
  )
424
424
  ]
@@ -65,6 +65,7 @@ def normalize_name_for_stats(name: str, log_warning: bool = True) -> str:
65
65
  class _Stats(type):
66
66
  factory: Callable[[], StatsLogger | NoStatsLogger] | None = None
67
67
  instance: StatsLogger | NoStatsLogger | None = None
68
+ _instance_pid: int | None = None
68
69
 
69
70
  def __getattr__(cls, name: str) -> str:
70
71
  factory = type.__getattribute__(cls, "factory")
@@ -119,9 +119,12 @@ class AirflowPlugin:
119
119
  # A list of timetable classes that can be used for Dag scheduling.
120
120
  timetables: list[Any] = []
121
121
 
122
- # A list of timetable classes that can be used for Dag scheduling.
122
+ # A list of partition mapper classes that can be used for Dag scheduling.
123
123
  partition_mappers: list[Any] = []
124
124
 
125
+ # A list of deadline reference classes that can be used as custom deadlines in Dags.
126
+ deadline_references: list[Any] = []
127
+
125
128
  # A list of listeners that can be used for tracking task and Dag states.
126
129
  listeners: list[ModuleType | object] = []
127
130
 
@@ -84,7 +84,7 @@ class BaseSecretsBackend(ABC):
84
84
  def _deserialize_connection_value(conn_class: type, conn_id: str, value: str):
85
85
  value = value.strip()
86
86
  if value[0] == "{":
87
- return conn_class.from_json(value=value, conn_id=conn_id)
87
+ return conn_class.from_json(value=value, conn_id=conn_id) # type: ignore[attr-defined]
88
88
 
89
89
  # TODO: Only sdk has from_uri defined on it. Is it worthwhile developing the core path or not?
90
90
  if hasattr(conn_class, "from_uri"):
@@ -54,8 +54,11 @@ DEFAULT_SENSITIVE_FIELDS = frozenset(
54
54
  "access_token",
55
55
  "api_key",
56
56
  "apikey",
57
+ "auth_header",
57
58
  "authorization",
59
+ "bearer",
58
60
  "connection_string",
61
+ "dsn",
59
62
  "passphrase",
60
63
  "passwd",
61
64
  "password",
@@ -64,9 +67,11 @@ DEFAULT_SENSITIVE_FIELDS = frozenset(
64
67
  "proxy_password",
65
68
  "proxies",
66
69
  "secret",
70
+ "service_account",
71
+ "service_key",
67
72
  "token",
68
73
  "keyfile_dict",
69
- "service_account",
74
+ "webhook_url",
70
75
  }
71
76
  )
72
77
  """Names of fields (Connection extra, Variable key name etc.) that are deemed sensitive"""
@@ -344,14 +349,18 @@ class SecretsMasker(logging.Filter):
344
349
  def _redact(
345
350
  self, item: Redactable, name: str | None, depth: int, max_depth: int, replacement: str = "***"
346
351
  ) -> Redacted:
347
- # Avoid spending too much effort on redacting on deeply nested
348
- # structures. This also avoid infinite recursion if a structure has
349
- # reference to self.
350
- if depth > max_depth:
351
- return item
352
352
  try:
353
+ # Key-name-based redaction is unbounded by depth — sensitive keys
354
+ # must fail closed at any nesting level. The depth cutoff below is
355
+ # only used to bound the work of pattern-based string masking and
356
+ # to terminate recursion through self-referential iterables.
353
357
  if name and self.should_hide_value_for_key(name):
354
358
  return self._redact_all(item, depth, max_depth, replacement=replacement)
359
+ # Always walk dicts so deeper sensitive keys are still caught;
360
+ # JSON-loaded payloads cannot be self-referential, and any
361
+ # in-memory cycle hits Python's own recursion limit and is caught
362
+ # by the except clause below (which fails closed via
363
+ # "<redaction-failed>").
355
364
  if isinstance(item, dict):
356
365
  to_return = {
357
366
  dict_key: self._redact(
@@ -360,6 +369,10 @@ class SecretsMasker(logging.Filter):
360
369
  for dict_key, subval in item.items()
361
370
  }
362
371
  return to_return
372
+ # Avoid spending too much effort on pattern-based masking of
373
+ # deeply nested non-dict structures.
374
+ if depth > max_depth:
375
+ return item
363
376
  if isinstance(item, Enum):
364
377
  return self._redact(
365
378
  item=item.value, name=name, depth=depth, max_depth=max_depth, replacement=replacement
@@ -107,7 +107,9 @@ def make_aware(value: DateTime, timezone: dt.tzinfo | None = None) -> DateTime:
107
107
 
108
108
 
109
109
  @overload
110
- def make_aware(value: dt.datetime, timezone: dt.tzinfo | None = None) -> dt.datetime: ...
110
+ def make_aware( # type: ignore[overload-cannot-match]
111
+ value: dt.datetime, timezone: dt.tzinfo | None = None
112
+ ) -> dt.datetime: ...
111
113
 
112
114
 
113
115
  def make_aware(value: dt.datetime | None, timezone: dt.tzinfo | None = None) -> dt.datetime | None:
@@ -200,7 +202,9 @@ def coerce_datetime(v: DateTime, tz: dt.tzinfo | None = None) -> DateTime: ...
200
202
 
201
203
 
202
204
  @overload
203
- def coerce_datetime(v: dt.datetime, tz: dt.tzinfo | None = None) -> DateTime: ...
205
+ def coerce_datetime( # type: ignore[overload-cannot-match]
206
+ v: dt.datetime, tz: dt.tzinfo | None = None
207
+ ) -> DateTime: ...
204
208
 
205
209
 
206
210
  def coerce_datetime(v: dt.datetime | None, tz: dt.tzinfo | None = None) -> DateTime | None:
@@ -419,6 +419,21 @@ class ConnectionOperations:
419
419
  status_code=e.response.status_code,
420
420
  )
421
421
  return ErrorResponse(error=ErrorType.CONNECTION_NOT_FOUND, detail={"conn_id": conn_id})
422
+ if e.response.status_code in (HTTPStatus.UNAUTHORIZED, HTTPStatus.FORBIDDEN):
423
+ # Surface authz failures as a distinct ErrorType so the
424
+ # ExecutionAPISecretsBackend can refuse to fall back to a
425
+ # less-restrictive backend (e.g. env vars). 401/403 must
426
+ # not be conflated with "not found".
427
+ log.debug(
428
+ "Connection access denied",
429
+ conn_id=conn_id,
430
+ detail=e.detail,
431
+ status_code=e.response.status_code,
432
+ )
433
+ return ErrorResponse(
434
+ error=ErrorType.PERMISSION_DENIED,
435
+ detail={"conn_id": conn_id, "status_code": e.response.status_code},
436
+ )
422
437
  raise
423
438
  return ConnectionResponse.model_validate_json(resp.read())
424
439
 
@@ -442,6 +457,19 @@ class VariableOperations:
442
457
  status_code=e.response.status_code,
443
458
  )
444
459
  return ErrorResponse(error=ErrorType.VARIABLE_NOT_FOUND, detail={"key": key})
460
+ if e.response.status_code in (HTTPStatus.UNAUTHORIZED, HTTPStatus.FORBIDDEN):
461
+ # See ConnectionOperations.get() above for rationale —
462
+ # authz failures must not be conflated with "not found".
463
+ log.debug(
464
+ "Variable access denied",
465
+ key=key,
466
+ detail=e.detail,
467
+ status_code=e.response.status_code,
468
+ )
469
+ return ErrorResponse(
470
+ error=ErrorType.PERMISSION_DENIED,
471
+ detail={"key": key, "status_code": e.response.status_code},
472
+ )
445
473
  raise
446
474
  return VariableResponse.model_validate_json(resp.read())
447
475
 
@@ -662,3 +662,4 @@ class TIRunContext(BaseModel):
662
662
  next_kwargs: Annotated[dict[str, Any] | str | None, Field(title="Next Kwargs")] = None
663
663
  xcom_keys_to_clear: Annotated[list[str] | None, Field(title="Xcom Keys To Clear")] = None
664
664
  should_retry: Annotated[bool | None, Field(title="Should Retry")] = False
665
+ start_date: Annotated[AwareDatetime | None, Field(title="Start Date")] = None
@@ -57,6 +57,17 @@ class AirflowNotFoundException(AirflowException):
57
57
  status_code = HTTPStatus.NOT_FOUND
58
58
 
59
59
 
60
+ class AirflowSecretsBackendAccessDenied(PermissionError):
61
+ """
62
+ Authoritative deny from a secrets backend; dispatcher must NOT fall through.
63
+
64
+ Distinct from a generic ``PermissionError`` (e.g. an incidental filesystem
65
+ ``OSError``-family raise from inside an unrelated backend) so the
66
+ secrets-backend dispatcher loops can re-raise only this signal and keep
67
+ treating other exceptions as "try the next backend".
68
+ """
69
+
70
+
60
71
  class AirflowDagCycleException(AirflowException):
61
72
  """Raise when there is a cycle in Dag definition."""
62
73
 
@@ -81,6 +92,11 @@ class ErrorType(enum.Enum):
81
92
  XCOM_NOT_FOUND = "XCOM_NOT_FOUND"
82
93
  ASSET_NOT_FOUND = "ASSET_NOT_FOUND"
83
94
  DAGRUN_ALREADY_EXISTS = "DAGRUN_ALREADY_EXISTS"
95
+ # Distinct from API_SERVER_ERROR: signals an explicit 401/403 from the
96
+ # Execution API. Callers like ExecutionAPISecretsBackend treat this as
97
+ # a deny rather than a "not found" so the secrets-backend dispatcher
98
+ # does NOT fall through to a less-restrictive backend (e.g. env vars).
99
+ PERMISSION_DENIED = "PERMISSION_DENIED"
84
100
  GENERIC_ERROR = "GENERIC_ERROR"
85
101
  API_SERVER_ERROR = "API_SERVER_ERROR"
86
102
 
@@ -133,7 +133,7 @@ def _new_encoder() -> msgspec.msgpack.Encoder:
133
133
  return msgspec.msgpack.Encoder(enc_hook=_msgpack_enc_hook)
134
134
 
135
135
 
136
- class _RequestFrame(msgspec.Struct, array_like=True, frozen=True, omit_defaults=True):
136
+ class _RequestFrame(msgspec.Struct, array_like=True, frozen=True, omit_defaults=True): # type: ignore[call-arg]
137
137
  id: int
138
138
  """
139
139
  The request id, set by the sender.
@@ -159,7 +159,7 @@ class _RequestFrame(msgspec.Struct, array_like=True, frozen=True, omit_defaults=
159
159
  return buffer
160
160
 
161
161
 
162
- class _ResponseFrame(_RequestFrame, frozen=True):
162
+ class _ResponseFrame(_RequestFrame, frozen=True): # type: ignore[call-arg]
163
163
  id: int
164
164
  """
165
165
  The id of the request this is a response to