apache-airflow-task-sdk 1.2.1rc2__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.
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/.pre-commit-config.yaml +2 -2
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/PKG-INFO +4 -4
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/pyproject.toml +10 -6
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/__init__.py +1 -1
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/configuration/parser.py +9 -7
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/logging/_noncaching.py +2 -1
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/logging/structlog.py +81 -11
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/common.py +17 -5
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/metrics_template.yaml +24 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/otel_logger.py +1 -1
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/stats.py +1 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/plugins_manager/plugins_manager.py +4 -1
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/secrets_backend/base.py +1 -1
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/secrets_masker/secrets_masker.py +19 -6
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/timezones/timezone.py +6 -2
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/api/client.py +28 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/api/datamodels/_generated.py +1 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/exceptions.py +16 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/comms.py +2 -2
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/context.py +16 -4
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/secrets/execution_api.py +59 -32
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/supervisor.py +238 -40
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/task_runner.py +148 -65
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/log.py +24 -2
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/__init__.py +10 -5
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/timezone.py +2 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/api/test_client.py +30 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_secrets.py +132 -58
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_supervisor.py +324 -16
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_task_runner.py +305 -5
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/serde/test_serde.py +19 -1
- apache_airflow_task_sdk-1.2.2/tests/task_sdk/test_log.py +120 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/.gitignore +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/LICENSE +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/NOTICE +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/README.md +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/dev/datamodel_code_formatter.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/dev/generate_task_sdk_models.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/docs/.gitignore +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/docs/api.rst +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/docs/concepts.rst +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/docs/conf.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/docs/deferred-vs-async-operators.rst +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/docs/dynamic-task-mapping.rst +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/docs/examples.rst +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/docs/img/airflow-2-approach.png +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/docs/img/airflow-2-arch.png +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/docs/img/airflow-3-arch.png +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/docs/img/airflow-3-task-sdk.png +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/docs/index.rst +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/__init__.pyi +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/configuration/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/configuration/exceptions.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/dagnode/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/dagnode/node.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/listeners/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/listeners/listener.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/listeners/spec/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/listeners/spec/lifecycle.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/listeners/spec/taskinstance.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/logging/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/logging/_config.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/logging/percent_formatter.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/logging/remote.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/logging/types.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/module_loading/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/module_loading/file_discovery.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/exceptions.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/base_stats_logger.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/datadog_logger.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/dual_stats_manager.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/metrics_registry.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/protocols.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/statsd_logger.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/metrics/validators.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/otel_env_config.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/observability/traces/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/plugins_manager/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/providers_discovery/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/providers_discovery/providers_discovery.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/secrets_backend/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/secrets_masker/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/serialization/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/template_rendering/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/_shared/timezones/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/api/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/api/datamodels/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/api/datamodels/activities.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/branch.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/decorator.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/hook.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/notifier.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/operator.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/operatorlink.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/secrets_backend.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/sensor.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/skipmixin.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/timetable.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/bases/xcom.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/configuration.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/crypto.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/abstractoperator.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/contextmanager.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/dag_parsing_context.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/decorators.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/expandinput.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/logging_mixin.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/mixins.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/node.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/setup_teardown.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/templater.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/_internal/types.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/asset/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/asset/decorators.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/asset/metadata.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/callback.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/connection.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/context.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/dag.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/deadline.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/decorators/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/decorators/__init__.pyi +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/decorators/condition.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/decorators/setup_teardown.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/decorators/task_group.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/edges.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/mappedoperator.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/operator_resources.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/param.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/partition_mappers/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/partition_mappers/allowed_key.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/partition_mappers/base.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/partition_mappers/chain.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/partition_mappers/identity.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/partition_mappers/product.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/partition_mappers/temporal.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/taskgroup.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/template.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/timetables/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/timetables/_cron.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/timetables/_delta.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/timetables/assets.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/timetables/events.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/timetables/interval.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/timetables/simple.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/timetables/trigger.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/variable.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/definitions/xcom_arg.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/cache.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/callback_runner.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/execute_workload.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/hitl.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/lazy_sequence.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/macros.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/secrets/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/secrets_masker.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/sentry/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/sentry/configured.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/sentry/noop.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/task_mapping.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/timeout.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/execution_time/xcom.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/io/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/io/fs.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/io/path.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/io/stat.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/io/store.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/io/typedef.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/lineage.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/listener.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/module_loading.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/observability/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/observability/metrics/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/observability/metrics/datadog_logger.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/observability/metrics/otel_logger.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/observability/metrics/stats_utils.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/observability/metrics/statsd_logger.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/observability/stats.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/plugins_manager.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/providers_manager_runtime.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/py.typed +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/bignum.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/builtin.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/datetime.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/deltalake.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/iceberg.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/kubernetes.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/numpy.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/pandas.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/pydantic.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/timezone.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/serializers/uuid.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/serde/typing.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/types.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/yaml.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/conftest.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/api/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/notifier/test_notifier.txt +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/test_branch.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/test_decorator.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/test_hook.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/test_notifier.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/test_operator.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/test_sensor.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/test_skipmixin.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/bases/test_xcom.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/dags/dag_parsing_context.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/dags/super_basic.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/dags/super_basic_deferred_run.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/dags/super_basic_run.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/_internal/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/_internal/test_decorators.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/_internal/test_templater.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/conftest.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/decorators/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/decorators/test_condition.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/decorators/test_mapped.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/decorators/test_setup_teardown.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/decorators/test_task_group.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/sensors/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_asset.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_asset_decorators.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_callback.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_connection.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_context.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_dag.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_deadline.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_macros.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_mappedoperator.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_mixins.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_module_loading.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_operator_resources.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_param.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_taskgroup.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_template.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_variables.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/definitions/test_xcom_arg.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/docs/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/docs/test_docs_inventory.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/docs/test_public_api.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/conftest.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_cache.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_comms.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_context.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_context_cache.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_hitl.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_lazy_sequence.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_sentry.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/execution_time/test_task_mapping.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/io/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/io/test_path.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/serde/__init__.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/serde/test_serializers.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/test_configuration.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/test_crypto.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/tests/task_sdk/test_lineage.py +0 -0
- {apache_airflow_task_sdk-1.2.1rc2 → 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.
|
|
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/
|
|
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.
|
|
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.
|
|
7
|
-
Project-URL: Homepage, https://airflow.
|
|
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.
|
|
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.
|
|
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.
|
|
112
|
-
Homepage = "https://airflow.
|
|
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.
|
|
124
|
-
"pathspec==1.
|
|
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.
|
|
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
|
|
@@ -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
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
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 =
|
|
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
|
|
53
|
-
|
|
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
|
|
56
|
-
|
|
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"
|
|
@@ -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
|
|
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
|
-
"
|
|
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(
|
|
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(
|
|
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:
|
{apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/api/client.py
RENAMED
|
@@ -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
|
{apache_airflow_task_sdk-1.2.1rc2 → apache_airflow_task_sdk-1.2.2}/src/airflow/sdk/exceptions.py
RENAMED
|
@@ -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
|